diff --git a/Manager/module.php b/Manager/module.php index 64d74d3..9b6af31 100644 --- a/Manager/module.php +++ b/Manager/module.php @@ -266,8 +266,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle } $this->setzeDiagnosewert('Monatsgrenzen', $this->ReadPropertyString('Monatsgrenzen')); $this->aktualisiereAnschlussstatus(); - $geraetezugangFehlt = ($this->ReadPropertyBoolean('PrognoseAktiv') - || $this->ReadPropertyBoolean('StoerueberwachungAktiv')) + $geraetezugangFehlt = $this->geraetezugangBenoetigt() && $this->ReadAttributeString('PrognoseInstallationsToken') === ''; if (!$this->aktualisiereLizenzfreigabe( $this->ReadPropertyString('Lizenzcode'), @@ -500,7 +499,9 @@ class Manager extends IPSModule implements ManagerSchnittstelle if (!is_string($wert)) { throw new InvalidArgumentException('Der Lizenzcode muss als Text uebergeben werden.'); } - $this->aktualisiereLizenzfreigabe($wert, true); + if ($this->aktualisiereLizenzfreigabe($wert, true)) { + $this->synchronisiereAnlagentopologie(); + } $this->UpdateFormField('LizenzInformation', 'caption', $this->lizenzStatustext($wert)); $this->aktualisiereLastspitzenformular($wert); $this->aktualisierePrognoseformular($wert); @@ -2123,8 +2124,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle && $this->lizenzBerechtigungenPassen($lease, $lastspitzenmodus); $gueltig = $leaseGueltig && $berechtigungenPassen; $berechtigungenVeraltet = $basisGueltig && !$berechtigungenPassen; - $geraetezugangFehlt = ($this->ReadPropertyBoolean('PrognoseAktiv') - || $this->ReadPropertyBoolean('StoerueberwachungAktiv')) + $geraetezugangFehlt = $this->geraetezugangBenoetigt() && $this->ReadAttributeString('PrognoseInstallationsToken') === ''; $routineFaellig = (!$gueltig && !$berechtigungenVeraltet) || $geraetezugangFehlt @@ -2475,8 +2475,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle $nutzlast = json_encode([ 'code' => $lizenzcode, 'installationId' => $installationID, - 'issueDeviceToken' => ($this->ReadPropertyBoolean('PrognoseAktiv') - || $this->ReadPropertyBoolean('StoerueberwachungAktiv')) + 'issueDeviceToken' => $this->geraetezugangBenoetigt() && $this->ReadAttributeString('PrognoseInstallationsToken') === '', ], JSON_THROW_ON_ERROR | JSON_UNESCAPED_SLASHES); $curl = curl_init(self::LIZENZ_ENDPOINT); @@ -2646,6 +2645,25 @@ class Manager extends IPSModule implements ManagerSchnittstelle ); } + private function geraetezugangBenoetigt(): bool + { + if ($this->ReadPropertyBoolean('PrognoseAktiv') + || $this->ReadPropertyBoolean('StoerueberwachungAktiv') + ) { + return true; + } + + try { + $topologie = $this->leseAnlagentopologie(); + } catch (Throwable $fehler) { + return false; + } + + return $topologie['inverters'] !== [] + || $topologie['pvArrays'] !== [] + || $topologie['batteries'] !== []; + } + private function prognoseTelemetrieKonfiguriert(): bool { return $this->ReadPropertyBoolean('PrognoseAktiv') @@ -2697,11 +2715,6 @@ class Manager extends IPSModule implements ManagerSchnittstelle private function synchronisiereAnlagentopologie(): void { - if (!$this->ReadPropertyBoolean('PrognoseAktiv')) { - $this->setzeDiagnosewert('Prognosestatus', 'NichtVerwendet'); - return; - } - try { $topologie = $this->leseAnlagentopologie(); if ($topologie['inverters'] === [] @@ -2717,7 +2730,12 @@ class Manager extends IPSModule implements ManagerSchnittstelle throw new RuntimeException('Der Geraetezugang fuer die Prognose fehlt.'); } $this->sendeAnlagentopologie($topologie, $token); - $this->setzeDiagnosewert('Prognosestatus', 'Verbunden'); + $this->setzeDiagnosewert( + 'Prognosestatus', + $this->ReadPropertyBoolean('PrognoseAktiv') + ? 'Verbunden' + : 'Topologie synchronisiert' + ); } catch (Throwable $fehler) { $meldung = substr($fehler->getMessage(), 0, 500); $this->setzeDiagnosewert('Prognosestatus', 'Fehler: ' . $meldung); diff --git a/tests/ManagerModulstrukturTest.php b/tests/ManagerModulstrukturTest.php index 0b20388..7703d59 100644 --- a/tests/ManagerModulstrukturTest.php +++ b/tests/ManagerModulstrukturTest.php @@ -226,6 +226,15 @@ final class ManagerModulstrukturTest extends TestCase $inhalt ); self::assertStringContainsString('synchronisiereAnlagentopologie()', $inhalt); + self::assertStringContainsString('private function geraetezugangBenoetigt(): bool', $inhalt); + self::assertStringContainsString( + "if (\$this->aktualisiereLizenzfreigabe(\$wert, true)) {", + $inhalt + ); + self::assertStringNotContainsString( + "if (!\$this->ReadPropertyBoolean('PrognoseAktiv')) {\n \$this->setzeDiagnosewert('Prognosestatus', 'NichtVerwendet');\n return;\n }\n\n try {", + $inhalt + ); self::assertStringContainsString( 'https://license.enelix.ch/api/v1/installations/%s/prognosis/telemetry', $inhalt