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