192 lines
6.5 KiB
PHP
192 lines
6.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use Belevo\EnelixEMS\SymconTest\TestContext;
|
|
|
|
return static function (TestContext $test): void {
|
|
$kontaktId = $test->createActionVariable('Schaltkontakt');
|
|
$rueckmeldungId = $test->createVariable(0, 'Rückmeldung', false);
|
|
$verbraucherId = $test->createInstance(
|
|
'{15879A4E-D0C2-4495-83DE-46E1E462591E}',
|
|
'Verbraucher 1-Stufig',
|
|
[
|
|
'Nennleistung' => 1200,
|
|
'SchaltkontaktVariableID' => $kontaktId,
|
|
'RueckmeldungVariableID' => $rueckmeldungId,
|
|
'Mindestlaufzeit' => 0,
|
|
'Mindesteinschaltdauer' => 2,
|
|
'Mindestausschaltdauer' => 2,
|
|
'VorgabeTimeout' => 30,
|
|
'DiagnosevariablenAnzeigen' => true,
|
|
]
|
|
);
|
|
$managerId = $test->createInstance(
|
|
'{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}',
|
|
'Hilfsmanager',
|
|
[
|
|
'AutomatischeSuche' => false,
|
|
'VerbraucherZuordnung' => json_encode([
|
|
['InstanzID' => $verbraucherId, 'Aktiv' => true],
|
|
], JSON_THROW_ON_ERROR),
|
|
]
|
|
);
|
|
|
|
$anforderungSenden = static function (int $leistung) use (
|
|
$managerId,
|
|
$verbraucherId
|
|
): void {
|
|
$paket = [
|
|
'Kopf' => [
|
|
'Version' => '3.0',
|
|
'AbsenderID' => $managerId,
|
|
'EmpfaengerID' => $verbraucherId,
|
|
'Zeitpunkt' => time(),
|
|
],
|
|
'Sollleistung_W' => $leistung,
|
|
];
|
|
IPS_RequestAction(
|
|
$verbraucherId,
|
|
'ManagerdatenEmpfangen',
|
|
json_encode($paket, JSON_THROW_ON_ERROR)
|
|
);
|
|
};
|
|
$test->runCase('Instanz und Diagnosevariablen werden angelegt', static function (
|
|
TestContext $test
|
|
) use ($verbraucherId): void {
|
|
$test->assertInstanceStatus($verbraucherId);
|
|
foreach ([
|
|
'Aktiv', 'Schaltzustand', 'Tageslaufzeit', 'Istleistung', 'Sollleistung',
|
|
'AenderungMoeglich', 'Rueckmeldefehler', 'SchaltbefehlAusstehend',
|
|
'RestMindestzeit',
|
|
] as $ident) {
|
|
$test->objectByIdent($ident, $verbraucherId);
|
|
}
|
|
});
|
|
|
|
$test->runCase('Nur angebotene Leistungsanforderungen werden angenommen', static function (
|
|
TestContext $test
|
|
) use (
|
|
$verbraucherId,
|
|
$kontaktId,
|
|
$rueckmeldungId,
|
|
$anforderungSenden
|
|
): void {
|
|
IPS_RequestAction($verbraucherId, 'Aktiv', true);
|
|
IPS_Sleep(2100);
|
|
|
|
$anforderungSenden(600);
|
|
$test->assertSame(false, GetValue($kontaktId));
|
|
$test->assertSame(
|
|
0,
|
|
(int) GetValue($test->objectByIdent('Sollleistung', $verbraucherId))
|
|
);
|
|
$anforderungSenden(1200);
|
|
$test->waitUntil(static fn (): bool => GetValue($kontaktId) === true);
|
|
$test->assertSame(false, GetValue(
|
|
$test->objectByIdent('Schaltzustand', $verbraucherId)
|
|
));
|
|
$test->assertSame(true, GetValue(
|
|
$test->objectByIdent('SchaltbefehlAusstehend', $verbraucherId)
|
|
));
|
|
|
|
SetValue($rueckmeldungId, true);
|
|
$test->waitUntil(static fn (): bool => GetValue(
|
|
$test->objectByIdent('Schaltzustand', $verbraucherId)
|
|
) === true);
|
|
$test->assertSame(
|
|
1200,
|
|
(int) round((float) GetValue($test->objectByIdent('Istleistung', $verbraucherId)))
|
|
);
|
|
});
|
|
|
|
$test->runCase('Mindesteinschaltdauer verhindert zu frühes Ausschalten', static function (
|
|
TestContext $test
|
|
) use (
|
|
$verbraucherId,
|
|
$kontaktId,
|
|
$rueckmeldungId,
|
|
$anforderungSenden
|
|
): void {
|
|
$anforderungSenden(0);
|
|
$test->assertSame(true, GetValue($kontaktId));
|
|
$test->assertTrue(
|
|
(int) GetValue($test->objectByIdent('RestMindestzeit', $verbraucherId)) > 0
|
|
);
|
|
|
|
IPS_Sleep(2100);
|
|
$anforderungSenden(0);
|
|
$test->waitUntil(static fn (): bool => GetValue($kontaktId) === false);
|
|
$test->assertSame(true, GetValue(
|
|
$test->objectByIdent('SchaltbefehlAusstehend', $verbraucherId)
|
|
));
|
|
|
|
SetValue($rueckmeldungId, false);
|
|
$test->waitUntil(static fn (): bool => GetValue(
|
|
$test->objectByIdent('Schaltzustand', $verbraucherId)
|
|
) === false);
|
|
});
|
|
|
|
$test->runCase('Mindestausschaltdauer verhindert zu frühes Einschalten', static function (
|
|
TestContext $test
|
|
) use (
|
|
$kontaktId,
|
|
$rueckmeldungId,
|
|
$anforderungSenden
|
|
): void {
|
|
$anforderungSenden(1200);
|
|
$test->assertSame(false, GetValue($kontaktId));
|
|
|
|
IPS_Sleep(2100);
|
|
$anforderungSenden(1200);
|
|
$test->waitUntil(static fn (): bool => GetValue($kontaktId) === true);
|
|
SetValue($rueckmeldungId, true);
|
|
});
|
|
|
|
$test->runCase('Tägliche Mindestlaufzeit wird spätestens rechtzeitig erzwungen', static function (
|
|
TestContext $test
|
|
) use (
|
|
$verbraucherId,
|
|
$kontaktId,
|
|
$rueckmeldungId,
|
|
$anforderungSenden
|
|
): void {
|
|
IPS_Sleep(2100);
|
|
$anforderungSenden(0);
|
|
$test->waitUntil(static fn (): bool => GetValue($kontaktId) === false);
|
|
SetValue($rueckmeldungId, false);
|
|
|
|
IPS_SetProperty($verbraucherId, 'Mindestlaufzeit', 86400);
|
|
IPS_ApplyChanges($verbraucherId);
|
|
$test->waitUntil(static fn (): bool => GetValue($kontaktId) === true);
|
|
$test->assertSame(1200, (int) GetValue(
|
|
$test->objectByIdent('Sollleistung', $verbraucherId)
|
|
));
|
|
SetValue($rueckmeldungId, true);
|
|
|
|
IPS_SetProperty($verbraucherId, 'Mindestlaufzeit', 0);
|
|
IPS_ApplyChanges($verbraucherId);
|
|
});
|
|
|
|
$test->runCase('Physische Rückmeldung bestätigt und überwacht den Zustand', static function (
|
|
TestContext $test
|
|
) use ($verbraucherId, $kontaktId, $rueckmeldungId): void {
|
|
$test->assertSame(true, GetValue($kontaktId));
|
|
SetValue($rueckmeldungId, false);
|
|
IPS_RequestAction($verbraucherId, 'Melden', true);
|
|
$test->waitUntil(static fn (): bool => GetValue(
|
|
$test->objectByIdent('Rueckmeldefehler', $verbraucherId)
|
|
) === true);
|
|
$test->assertSame(true, GetValue(
|
|
$test->objectByIdent('Stoerung', $verbraucherId)
|
|
));
|
|
|
|
SetValue($rueckmeldungId, true);
|
|
IPS_RequestAction($verbraucherId, 'Melden', true);
|
|
$test->waitUntil(static fn (): bool => GetValue(
|
|
$test->objectByIdent('Rueckmeldefehler', $verbraucherId)
|
|
) === false);
|
|
$test->assertInstanceStatus($verbraucherId);
|
|
});
|
|
};
|