This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)));
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = [];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user