feat(manager): Lizenzierung und Energietopologie verfeinern
Tests / test (push) Successful in 46s

This commit is contained in:
dh
2026-09-28 17:47:22 +00:00
parent 708a8ecea2
commit cf2ce3aff4
14 changed files with 517 additions and 151 deletions
+2 -2
View File
@@ -18,8 +18,6 @@ final class AnlagentopologieTest extends TestCase
'Name' => 'Hybrid Ost',
'Typ' => 'hybrid',
'ACNennleistung_kW' => 10.0,
'ACEinspeisegrenze_kW' => 8.0,
'ACBezugsgrenze_kW' => 0.0,
]], JSON_THROW_ON_ERROR),
json_encode([
[
@@ -62,6 +60,8 @@ final class AnlagentopologieTest extends TestCase
self::assertSame(12.8, $topologie['summary']['pvDcKwp']);
self::assertSame(10.0, $topologie['summary']['pvAcKw']);
self::assertSame(12.8, $topologie['summary']['usableBatteryKwh']);
self::assertArrayNotHasKey('acExportLimitKw', $topologie['inverters'][0]);
self::assertArrayNotHasKey('acImportLimitKw', $topologie['inverters'][0]);
self::assertSame([[
'inverterId' => 'hybrid-1',
'acRatedKw' => 10.0,
+2 -1
View File
@@ -131,8 +131,9 @@ final class DemoanlageBootstrapTest extends TestCase
self::assertStringContainsString("'Begrenzungsart' => 'watt'", $source);
self::assertStringContainsString("'EinspeisebegrenzungAktiv' => true", $source);
self::assertStringContainsString("'Einspeisegrenze' => 3000.0", $source);
self::assertStringContainsString("'Einspeisetoleranz' => 100.0", $source);
self::assertStringContainsString("'PrognoseAktiv' => false", $source);
self::assertStringContainsString("'NetzfahrplanAktiv' => false", $source);
self::assertStringNotContainsString("'Einspeisetoleranz'", $source);
self::assertStringContainsString("'demo-hybrid-1'", $source);
self::assertStringContainsString("'demo-pv-1'", $source);
self::assertStringContainsString("'demo-battery-1'", $source);
+9 -13
View File
@@ -15,17 +15,16 @@ final class EinspeiseReglerTest extends TestCase
$ergebnis = EinspeiseRegler::verteile(
-15000.0,
10000.0,
100.0,
[
['ID' => 'wr-1', 'Nennleistung_W' => 10000, 'Istleistung_W' => 10000],
['ID' => 'wr-2', 'Nennleistung_W' => 5000, 'Istleistung_W' => 5000],
]
);
self::assertSame(10100.0, $ergebnis['ZielGesamtleistung_W']);
self::assertSame(4900.0, $ergebnis['Abregelbedarf_W']);
self::assertSame(6733.333, $ergebnis['Grenzen_W']['wr-1']);
self::assertSame(3366.667, $ergebnis['Grenzen_W']['wr-2']);
self::assertSame(10000.0, $ergebnis['ZielGesamtleistung_W']);
self::assertSame(5000.0, $ergebnis['Abregelbedarf_W']);
self::assertSame(6666.667, $ergebnis['Grenzen_W']['wr-1']);
self::assertSame(3333.333, $ergebnis['Grenzen_W']['wr-2']);
}
public function testAbregelungFolgtDerTatsaechlichenErzeugung(): void
@@ -33,7 +32,6 @@ final class EinspeiseReglerTest extends TestCase
$ergebnis = EinspeiseRegler::verteile(
-10000.0,
5000.0,
0.0,
[
['ID' => 'wr-1', 'Nennleistung_W' => 10000, 'Istleistung_W' => 10000],
['ID' => 'wr-2', 'Nennleistung_W' => 10000, 'Istleistung_W' => 0],
@@ -49,7 +47,6 @@ final class EinspeiseReglerTest extends TestCase
$ergebnis = EinspeiseRegler::verteile(
-6000.0,
10000.0,
100.0,
[
['ID' => 'wr-1', 'Nennleistung_W' => 10000, 'Istleistung_W' => 4000],
['ID' => 'wr-2', 'Nennleistung_W' => 10000, 'Istleistung_W' => 2000],
@@ -57,22 +54,21 @@ final class EinspeiseReglerTest extends TestCase
['wr-1' => 5000, 'wr-2' => 5000]
);
self::assertSame(13900.0, $ergebnis['ZielGesamtleistung_W']);
self::assertSame(6950.0, $ergebnis['Grenzen_W']['wr-1']);
self::assertSame(6950.0, $ergebnis['Grenzen_W']['wr-2']);
self::assertSame(14000.0, $ergebnis['ZielGesamtleistung_W']);
self::assertSame(7000.0, $ergebnis['Grenzen_W']['wr-1']);
self::assertSame(7000.0, $ergebnis['Grenzen_W']['wr-2']);
}
public function testToleranzVerhindertPendelnAmGrenzwert(): void
public function testRegelungFolgtAuchKleinenAbweichungenStufenlos(): void
{
$ergebnis = EinspeiseRegler::verteile(
-10050.0,
10000.0,
100.0,
[['ID' => 'wr-1', 'Nennleistung_W' => 10000, 'Istleistung_W' => 9000]],
['wr-1' => 8000]
);
self::assertSame(8000.0, $ergebnis['ZielGesamtleistung_W']);
self::assertSame(7950.0, $ergebnis['ZielGesamtleistung_W']);
}
public function testStellwerteWerdenInProzentOderWattAusgegeben(): void
+6
View File
@@ -50,6 +50,12 @@ final class EnergieMessungTest extends TestCase
self::assertSame(0.0, EnergieMessung::hausleistung(500.0, -1200.0, 0.0));
}
public function testBerechnetHausenergieAusDenZaehlerdeltas(): void
{
self::assertSame(8.5, EnergieMessung::hausenergie(10.0, 2.0, 4.0, 1.5, 2.0));
self::assertSame(0.0, EnergieMessung::hausenergie(1.0, 0.0, 5.0, 0.0, 0.0));
}
public function testIgnoriertUngueltigeDauerUndNichtEndlicheWerte(): void
{
$werte = EnergieMessung::energieDeltas([
@@ -52,6 +52,11 @@ final class ManagerEnergieModulstrukturTest extends TestCase
'IstleistungVariableID',
'LeistungVariableID',
'SOCVariableID',
'NetzbezugEnergieVariableID',
'NetzeinspeisungEnergieVariableID',
'ErzeugungsenergieVariableID',
'LadeenergieVariableID',
'EntladeenergieVariableID',
] as $erwartet) {
self::assertStringContainsString($erwartet, $formular);
}
@@ -78,6 +83,8 @@ final class ManagerEnergieModulstrukturTest extends TestCase
self::assertStringContainsString("RegisterTimer(
'MesswerteAufzeichnen'", $modul);
self::assertStringContainsString('EnergieMessung::energieDeltas', $modul);
self::assertStringContainsString('EnergieMessung::hausenergie', $modul);
self::assertStringContainsString("RegisterAttributeString('MessungZaehlerstaende'", $modul);
}
public function testFunFactsSindResponsivUndErklaerenUmrechnungen(): void
+19 -2
View File
@@ -50,9 +50,14 @@ final class ManagerModulstrukturTest extends TestCase
'Umschaltdifferenz',
'EinspeisebegrenzungAktiv',
'Einspeisegrenze',
'Einspeisetoleranz',
'PrognoseAktiv',
'PrognoseLizenzInformation',
'NetzfahrplanAktiv',
'NetzbezugEnergieVariableID',
'NetzeinspeisungEnergieVariableID',
'IstleistungVariableID',
'ErzeugungsenergieVariableID',
'Erzeugungsenergiefaktor',
'BegrenzungVariableID',
'Begrenzungsart',
'DiagnosevariablenAnzeigen',
@@ -70,6 +75,9 @@ final class ManagerModulstrukturTest extends TestCase
'LeistungVariableID',
'Leistungsfaktor',
'SOCVariableID',
'LadeenergieVariableID',
'EntladeenergieVariableID',
'Energiefaktor',
'EnergyPieAnzeigen',
'EnergiediagrammeAnzeigen',
'FunFactsAnzeigen',
@@ -81,7 +89,8 @@ final class ManagerModulstrukturTest extends TestCase
self::assertStringContainsString($property, $json);
}
foreach (['Regelintervall', 'Vorgabeintervall', 'UmschaltschwelleUeberschuss',
'UmschaltschwelleLastspitze', 'Optionale obere Anschluesse', 'LizenzAnschluss'] as $entfernt
'UmschaltschwelleLastspitze', 'Optionale obere Anschluesse', 'LizenzAnschluss',
'Einspeisetoleranz', 'ACEinspeisegrenze_kW', 'ACBezugsgrenze_kW'] as $entfernt
) {
self::assertStringNotContainsString($entfernt, $json);
}
@@ -294,8 +303,16 @@ final class ManagerModulstrukturTest extends TestCase
$inhalt
);
self::assertStringContainsString('Lizenzpruefung::NETZFAHRPLAN', $inhalt);
self::assertStringContainsString('Lizenzpruefung::PROGNOSE_PV', $inhalt);
self::assertStringContainsString('Lizenzpruefung::PROGNOSE_VERBRAUCH', $inhalt);
self::assertStringContainsString('prognoseLizenzStatustext(', $inhalt);
self::assertStringContainsString(
"foreach (['PeakShavingTitel', 'EinspeisebegrenzungAktiv', 'Einspeisegrenze']",
$inhalt
);
self::assertStringContainsString('aktuelleNetzfahrplanVorgabe()', $inhalt);
self::assertStringContainsString('gibEinspeisebegrenzungFrei()', $inhalt);
self::assertStringNotContainsString("RegisterPropertyFloat('Einspeisetoleranz'", $inhalt);
}
public function testManagerVerwendetDieNeuenZeitdefaults(): void
-2
View File
@@ -80,8 +80,6 @@ return static function (TestContext $test): void {
'Name' => 'Hybridwechselrichter',
'Typ' => 'hybrid',
'ACNennleistung_kW' => 10.0,
'ACEinspeisegrenze_kW' => 8.0,
'ACBezugsgrenze_kW' => 0.0,
'IstleistungVariableID' => $pvLeistungId,
'Istleistungsfaktor' => 1.0,
]];