diff --git a/libs/ManagerRegler.php b/libs/ManagerRegler.php index 2e0f65a..2a30139 100644 --- a/libs/ManagerRegler.php +++ b/libs/ManagerRegler.php @@ -127,6 +127,11 @@ final class ManagerRegler continue; } + $festwert = self::istFestwert($daten['Leistungswerte_W']); + if ($festwert) { + $nichtSteuerbar += $leistung; + } + $energie = $bezogeneEnergieWh[$eintrag['InstanzID']] ?? 0.0; if ((!is_int($energie) && !is_float($energie)) || (is_float($energie) && !is_finite($energie)) @@ -138,6 +143,7 @@ final class ManagerRegler 'Prioritaet' => $daten[$prioritaetsfeld], 'Energiegruppe' => (int) round((float) $energie / 2000.0), 'Leistungswerte_W' => $daten['Leistungswerte_W'], + 'Festwert' => $festwert, ]; } @@ -157,6 +163,13 @@ final class ManagerRegler $sollwerte = []; $ausgangssumme = 0; foreach ($steuerbar as $eintrag) { + if ($eintrag['Festwert']) { + $sollwerte[$eintrag['InstanzID']] = self::kleinsterLeistungswert( + $eintrag['Leistungswerte_W'] + ); + continue; + } + $ausgangswert = self::neutralerLeistungswert($eintrag['Leistungswerte_W']); $sollwerte[$eintrag['InstanzID']] = $ausgangswert; $ausgangssumme += $ausgangswert; @@ -164,6 +177,10 @@ final class ManagerRegler $rest = $verteilbudget - $nichtSteuerbar - $ausgangssumme; foreach ($steuerbar as $eintrag) { + if ($eintrag['Festwert']) { + continue; + } + $instanzID = $eintrag['InstanzID']; $ausgangswert = $sollwerte[$instanzID]; if ($rest >= 0) { @@ -181,7 +198,12 @@ final class ManagerRegler $sollwerte[$instanzID] = $neuerSollwert; } - $zugeteilt = $nichtSteuerbar + array_sum($sollwerte); + $zugeteilt = $nichtSteuerbar; + foreach ($steuerbar as $eintrag) { + if (!$eintrag['Festwert']) { + $zugeteilt += $sollwerte[$eintrag['InstanzID']]; + } + } return [ '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 $leistungswerte + */ + private static function istFestwert(array $leistungswerte): bool + { + return count($leistungswerte) === 1 && is_int($leistungswerte[0]); + } + /** * @param list $leistungswerte */ diff --git a/tests/ManagerReglerTest.php b/tests/ManagerReglerTest.php index 34e229f..2ebacbb 100644 --- a/tests/ManagerReglerTest.php +++ b/tests/ManagerReglerTest.php @@ -153,12 +153,12 @@ final class ManagerReglerTest extends TestCase $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(0, $ergebnis['Restabweichung_W']); } - public function testFestwerteWerdenMitHoeherPriorisierterBatterieZugewiesen(): void + public function testFestwerteWerdenNachIstleistungBilanziertUndAlsBefehlBeibehalten(): void { $ergebnis = ManagerRegler::verteile( -2411.0, @@ -179,9 +179,10 @@ final class ManagerReglerTest extends TestCase ); self::assertSame(12562, $ergebnis['Verteilbudget_W']); + self::assertSame(10151, $ergebnis['NichtSteuerbar_W']); self::assertSame( [ - 44234 => -12288, + 44234 => 2411, 29743 => 0, 38676 => 0, 43878 => 13850, @@ -192,7 +193,7 @@ final class ManagerReglerTest extends TestCase self::assertSame(0, $ergebnis['Restabweichung_W']); } - public function testBatterieGleichtFesteLastenAusOhneSolarladungZuSpeisen(): void + public function testBatterieGleichtGemesseneFesteLastenAusOhneSolarladungZuSpeisen(): void { $ergebnis = ManagerRegler::verteile( -4526.0, @@ -214,6 +215,7 @@ final class ManagerReglerTest extends TestCase ); self::assertSame(13657, $ergebnis['Verteilbudget_W']); + self::assertSame(10942, $ergebnis['NichtSteuerbar_W']); self::assertSame( [ 29743 => 0, @@ -221,7 +223,7 @@ final class ManagerReglerTest extends TestCase 22078 => 7690, 31986 => 11000, 43878 => 0, - 44234 => -5033, + 44234 => 2715, ], $ergebnis['Sollwerte'] );