Lastwechselsperre nur ueber Vertrag melden
Tests / test (push) Failing after 39s

This commit is contained in:
dh
2026-09-17 09:33:40 +00:00
parent d4828f1ee5
commit 6c2d6ddcde
5 changed files with 23 additions and 21 deletions
+7 -13
View File
@@ -39,8 +39,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
'NachladenAktiv', 'NachladenAktiv',
'LegionellenbetriebAktiv', 'LegionellenbetriebAktiv',
'LegioCounter', 'LegioCounter',
'Idle',
'IdleCounter',
]; ];
public function Create(): void public function Create(): void
@@ -96,8 +94,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
$this->RegisterAttributeBoolean('ZustandNachladenAktiv', false); $this->RegisterAttributeBoolean('ZustandNachladenAktiv', false);
$this->RegisterAttributeBoolean('ZustandLegionellenbetriebAktiv', false); $this->RegisterAttributeBoolean('ZustandLegionellenbetriebAktiv', false);
$this->RegisterAttributeInteger('ZustandLegioCounter', 0); $this->RegisterAttributeInteger('ZustandLegioCounter', 0);
$this->RegisterAttributeBoolean('ZustandIdle', true);
$this->RegisterAttributeInteger('ZustandIdleCounter', 0);
$this->RegisterTimer( $this->RegisterTimer(
'LastwechselFreigabe', 'LastwechselFreigabe',
@@ -497,8 +493,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
$jetzt, $jetzt,
$this->ReadPropertyInteger('LastwechselSperrzeit') $this->ReadPropertyInteger('LastwechselSperrzeit')
); );
$this->setzeZustand('IdleCounter', $restzeit);
$this->setzeZustand('Idle', $restzeit === 0);
$this->SetTimerInterval('LastwechselFreigabe', $restzeit > 0 ? $restzeit * 1000 : 0); $this->SetTimerInterval('LastwechselFreigabe', $restzeit > 0 ? $restzeit * 1000 : 0);
return $restzeit; return $restzeit;
@@ -791,7 +785,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
$this->SetValue('Maximaltemperatur', 60.0); $this->SetValue('Maximaltemperatur', 60.0);
$this->WriteAttributeFloat('ZustandLegionellentemperatur', 65.0); $this->WriteAttributeFloat('ZustandLegionellentemperatur', 65.0);
$this->setzeZustand('Leistungsquelle', Nachrichtenvertrag::LEISTUNGSQUELLE_BERECHNET); $this->setzeZustand('Leistungsquelle', Nachrichtenvertrag::LEISTUNGSQUELLE_BERECHNET);
$this->setzeZustand('Idle', true);
$this->WriteAttributeBoolean('InitialwerteGesetzt', true); $this->WriteAttributeBoolean('InitialwerteGesetzt', true);
} }
@@ -842,6 +835,13 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
private function aktualisiereVariablen(): void 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) { foreach (self::DIAGNOSE_VARIABLEN as $ident) {
if ($ident === 'Leistungsquelle') { if ($ident === 'Leistungsquelle') {
continue; continue;
@@ -865,8 +865,6 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
220 220
); );
$this->RegisterVariableInteger('LegioCounter', 'Zeit seit Legionellenabschluss', '', 230); $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) { foreach (self::DIAGNOSE_VARIABLEN as $ident) {
$wert = $ident === 'Leistungsquelle' $wert = $ident === 'Leistungsquelle'
@@ -923,13 +921,11 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
'TemperaturGueltig' => 'ZustandTemperaturGueltig', 'TemperaturGueltig' => 'ZustandTemperaturGueltig',
'NachladenAktiv' => 'ZustandNachladenAktiv', 'NachladenAktiv' => 'ZustandNachladenAktiv',
'LegionellenbetriebAktiv' => 'ZustandLegionellenbetriebAktiv', 'LegionellenbetriebAktiv' => 'ZustandLegionellenbetriebAktiv',
'Idle' => 'ZustandIdle',
]; ];
$integerAttribute = [ $integerAttribute = [
'Sollleistung' => 'ZustandSollleistung', 'Sollleistung' => 'ZustandSollleistung',
'AktiveStufe' => 'ZustandAktiveStufe', 'AktiveStufe' => 'ZustandAktiveStufe',
'LegioCounter' => 'ZustandLegioCounter', 'LegioCounter' => 'ZustandLegioCounter',
'IdleCounter' => 'ZustandIdleCounter',
]; ];
$floatAttribute = [ $floatAttribute = [
'Istleistung' => 'ZustandIstleistung', 'Istleistung' => 'ZustandIstleistung',
@@ -972,13 +968,11 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
'TemperaturGueltig' => 'ZustandTemperaturGueltig', 'TemperaturGueltig' => 'ZustandTemperaturGueltig',
'NachladenAktiv' => 'ZustandNachladenAktiv', 'NachladenAktiv' => 'ZustandNachladenAktiv',
'LegionellenbetriebAktiv' => 'ZustandLegionellenbetriebAktiv', 'LegionellenbetriebAktiv' => 'ZustandLegionellenbetriebAktiv',
'Idle' => 'ZustandIdle',
]; ];
$integerAttribute = [ $integerAttribute = [
'Sollleistung' => 'ZustandSollleistung', 'Sollleistung' => 'ZustandSollleistung',
'AktiveStufe' => 'ZustandAktiveStufe', 'AktiveStufe' => 'ZustandAktiveStufe',
'LegioCounter' => 'ZustandLegioCounter', 'LegioCounter' => 'ZustandLegioCounter',
'IdleCounter' => 'ZustandIdleCounter',
]; ];
$floatAttribute = [ $floatAttribute = [
'Istleistung' => 'ZustandIstleistung', 'Istleistung' => 'ZustandIstleistung',
+4 -1
View File
@@ -119,7 +119,10 @@ Symcon-Datenpunkte werden durch `VerbraucherBasisTrait` registriert.
`Leistungswerte_W` und `Zustand` werden intern gehalten und direkt in die `Leistungswerte_W` und `Zustand` werden intern gehalten und direkt in die
Nachricht geschrieben. Dafür werden keine zusätzlichen Symcon-Variablen Nachricht geschrieben. Dafür werden keine zusätzlichen Symcon-Variablen
angelegt. Der gemeinsame Zustandseintrag `Sollleistung_W` wird durch die Basis 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 ## Zeitverhalten
+2 -2
View File
@@ -26,8 +26,8 @@ nicht pruefbare Annahmen des Altmoduls.
| `Legionellentemperatur` | `Legionellentemperatur` | | `Legionellentemperatur` | `Legionellentemperatur` |
| `Boilertemperatur` | `Boilertemperatur` | | `Boilertemperatur` | `Boilertemperatur` |
| `LegioCounter` | `LegioCounter` | | `LegioCounter` | `LegioCounter` |
| `Idle` | `Idle` | | `Idle` | entfaellt; Freigabe ueber `AenderungMoeglich` |
| `IdleCounter` | `IdleCounter` | | `IdleCounter` | entfaellt; Sperre ueber `Leistungswerte_W` und `AenderungMoeglich` |
| `Aktuelle_Leistung` | gemeinsames `Istleistung` | | `Aktuelle_Leistung` | gemeinsames `Istleistung` |
| `Bezogene_Energie` | `BezogeneEnergie` in kWh | | `Bezogene_Energie` | `BezogeneEnergie` in kWh |
| `PV_Prio` | Property `PrioritaetPV` | | `PV_Prio` | Property `PrioritaetPV` |
+3 -3
View File
@@ -60,7 +60,7 @@ die Variable geloescht; ihr letzter Wert bleibt intern fuer ein spaeteres
Wiedereinschalten erhalten. Die Reihenfolge Wiedereinschalten erhalten. Die Reihenfolge
`Mindesttemperatur < Maximaltemperatur <= Legionellentemperatur` ist zwingend. `Mindesttemperatur < Maximaltemperatur <= Legionellentemperatur` ist zwingend.
Mit `DiagnosevariablenAnzeigen` werden diese 16 Variablen angelegt: Mit `DiagnosevariablenAnzeigen` werden diese 14 Variablen angelegt:
- `Istleistung` - `Istleistung`
- `Leistungsquelle` - `Leistungsquelle`
@@ -76,11 +76,11 @@ Mit `DiagnosevariablenAnzeigen` werden diese 16 Variablen angelegt:
- `NachladenAktiv` - `NachladenAktiv`
- `LegionellenbetriebAktiv` - `LegionellenbetriebAktiv`
- `LegioCounter` - `LegioCounter`
- `Idle` (Lastwechsel freigegeben)
- `IdleCounter` (verbleibende Sperrzeit in Sekunden)
Die Regelung und Managerkommunikation verwenden fuer diese Werte eine interne Die Regelung und Managerkommunikation verwenden fuer diese Werte eine interne
Zustandsablage und funktionieren auch ohne angelegte Diagnosevariablen weiter. Zustandsablage und funktionieren auch ohne angelegte Diagnosevariablen weiter.
Die Lastwechselsperre wird ausschliesslich ueber die Schnittstellenfelder
`AenderungMoeglich` und `Leistungswerte_W` abgebildet.
## Managerkommunikation ## Managerkommunikation
@@ -54,6 +54,11 @@ final class WarmwassererwaermerModulstrukturTest extends TestCase
self::assertStringNotContainsString("ReadPropertyInteger('Interval')", $inhalt); self::assertStringNotContainsString("ReadPropertyInteger('Interval')", $inhalt);
self::assertStringContainsString("'LastwechselFreigabe'", $inhalt); self::assertStringContainsString("'LastwechselFreigabe'", $inhalt);
self::assertStringContainsString('LetzteTemperaturberechnung', $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 public function testModulVerwendetAusschliesslichDenVertrag30(): void
@@ -69,14 +74,14 @@ final class WarmwassererwaermerModulstrukturTest extends TestCase
self::assertStringContainsString("'VerbraucherZuordnung'", $inhalt); self::assertStringContainsString("'VerbraucherZuordnung'", $inhalt);
} }
public function testSechzehnDiagnosevariablenWerdenBedarfsgesteuertAngelegtUndGeloescht(): void public function testVierzehnDiagnosevariablenWerdenBedarfsgesteuertAngelegtUndGeloescht(): void
{ {
$inhalt = (string) file_get_contents(self::MODULPFAD . 'module.php'); $inhalt = (string) file_get_contents(self::MODULPFAD . 'module.php');
preg_match('/private const DIAGNOSE_VARIABLEN = \[(.*?)\];/s', $inhalt, $treffer); preg_match('/private const DIAGNOSE_VARIABLEN = \[(.*?)\];/s', $inhalt, $treffer);
self::assertArrayHasKey(1, $treffer); self::assertArrayHasKey(1, $treffer);
preg_match_all('/\'([^\']+)\'/', $treffer[1], $variablen); 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) { foreach (['Istleistung', 'Sollleistung', 'Stoerung', 'Stoertext', 'AktiveStufe', 'BezogeneEnergie'] as $ident) {
self::assertContains($ident, $variablen[1]); self::assertContains($ident, $variablen[1]);
self::assertStringContainsString("Zustand" . $ident, $inhalt); self::assertStringContainsString("Zustand" . $ident, $inhalt);