This commit is contained in:
+24
-12
@@ -1,5 +1,16 @@
|
|||||||
{
|
{
|
||||||
"elements": [
|
"elements": [
|
||||||
|
{
|
||||||
|
"type": "ExpansionPanel",
|
||||||
|
"caption": "Lizenzierung",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"type": "ValidationTextBox",
|
||||||
|
"name": "LizenzAnschluss",
|
||||||
|
"caption": "Konfiguration als JSON"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "ExpansionPanel",
|
"type": "ExpansionPanel",
|
||||||
"caption": "Grundeinstellungen",
|
"caption": "Grundeinstellungen",
|
||||||
@@ -103,6 +114,13 @@
|
|||||||
"caption": "Suchbereich",
|
"caption": "Suchbereich",
|
||||||
"visible": true
|
"visible": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "Button",
|
||||||
|
"name": "VerbraucherAktualisieren",
|
||||||
|
"caption": "Verbraucher aktualisieren",
|
||||||
|
"visible": true,
|
||||||
|
"onClick": "IPS_RequestAction($id, 'FormVerbraucherAktualisieren', json_encode(['SuchbereichID' => $SuchbereichID, 'Zuordnung' => $AutomatischeVerbraucherZuordnung]));"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "List",
|
"type": "List",
|
||||||
"name": "VerbraucherZuordnung",
|
"name": "VerbraucherZuordnung",
|
||||||
@@ -203,10 +221,15 @@
|
|||||||
"caption": "Netzleistungsfaktor",
|
"caption": "Netzleistungsfaktor",
|
||||||
"digits": 4
|
"digits": 4
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "CheckBox",
|
||||||
|
"name": "DiagnosevariablenAnzeigen",
|
||||||
|
"caption": "Diagnosevariablen anlegen"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "CheckBox",
|
"type": "CheckBox",
|
||||||
"name": "LoggingEin",
|
"name": "LoggingEin",
|
||||||
"caption": "Logging ein"
|
"caption": "Laufendes Debug-Logging aktivieren"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -232,17 +255,6 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"type": "ExpansionPanel",
|
|
||||||
"caption": "Lizenzierung",
|
|
||||||
"items": [
|
|
||||||
{
|
|
||||||
"type": "ValidationTextBox",
|
|
||||||
"name": "LizenzAnschluss",
|
|
||||||
"caption": "Konfiguration als JSON"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "ExpansionPanel",
|
"type": "ExpansionPanel",
|
||||||
"caption": "Stoerueberwachung",
|
"caption": "Stoerueberwachung",
|
||||||
|
|||||||
+144
-49
@@ -18,11 +18,27 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
private const VM_UPDATE = 10603;
|
private const VM_UPDATE = 10603;
|
||||||
private const VERBRAUCHER_MODUL_IDS = [
|
private const VERBRAUCHER_MODUL_IDS = [
|
||||||
'{B7C54AF4-AD7D-4FE4-B75D-203693906251}',
|
'{B7C54AF4-AD7D-4FE4-B75D-203693906251}',
|
||||||
|
'{15879A4E-D0C2-4495-83DE-46E1E462591E}',
|
||||||
];
|
];
|
||||||
private const MONATSNAMEN = [
|
private const MONATSNAMEN = [
|
||||||
1 => 'Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni',
|
1 => 'Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni',
|
||||||
'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember',
|
'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember',
|
||||||
];
|
];
|
||||||
|
private const DIAGNOSE_VARIABLEN = [
|
||||||
|
'NetzleistungGueltig',
|
||||||
|
'WirksameLastspitzengrenze',
|
||||||
|
'Verteilbudget',
|
||||||
|
'VerbraucherAnzahl',
|
||||||
|
'VerbraucherVerfuegbar',
|
||||||
|
'Verbraucherstatus',
|
||||||
|
'Monatsgrenzen',
|
||||||
|
'Prognosestatus',
|
||||||
|
'SDLStatus',
|
||||||
|
'Lizenzstatus',
|
||||||
|
'Stoerueberwachungsstatus',
|
||||||
|
'Sammelstoerung',
|
||||||
|
'Stoertext',
|
||||||
|
];
|
||||||
|
|
||||||
public function Create(): void
|
public function Create(): void
|
||||||
{
|
{
|
||||||
@@ -47,25 +63,13 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
$this->RegisterPropertyString('SDLAnschluss', '{}');
|
$this->RegisterPropertyString('SDLAnschluss', '{}');
|
||||||
$this->RegisterPropertyString('LizenzAnschluss', '{}');
|
$this->RegisterPropertyString('LizenzAnschluss', '{}');
|
||||||
$this->RegisterPropertyString('StoermeldeAnschluss', '{}');
|
$this->RegisterPropertyString('StoermeldeAnschluss', '{}');
|
||||||
|
$this->RegisterPropertyBoolean('DiagnosevariablenAnzeigen', false);
|
||||||
$this->RegisterPropertyBoolean('LoggingEin', false);
|
$this->RegisterPropertyBoolean('LoggingEin', false);
|
||||||
|
|
||||||
$this->RegisterVariableBoolean('Aktiv', 'Aktiv', '~Switch', 10);
|
$this->RegisterVariableBoolean('Aktiv', 'Aktiv', '~Switch', 10);
|
||||||
$this->EnableAction('Aktiv');
|
$this->EnableAction('Aktiv');
|
||||||
$this->RegisterVariableString('Betriebsart', 'Betriebsart', '', 20);
|
$this->RegisterVariableString('Betriebsart', 'Betriebsart', '', 20);
|
||||||
$this->RegisterVariableFloat('Netzleistung', 'Netzleistung', '', 30);
|
$this->RegisterVariableFloat('Netzleistung', 'Netzleistung', '', 30);
|
||||||
$this->RegisterVariableBoolean('NetzleistungGueltig', 'Netzleistung gueltig', '~Switch', 40);
|
|
||||||
$this->RegisterVariableFloat('WirksameLastspitzengrenze', 'Wirksame Lastspitzengrenze', '', 50);
|
|
||||||
$this->RegisterVariableFloat('Verteilbudget', 'Verteilbudget', '', 60);
|
|
||||||
$this->RegisterVariableInteger('VerbraucherAnzahl', 'Verbraucher Anzahl', '', 70);
|
|
||||||
$this->RegisterVariableInteger('VerbraucherVerfuegbar', 'Verbraucher verfuegbar', '', 80);
|
|
||||||
$this->RegisterVariableString('Verbraucherstatus', 'Verbraucherstatus', '', 90);
|
|
||||||
$this->RegisterVariableString('Monatsgrenzen', 'Monatsgrenzen', '', 100);
|
|
||||||
$this->RegisterVariableString('Prognosestatus', 'Prognosestatus', '', 110);
|
|
||||||
$this->RegisterVariableString('SDLStatus', 'SDL-Status', '', 120);
|
|
||||||
$this->RegisterVariableString('Lizenzstatus', 'Lizenzstatus', '', 130);
|
|
||||||
$this->RegisterVariableString('Stoerueberwachungsstatus', 'Stoerueberwachungsstatus', '', 140);
|
|
||||||
$this->RegisterVariableBoolean('Sammelstoerung', 'Sammelstoerung', '~Alert', 150);
|
|
||||||
$this->RegisterVariableString('Stoertext', 'Stoertext', '', 160);
|
|
||||||
|
|
||||||
$this->RegisterAttributeString('VerbraucherCache', '{}');
|
$this->RegisterAttributeString('VerbraucherCache', '{}');
|
||||||
$this->RegisterAttributeString('LetzteSollwerte', '{}');
|
$this->RegisterAttributeString('LetzteSollwerte', '{}');
|
||||||
@@ -85,6 +89,8 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
{
|
{
|
||||||
parent::ApplyChanges();
|
parent::ApplyChanges();
|
||||||
|
|
||||||
|
$this->aktualisiereVariablen();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->pruefeKonfiguration();
|
$this->pruefeKonfiguration();
|
||||||
} catch (Throwable $fehler) {
|
} catch (Throwable $fehler) {
|
||||||
@@ -100,8 +106,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
$this->SetTimerInterval('Regelzyklus', 0);
|
$this->SetTimerInterval('Regelzyklus', 0);
|
||||||
$this->SetTimerInterval('VorgabenErneuern', 0);
|
$this->SetTimerInterval('VorgabenErneuern', 0);
|
||||||
$this->SetTimerInterval('KeepAlive', $this->ReadPropertyInteger('KeepAlive') * 1000);
|
$this->SetTimerInterval('KeepAlive', $this->ReadPropertyInteger('KeepAlive') * 1000);
|
||||||
$this->SetValue('Monatsgrenzen', $this->ReadPropertyString('Monatsgrenzen'));
|
$this->setzeDiagnosewert('Monatsgrenzen', $this->ReadPropertyString('Monatsgrenzen'));
|
||||||
$this->aktualisiereSichtbarkeit();
|
|
||||||
$this->aktualisiereAnschlussstatus();
|
$this->aktualisiereAnschlussstatus();
|
||||||
$this->SetStatus(self::STATUS_AKTIV);
|
$this->SetStatus(self::STATUS_AKTIV);
|
||||||
}
|
}
|
||||||
@@ -127,6 +132,12 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
$automatisch
|
$automatisch
|
||||||
);
|
);
|
||||||
$this->setzeFormularParameter($formular['elements'], 'SuchbereichID', 'visible', $automatisch);
|
$this->setzeFormularParameter($formular['elements'], 'SuchbereichID', 'visible', $automatisch);
|
||||||
|
$this->setzeFormularParameter(
|
||||||
|
$formular['elements'],
|
||||||
|
'VerbraucherAktualisieren',
|
||||||
|
'visible',
|
||||||
|
$automatisch
|
||||||
|
);
|
||||||
$this->setzeFormularParameter(
|
$this->setzeFormularParameter(
|
||||||
$formular['elements'],
|
$formular['elements'],
|
||||||
'AutomatischeVerbraucherZuordnung',
|
'AutomatischeVerbraucherZuordnung',
|
||||||
@@ -193,6 +204,30 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
$this->UpdateFormField('VerbraucherZuordnung', 'visible', !$automatisch);
|
$this->UpdateFormField('VerbraucherZuordnung', 'visible', !$automatisch);
|
||||||
$this->UpdateFormField('AutomatischeVerbraucherZuordnung', 'visible', $automatisch);
|
$this->UpdateFormField('AutomatischeVerbraucherZuordnung', 'visible', $automatisch);
|
||||||
$this->UpdateFormField('SuchbereichID', 'visible', $automatisch);
|
$this->UpdateFormField('SuchbereichID', 'visible', $automatisch);
|
||||||
|
$this->UpdateFormField('VerbraucherAktualisieren', 'visible', $automatisch);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 'FormVerbraucherAktualisieren':
|
||||||
|
if (!is_string($wert)) {
|
||||||
|
throw new InvalidArgumentException('Suchparameter muessen als JSON uebergeben werden.');
|
||||||
|
}
|
||||||
|
$suchparameter = json_decode($wert, true, 512, JSON_THROW_ON_ERROR);
|
||||||
|
if (!is_array($suchparameter) || !is_array($suchparameter['Zuordnung'] ?? null)) {
|
||||||
|
throw new InvalidArgumentException('Suchparameter sind ungueltig.');
|
||||||
|
}
|
||||||
|
$suchbereichID = $suchparameter['SuchbereichID'] ?? 0;
|
||||||
|
if (!is_int($suchbereichID)) {
|
||||||
|
throw new InvalidArgumentException('SuchbereichID muss eine Ganzzahl sein.');
|
||||||
|
}
|
||||||
|
$werte = $this->automatischeVerbraucherFuerFormular(
|
||||||
|
$suchparameter['Zuordnung'],
|
||||||
|
$suchbereichID
|
||||||
|
);
|
||||||
|
$this->UpdateFormField(
|
||||||
|
'AutomatischeVerbraucherZuordnung',
|
||||||
|
'values',
|
||||||
|
json_encode($werte, JSON_THROW_ON_ERROR)
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case 'FormLastspitzenmodus':
|
case 'FormLastspitzenmodus':
|
||||||
@@ -265,12 +300,12 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
{
|
{
|
||||||
[$netzleistung, $netzleistungGueltig] = $this->leseNetzleistung();
|
[$netzleistung, $netzleistungGueltig] = $this->leseNetzleistung();
|
||||||
$this->SetValue('Netzleistung', $netzleistung);
|
$this->SetValue('Netzleistung', $netzleistung);
|
||||||
$this->SetValue('NetzleistungGueltig', $netzleistungGueltig);
|
$this->setzeDiagnosewert('NetzleistungGueltig', $netzleistungGueltig);
|
||||||
|
|
||||||
$aktiv = (bool) $this->GetValue('Aktiv');
|
$aktiv = (bool) $this->GetValue('Aktiv');
|
||||||
if (!$aktiv || !$netzleistungGueltig) {
|
if (!$aktiv || !$netzleistungGueltig) {
|
||||||
$this->SetValue('Betriebsart', ManagerRegler::BETRIEBSART_INAKTIV);
|
$this->SetValue('Betriebsart', ManagerRegler::BETRIEBSART_INAKTIV);
|
||||||
$this->SetValue('Verteilbudget', 0.0);
|
$this->setzeDiagnosewert('Verteilbudget', 0.0);
|
||||||
$this->SetStatus($aktiv ? self::STATUS_MESSWERT_UNGUELTIG : self::STATUS_AKTIV);
|
$this->SetStatus($aktiv ? self::STATUS_MESSWERT_UNGUELTIG : self::STATUS_AKTIV);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -305,9 +340,9 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->SetValue('Betriebsart', $betriebsart);
|
$this->SetValue('Betriebsart', $betriebsart);
|
||||||
$this->SetValue('WirksameLastspitzengrenze', $lastspitzengrenze ?? 0.0);
|
$this->setzeDiagnosewert('WirksameLastspitzengrenze', $lastspitzengrenze ?? 0.0);
|
||||||
$this->SetValue('Verteilbudget', (float) $ergebnis['Verteilbudget_W']);
|
$this->setzeDiagnosewert('Verteilbudget', (float) $ergebnis['Verteilbudget_W']);
|
||||||
$this->SetValue('Verbraucherstatus', json_encode([
|
$this->setzeDiagnosewert('Verbraucherstatus', json_encode([
|
||||||
'Betriebsart' => $betriebsart,
|
'Betriebsart' => $betriebsart,
|
||||||
'Restabweichung_W' => $ergebnis['Restabweichung_W'],
|
'Restabweichung_W' => $ergebnis['Restabweichung_W'],
|
||||||
'Verbraucher' => $verbraucher,
|
'Verbraucher' => $verbraucher,
|
||||||
@@ -358,7 +393,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
private function aktuelleVerbraucher(array &$stoerungen): array
|
private function aktuelleVerbraucher(array &$stoerungen): array
|
||||||
{
|
{
|
||||||
$ids = $this->aktiveVerbraucherIDs();
|
$ids = $this->aktiveVerbraucherIDs();
|
||||||
$this->SetValue('VerbraucherAnzahl', count($ids));
|
$this->setzeDiagnosewert('VerbraucherAnzahl', count($ids));
|
||||||
$cache = $this->leseJsonAttribut('VerbraucherCache');
|
$cache = $this->leseJsonAttribut('VerbraucherCache');
|
||||||
$timeout = $this->ReadPropertyInteger('VerbraucherTimeout');
|
$timeout = $this->ReadPropertyInteger('VerbraucherTimeout');
|
||||||
$aktuell = [];
|
$aktuell = [];
|
||||||
@@ -377,7 +412,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
}
|
}
|
||||||
|
|
||||||
$verfuegbar = array_filter($aktuell, static fn (array $eintrag): bool => $eintrag['Daten']['Verfuegbar']);
|
$verfuegbar = array_filter($aktuell, static fn (array $eintrag): bool => $eintrag['Daten']['Verfuegbar']);
|
||||||
$this->SetValue('VerbraucherVerfuegbar', count($verfuegbar));
|
$this->setzeDiagnosewert('VerbraucherVerfuegbar', count($verfuegbar));
|
||||||
|
|
||||||
return $aktuell;
|
return $aktuell;
|
||||||
}
|
}
|
||||||
@@ -411,6 +446,15 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
throw new InvalidArgumentException($property . ' muss eine JSON-Liste sein.');
|
throw new InvalidArgumentException($property . ' muss eine JSON-Liste sein.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $this->aktiveVerbraucherIDsAusZuordnung($zuordnung);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param list<array<string, mixed>> $zuordnung
|
||||||
|
* @return list<int>
|
||||||
|
*/
|
||||||
|
private function aktiveVerbraucherIDsAusZuordnung(array $zuordnung): array
|
||||||
|
{
|
||||||
$ids = [];
|
$ids = [];
|
||||||
foreach ($zuordnung as $eintrag) {
|
foreach ($zuordnung as $eintrag) {
|
||||||
if (!is_array($eintrag)) {
|
if (!is_array($eintrag)) {
|
||||||
@@ -428,20 +472,29 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
return array_values(array_unique($ids));
|
return array_values(array_unique($ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return list<array{Name: string, InstanzID: int, Aktiv: bool}> */
|
/**
|
||||||
private function automatischeVerbraucherFuerFormular(): array
|
* @param list<array<string, mixed>>|null $aktuelleZuordnung
|
||||||
{
|
* @return list<array{Name: string, InstanzID: int, Aktiv: bool}>
|
||||||
$gespeichert = json_decode(
|
*/
|
||||||
$this->ReadPropertyString('AutomatischeVerbraucherZuordnung'),
|
private function automatischeVerbraucherFuerFormular(
|
||||||
true,
|
?array $aktuelleZuordnung = null,
|
||||||
512,
|
?int $suchbereichID = null
|
||||||
JSON_THROW_ON_ERROR
|
): array {
|
||||||
);
|
if ($aktuelleZuordnung === null) {
|
||||||
$ausgewaehlt = $gespeichert === []
|
$gespeichert = json_decode(
|
||||||
? $this->leseAktiveVerbraucherIDs('VerbraucherZuordnung')
|
$this->ReadPropertyString('AutomatischeVerbraucherZuordnung'),
|
||||||
: $this->leseAktiveVerbraucherIDs('AutomatischeVerbraucherZuordnung');
|
true,
|
||||||
|
512,
|
||||||
|
JSON_THROW_ON_ERROR
|
||||||
|
);
|
||||||
|
$ausgewaehlt = $gespeichert === []
|
||||||
|
? $this->leseAktiveVerbraucherIDs('VerbraucherZuordnung')
|
||||||
|
: $this->aktiveVerbraucherIDsAusZuordnung($gespeichert);
|
||||||
|
} else {
|
||||||
|
$ausgewaehlt = $this->aktiveVerbraucherIDsAusZuordnung($aktuelleZuordnung);
|
||||||
|
}
|
||||||
|
|
||||||
$suchbereichID = $this->ReadPropertyInteger('SuchbereichID');
|
$suchbereichID ??= $this->ReadPropertyInteger('SuchbereichID');
|
||||||
$werte = [];
|
$werte = [];
|
||||||
foreach (self::VERBRAUCHER_MODUL_IDS as $modulID) {
|
foreach (self::VERBRAUCHER_MODUL_IDS as $modulID) {
|
||||||
foreach (IPS_GetInstanceListByModuleID($modulID) as $instanzID) {
|
foreach (IPS_GetInstanceListByModuleID($modulID) as $instanzID) {
|
||||||
@@ -558,8 +611,8 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$stoerungen = array_values(array_unique($stoerungen));
|
$stoerungen = array_values(array_unique($stoerungen));
|
||||||
$this->SetValue('Sammelstoerung', $stoerungen !== []);
|
$this->setzeDiagnosewert('Sammelstoerung', $stoerungen !== []);
|
||||||
$this->SetValue('Stoertext', implode("\n", $stoerungen));
|
$this->setzeDiagnosewert('Stoertext', implode("\n", $stoerungen));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function registriereNetzleistungsmeldung(): void
|
private function registriereNetzleistungsmeldung(): void
|
||||||
@@ -575,19 +628,61 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
$this->WriteAttributeInteger('RegistrierteNetzleistungVariableID', $neu);
|
$this->WriteAttributeInteger('RegistrierteNetzleistungVariableID', $neu);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function aktualisiereSichtbarkeit(): void
|
private function aktualisiereVariablen(): void
|
||||||
{
|
{
|
||||||
$logging = $this->ReadPropertyBoolean('LoggingEin');
|
if ($this->ReadPropertyBoolean('DiagnosevariablenAnzeigen')) {
|
||||||
foreach ([
|
$this->RegisterVariableBoolean(
|
||||||
'NetzleistungGueltig', 'WirksameLastspitzengrenze', 'Verteilbudget',
|
'NetzleistungGueltig',
|
||||||
'VerbraucherAnzahl', 'VerbraucherVerfuegbar', 'Verbraucherstatus',
|
'Netzleistung gueltig',
|
||||||
'Prognosestatus', 'SDLStatus', 'Lizenzstatus',
|
'~Switch',
|
||||||
'Stoerueberwachungsstatus', 'Sammelstoerung', 'Stoertext',
|
40
|
||||||
] as $ident) {
|
);
|
||||||
IPS_SetHidden($this->GetIDForIdent($ident), !$logging);
|
$this->RegisterVariableFloat(
|
||||||
|
'WirksameLastspitzengrenze',
|
||||||
|
'Wirksame Lastspitzengrenze',
|
||||||
|
'',
|
||||||
|
50
|
||||||
|
);
|
||||||
|
$this->RegisterVariableFloat('Verteilbudget', 'Verteilbudget', '', 60);
|
||||||
|
$this->RegisterVariableInteger('VerbraucherAnzahl', 'Verbraucher Anzahl', '', 70);
|
||||||
|
$this->RegisterVariableInteger(
|
||||||
|
'VerbraucherVerfuegbar',
|
||||||
|
'Verbraucher verfuegbar',
|
||||||
|
'',
|
||||||
|
80
|
||||||
|
);
|
||||||
|
$this->RegisterVariableString('Verbraucherstatus', 'Verbraucherstatus', '', 90);
|
||||||
|
$this->RegisterVariableString('Monatsgrenzen', 'Monatsgrenzen', '', 100);
|
||||||
|
$this->RegisterVariableString('Prognosestatus', 'Prognosestatus', '', 110);
|
||||||
|
$this->RegisterVariableString('SDLStatus', 'SDL-Status', '', 120);
|
||||||
|
$this->RegisterVariableString('Lizenzstatus', 'Lizenzstatus', '', 130);
|
||||||
|
$this->RegisterVariableString(
|
||||||
|
'Stoerueberwachungsstatus',
|
||||||
|
'Stoerueberwachungsstatus',
|
||||||
|
'',
|
||||||
|
140
|
||||||
|
);
|
||||||
|
$this->RegisterVariableBoolean('Sammelstoerung', 'Sammelstoerung', '~Alert', 150);
|
||||||
|
$this->RegisterVariableString('Stoertext', 'Stoertext', '', 160);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (self::DIAGNOSE_VARIABLEN as $ident) {
|
||||||
|
$variablenID = @IPS_GetObjectIDByIdent($ident, $this->InstanceID);
|
||||||
|
if (is_int($variablenID) && $variablenID > 0 && IPS_VariableExists($variablenID)) {
|
||||||
|
$this->UnregisterVariable($ident);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param bool|float|int|string $wert */
|
||||||
|
private function setzeDiagnosewert(string $ident, $wert): void
|
||||||
|
{
|
||||||
|
$variablenID = @IPS_GetObjectIDByIdent($ident, $this->InstanceID);
|
||||||
|
if (is_int($variablenID) && $variablenID > 0 && IPS_VariableExists($variablenID)) {
|
||||||
|
$this->SetValue($ident, $wert);
|
||||||
}
|
}
|
||||||
IPS_SetHidden($this->GetIDForIdent('Monatsgrenzen'), true);
|
|
||||||
$this->DisableAction('Monatsgrenzen');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function aktualisiereAnschlussstatus(): void
|
private function aktualisiereAnschlussstatus(): void
|
||||||
@@ -600,7 +695,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
] as $property => $variable) {
|
] as $property => $variable) {
|
||||||
$konfiguration = json_decode($this->ReadPropertyString($property), true, 512, JSON_THROW_ON_ERROR);
|
$konfiguration = json_decode($this->ReadPropertyString($property), true, 512, JSON_THROW_ON_ERROR);
|
||||||
$aktiv = is_array($konfiguration) && ($konfiguration['Aktiv'] ?? false) === true;
|
$aktiv = is_array($konfiguration) && ($konfiguration['Aktiv'] ?? false) === true;
|
||||||
$this->SetValue($variable, $aktiv ? 'Fehler' : 'NichtVerwendet');
|
$this->setzeDiagnosewert($variable, $aktiv ? 'Fehler' : 'NichtVerwendet');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -666,18 +666,18 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
|
|||||||
$ergebnis = [];
|
$ergebnis = [];
|
||||||
foreach (IPS_GetInstanceListByModuleID(self::MANAGER_MODULE_ID) as $managerID) {
|
foreach (IPS_GetInstanceListByModuleID(self::MANAGER_MODULE_ID) as $managerID) {
|
||||||
try {
|
try {
|
||||||
$zuordnung = json_decode(
|
$automatisch = (bool) IPS_GetProperty($managerID, 'AutomatischeSuche');
|
||||||
(string) IPS_GetProperty($managerID, 'VerbraucherZuordnung'),
|
$property = $automatisch
|
||||||
true,
|
? 'AutomatischeVerbraucherZuordnung'
|
||||||
512,
|
: 'VerbraucherZuordnung';
|
||||||
JSON_THROW_ON_ERROR
|
$zuordnung = $this->leseManagerZuordnung($managerID, $property);
|
||||||
);
|
if ($automatisch && $zuordnung === []) {
|
||||||
|
$zuordnung = $this->leseManagerZuordnung($managerID, 'VerbraucherZuordnung');
|
||||||
|
}
|
||||||
} catch (Throwable $fehler) {
|
} catch (Throwable $fehler) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!is_array($zuordnung)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
foreach ($zuordnung as $eintrag) {
|
foreach ($zuordnung as $eintrag) {
|
||||||
if (!is_array($eintrag) || ($eintrag['Aktiv'] ?? false) !== true) {
|
if (!is_array($eintrag) || ($eintrag['Aktiv'] ?? false) !== true) {
|
||||||
continue;
|
continue;
|
||||||
@@ -693,6 +693,19 @@ class VerbraucherWarmwassererwaermer extends IPSModule implements VerbraucherSch
|
|||||||
return array_values(array_unique($ergebnis));
|
return array_values(array_unique($ergebnis));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return array<mixed> */
|
||||||
|
private function leseManagerZuordnung(int $managerID, string $property): array
|
||||||
|
{
|
||||||
|
$zuordnung = json_decode(
|
||||||
|
(string) IPS_GetProperty($managerID, $property),
|
||||||
|
true,
|
||||||
|
512,
|
||||||
|
JSON_THROW_ON_ERROR
|
||||||
|
);
|
||||||
|
|
||||||
|
return is_array($zuordnung) ? $zuordnung : [];
|
||||||
|
}
|
||||||
|
|
||||||
private function pruefeKonfiguration(): void
|
private function pruefeKonfiguration(): void
|
||||||
{
|
{
|
||||||
foreach (['PrioritaetPV', 'PrioritaetPeak'] as $property) {
|
foreach (['PrioritaetPV', 'PrioritaetPeak'] as $property) {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ kommen aus den Verbrauchermeldungen.
|
|||||||
|
|
||||||
## Variablen
|
## Variablen
|
||||||
|
|
||||||
Ohne Logging sind nur `Aktiv`, `Betriebsart` und `Netzleistung` sichtbar.
|
Ohne angelegte Diagnosevariablen existieren nur `Aktiv`, `Betriebsart` und `Netzleistung`.
|
||||||
|
|
||||||
| Ident | Typ / Zugriff | Beschreibung |
|
| Ident | Typ / Zugriff | Beschreibung |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
@@ -51,13 +51,16 @@ Ohne Logging sind nur `Aktiv`, `Betriebsart` und `Netzleistung` sichtbar.
|
|||||||
| `SDLAnschluss` | String/JSON | Optionaler SDL/VGT-Anschluss. |
|
| `SDLAnschluss` | String/JSON | Optionaler SDL/VGT-Anschluss. |
|
||||||
| `LizenzAnschluss` | String/JSON | Optionaler Lizenzanschluss. |
|
| `LizenzAnschluss` | String/JSON | Optionaler Lizenzanschluss. |
|
||||||
| `StoermeldeAnschluss` | String/JSON | Optionaler Anschluss zur Störüberwachung. |
|
| `StoermeldeAnschluss` | String/JSON | Optionaler Anschluss zur Störüberwachung. |
|
||||||
| `LoggingEin` | Boolean | `false`; Protokollierung und zusätzliche Variablen anzeigen. |
|
| `DiagnosevariablenAnzeigen` | Boolean | `false`; zusätzliche Diagnosevariablen anlegen oder entfernen. |
|
||||||
|
| `LoggingEin` | Boolean | `false`; laufende Meldungen im Debug-Fenster ausgeben. |
|
||||||
|
|
||||||
Es gibt keine Sollwertquellenauswahl und keine zweite Prioritätseinstellung im
|
Es gibt keine Sollwertquellenauswahl und keine zweite Prioritätseinstellung im
|
||||||
Manager. Im Modus `Aus` bleibt Solarladen aktiv, nur die Peak-Begrenzung entfällt.
|
Manager. Im Modus `Aus` bleibt Solarladen aktiv, nur die Peak-Begrenzung entfällt.
|
||||||
Die Monatsgrenzen werden in den Grundeinstellungen über eine Schaltfläche
|
Die Monatsgrenzen werden in den Grundeinstellungen über eine Schaltfläche
|
||||||
ein- und ausgeblendet. Die vier optionalen oberen Anschlüsse besitzen jeweils
|
ein- und ausgeblendet. Die automatische Verbrauchersuche kann dort erneut
|
||||||
einen eigenen Bereich.
|
ausgeführt werden, ohne andere ungespeicherte Formulareingaben zu verlieren.
|
||||||
|
Die vier optionalen oberen Anschlüsse besitzen jeweils einen eigenen Bereich;
|
||||||
|
die Lizenzierung steht an erster Stelle des Formulars.
|
||||||
|
|
||||||
## Verteilalgorithmus
|
## Verteilalgorithmus
|
||||||
|
|
||||||
@@ -84,6 +87,7 @@ wenn sich die beiden berechneten Korrekturen nicht ausreichend unterscheiden.
|
|||||||
|
|
||||||
- Netzleistungsänderungen und Verbrauchermeldungen lösen die Berechnung aus.
|
- Netzleistungsänderungen und Verbrauchermeldungen lösen die Berechnung aus.
|
||||||
- Identische Sollwerte werden nur beim Keep-alive erneut gesendet.
|
- Identische Sollwerte werden nur beim Keep-alive erneut gesendet.
|
||||||
|
- Diagnosevariablen und laufendes Debug-Logging werden getrennt aktiviert.
|
||||||
- Verbraucherpakete werden zentral geprüft und nur von aktiv zugeordneten
|
- Verbraucherpakete werden zentral geprüft und nur von aktiv zugeordneten
|
||||||
Absendern angenommen.
|
Absendern angenommen.
|
||||||
- Veraltete oder noch fehlende Verbrauchermeldungen werden nicht verteilt und
|
- Veraltete oder noch fehlende Verbrauchermeldungen werden nicht verteilt und
|
||||||
|
|||||||
@@ -87,7 +87,8 @@ Zustandsablage und funktionieren auch ohne angelegte Diagnosevariablen weiter.
|
|||||||
Das Modul implementiert `VerbraucherSchnittstelle::ManagerdatenEmpfangen()`.
|
Das Modul implementiert `VerbraucherSchnittstelle::ManagerdatenEmpfangen()`.
|
||||||
Der Transport erfolgt wie beim Manager ueber `IPS_RequestAction` mit JSON. Der
|
Der Transport erfolgt wie beim Manager ueber `IPS_RequestAction` mit JSON. Der
|
||||||
Verbraucher besitzt keine Manager-ID-Property. Er ermittelt nur Manager, in
|
Verbraucher besitzt keine Manager-ID-Property. Er ermittelt nur Manager, in
|
||||||
deren `VerbraucherZuordnung` seine Instanz aktiv eingetragen ist.
|
deren manueller oder automatischer Verbraucherzuordnung seine Instanz aktiv
|
||||||
|
eingetragen ist.
|
||||||
|
|
||||||
Die Rueckmeldung erfolgt ereignisbasiert und zusaetzlich alle
|
Die Rueckmeldung erfolgt ereignisbasiert und zusaetzlich alle
|
||||||
`Meldeintervall` Sekunden. Eine Rueckmeldung nach empfangener Vorgabe wird kurz
|
`Meldeintervall` Sekunden. Eine Rueckmeldung nach empfangener Vorgabe wird kurz
|
||||||
|
|||||||
@@ -48,7 +48,9 @@ final class ManagerModulstrukturTest extends TestCase
|
|||||||
'VerbraucherTimeout',
|
'VerbraucherTimeout',
|
||||||
'MesswertMaxAlter',
|
'MesswertMaxAlter',
|
||||||
'Umschaltdifferenz',
|
'Umschaltdifferenz',
|
||||||
|
'DiagnosevariablenAnzeigen',
|
||||||
'LoggingEin',
|
'LoggingEin',
|
||||||
|
'VerbraucherAktualisieren',
|
||||||
] as $property) {
|
] as $property) {
|
||||||
self::assertStringContainsString($property, $json);
|
self::assertStringContainsString($property, $json);
|
||||||
}
|
}
|
||||||
@@ -62,6 +64,29 @@ final class ManagerModulstrukturTest extends TestCase
|
|||||||
) {
|
) {
|
||||||
self::assertStringContainsString($bereich, $json);
|
self::assertStringContainsString($bereich, $json);
|
||||||
}
|
}
|
||||||
|
self::assertSame('Lizenzierung', $formular['elements'][0]['caption']);
|
||||||
|
self::assertStringContainsString(
|
||||||
|
"'SuchbereichID' => \$SuchbereichID",
|
||||||
|
$json
|
||||||
|
);
|
||||||
|
self::assertStringContainsString(
|
||||||
|
"'Zuordnung' => \$AutomatischeVerbraucherZuordnung",
|
||||||
|
$json
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testManagerTrenntDiagnosevariablenUndDebugLogging(): void
|
||||||
|
{
|
||||||
|
$inhalt = (string) file_get_contents(__DIR__ . '/../Manager/module.php');
|
||||||
|
|
||||||
|
self::assertStringContainsString(
|
||||||
|
"RegisterPropertyBoolean('DiagnosevariablenAnzeigen', false)",
|
||||||
|
$inhalt
|
||||||
|
);
|
||||||
|
self::assertStringContainsString("ReadPropertyBoolean('DiagnosevariablenAnzeigen')", $inhalt);
|
||||||
|
self::assertStringContainsString('UnregisterVariable($ident)', $inhalt);
|
||||||
|
self::assertStringContainsString("ReadPropertyBoolean('LoggingEin')", $inhalt);
|
||||||
|
self::assertStringContainsString('SendDebug(', $inhalt);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testManagerVerwendetDieNeuenZeitdefaults(): void
|
public function testManagerVerwendetDieNeuenZeitdefaults(): void
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ final class WarmwassererwaermerModulstrukturTest extends TestCase
|
|||||||
self::assertStringContainsString('Nachrichtenvertrag::pruefeVerbraucherdaten', $inhalt);
|
self::assertStringContainsString('Nachrichtenvertrag::pruefeVerbraucherdaten', $inhalt);
|
||||||
self::assertStringNotContainsString("RegisterVariableString('PowerSteps'", $inhalt);
|
self::assertStringNotContainsString("RegisterVariableString('PowerSteps'", $inhalt);
|
||||||
self::assertStringNotContainsString("RegisterPropertyInteger('ManagerID'", $inhalt);
|
self::assertStringNotContainsString("RegisterPropertyInteger('ManagerID'", $inhalt);
|
||||||
|
self::assertStringContainsString("'AutomatischeVerbraucherZuordnung'", $inhalt);
|
||||||
|
self::assertStringContainsString("'VerbraucherZuordnung'", $inhalt);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSechzehnDiagnosevariablenWerdenBedarfsgesteuertAngelegtUndGeloescht(): void
|
public function testSechzehnDiagnosevariablenWerdenBedarfsgesteuertAngelegtUndGeloescht(): void
|
||||||
|
|||||||
Reference in New Issue
Block a user