feat(manager): Energievisualisierung und Synchronisierung erweitern
Tests / test (push) Successful in 50s

This commit is contained in:
dh
2026-10-06 08:00:30 +00:00
parent 8d83b083bf
commit 37addf4242
5 changed files with 864 additions and 111 deletions
+122 -25
View File
@@ -6,8 +6,13 @@ use Belevo\EnelixEMS\SymconTest\TestContext;
return static function (TestContext $test): void {
$netzleistungId = $test->createVariable(2, 'Netzleistung', -800.0);
$netzbezugEnergieId = $test->createVariable(2, 'Netzbezug-Energie', 32.0);
$netzeinspeisungEnergieId = $test->createVariable(2, 'Netzeinspeisung-Energie', 16.0);
$pvLeistungId = $test->createVariable(2, 'PV-Leistung', 4200.0);
$pvEnergieId = $test->createVariable(2, 'PV-Energie', 120.0);
$batterieLeistungId = $test->createVariable(2, 'Batterieleistung', 700.0);
$batterieLadeenergieId = $test->createVariable(2, 'Batterie-Ladeenergie', 18.0);
$batterieEntladeenergieId = $test->createVariable(2, 'Batterie-Entladeenergie', 12.0);
$batterieSocId = $test->createVariable(2, 'Batterie-Ladezustand', 62.0);
$einKontaktId = $test->createActionVariable('Kontakt Verbraucher 1-Stufig');
$einStufigId = $test->createInstance(
@@ -82,6 +87,8 @@ return static function (TestContext $test): void {
'ACNennleistung_kW' => 10.0,
'IstleistungVariableID' => $pvLeistungId,
'Istleistungsfaktor' => 1.0,
'ErzeugungsenergieVariableID' => $pvEnergieId,
'Erzeugungsenergiefaktor' => 1.0,
]];
$pvKonfiguration = [[
'ID' => 'pv-1',
@@ -106,6 +113,9 @@ return static function (TestContext $test): void {
'LeistungVariableID' => $batterieLeistungId,
'Leistungsfaktor' => 1.0,
'SOCVariableID' => $batterieSocId,
'LadeenergieVariableID' => $batterieLadeenergieId,
'EntladeenergieVariableID' => $batterieEntladeenergieId,
'Energiefaktor' => 1.0,
]];
$lizenzcode = trim((string) getenv('ENELIX_TEST_LICENSE_CODE'));
$managerId = $test->createInstance(
@@ -113,6 +123,8 @@ return static function (TestContext $test): void {
'Manager',
[
'NetzleistungVariableID' => $netzleistungId,
'NetzbezugEnergieVariableID' => $netzbezugEnergieId,
'NetzeinspeisungEnergieVariableID' => $netzeinspeisungEnergieId,
'EnergyPieAnzeigen' => true,
'EnergiediagrammeAnzeigen' => true,
'FunFactsAnzeigen' => true,
@@ -226,11 +238,17 @@ return static function (TestContext $test): void {
});
$test->runCase('Energiewerte, Archivregeln und Unterobjekte werden erzeugt', static function (
TestContext $test
) use ($managerId): void {
) use ($managerId, $pvLeistungId): void {
IPS_RequestAction($managerId, 'MesswerteAufzeichnen', true);
$test->assertSame(
4200.0,
GetValue($test->objectByIdent('PVLeistungArchiv', $managerId))
GetValue($test->objectByIdent('PVLeistungArchiv', $managerId)),
sprintf(
'PV-Archiv unveraendert; Quelle %.1f W, Managerstatus %d, Konfiguration %s.',
(float) GetValue($pvLeistungId),
(int) IPS_GetInstance($managerId)['InstanceStatus'],
(string) IPS_GetProperty($managerId, 'AnlagenWechselrichter')
)
);
$test->assertSame(
2700.0,
@@ -288,18 +306,69 @@ return static function (TestContext $test): void {
}
}
$pvFlussID = $test->objectByIdent('EnergieflussPV', $managerId);
$test->assertSame(4200.0, (float) GetValue($pvFlussID));
$test->assertSame(
4200.0,
(float) GetValue($pvFlussID),
'Der anfaengliche PV-Energiefluss ist falsch.'
);
$test->assertSame('~Power', IPS_GetVariable($pvFlussID)['VariableProfile']);
IPS_SetProperty($managerId, 'EnergieflussLeistungseinheit', 1);
IPS_ApplyChanges($managerId);
$test->assertSame(4.2, (float) GetValue($pvFlussID));
$test->assertSame('Enelix.Power.kW', IPS_GetVariable($pvFlussID)['VariableProfile']);
$pieID = $test->objectByIdent('EnergyPie', $managerId);
$leistungsdiagrammID = $test->objectByIdent('Leistungsdiagramm', $managerId);
$energiediagrammID = $test->objectByIdent('Energiediagramm', $managerId);
$energiediagramm = json_decode(
base64_decode((string) IPS_GetMediaContent($energiediagrammID), true),
true,
512,
JSON_THROW_ON_ERROR
);
$energietitel = array_column($energiediagramm['datasets'] ?? [], 'title');
foreach ($energiediagramm['datasets'] ?? [] as $datensatz) {
$test->assertSame('bar', $datensatz['type'] ?? null);
}
foreach ([
'Netzbezug',
'Netzeinspeisung',
'Batterie laden gesamt',
'Batterie entladen gesamt',
] as $titel) {
$test->assertTrue(in_array($titel, $energietitel, true));
}
IPS_RequestAction($managerId, 'FormEnergieflussAnzeigen', false);
$test->assertSame(true, (bool) IPS_GetObject($energieflussID)['ObjectIsHidden']);
IPS_RequestAction($managerId, 'FormEnergieflussAnzeigen', true);
$test->assertSame(false, (bool) IPS_GetObject($energieflussID)['ObjectIsHidden']);
$angepasstesDiagramm = base64_encode(
json_encode(['datasets' => [], 'custom' => 'bleibt'], JSON_THROW_ON_ERROR)
);
IPS_SetMediaContent($energiediagrammID, $angepasstesDiagramm);
IPS_SetProperty($pieID, 'Zaehlerfaktor', 2.0);
IPS_ApplyChanges($pieID);
IPS_SetProperty($energieflussID, 'Config', '[]');
IPS_ApplyChanges($energieflussID);
IPS_SetProperty($managerId, 'EnergieflussLeistungseinheit', 1);
IPS_SetProperty($managerId, 'DiagrammPVModus', 2);
IPS_SetProperty($managerId, 'DiagrammBatterieModus', 2);
IPS_ApplyChanges($managerId);
$test->assertSame($pieID, $test->objectByIdent('EnergyPie', $managerId));
$test->assertSame(
$leistungsdiagrammID,
$test->objectByIdent('Leistungsdiagramm', $managerId)
);
$test->assertSame(
$energiediagrammID,
$test->objectByIdent('Energiediagramm', $managerId)
);
$test->assertSame(
$angepasstesDiagramm,
(string) IPS_GetMediaContent($energiediagrammID)
);
$test->assertSame(2.0, (float) IPS_GetProperty($pieID, 'Zaehlerfaktor'));
$test->assertSame('[]', (string) IPS_GetProperty($energieflussID, 'Config'));
$test->assertSame(
4200.0,
(float) GetValue($pvFlussID),
'Der bestehende PV-Energiefluss wurde beim Apply veraendert.'
);
$test->assertSame('~Power', IPS_GetVariable($pvFlussID)['VariableProfile']);
foreach ([
'EnergyPieAnzeigen',
@@ -322,7 +391,44 @@ return static function (TestContext $test): void {
$ident . ' wurde beim Ausschalten nicht entfernt.'
);
}
$test->assertSame(true, (bool) IPS_GetObject($energieflussID)['ObjectIsHidden']);
$test->assertSame(
true,
(bool) IPS_GetObject($energieflussID)['ObjectIsHidden']
);
foreach ([
'EnergyPieAnzeigen',
'EnergiediagrammeAnzeigen',
'EnergieflussAnzeigen',
] as $property) {
IPS_SetProperty($managerId, $property, true);
}
IPS_ApplyChanges($managerId);
$neuerFlussID = $test->objectByIdent('Energiefluss', $managerId);
$test->assertSame($energieflussID, $neuerFlussID);
$test->assertSame(false, (bool) IPS_GetObject($neuerFlussID)['ObjectIsHidden']);
$test->assertTrue((string) IPS_GetProperty($neuerFlussID, 'Config') !== '[]');
$test->assertSame(4.2, (float) GetValue($pvFlussID));
$test->assertSame('Enelix.Power.kW', IPS_GetVariable($pvFlussID)['VariableProfile']);
$neuesLeistungsdiagramm = json_decode(
base64_decode(
(string) IPS_GetMediaContent(
$test->objectByIdent('Leistungsdiagramm', $managerId)
),
true
),
true,
512,
JSON_THROW_ON_ERROR
);
$leistungstitel = array_column(
$neuesLeistungsdiagramm['datasets'] ?? [],
'title'
);
foreach (['PV gesamt', 'Hybridwechselrichter', 'Batterie gesamt', 'Hausspeicher'] as $titel) {
$test->assertTrue(in_array($titel, $leistungstitel, true));
}
});
$zustandswert = static function (array $daten, int $instanzId, string $kennung) {
@@ -470,12 +576,11 @@ return static function (TestContext $test): void {
));
});
$test->runCase('Veralteter Verbraucher blockiert aktuelle Verbraucher nicht', static function (
$test->runCase('Veraltete Verbraucher werden aktiv neu angefordert', static function (
TestContext $test
) use (
$managerId,
$netzleistungId,
$einStufigId,
$warmwasserId,
$pufferspeicherId,
$melden,
@@ -496,17 +601,9 @@ return static function (TestContext $test): void {
IPS_RequestAction($managerId, 'Regeln', true);
$daten = $verbraucherstatus();
$test->assertSame(false, $daten['Synchronisiert'] ?? null);
$test->assertSame(2, count($daten['Verbraucher'] ?? []));
$test->assertSame(1, count($daten['NichtGeregelt'] ?? []));
$test->assertSame(
$einStufigId,
$daten['NichtGeregelt'][0]['InstanzID'] ?? null
);
$test->assertSame(
'Meldung ist veraltet',
$daten['NichtGeregelt'][0]['Grund'] ?? null
);
$test->assertSame(true, $daten['Synchronisiert'] ?? null);
$test->assertSame(3, count($daten['Verbraucher'] ?? []));
$test->assertSame(0, count($daten['NichtGeregelt'] ?? []));
$test->assertTrue(
(float) GetValue($test->objectByIdent('Verteilbudget', $managerId)) > 0.0
);