This commit is contained in:
@@ -6,6 +6,7 @@ use Belevo\EnelixEMS\SymconTest\TestContext;
|
||||
|
||||
return static function (TestContext $test): void {
|
||||
$temperaturId = $test->createVariable(2, 'Boilertemperatur', 52.0, null, '~Temperature');
|
||||
$netzleistungId = $test->createVariable(2, 'Netzleistung', 0.0);
|
||||
$kontakte = [
|
||||
$test->createActionVariable('Heizstufe 1'),
|
||||
$test->createActionVariable('Heizstufe 2'),
|
||||
@@ -25,9 +26,15 @@ return static function (TestContext $test): void {
|
||||
'Wassererwärmer',
|
||||
[
|
||||
'Boilerfuehler_PT1' => $temperaturId,
|
||||
'Boilervolumen' => 300,
|
||||
'LeistungsStufen' => json_encode($stufen, JSON_THROW_ON_ERROR),
|
||||
'LastwechselSperrzeit' => 1,
|
||||
'LegionellenfunktionAktiv' => false,
|
||||
'Hysterese' => 5.0,
|
||||
'TemperaturMaxAlter' => 120,
|
||||
'LegionellenfunktionAktiv' => true,
|
||||
'LegionellenMinimalintervallTage' => 4,
|
||||
'LegionellenMaximalintervallTage' => 7,
|
||||
'EinstellungenInVisu' => true,
|
||||
'DiagnosevariablenAnzeigen' => true,
|
||||
]
|
||||
);
|
||||
@@ -35,63 +42,175 @@ return static function (TestContext $test): void {
|
||||
'{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}',
|
||||
'Hilfsmanager',
|
||||
[
|
||||
'NetzleistungVariableID' => $netzleistungId,
|
||||
'AutomatischeSuche' => false,
|
||||
'VerbraucherZuordnung' => json_encode([
|
||||
['InstanzID' => $verbraucherId, 'Aktiv' => true],
|
||||
], JSON_THROW_ON_ERROR),
|
||||
'Lastspitzenmodus' => 1,
|
||||
'Lastspitzengrenze' => 0.0,
|
||||
'SollwertSolarladen' => 0.0,
|
||||
'Umschaltdifferenz' => 0.0,
|
||||
'KeepAlive' => 5,
|
||||
'DiagnosevariablenAnzeigen' => true,
|
||||
]
|
||||
);
|
||||
|
||||
$test->runCase('Instanz und Diagnosevariablen werden angelegt', static function (
|
||||
$kontaktzustand = static fn (): array => array_map(
|
||||
static fn (int $id): bool => (bool) GetValue($id),
|
||||
$kontakte
|
||||
);
|
||||
$warteAufKontakte = static function (array $erwartet) use (
|
||||
$test,
|
||||
$kontaktzustand
|
||||
): void {
|
||||
$test->waitUntil(
|
||||
static fn (): bool => $kontaktzustand() === $erwartet,
|
||||
4000,
|
||||
50
|
||||
);
|
||||
$test->assertSame($erwartet, $kontaktzustand());
|
||||
};
|
||||
$temperaturSetzen = static function (float $wert) use (
|
||||
$temperaturId,
|
||||
$verbraucherId
|
||||
): void {
|
||||
SetValue($temperaturId, $wert);
|
||||
IPS_RequestAction($verbraucherId, 'Melden', true);
|
||||
};
|
||||
$managerRegeln = static function (float $netzleistung) use (
|
||||
$netzleistungId,
|
||||
$verbraucherId,
|
||||
$managerId
|
||||
): void {
|
||||
SetValue($netzleistungId, $netzleistung);
|
||||
IPS_RequestAction($verbraucherId, 'Melden', true);
|
||||
IPS_RequestAction($managerId, 'Regeln', true);
|
||||
};
|
||||
|
||||
$test->runCase('Instanzen und Diagnosevariablen werden angelegt', static function (
|
||||
TestContext $test
|
||||
) use ($verbraucherId): void {
|
||||
) use ($verbraucherId, $managerId): void {
|
||||
$test->assertInstanceStatus($verbraucherId);
|
||||
$test->assertInstanceStatus($managerId);
|
||||
foreach ([
|
||||
'Aktiv', 'Boilertemperatur', 'Mindesttemperatur', 'Maximaltemperatur',
|
||||
'Istleistung', 'Sollleistung', 'AktiveStufe', 'TemperaturGueltig',
|
||||
'Legionellentemperatur', 'Istleistung', 'Sollleistung', 'AktiveStufe',
|
||||
'TemperaturGueltig', 'NachladenAktiv', 'LegionellenbetriebAktiv',
|
||||
] as $ident) {
|
||||
$test->objectByIdent($ident, $verbraucherId);
|
||||
}
|
||||
});
|
||||
|
||||
$test->runCase('Temperaturmessung wird übernommen', static function (TestContext $test) use (
|
||||
$verbraucherId
|
||||
): void {
|
||||
$test->runCase('Temperaturmessung und Verbraucher werden aktiviert', static function (
|
||||
TestContext $test
|
||||
) use ($verbraucherId, $managerId): void {
|
||||
IPS_RequestAction($verbraucherId, 'Aktiv', true);
|
||||
IPS_RequestAction($managerId, 'Aktiv', true);
|
||||
IPS_RequestAction($verbraucherId, 'Melden', true);
|
||||
$temperature = (float) GetValue($test->objectByIdent('Boilertemperatur', $verbraucherId));
|
||||
$test->assertEquals(52.0, $temperature, 0.01);
|
||||
$test->assertEquals(
|
||||
52.0,
|
||||
(float) GetValue($test->objectByIdent('Boilertemperatur', $verbraucherId)),
|
||||
0.01
|
||||
);
|
||||
$test->assertSame(
|
||||
true,
|
||||
GetValue($test->objectByIdent('TemperaturGueltig', $verbraucherId))
|
||||
);
|
||||
});
|
||||
|
||||
$test->runCase('Sollwert wählt genau eine Leistungsstufe', static function (
|
||||
$test->runCase('Unter Minimum wird in PV und Peak bis über die Hysterese geheizt', static function (
|
||||
TestContext $test
|
||||
) use ($managerId, $verbraucherId, $kontakte): void {
|
||||
$paket = [
|
||||
'Kopf' => [
|
||||
'Version' => '3.0',
|
||||
'AbsenderID' => $managerId,
|
||||
'EmpfaengerID' => $verbraucherId,
|
||||
'Zeitpunkt' => time(),
|
||||
],
|
||||
'Sollleistung_W' => 2000,
|
||||
];
|
||||
IPS_RequestAction(
|
||||
$verbraucherId,
|
||||
'ManagerdatenEmpfangen',
|
||||
json_encode($paket, JSON_THROW_ON_ERROR)
|
||||
);
|
||||
$test->waitUntil(static fn (): bool => GetValue($kontakte[1]) === true);
|
||||
$test->assertSame(
|
||||
[false, true, false],
|
||||
array_map(static fn (int $id): bool => (bool) GetValue($id), $kontakte)
|
||||
);
|
||||
$test->assertSame(
|
||||
2,
|
||||
GetValue($test->objectByIdent('AktiveStufe', $verbraucherId))
|
||||
);
|
||||
) use (
|
||||
$temperaturSetzen,
|
||||
$managerRegeln,
|
||||
$warteAufKontakte,
|
||||
$managerId
|
||||
): void {
|
||||
$temperaturSetzen(44.0);
|
||||
$managerRegeln(-3000.0);
|
||||
$warteAufKontakte([false, false, true]);
|
||||
$test->assertSame('PV', GetValue($test->objectByIdent('Betriebsart', $managerId)));
|
||||
|
||||
$managerRegeln(3000.0);
|
||||
$warteAufKontakte([false, false, true]);
|
||||
$test->assertSame('Peak', GetValue($test->objectByIdent('Betriebsart', $managerId)));
|
||||
|
||||
$temperaturSetzen(49.9);
|
||||
$managerRegeln(3000.0);
|
||||
$warteAufKontakte([false, false, true]);
|
||||
|
||||
IPS_Sleep(1100);
|
||||
$temperaturSetzen(50.0);
|
||||
$managerRegeln(3000.0);
|
||||
$warteAufKontakte([false, false, false]);
|
||||
});
|
||||
|
||||
$test->runCase('Zwischen Minimum und Maximum wählt PV Stufen und Peak null', static function (
|
||||
TestContext $test
|
||||
) use ($temperaturSetzen, $managerRegeln, $warteAufKontakte): void {
|
||||
IPS_Sleep(1100);
|
||||
$temperaturSetzen(52.0);
|
||||
$managerRegeln(-3000.0);
|
||||
$warteAufKontakte([false, false, true]);
|
||||
|
||||
IPS_Sleep(1100);
|
||||
$managerRegeln(3000.0);
|
||||
$warteAufKontakte([false, false, false]);
|
||||
});
|
||||
|
||||
$test->runCase('Maximum sperrt bis unter die obere Hysterese', static function (
|
||||
TestContext $test
|
||||
) use ($temperaturSetzen, $managerRegeln, $warteAufKontakte): void {
|
||||
$temperaturSetzen(60.0);
|
||||
$managerRegeln(-3000.0);
|
||||
$warteAufKontakte([false, false, false]);
|
||||
|
||||
$temperaturSetzen(58.0);
|
||||
$managerRegeln(-3000.0);
|
||||
$warteAufKontakte([false, false, false]);
|
||||
|
||||
$temperaturSetzen(55.0);
|
||||
$managerRegeln(-3000.0);
|
||||
$warteAufKontakte([false, false, true]);
|
||||
});
|
||||
|
||||
$test->runCase('Legionellenziel erlaubt Peak-Stufen und lädt in PV maximal', static function (
|
||||
TestContext $test
|
||||
) use (
|
||||
$verbraucherId,
|
||||
$temperaturSetzen,
|
||||
$managerRegeln,
|
||||
$warteAufKontakte
|
||||
): void {
|
||||
IPS_RequestAction($verbraucherId, 'Maximaltemperatur', 65.0);
|
||||
$temperaturSetzen(55.0);
|
||||
$managerRegeln(-3000.0);
|
||||
$warteAufKontakte([false, false, true]);
|
||||
|
||||
IPS_Sleep(1100);
|
||||
$managerRegeln(2000.0);
|
||||
$warteAufKontakte([true, false, false]);
|
||||
});
|
||||
|
||||
$test->runCase('Zeitplan erzwingt rechtzeitiges Aufheizen wie ein Minimum', static function (
|
||||
TestContext $test
|
||||
) use (
|
||||
$verbraucherId,
|
||||
$temperaturSetzen,
|
||||
$managerRegeln,
|
||||
$warteAufKontakte
|
||||
): void {
|
||||
IPS_Sleep(1100);
|
||||
IPS_RequestAction($verbraucherId, 'Maximaltemperatur', 60.0);
|
||||
$temperaturSetzen(52.0);
|
||||
$managerRegeln(3000.0);
|
||||
$warteAufKontakte([false, false, false]);
|
||||
|
||||
IPS_SetProperty($verbraucherId, 'Zeitplan', json_encode([
|
||||
['Uhrzeit' => date('H:i', time() + 60), 'Solltemperatur' => 60],
|
||||
], JSON_THROW_ON_ERROR));
|
||||
IPS_ApplyChanges($verbraucherId);
|
||||
$warteAufKontakte([false, false, true]);
|
||||
});
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user