This commit is contained in:
+67
-2
@@ -180,6 +180,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
$this->RegisterVariableFloat('Netzleistung', 'Netzleistung', '', 30);
|
||||
|
||||
$this->RegisterAttributeString('VerbraucherCache', '{}');
|
||||
$this->RegisterAttributeString('VerbraucherEnergie', '{}');
|
||||
$this->RegisterAttributeString('LetzteSollwerte', '{}');
|
||||
$this->RegisterAttributeString('LetztePvGrenzen', '{}');
|
||||
$this->RegisterAttributeString('Netzfahrplan', '{}');
|
||||
@@ -603,15 +604,78 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
throw new InvalidArgumentException('Der Absender ist diesem Manager nicht aktiv zugeordnet.');
|
||||
}
|
||||
|
||||
$jetzt = time();
|
||||
$this->aktualisiereVerbraucherEnergie($absenderID, $daten, $jetzt);
|
||||
|
||||
$cache = $this->leseJsonAttribut('VerbraucherCache');
|
||||
$cache[(string) $absenderID] = [
|
||||
'EmpfangenAm' => time(),
|
||||
'EmpfangenAm' => $jetzt,
|
||||
'Daten' => $daten,
|
||||
];
|
||||
$this->WriteAttributeString('VerbraucherCache', json_encode($cache, JSON_THROW_ON_ERROR));
|
||||
$this->regeln(false);
|
||||
}
|
||||
|
||||
/** @param array<string, mixed> $daten */
|
||||
private function aktualisiereVerbraucherEnergie(int $instanzID, array $daten, int $jetzt): void
|
||||
{
|
||||
$energien = $this->leseJsonAttribut('VerbraucherEnergie');
|
||||
$bisher = $energien[(string) $instanzID] ?? [];
|
||||
$energieWh = is_array($bisher) && is_numeric($bisher['Energie_Wh'] ?? null)
|
||||
? (float) $bisher['Energie_Wh']
|
||||
: 0.0;
|
||||
$letzterZeitpunkt = is_array($bisher) && is_int($bisher['Zeitpunkt'] ?? null)
|
||||
? $bisher['Zeitpunkt']
|
||||
: 0;
|
||||
$letzteLeistung = is_array($bisher) && is_numeric($bisher['Leistung_W'] ?? null)
|
||||
? (float) $bisher['Leistung_W']
|
||||
: 0.0;
|
||||
|
||||
if ($letzterZeitpunkt > 0 && $jetzt > $letzterZeitpunkt) {
|
||||
$dauer = min(
|
||||
$jetzt - $letzterZeitpunkt,
|
||||
$this->ReadPropertyInteger('VerbraucherTimeout')
|
||||
);
|
||||
$energieWh += $letzteLeistung * $dauer / 3600.0;
|
||||
}
|
||||
|
||||
$energien[(string) $instanzID] = [
|
||||
'Energie_Wh' => $energieWh,
|
||||
'Zeitpunkt' => $jetzt,
|
||||
'Leistung_W' => $this->verbraucherleistung($daten),
|
||||
];
|
||||
$this->WriteAttributeString(
|
||||
'VerbraucherEnergie',
|
||||
json_encode($energien, JSON_THROW_ON_ERROR)
|
||||
);
|
||||
}
|
||||
|
||||
/** @param array<string, mixed> $daten */
|
||||
private function verbraucherleistung(array $daten): float
|
||||
{
|
||||
if ($daten['Leistungsquelle'] !== Nachrichtenvertrag::LEISTUNGSQUELLE_NICHT_VORHANDEN
|
||||
&& is_numeric($daten['Istleistung_W'])
|
||||
) {
|
||||
return (float) $daten['Istleistung_W'];
|
||||
}
|
||||
|
||||
return (float) (ManagerRegler::angenommenerSollwert($daten) ?? 0);
|
||||
}
|
||||
|
||||
/** @return array<int, float> */
|
||||
private function bezogeneVerbraucherEnergienWh(): array
|
||||
{
|
||||
$ergebnis = [];
|
||||
foreach ($this->leseJsonAttribut('VerbraucherEnergie') as $instanzID => $eintrag) {
|
||||
if (!is_array($eintrag) || !is_numeric($eintrag['Energie_Wh'] ?? null)) {
|
||||
continue;
|
||||
}
|
||||
$ergebnis[(int) $instanzID] = (float) $eintrag['Energie_Wh'];
|
||||
}
|
||||
|
||||
return $ergebnis;
|
||||
}
|
||||
|
||||
private function regeln(bool $erneuern): void
|
||||
{
|
||||
if (!$this->aktualisiereLizenzfreigabe($this->ReadPropertyString('Lizenzcode'), false)) {
|
||||
@@ -699,7 +763,8 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
||||
$netzleistung,
|
||||
$zielnetzleistung,
|
||||
$verbraucher,
|
||||
$betriebsart === ManagerRegler::BETRIEBSART_PEAK ? 'PrioritaetPeak' : 'PrioritaetPV'
|
||||
$betriebsart === ManagerRegler::BETRIEBSART_PEAK ? 'PrioritaetPeak' : 'PrioritaetPV',
|
||||
$this->bezogeneVerbraucherEnergienWh()
|
||||
);
|
||||
$this->setzeDiagnosewert('Verteilbudget', (float) $ergebnis['Verteilbudget_W']);
|
||||
$this->setzeDiagnosewert('Verbraucherstatus', json_encode([
|
||||
|
||||
Reference in New Issue
Block a user