feat(manager): Energievisualisierung und Synchronisierung erweitern
Tests / test (push) Successful in 50s
Tests / test (push) Successful in 50s
This commit is contained in:
+611
-62
@@ -55,6 +55,38 @@ trait ManagerEnergieTrait
|
||||
}
|
||||
}
|
||||
|
||||
foreach (IPS_GetChildrenIDs($this->InstanceID) as $variableID) {
|
||||
$objekt = IPS_GetObject($variableID);
|
||||
$ident = (string) ($objekt['ObjectIdent'] ?? '');
|
||||
if ((int) ($objekt['ObjectType'] ?? -1) !== 2
|
||||
|| !str_starts_with($ident, 'Diagramm')
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
$istEnergie = str_contains($ident, 'Energie')
|
||||
|| str_contains($ident, 'BatterieLaden_')
|
||||
|| str_contains($ident, 'BatterieEntladen_');
|
||||
AC_SetLoggingStatus($archivID, $variableID, $aktiv);
|
||||
AC_SetAggregationType($archivID, $variableID, $istEnergie ? 1 : 0);
|
||||
AC_SetGraphStatus($archivID, $variableID, $aktiv);
|
||||
$regeln = [-1 => $istEnergie ? $energietyp : $leistungstyp];
|
||||
$verdichten = $istEnergie
|
||||
? $this->ReadPropertyInteger('EnergieVerdichtenMonate')
|
||||
: 0;
|
||||
if ($verdichten > 0) {
|
||||
$regeln[$verdichten] = 3;
|
||||
}
|
||||
$loeschen = $istEnergie
|
||||
? $this->ReadPropertyInteger('EnergieLoeschenMonate')
|
||||
: $this->ReadPropertyInteger('LeistungLoeschenMonate');
|
||||
if ($loeschen > 0) {
|
||||
$regeln[$loeschen] = 7;
|
||||
}
|
||||
if ($aktiv && $this->setzeVerdichtung($archivID, $variableID, $regeln)) {
|
||||
$geaendert[] = $variableID;
|
||||
}
|
||||
}
|
||||
|
||||
IPS_ApplyChanges($archivID);
|
||||
foreach (array_unique($geaendert) as $variableID) {
|
||||
AC_ReAggregateVariable($archivID, $variableID);
|
||||
@@ -129,6 +161,7 @@ trait ManagerEnergieTrait
|
||||
}
|
||||
$this->entferneDiagrammUnterobjekt('Leistungsdiagramm');
|
||||
$this->entferneDiagrammUnterobjekt('Energiediagramm');
|
||||
$this->WriteAttributeString('EnergiediagrammKonfiguration', '{}');
|
||||
}
|
||||
|
||||
private function synchronisiereFunFacts(bool $anzeigen): void
|
||||
@@ -154,17 +187,18 @@ trait ManagerEnergieTrait
|
||||
return;
|
||||
}
|
||||
$instanzID = $this->findeUnterobjekt('Energiefluss');
|
||||
if ($instanzID === 0) {
|
||||
return;
|
||||
if ($instanzID !== 0) {
|
||||
$objekt = IPS_GetObject($instanzID);
|
||||
$modulID = $objekt['ObjectType'] === 1
|
||||
? (string) IPS_GetInstance($instanzID)['ModuleInfo']['ModuleID']
|
||||
: '';
|
||||
if ($modulID !== self::ENERGY_FLOW_MODULE_ID) {
|
||||
throw new RuntimeException('Unterobjekt Energiefluss hat einen unpassenden Typ.');
|
||||
}
|
||||
IPS_SetHidden($instanzID, true);
|
||||
}
|
||||
$objekt = IPS_GetObject($instanzID);
|
||||
$modulID = $objekt['ObjectType'] === 1
|
||||
? (string) IPS_GetInstance($instanzID)['ModuleInfo']['ModuleID']
|
||||
: '';
|
||||
if ($modulID !== self::ENERGY_FLOW_MODULE_ID) {
|
||||
throw new RuntimeException('Unterobjekt Energiefluss hat einen unpassenden Typ.');
|
||||
}
|
||||
IPS_SetHidden($instanzID, true);
|
||||
$this->WriteAttributeString('EnergieflussKonfiguration', '{}');
|
||||
$this->WriteAttributeBoolean('EnergieflussNeuErzeugen', true);
|
||||
}
|
||||
|
||||
private function entferneInstanzUnterobjekt(string $ident, string $modulID): void
|
||||
@@ -216,6 +250,9 @@ trait ManagerEnergieTrait
|
||||
if ($modulID !== self::ENERGY_PIE_MODULE_ID) {
|
||||
throw new RuntimeException('Unterobjekt EnergyPie hat einen unpassenden Typ.');
|
||||
}
|
||||
IPS_SetHidden($instanzID, false);
|
||||
|
||||
return 'Bestehende Energy-Pie-Konfiguration bleibt unveraendert.';
|
||||
}
|
||||
IPS_SetName($instanzID, 'Energy Pie');
|
||||
IPS_SetPosition($instanzID, 500);
|
||||
@@ -239,6 +276,7 @@ trait ManagerEnergieTrait
|
||||
if (!in_array(self::ENERGY_FLOW_MODULE_ID, IPS_GetModuleList(), true)) {
|
||||
throw new RuntimeException('Das Symcon-Modul Energy Distribution ist nicht installiert.');
|
||||
}
|
||||
$neuErzeugen = $this->ReadAttributeBoolean('EnergieflussNeuErzeugen');
|
||||
$instanzID = $this->findeUnterobjekt('Energiefluss');
|
||||
if ($instanzID === 0) {
|
||||
$instanzID = IPS_CreateInstance(self::ENERGY_FLOW_MODULE_ID);
|
||||
@@ -252,7 +290,15 @@ trait ManagerEnergieTrait
|
||||
if ($modulID !== self::ENERGY_FLOW_MODULE_ID) {
|
||||
throw new RuntimeException('Unterobjekt Energiefluss hat einen unpassenden Typ.');
|
||||
}
|
||||
if (!$neuErzeugen) {
|
||||
$this->visualisierungsKonfiguration('EnergieflussKonfiguration');
|
||||
IPS_SetHidden($instanzID, false);
|
||||
$this->aktualisiereEnergieflusswerte();
|
||||
|
||||
return 'Bestehende Energiefluss-Konfiguration bleibt unveraendert.';
|
||||
}
|
||||
}
|
||||
$this->visualisierungsKonfiguration('EnergieflussKonfiguration');
|
||||
IPS_SetName($instanzID, 'Energiefluss');
|
||||
IPS_SetPosition($instanzID, 540);
|
||||
IPS_SetHidden($instanzID, false);
|
||||
@@ -289,7 +335,6 @@ trait ManagerEnergieTrait
|
||||
$this->energieflussKnoten($netzID, 'Stromnetz', 'grid'),
|
||||
$this->energieflussKnoten($hausID, 'Hausverbrauch', 'consumer'),
|
||||
];
|
||||
$hatBatterieverbraucher = false;
|
||||
$position = 640;
|
||||
foreach ($verbraucher as $eintrag) {
|
||||
$istID = $this->energieflussLeistungsvariable(
|
||||
@@ -311,17 +356,13 @@ trait ManagerEnergieTrait
|
||||
true,
|
||||
$sollID
|
||||
);
|
||||
$hatBatterieverbraucher = $hatBatterieverbraucher
|
||||
|| $eintrag['Typ'] === 'storage';
|
||||
$position += 10;
|
||||
}
|
||||
if (!$hatBatterieverbraucher) {
|
||||
$knoten[] = $this->energieflussKnoten(
|
||||
$batterieID,
|
||||
'Batteriespeicher',
|
||||
'storage'
|
||||
);
|
||||
}
|
||||
$knoten[] = $this->energieflussKnoten(
|
||||
$batterieID,
|
||||
'Batteriespeicher',
|
||||
'storage'
|
||||
);
|
||||
|
||||
IPS_SetProperty($instanzID, 'Calculation', true);
|
||||
IPS_SetProperty(
|
||||
@@ -332,6 +373,7 @@ trait ManagerEnergieTrait
|
||||
IPS_SetProperty($instanzID, 'EnableLimits', false);
|
||||
IPS_SetProperty($instanzID, 'Restrictions', '[]');
|
||||
IPS_ApplyChanges($instanzID);
|
||||
$this->WriteAttributeBoolean('EnergieflussNeuErzeugen', false);
|
||||
$this->aktualisiereEnergieflusswerte($verbraucher);
|
||||
|
||||
return 'Der Energiefluss wurde erstellt oder aktualisiert.';
|
||||
@@ -360,7 +402,10 @@ trait ManagerEnergieTrait
|
||||
|
||||
private function energieflussLeistungsprofil(): string
|
||||
{
|
||||
if ($this->ReadPropertyInteger('EnergieflussLeistungseinheit') !== 1) {
|
||||
$konfiguration = $this->visualisierungsKonfiguration(
|
||||
'EnergieflussKonfiguration'
|
||||
);
|
||||
if ($konfiguration['EnergieflussLeistungseinheit'] !== 1) {
|
||||
return '~Power';
|
||||
}
|
||||
|
||||
@@ -388,18 +433,55 @@ trait ManagerEnergieTrait
|
||||
return $variableID;
|
||||
}
|
||||
|
||||
/** @return array<string, bool|int> */
|
||||
private function visualisierungsKonfiguration(string $attribut): array
|
||||
{
|
||||
$konfiguration = $this->leseJsonAttribut($attribut);
|
||||
$gueltig = isset(
|
||||
$konfiguration['DiagrammPVModus'],
|
||||
$konfiguration['DiagrammBatterieModus'],
|
||||
$konfiguration['LadestationenSeparatAnzeigen'],
|
||||
$konfiguration['VerbraucherSeparatAnzeigen'],
|
||||
$konfiguration['EnergieflussLeistungseinheit']
|
||||
);
|
||||
if ($gueltig) {
|
||||
return $konfiguration;
|
||||
}
|
||||
|
||||
$konfiguration = [
|
||||
'DiagrammPVModus' => $this->ReadPropertyInteger('DiagrammPVModus'),
|
||||
'DiagrammBatterieModus' => $this->ReadPropertyInteger('DiagrammBatterieModus'),
|
||||
'LadestationenSeparatAnzeigen' =>
|
||||
$this->ReadPropertyBoolean('LadestationenSeparatAnzeigen'),
|
||||
'VerbraucherSeparatAnzeigen' =>
|
||||
$this->ReadPropertyBoolean('VerbraucherSeparatAnzeigen'),
|
||||
'EnergieflussLeistungseinheit' =>
|
||||
$this->ReadPropertyInteger('EnergieflussLeistungseinheit'),
|
||||
];
|
||||
$this->WriteAttributeString(
|
||||
$attribut,
|
||||
json_encode($konfiguration, JSON_THROW_ON_ERROR)
|
||||
);
|
||||
|
||||
return $konfiguration;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list<array{
|
||||
* InstanzID: int,
|
||||
* Name: string,
|
||||
* Typ: string,
|
||||
* Istleistung_W: float,
|
||||
* Sollleistung_W: float
|
||||
* Sollleistung_W: float,
|
||||
* Energie_Wh: float
|
||||
* }>
|
||||
*/
|
||||
private function energieflussVerbraucher(): array
|
||||
{
|
||||
private function energieflussVerbraucher(
|
||||
string $konfigurationsAttribut = 'EnergieflussKonfiguration'
|
||||
): array {
|
||||
$konfiguration = $this->visualisierungsKonfiguration($konfigurationsAttribut);
|
||||
$cache = $this->leseJsonAttribut('VerbraucherCache');
|
||||
$energien = $this->leseJsonAttribut('VerbraucherEnergie');
|
||||
$ergebnis = [];
|
||||
foreach ($this->konfigurierteAktiveVerbraucherIDs() as $instanzID) {
|
||||
if (!IPS_InstanceExists($instanzID)) {
|
||||
@@ -416,17 +498,30 @@ trait ManagerEnergieTrait
|
||||
(string) IPS_GetInstance($instanzID)['ModuleInfo']['ModuleID']
|
||||
);
|
||||
$katalog = self::VERBRAUCHER_LIZENZEN[$modulID]['Katalog'] ?? '';
|
||||
if ($katalog === 'battery') {
|
||||
continue;
|
||||
}
|
||||
if ($katalog === 'ev_charger'
|
||||
&& !$konfiguration['LadestationenSeparatAnzeigen']
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if ($katalog !== 'ev_charger'
|
||||
&& !$konfiguration['VerbraucherSeparatAnzeigen']
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
$verbraucherEnergie = $energien[(string) $instanzID]['Energie_Wh'] ?? 0.0;
|
||||
|
||||
$ergebnis[] = [
|
||||
'InstanzID' => $instanzID,
|
||||
'Name' => IPS_GetName($instanzID),
|
||||
'Typ' => match ($katalog) {
|
||||
'battery' => 'storage',
|
||||
'ev_charger' => 'wallbox',
|
||||
default => 'consumer',
|
||||
},
|
||||
'Typ' => $katalog === 'ev_charger' ? 'wallbox' : 'consumer',
|
||||
'Istleistung_W' => $istleistung,
|
||||
'Sollleistung_W' => $sollleistung,
|
||||
'Energie_Wh' => is_numeric($verbraucherEnergie)
|
||||
? (float) $verbraucherEnergie
|
||||
: 0.0,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -443,7 +538,6 @@ trait ManagerEnergieTrait
|
||||
}
|
||||
$verbraucher = $verbraucher ?? $this->energieflussVerbraucher();
|
||||
$verbraucherleistung = 0.0;
|
||||
$hatBatterieverbraucher = false;
|
||||
foreach ($verbraucher as $eintrag) {
|
||||
$this->setzeEnergieflussLeistungswert(
|
||||
'EnergieflussIst_' . $eintrag['InstanzID'],
|
||||
@@ -453,11 +547,7 @@ trait ManagerEnergieTrait
|
||||
'EnergieflussSoll_' . $eintrag['InstanzID'],
|
||||
(float) $eintrag['Sollleistung_W']
|
||||
);
|
||||
if ($eintrag['Typ'] === 'storage') {
|
||||
$hatBatterieverbraucher = true;
|
||||
} else {
|
||||
$verbraucherleistung += max(0.0, (float) $eintrag['Istleistung_W']);
|
||||
}
|
||||
$verbraucherleistung += max(0.0, (float) $eintrag['Istleistung_W']);
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -472,12 +562,10 @@ trait ManagerEnergieTrait
|
||||
'EnergieflussHaus',
|
||||
max(0.0, $leistungen['Haus'] - $verbraucherleistung)
|
||||
);
|
||||
if (!$hatBatterieverbraucher) {
|
||||
$this->setzeEnergieflussLeistungswert(
|
||||
'EnergieflussBatterie',
|
||||
$leistungen['Batterie']
|
||||
);
|
||||
}
|
||||
$this->setzeEnergieflussLeistungswert(
|
||||
'EnergieflussBatterie',
|
||||
$leistungen['Batterie']
|
||||
);
|
||||
}
|
||||
|
||||
private function setzeEnergieflussLeistungswert(string $ident, float $watt): void
|
||||
@@ -486,33 +574,487 @@ trait ManagerEnergieTrait
|
||||
if (!is_int($variableID) || $variableID <= 0 || !IPS_VariableExists($variableID)) {
|
||||
return;
|
||||
}
|
||||
$faktor = $this->ReadPropertyInteger('EnergieflussLeistungseinheit') === 1
|
||||
? 0.001
|
||||
: 1.0;
|
||||
$konfiguration = $this->visualisierungsKonfiguration(
|
||||
'EnergieflussKonfiguration'
|
||||
);
|
||||
$faktor = $konfiguration['EnergieflussLeistungseinheit'] === 1 ? 0.001 : 1.0;
|
||||
SetValue($variableID, $watt * $faktor);
|
||||
}
|
||||
|
||||
private function erstelleEnergiediagramme(): string
|
||||
{
|
||||
$leistung = [
|
||||
$this->chartDatensatz('PVLeistungArchiv', 'PV', '#F4C542', '~Power'),
|
||||
$this->chartDatensatz('HausverbrauchLeistungArchiv', 'Haus', '#22A06B', '~Power'),
|
||||
$this->chartDatensatz('NetzleistungArchiv', 'Netz', '#E95D5D', '~Power'),
|
||||
$this->chartDatensatz('BatterieleistungArchiv', 'Batterie', '#8B5CF6', '~Power'),
|
||||
];
|
||||
$energie = [
|
||||
$this->chartDatensatz('PVEnergie', 'PV', '#F4C542', '~Electricity'),
|
||||
$this->chartDatensatz('Hausenergie', 'Haus', '#22A06B', '~Electricity'),
|
||||
$this->chartDatensatz('NetzbezugEnergie', 'Netzbezug', '#E95D5D', '~Electricity'),
|
||||
$this->chartDatensatz('EinspeisungEnergie', 'Einspeisung', '#2F80ED', '~Electricity'),
|
||||
$this->chartDatensatz('BatterieLadenEnergie', 'Batterie laden', '#8B5CF6', '~Electricity'),
|
||||
$this->chartDatensatz('BatterieEntladenEnergie', 'Batterie entladen', '#F59E0B', '~Electricity'),
|
||||
];
|
||||
$konfiguration = $this->visualisierungsKonfiguration(
|
||||
'EnergiediagrammKonfiguration'
|
||||
);
|
||||
$pvAnlagen = $this->diagrammPVAnlagen();
|
||||
$batterien = $this->diagrammBatterien();
|
||||
$verbraucher = $this->energieflussVerbraucher(
|
||||
'EnergiediagrammKonfiguration'
|
||||
);
|
||||
$this->registriereDiagrammVariablen($pvAnlagen, $batterien, $verbraucher);
|
||||
$this->aktualisiereDiagrammMesswerte(true);
|
||||
|
||||
$leistung = [];
|
||||
$energie = [];
|
||||
if ($konfiguration['DiagrammPVModus'] !== 1) {
|
||||
$leistung[] = $this->chartDatensatz(
|
||||
'PVLeistungArchiv',
|
||||
'PV gesamt',
|
||||
'#F4C542',
|
||||
'~Power'
|
||||
);
|
||||
$energie[] = $this->chartDatensatz(
|
||||
'PVEnergie',
|
||||
'PV gesamt',
|
||||
'#F4C542',
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
}
|
||||
if ($konfiguration['DiagrammPVModus'] !== 0) {
|
||||
foreach ($pvAnlagen as $index => $anlage) {
|
||||
$farbe = $this->diagrammFarbe($index);
|
||||
if ($anlage['LeistungVariableID'] > 0) {
|
||||
$leistung[] = $this->chartDatensatz(
|
||||
$anlage['LeistungIdent'],
|
||||
$anlage['Name'],
|
||||
$farbe,
|
||||
'~Power'
|
||||
);
|
||||
}
|
||||
if ($anlage['EnergieVariableID'] > 0) {
|
||||
$energie[] = $this->chartDatensatz(
|
||||
$anlage['EnergieIdent'],
|
||||
$anlage['Name'],
|
||||
$farbe,
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$hausTitel = $verbraucher === [] ? 'Haus' : 'Haus ohne separat dargestellte Verbraucher';
|
||||
$leistung[] = $this->chartDatensatz(
|
||||
'DiagrammHausLeistung',
|
||||
$hausTitel,
|
||||
'#22A06B',
|
||||
'~Power'
|
||||
);
|
||||
$leistung[] = $this->chartDatensatz(
|
||||
'NetzleistungArchiv',
|
||||
'Netz',
|
||||
'#E95D5D',
|
||||
'~Power'
|
||||
);
|
||||
$energie[] = $this->chartDatensatz(
|
||||
'DiagrammHausEnergie',
|
||||
$hausTitel,
|
||||
'#22A06B',
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
$energie[] = $this->chartDatensatz(
|
||||
'NetzbezugEnergie',
|
||||
'Netzbezug',
|
||||
'#E95D5D',
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
$energie[] = $this->chartDatensatz(
|
||||
'EinspeisungEnergie',
|
||||
'Netzeinspeisung',
|
||||
'#2F80ED',
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
|
||||
if ($konfiguration['DiagrammBatterieModus'] !== 1) {
|
||||
$leistung[] = $this->chartDatensatz(
|
||||
'BatterieleistungArchiv',
|
||||
'Batterie gesamt',
|
||||
'#8B5CF6',
|
||||
'~Power'
|
||||
);
|
||||
$energie[] = $this->chartDatensatz(
|
||||
'BatterieLadenEnergie',
|
||||
'Batterie laden gesamt',
|
||||
'#8B5CF6',
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
$energie[] = $this->chartDatensatz(
|
||||
'BatterieEntladenEnergie',
|
||||
'Batterie entladen gesamt',
|
||||
'#F59E0B',
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
}
|
||||
if ($konfiguration['DiagrammBatterieModus'] !== 0) {
|
||||
foreach ($batterien as $index => $batterie) {
|
||||
$farbe = $this->diagrammFarbe($index + count($pvAnlagen));
|
||||
if ($batterie['LeistungVariableID'] > 0) {
|
||||
$leistung[] = $this->chartDatensatz(
|
||||
$batterie['LeistungIdent'],
|
||||
$batterie['Name'],
|
||||
$farbe,
|
||||
'~Power'
|
||||
);
|
||||
}
|
||||
if ($batterie['LadeenergieVariableID'] > 0) {
|
||||
$energie[] = $this->chartDatensatz(
|
||||
$batterie['LadeenergieIdent'],
|
||||
$batterie['Name'] . ' laden',
|
||||
$farbe,
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
}
|
||||
if ($batterie['EntladeenergieVariableID'] > 0) {
|
||||
$energie[] = $this->chartDatensatz(
|
||||
$batterie['EntladeenergieIdent'],
|
||||
$batterie['Name'] . ' entladen',
|
||||
$farbe,
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($verbraucher as $index => $eintrag) {
|
||||
$farbe = $this->diagrammFarbe(
|
||||
$index + count($pvAnlagen) + count($batterien)
|
||||
);
|
||||
$leistung[] = $this->chartDatensatz(
|
||||
'DiagrammVerbraucherLeistung_' . $eintrag['InstanzID'],
|
||||
$eintrag['Name'],
|
||||
$farbe,
|
||||
'~Power'
|
||||
);
|
||||
$energie[] = $this->chartDatensatz(
|
||||
'DiagrammVerbraucherEnergie_' . $eintrag['InstanzID'],
|
||||
$eintrag['Name'],
|
||||
$farbe,
|
||||
'~Electricity',
|
||||
'bar'
|
||||
);
|
||||
}
|
||||
|
||||
$this->erstelleDiagramm('Leistungsdiagramm', 'Leistungen', $leistung, 510);
|
||||
$this->erstelleDiagramm('Energiediagramm', 'Energien', $energie, 520);
|
||||
|
||||
return 'Die Diagramme Leistungen und Energien wurden erstellt oder aktualisiert.';
|
||||
}
|
||||
/** @return list<array<string, mixed>> */
|
||||
private function diagrammPVAnlagen(): array
|
||||
{
|
||||
$verwendet = [];
|
||||
foreach ($this->leseAnlagenKonfigurationsliste('AnlagenPVFlaechen') as $flaeche) {
|
||||
$wechselrichterID = trim((string) ($flaeche['WechselrichterID'] ?? ''));
|
||||
if ($wechselrichterID !== '') {
|
||||
$verwendet[$wechselrichterID] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$ergebnis = [];
|
||||
foreach ($this->leseAnlagenKonfigurationsliste('AnlagenWechselrichter') as $eintrag) {
|
||||
$id = trim((string) ($eintrag['ID'] ?? ''));
|
||||
if ($id === '' || ($verwendet !== [] && !isset($verwendet[$id]))) {
|
||||
continue;
|
||||
}
|
||||
if ($verwendet === []
|
||||
&& !in_array((string) ($eintrag['Typ'] ?? ''), ['pv', 'hybrid'], true)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
$suffix = substr(hash('sha256', 'pv:' . $id), 0, 12);
|
||||
$leistungID = (int) ($eintrag['IstleistungVariableID'] ?? 0);
|
||||
$energieID = (int) ($eintrag['ErzeugungsenergieVariableID'] ?? 0);
|
||||
$ergebnis[] = [
|
||||
'Name' => trim((string) ($eintrag['Name'] ?? '')) ?: $id,
|
||||
'LeistungVariableID' => $this->istNumerischeVariable($leistungID)
|
||||
? $leistungID
|
||||
: 0,
|
||||
'Leistungsfaktor' => (float) ($eintrag['Istleistungsfaktor'] ?? 1.0),
|
||||
'EnergieVariableID' => $this->istNumerischeVariable($energieID)
|
||||
? $energieID
|
||||
: 0,
|
||||
'Energiefaktor' => (float) ($eintrag['Erzeugungsenergiefaktor'] ?? 1.0),
|
||||
'LeistungIdent' => 'DiagrammPVLeistung_' . $suffix,
|
||||
'EnergieIdent' => 'DiagrammPVEnergie_' . $suffix,
|
||||
];
|
||||
}
|
||||
|
||||
return $ergebnis;
|
||||
}
|
||||
|
||||
/** @return list<array<string, mixed>> */
|
||||
private function diagrammBatterien(): array
|
||||
{
|
||||
$ergebnis = [];
|
||||
foreach ($this->leseAnlagenKonfigurationsliste('AnlagenBatterien') as $eintrag) {
|
||||
$id = trim((string) ($eintrag['ID'] ?? ''));
|
||||
if ($id === '') {
|
||||
continue;
|
||||
}
|
||||
$suffix = substr(hash('sha256', 'batterie:' . $id), 0, 12);
|
||||
$leistungID = (int) ($eintrag['LeistungVariableID'] ?? 0);
|
||||
$ladenID = (int) ($eintrag['LadeenergieVariableID'] ?? 0);
|
||||
$entladenID = (int) ($eintrag['EntladeenergieVariableID'] ?? 0);
|
||||
$ergebnis[] = [
|
||||
'Name' => trim((string) ($eintrag['Name'] ?? '')) ?: $id,
|
||||
'LeistungVariableID' => $this->istNumerischeVariable($leistungID)
|
||||
? $leistungID
|
||||
: 0,
|
||||
'Leistungsfaktor' => (float) ($eintrag['Leistungsfaktor'] ?? 1.0),
|
||||
'LadeenergieVariableID' => $this->istNumerischeVariable($ladenID)
|
||||
? $ladenID
|
||||
: 0,
|
||||
'EntladeenergieVariableID' => $this->istNumerischeVariable($entladenID)
|
||||
? $entladenID
|
||||
: 0,
|
||||
'Energiefaktor' => (float) ($eintrag['Energiefaktor'] ?? 1.0),
|
||||
'LeistungIdent' => 'DiagrammBatterieLeistung_' . $suffix,
|
||||
'LadeenergieIdent' => 'DiagrammBatterieLaden_' . $suffix,
|
||||
'EntladeenergieIdent' => 'DiagrammBatterieEntladen_' . $suffix,
|
||||
];
|
||||
}
|
||||
|
||||
return $ergebnis;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param list<array<string, mixed>> $pvAnlagen
|
||||
* @param list<array<string, mixed>> $batterien
|
||||
* @param list<array<string, mixed>> $verbraucher
|
||||
*/
|
||||
private function registriereDiagrammVariablen(
|
||||
array $pvAnlagen,
|
||||
array $batterien,
|
||||
array $verbraucher
|
||||
): void {
|
||||
$position = 800;
|
||||
$this->diagrammMessvariable(
|
||||
'DiagrammHausLeistung',
|
||||
'Diagramm Hausleistung',
|
||||
'~Power',
|
||||
$position
|
||||
);
|
||||
$this->diagrammMessvariable(
|
||||
'DiagrammHausEnergie',
|
||||
'Diagramm Hausenergie',
|
||||
'~Electricity',
|
||||
$position + 1
|
||||
);
|
||||
$position += 10;
|
||||
|
||||
foreach ($pvAnlagen as $anlage) {
|
||||
if ($anlage['LeistungVariableID'] > 0) {
|
||||
$this->diagrammMessvariable(
|
||||
$anlage['LeistungIdent'],
|
||||
$anlage['Name'] . ' Leistung',
|
||||
'~Power',
|
||||
$position
|
||||
);
|
||||
}
|
||||
if ($anlage['EnergieVariableID'] > 0) {
|
||||
$this->diagrammMessvariable(
|
||||
$anlage['EnergieIdent'],
|
||||
$anlage['Name'] . ' Energie',
|
||||
'~Electricity',
|
||||
$position + 1
|
||||
);
|
||||
}
|
||||
$position += 10;
|
||||
}
|
||||
foreach ($batterien as $batterie) {
|
||||
if ($batterie['LeistungVariableID'] > 0) {
|
||||
$this->diagrammMessvariable(
|
||||
$batterie['LeistungIdent'],
|
||||
$batterie['Name'] . ' Leistung',
|
||||
'~Power',
|
||||
$position
|
||||
);
|
||||
}
|
||||
if ($batterie['LadeenergieVariableID'] > 0) {
|
||||
$this->diagrammMessvariable(
|
||||
$batterie['LadeenergieIdent'],
|
||||
$batterie['Name'] . ' Ladeenergie',
|
||||
'~Electricity',
|
||||
$position + 1
|
||||
);
|
||||
}
|
||||
if ($batterie['EntladeenergieVariableID'] > 0) {
|
||||
$this->diagrammMessvariable(
|
||||
$batterie['EntladeenergieIdent'],
|
||||
$batterie['Name'] . ' Entladeenergie',
|
||||
'~Electricity',
|
||||
$position + 2
|
||||
);
|
||||
}
|
||||
$position += 10;
|
||||
}
|
||||
foreach ($verbraucher as $eintrag) {
|
||||
$this->diagrammMessvariable(
|
||||
'DiagrammVerbraucherLeistung_' . $eintrag['InstanzID'],
|
||||
$eintrag['Name'] . ' Leistung',
|
||||
'~Power',
|
||||
$position
|
||||
);
|
||||
$this->diagrammMessvariable(
|
||||
'DiagrammVerbraucherEnergie_' . $eintrag['InstanzID'],
|
||||
$eintrag['Name'] . ' Energie',
|
||||
'~Electricity',
|
||||
$position + 1
|
||||
);
|
||||
$position += 10;
|
||||
}
|
||||
}
|
||||
|
||||
private function diagrammMessvariable(
|
||||
string $ident,
|
||||
string $name,
|
||||
string $profil,
|
||||
int $position
|
||||
): int {
|
||||
$this->RegisterVariableFloat($ident, $name, $profil, $position);
|
||||
$variableID = $this->GetIDForIdent($ident);
|
||||
IPS_SetHidden($variableID, true);
|
||||
|
||||
return $variableID;
|
||||
}
|
||||
|
||||
private function aktualisiereDiagrammMesswerte(bool $energieAktualisieren = false): void
|
||||
{
|
||||
if ($this->findeUnterobjekt('Leistungsdiagramm') === 0
|
||||
&& $this->findeUnterobjekt('Energiediagramm') === 0
|
||||
&& $this->findeUnterobjekt('DiagrammHausLeistung') === 0
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$leistungen = $this->leseMessleistungen();
|
||||
$pvAnlagen = $this->diagrammPVAnlagen();
|
||||
$batterien = $this->diagrammBatterien();
|
||||
$verbraucher = $this->energieflussVerbraucher(
|
||||
'EnergiediagrammKonfiguration'
|
||||
);
|
||||
} catch (Throwable $fehler) {
|
||||
$this->protokolliere('Energiediagramme', $fehler->getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
$separateLeistung = 0.0;
|
||||
$separateEnergieKWh = 0.0;
|
||||
foreach ($verbraucher as $eintrag) {
|
||||
$leistung = max(0.0, (float) $eintrag['Istleistung_W']);
|
||||
$separateLeistung += $leistung;
|
||||
$separateEnergieKWh += max(0.0, (float) $eintrag['Energie_Wh']) / 1000.0;
|
||||
$this->setzeDiagrammMesswert(
|
||||
'DiagrammVerbraucherLeistung_' . $eintrag['InstanzID'],
|
||||
$leistung
|
||||
);
|
||||
if ($energieAktualisieren) {
|
||||
$this->setzeDiagrammMesswert(
|
||||
'DiagrammVerbraucherEnergie_' . $eintrag['InstanzID'],
|
||||
max(0.0, (float) $eintrag['Energie_Wh']) / 1000.0
|
||||
);
|
||||
}
|
||||
}
|
||||
$this->setzeDiagrammMesswert(
|
||||
'DiagrammHausLeistung',
|
||||
max(0.0, $leistungen['Haus'] - $separateLeistung)
|
||||
);
|
||||
if ($energieAktualisieren) {
|
||||
$this->setzeDiagrammMesswert(
|
||||
'DiagrammHausEnergie',
|
||||
max(
|
||||
0.0,
|
||||
(float) $this->GetValue('Hausenergie') - $separateEnergieKWh
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
foreach ($pvAnlagen as $anlage) {
|
||||
if ($anlage['LeistungVariableID'] > 0) {
|
||||
$this->setzeDiagrammMesswert(
|
||||
$anlage['LeistungIdent'],
|
||||
max(
|
||||
0.0,
|
||||
(float) GetValue($anlage['LeistungVariableID'])
|
||||
* $anlage['Leistungsfaktor']
|
||||
)
|
||||
);
|
||||
}
|
||||
if ($energieAktualisieren && $anlage['EnergieVariableID'] > 0) {
|
||||
$this->setzeDiagrammMesswert(
|
||||
$anlage['EnergieIdent'],
|
||||
max(
|
||||
0.0,
|
||||
(float) GetValue($anlage['EnergieVariableID'])
|
||||
* $anlage['Energiefaktor']
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
foreach ($batterien as $batterie) {
|
||||
if ($batterie['LeistungVariableID'] > 0) {
|
||||
$this->setzeDiagrammMesswert(
|
||||
$batterie['LeistungIdent'],
|
||||
(float) GetValue($batterie['LeistungVariableID'])
|
||||
* $batterie['Leistungsfaktor']
|
||||
);
|
||||
}
|
||||
if ($energieAktualisieren && $batterie['LadeenergieVariableID'] > 0) {
|
||||
$this->setzeDiagrammMesswert(
|
||||
$batterie['LadeenergieIdent'],
|
||||
max(
|
||||
0.0,
|
||||
(float) GetValue($batterie['LadeenergieVariableID'])
|
||||
* $batterie['Energiefaktor']
|
||||
)
|
||||
);
|
||||
}
|
||||
if ($energieAktualisieren && $batterie['EntladeenergieVariableID'] > 0) {
|
||||
$this->setzeDiagrammMesswert(
|
||||
$batterie['EntladeenergieIdent'],
|
||||
max(
|
||||
0.0,
|
||||
(float) GetValue($batterie['EntladeenergieVariableID'])
|
||||
* $batterie['Energiefaktor']
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function setzeDiagrammMesswert(string $ident, float $wert): void
|
||||
{
|
||||
$variableID = @IPS_GetObjectIDByIdent($ident, $this->InstanceID);
|
||||
if (is_int($variableID) && $variableID > 0 && IPS_VariableExists($variableID)) {
|
||||
SetValue($variableID, $wert);
|
||||
}
|
||||
}
|
||||
|
||||
private function diagrammFarbe(int $index): string
|
||||
{
|
||||
$farben = [
|
||||
'#A85D3C',
|
||||
'#007C91',
|
||||
'#6B5B95',
|
||||
'#2E7D32',
|
||||
'#C43E1C',
|
||||
'#3D5A80',
|
||||
'#8D6E63',
|
||||
'#00897B',
|
||||
];
|
||||
|
||||
return $farben[$index % count($farben)];
|
||||
}
|
||||
|
||||
/** @param list<array<string, mixed>> $datensaetze */
|
||||
private function erstelleDiagramm(
|
||||
string $ident,
|
||||
@@ -521,7 +1063,8 @@ trait ManagerEnergieTrait
|
||||
int $position
|
||||
): int {
|
||||
$medienID = $this->findeUnterobjekt($ident);
|
||||
if ($medienID === 0) {
|
||||
$neu = $medienID === 0;
|
||||
if ($neu) {
|
||||
$medienID = IPS_CreateMedia(4);
|
||||
IPS_SetParent($medienID, $this->InstanceID);
|
||||
IPS_SetIdent($medienID, $ident);
|
||||
@@ -530,6 +1073,11 @@ trait ManagerEnergieTrait
|
||||
if ($objekt['ObjectType'] !== 5 || (int) IPS_GetMedia($medienID)['MediaType'] !== 4) {
|
||||
throw new RuntimeException('Unterobjekt ' . $ident . ' ist kein Diagramm.');
|
||||
}
|
||||
if (!$neu) {
|
||||
IPS_SetHidden($medienID, false);
|
||||
|
||||
return $medienID;
|
||||
}
|
||||
IPS_SetName($medienID, $name);
|
||||
IPS_SetPosition($medienID, $position);
|
||||
IPS_SetHidden($medienID, false);
|
||||
@@ -546,16 +1094,17 @@ trait ManagerEnergieTrait
|
||||
string $ident,
|
||||
string $titel,
|
||||
string $farbe,
|
||||
string $profil
|
||||
string $profil,
|
||||
string $typ = 'line'
|
||||
): array {
|
||||
return [
|
||||
'variableID' => $this->GetIDForIdent($ident),
|
||||
'fillColor' => 'clear',
|
||||
'fillColor' => $typ === 'bar' ? $farbe : 'clear',
|
||||
'strokeColor' => $farbe,
|
||||
'timeOffset' => 0,
|
||||
'visible' => true,
|
||||
'title' => $titel,
|
||||
'type' => 'line',
|
||||
'type' => $typ,
|
||||
'side' => 'left',
|
||||
'profile' => $profil,
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user