diff --git a/Warmwassererwaermer/module.php b/Warmwassererwaermer/module.php index 2f0c59d..a6e8610 100644 --- a/Warmwassererwaermer/module.php +++ b/Warmwassererwaermer/module.php @@ -39,8 +39,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch 'NachladenAktiv', 'LegionellenbetriebAktiv', 'LegioCounter', - 'Idle', - 'IdleCounter', ]; public function Create(): void @@ -96,8 +94,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch $this->RegisterAttributeBoolean('ZustandNachladenAktiv', false); $this->RegisterAttributeBoolean('ZustandLegionellenbetriebAktiv', false); $this->RegisterAttributeInteger('ZustandLegioCounter', 0); - $this->RegisterAttributeBoolean('ZustandIdle', true); - $this->RegisterAttributeInteger('ZustandIdleCounter', 0); $this->RegisterTimer( 'LastwechselFreigabe', @@ -497,8 +493,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch $jetzt, $this->ReadPropertyInteger('LastwechselSperrzeit') ); - $this->setzeZustand('IdleCounter', $restzeit); - $this->setzeZustand('Idle', $restzeit === 0); $this->SetTimerInterval('LastwechselFreigabe', $restzeit > 0 ? $restzeit * 1000 : 0); return $restzeit; @@ -791,7 +785,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch $this->SetValue('Maximaltemperatur', 60.0); $this->WriteAttributeFloat('ZustandLegionellentemperatur', 65.0); $this->setzeZustand('Leistungsquelle', Nachrichtenvertrag::LEISTUNGSQUELLE_BERECHNET); - $this->setzeZustand('Idle', true); $this->WriteAttributeBoolean('InitialwerteGesetzt', true); } @@ -842,6 +835,13 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch private function aktualisiereVariablen(): void { + foreach (['Idle', 'IdleCounter'] as $ident) { + $variablenID = @IPS_GetObjectIDByIdent($ident, $this->InstanceID); + if (is_int($variablenID) && $variablenID > 0 && IPS_VariableExists($variablenID)) { + $this->UnregisterVariable($ident); + } + } + foreach (self::DIAGNOSE_VARIABLEN as $ident) { if ($ident === 'Leistungsquelle') { continue; @@ -865,8 +865,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch 220 ); $this->RegisterVariableInteger('LegioCounter', 'Zeit seit Legionellenabschluss', '', 230); - $this->RegisterVariableBoolean('Idle', 'Lastwechsel freigegeben', '~Switch', 240); - $this->RegisterVariableInteger('IdleCounter', 'Restzeit bis Lastwechsel', '', 250); foreach (self::DIAGNOSE_VARIABLEN as $ident) { $wert = $ident === 'Leistungsquelle' @@ -923,13 +921,11 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch 'TemperaturGueltig' => 'ZustandTemperaturGueltig', 'NachladenAktiv' => 'ZustandNachladenAktiv', 'LegionellenbetriebAktiv' => 'ZustandLegionellenbetriebAktiv', - 'Idle' => 'ZustandIdle', ]; $integerAttribute = [ 'Sollleistung' => 'ZustandSollleistung', 'AktiveStufe' => 'ZustandAktiveStufe', 'LegioCounter' => 'ZustandLegioCounter', - 'IdleCounter' => 'ZustandIdleCounter', ]; $floatAttribute = [ 'Istleistung' => 'ZustandIstleistung', @@ -972,13 +968,11 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch 'TemperaturGueltig' => 'ZustandTemperaturGueltig', 'NachladenAktiv' => 'ZustandNachladenAktiv', 'LegionellenbetriebAktiv' => 'ZustandLegionellenbetriebAktiv', - 'Idle' => 'ZustandIdle', ]; $integerAttribute = [ 'Sollleistung' => 'ZustandSollleistung', 'AktiveStufe' => 'ZustandAktiveStufe', 'LegioCounter' => 'ZustandLegioCounter', - 'IdleCounter' => 'ZustandIdleCounter', ]; $floatAttribute = [ 'Istleistung' => 'ZustandIstleistung', diff --git a/docs/Schnittstelle.md b/docs/Schnittstelle.md index b48652c..8024357 100644 --- a/docs/Schnittstelle.md +++ b/docs/Schnittstelle.md @@ -119,7 +119,10 @@ Symcon-Datenpunkte werden durch `VerbraucherBasisTrait` registriert. `Leistungswerte_W` und `Zustand` werden intern gehalten und direkt in die Nachricht geschrieben. Dafür werden keine zusätzlichen Symcon-Variablen angelegt. Der gemeinsame Zustandseintrag `Sollleistung_W` wird durch die Basis -ergänzt. +ergänzt. Während einer Lastwechselsperre meldet ein Verbraucher +`AenderungMoeglich` als `false` und beschränkt `Leistungswerte_W` auf die aktuell +gehaltene Leistung. Separate Felder wie `Idle` oder `IdleCounter` sind nicht +Bestandteil des Vertrags. ## Zeitverhalten diff --git a/docs/migration/Boiler-x-Stufig.md b/docs/migration/Boiler-x-Stufig.md index 479fe34..ac75462 100644 --- a/docs/migration/Boiler-x-Stufig.md +++ b/docs/migration/Boiler-x-Stufig.md @@ -26,8 +26,8 @@ nicht pruefbare Annahmen des Altmoduls. | `Legionellentemperatur` | `Legionellentemperatur` | | `Boilertemperatur` | `Boilertemperatur` | | `LegioCounter` | `LegioCounter` | -| `Idle` | `Idle` | -| `IdleCounter` | `IdleCounter` | +| `Idle` | entfaellt; Freigabe ueber `AenderungMoeglich` | +| `IdleCounter` | entfaellt; Sperre ueber `Leistungswerte_W` und `AenderungMoeglich` | | `Aktuelle_Leistung` | gemeinsames `Istleistung` | | `Bezogene_Energie` | `BezogeneEnergie` in kWh | | `PV_Prio` | Property `PrioritaetPV` | diff --git a/docs/module/Wassererwaermer/README.md b/docs/module/Wassererwaermer/README.md index b410491..574e8e7 100644 --- a/docs/module/Wassererwaermer/README.md +++ b/docs/module/Wassererwaermer/README.md @@ -60,7 +60,7 @@ die Variable geloescht; ihr letzter Wert bleibt intern fuer ein spaeteres Wiedereinschalten erhalten. Die Reihenfolge `Mindesttemperatur < Maximaltemperatur <= Legionellentemperatur` ist zwingend. -Mit `DiagnosevariablenAnzeigen` werden diese 16 Variablen angelegt: +Mit `DiagnosevariablenAnzeigen` werden diese 14 Variablen angelegt: - `Istleistung` - `Leistungsquelle` @@ -76,11 +76,11 @@ Mit `DiagnosevariablenAnzeigen` werden diese 16 Variablen angelegt: - `NachladenAktiv` - `LegionellenbetriebAktiv` - `LegioCounter` -- `Idle` (Lastwechsel freigegeben) -- `IdleCounter` (verbleibende Sperrzeit in Sekunden) Die Regelung und Managerkommunikation verwenden fuer diese Werte eine interne Zustandsablage und funktionieren auch ohne angelegte Diagnosevariablen weiter. +Die Lastwechselsperre wird ausschliesslich ueber die Schnittstellenfelder +`AenderungMoeglich` und `Leistungswerte_W` abgebildet. ## Managerkommunikation diff --git a/tests/WarmwassererwaermerModulstrukturTest.php b/tests/WarmwassererwaermerModulstrukturTest.php index 051cb66..7996f38 100644 --- a/tests/WarmwassererwaermerModulstrukturTest.php +++ b/tests/WarmwassererwaermerModulstrukturTest.php @@ -54,6 +54,11 @@ final class WarmwassererwaermerModulstrukturTest extends TestCase self::assertStringNotContainsString("ReadPropertyInteger('Interval')", $inhalt); self::assertStringContainsString("'LastwechselFreigabe'", $inhalt); self::assertStringContainsString('LetzteTemperaturberechnung', $inhalt); + self::assertStringContainsString('$angebot = [$aktuelleLeistung];', $inhalt); + self::assertStringNotContainsString("RegisterVariableBoolean('Idle'", $inhalt); + self::assertStringNotContainsString("RegisterVariableInteger('IdleCounter'", $inhalt); + self::assertStringNotContainsString('ZustandIdle', $inhalt); + self::assertStringContainsString("['Idle', 'IdleCounter']", $inhalt); } public function testModulVerwendetAusschliesslichDenVertrag30(): void @@ -69,14 +74,14 @@ final class WarmwassererwaermerModulstrukturTest extends TestCase self::assertStringContainsString("'VerbraucherZuordnung'", $inhalt); } - public function testSechzehnDiagnosevariablenWerdenBedarfsgesteuertAngelegtUndGeloescht(): void + public function testVierzehnDiagnosevariablenWerdenBedarfsgesteuertAngelegtUndGeloescht(): void { $inhalt = (string) file_get_contents(self::MODULPFAD . 'module.php'); preg_match('/private const DIAGNOSE_VARIABLEN = \[(.*?)\];/s', $inhalt, $treffer); self::assertArrayHasKey(1, $treffer); preg_match_all('/\'([^\']+)\'/', $treffer[1], $variablen); - self::assertCount(16, $variablen[1]); + self::assertCount(14, $variablen[1]); foreach (['Istleistung', 'Sollleistung', 'Stoerung', 'Stoertext', 'AktiveStufe', 'BezogeneEnergie'] as $ident) { self::assertContains($ident, $variablen[1]); self::assertStringContainsString("Zustand" . $ident, $inhalt);