createVariable(2, 'Boilertemperatur', 52.0, null, '~Temperature'); $netzleistungId = $test->createVariable(2, 'Netzleistung', 0.0); $kontakte = [ $test->createActionVariable('Heizstufe 1'), $test->createActionVariable('Heizstufe 2'), $test->createActionVariable('Heizstufe 3'), ]; $stufen = []; foreach ($kontakte as $index => $kontaktId) { $stufen[] = [ 'Stufe' => $index + 1, 'Leistung' => ($index + 1) * 1000, 'Schaltkontakt_Stufe' => $kontaktId, ]; } $verbraucherId = $test->createInstance( '{B7C54AF4-AD7D-4FE4-B75D-203693906251}', 'Wassererwärmer', [ 'Boilerfuehler_PT1' => $temperaturId, 'Boilervolumen' => 300, 'LeistungsStufen' => json_encode($stufen, JSON_THROW_ON_ERROR), 'LastwechselSperrzeit' => 1, 'Hysterese' => 5.0, 'TemperaturMaxAlter' => 120, 'LegionellenfunktionAktiv' => true, 'LegionellenMinimalintervallTage' => 4, 'LegionellenMaximalintervallTage' => 7, 'EinstellungenInVisu' => true, 'DiagnosevariablenAnzeigen' => true, ] ); $lizenzcode = trim((string) getenv('ENELIX_TEST_LICENSE_CODE')); $managerId = $test->createInstance( '{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}', 'Hilfsmanager', [ 'NetzleistungVariableID' => $netzleistungId, 'Lizenzcode' => $lizenzcode, 'AutomatischeSuche' => false, 'VerbraucherZuordnung' => json_encode([ ['InstanzID' => $verbraucherId, 'Aktiv' => true], ], JSON_THROW_ON_ERROR), 'Lastspitzenmodus' => 1, 'Lastspitzengrenze' => 0.0, 'SollwertSolarladen' => 0.0, 'Umschaltdifferenz' => 0.0, 'KeepAlive' => 5, 'DiagnosevariablenAnzeigen' => true, ] ); $kontaktzustand = static fn (): array => array_map( static fn (int $id): bool => (bool) GetValue($id), $kontakte ); $warteAufKontakte = static function (array $erwartet) use ( $test, $kontaktzustand ): void { $test->waitUntil( static fn (): bool => $kontaktzustand() === $erwartet, 4000, 50 ); $test->assertSame($erwartet, $kontaktzustand()); }; $temperaturSetzen = static function (float $wert) use ( $temperaturId, $verbraucherId ): void { SetValue($temperaturId, $wert); IPS_RequestAction($verbraucherId, 'Melden', true); }; $managerRegeln = static function (float $netzleistung) use ( $netzleistungId, $verbraucherId, $managerId ): void { SetValue($netzleistungId, $netzleistung); IPS_RequestAction($verbraucherId, 'Melden', true); IPS_RequestAction($managerId, 'Regeln', true); }; if ($lizenzcode === '') { $test->runCase('Manager bleibt ohne Lizenz sicher gesperrt', static function ( TestContext $test ) use ($verbraucherId, $managerId): void { $test->assertInstanceStatus($verbraucherId); $test->assertInstanceStatus($managerId, 203); }); return; } $test->runCase('Instanzen und Diagnosevariablen werden angelegt', static function ( TestContext $test ) use ($verbraucherId, $managerId): void { $test->assertInstanceStatus($verbraucherId); $test->assertInstanceStatus($managerId); foreach ([ 'Aktiv', 'Boilertemperatur', 'Mindesttemperatur', 'Maximaltemperatur', 'Legionellentemperatur', 'Istleistung', 'Sollleistung', 'AktiveStufe', 'TemperaturGueltig', 'NachladenAktiv', 'LegionellenbetriebAktiv', ] as $ident) { $test->objectByIdent($ident, $verbraucherId); } }); $test->runCase('Temperaturmessung und Verbraucher werden aktiviert', static function ( TestContext $test ) use ($verbraucherId, $managerId): void { IPS_RequestAction($verbraucherId, 'Aktiv', true); IPS_RequestAction($managerId, 'Aktiv', true); IPS_RequestAction($verbraucherId, 'Melden', true); $test->assertEquals( 52.0, (float) GetValue($test->objectByIdent('Boilertemperatur', $verbraucherId)), 0.01 ); $test->assertSame( true, GetValue($test->objectByIdent('TemperaturGueltig', $verbraucherId)) ); }); $test->runCase('Unter Minimum erzwingt PV das Maximum und Peak bietet alle Stufen', static function ( TestContext $test ) use ( $temperaturSetzen, $managerRegeln, $warteAufKontakte, $managerId ): void { $temperaturSetzen(44.0); $managerRegeln(-3000.0); $warteAufKontakte([false, false, true]); $test->assertSame('PV', GetValue($test->objectByIdent('Betriebsart', $managerId))); IPS_Sleep(1100); $managerRegeln(1000.0); $warteAufKontakte([false, true, false]); $test->assertSame('Peak', GetValue($test->objectByIdent('Betriebsart', $managerId))); IPS_Sleep(1100); $temperaturSetzen(47.0); $managerRegeln(1000.0); $warteAufKontakte([true, false, false]); IPS_Sleep(1100); $temperaturSetzen(50.0); $managerRegeln(1000.0); $warteAufKontakte([false, false, false]); }); $test->runCase('Zwischen Minimum und Maximum wählt PV Stufen und Peak null', static function ( TestContext $test ) use ($temperaturSetzen, $managerRegeln, $warteAufKontakte): void { IPS_Sleep(1100); $temperaturSetzen(52.0); $managerRegeln(-3000.0); $warteAufKontakte([false, false, true]); IPS_Sleep(1100); $managerRegeln(3000.0); $warteAufKontakte([false, false, false]); }); $test->runCase('Maximum sperrt bis unter die obere Hysterese', static function ( TestContext $test ) use ($temperaturSetzen, $managerRegeln, $warteAufKontakte): void { $temperaturSetzen(60.0); $managerRegeln(-3000.0); $warteAufKontakte([false, false, false]); $temperaturSetzen(58.0); $managerRegeln(-3000.0); $warteAufKontakte([false, false, false]); $temperaturSetzen(54.9); $managerRegeln(-3000.0); $warteAufKontakte([false, false, true]); }); $test->runCase('Erhöhtes Maximalziel bleibt im freien Peakbetrieb gesperrt', static function ( TestContext $test ) use ( $verbraucherId, $temperaturSetzen, $managerRegeln, $warteAufKontakte ): void { IPS_RequestAction($verbraucherId, 'Maximaltemperatur', 65.0); $temperaturSetzen(55.0); $managerRegeln(-3000.0); $warteAufKontakte([false, false, true]); IPS_Sleep(1100); $managerRegeln(2000.0); $warteAufKontakte([false, false, false]); }); $test->runCase('Zeitplan bietet in Peak alle Stufen und erzwingt in PV das Maximum', static function ( TestContext $test ) use ( $verbraucherId, $temperaturSetzen, $managerRegeln, $warteAufKontakte ): void { IPS_Sleep(1100); IPS_RequestAction($verbraucherId, 'Maximaltemperatur', 60.0); $temperaturSetzen(52.0); $managerRegeln(3000.0); $warteAufKontakte([false, false, false]); IPS_SetProperty($verbraucherId, 'Zeitplan', json_encode([ ['Uhrzeit' => date('H:i', time() + 60), 'Solltemperatur' => 60], ], JSON_THROW_ON_ERROR)); IPS_ApplyChanges($verbraucherId); $test->assertSame(true, GetValue( $test->objectByIdent('AenderungMoeglich', $verbraucherId) )); $warteAufKontakte([false, false, false]); $managerRegeln(-3000.0); $warteAufKontakte([false, false, true]); }); };