Verbraucher Warmwassererwaermer implementieren
Tests / test (push) Canceled after 0s

This commit is contained in:
dh
2026-09-16 05:18:01 +00:00
parent 0a3ece3a81
commit 7a3c436039
14 changed files with 1751 additions and 69 deletions
+1 -1
View File
@@ -100,7 +100,7 @@ Symcon-Datenpunkte werden durch `VerbraucherBasisTrait` registriert.
| `Meldeintervall` | Integer | `10` | Vollständige Rückmeldung in Sekunden; muss grösser als 0 sein. |
| `VorgabeTimeout` | Integer | `30` | Sollwert wird nach dieser Zeit ohne Erneuerung ungültig. |
| `EinstellungenInVisu` | Boolean | `false` | Blendet lokale Einstellvariablen ein und macht sie geprüft bedienbar. |
| `LoggingEin` | Boolean | `false` | Aktiviert Diagnoseprotokoll und zusätzliche Diagnosevariablen. |
| `LoggingEin` | Boolean | `false` | Aktiviert das laufende Diagnoseprotokoll. Module können zusätzliche Diagnosevariablen getrennt einblenden. |
### Gemeinsame Variablen aller Verbraucher
@@ -0,0 +1,24 @@
# ADR 0001: Warmwassererwaermer verwendet ausschliesslich Vertrag 3.0
## Status
Akzeptiert.
## Entscheidung
Der neue `VerbraucherWarmwassererwaermer` implementiert die bestehende
`VerbraucherSchnittstelle` und den `Nachrichtenvertrag` in Version `3.0`.
Die Enelix-1-Variablen `Power`, `PowerSteps`, `PV_Prio`, `Sperre_Prio`,
`Is_Peak_Shaving` und `Leistung_Delta` werden nicht als zweite parallele
Manager-Schnittstelle weitergefuehrt.
Der Manager bleibt allein fuer die Betriebsart und Leistungsverteilung
verantwortlich. Lokale Temperatur- und Hygienesicherheit wird als eingeschraenktes
Leistungsangebot mit `AenderungMoeglich=false` gemeldet.
## Folgen
- Es gibt genau eine fachliche Empfangsmethode pro Richtung.
- Der Verbraucher hat keine Manager-ID-Property.
- Alte Instanzen werden anhand der Migrationstabelle neu konfiguriert.
- Manager und Verbraucher koennen unabhaengig getestet werden.
+49
View File
@@ -0,0 +1,49 @@
# Migration von Boiler_x_Stufig
## Eigenschaften
| Enelix 1 | Enelix 2 | Hinweis |
| --- | --- | --- |
| `LeistungsStufen` | `LeistungsStufen` | Felder `Stufe`, `Leistung`, `Schaltkontakt_Stufe` bleiben erhalten. |
| `ZeitKonstante` | `ZeitKonstante` | PT1-Berechnung verwendet das reale Regelintervall. |
| `Boilerfuehler_PT1` | `Boilerfuehler_PT1` | Alter und Datentyp werden geprueft. |
| `Boilertemperatur_glätten` | `BoilertemperaturGlaetten` | ASCII-sicherer Ident. |
| `Boilervolumen` | `Boilervolumen` | Wird fuer die Zeitplanprognose verwendet. |
| `Zeitplan` | `Zeitplan` | JSON-Liste mit `Uhrzeit` und `Solltemperatur`. |
| `Interval` | `Interval` | Regelintervall in Sekunden. |
| `IdleCounterMax` | `IdleCounterMax` | Verhalten bleibt erhalten. |
Die neuen Properties `TemperaturMaxAlter`, `Hysterese`, die Parameter der
Legionellenfunktion und `DiagnosevariablenAnzeigen` ersetzen feste Werte und
nicht pruefbare Annahmen des Altmoduls.
## Variablen
| Enelix 1 | Enelix 2 |
| --- | --- |
| `Mindesttemperatur` | `Mindesttemperatur` |
| `Maximaltemperatur` | `Maximaltemperatur` |
| `Legionellentemperatur` | `Legionellentemperatur` |
| `Boilertemperatur` | `Boilertemperatur` |
| `LegioCounter` | `LegioCounter` |
| `Idle` | `Idle` |
| `IdleCounter` | `IdleCounter` |
| `Aktuelle_Leistung` | gemeinsames `Istleistung` |
| `Bezogene_Energie` | `BezogeneEnergie` in kWh |
| `PV_Prio` | Property `PrioritaetPV` |
| `Sperre_Prio` | Property `PrioritaetPeak` |
| `Power` | gemeinsames `Sollleistung` |
| `PowerSteps` | Vertragsfeld `Leistungswerte_W`, keine Variable |
| `Is_Peak_Shaving` | entfaellt; Betriebsart liegt im Manager |
| `Leistung_Delta` | entfaellt; Leistungsverteilung liegt im Manager |
## Inbetriebnahme
1. Neue Instanz `VerbraucherWarmwassererwaermer` anlegen.
2. Fuehler, Leistungsstufen und Schaltkontakte uebertragen.
3. Temperaturvariablen einmalig mit den bisherigen Sollwerten setzen.
4. Die Instanz im Enelix-2-Manager unter `VerbraucherZuordnung` aktiv zuordnen.
5. Erst danach `Aktiv` einschalten und jede Stufe beaufsichtigt pruefen.
Das Modul verwendet eine neue Modul-ID. Eine automatische Umwandlung der alten
Instanz findet deshalb nicht statt.
+3 -3
View File
@@ -1,7 +1,7 @@
# EMS-Module und Modulentwürfe
> Der Manager ist als installierbares IP-Symcon-Modul umgesetzt. Die weiteren
> Ordner enthalten Besprechungsgrundlagen und noch keine installierbaren Module.
> Manager und Warmwassererwaermer sind als installierbare IP-Symcon-Module
> umgesetzt. Die weiteren Ordner enthalten Besprechungsgrundlagen.
Alle steuerbaren Verbraucher verwenden die gemeinsamen Datenpunkte aus der
[EMS-Schnittstelle](../Schnittstelle.md). In den Modul-READMEs stehen deshalb
@@ -11,7 +11,7 @@ nur zusätzliche Properties, Variablen, Zustände und offene Punkte.
| --- | --- |
| [Manager](Manager/README.md) | Leistungsverteilung und Anschlüsse (implementiert) |
| [Batterie](Batterie/README.md) | Laden und Entladen eines Speichers |
| [Wassererwärmer](Wassererwaermer/README.md) | Mehrstufige elektrische Erwärmung |
| [Wassererwärmer](Wassererwaermer/README.md) | Mehrstufige elektrische Erwärmung (implementiert) |
| [Pufferspeicher](Pufferspeicher/README.md) | Heizstufen nach Heizkurve |
| [Verbraucher 1-Stufig](Verbraucher-1-Stufig/README.md) | Ein-/Aus-Verbraucher |
| [Wärmepumpe](Waermepumpe/README.md) | Sperrkontakt oder SG Ready |
+87 -52
View File
@@ -1,63 +1,98 @@
# Wassererwärmer
# Verbraucher Warmwassererwaermer
> Status: Diskussionsentwurf. Vereinigt Boiler x-Stufig, Boiler mit Fühler,
> Askoheat und Heizung x-Stufig.
> Status: implementiert fuer IP-Symcon 8 und den Enelix-2-Vertrag `3.0`.
Anzahl, Leistung und Ausgangsbelegung werden je Stufe konfiguriert. Temperatur-,
Nachlade-, Legionellen- und Askoheat-Werte sind Properties und können über
`EinstellungenInVisu` bedienbar gemacht werden.
Das Modul adaptiert ausschliesslich das fruehere Modul `Boiler_x_Stufig`.
Mehrere elektrische Leistungsstufen werden exklusiv geschaltet. Der Manager
waehlt eine der aktuell angebotenen Leistungen; Mindesttemperatur, Zeitplan und
Legionellenprogramm koennen die lokale Warmwassersicherheit priorisieren.
## Zusätzliche Variablen
## Sicherheit und Regelung
| Ident | Typ / Zugriff | Beschreibung |
| --- | --- | --- |
| `Wassertemperatur` | Float / Anzeige | Aktueller Wert in °C. |
| `TemperaturGueltig` | Boolean / Anzeige | Adapter liefert einen gültigen Wert. |
| `NachladenAktiv` | Boolean / Anzeige | Mindesttemperaturanforderung aktiv. |
| `LegionellenbetriebAktiv` | Boolean / Anzeige | Legionellenbetrieb läuft. |
| `AktiveStufe` | Integer / Anzeige | Stufenkennung; `0` bedeutet aus. |
| `LetzterLegionellenabschluss` | Integer / Anzeige | Unixzeit des letzten erfolgreichen Abschlusses. |
| `NachladeMindesttemperatur` | Float / lokal bedienbar | Wirksamer Parameter in °C. |
| `NachladeMaximaltemperatur` | Float / lokal bedienbar | Wirksamer Parameter in °C. |
| `Maximaltemperatur` | Float / lokal bedienbar | Normale obere Zieltemperatur in °C. |
| `Hysterese` | Float / lokal bedienbar | Hysterese in K. |
| `NachladeMindesttemperaturAktiv` | Boolean / lokal bedienbar | Mindesttemperaturnachladung ein/aus. |
| `NachladeMaximaltemperaturAktiv` | Boolean / lokal bedienbar | Separates Nachlade-Endziel ein/aus. |
| `LegionellenfunktionAktiv` | Boolean / lokal bedienbar | Funktion ein/aus. |
| `Legionellentemperatur` | Float / lokal bedienbar | Zieltemperatur in °C. |
| `AskoheatFunktionAktiv` | Boolean / lokal bedienbar | Ansteuerung ein/aus. |
- Die Schaltkontakte werden mit Break-before-make geschaltet: zuerst alle aus,
danach hoechstens eine Stufe ein.
- Fehlende, veraltete oder nicht numerische Temperaturwerte schalten die
EMS-Verfuegbarkeit aus und fuehren zu einer Stoerung.
- Manager-Vorgaben werden nur angenommen, wenn sie im zuletzt gemeldeten
`Leistungswerte_W`-Angebot enthalten sind.
- Nach `VorgabeTimeout` wird eine nicht erneuerte Manager-Vorgabe ungueltig.
- Mindesttemperatur, vorausberechneter Zeitplan und Legionellenprogramm koennen
die maximale Stufe lokal erzwingen. Diese Phase wird mit
`AenderungMoeglich=false` gemeldet.
- `BoilertemperaturGlaetten` aktiviert eine PT1-Glaettung mit konfigurierbarer
Zeitkonstante.
## Zusätzliche Properties
## Properties
| Ident | Typ | Standard / Beschreibung |
| --- | --- | --- |
| `NachladeMindesttemperatur` | Float | `0*` °C; Starttemperatur. |
| `NachladeMaximaltemperatur` | Float | `0*` °C; Endtemperatur. |
| `Maximaltemperatur` | Float | `0*` °C; normales oberes Ziel. |
| `Hysterese` | Float | `1` K; grösser 0. |
| `NachladeMindesttemperaturAktiv` | Boolean | `false`. |
| `NachladeMaximaltemperaturAktiv` | Boolean | `false`. |
| `LegionellenfunktionAktiv` | Boolean | `false`. |
| `Legionellentemperatur` | Float | `0*` °C. |
| `AskoheatFunktionAktiv` | Boolean | `false`. |
| `Betriebsprofil` | Auswahl | `Wassererwaermer` oder `EinfacheTemperaturheizung`. |
| `Leistungsstufen` | String/JSON | `[]`; Stufenkennung, Leistung in W und vollständige Ausgangsbelegung. |
| `Volumen` | Float | `0` l; `0` deaktiviert thermische Berechnung. |
| `Mindestlaufzeit` | Integer | `0` s. |
| `Mindeststillstand` | Integer | `0` s. |
| `AskoheatInstanzID` | Integer | `0`; nur bei aktivierter Funktion. |
| `AskoheatLeistungVariableID` | Integer | `0`; nur wenn der Adapter sie benötigt. |
Zu den sechs gemeinsamen Verbraucher-Properties aus
[`Schnittstelle.md`](../../Schnittstelle.md) kommen 17 Modul-Properties hinzu.
Temperatur-Maximalalter, Temperaturgrenze, Temperatur-Variable-ID, Zeitpläne,
Legionellenhaltezeit, Legionellenmaximaldauer und Zeitzone entfallen.
| Ident | Typ | Standard | Beschreibung |
| --- | --- | ---: | --- |
| `LeistungsStufen` | JSON-Liste | `[]` | Stufe, positive Leistung in W und Boolean-Schaltkontakt. |
| `ZeitKonstante` | Integer | `120` | PT1-Zeitkonstante in Sekunden. |
| `Boilerfuehler_PT1` | Integer | `0` | Temperaturvariable. |
| `BoilertemperaturGlaetten` | Boolean | `false` | PT1-Glaettung aktiv. |
| `Boilervolumen` | Integer | `300` | Volumen in Litern fuer die Zeitplanprognose. |
| `Zeitplan` | JSON-Liste | `[]` | Uhrzeit und Solltemperatur. |
| `Interval` | Integer | `5` | Regelintervall in Sekunden. |
| `IdleCounterMax` | Integer | `2` | Zyklen bis zum Idle-Status. |
| `TemperaturMaxAlter` | Integer | `30` | Maximal zulaessiges Messwertalter in Sekunden. |
| `Hysterese` | Float | `5.0` | Temperaturhysterese in K. |
| `LegionellenfunktionAktiv` | Boolean | `true` | Periodische Aufheizung aktiv. |
| `LegionellenIntervallTage` | Integer | `7` | Intervall seit erfolgreichem Abschluss. |
| `LegionellenHaltezeit` | Integer | `0` | Haltezeit auf Zieltemperatur in Sekunden. |
| `LegionellenMaximaldauer` | Integer | `86400` | Abbruchzeit in Sekunden. |
| `NachtstartStunde` | Integer | `22` | Fruehester Programmstart. |
| `NachtendeStunde` | Integer | `7` | Ende des Nachtfensters. |
| `DiagnosevariablenAnzeigen` | Boolean | `false` | Blendet zehn Diagnosevariablen ein. |
## Zustand
`LoggingEin` aktiviert laufende Debug-Ausgaben. Der Formular-Knopf schreibt
unabhaengig davon genau einen aktuellen Statusdatensatz ins Debug-Log.
`Wassertemperatur_C` als Istwert, `Maximaltemperatur_C` als Sollwert,
`AktiveStufe`, `NachladenAktiv` und `LegionellenbetriebAktiv` als Status sowie
`Fuehlerfehler` und `Uebertemperatur` als Störungen.
## Variablen
## Offene Punkte
Standardmaessig sichtbar sind nur die acht Betriebsvariablen `Aktiv`,
`Istleistung`, `Sollleistung`, `Stoerung`, `Stoertext`, `Boilertemperatur`,
`AktiveStufe` und `BezogeneEnergie`.
- Ablauf für „Wassererwärmer über Wärmepumpe betreiben“ separat festlegen.
- Konkreten Temperaturadapter und die Fühleranbindung bestätigen.
Mit `EinstellungenInVisu` werden `Mindesttemperatur`, `Maximaltemperatur` und
`Legionellentemperatur` sichtbar und geprueft bedienbar. Die Reihenfolge
`Mindesttemperatur < Maximaltemperatur <= Legionellentemperatur` ist zwingend.
Mit `DiagnosevariablenAnzeigen` werden diese zehn Variablen eingeblendet:
- `Leistungsquelle`
- `SollwertGueltig`
- `Verfuegbar`
- `AenderungMoeglich`
- `TemperaturGueltig`
- `NachladenAktiv`
- `LegionellenbetriebAktiv`
- `LegioCounter`
- `Idle`
- `IdleCounter`
## Managerkommunikation
Das Modul implementiert `VerbraucherSchnittstelle::ManagerdatenEmpfangen()`.
Der Transport erfolgt wie beim Manager ueber `IPS_RequestAction` mit JSON. Der
Verbraucher besitzt keine Manager-ID-Property. Er ermittelt nur Manager, in
deren `VerbraucherZuordnung` seine Instanz aktiv eingetragen ist.
Die Rueckmeldung erfolgt ereignisbasiert und zusaetzlich alle
`Meldeintervall` Sekunden. Eine Rueckmeldung nach empfangener Vorgabe wird kurz
verzoegert, damit keine synchrone Manager-Verbraucher-Endlosschleife entsteht.
## Tests
`WarmwasserReglerTest.php` prueft Leistungsstufen, PT1, Energieberechnung,
Zeitplan und thermische Prognose. `WarmwassererwaermerModulstrukturTest.php`
prueft Metadaten, Formular, 23 Properties, Sichtbarkeit, Schnittstellenvertrag
und Break-before-make-Schaltung.
## Migration
Die Feldzuordnung und die bewusst entfallenen Enelix-1-Kommunikationsvariablen
sind in [`docs/migration/Boiler-x-Stufig.md`](../../migration/Boiler-x-Stufig.md)
dokumentiert.