This commit is contained in:
@@ -74,6 +74,16 @@ return [
|
||||
'libs/Nachrichtenvertrag.php',
|
||||
],
|
||||
],
|
||||
'Waermepumpe' => [
|
||||
'file' => __DIR__ . '/modules/Waermepumpe.php',
|
||||
'paths' => [
|
||||
'Waermepumpe/*',
|
||||
'libs/WaermepumpenRegler.php',
|
||||
'libs/VerbraucherBasisTrait.php',
|
||||
'libs/VerbraucherSchnittstelle.php',
|
||||
'libs/Nachrichtenvertrag.php',
|
||||
],
|
||||
],
|
||||
'Warmwassererwaermer' => [
|
||||
'file' => __DIR__ . '/modules/Warmwassererwaermer.php',
|
||||
'paths' => [
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Belevo\EnelixEMS\SymconTest\TestContext;
|
||||
|
||||
return static function (TestContext $test): void {
|
||||
$kontakt1 = $test->createActionVariable('WP Kontakt 1');
|
||||
$kontakt2 = $test->createActionVariable('WP Kontakt 2');
|
||||
$rueckmeldung = $test->createVariable(0, 'WP läuft', false);
|
||||
$waermepumpe = $test->createInstance(
|
||||
'{A31C9274-54F7-4BD2-9804-7AF23E86C4D1}',
|
||||
'Wärmepumpe',
|
||||
[
|
||||
'Kontaktart' => 0,
|
||||
'Kontakt1VariableID' => $kontakt1,
|
||||
'Kontakt2VariableID' => $kontakt2,
|
||||
'Nennleistung' => 5000,
|
||||
'Rueckmeldungsart' => 1,
|
||||
'IstleistungVariableID' => $rueckmeldung,
|
||||
'Anlaufwartezeit' => 1,
|
||||
'Wiederholsperre' => 3,
|
||||
'Mindestlaufzeit' => 1,
|
||||
'Mindestsperrzeit' => 0,
|
||||
'MaximaleSperrzeit' => 2,
|
||||
'MaximaleSperrzeit24h' => 60,
|
||||
'VorgabeTimeout' => 30,
|
||||
'DiagnosevariablenAnzeigen' => true,
|
||||
]
|
||||
);
|
||||
|
||||
$manager = $test->createInstance(
|
||||
'{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}',
|
||||
'WP Hilfsmanager',
|
||||
[
|
||||
'AutomatischeSuche' => false,
|
||||
'VerbraucherZuordnung' => json_encode([
|
||||
['InstanzID' => $waermepumpe, 'Aktiv' => true],
|
||||
], JSON_THROW_ON_ERROR),
|
||||
]
|
||||
);
|
||||
|
||||
$senden = static function (?int $leistung, string $betriebsart) use (
|
||||
$manager,
|
||||
$waermepumpe
|
||||
): void {
|
||||
IPS_RequestAction(
|
||||
$waermepumpe,
|
||||
'ManagerdatenEmpfangen',
|
||||
json_encode([
|
||||
'Kopf' => [
|
||||
'Version' => '4.0',
|
||||
'AbsenderID' => $manager,
|
||||
'EmpfaengerID' => $waermepumpe,
|
||||
'Zeitpunkt' => time(),
|
||||
],
|
||||
'Betriebsart' => $betriebsart,
|
||||
'Sollleistung_W' => $leistung,
|
||||
], JSON_THROW_ON_ERROR)
|
||||
);
|
||||
};
|
||||
|
||||
$test->runCase('Instanz und Diagnosevariablen werden angelegt', static function (
|
||||
TestContext $test
|
||||
) use ($waermepumpe): void {
|
||||
$test->assertInstanceStatus($waermepumpe);
|
||||
foreach ([
|
||||
'Aktiv',
|
||||
'Waermepumpenzustand',
|
||||
'WaermepumpeLaeuft',
|
||||
'SperreAktiv',
|
||||
'ErhoehungAktiv',
|
||||
'SGReadyZustand',
|
||||
'Istleistung',
|
||||
'Sollleistung',
|
||||
'AnlaufAusstehend',
|
||||
'Sperrzeit24h',
|
||||
] as $ident) {
|
||||
$test->objectByIdent($ident, $waermepumpe);
|
||||
}
|
||||
});
|
||||
|
||||
$test->runCase('PV fordert Erhoehung an und bestaetigt den Anlauf', static function (
|
||||
TestContext $test
|
||||
) use ($waermepumpe, $kontakt1, $kontakt2, $rueckmeldung, $senden): void {
|
||||
IPS_RequestAction($waermepumpe, 'Aktiv', true);
|
||||
$senden(null, 'PV');
|
||||
$senden(5000, 'PV');
|
||||
$test->waitUntil(static fn (): bool => GetValue($kontakt2) === true);
|
||||
$test->assertSame(false, GetValue($kontakt1), 'Kontakt 1 muss im PV-Anlauf aus sein.');
|
||||
$test->assertSame(true, GetValue(
|
||||
$test->objectByIdent('AnlaufAusstehend', $waermepumpe)
|
||||
), 'Der PV-Anlauf muss bis zur Rueckmeldung ausstehend sein.');
|
||||
|
||||
$test->waitUntil(static fn (): bool => GetValue($kontakt2) === false, 2500);
|
||||
$test->waitUntil(static fn (): bool => GetValue(
|
||||
$test->objectByIdent('WiederholsperreAktiv', $waermepumpe)
|
||||
) === true);
|
||||
$test->assertSame(true, GetValue(
|
||||
$test->objectByIdent('WiederholsperreAktiv', $waermepumpe)
|
||||
), 'Nach dem fehlgeschlagenen Anlauf muss die Wiederholsperre aktiv sein.');
|
||||
$test->assertSame(false, GetValue(
|
||||
$test->objectByIdent('AenderungMoeglich', $waermepumpe)
|
||||
), 'Waehrend der Wiederholsperre darf keine Aenderung angeboten werden.');
|
||||
$test->waitUntil(static fn (): bool => GetValue(
|
||||
$test->objectByIdent('WiederholsperreAktiv', $waermepumpe)
|
||||
) === false, 4500);
|
||||
|
||||
$senden(5000, 'PV');
|
||||
$test->waitUntil(static fn (): bool => GetValue($kontakt2) === true);
|
||||
SetValue($rueckmeldung, true);
|
||||
$test->waitUntil(static fn (): bool => GetValue(
|
||||
$test->objectByIdent('WaermepumpeLaeuft', $waermepumpe)
|
||||
) === true);
|
||||
$test->assertSame(5000, (int) GetValue(
|
||||
$test->objectByIdent('Istleistung', $waermepumpe)
|
||||
));
|
||||
IPS_Sleep(1100);
|
||||
});
|
||||
|
||||
$test->runCase('Peak sperrt und maximale Sperrzeit erzwingt Normalbetrieb', static function (
|
||||
TestContext $test
|
||||
) use ($waermepumpe, $kontakt1, $kontakt2, $senden): void {
|
||||
$senden(null, 'Peak');
|
||||
$senden(0, 'Peak');
|
||||
$test->waitUntil(static fn (): bool => GetValue($kontakt1) === true);
|
||||
$test->assertSame(false, GetValue($kontakt2));
|
||||
$test->assertSame(true, GetValue(
|
||||
$test->objectByIdent('SperreAktiv', $waermepumpe)
|
||||
));
|
||||
|
||||
$test->waitUntil(static fn (): bool => GetValue($kontakt1) === false, 2500);
|
||||
$test->assertSame(true, GetValue(
|
||||
$test->objectByIdent('SperrerholungAktiv', $waermepumpe)
|
||||
));
|
||||
$test->assertSame(false, GetValue(
|
||||
$test->objectByIdent('SperreAktiv', $waermepumpe)
|
||||
));
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user