This commit is contained in:
+47
-4
@@ -761,13 +761,27 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
$fahrplanVorgabe = $this->aktuelleNetzfahrplanVorgabe();
|
||||
$zielnetzleistung = $betriebsart === ManagerRegler::BETRIEBSART_PEAK
|
||||
? (float) $lastspitzengrenze
|
||||
: ($fahrplanVorgabe ?? $this->ReadPropertyFloat('SollwertSolarladen'));
|
||||
: ($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']
|
||||
);
|
||||
}
|
||||
}
|
||||
$ergebnis = ManagerRegler::verteile(
|
||||
$netzleistung,
|
||||
$zielnetzleistung,
|
||||
$verbraucher,
|
||||
$betriebsart === ManagerRegler::BETRIEBSART_PEAK ? 'PrioritaetPeak' : 'PrioritaetPV',
|
||||
$this->bezogeneVerbraucherEnergienWh()
|
||||
$this->bezogeneVerbraucherEnergienWh(),
|
||||
$vorgegebeneSollwerte
|
||||
);
|
||||
$this->setzeDiagnosewert('Verteilbudget', (float) $ergebnis['Verteilbudget_W']);
|
||||
$this->setzeDiagnosewert('Verbraucherstatus', json_encode([
|
||||
@@ -2740,7 +2754,8 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
&& $this->aktuelleBatterieSoc() !== null;
|
||||
}
|
||||
|
||||
private function aktuelleNetzfahrplanVorgabe(): ?float
|
||||
/** @return array{Netzleistung_W: float, Batterieleistung_W: ?float}|null */
|
||||
private function aktuelleNetzfahrplanVorgabe(): ?array
|
||||
{
|
||||
if (!$this->ReadPropertyBoolean('NetzfahrplanAktiv')) {
|
||||
return null;
|
||||
@@ -2774,14 +2789,42 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
}
|
||||
$abstand = abs($zeitpunkt - $jetzt);
|
||||
if ($abstand < $naechsterAbstand) {
|
||||
$batteryTarget = $punkt['batteryTargetW'] ?? null;
|
||||
$naechsterAbstand = $abstand;
|
||||
$vorgabe = (float) $punkt['gridTargetW'];
|
||||
$vorgabe = [
|
||||
'Netzleistung_W' => (float) $punkt['gridTargetW'],
|
||||
'Batterieleistung_W' => is_int($batteryTarget) || is_float($batteryTarget)
|
||||
? (float) $batteryTarget
|
||||
: null,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user