fix(easee): Wartezustand ohne Ausgangsphase zulassen
Tests / test (push) Successful in 48s

This commit is contained in:
dh
2026-09-29 08:25:08 +00:00
parent 6f76e6cd86
commit aefe46352f
3 changed files with 38 additions and 6 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ Alle wesentlichen Aenderungen an Enelix EMS werden in dieser Datei dokumentiert.
- Stufenlose Leistungsbereiche fuer Batteriespeicher. - Stufenlose Leistungsbereiche fuer Batteriespeicher.
- Ladefreigabe neuer Ladestationsinstanzen standardmaessig aktiviert. - 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. - Vollstaendige PHP-, Struktur- und Symcon-Modultests fuer alle Module.
### Hinweise ### Hinweise
+7 -5
View File
@@ -419,10 +419,12 @@ class LadestationGateway extends IPSModule implements VerbraucherSchnittstelle
$gatewayVerbunden = $this->ReadAttributeBoolean('GatewayVerbunden'); $gatewayVerbunden = $this->ReadAttributeBoolean('GatewayVerbunden');
$phaseGueltig = in_array($status['Phasenzahl'], [1, 3], true); $phaseGueltig = in_array($status['Phasenzahl'], [1, 3], true);
$regelPhasenzahl = $phaseGueltig ? $status['Phasenzahl'] : 1;
$phaseErforderlich = $status['Fahrzeugstatus'] === 3;
$steuerbar = $gatewayVerbunden $steuerbar = $gatewayVerbunden
&& $status['StatusGueltig'] && $status['StatusGueltig']
&& !$status['Stoerung'] && !$status['Stoerung']
&& (!$status['FahrzeugVerbunden'] || $phaseGueltig); && (!$phaseErforderlich || $phaseGueltig);
$solarladen = $this->ReadAttributeBoolean('ZustandSolarladen'); $solarladen = $this->ReadAttributeBoolean('ZustandSolarladen');
$peakbetrieb = $this->ReadAttributeString('Betriebsart') $peakbetrieb = $this->ReadAttributeString('Betriebsart')
@@ -432,7 +434,7 @@ class LadestationGateway extends IPSModule implements VerbraucherSchnittstelle
$this->ReadAttributeBoolean('ZustandLadefreigabe'), $this->ReadAttributeBoolean('ZustandLadefreigabe'),
$steuerbar && $status['FahrzeugVerbunden'], $steuerbar && $status['FahrzeugVerbunden'],
$status['FahrzeugGeladen'], $status['FahrzeugGeladen'],
$phaseGueltig ? $status['Phasenzahl'] : 1, $regelPhasenzahl,
$status['ApiMaximalstrom_A'], $status['ApiMaximalstrom_A'],
$solarladen, $solarladen,
$peakbetrieb $peakbetrieb
@@ -460,8 +462,8 @@ class LadestationGateway extends IPSModule implements VerbraucherSchnittstelle
} elseif ($status['Stoerung']) { } elseif ($status['Stoerung']) {
$stoertext = $status['Stoertext']; $stoertext = $status['Stoertext'];
$this->SetStatus(self::STATUS_LADEFEHLER); $this->SetStatus(self::STATUS_LADEFEHLER);
} elseif ($status['FahrzeugVerbunden'] && !$phaseGueltig) { } elseif ($phaseErforderlich && !$phaseGueltig) {
$stoertext = 'Easee meldet keine unterstuetzte aktive Ausgangsphase.'; $stoertext = 'Easee meldet beim Laden keine unterstuetzte aktive Ausgangsphase.';
$this->SetStatus(self::STATUS_WARTET_AUF_DATEN); $this->SetStatus(self::STATUS_WARTET_AUF_DATEN);
} else { } else {
$this->SetStatus(self::STATUS_AKTIV); $this->SetStatus(self::STATUS_AKTIV);
@@ -471,7 +473,7 @@ class LadestationGateway extends IPSModule implements VerbraucherSchnittstelle
if ($gatewayVerbunden && $status['StatusGueltig']) { if ($gatewayVerbunden && $status['StatusGueltig']) {
$this->setzeLadestrom( $this->setzeLadestrom(
$this->bestimmeWirksameSollleistung($angebot), $this->bestimmeWirksameSollleistung($angebot),
$status['Phasenzahl'] $regelPhasenzahl
); );
} else { } else {
$this->WriteAttributeInteger('LetzterGesetzterStrom', -1); $this->WriteAttributeInteger('LetzterGesetzterStrom', -1);
@@ -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 ( $test->runCase('Nur-Solar-Variante laesst Solarladen nicht abschalten', static function (
TestContext $test TestContext $test
) use ($nurSolar): void { ) use ($nurSolar): void {