207 lines
11 KiB
Markdown
207 lines
11 KiB
Markdown
# Manager
|
|
|
|
> Status: Implementiert. Führt Hauptmanager und Peakshaving zusammen.
|
|
|
|
Der Manager liest die Netzleistung, verwaltet ausschliesslich die ausgewählten
|
|
Verbraucher und verteilt Leistung im PV- oder Peak-Betrieb. Die Prioritäten
|
|
kommen aus den Verbrauchermeldungen.
|
|
|
|
## Variablen
|
|
|
|
Ohne angelegte Diagnosevariablen existieren nur `Aktiv`, `Betriebsart` und `Netzleistung`.
|
|
|
|
| Ident | Typ / Zugriff | Beschreibung |
|
|
| --- | --- | --- |
|
|
| `Aktiv` | Boolean / bedienbar | Regelung ein/aus; Start `false`. |
|
|
| `Betriebsart` | String / Anzeige | `Inaktiv`, `PV` oder `Peak`. |
|
|
| `Netzleistung` | Float / Anzeige | Aktuelle Netzleistung in W; positiv Bezug, negativ Einspeisung. |
|
|
| `NetzleistungGueltig` | Boolean / Logging | Messquelle vorhanden und aktuell. |
|
|
| `WirksameLastspitzengrenze` | Float / Logging | Aktuelle feste oder monatliche Grenze in W. |
|
|
| `Verteilbudget` | Float / Logging | Aktuell verfügbares Budget in W. |
|
|
| `VerbraucherAnzahl` | Integer / Logging | Anzahl zugeordneter Verbraucher. |
|
|
| `VerbraucherVerfuegbar` | Integer / Logging | Anzahl aktuell verfügbarer Verbraucher. |
|
|
| `Verbraucherstatus` | String/JSON / Logging | Letzte vollständige Meldungen. |
|
|
| `Prognosestatus` | String / Logging | `NichtVerwendet`, `Verbunden` oder `Fehler`. |
|
|
| `SDLStatus` | String / Logging | Status des SDL/VGT-Anschlusses. |
|
|
| `Lizenzstatus` | String / Logging | Status der Lizenzprüfung. |
|
|
| `Stoerueberwachungsstatus` | String / Logging | Status der externen Störüberwachung. |
|
|
| `Sammelstoerung` | Boolean / Logging | Eigene und weitergeleitete Störungen. |
|
|
| `Stoertext` | String / Logging | Lesbare Sammelmeldung. |
|
|
|
|
## Properties
|
|
|
|
| Ident | Typ | Standard / Beschreibung |
|
|
| --- | --- | --- |
|
|
| `Rolle` | Auswahl | `Alleine`; alternativ `Hauptmanager` oder `Untermanager`. |
|
|
| `NetzleistungVariableID` | Integer | `0*`; gültige Messquelle vor Regelstart. |
|
|
| `Netzleistungsfaktor` | Float | `1`; auf W und die vereinbarte Vorzeichenrichtung normieren. |
|
|
| `MesswertMaxAlter` | Integer | `60` s; auf echte Messaktualisierung bezogen. |
|
|
| `VerbraucherZuordnung` | String/JSON | `[]`; manuelle Auswahl aus Instanz-ID und Aktiv-Status. |
|
|
| `AutomatischeVerbraucherZuordnung` | String/JSON | `[]`; Auswahl aus automatisch gefundenen Verbrauchern. |
|
|
| `AutomatischeSuche` | Boolean | `true`; zeigt gefundene Verbraucher zur gezielten Auswahl. |
|
|
| `SuchbereichID` | Integer | `0`; optionaler Suchbereich für die automatische Suche. |
|
|
| `KeepAlive` | Integer | `60` s; erneuert laufende Vorgaben zyklisch. |
|
|
| `VerbraucherTimeout` | Integer | `60` s; erkennt ausgebliebene Verbrauchermeldungen. |
|
|
| `Lastspitzenmodus` | Auswahl | `Aus`; alternativ `Konstant` oder `Monatlich`. |
|
|
| `Lastspitzengrenze` | Float | Feste Grenze in W für Modus `Konstant`. |
|
|
| `Monatsgrenzen` | String/JSON | Editierbare Liste mit zwölf Monatswerten in W. |
|
|
| `SollwertSolarladen` | Float | `0` W; gewünschte Netzleistung im Solarladebetrieb. |
|
|
| `Umschaltdifferenz` | Float | `5` %; Mindestdifferenz der berechneten Sollleistungen vor Umschaltung. |
|
|
| `PrognoseAnschluss` | String/JSON | Optionaler Forecast-Anschluss. |
|
|
| `SDLAnschluss` | String/JSON | Optionaler SDL/VGT-Anschluss. |
|
|
| `Lizenzcode` | String | Im Enelix-Lizenzportal erworbener Aktivierungscode. |
|
|
| `StoermeldeAnschluss` | String/JSON | Optionaler Anschluss zur Störüberwachung. |
|
|
| `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
|
|
Manager. Im Modus `Aus` bleibt Solarladen aktiv, nur die Peak-Begrenzung entfällt.
|
|
Die Monatsgrenzen werden in den Grundeinstellungen über eine Schaltfläche
|
|
ein- und ausgeblendet. Die automatische Verbrauchersuche kann dort erneut
|
|
ausgeführt werden, ohne andere ungespeicherte Formulareingaben zu verlieren.
|
|
|
|
## Lizenzierung
|
|
|
|
Der Manager arbeitet nur mit einer gueltigen Manager-Lizenz. Das Lizenzfeld steht
|
|
zuoberst im Konfigurationsformular. Ohne Freigabe bleibt die Instanz mit Status
|
|
`203` inaktiv und sendet keine Leistungsvorgaben.
|
|
|
|
### Voraussetzungen
|
|
|
|
- Der Auftrag im Enelix-Lizenzportal ist bezahlt und enthaelt eine aktive
|
|
Manager-Berechtigung.
|
|
- IP-Symcon erreicht `https://license.enelix.ch` ueber HTTPS (Port 443).
|
|
- Der Lizenzcode liegt im Format `ENX-XXXX-XXXX-XXXX-XXXX` vor.
|
|
|
|
### Lizenz aktivieren
|
|
|
|
1. Manager-Konfiguration in IP-Symcon oeffnen.
|
|
2. Lizenzcode im Bereich `Lizenzierung` eintragen.
|
|
3. `Lizenz pruefen und binden` ausloesen.
|
|
4. Die erfolgreiche Freigabe am angezeigten Lizenzstatus kontrollieren.
|
|
5. Die Manager-Konfiguration mit `Uebernehmen` beziehungsweise `OK` speichern,
|
|
damit der eingegebene Lizenzcode als Property erhalten bleibt.
|
|
|
|
Beim ersten Anlegen erzeugt die Manager-Instanz eine UUIDv4 als stabile
|
|
Installations-ID. Die Aktivierung sendet ausschliesslich `code` und
|
|
`installationId` per
|
|
`POST https://license.enelix.ch/api/v1/licenses/activate`. Sie benoetigt weder
|
|
Portal-Cookies noch einen CSRF-Token. Derselbe Code kann von derselben
|
|
Installation erneut abgerufen werden; die Bindung an eine andere Installation
|
|
wird vom Lizenzserver abgelehnt.
|
|
|
|
### Berechtigungen
|
|
|
|
| Berechtigung | Freigegebene Funktion |
|
|
| --- | --- |
|
|
| `manager_standard` | Manager-Grundregelung ohne Lastspitzenmodus. |
|
|
| `manager_peak` | Manager-Grundregelung einschliesslich konstantem oder monatlichem Lastspitzenmodus. |
|
|
|
|
Wird mit `manager_standard` ein Lastspitzenmodus aktiviert, bleibt der Manager
|
|
mit dem Hinweis `Peak Shaving ist nicht lizenziert` gesperrt. `manager_peak`
|
|
gilt zugleich als Berechtigung fuer die Grundregelung.
|
|
|
|
### Erneuerung und Offline-Betrieb
|
|
|
|
Die erfolgreiche Serverantwort wird als Lease in der Manager-Instanz gespeichert.
|
|
Der Manager erneuert sie ab `refreshAfter` automatisch ueber denselben
|
|
Aktivierungsendpunkt. Schlaegt eine Erneuerung fehl, wird fruehestens nach einer
|
|
Stunde erneut angefragt. Eine bereits bestaetigte Entwicklungsfreigabe bleibt
|
|
bis `offlineUntil` verwendbar. Der aktuelle Entwicklungsvertrag setzt diesen
|
|
Zeitpunkt ungefaehr 14 Tage nach Ausstellung. Danach sperrt der Manager die
|
|
Regelung, bis der Lizenzserver wieder eine gueltige Antwort liefert.
|
|
|
|
Die Installations-ID und die Lease liegen in internen Instanzattributen. Die
|
|
ID wird erst nach dem Laden bestehender Attribute initialisiert und bleibt bei
|
|
Modulupdates, Modul-Neuladen und einem normalen Neustart unveraendert. Bei einer
|
|
Migration muss trotzdem die vollstaendige Manager-Instanz mitsamt ihren
|
|
Attributen uebernommen werden. Eine neu erzeugte Instanz erhaelt eine andere
|
|
Installations-ID und kann einen bereits gebundenen Code nicht selbststaendig
|
|
uebertragen. Wurde die ID mit einer aelteren Manager-Version bereits ungewollt
|
|
geaendert, muss im Lizenzportal einmalig ein Ersatzcode erzeugt und an die nun
|
|
stabile ID gebunden werden.
|
|
|
|
### Status und Fehlerbehebung
|
|
|
|
| Anzeige / Serverstatus | Bedeutung und Massnahme |
|
|
| --- | --- |
|
|
| `Lizenzcode fehlt.` | Code eintragen, pruefen und die Konfiguration speichern. |
|
|
| `Lizenzcode ist ungueltig.` | Format und Zeichen des Codes kontrollieren. |
|
|
| HTTP `404` | Code unbekannt oder zugehoeriger Auftrag noch nicht bezahlt. |
|
|
| HTTP `409` | Code ist bereits an eine andere Installation gebunden. |
|
|
| 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. |
|
|
|
|
Fuer eine genauere Diagnose koennen die Diagnosevariablen eingeblendet werden.
|
|
`Lizenzstatus` zeigt dann den aktuellen Zustand. Mit aktiviertem Debug-Logging
|
|
werden Fehlermeldungen der Lizenzpruefung ausgegeben, niemals jedoch der
|
|
Lizenzcode selbst.
|
|
|
|
### Datenschutz und Entwicklungsstand
|
|
|
|
Der Lizenzcode wird als Manager-Property in der IP-Symcon-Konfiguration
|
|
gespeichert. Fuer den internen Abgleich mit der Lease verwendet der Manager
|
|
zusaetzlich nur einen SHA-256-Hash und schreibt den Code nicht ins Debug-Log.
|
|
Die aktuelle Serverantwort ist ein Entwicklungsvertrag mit
|
|
`development: true` und noch nicht kryptografisch signiert. Ein optionaler
|
|
Geraete-Public-Key sowie Challenge-, Heartbeat- oder separate
|
|
Entitlement-Endpunkte werden vom Manager derzeit bewusst nicht verwendet.
|
|
|
|
## Verteilalgorithmus
|
|
|
|
Der Manager bildet das Verteilbudget aus der aktuellen Netzleistung, dem Ziel
|
|
der aktiven Betriebsart und der aktuellen Leistung aller frisch gemeldeten
|
|
Verbraucher. Eine gültige Istleistung wird bevorzugt; fehlt sie, bleibt der im
|
|
Zustand bestätigte Sollwert konservativ reserviert.
|
|
|
|
Nicht verfügbare, nicht änderbare oder aktuell angebotlose Verbraucher behalten
|
|
ihre Leistung und erhalten keine neue Vorgabe. Die übrigen Verbraucher werden
|
|
nach der gemeldeten PV- beziehungsweise Peak-Priorität und danach stabil nach
|
|
Instanz-ID sortiert. Von ihrem jeweils kleinsten erlaubten Leistungswert aus
|
|
wird das Budget in dieser Reihenfolge aufgefüllt. Einzelwerte und ganzzahlige
|
|
Bereiche werden direkt verarbeitet; Lücken werden nie durch unzulässige Werte
|
|
geschlossen. Eine verbleibende Abweichung wird im `Verbraucherstatus`
|
|
dokumentiert.
|
|
|
|
Die Betriebsart wechselt unterhalb des Solar-Sollwerts zu `PV` und oberhalb
|
|
der wirksamen Lastspitzengrenze zu `Peak`. Zwischen den beiden Zielwerten
|
|
bleibt sie erhalten. `Umschaltdifferenz` verhindert zusätzlich einen Wechsel,
|
|
wenn sich die beiden berechneten Korrekturen nicht ausreichend unterscheiden.
|
|
|
|
## Laufzeit und Fehlerverhalten
|
|
|
|
- Netzleistungsänderungen und Verbrauchermeldungen lösen die Berechnung aus.
|
|
- 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
|
|
Absendern angenommen.
|
|
- Veraltete oder noch fehlende Verbrauchermeldungen werden nicht verteilt und
|
|
als Sammelstörung ausgewiesen.
|
|
- Bei fehlender oder veralteter Netzleistung bleibt die Regelung `Inaktiv` und
|
|
sendet keine neuen Vorgaben.
|
|
- Ohne gueltige Manager-Berechtigung bleibt der Manager mit Status `203` gesperrt.
|
|
- Die Serverantwort wird lokal gespeichert und ab `refreshAfter` erneuert. Bei
|
|
einem Verbindungsfehler gilt eine zuvor bestaetigte Entwicklungsfreigabe bis
|
|
`offlineUntil`; danach wird die Regelung wieder gesperrt.
|
|
- `manager_standard` erlaubt die Grundregelung. Ein aktiver Lastspitzenmodus
|
|
benoetigt `manager_peak`.
|
|
- Der Lizenzcode wird nie geloggt. Lokal wird fuer den Lease-Abgleich nur sein
|
|
SHA-256-Wert gespeichert.
|
|
- Die oberen Anschlüsse bleiben optional. Solange kein konkreter Adapter
|
|
implementiert ist, meldet ein aktivierter Anschluss den Status `Fehler`, ohne
|
|
die lokale EMS-Regelung zu blockieren.
|
|
|
|
## Schnittstellen
|
|
|
|
- Empfängt genau `VerbraucherdatenEmpfangen(array $daten)`.
|
|
- Sendet an jeden Verbraucher nur Kopf und `Sollleistung_W`.
|
|
- Obere Anschlüsse: siehe [Obere Anschlüsse](../../Obere-Anschluesse.md).
|
|
|
|
## Offene Punkte
|
|
|
|
- Monatliche Batteriereserve aus dem alten Peakshaving-Modul übernehmen?
|
|
- Anbieterformate für Prognose und Störüberwachung festlegen.
|
|
- Produktive signierte Lizenz-Leases nach Abschluss des Entwicklungsvertrags integrieren.
|
|
- Verhalten und Messabgrenzung bei Untermanagern im Anlagentest bestätigen.
|