# Enelix-Verbrauchermodul Warmwasser (Boiler)

Dieses Modul integriert elektrische Warmwasserboiler mit geschalteten Heizstäben mit variablen Heizstufen in das Belevo Energiemanagement-System (Enelix). Es steuert die Leistungsstufen dynamisch nach PV-Überschuss, Peak-Shaving-Vorgaben, Temperaturvorgaben sowie Zeitplänen und integriert einen automatischen Legionellenschutz.

---

## Inhaltsverzeichnis

1. [Funktionsumfang](#1-funktionsumfang)
2. [Voraussetzungen](#2-voraussetzungen)
3. [Installation](#3-installation)
4. [Instanz anlegen & Konfiguration](#4-instanz-anlegen--konfiguration)
5. [Statusvariablen & Profile](#5-statusvariablen--profile)
6. [WebFront / Bedienung](#6-webfront--bedienung)
7. [Mapping auf Code-Komponenten](#7-mapping-auf-code-komponenten)
8. [Zukünftige Erweiterungen](#8-zukünftige-erweiterungen)

---

## 1. Funktionsumfang

- **Stufensteuerung (LeistungsStufen):** Definition beliebiger Leistungsschritte (Watt) mit direkter Zuweisung von IP-Symcon Schaltkontakten (Variablen-IDs).
- **Temperaturüberwachung & Glättung:** Auswertung eines Temperaturfühlers mit optionaler PT1-Glättung (Tiefpassfilter über `ZeitKonstante`), um Messrauschen zu minimieren.
- **Betriebsmodi (PV vs. Peak):**
  - *Peak-Shaving:* Heizen nur bei Unterschreitung der `Mindesttemperatur` (Zwangsaufheizung), optional auch ganz deaktivierbar.
  - *Solarladen:* Stufenweise Aufheizung bis zur `Maximaltemperatur` mit überschüssiger PV-Leistung. Fällt die Temperatur unter `Mindesttemperatur`, wird mit maximaler Leistung geheizt.
- **Legionellenschutz:** Ein interner Zähler (`LegioCounter`) überwacht die Zeit seit der letzten Hochtemperaturphase. Wird ein Grenzwert überschritten, wird die `Maximaltemperatur` (bzw. später auch die `Mindesttemperatur` im Nachtbetrieb) automatisch auf die `Legionellentemperatur` angehoben.
- **Vorausschauende Zeitpläne (Landwirtschaft):** Über einen JSON-Zeitplan können Zieltemperaturen zu bestimmten Uhrzeiten definiert werden. Das Modul berechnet über die physikalische Wärmekapazität (Volumen, Delta-T) vorausschauend, ob und wann die Heizung aktiviert werden muss, um das Ziel rechtzeitig zu erreichen.
- **Taktschutz (Idle-Logik):** Ein einstellbarer Zähler (`IdleCounterMax`) verhindert ein zu häufiges Schalten der Heizstäbe sowie eine Mindestlaufzeit.

---

## 2. Voraussetzungen

- IP-Symcon **≥ 8.0**
- Modul-URL: `https://git.belevo.ch/dh/enelix.git`
- Vorhandener und eingerichteter Enelix Manager.
- Physische Schaltaktoren für die Boiler-Heizstäbe.
- Temperaturfühler im Boiler mit Fühlerwert als Variable in Symcon.

---

## 3. Installation

1. In IP-Symcon **Module Control** öffnen.
2. **Hinzufügen → Git-Repository**.
3. URL eingeben und **Installieren**.
4. IP-Symcon neu starten.

---

## 4. Instanz anlegen & Konfiguration

### 4.1 Instanz anlegen

- Rechtsklick **Instanzen** → **Instanz hinzufügen**
- Filter: **Belevo**
- Auswahl: **Warmwasser (Verbraucher)**

### 4.2 Properties

| Name | Typ | Beschreibung |
|---|---|---|
| **LeistungsStufen** | String (JSON) | Konfiguration der Leistungsschritte und der verknüpften Aktor-Variablen-IDs. |
| **Boilerfuehler_PT1** | SelectVariable | Variablen-ID des Hardware-Temperaturfühlers. |
| **Boilertemperatur_glätten** | Boolean | Aktiviert das Software-Tiefpassfilter für den Fühlerwert. |
| **ZeitKonstante** | NumberSpinner | Zeitkonstante für die Temperatur-Glättung. |
| **Boilervolumen** | NumberSpinner | Boilervolumen in Litern (Basis für die thermodynamische Berechnung im Zeitplan). |
| **Zeitplan** | String (JSON) | Optionaler Zeitplan für Zieltemperaturen (Format: `[{"Uhrzeit":"06:00","Solltemperatur":55}]`). |
| **Interval** | NumberSpinner | Berechnungsintervall in Sekunden. |
| **IdleCounterMax** | NumberSpinner | Anzahl Intervall-Zyklen zwischen zwei Schaltvorgängen (Verzögerung). |

---

## 5. Statusvariablen & Profile

| Ident | Typ | Beschreibung |
|---|---|---|
| **Mindesttemperatur** | Integer | Unteres Limit. Wird dieser Wert unterschritten, wird immer geheizt (Netzbezug). |
| **Maximaltemperatur** | Integer | Oberes Limit für PV-Überschussladung. |
| **Legionellentemperatur**| Integer | Zieltemperatur für den automatischen Legionellenzyklus (z.B. 65°C). |
| **Boilertemperatur** | Float | Aktuelle, ggf. geglättete Ist-Temperatur des Boilers. |
| **LegioCounter** | Integer | Interner Zähler für die Laufzeit seit der letzten Legionellen-Desinfektion. |
| **Aktuelle_Leistung** | Integer | Die aktuell vom Manager zugewiesene Soll-Leistung in Watt. |
| **PowerSteps** | String | JSON-Array der dem Manager aktuell angebotenen möglichen Leistungsschritte. |
| **Idle** | Boolean | Status der Sperrzeit (`true` = bereit für neue Werte, `false` = gesperrt). |
| **Sperre_Prio** | Integer | Priorität für die Leistungszuteilung im Peak-Shaving-Modus. |
| **PV_Prio** | Integer | Priorität für die Leistungszuteilung im Solarlade-Modus. |
| **Bezogene_Energie** | Float | Rechnerisch aufsummierte Energie (Leistung × Zeit). |
| **Is_Peak_Shaving** | Boolean | Vom Manager übermittelter aktueller Betriebsmodus. |

Für alle Sollwerte wird jeweils eine Hysterese von 5 °C miteingehalten. 
---

## 6. WebFront / Bedienung

Im WebFront dient die Instanz zur Kontrolle und Anpassung der Temperaturvorgaben:
- Einstellen von `Mindesttemperatur`, `Maximaltemperatur` und `Legionellentemperatur`.
- Überwachung der aktuellen `Boilertemperatur`.
- Visualisierung der vom Manager freigegebenen `Aktuelle_Leistung`.
- Die Anpassung von Prioritäten (`PV_Prio`, `Sperre_Prio`).

---

## 7. Mapping auf Code-Komponenten

| Komponente | Funktion im Code (`module.php`) |
|---|---|
| **Datenaufbereitung** | `LadeUndSortiereLeistungen()` decodiert das JSON-Array `LeistungsStufen` und sortiert die Watt-Werte aufsteigend. |
| **Temperaturberechnung**| `GetCurrentData()` liest den PT1-Fühler aus und berechnet abhängig von `Boilertemperatur_glätten` den gleitenden Durchschnitt. |
| **Zeitplan & Thermodynamik**| `calculateRequiredHeat()` und `canBoilerReachTemperature()` berechnen über Masse, Temperaturdifferenz und spezifische Wärmekapazität, ob die Restzeit zur Zielerreichung ausreicht. |
| **Betriebslogik & Limits**| `GetCurrentData($Peak)` wertet Temperaturen, Legionellen-Zähler und Peak-Shaving-Status aus und passt die angebotenen `PowerSteps` an. |
| **Leistungszuteilung** | `SetAktuelle_Leistung($power)` ermittelt über `GetKontaktIDZuLeistung()` die passende Aktor-ID und schaltet exakt den geforderten Heizstab ein (und alle anderen aus). |
| **Legionellenschutz** | Erhöht `LegioCounter` zyklisch. Bei Überschreiten definierter Grenzen (z.B. > 69120 Zyklen) wird `MaxTemp` = `LegioTemp` gesetzt. Priorisierter Nachtbetrieb via `ist_nachts()`. |
| **Taktschutz (Idle)** | `CheckIdle()` und `ProcessIdleCounter()` setzen bei Leistungsänderungen den Timer, um erneute Schaltvorgänge temporär zu blockieren. |

---

## 8. Zukünftige Erweiterungen

- **Temperaturschichtung:** Unterstützung für zwei Fühler (Boiler Oben / Boiler Unten) zur präziseren Erkennung der durchgeladenen Energie.