Files
Enelix-EMS/tests/Symcon/modules/Warmwassererwaermer.php
T
2026-09-21 18:46:17 +00:00

238 lines
8.0 KiB
PHP

<?php
declare(strict_types=1);
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'),
$test->createActionVariable('Heizstufe 3'),
];
$stufen = [];
foreach ($kontakte as $index => $kontaktId) {
$stufen[] = [
'Stufe' => $index + 1,
'Leistung' => ($index + 1) * 1000,
'Schaltkontakt_Stufe' => $kontaktId,
];
}
$verbraucherId = $test->createInstance(
'{B7C54AF4-AD7D-4FE4-B75D-203693906251}',
'Wassererwärmer',
[
'Boilerfuehler_PT1' => $temperaturId,
'Boilervolumen' => 300,
'LeistungsStufen' => json_encode($stufen, JSON_THROW_ON_ERROR),
'LastwechselSperrzeit' => 1,
'Hysterese' => 5.0,
'TemperaturMaxAlter' => 120,
'LegionellenfunktionAktiv' => true,
'LegionellenMinimalintervallTage' => 4,
'LegionellenMaximalintervallTage' => 7,
'EinstellungenInVisu' => true,
'DiagnosevariablenAnzeigen' => true,
]
);
$lizenzcode = trim((string) getenv('ENELIX_TEST_LICENSE_CODE'));
$managerId = $test->createInstance(
'{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}',
'Hilfsmanager',
[
'NetzleistungVariableID' => $netzleistungId,
'Lizenzcode' => $lizenzcode,
'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,
]
);
$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);
};
if ($lizenzcode === '') {
$test->runCase('Manager bleibt ohne Lizenz sicher gesperrt', static function (
TestContext $test
) use ($verbraucherId, $managerId): void {
$test->assertInstanceStatus($verbraucherId);
$test->assertInstanceStatus($managerId, 203);
});
return;
}
$test->runCase('Instanzen und Diagnosevariablen werden angelegt', static function (
TestContext $test
) use ($verbraucherId, $managerId): void {
$test->assertInstanceStatus($verbraucherId);
$test->assertInstanceStatus($managerId);
foreach ([
'Aktiv', 'Boilertemperatur', 'Mindesttemperatur', 'Maximaltemperatur',
'Legionellentemperatur', 'Istleistung', 'Sollleistung', 'AktiveStufe',
'TemperaturGueltig', 'NachladenAktiv', 'LegionellenbetriebAktiv',
] as $ident) {
$test->objectByIdent($ident, $verbraucherId);
}
});
$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);
$test->assertEquals(
52.0,
(float) GetValue($test->objectByIdent('Boilertemperatur', $verbraucherId)),
0.01
);
$test->assertSame(
true,
GetValue($test->objectByIdent('TemperaturGueltig', $verbraucherId))
);
});
$test->runCase('Unter Minimum erzwingt PV das Maximum und Peak bietet alle Stufen', static function (
TestContext $test
) use (
$temperaturSetzen,
$managerRegeln,
$warteAufKontakte,
$managerId
): void {
$temperaturSetzen(44.0);
$managerRegeln(-3000.0);
$warteAufKontakte([false, false, true]);
$test->assertSame('PV', GetValue($test->objectByIdent('Betriebsart', $managerId)));
IPS_Sleep(1100);
$managerRegeln(1000.0);
$warteAufKontakte([false, true, false]);
$test->assertSame('Peak', GetValue($test->objectByIdent('Betriebsart', $managerId)));
IPS_Sleep(1100);
$temperaturSetzen(47.0);
$managerRegeln(1000.0);
$warteAufKontakte([true, false, false]);
IPS_Sleep(1100);
$temperaturSetzen(50.0);
$managerRegeln(1000.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(54.9);
$managerRegeln(-3000.0);
$warteAufKontakte([false, false, true]);
});
$test->runCase('Erhöhtes Maximalziel bleibt im freien Peakbetrieb gesperrt', 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([false, false, false]);
});
$test->runCase('Zeitplan bietet in Peak alle Stufen und erzwingt in PV das Maximum', 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);
$test->assertSame(true, GetValue(
$test->objectByIdent('AenderungMoeglich', $verbraucherId)
));
$warteAufKontakte([false, false, false]);
$managerRegeln(-3000.0);
$warteAufKontakte([false, false, true]);
});
};