feat(utils): adapt virtual battery and VGT interface
Tests / test (push) Successful in 46s

This commit is contained in:
dh
2026-09-27 12:28:32 +00:00
parent 92eec804a7
commit f11b1fbe61
22 changed files with 2445 additions and 104 deletions
+105 -58
View File
@@ -1,68 +1,115 @@
# Virtuelle Batterie
> Status: Diskussionsentwurf. Übernimmt `Bat_EV_SDL_V4` für die Bereiche
> Eigenverbrauch und SDL.
> Status: Implementiert fuer IP-Symcon 8.0. Adaptiert das Grundkonzept aus
> `Bat_EV_SDL_V4`, ohne dessen herstellerspezifische Typnamen zu uebernehmen.
Batterien und VGT-Kommunikation werden ausgewählt. Das Modul bleibt ohne EMS
nutzbar; eine EMS-Anbindung verwendet optional denselben Nachrichtenvertrag,
ohne Code-Abhängigkeit zwischen den Repositories.
Das Modul fasst mehrere physische Batterien zu genau einer grossen virtuellen
Batterie zusammen. Diese Gesamtbatterie wird in einen Eigenverbrauchs- und
einen SDL-Anteil aufgeteilt. SDL hat bei der Leistungsverteilung Vorrang.
## Variablen
## Verantwortlichkeiten
| Ident | Typ / Zugriff | Beschreibung |
| --- | --- | --- |
| `Aktiv` | Boolean / bedienbar | Koordination aktivieren. |
| `EigenverbrauchSollleistung` | Float / bedingt bedienbar | W; nur bei lokaler Quelle schreiben. |
| `SDLSollleistung` | Float / Anzeige | W; nur aus gültigem zeitlichem Auftrag. |
| `EigenverbrauchIstleistung` | Float / Anzeige | W; zugeordneter Anteil. |
| `SDLIstleistung` | Float / Anzeige | W; zugeordneter Anteil. |
| `GesamtIstleistung` | Float / Anzeige | W; Summe gültiger physischer Messwerte. |
| `Leistungsquelle` | Integer / Anzeige | `0` fehlt, `1` berechnet, `2` gemessen. |
| `EigenverbrauchLadezustand` | Float / Anzeige | Virtueller Füllstand in %. |
| `SDLLadezustand` | Float / Anzeige | Virtueller Füllstand in %. |
| `EigenverbrauchMaxLaden` | Float / Anzeige | Verfügbare Ladeleistung in W. |
| `EigenverbrauchMaxEntladen` | Float / Anzeige | Verfügbare Entladeleistung in W. |
| `SDLMaxLaden` | Float / Anzeige | Verfügbare Ladeleistung in W. |
| `SDLMaxEntladen` | Float / Anzeige | Verfügbare Entladeleistung in W. |
| `EigenverbrauchStart` | Float / bedienbar | Startwert 0–100 % für explizites Rücksetzen. |
| `SDLStart` | Float / bedienbar | Startwert 0–100 % für explizites Rücksetzen. |
| `VirtuelleKontenRuecksetzen` | Boolean / Impuls | `true` löst aus und wird wieder zurückgesetzt. |
| `Managerstatus` | Integer / Anzeige | Nur bei Managerquelle. |
| `VGTStatus` | Integer / Anzeige | Nur bei VGT-Quelle. |
| `Stoerung` | Boolean / Anzeige | Eigene oder zugeordnete Fehler. |
| `Stoertext` | String / Anzeige | Diagnose. |
```text
Enelix Batterie-Modul -> EV-Proxyregister --+
+-> Virtuelle Batterie -> physische Sollwerte
VGT-Schnittstelle ----> SDLSollleistung ----+
```
Die virtuelle Batterie ist die einzige Instanz, die die konfigurierten
physischen Sollleistungsvariablen beschreibt. Das bestehende EMS-Batteriemodul
regelt den Eigenverbrauchsanteil. Die VGT-Schnittstelle regelt ausschliesslich
den SDL-Anteil.
Positive Leistung bedeutet Laden, negative Leistung bedeutet Entladen.
## Physische Batterien
Die Property `Batterieliste` enthaelt pro Batterie:
| Feld | Bedeutung |
| --- | --- |
| `Name` | Lesbare Kennung |
| `Kapazitaet_kWh` | Nutzbare Kapazitaet |
| `MaxLaden_W` | Maximale Ladeleistung |
| `MaxEntladen_W` | Maximale Entladeleistung |
| `LadezustandVariableID` | Aktueller Ladezustand in Prozent |
| `IstleistungVariableID` | Gemessene Leistung in W |
| `SollleistungVariableID` | Bedienbare Zielvariable mit Vorzeichen |
Der Gesamtladezustand ist kapazitaetsgewichtet. Beim Laden werden Batterien mit
tieferem Ladezustand zuerst verwendet, beim Entladen Batterien mit hoeherem
Ladezustand.
## Anschluss des bestehenden Batteriemoduls
Eine Enelix-EMS-Instanz **Batterie** wird als herstellerunabhaengige, von Enelix
gesteuerte Batterie eingerichtet. Ihre Messwerte und Register werden auf die
Variablen der virtuellen Batterie gelegt:
| Property im EMS-Batteriemodul | Variable der virtuellen Batterie |
| --- | --- |
| `MaxLadeleistungVariableID` | `EigenverbrauchMaxLaden` |
| `MaxEntladeleistungVariableID` | `EigenverbrauchMaxEntladen` |
| `LadezustandVariableID` | `EigenverbrauchLadezustand` |
| `IstleistungVariableID` | `EigenverbrauchIstleistung` |
| `ManagementRegisterVariableID` | `EVManagement` |
| `ModusRegisterVariableID` | `EVModus` |
| `LadeleistungRegisterVariableID` | `EVLadeleistung` |
| `EntladeleistungRegisterVariableID` | `EVEntladeleistung` |
Die Netzleistungsvariable bleibt die reale Messung des Anlagenanschlusspunktes.
Das Batteriemodul schreibt die vier Proxyregister atomar in seiner bestehenden
Reihenfolge. Erst das Managementregister uebernimmt den vollstaendigen
Eigenverbrauchsauftrag.
## Anschluss der VGT-Schnittstelle
| Property der VGT-Schnittstelle | Variable der virtuellen Batterie |
| --- | --- |
| `ReqActionID` | `SDLSollleistung` |
| `PowerProductionID` | `SDLIstleistung` |
| `SoCID` | `SDLLadezustand` |
Damit erreicht kein MQTT-Befehl direkt eine physische Batterie.
## Properties
| Ident | Typ | Standard / Beschreibung |
| --- | --- | --- |
| `Batterieliste` | String/JSON | `[]`; Zielstelle, Kapazität, Grenzen und Messquellen je Batterie. |
| `Eigenverbrauchsquelle` | Integer | `0` lokal, `1` externe Variable, `2` Managervertrag. |
| `EigenverbrauchSollVariableID` | Integer | `0`; Pflicht bei Quelle 1. |
| `SDLQuelle` | Integer | `0` keine, `1` VGT-Instanz, `2` externer Auftragsdatensatz. |
| `VGTInstanzID` | Integer | `0`; Pflicht bei SDLQuelle 1. |
| `SDLAuftragVariableID` | Integer | `0`; Pflicht bei Quelle 2, inklusive Gültigkeit. |
| `SDLReserveLaden` | Float | `0` W. |
| `SDLReserveEntladen` | Float | `0` W. |
| `Reservezeit` | Float | `0.5` h; Bereich 0–24. |
| `Aktualisierungsintervall` | Integer | `2` s. |
| `MesswertMaxAlter` | Integer | `30` s. |
| `Meldeintervall` | Integer | `10` s; bei Vertragsanbindung. |
| `VorgabeTimeout` | Integer | `30` s; bei weitergeleiteten Vorgaben. |
| `AusfallEigenverbrauch` | Integer | `0` auf 0 begrenzen, `1` lokale begrenzte Vorgabe. |
| `AusfallEigenverbrauchLeistung` | Float | `0` W; nur bei Ausfallmodus 1. |
| `FilterAktiv` | Boolean | `true`. |
| `FilterToleranz` | Float | `15` %. |
| `FilterRampe` | Float | `2000` W/s. |
| `FilterTreffer` | Integer | `1`. |
| `Abgleichintervall` | Float | `6` h. |
| `Abgleichtoleranz` | Float | `2` %. |
| `DiagnoseAnzeigen` | Boolean | `false`. |
| `PrioritaetPV` | Integer | `0`; nur bei Manageranbindung. |
| `PrioritaetPeak` | Integer | `0`; nur bei Manageranbindung. |
| Property | Standard | Beschreibung |
| --- | ---: | --- |
| `Batterieliste` | `[]` | Physische Batterien und Zielvariablen |
| `SDLReserveLaden` | 0 W | Fuer SDL reservierte Ladeleistung |
| `SDLReserveEntladen` | 0 W | Fuer SDL reservierte Entladeleistung |
| `Reservezeit` | 0.5 h | Energetische Reserve je Richtung |
| `Aktualisierungsintervall` | 2 s | Zyklische Sicherheitsaktualisierung |
| `MesswertMaxAlter` | 30 s | Zulaessiges Alter physischer Messwerte |
| `VorgabeTimeout` | 30 s | Gueltigkeit der EV- und SDL-Vorgaben |
| `EigenverbrauchStart` | 50 % | Startwert des EV-Kontos |
| `SDLStart` | 50 % | Startwert des SDL-Kontos |
| `LoggingEin` | false | Debug-Ausgaben |
## Verhalten und offene Punkte
## Verhalten und Sicherheit
Eigenverbrauch und SDL ergeben zusammen genau einen begrenzten Batteriesollwert.
Pro physischer Batterie darf nur eine Stelle führen. Messgrundlage und
Aufteilung der berechneten Leistungsanteile sind im Test eindeutig zu belegen.
- SDL wird vor dem Eigenverbrauch auf die reservierte Leistung begrenzt.
- Gleichgerichtete Eigenverbrauchsleistung erhaelt nur die verbleibende
physische Leistung.
- Gegenlaeufige Auftraege werden bilanziell getrennt und physisch als
Nettosollwert verteilt.
- Fehlende oder veraltete Batterien werden aus der aktuellen Aggregation
entfernt und auf 0 W gesetzt.
- Bei Deaktivierung, ungueltiger Konfiguration oder ohne gueltige Batterie
werden alle physischen Sollleistungsvariablen auf 0 W gesetzt.
- Eine erkannte Integrationsluecke wird gemeldet und nicht still auf eine
kuerzere Dauer begrenzt.
- Physische Zielvariablen werden ausschliesslich mit `RequestAction`
geschrieben.
## Inbetriebnahme
1. Mess- und Sollleistungsvariablen aller physischen Batterien festlegen.
2. Batterieliste konfigurieren und Messwertalter kontrollieren.
3. SDL-Leistungsreserve und Reservezeit eintragen.
4. Das vorhandene EMS-Batteriemodul auf die EV-Proxyregister konfigurieren.
5. Die VGT-Schnittstelle auf die drei SDL-Variablen konfigurieren.
6. Zuerst mit deaktivierter virtueller Batterie alle Vorzeichen pruefen.
7. Danach Eigenverbrauch und SDL einzeln testen.
8. Erst abschliessend gleich- und gegenlaeufige Auftraege pruefen.