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); }); };