From b86810d30f89ef201a94a640cce01163bdd75a7b Mon Sep 17 00:00:00 2001 From: dh_Agent Date: Tue, 29 Sep 2026 09:07:44 +0000 Subject: [PATCH] fix(ladestation): Solarpause nicht als Ladeende erkennen --- LadestationStandAlone/module.php | 4 ++- libs/LadestationRegler.php | 11 +++++-- tests/LadestationReglerTest.php | 22 +++++++++++++ .../Symcon/modules/LadestationStandAlone.php | 31 +++++++++++++++++++ 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/LadestationStandAlone/module.php b/LadestationStandAlone/module.php index c6665e3..2b182c2 100644 --- a/LadestationStandAlone/module.php +++ b/LadestationStandAlone/module.php @@ -301,7 +301,9 @@ class LadestationStandAlone extends IPSModule implements VerbraucherSchnittstell ); $status = LadestationRegler::normalisiereStatus( $rohstatus, - $this->ReadAttributeBoolean('ZustandFahrzeugVerbunden') + $this->ReadAttributeBoolean('ZustandFahrzeugVerbunden'), + $this->ReadAttributeBoolean('ZustandFahrzeugGeladen'), + $this->ReadAttributeInteger('LetzterGesetzterStrom') >= 6 ); foreach ($status as $ident => $wert) { diff --git a/libs/LadestationRegler.php b/libs/LadestationRegler.php index 55831b6..1f6df48 100644 --- a/libs/LadestationRegler.php +++ b/libs/LadestationRegler.php @@ -34,8 +34,12 @@ final class LadestationRegler * @param array{Rohstatus: int, Istleistung_W: float} $rohstatus * @return array */ - public static function normalisiereStatus(array $rohstatus, bool $warVerbunden): array - { + public static function normalisiereStatus( + array $rohstatus, + bool $warVerbunden, + bool $warGeladen = false, + bool $ladungErwartet = true + ): array { $verbunden = $rohstatus['Rohstatus'] !== 1; $leistung = max(0.0, $rohstatus['Istleistung_W']); $phasen = self::PHASEN_UNBEKANNT; @@ -47,7 +51,8 @@ final class LadestationRegler $nenner = $phasen === self::PHASEN_EIN ? 230.0 : 1.71 * 400.0; $ladestrom = $leistung / $nenner; $ermittelterMaximalstrom = 2.5 + $ladestrom; - $geladen = $warVerbunden && $ermittelterMaximalstrom < 6.0; + $geladen = $warGeladen + || ($warVerbunden && $ladungErwartet && $ermittelterMaximalstrom < 6.0); } if (!$verbunden) { diff --git a/tests/LadestationReglerTest.php b/tests/LadestationReglerTest.php index b3e09fd..c210246 100644 --- a/tests/LadestationReglerTest.php +++ b/tests/LadestationReglerTest.php @@ -44,6 +44,28 @@ final class LadestationReglerTest extends TestCase self::assertSame(4, $status['Fahrzeugstatus']); } + public function testAbsichtlichGestoppteLadungWirdNichtAlsGeladenErkannt(): void + { + $status = LadestationRegler::normalisiereStatus([ + 'Rohstatus' => 2, + 'Istleistung_W' => 0.0, + ], true, false, false); + + self::assertFalse($status['FahrzeugGeladen']); + self::assertSame(2, $status['Fahrzeugstatus']); + } + + public function testErkanntesLadeendeBleibtBisZumAbsteckenErhalten(): void + { + $status = LadestationRegler::normalisiereStatus([ + 'Rohstatus' => 2, + 'Istleistung_W' => 0.0, + ], true, true, false); + + self::assertTrue($status['FahrzeugGeladen']); + self::assertSame(4, $status['Fahrzeugstatus']); + } + public function testBetriebsartUndSolarladenBestimmenDasLeistungsangebot(): void { $solarPV = LadestationRegler::leistungsangebot(true, true, true, false, 1, 16, true, false); diff --git a/tests/Symcon/modules/LadestationStandAlone.php b/tests/Symcon/modules/LadestationStandAlone.php index 08c0b63..9e84535 100644 --- a/tests/Symcon/modules/LadestationStandAlone.php +++ b/tests/Symcon/modules/LadestationStandAlone.php @@ -61,6 +61,22 @@ return static function (TestContext $test): void { ); } + $solarPause = $test->createInstance( + '{0D94913C-0F31-4C29-A685-6EB4AE58E55D}', + 'Ladestation Solarpause', + [ + 'Geraetetyp' => 1, + 'Geraeteadresse' => '192.0.2.12', + 'MaximalerLadestrom' => 16, + 'Ladefreigabe' => true, + 'Solarladen' => true, + 'EinstellungenInVisu' => true, + 'DiagnosevariablenAnzeigen' => true, + 'Testmodus' => true, + 'Testantwort' => $goEAntwort(2, 0), + ] + ); + $managerId = $test->createInstance( '{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}', 'Hilfsmanager Ladestation', @@ -120,6 +136,21 @@ return static function (TestContext $test): void { } }); + $test->runCase('Solarpause wird nicht als Ladeende erkannt', static function ( + TestContext $test + ) use ($solarPause): void { + IPS_RequestAction($solarPause, 'Solarladen', true); + + $test->assertSame( + false, + GetValue($test->objectByIdent('FahrzeugGeladen', $solarPause)) + ); + $test->assertSame( + 2, + GetValue($test->objectByIdent('Fahrzeugstatus', $solarPause)) + ); + }); + $test->runCase('Solar- und Peakbetrieb liefern die Enelix-1-Angebote', static function ( TestContext $test ) use ($stationen, $anforderungSenden): void {