This commit is contained in:
+34
-1
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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']
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user