fix(verbraucher): clear discarded power setpoints
Tests / test (push) Failing after 51s

This commit is contained in:
dh
2026-10-06 13:45:54 +00:00
parent ebec355c96
commit 5437f3f058
18 changed files with 296 additions and 38 deletions
+6
View File
@@ -133,6 +133,7 @@ PHP
'GoodWe-Entladen verwendet negativen Managerwert und Modus 12',
static function (TestContext $test) use (
$managerdatenSenden,
$batterieID,
$modusID,
$leistungID
): void {
@@ -141,6 +142,10 @@ PHP
static fn (): bool => (float) GetValue($leistungID) === 843.0
&& (int) GetValue($modusID) === 12
);
$test->assertSame(-843, GetValue($test->objectByIdent('Sollleistung', $batterieID)));
IPS_RequestAction($batterieID, 'VorgabeTimeout', 0);
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $batterieID)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $batterieID)));
}
);
@@ -197,6 +202,7 @@ PHP
$leistungID
): void {
$test->configureInstance($batterieID, ['Batteriemanagement' => 1]);
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $batterieID)));
$test->waitUntil(
static fn (): bool => (float) GetValue($leistungID) === 0.0
&& (int) GetValue($managementID) === 1
+23 -3
View File
@@ -186,7 +186,7 @@ return static function (TestContext $test): void {
$test->runCase('Solarumschaltung wartet auf die neue Manager-Vorgabe', static function (
TestContext $test
) use ($station): void {
) use ($station, $sendeBeobachtung): void {
$managerId = $test->createInstance(
'{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}',
'Hilfsmanager Easee-Uebergang',
@@ -221,10 +221,11 @@ return static function (TestContext $test): void {
(string) GetValue($test->objectByIdent('LetzterGeraetebefehl', $station))
);
$test->assertSame(
4104,
0,
GetValue($test->objectByIdent('Sollleistung', $station)),
'Die Sollleistung muss bis zur neuen Manager-Vorgabe stabil bleiben.'
'Die verworfene Manager-Vorgabe darf nicht als aktuelle Sollleistung stehen bleiben.'
);
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $station)));
$sendeSollwert(10944);
$test->assertTrue(str_contains(
@@ -234,6 +235,25 @@ return static function (TestContext $test): void {
IPS_RequestAction($station, 'Solarladen', true);
$sendeSollwert(0);
$test->assertSame(true, GetValue($test->objectByIdent('SollwertGueltig', $station)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $station)));
$sendeSollwert(10944);
$sendeBeobachtung('EH123456', 109, 1);
$test->assertSame('[0]', GetValue($test->objectByIdent('LeistungsangebotDiagnose', $station)));
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $station)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $station)));
$test->assertTrue(str_contains(
(string) GetValue($test->objectByIdent('LetzterGeraetebefehl', $station)),
'"Ampere":0'
));
$sendeBeobachtung('EH123456', 110, 30);
$sendeBeobachtung('EH123456', 109, 3);
$sendeSollwert(10944);
IPS_RequestAction($station, 'VorgabeTimeout', 0);
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $station)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $station)));
});
$test->runCase('SignalR-Abbruch erreicht die Ladestation', static function (
+26 -2
View File
@@ -387,10 +387,11 @@ return static function (TestContext $test): void {
'Die Umschaltung darf vor der neuen Manager-Vorgabe keinen Zwischenwert setzen.'
);
$test->assertSame(
4104,
0,
GetValue($test->objectByIdent('Sollleistung', $stationId)),
'Die Sollleistung muss bis zur neuen Manager-Vorgabe stabil bleiben.'
'Die verworfene Manager-Vorgabe darf nicht als aktuelle Sollleistung stehen bleiben.'
);
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $stationId)));
$angebot = (string) GetValue($test->objectByIdent('LeistungsangebotDiagnose', $stationId));
$test->assertSame('[10944]', $angebot, 'PV ohne Solarladen muss nur das Maximum anbieten.');
$abgewiesen = false;
@@ -502,6 +503,29 @@ return static function (TestContext $test): void {
);
});
$test->runCase('Abziehen und Vorgabe-Timeout hinterlassen keine alte Sollleistung', static function (
TestContext $test
) use ($stationen, $goEAntwort, $anforderungSenden): void {
$stationId = $stationen['go-e alt'];
IPS_SetProperty($stationId, 'Testantwort', $goEAntwort(2, 10944, [160, 160, 160]));
IPS_ApplyChanges($stationId);
IPS_RequestAction($stationId, 'Aktiv', true);
IPS_RequestAction($stationId, 'Solarladen', true);
$anforderungSenden($stationId, 10944);
$test->assertSame(10944, GetValue($test->objectByIdent('Sollleistung', $stationId)));
IPS_RequestAction($stationId, 'VorgabeTimeout', 0);
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $stationId)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $stationId)));
$anforderungSenden($stationId, 10944);
IPS_SetProperty($stationId, 'Testantwort', $goEAntwort(1, 0));
IPS_ApplyChanges($stationId);
$test->assertSame('[0]', GetValue($test->objectByIdent('LeistungsangebotDiagnose', $stationId)));
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $stationId)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $stationId)));
});
$test->runCase('Leistungswerte und Fahrzeugstatus folgen ihrer Sichtbarkeitsgruppe', static function (
TestContext $test
) use ($stationen): void {
+1
View File
@@ -105,6 +105,7 @@ return static function (TestContext $test): void {
$test->assertSame(false, GetValue($test->objectByIdent('Heizbedarf', $verbraucherId)));
SetValue($pufferId, 55.0);
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $verbraucherId)));
IPS_RequestAction($verbraucherId, 'Melden', true);
$test->assertSame([false, false], $kontaktzustand());
});
@@ -225,4 +225,18 @@ return static function (TestContext $test): void {
) === false);
$test->assertInstanceStatus($verbraucherId);
});
$test->runCase('Deaktivierung verwirft eine positive Vorgabe vollstaendig', static function (
TestContext $test
) use ($verbraucherId, $anforderungSenden): void {
IPS_SetProperty($verbraucherId, 'Mindestlaufzeit', 0);
IPS_SetProperty($verbraucherId, 'Mindesteinschaltdauer', 0);
IPS_SetProperty($verbraucherId, 'Mindestausschaltdauer', 0);
IPS_ApplyChanges($verbraucherId);
$anforderungSenden(1200);
$test->assertSame(1200, GetValue($test->objectByIdent('Sollleistung', $verbraucherId)));
IPS_RequestAction($verbraucherId, 'Aktiv', false);
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $verbraucherId)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $verbraucherId)));
});
};
+2
View File
@@ -121,6 +121,8 @@ return static function (TestContext $test): void {
TestContext $test
) use ($waermepumpe, $kontakt1, $kontakt2): void {
IPS_RequestAction($waermepumpe, 'Aktiv', false);
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $waermepumpe)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $waermepumpe)));
IPS_RequestAction($waermepumpe, 'Aktiv', true);
$test->waitUntil(
static fn (): bool => GetValue($kontakt1) === false
@@ -110,6 +110,33 @@ return static function (TestContext $test): void {
$temperaturSetzen(52.0);
});
$test->runCase('Abgelaufene Vorgabe wird auch in der Anzeige verworfen', static function (
TestContext $test
) use ($verbraucherId, $managerId, $kontakte): void {
IPS_SetProperty($verbraucherId, 'VorgabeTimeout', 1);
IPS_ApplyChanges($verbraucherId);
IPS_RequestAction($verbraucherId, 'Aktiv', true);
IPS_RequestAction($verbraucherId, 'ManagerdatenEmpfangen', json_encode([
'Kopf' => [
'Version' => '4.0',
'AbsenderID' => $managerId,
'EmpfaengerID' => $verbraucherId,
'Zeitpunkt' => time(),
],
'Betriebsart' => 'PV',
'Sollleistung_W' => 1000,
], JSON_THROW_ON_ERROR));
$test->assertSame(1000, GetValue($test->objectByIdent('Sollleistung', $verbraucherId)));
IPS_Sleep(2100);
IPS_RequestAction($verbraucherId, 'Melden', true);
$test->assertSame(false, GetValue($test->objectByIdent('SollwertGueltig', $verbraucherId)));
$test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $verbraucherId)));
$test->waitUntil(static fn (): bool => GetValue($kontakte[0]) === false);
IPS_RequestAction($verbraucherId, 'Aktiv', false);
IPS_SetProperty($verbraucherId, 'VorgabeTimeout', 120);
IPS_ApplyChanges($verbraucherId);
});
if ($lizenzcode === '') {
$test->runCase('Manager bleibt ohne Lizenz sicher gesperrt', static function (
TestContext $test
+109
View File
@@ -9,6 +9,86 @@ use PHPUnit\Framework\TestCase;
final class VerbraucherBasisTraitTest extends TestCase
{
/** @dataProvider sollwerte */
public function testVerwerfenLoeschtGespeicherteUndSichtbareVorgabe(int $leistung, bool $sichtbar): void
{
$modul = new VerbraucherBasisDummy();
$modul->zustand = ['Sollleistung' => $leistung, 'SollwertGueltig' => true];
$modul->sichtbareWerte = $sichtbar ? $modul->zustand : [];
$modul->verwerfen();
$modul->verwerfen();
self::assertSame(['Sollleistung' => 0, 'SollwertGueltig' => false], $modul->zustand);
self::assertSame($sichtbar ? $modul->zustand : [], $modul->sichtbareWerte);
}
/** @dataProvider sollwerte */
public function testUpdateBereinigtAlteUngueltigeVorgaben(int $leistung, bool $sichtbar): void
{
$modul = new VerbraucherBasisDummy();
$modul->zustand = ['Sollleistung' => $leistung, 'SollwertGueltig' => false];
$modul->sichtbareWerte = $sichtbar ? $modul->zustand : [];
$modul->bereinigen();
self::assertSame(['Sollleistung' => 0, 'SollwertGueltig' => false], $modul->zustand);
self::assertSame($sichtbar ? $modul->zustand : [], $modul->sichtbareWerte);
}
/** @dataProvider sollwerte */
public function testUpdateErhaeltGueltigeVorgabenAuchNullUndEntladen(int $leistung, bool $sichtbar): void
{
$modul = new VerbraucherBasisDummy();
$modul->zustand = ['Sollleistung' => $leistung, 'SollwertGueltig' => true];
$modul->sichtbareWerte = $sichtbar ? $modul->zustand : [];
$vorher = $modul->zustand;
$modul->bereinigen();
self::assertSame($vorher, $modul->zustand);
self::assertSame($sichtbar ? $vorher : [], $modul->sichtbareWerte);
}
public static function sollwerte(): array
{
return [[10944, true], [10944, false], [-843, true], [-843, false], [0, true], [0, false]];
}
public function testWiederholtesVerwerfenLaesstNeuBerechneteLokaleSchutzleistungStehen(): void
{
$modul = new VerbraucherBasisDummy();
$modul->zustand = ['Sollleistung' => 3000, 'SollwertGueltig' => false];
$modul->sichtbareWerte = $modul->zustand;
$modul->verwerfen();
self::assertSame(['Sollleistung' => 3000, 'SollwertGueltig' => false], $modul->zustand);
self::assertSame($modul->zustand, $modul->sichtbareWerte);
}
public function testAlleVerbraucherVerwerfenSollwerteUeberDieGemeinsameFunktion(): void
{
$anzahl = 0;
foreach (glob(__DIR__ . '/../*/module.php') as $datei) {
$quelle = (string) file_get_contents($datei);
if (!str_contains($quelle, 'implements VerbraucherSchnittstelle')) {
continue;
}
++$anzahl;
self::assertStringContainsString('use VerbraucherBasisTrait;', $quelle, $datei);
self::assertStringContainsString('$this->verwerfeSollwert();', $quelle, $datei);
self::assertStringNotContainsString("setzeZustand('SollwertGueltig', false)", $quelle, $datei);
self::assertStringNotContainsString("WriteAttributeBoolean('ZustandSollwertGueltig', false)", $quelle, $datei);
self::assertStringContainsString(
'$this->aktualisiereVariablen();' . "\n " . '$this->bereinigeUngueltigenSollwert();',
$quelle,
$datei
);
}
self::assertSame(7, $anzahl);
}
public function testGemeinsamePropertiesUndVariablenWerdenRegistriert(): void
{
$modul = new VerbraucherBasisDummy();
@@ -50,6 +130,35 @@ final class VerbraucherBasisDummy
{
use VerbraucherBasisTrait;
/** @var array<string, int|bool> */
public array $zustand = [];
/** @var array<string, int|bool> */
public array $sichtbareWerte = [];
public function verwerfen(): void
{
$this->verwerfeSollwert();
}
public function bereinigen(): void
{
$this->bereinigeUngueltigenSollwert();
}
private function setzeZustand(string $ident, $wert): void
{
$this->zustand[$ident] = $wert;
if (array_key_exists($ident, $this->sichtbareWerte)) {
$this->sichtbareWerte[$ident] = $wert;
}
}
private function leseZustand(string $ident)
{
return $this->zustand[$ident];
}
/** @var array<string, mixed> */
public array $properties = [];