Erweitere explizite EMS-Modultests
Tests / test (push) Successful in 42s

This commit is contained in:
dh
2026-09-17 14:07:52 +00:00
parent abd8c7edeb
commit 7cf67d4392
5 changed files with 462 additions and 147 deletions
+164 -74
View File
@@ -16,6 +16,7 @@ return static function (TestContext $test): void {
'Mindesteinschaltdauer' => 0,
'Mindestausschaltdauer' => 0,
'PrioritaetPV' => 0,
'PrioritaetPeak' => 0,
'DiagnosevariablenAnzeigen' => true,
]
);
@@ -38,106 +39,195 @@ return static function (TestContext $test): void {
'LastwechselSperrzeit' => 1,
'LegionellenfunktionAktiv' => false,
'PrioritaetPV' => 1,
'PrioritaetPeak' => 1,
'DiagnosevariablenAnzeigen' => true,
]
);
$zuordnung = [
['InstanzID' => $einStufigId, 'Aktiv' => true],
['InstanzID' => $warmwasserId, 'Aktiv' => true],
];
$managerId = $test->createInstance(
'{6F771B18-59D4-4C8A-B951-3B2FE9F6A2C4}',
'Manager',
[
'NetzleistungVariableID' => $netzleistungId,
'AutomatischeSuche' => false,
'VerbraucherZuordnung' => '[]',
'DiagnosevariablenAnzeigen' => true,
'VerbraucherZuordnung' => json_encode($zuordnung, JSON_THROW_ON_ERROR),
'KeepAlive' => 30,
'VerbraucherTimeout' => 10,
'Lastspitzenmodus' => 1,
'Lastspitzengrenze' => 0.0,
'SollwertSolarladen' => 0.0,
'Umschaltdifferenz' => 0.0,
'DiagnosevariablenAnzeigen' => true,
]
);
$setAssignment = static function (array $ids) use ($test, $managerId): void {
$assignment = array_map(
static fn (int $id): array => ['InstanzID' => $id, 'Aktiv' => true],
$ids
);
$test->configureInstance($managerId, [
'VerbraucherZuordnung' => json_encode($assignment, JSON_THROW_ON_ERROR),
]);
};
$reportConsumers = static function (array $ids): void {
foreach ($ids as $id) {
IPS_RequestAction($id, 'Aktiv', true);
IPS_RequestAction($id, 'Melden', true);
$melden = static function () use ($einStufigId, $warmwasserId): void {
foreach ([$einStufigId, $warmwasserId] as $instanzId) {
IPS_RequestAction($instanzId, 'Aktiv', true);
IPS_RequestAction($instanzId, 'Melden', true);
}
};
$test->runCase('Manager funktioniert ohne Verbraucher', static function (TestContext $test) use (
$regeln = static function (float $netzleistung) use (
$netzleistungId,
$managerId,
$einStufigId,
$warmwasserId
): void {
IPS_RequestAction($einStufigId, 'Melden', true);
IPS_RequestAction($warmwasserId, 'Melden', true);
SetValue($netzleistungId, $netzleistung);
IPS_RequestAction($managerId, 'Regeln', true);
};
$kontaktzustand = static fn (): array => [
(bool) GetValue($einKontaktId),
(bool) GetValue($warmKontakte[0]),
(bool) GetValue($warmKontakte[1]),
];
$warteAufKontakte = static function (array $erwartet, string $schritt) use (
$test,
$kontaktzustand,
$managerId
): void {
IPS_RequestAction($managerId, 'Aktiv', true);
IPS_RequestAction($managerId, 'Regeln', true);
$test->assertInstanceStatus($managerId);
$test->assertSame('PV', GetValue($test->objectByIdent('Betriebsart', $managerId)));
});
$deadline = microtime(true) + 5.0;
do {
if ($kontaktzustand() === $erwartet) {
return;
}
IPS_Sleep(50);
} while (microtime(true) < $deadline);
$test->runCase('Manager steuert Verbraucher 1-Stufig', static function (TestContext $test) use (
$setAssignment,
$reportConsumers,
$netzleistungId,
$managerId,
$einStufigId,
$einKontaktId
): void {
$setAssignment([$einStufigId]);
SetValue($netzleistungId, -1000.0);
$reportConsumers([$einStufigId]);
IPS_RequestAction($managerId, 'Regeln', true);
$test->waitUntil(static fn (): bool => GetValue($einKontaktId) === true);
$test->assertSame(true, GetValue($einKontaktId));
});
$test->runCase('Manager steuert Wassererwärmer', static function (TestContext $test) use (
$setAssignment,
$reportConsumers,
$netzleistungId,
$managerId,
$warmwasserId,
$warmKontakte
): void {
$setAssignment([$warmwasserId]);
SetValue($netzleistungId, -2000.0);
$reportConsumers([$warmwasserId]);
IPS_RequestAction($managerId, 'Regeln', true);
$test->waitUntil(static fn (): bool => GetValue($warmKontakte[1]) === true);
$test->assertSame([false, true], array_map(
static fn (int $id): bool => (bool) GetValue($id),
$warmKontakte
$test->fail(sprintf(
'%s: Kontaktbild %s statt %s; Betriebsart %s; Verteilbudget %.0f W.',
$schritt,
json_encode($kontaktzustand(), JSON_THROW_ON_ERROR),
json_encode($erwartet, JSON_THROW_ON_ERROR),
(string) GetValue($test->objectByIdent('Betriebsart', $managerId)),
(float) GetValue($test->objectByIdent('Verteilbudget', $managerId))
));
});
};
$verbraucherstatus = static function () use ($test, $managerId): array {
$json = (string) GetValue($test->objectByIdent('Verbraucherstatus', $managerId));
$daten = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
$test->runCase('Manager steuert beide Verbrauchertypen gemeinsam', static function (
return is_array($daten) ? $daten : [];
};
$zustandswert = static function (array $daten, int $instanzId, string $kennung) {
foreach ($daten['Verbraucher'] ?? [] as $verbraucher) {
if (($verbraucher['InstanzID'] ?? 0) !== $instanzId) {
continue;
}
foreach ($verbraucher['Daten']['Zustand'] ?? [] as $zustand) {
if (($zustand['Kennung'] ?? '') === $kennung) {
return $zustand['Wert'] ?? null;
}
}
}
return null;
};
$test->runCase('Manager und alle vorhandenen Verbrauchertypen sind verknüpft', static function (
TestContext $test
) use (
$setAssignment,
$reportConsumers,
$netzleistungId,
$managerId,
$einStufigId,
$warmwasserId,
$einKontaktId,
$warmKontakte
): void {
$setAssignment([$einStufigId, $warmwasserId]);
SetValue($netzleistungId, -3000.0);
$reportConsumers([$einStufigId, $warmwasserId]);
) use ($managerId, $einStufigId, $warmwasserId, $melden): void {
IPS_RequestAction($managerId, 'Aktiv', true);
$melden();
IPS_RequestAction($managerId, 'Regeln', true);
$test->waitUntil(static fn (): bool => (
GetValue($einKontaktId) === true && GetValue($warmKontakte[1]) === true
));
foreach ([$managerId, $einStufigId, $warmwasserId] as $instanzId) {
$test->assertInstanceStatus($instanzId);
}
$test->assertSame(
2,
GetValue($test->objectByIdent('VerbraucherAnzahl', $managerId))
);
$test->assertSame(true, GetValue($einKontaktId));
$test->assertSame(true, GetValue($warmKontakte[1]));
$test->assertSame(
2,
GetValue($test->objectByIdent('VerbraucherVerfuegbar', $managerId))
);
});
$test->runCase('Netzleistung wird in beide Richtungen in PV und Peak geregelt', static function (
TestContext $test
) use ($managerId, $regeln, $warteAufKontakte): void {
$regeln(-3000.0);
$warteAufKontakte([true, false, true], 'Netz -3000 W');
$test->assertSame('PV', GetValue($test->objectByIdent('Betriebsart', $managerId)));
$regeln(-1000.0);
$warteAufKontakte([true, false, true], 'Netz -1000 W');
$regeln(0.0);
$warteAufKontakte([true, false, true], 'Netz 0 W');
IPS_Sleep(1100);
$regeln(1000.0);
$warteAufKontakte([true, true, false], 'Netz +1000 W');
$test->assertSame('Peak', GetValue($test->objectByIdent('Betriebsart', $managerId)));
IPS_Sleep(1100);
$regeln(3000.0);
$warteAufKontakte([false, false, false], 'Netz +3000 W');
});
$test->runCase('Keep-alive ist aktiv und erneuert unveränderte Sollwerte', static function (
TestContext $test
) use ($managerId, $einStufigId): void {
$sollwertId = $test->objectByIdent('Sollleistung', $einStufigId);
$vorher = (int) IPS_GetVariable($sollwertId)['VariableUpdated'];
IPS_Sleep(1100);
IPS_RequestAction($managerId, 'Regeln', true);
$test->waitUntil(
static fn (): bool => (int) IPS_GetVariable($sollwertId)['VariableUpdated'] > $vorher
);
});
$test->runCase('Alle definierten Nachrichtenauslöser aktualisieren den Manager', static function (
TestContext $test
) use (
$managerId,
$einStufigId,
$warmwasserId,
$temperaturId,
$melden,
$verbraucherstatus,
$zustandswert
): void {
$melden();
IPS_RequestAction($managerId, 'Regeln', false);
$daten = $verbraucherstatus();
$test->assertSame(2, count($daten['Verbraucher'] ?? []));
SetValue($temperaturId, 53.0);
$test->waitUntil(static function () use (
$managerId,
$warmwasserId,
$verbraucherstatus,
$zustandswert
): bool {
IPS_RequestAction($managerId, 'Regeln', false);
$wert = $zustandswert(
$verbraucherstatus(),
$warmwasserId,
'Wassertemperatur_C'
);
return is_numeric($wert) && abs((float) $wert - 53.0) < 0.01;
}, 4000, 100);
IPS_RequestAction($einStufigId, 'Melden', true);
IPS_RequestAction($warmwasserId, 'Melden', true);
IPS_RequestAction($managerId, 'Regeln', true);
$daten = $verbraucherstatus();
$test->assertTrue(
is_bool($zustandswert($daten, $einStufigId, 'Schaltzustand'))
);
$test->assertTrue(
is_int($zustandswert($daten, $warmwasserId, 'AktiveStufe'))
);
$test->assertSame(false, GetValue(
$test->objectByIdent('Sammelstoerung', $managerId)
));
});
};