# Enelix-Verbrauchermodul Ansteuerung Askoheat

Dieses Modul integriert einen Askoheat-Heizstab als steuerbaren Boiler-Verbraucher in das Belevo Energiemanagement-System (Enelix). Es berechnet dynamisch verfügbare Leistungsstufen, kommuniziert mit dem übergeordneten Manager und steuert die Askoheat-Leistungsvariable anhand von Boilertemperatur, Zeitplan, Legionellenschutz, PV-Überschuss und Peak-Shaving-Anforderungen.

---

## 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

* **Zyklische Steuerung:** In konfigurierbaren Intervallen (`Interval`) berechnet das Modul die aktuell verfügbaren Leistungsschritte und aktualisiert den Status.
* **Askoheat-Leistungsansteuerung:** Die vom Manager zugewiesene Leistung wird auf eine Heizstufe von `0` bis `7` umgerechnet und an die konfigurierte Leistungsvariable (`Variable_Leistung`) gesendet.
* **PowerSteps-Generierung:** Das Modul meldet dem Enelix-Manager ein Array an möglichen Leistungsschritten (`PowerSteps`), basierend auf Boilertemperatur, Betriebsmodus und Boilergrenzen.
* **Peak-Shaving vs. PV-Überschuss:** Im Peak-Shaving-Modus werden Leistungsschritte nur zur Sicherstellung der Mindesttemperatur angeboten. Im PV-Modus können zusätzliche Leistungsschritte bis zur Maximaltemperatur angeboten werden.
* **Temperaturüberwachung:** Berücksichtigung von Mindesttemperatur (`Mindesttemperatur`), Maximaltemperatur (`Maximaltemperatur`) und Legionellentemperatur (`Legionellentemperatur`).
* **Temperaturglättung:** Optional kann die gemessene Boilertemperatur über eine PT1-Filterung geglättet werden.
* **Zeitplan:** Über einen Solltemperatur-Zeitplan kann das Modul prüfen, ob die nächste Zieltemperatur mit der verfügbaren Leistung rechtzeitig erreichbar ist.
* **Legionellenschutz:** Wird die Legionellentemperatur längere Zeit nicht erreicht, erhöht das Modul temporär die Temperaturanforderung.
* **Idle-Schutz:** Nach einer Leistungsänderung kann eine konfigurierbare Sperrzeit (`IdleCounterMax`) berücksichtigt werden, bevor weitere Leistungsänderungen erfolgen.

---

## 2. Voraussetzungen

* IP-Symcon **>= 8.0**
* Modul-URL: `https://git.belevo.ch/dh/enelix.git`
* Vorhandener und eingerichteter Enelix Manager.
* Askoheat- oder Heizstab-Steuerung mit einer schaltbaren Leistungsstufenvariable.
* Temperaturfühler als Variable in IP-Symcon.
* Aktivierte Aktion auf der Leistungsstufenvariable (`Variable_Leistung`).

---

## 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: **Ansteuerung_Askoheat**

### 4.2 Properties

| Name                         | Typ            | Beschreibung                                                            |
| ---------------------------- | -------------- | ----------------------------------------------------------------------- |
| **IdleCounterMax**           | NumberSpinner  | Anzahl der Intervall-Zyklen zwischen zwei Leistungsänderungen.          |
| **Interval**                 | NumberSpinner  | Berechnungsintervall in Sekunden.                                       |
| **BoilerLeistung**           | NumberSpinner  | Maximale Askoheat-Leistung in Watt.                                     |
| **Variable_Leistung**        | SelectVariable | Variable, an welche die Askoheat-Heizstufe `0` bis `7` gesendet wird.   |
| **Variable_Temperatur_Ist**  | SelectVariable | Variable mit der aktuellen Boilertemperatur.                            |
| **Boilertemperatur_glätten** | Select         | Aktiviert die PT1-Glättung der gemessenen Boilertemperatur.             |
| **ZeitKonstante**            | NumberSpinner  | Zeitkonstante des PT1-Filters in Sekunden.                              |
| **Boilervolumen**            | NumberSpinner  | Boilervolumen in Litern für die Berechnung der benötigten Wärmemenge.   |
| **Zeitplan**                 | List           | Liste aus Uhrzeit und Solltemperatur für geplante Boiler-Zielwerte.     |

---

## 5. Statusvariablen & Profile

| Ident                    | Typ     | Beschreibung                                                                   |
| ------------------------ | ------- | ------------------------------------------------------------------------------ |
| **PowerSteps**           | String  | JSON-Array der dem Manager angebotenen Leistungsschritte.                      |
| **Aktuelle_Leistung**    | Integer | Die aktuell geschaltete Soll-Leistung in Watt.                                 |
| **Power**                | Integer | Die aktuell vom Manager zugewiesene Soll-Leistung.                             |
| **Idle**                 | Boolean | Status der Sperrzeit (`true` = bereit für neue Werte, `false` = gesperrt).     |
| **Bezogene_Energie**     | Float   | Rechnerisch aufsummierte Energie (Leistung x Zeit).                            |
| **PV_Prio**              | Integer | Priorität des Verbrauchers für PV-Optimierung, tiefe Nummer = hohe Priorität.   |
| **Sperre_Prio**          | Integer | Priorität des Verbrauchers für Peak-Optimierung, tiefe Nummer = hohe Priorität. |
| **Is_Peak_Shaving**      | Boolean | Vom Manager übermittelter aktueller Betriebsmodus.                             |
| **Boilertemperatur**     | Float   | Aktuelle Boilertemperatur, roh oder geglättet.                                 |
| **Mindesttemperatur**    | Integer | Untere Temperaturgrenze für den Boiler.                                        |
| **Maximaltemperatur**    | Integer | Obere Temperaturgrenze für PV-Überschussnutzung.                               |
| **Legionellentemperatur**| Integer | Zieltemperatur für den Legionellenschutz.                                      |
| **LegioCounter**         | Integer | Interner Zähler für die Legionellenschutzlogik.                                |
| **IdleCounter**          | Integer | Interner Zähler für die Sperrzeit.                                             |
| **Leistung_Delta**       | Integer | Interne Variable für Leistungsdifferenzen.                                     |

Es werden keine eigenen Variablenprofile angelegt.

---

## 6. WebFront / Bedienung

Die Temperaturgrenzen sowie die Prioritäten werden über folgende Variablen eingestellt:

`Mindesttemperatur` - Temperatur, unter welcher der Boiler zwingend freigegeben wird.

`Maximaltemperatur` - Temperatur, bis zu welcher PV-Überschüsse zur Warmwassererzeugung genutzt werden dürfen.

`Legionellentemperatur` - Zieltemperatur für die Legionellenschutzfunktion.

`PV_Prio` - Priorität des Verbrauchers für PV-Optimierung, tiefe Nummer = hohe Priorität.

`Sperre_Prio` - Priorität des Verbrauchers für Peak-Optimierung, tiefe Nummer = hohe Priorität.

`PowerSteps` - Dem Manager angebotene mögliche Leistungsstufen.

`Aktuelle_Leistung` - Tatsächlich geschaltete Leistung.

`Boilertemperatur` - Aktuelle Temperatur des Boilers.

---

## 7. Mapping auf Code-Komponenten

| Komponente                    | Funktion im Code (`module.php`)                                                                 |
| ----------------------------- | ----------------------------------------------------------------------------------------------- |
| **Timer-Registrierung**       | `ApplyChanges()` setzt `Timer_Do_UserCalc_Verb` basierend auf `Interval`.                       |
| **Leistungszuteilung**        | `SetAktuelle_Leistung($power)` setzt `Power`, `Aktuelle_Leistung`, `Bezogene_Energie` und Idle. |
| **Askoheat-Stufenumrechnung** | `SetAktuelle_Leistung($power)` rechnet Watt auf eine Heizstufe von `0` bis `7` um.              |
| **PowerSteps-Berechnung**     | `GetCurrentData($Peak)` erstellt die verfügbaren Leistungsstufen abhängig vom Betriebsmodus.    |
| **7-Stufen-Berechnung**       | `Calc_Seven_Steps($power)` erzeugt Leistungsschritte von `0` bis zur maximalen Boilerleistung.  |
| **Temperaturglättung**        | `GetCurrentData($Peak)` berechnet optional die PT1-gefilterte Boilertemperatur.                 |
| **Zeitplanprüfung**           | `getNextTimeAndTemperature()`, `calculateRemainingTime()` und `canBoilerReachTemperature()`.    |
| **Wärmemengenberechnung**     | `calculateRequiredHeat()` berechnet die benötigte Energie für eine Temperaturdifferenz.         |
| **Legionellenschutz**         | `GetCurrentData($Peak)` verwaltet `LegioCounter`, `Maximaltemperatur` und `Mindesttemperatur`.  |
| **Idle-Logik**                | `ProcessIdleCounter()` verwaltet die Sperrzeit zwischen Leistungsänderungen.                    |
| **Nachtprüfung**              | `ist_nachts()` prüft den Zeitraum von 22:00 bis 07:00 Uhr.                                      |

---

## 8. Zukünftige Erweiterungen


