fix(manager): Prognoseberechtigungen verständlich diagnostizieren

This commit is contained in:
dh
2026-09-29 08:41:32 +00:00
parent aefe46352f
commit 21577c0125
4 changed files with 60 additions and 7 deletions
+5 -7
View File
@@ -2266,12 +2266,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
/** @param array<string, mixed> $lease */
private function prognoseBerechtigungInLease(array $lease): bool
{
return Lizenzpruefung::berechtigungsMenge($lease, Lizenzpruefung::NETZFAHRPLAN) > 0
|| (Lizenzpruefung::berechtigungsMenge($lease, Lizenzpruefung::PROGNOSE_PV) > 0
&& Lizenzpruefung::berechtigungsMenge(
$lease,
Lizenzpruefung::PROGNOSE_VERBRAUCH
) > 0);
return Lizenzpruefung::hatPrognoseBerechtigung($lease);
}
private function berechtigungLizenziert(string $kennung, ?string $lizenzcode = null): bool
@@ -2421,7 +2416,10 @@ class Manager extends IPSModule implements ManagerSchnittstelle
if (!$lizenziert) {
return 'Prognosen sind deaktiviert. Fuer die Manager-ID '
. $managerID
. ' fehlen forecast_pv plus forecast_load oder grid_schedule.';
. ' ist keine Prognoseberechtigung vorhanden. Benoetigt wird entweder '
. 'PV-Ertragsprognose zusammen mit Verbrauchsprognose oder der '
. 'Intelligente Netzfahrplan. Nach der Erweiterung im Lizenzportal '
. 'die Lizenz erneut pruefen und binden.';
}
return ($aktiv ? 'Prognosen sind aktiviert. ' : 'Prognosen sind deaktiviert. ')
+1
View File
@@ -279,6 +279,7 @@ stabile ID gebunden werden.
| HTTP `429` | Zu viele Aktivierungsversuche; vor dem naechsten Versuch warten. |
| `Lizenzserver nicht erreichbar` | DNS, Internetzugang, HTTPS und Systemzeit des Symcon-Systems pruefen. Eine bestehende Lease gilt nur bis `offlineUntil`. |
| `Offline-Freigabe ist abgelaufen.` | Verbindung zum Lizenzserver wiederherstellen und Lizenz erneut pruefen. |
| `Keine Prognoseberechtigung vorhanden` | Im Lizenzportal entweder PV-Ertragsprognose zusammen mit Verbrauchsprognose oder den Intelligenten Netzfahrplan ergaenzen. Anschliessend im Manager `Lizenz pruefen und binden` ausloesen, die Prognose aktivieren und die Konfiguration speichern. |
Fuer eine genauere Diagnose koennen die Diagnosevariablen eingeblendet werden.
`Lizenzstatus` zeigt dann den aktuellen Zustand. Mit aktiviertem Debug-Logging
+13
View File
@@ -117,6 +117,19 @@ final class Lizenzpruefung
return $menge;
}
/**
* Eine Prognose ist entweder durch den Netzfahrplan oder durch beide
* Einzelberechtigungen fuer PV und Verbrauch freigeschaltet.
*
* @param array<string, mixed> $lease
*/
public static function hatPrognoseBerechtigung(array $lease): bool
{
return self::berechtigungsMenge($lease, self::NETZFAHRPLAN) > 0
|| (self::berechtigungsMenge($lease, self::PROGNOSE_PV) > 0
&& self::berechtigungsMenge($lease, self::PROGNOSE_VERBRAUCH) > 0);
}
/**
* Rechnet freie, bestehende Einzellizenzen auf nicht separat lizenzierte Waermepumpen an.
*
+41
View File
@@ -228,6 +228,47 @@ final class LizenzpruefungTest extends TestCase
Lizenzpruefung::pruefeVerbrauchermengen($lease, $pruefmengen);
}
public function testPvUndVerbrauchGebenPrognoseFrei(): void
{
$lease = $this->lease('manager_standard');
$lease['entitlements'][] = [
'catalog_key' => Lizenzpruefung::PROGNOSE_PV,
'quantity' => 1,
'status' => 'active',
];
$lease['entitlements'][] = [
'catalog_key' => Lizenzpruefung::PROGNOSE_VERBRAUCH,
'quantity' => 1,
'status' => 'active',
];
self::assertTrue(Lizenzpruefung::hatPrognoseBerechtigung($lease));
}
public function testEinzelnePrognoseBerechtigungReichtNichtAus(): void
{
$lease = $this->lease('manager_standard');
$lease['entitlements'][] = [
'catalog_key' => Lizenzpruefung::PROGNOSE_PV,
'quantity' => 1,
'status' => 'active',
];
self::assertFalse(Lizenzpruefung::hatPrognoseBerechtigung($lease));
}
public function testNetzfahrplanGibtPrognoseAlleineFrei(): void
{
$lease = $this->lease('manager_standard');
$lease['entitlements'][] = [
'catalog_key' => Lizenzpruefung::NETZFAHRPLAN,
'quantity' => 1,
'status' => 'active',
];
self::assertTrue(Lizenzpruefung::hatPrognoseBerechtigung($lease));
}
public function testLizenzcodeWirdWieAufDemServerNormalisiert(): void
{
self::assertSame(