fix(manager): Festlasten nach Istleistung bilanzieren
Tests / test (push) Successful in 52s

This commit is contained in:
dh
2026-09-29 15:11:14 +00:00
parent 3aaa744a8a
commit cae14cf399
2 changed files with 41 additions and 6 deletions
+34 -1
View File
@@ -127,6 +127,11 @@ final class ManagerRegler
continue; continue;
} }
$festwert = self::istFestwert($daten['Leistungswerte_W']);
if ($festwert) {
$nichtSteuerbar += $leistung;
}
$energie = $bezogeneEnergieWh[$eintrag['InstanzID']] ?? 0.0; $energie = $bezogeneEnergieWh[$eintrag['InstanzID']] ?? 0.0;
if ((!is_int($energie) && !is_float($energie)) if ((!is_int($energie) && !is_float($energie))
|| (is_float($energie) && !is_finite($energie)) || (is_float($energie) && !is_finite($energie))
@@ -138,6 +143,7 @@ final class ManagerRegler
'Prioritaet' => $daten[$prioritaetsfeld], 'Prioritaet' => $daten[$prioritaetsfeld],
'Energiegruppe' => (int) round((float) $energie / 2000.0), 'Energiegruppe' => (int) round((float) $energie / 2000.0),
'Leistungswerte_W' => $daten['Leistungswerte_W'], 'Leistungswerte_W' => $daten['Leistungswerte_W'],
'Festwert' => $festwert,
]; ];
} }
@@ -157,6 +163,13 @@ final class ManagerRegler
$sollwerte = []; $sollwerte = [];
$ausgangssumme = 0; $ausgangssumme = 0;
foreach ($steuerbar as $eintrag) { foreach ($steuerbar as $eintrag) {
if ($eintrag['Festwert']) {
$sollwerte[$eintrag['InstanzID']] = self::kleinsterLeistungswert(
$eintrag['Leistungswerte_W']
);
continue;
}
$ausgangswert = self::neutralerLeistungswert($eintrag['Leistungswerte_W']); $ausgangswert = self::neutralerLeistungswert($eintrag['Leistungswerte_W']);
$sollwerte[$eintrag['InstanzID']] = $ausgangswert; $sollwerte[$eintrag['InstanzID']] = $ausgangswert;
$ausgangssumme += $ausgangswert; $ausgangssumme += $ausgangswert;
@@ -164,6 +177,10 @@ final class ManagerRegler
$rest = $verteilbudget - $nichtSteuerbar - $ausgangssumme; $rest = $verteilbudget - $nichtSteuerbar - $ausgangssumme;
foreach ($steuerbar as $eintrag) { foreach ($steuerbar as $eintrag) {
if ($eintrag['Festwert']) {
continue;
}
$instanzID = $eintrag['InstanzID']; $instanzID = $eintrag['InstanzID'];
$ausgangswert = $sollwerte[$instanzID]; $ausgangswert = $sollwerte[$instanzID];
if ($rest >= 0) { if ($rest >= 0) {
@@ -181,7 +198,12 @@ final class ManagerRegler
$sollwerte[$instanzID] = $neuerSollwert; $sollwerte[$instanzID] = $neuerSollwert;
} }
$zugeteilt = $nichtSteuerbar + array_sum($sollwerte); $zugeteilt = $nichtSteuerbar;
foreach ($steuerbar as $eintrag) {
if (!$eintrag['Festwert']) {
$zugeteilt += $sollwerte[$eintrag['InstanzID']];
}
}
return [ return [
'Verteilbudget_W' => $verteilbudget, 'Verteilbudget_W' => $verteilbudget,
@@ -238,6 +260,17 @@ final class ManagerRegler
} }
} }
/**
* Ein einzelner Leistungswert bleibt als Befehl erhalten. Fuer die
* Leistungsbilanz zaehlt jedoch die gemessene Istleistung.
*
* @param list<int|array{Von_W: int, Bis_W: int}> $leistungswerte
*/
private static function istFestwert(array $leistungswerte): bool
{
return count($leistungswerte) === 1 && is_int($leistungswerte[0]);
}
/** /**
* @param list<int|array{Von_W: int, Bis_W: int}> $leistungswerte * @param list<int|array{Von_W: int, Bis_W: int}> $leistungswerte
*/ */
+7 -5
View File
@@ -153,12 +153,12 @@ final class ManagerReglerTest extends TestCase
$ergebnis = ManagerRegler::verteile(3000.0, 5000.0, [$fest, $steuerbar], 'PrioritaetPV'); $ergebnis = ManagerRegler::verteile(3000.0, 5000.0, [$fest, $steuerbar], 'PrioritaetPV');
self::assertSame(0, $ergebnis['NichtSteuerbar_W']); self::assertSame(3000, $ergebnis['NichtSteuerbar_W']);
self::assertSame([10 => 3000, 20 => 2000], $ergebnis['Sollwerte']); self::assertSame([10 => 3000, 20 => 2000], $ergebnis['Sollwerte']);
self::assertSame(0, $ergebnis['Restabweichung_W']); self::assertSame(0, $ergebnis['Restabweichung_W']);
} }
public function testFestwerteWerdenMitHoeherPriorisierterBatterieZugewiesen(): void public function testFestwerteWerdenNachIstleistungBilanziertUndAlsBefehlBeibehalten(): void
{ {
$ergebnis = ManagerRegler::verteile( $ergebnis = ManagerRegler::verteile(
-2411.0, -2411.0,
@@ -179,9 +179,10 @@ final class ManagerReglerTest extends TestCase
); );
self::assertSame(12562, $ergebnis['Verteilbudget_W']); self::assertSame(12562, $ergebnis['Verteilbudget_W']);
self::assertSame(10151, $ergebnis['NichtSteuerbar_W']);
self::assertSame( self::assertSame(
[ [
44234 => -12288, 44234 => 2411,
29743 => 0, 29743 => 0,
38676 => 0, 38676 => 0,
43878 => 13850, 43878 => 13850,
@@ -192,7 +193,7 @@ final class ManagerReglerTest extends TestCase
self::assertSame(0, $ergebnis['Restabweichung_W']); self::assertSame(0, $ergebnis['Restabweichung_W']);
} }
public function testBatterieGleichtFesteLastenAusOhneSolarladungZuSpeisen(): void public function testBatterieGleichtGemesseneFesteLastenAusOhneSolarladungZuSpeisen(): void
{ {
$ergebnis = ManagerRegler::verteile( $ergebnis = ManagerRegler::verteile(
-4526.0, -4526.0,
@@ -214,6 +215,7 @@ final class ManagerReglerTest extends TestCase
); );
self::assertSame(13657, $ergebnis['Verteilbudget_W']); self::assertSame(13657, $ergebnis['Verteilbudget_W']);
self::assertSame(10942, $ergebnis['NichtSteuerbar_W']);
self::assertSame( self::assertSame(
[ [
29743 => 0, 29743 => 0,
@@ -221,7 +223,7 @@ final class ManagerReglerTest extends TestCase
22078 => 7690, 22078 => 7690,
31986 => 11000, 31986 => 11000,
43878 => 0, 43878 => 0,
44234 => -5033, 44234 => 2715,
], ],
$ergebnis['Sollwerte'] $ergebnis['Sollwerte']
); );