From add1077674f4802875fec6f0169a63d5718c42a2 Mon Sep 17 00:00:00 2001 From: dh_Agent Date: Wed, 30 Sep 2026 05:42:13 +0000 Subject: [PATCH] fix(manager): Batterie nach Prioritaet als Restverbraucher regeln --- Manager/module.php | 51 +++---------------------------------- libs/ManagerRegler.php | 24 +++-------------- tests/ManagerReglerTest.php | 16 +++++------- 3 files changed, 15 insertions(+), 76 deletions(-) diff --git a/Manager/module.php b/Manager/module.php index 0c9a076..eb6e07a 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -761,27 +761,13 @@ class Manager extends IPSModule implements ManagerSchnittstelle $fahrplanVorgabe = $this->aktuelleNetzfahrplanVorgabe(); $zielnetzleistung = $betriebsart === ManagerRegler::BETRIEBSART_PEAK ? (float) $lastspitzengrenze - : ($fahrplanVorgabe['Netzleistung_W'] - ?? $this->ReadPropertyFloat('SollwertSolarladen')); - $vorgegebeneSollwerte = []; - if ($betriebsart !== ManagerRegler::BETRIEBSART_PEAK - && is_array($fahrplanVorgabe) - && is_float($fahrplanVorgabe['Batterieleistung_W']) - ) { - $batterieIDs = $this->aktiveBatterieVerbraucherIDs($verbraucher); - if (count($batterieIDs) === 1) { - $vorgegebeneSollwerte[$batterieIDs[0]] = (int) round( - $fahrplanVorgabe['Batterieleistung_W'] - ); - } - } + : ($fahrplanVorgabe ?? $this->ReadPropertyFloat('SollwertSolarladen')); $ergebnis = ManagerRegler::verteile( $netzleistung, $zielnetzleistung, $verbraucher, $betriebsart === ManagerRegler::BETRIEBSART_PEAK ? 'PrioritaetPeak' : 'PrioritaetPV', - $this->bezogeneVerbraucherEnergienWh(), - $vorgegebeneSollwerte + $this->bezogeneVerbraucherEnergienWh() ); $this->setzeDiagnosewert('Verteilbudget', (float) $ergebnis['Verteilbudget_W']); $this->setzeDiagnosewert('Verbraucherstatus', json_encode([ @@ -2754,8 +2740,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle && $this->aktuelleBatterieSoc() !== null; } - /** @return array{Netzleistung_W: float, Batterieleistung_W: ?float}|null */ - private function aktuelleNetzfahrplanVorgabe(): ?array + private function aktuelleNetzfahrplanVorgabe(): ?float { if (!$this->ReadPropertyBoolean('NetzfahrplanAktiv')) { return null; @@ -2789,42 +2774,14 @@ class Manager extends IPSModule implements ManagerSchnittstelle } $abstand = abs($zeitpunkt - $jetzt); if ($abstand < $naechsterAbstand) { - $batteryTarget = $punkt['batteryTargetW'] ?? null; $naechsterAbstand = $abstand; - $vorgabe = [ - 'Netzleistung_W' => (float) $punkt['gridTargetW'], - 'Batterieleistung_W' => is_int($batteryTarget) || is_float($batteryTarget) - ? (float) $batteryTarget - : null, - ]; + $vorgabe = (float) $punkt['gridTargetW']; } } return $naechsterAbstand <= 1800 ? $vorgabe : null; } - /** - * @param list}> $verbraucher - * @return list - */ - private function aktiveBatterieVerbraucherIDs(array $verbraucher): array - { - $ids = []; - foreach ($verbraucher as $eintrag) { - $instanzID = $eintrag['InstanzID']; - if (!IPS_InstanceExists($instanzID)) { - continue; - } - $instanz = IPS_GetInstance($instanzID); - $moduleID = strtoupper((string) ($instanz['ModuleInfo']['ModuleID'] ?? '')); - if ((self::VERBRAUCHER_LIZENZEN[$moduleID]['Katalog'] ?? null) === 'battery') { - $ids[] = $instanzID; - } - } - - return $ids; - } - private function synchronisiereAnlagentopologie(): void { try { diff --git a/libs/ManagerRegler.php b/libs/ManagerRegler.php index e448e14..c7aff6b 100644 --- a/libs/ManagerRegler.php +++ b/libs/ManagerRegler.php @@ -106,8 +106,7 @@ final class ManagerRegler float $zielnetzleistung, array $verbraucher, string $prioritaetsfeld, - array $bezogeneEnergieWh = [], - array $vorgegebeneSollwerte = [] + array $bezogeneEnergieWh = [] ): array { if (!in_array($prioritaetsfeld, ['PrioritaetPV', 'PrioritaetPeak'], true)) { throw new InvalidArgumentException('Unbekanntes Prioritaetsfeld.'); @@ -130,13 +129,7 @@ final class ManagerRegler $festwert = self::istFestwert($daten['Leistungswerte_W']); $festgehalten = !$daten['AenderungMoeglich']; - $vorgegebenerSollwert = $vorgegebeneSollwerte[$eintrag['InstanzID']] ?? null; - $vorgegeben = is_int($vorgegebenerSollwert) - && Nachrichtenvertrag::enthaeltLeistungswert( - $daten['Leistungswerte_W'], - $vorgegebenerSollwert - ); - if (($festwert || $festgehalten) && !$vorgegeben) { + if ($festwert || $festgehalten) { $nichtSteuerbar += $leistung; } @@ -153,8 +146,6 @@ final class ManagerRegler 'Leistungswerte_W' => $daten['Leistungswerte_W'], 'Festwert' => $festwert, 'Festgehalten' => $festgehalten, - 'Vorgegeben' => $vorgegeben, - 'VorgegebenerSollwert' => $vorgegeben ? $vorgegebenerSollwert : null, 'Sollwert' => self::angenommenerSollwert($daten), ]; } @@ -176,11 +167,6 @@ final class ManagerRegler $sollwerte = []; $ausgangssumme = 0; foreach ($steuerbar as $eintrag) { - if ($eintrag['Vorgegeben']) { - $sollwerte[$eintrag['InstanzID']] = $eintrag['VorgegebenerSollwert']; - $ausgangssumme += $eintrag['VorgegebenerSollwert']; - continue; - } if ($eintrag['Festwert']) { $sollwerte[$eintrag['InstanzID']] = self::kleinsterLeistungswert( $eintrag['Leistungswerte_W'] @@ -204,7 +190,7 @@ final class ManagerRegler $rest = $verteilbudget - $nichtSteuerbar - $ausgangssumme; foreach ($steuerbar as $eintrag) { - if ($eintrag['Vorgegeben'] || $eintrag['Festwert'] || $eintrag['Festgehalten']) { + if ($eintrag['Festwert'] || $eintrag['Festgehalten']) { continue; } @@ -233,9 +219,7 @@ final class ManagerRegler $zugeteilt = $nichtSteuerbar; foreach ($steuerbar as $eintrag) { - if ($eintrag['Vorgegeben'] - || (!$eintrag['Festwert'] && !$eintrag['Festgehalten']) - ) { + if (!$eintrag['Festwert'] && !$eintrag['Festgehalten']) { $zugeteilt += $sollwerte[$eintrag['InstanzID']]; } } diff --git a/tests/ManagerReglerTest.php b/tests/ManagerReglerTest.php index 30abd46..d10210a 100644 --- a/tests/ManagerReglerTest.php +++ b/tests/ManagerReglerTest.php @@ -333,26 +333,24 @@ final class ManagerReglerTest extends TestCase self::assertSame(-3000, $ergebnis['Restabweichung_W']); } - public function testExpliziterBatteriefahrplanBleibtVonAnderenVerbrauchernUnveraendert(): void + public function testBatterieMitTieferPrioritaetUebernimmtNichtNutzbarenRest(): void { $ergebnis = ManagerRegler::verteile( + -5000.0, 0.0, - 1000.0, [ + $this->verbraucher(20, 1, [0, 3000, 6000], 0), $this->verbraucher( 10, - 0, - [['Von_W' => -5000, 'Bis_W' => 5000]], + 6, + [['Von_W' => 0, 'Bis_W' => 10000]], 0 ), - $this->verbraucher(20, 1, [0, 3000], 0), ], - 'PrioritaetPV', - [], - [10 => 1000] + 'PrioritaetPV' ); - self::assertSame([10 => 1000, 20 => 0], $ergebnis['Sollwerte']); + self::assertSame([20 => 3000, 10 => 2000], $ergebnis['Sollwerte']); self::assertSame(0, $ergebnis['Restabweichung_W']); }