fix(manager): Batterie nach Prioritaet als Restverbraucher regeln
Tests / test (push) Canceled after 0s

This commit is contained in:
dh
2026-09-30 05:42:13 +00:00
parent bfdcf4536b
commit add1077674
3 changed files with 15 additions and 76 deletions
+4 -47
View File
@@ -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<array{InstanzID: int, Daten: array<string, mixed>}> $verbraucher
* @return list<int>
*/
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 {