createVariable(2, 'Puffertemperatur', 40.0, null, '~Temperature'); $aussenId = $test->createVariable(2, 'Aussentemperatur', 5.0, null, '~Temperature'); $wpSollId = $test->createVariable(2, 'WP Solltemperatur', 50.0, null, '~Temperature'); $kontakte = [ $test->createActionVariable('Puffer Stufe 1'), $test->createActionVariable('Puffer Stufe 2'), ]; $stufen = [ ['Stufe' => 1, 'Leistung' => 1000, 'Schaltkontakt_Stufe' => $kontakte[0]], ['Stufe' => 2, 'Leistung' => 2000, 'Schaltkontakt_Stufe' => $kontakte[1]], ]; $verbraucherId = $test->createInstance( '{C92D5EEF-9632-47A5-9659-4B02BF40FBE9}', 'Pufferspeicher', [ 'PufferfuehlerVariableID' => $pufferId, 'AussentemperaturVariableID' => $aussenId, 'WaermepumpenSolltemperaturVariableID' => $wpSollId, 'LeistungsStufen' => json_encode($stufen, JSON_THROW_ON_ERROR), 'FusspunktVorlauftemperatur' => 35.0, 'HeizkurvenSteigung' => 1.0, 'HeizkurveMinimaltemperatur' => 20.0, 'HeizkurveMaximaltemperatur' => 80.0, 'Hysterese' => 5.0, 'LastwechselSperrzeit' => 0, 'TemperaturMaxAlter' => 120, 'DiagnosevariablenAnzeigen' => true, ] ); $managerId = $test->createInstance( '{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}', 'Hilfsmanager Pufferspeicher', [ 'AutomatischeSuche' => false, 'VerbraucherZuordnung' => json_encode([ ['InstanzID' => $verbraucherId, 'Aktiv' => true], ], JSON_THROW_ON_ERROR), ] ); $managerdatenSenden = static function ( string $betriebsart, ?int $leistung ) use ($managerId, $verbraucherId): void { IPS_RequestAction($verbraucherId, 'ManagerdatenEmpfangen', json_encode([ 'Kopf' => [ 'Version' => '4.0', 'AbsenderID' => $managerId, 'EmpfaengerID' => $verbraucherId, 'Zeitpunkt' => time(), ], 'Betriebsart' => $betriebsart, 'Sollleistung_W' => $leistung, ], JSON_THROW_ON_ERROR)); }; $kontaktzustand = static fn (): array => array_map( static fn (int $id): bool => (bool) GetValue($id), $kontakte ); $test->runCase('Instanz und Variablen werden angelegt', static function ( TestContext $test ) use ($verbraucherId): void { $test->assertInstanceStatus($verbraucherId); foreach ([ 'Aktiv', 'Puffertemperatur', 'Aussentemperatur', 'Solltemperatur', 'Heizbedarf', 'Istleistung', 'Sollleistung', 'AktiveStufe', 'TemperaturenGueltig', ] as $ident) { $test->objectByIdent($ident, $verbraucherId); } }); $test->runCase('Unter der Einschaltschwelle kann PV eine Stufe schalten', static function ( TestContext $test ) use ($verbraucherId, $managerdatenSenden, $kontaktzustand): void { IPS_RequestAction($verbraucherId, 'Aktiv', true); $managerdatenSenden('PV', null); $test->assertSame(true, GetValue($test->objectByIdent('Heizbedarf', $verbraucherId))); $managerdatenSenden('PV', 2000); $test->waitUntil(static fn (): bool => $kontaktzustand() === [false, true]); $test->assertSame([false, true], $kontaktzustand()); }); $test->runCase('In der Hysterese und oberhalb des Sollwerts wird ausgeschaltet', static function ( TestContext $test ) use ($pufferId, $verbraucherId, $kontaktzustand): void { SetValue($pufferId, 47.0); IPS_RequestAction($verbraucherId, 'Melden', true); $test->waitUntil(static fn (): bool => $kontaktzustand() === [false, false]); $test->assertSame(false, GetValue($test->objectByIdent('Heizbedarf', $verbraucherId))); SetValue($pufferId, 55.0); $test->assertSame(0, GetValue($test->objectByIdent('Sollleistung', $verbraucherId))); IPS_RequestAction($verbraucherId, 'Melden', true); $test->assertSame([false, false], $kontaktzustand()); }); $test->runCase('Peakbetrieb sperrt den Pufferspeicher unabhaengig von der Temperatur', static function ( TestContext $test ) use ($pufferId, $verbraucherId, $managerdatenSenden, $kontaktzustand): void { SetValue($pufferId, 20.0); $managerdatenSenden('Peak', null); $test->assertSame(false, GetValue($test->objectByIdent('Heizbedarf', $verbraucherId))); $test->waitUntil(static fn (): bool => $kontaktzustand() === [false, false]); $abgewiesen = false; try { $managerdatenSenden('Peak', 1000); } catch (Throwable $fehler) { $abgewiesen = true; } if (!$abgewiesen) { $abgewiesen = GetValue($test->objectByIdent('SollwertGueltig', $verbraucherId)) !== true || GetValue($test->objectByIdent('Sollleistung', $verbraucherId)) !== 1000; } $test->assertSame(true, $abgewiesen, 'Peak darf keine Heizstufe anbieten.'); $test->assertSame([false, false], $kontaktzustand()); }); $test->runCase('Lokales Ausschalten schaltet jede Stufe aus', static function ( TestContext $test ) use ($verbraucherId, $kontaktzustand): void { IPS_RequestAction($verbraucherId, 'Aktiv', false); $test->waitUntil(static fn (): bool => $kontaktzustand() === [false, false]); $test->assertSame([false, false], $kontaktzustand()); }); $test->runCase('WP-Button kalibriert den Heizkurven-Fusspunkt', static function ( TestContext $test ) use ($verbraucherId): void { IPS_SetProperty($verbraucherId, 'FusspunktVorlauftemperatur', 30.0); IPS_ApplyChanges($verbraucherId); IPS_RequestAction($verbraucherId, 'HeizkurveVonWaermepumpeUebernehmen', 0); $test->assertEquals( 35.0, (float) IPS_GetProperty($verbraucherId, 'FusspunktVorlauftemperatur'), 0.001 ); }); };