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
-22
View File
@@ -47,16 +47,6 @@ final class Anlagentopologie
'name' => self::name($eintrag['Name'] ?? null, $id),
'type' => $typ,
'acRatedKw' => $acRatedKw,
'acExportLimitKw' => self::optionaleGrenze(
$eintrag['ACEinspeisegrenze_kW'] ?? null,
$acRatedKw,
$pfad . ': AC-Einspeisegrenze'
),
'acImportLimitKw' => self::optionaleGrenze(
$eintrag['ACBezugsgrenze_kW'] ?? null,
$acRatedKw,
$pfad . ': AC-Bezugsgrenze'
),
];
$inverters[] = $inverter;
$inverterById[$id] = $inverter;
@@ -304,18 +294,6 @@ final class Anlagentopologie
return (float) $wert;
}
private static function optionaleGrenze($wert, float $nennleistung, string $feld): ?float
{
$grenze = self::optionalePositiveZahl($wert, $feld);
if ($grenze !== null && $grenze > $nennleistung) {
throw new InvalidArgumentException(
$feld . ' darf die AC-Nennleistung nicht uebersteigen.'
);
}
return $grenze;
}
private static function optionalerText($wert): ?string
{
if ($wert === null || $wert === '') {
+4 -9
View File
@@ -26,16 +26,12 @@ final class EinspeiseRegler
public static function verteile(
float $netzleistung,
float $einspeisegrenze,
float $toleranz,
array $wechselrichter,
array $letzteGrenzen = []
): array {
if ($einspeisegrenze < 0.0) {
throw new InvalidArgumentException('Einspeisegrenze darf nicht negativ sein.');
}
if ($toleranz < 0.0) {
throw new InvalidArgumentException('Einspeisetoleranz darf nicht negativ sein.');
}
if ($wechselrichter === []) {
throw new InvalidArgumentException('Mindestens ein regelbarer Wechselrichter ist erforderlich.');
}
@@ -81,12 +77,11 @@ final class EinspeiseRegler
$netzabweichung = $netzleistung + $einspeisegrenze;
$zielGesamt = $bisherigeGrenzeGesamt;
$nachIstleistungVerteilen = false;
if ($netzabweichung < -$toleranz) {
if ($netzabweichung < 0.0) {
$nachIstleistungVerteilen = $istleistungGesamt > 0.0;
$wirksameAbweichung = $netzabweichung + $toleranz;
$zielGesamt = min($bisherigeGrenzeGesamt, $istleistungGesamt) + $wirksameAbweichung;
} elseif ($netzabweichung > $toleranz) {
$zielGesamt = $bisherigeGrenzeGesamt + $netzabweichung - $toleranz;
$zielGesamt = min($bisherigeGrenzeGesamt, $istleistungGesamt) + $netzabweichung;
} elseif ($netzabweichung > 0.0) {
$zielGesamt = $bisherigeGrenzeGesamt + $netzabweichung;
}
$zielGesamt = max(0.0, min($zielGesamt, $nennleistungGesamt));
+17
View File
@@ -16,6 +16,23 @@ final class EnergieMessung
);
}
public static function hausenergie(
float $pv,
float $netzbezug,
float $netzeinspeisung,
float $batterieLaden,
float $batterieEntladen
): float {
return max(
0.0,
self::endlich($pv)
+ self::endlich($netzbezug)
+ self::endlich($batterieEntladen)
- self::endlich($netzeinspeisung)
- self::endlich($batterieLaden)
);
}
/**
* @param array{PV: float, Haus: float, Netz: float, Batterie: float} $leistungen
* @return array{