fix(manager): Regelung und Energiefluss korrigieren
Tests / test (push) Successful in 48s

This commit is contained in:
dh
2026-09-29 16:17:49 +00:00
parent cae14cf399
commit 393969594e
7 changed files with 345 additions and 25 deletions
+32 -14
View File
@@ -128,7 +128,8 @@ final class ManagerRegler
}
$festwert = self::istFestwert($daten['Leistungswerte_W']);
if ($festwert) {
$festgehalten = !$daten['AenderungMoeglich'];
if ($festwert || $festgehalten) {
$nichtSteuerbar += $leistung;
}
@@ -144,6 +145,8 @@ final class ManagerRegler
'Energiegruppe' => (int) round((float) $energie / 2000.0),
'Leistungswerte_W' => $daten['Leistungswerte_W'],
'Festwert' => $festwert,
'Festgehalten' => $festgehalten,
'Sollwert' => self::angenommenerSollwert($daten),
];
}
@@ -160,6 +163,7 @@ final class ManagerRegler
});
$verteilbudget = (int) round($aktuelleLeistung + $zielnetzleistung - $netzleistung);
$positiveRichtung = $verteilbudget - $nichtSteuerbar >= 0;
$sollwerte = [];
$ausgangssumme = 0;
foreach ($steuerbar as $eintrag) {
@@ -169,26 +173,41 @@ final class ManagerRegler
);
continue;
}
if ($eintrag['Festgehalten']) {
if ($eintrag['Sollwert'] !== null) {
$sollwerte[$eintrag['InstanzID']] = $eintrag['Sollwert'];
}
continue;
}
$ausgangswert = self::neutralerLeistungswert($eintrag['Leistungswerte_W']);
$ausgangswert = self::richtungsneutralerLeistungswert(
$eintrag['Leistungswerte_W'],
$positiveRichtung
);
$sollwerte[$eintrag['InstanzID']] = $ausgangswert;
$ausgangssumme += $ausgangswert;
}
$rest = $verteilbudget - $nichtSteuerbar - $ausgangssumme;
foreach ($steuerbar as $eintrag) {
if ($eintrag['Festwert']) {
if ($eintrag['Festwert'] || $eintrag['Festgehalten']) {
continue;
}
$instanzID = $eintrag['InstanzID'];
$ausgangswert = $sollwerte[$instanzID];
if ($rest >= 0) {
if ($positiveRichtung) {
if ($rest <= 0) {
continue;
}
$neuerSollwert = self::groessterLeistungswertBis(
$eintrag['Leistungswerte_W'],
$ausgangswert + $rest
);
} else {
if ($rest >= 0) {
continue;
}
$neuerSollwert = self::kleinsterLeistungswertAb(
$eintrag['Leistungswerte_W'],
$ausgangswert + $rest
@@ -200,7 +219,7 @@ final class ManagerRegler
$zugeteilt = $nichtSteuerbar;
foreach ($steuerbar as $eintrag) {
if (!$eintrag['Festwert']) {
if (!$eintrag['Festwert'] && !$eintrag['Festgehalten']) {
$zugeteilt += $sollwerte[$eintrag['InstanzID']];
}
}
@@ -274,8 +293,10 @@ final class ManagerRegler
/**
* @param list<int|array{Von_W: int, Bis_W: int}> $leistungswerte
*/
private static function neutralerLeistungswert(array $leistungswerte): int
{
private static function richtungsneutralerLeistungswert(
array $leistungswerte,
bool $positiveRichtung
): int {
$negativ = null;
$positiv = null;
foreach ($leistungswerte as $eintrag) {
@@ -298,14 +319,11 @@ final class ManagerRegler
: $positiv;
}
if ($negativ === null) {
return $positiv;
}
if ($positiv === null) {
return $negativ;
if ($positiveRichtung) {
return $positiv ?? $negativ;
}
return abs($negativ) <= abs($positiv) ? $negativ : $positiv;
return $negativ ?? $positiv;
}
/**
@@ -361,6 +379,6 @@ final class ManagerRegler
return max($eintrag['Von_W'], $untergrenze);
}
return self::neutralerLeistungswert($leistungswerte);
return self::richtungsneutralerLeistungswert($leistungswerte, false);
}
}