diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ca7411..8c9419b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ Alle wesentlichen Aenderungen an Enelix EMS werden in dieser Datei dokumentiert. - Stufenlose Leistungsbereiche fuer Batteriespeicher. - Ladefreigabe neuer Ladestationsinstanzen standardmaessig aktiviert. -- Easee-Ladestationen laden einen fehlenden Initialstatus ueber die Observations-API nach. +- Easee-Ladestationen laden einen fehlenden Initialstatus ueber die Observations-API nach und starten bei noch unbekannter Ausgangsphase konservativ einphasig. - Vollstaendige PHP-, Struktur- und Symcon-Modultests fuer alle Module. ### Hinweise diff --git a/LadestationGateway/module.php b/LadestationGateway/module.php index 74cf845..4a1b18e 100644 --- a/LadestationGateway/module.php +++ b/LadestationGateway/module.php @@ -419,10 +419,12 @@ class LadestationGateway extends IPSModule implements VerbraucherSchnittstelle $gatewayVerbunden = $this->ReadAttributeBoolean('GatewayVerbunden'); $phaseGueltig = in_array($status['Phasenzahl'], [1, 3], true); + $regelPhasenzahl = $phaseGueltig ? $status['Phasenzahl'] : 1; + $phaseErforderlich = $status['Fahrzeugstatus'] === 3; $steuerbar = $gatewayVerbunden && $status['StatusGueltig'] && !$status['Stoerung'] - && (!$status['FahrzeugVerbunden'] || $phaseGueltig); + && (!$phaseErforderlich || $phaseGueltig); $solarladen = $this->ReadAttributeBoolean('ZustandSolarladen'); $peakbetrieb = $this->ReadAttributeString('Betriebsart') @@ -432,7 +434,7 @@ class LadestationGateway extends IPSModule implements VerbraucherSchnittstelle $this->ReadAttributeBoolean('ZustandLadefreigabe'), $steuerbar && $status['FahrzeugVerbunden'], $status['FahrzeugGeladen'], - $phaseGueltig ? $status['Phasenzahl'] : 1, + $regelPhasenzahl, $status['ApiMaximalstrom_A'], $solarladen, $peakbetrieb @@ -460,8 +462,8 @@ class LadestationGateway extends IPSModule implements VerbraucherSchnittstelle } elseif ($status['Stoerung']) { $stoertext = $status['Stoertext']; $this->SetStatus(self::STATUS_LADEFEHLER); - } elseif ($status['FahrzeugVerbunden'] && !$phaseGueltig) { - $stoertext = 'Easee meldet keine unterstuetzte aktive Ausgangsphase.'; + } elseif ($phaseErforderlich && !$phaseGueltig) { + $stoertext = 'Easee meldet beim Laden keine unterstuetzte aktive Ausgangsphase.'; $this->SetStatus(self::STATUS_WARTET_AUF_DATEN); } else { $this->SetStatus(self::STATUS_AKTIV); @@ -471,7 +473,7 @@ class LadestationGateway extends IPSModule implements VerbraucherSchnittstelle if ($gatewayVerbunden && $status['StatusGueltig']) { $this->setzeLadestrom( $this->bestimmeWirksameSollleistung($angebot), - $status['Phasenzahl'] + $regelPhasenzahl ); } else { $this->WriteAttributeInteger('LetzterGesetzterStrom', -1); diff --git a/tests/Symcon/modules/LadestationGateway.php b/tests/Symcon/modules/LadestationGateway.php index 88688b8..d59b5f0 100644 --- a/tests/Symcon/modules/LadestationGateway.php +++ b/tests/Symcon/modules/LadestationGateway.php @@ -108,6 +108,36 @@ return static function (TestContext $test): void { )); }); + $test->runCase('Wartezustand startet konservativ ohne aktive Phase', static function ( + TestContext $test + ) use ($sendeBeobachtung, $station): void { + $sendeBeobachtung('EH123456', 109, 2); + $sendeBeobachtung('EH123456', 110, 0); + IPS_RequestAction($station, 'Solarladen', false); + + $test->assertSame( + 0, + GetValue($test->objectByIdent('Phasenzahl', $station)) + ); + $test->assertInstanceStatus($station); + $test->assertSame( + '[3850]', + (string) GetValue( + $test->objectByIdent('LeistungsangebotDiagnose', $station) + ) + ); + $test->assertTrue(str_contains( + (string) GetValue( + $test->objectByIdent('LetzterGeraetebefehl', $station) + ), + '"Ampere":16' + )); + + IPS_RequestAction($station, 'Solarladen', true); + $sendeBeobachtung('EH123456', 110, 30); + $sendeBeobachtung('EH123456', 109, 3); + }); + $test->runCase('Nur-Solar-Variante laesst Solarladen nicht abschalten', static function ( TestContext $test ) use ($nurSolar): void {