258 lines
8.9 KiB
PHP
258 lines
8.9 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,
|
|
'TemperaturUntergrenze' => 0.0,
|
|
'TemperaturObergrenze' => 100.0,
|
|
'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);
|
|
};
|
|
|
|
$test->runCase('Temperaturgrenzen melden Unter- und Uebertemperatur', static function (
|
|
TestContext $test
|
|
) use ($verbraucherId, $temperaturSetzen): void {
|
|
$stoertextId = $test->objectByIdent('Stoertext', $verbraucherId);
|
|
|
|
$temperaturSetzen(100.0);
|
|
$test->assertTrue(!str_contains((string) GetValue($stoertextId), 'Uebertemperatur'));
|
|
$temperaturSetzen(100.1);
|
|
$test->assertTrue(str_contains((string) GetValue($stoertextId), 'Uebertemperatur'));
|
|
|
|
$temperaturSetzen(0.0);
|
|
$test->assertTrue(!str_contains((string) GetValue($stoertextId), 'Untertemperatur'));
|
|
$temperaturSetzen(-0.1);
|
|
$test->assertTrue(str_contains((string) GetValue($stoertextId), 'Untertemperatur'));
|
|
|
|
$temperaturSetzen(52.0);
|
|
});
|
|
|
|
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]);
|
|
});
|
|
};
|