feat(manager): account for SDL power and SOC separately
Tests / test (push) Failing after 1m12s

Add opt-in SDL measurement sources and independent visualization toggles. Exclude balancing power from household telemetry and new household energy. Preserve custom views and cover measurement, migration and Symcon 8.0 behavior.
This commit is contained in:
dh
2026-10-06 13:35:17 +00:00
parent 58f91e4319
commit ebec355c96
12 changed files with 1243 additions and 35 deletions
+91
View File
@@ -431,6 +431,97 @@ return static function (TestContext $test): void {
}
});
$test->runCase('SDL korrigiert Hauslast und ergaenzt bestehende Anzeigen idempotent', static function (
TestContext $test
) use ($managerId): void {
$leistungID = $test->createVariable(2, 'SDL Istleistung', -1.2);
$socID = $test->createVariable(2, 'SDL SOC', 47.5);
$flussID = $test->objectByIdent('Energiefluss', $managerId);
$chartID = $test->objectByIdent('Leistungsdiagramm', $managerId);
$flussVorher = json_decode(IPS_GetProperty($flussID, 'Config'), true, 512, JSON_THROW_ON_ERROR);
$chartVorher = json_decode(base64_decode(IPS_GetMediaContent($chartID)), true, 512, JSON_THROW_ON_ERROR);
try {
IPS_SetProperty($managerId, 'SDLAktiv', true);
IPS_SetProperty($managerId, 'SDLLeistungVariableID', $leistungID);
IPS_SetProperty($managerId, 'SDLLeistungsfaktor', -1000.0);
IPS_SetProperty($managerId, 'SDLSOCVariableID', $socID);
IPS_SetProperty($managerId, 'SDLEnergieflussAnzeigen', true);
IPS_SetProperty($managerId, 'SDLDiagrammeAnzeigen', true);
IPS_ApplyChanges($managerId);
$test->assertSame(1500.0, GetValue($test->objectByIdent('HausverbrauchLeistungArchiv', $managerId)));
$test->assertSame(1200.0, GetValue($test->objectByIdent('SDLLeistungArchiv', $managerId)));
$test->assertSame(47.5, GetValue($test->objectByIdent('SDLSOCArchiv', $managerId)));
$test->assertSame(1.2, GetValue($test->objectByIdent('EnergieflussSDL', $managerId)));
$test->assertSame('Aktiv', GetValue($test->objectByIdent('SDLStatus', $managerId)));
$fluss = json_decode(IPS_GetProperty($flussID, 'Config'), true, 512, JSON_THROW_ON_ERROR);
$test->assertSame($flussVorher, array_slice($fluss, 0, count($flussVorher)));
$test->assertSame(count($flussVorher) + 1, count($fluss));
$test->assertSame($test->objectByIdent('SDLSOCArchiv', $managerId), $fluss[count($fluss) - 1]['InfoVariableID']);
$chart = json_decode(base64_decode(IPS_GetMediaContent($chartID)), true, 512, JSON_THROW_ON_ERROR);
$test->assertSame($chartVorher['datasets'], array_slice($chart['datasets'], 0, count($chartVorher['datasets'])));
$test->assertSame('right', $chart['datasets'][count($chart['datasets']) - 1]['side']);
$test->assertSame('~Intensity.100', $chart['datasets'][count($chart['datasets']) - 1]['profile']);
IPS_ApplyChanges($managerId);
$test->assertSame($fluss, json_decode(IPS_GetProperty($flussID, 'Config'), true, 512, JSON_THROW_ON_ERROR));
$test->assertSame($chart, json_decode(base64_decode(IPS_GetMediaContent($chartID)), true, 512, JSON_THROW_ON_ERROR));
foreach ([0 => ['~Power', 1200.0], 1 => ['Enelix.Power.kW', 1.2]] as $einheit => $erwartet) {
IPS_SetProperty($managerId, 'EnergieflussAnzeigen', false);
IPS_ApplyChanges($managerId);
IPS_SetProperty($managerId, 'EnergieflussLeistungseinheit', $einheit);
IPS_SetProperty($managerId, 'EnergieflussAnzeigen', true);
IPS_ApplyChanges($managerId);
$flussID = $test->objectByIdent('Energiefluss', $managerId);
$sdlID = $test->objectByIdent('EnergieflussSDL', $managerId);
$test->assertSame($erwartet[0], IPS_GetVariable($sdlID)['VariableProfile']);
$test->assertSame($erwartet[1], GetValue($sdlID));
}
IPS_SetProperty($managerId, 'SDLEnergieflussAnzeigen', false);
IPS_SetProperty($managerId, 'SDLDiagrammeAnzeigen', false);
IPS_ApplyChanges($managerId);
$test->assertSame($flussVorher, json_decode(IPS_GetProperty($flussID, 'Config'), true, 512, JSON_THROW_ON_ERROR));
$test->assertSame($chartVorher, json_decode(base64_decode(IPS_GetMediaContent($chartID)), true, 512, JSON_THROW_ON_ERROR));
$test->assertSame(1500.0, GetValue($test->objectByIdent('HausverbrauchLeistungArchiv', $managerId)));
$test->assertEquals(1.9, GetValue($test->objectByIdent('EnergieflussBatterie', $managerId)), 0.000001);
IPS_SetProperty($managerId, 'SDLSOCVariableID', 0);
IPS_SetProperty($managerId, 'SDLDiagrammeAnzeigen', true);
IPS_ApplyChanges($managerId);
$chart = json_decode(base64_decode(IPS_GetMediaContent($chartID)), true, 512, JSON_THROW_ON_ERROR);
$test->assertSame(count($chartVorher['datasets']) + 1, count($chart['datasets']));
IPS_SetProperty($managerId, 'EnergieaufzeichnungAktiv', false);
$test->assertTrue(IPS_ApplyChanges($managerId));
$archivID = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}')[0];
foreach (['SDLLeistungArchiv', 'SDLSOCArchiv', 'SDLLadenEnergie', 'SDLEntladenEnergie'] as $ident) {
$test->assertSame(false, AC_GetLoggingStatus($archivID, $test->objectByIdent($ident, $managerId)));
}
} finally {
IPS_SetProperty($managerId, 'EnergieaufzeichnungAktiv', true);
IPS_SetProperty($managerId, 'SDLAktiv', false);
IPS_SetProperty($managerId, 'SDLEnergieflussAnzeigen', false);
IPS_SetProperty($managerId, 'SDLDiagrammeAnzeigen', false);
IPS_ApplyChanges($managerId);
}
$test->assertSame(2700.0, GetValue($test->objectByIdent('HausverbrauchLeistungArchiv', $managerId)));
});
$test->runCase('SDL weist fehlende und doppelte Leistungsquellen zurueck', static function (
TestContext $test
) use ($managerId, $batterieLeistungId): void {
try {
IPS_SetProperty($managerId, 'SDLAktiv', true);
foreach ([0, $batterieLeistungId] as $quelle) {
IPS_SetProperty($managerId, 'SDLLeistungVariableID', $quelle);
IPS_ApplyChanges($managerId);
$test->assertInstanceStatus($managerId, 202);
}
} finally {
IPS_SetProperty($managerId, 'SDLAktiv', false);
IPS_SetProperty($managerId, 'SDLLeistungVariableID', 0);
IPS_ApplyChanges($managerId);
}
});
$zustandswert = static function (array $daten, int $instanzId, string $kennung) {
foreach ($daten['Verbraucher'] ?? [] as $verbraucher) {
if (($verbraucher['InstanzID'] ?? 0) !== $instanzId) {