This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Belevo\EnelixEMS\SymconTest\TestContext;
|
||||
|
||||
return static function (TestContext $test): void {
|
||||
$pufferId = $test->createVariable(2, 'Puffertemperatur', 40.0, null, '~Temperature');
|
||||
$aussenId = $test->createVariable(2, 'Aussentemperatur', 5.0, null, '~Temperature');
|
||||
$wpSollId = $test->createVariable(2, 'WP Solltemperatur', 50.0, null, '~Temperature');
|
||||
$kontakte = [
|
||||
$test->createActionVariable('Puffer Stufe 1'),
|
||||
$test->createActionVariable('Puffer Stufe 2'),
|
||||
];
|
||||
$stufen = [
|
||||
['Stufe' => 1, 'Leistung' => 1000, 'Schaltkontakt_Stufe' => $kontakte[0]],
|
||||
['Stufe' => 2, 'Leistung' => 2000, 'Schaltkontakt_Stufe' => $kontakte[1]],
|
||||
];
|
||||
$verbraucherId = $test->createInstance(
|
||||
'{C92D5EEF-9632-47A5-9659-4B02BF40FBE9}',
|
||||
'Pufferspeicher',
|
||||
[
|
||||
'PufferfuehlerVariableID' => $pufferId,
|
||||
'AussentemperaturVariableID' => $aussenId,
|
||||
'WaermepumpenSolltemperaturVariableID' => $wpSollId,
|
||||
'LeistungsStufen' => json_encode($stufen, JSON_THROW_ON_ERROR),
|
||||
'FusspunktVorlauftemperatur' => 35.0,
|
||||
'HeizkurvenSteigung' => 1.0,
|
||||
'HeizkurveMinimaltemperatur' => 20.0,
|
||||
'HeizkurveMaximaltemperatur' => 80.0,
|
||||
'Hysterese' => 5.0,
|
||||
'LastwechselSperrzeit' => 0,
|
||||
'TemperaturMaxAlter' => 120,
|
||||
'DiagnosevariablenAnzeigen' => true,
|
||||
]
|
||||
);
|
||||
$managerId = $test->createInstance(
|
||||
'{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}',
|
||||
'Hilfsmanager Pufferspeicher',
|
||||
[
|
||||
'AutomatischeSuche' => false,
|
||||
'VerbraucherZuordnung' => json_encode([
|
||||
['InstanzID' => $verbraucherId, 'Aktiv' => true],
|
||||
], JSON_THROW_ON_ERROR),
|
||||
]
|
||||
);
|
||||
|
||||
$managerdatenSenden = static function (
|
||||
string $betriebsart,
|
||||
?int $leistung
|
||||
) use ($managerId, $verbraucherId): void {
|
||||
IPS_RequestAction($verbraucherId, 'ManagerdatenEmpfangen', json_encode([
|
||||
'Kopf' => [
|
||||
'Version' => '4.0',
|
||||
'AbsenderID' => $managerId,
|
||||
'EmpfaengerID' => $verbraucherId,
|
||||
'Zeitpunkt' => time(),
|
||||
],
|
||||
'Betriebsart' => $betriebsart,
|
||||
'Sollleistung_W' => $leistung,
|
||||
], JSON_THROW_ON_ERROR));
|
||||
};
|
||||
$kontaktzustand = static fn (): array => array_map(
|
||||
static fn (int $id): bool => (bool) GetValue($id),
|
||||
$kontakte
|
||||
);
|
||||
|
||||
$test->runCase('Instanz und Variablen werden angelegt', static function (
|
||||
TestContext $test
|
||||
) use ($verbraucherId): void {
|
||||
$test->assertInstanceStatus($verbraucherId);
|
||||
foreach ([
|
||||
'Aktiv',
|
||||
'Puffertemperatur',
|
||||
'Aussentemperatur',
|
||||
'Solltemperatur',
|
||||
'Heizbedarf',
|
||||
'Istleistung',
|
||||
'Sollleistung',
|
||||
'AktiveStufe',
|
||||
'TemperaturenGueltig',
|
||||
] as $ident) {
|
||||
$test->objectByIdent($ident, $verbraucherId);
|
||||
}
|
||||
});
|
||||
|
||||
$test->runCase('Unter der Einschaltschwelle kann PV eine Stufe schalten', static function (
|
||||
TestContext $test
|
||||
) use ($verbraucherId, $managerdatenSenden, $kontaktzustand): void {
|
||||
IPS_RequestAction($verbraucherId, 'Aktiv', true);
|
||||
$managerdatenSenden('PV', null);
|
||||
$test->assertSame(true, GetValue($test->objectByIdent('Heizbedarf', $verbraucherId)));
|
||||
|
||||
$managerdatenSenden('PV', 2000);
|
||||
$test->waitUntil(static fn (): bool => $kontaktzustand() === [false, true]);
|
||||
$test->assertSame([false, true], $kontaktzustand());
|
||||
});
|
||||
|
||||
$test->runCase('In der Hysterese und oberhalb des Sollwerts wird ausgeschaltet', static function (
|
||||
TestContext $test
|
||||
) use ($pufferId, $verbraucherId, $kontaktzustand): void {
|
||||
SetValue($pufferId, 47.0);
|
||||
IPS_RequestAction($verbraucherId, 'Melden', true);
|
||||
$test->waitUntil(static fn (): bool => $kontaktzustand() === [false, false]);
|
||||
$test->assertSame(false, GetValue($test->objectByIdent('Heizbedarf', $verbraucherId)));
|
||||
|
||||
SetValue($pufferId, 55.0);
|
||||
IPS_RequestAction($verbraucherId, 'Melden', true);
|
||||
$test->assertSame([false, false], $kontaktzustand());
|
||||
});
|
||||
|
||||
$test->runCase('Peakbetrieb sperrt den Pufferspeicher unabhaengig von der Temperatur', static function (
|
||||
TestContext $test
|
||||
) use ($pufferId, $verbraucherId, $managerdatenSenden, $kontaktzustand): void {
|
||||
SetValue($pufferId, 20.0);
|
||||
$managerdatenSenden('Peak', null);
|
||||
$test->assertSame(false, GetValue($test->objectByIdent('Heizbedarf', $verbraucherId)));
|
||||
$test->waitUntil(static fn (): bool => $kontaktzustand() === [false, false]);
|
||||
|
||||
$abgewiesen = false;
|
||||
try {
|
||||
$managerdatenSenden('Peak', 1000);
|
||||
} catch (Throwable $fehler) {
|
||||
$abgewiesen = true;
|
||||
}
|
||||
if (!$abgewiesen) {
|
||||
$abgewiesen = GetValue($test->objectByIdent('SollwertGueltig', $verbraucherId)) !== true
|
||||
|| GetValue($test->objectByIdent('Sollleistung', $verbraucherId)) !== 1000;
|
||||
}
|
||||
$test->assertSame(true, $abgewiesen, 'Peak darf keine Heizstufe anbieten.');
|
||||
$test->assertSame([false, false], $kontaktzustand());
|
||||
});
|
||||
|
||||
$test->runCase('Lokales Ausschalten schaltet jede Stufe aus', static function (
|
||||
TestContext $test
|
||||
) use ($verbraucherId, $kontaktzustand): void {
|
||||
IPS_RequestAction($verbraucherId, 'Aktiv', false);
|
||||
$test->waitUntil(static fn (): bool => $kontaktzustand() === [false, false]);
|
||||
$test->assertSame([false, false], $kontaktzustand());
|
||||
});
|
||||
|
||||
$test->runCase('WP-Button kalibriert den Heizkurven-Fusspunkt', static function (
|
||||
TestContext $test
|
||||
) use ($verbraucherId): void {
|
||||
IPS_SetProperty($verbraucherId, 'FusspunktVorlauftemperatur', 30.0);
|
||||
IPS_ApplyChanges($verbraucherId);
|
||||
IPS_RequestAction($verbraucherId, 'HeizkurveVonWaermepumpeUebernehmen', 0);
|
||||
|
||||
$test->assertEquals(
|
||||
35.0,
|
||||
(float) IPS_GetProperty($verbraucherId, 'FusspunktVorlauftemperatur'),
|
||||
0.001
|
||||
);
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user