# Symcon Belevo Energiemanagement Modul

Dieses Modul implementiert das neuartige Energiemanagementsystem der Belevo AG in IP-Symcon.  
Es verteilt elektrische Leistung auf mehrere Verbraucher (z. B. Elektroauto-Ladestationen, Boiler, Speicher) dynamisch nach Priorität und Fairness. Unterstützt werden:

- **Einzel­haus-Anschlüsse**  
- **ZEV/V-ZEV-Verbundsysteme**  
- **Lasten­management-Gemeinschaften (LEG)**  

---

## Besonderheiten & Vorteile

- **Vollständige Skalierbarkeit** von Einfamilienhaus über ZEV/V-ZEV bis LEG  
- **Standardisierte Schnittstelle** für Manager ↔ Verbraucher (kein ständiges Nachkonfigurieren)  
- **Fairness** bei gleicher Priorität durch Round-Robin-Verteilung der Leistungsschritte  
- **Bidirektionaler Betrieb** (z. B. Batteriespeicher, bidirektionale Ladestationen)  
- **Dynamische Tarif­gestaltung** über Prioritätsklassen  
- **Automatisches Peak-Shaving** ohne teure Netzspitzen  
- **Einfaches Hinzufügen/Entfernen** von Verbrauchern (aktuell manuell, später automatisch möglich)  

---

## Voraussetzungen

- IP-Symcon **≥ 8.0**  
- Zugriff auf das Git-Repository  

---

## Installation

1. In IP-Symcon **Module Control** öffnen  
2. **Hinzufügen → Git-Repository**  
3. URL eintragen:   https://git.belevo.ch/dh/Symcon_Belevo_Energiemanagement_testing.git
4. Modul installieren und IP-Symcon neu starten  

---

## 1. Manager-Instanz anlegen

1. Rechtsklick auf **Instanzen** → **Instanz hinzufügen**  
2. Filter: **Belevo**  
3. **„Manager“** auswählen und Instanz erstellen  

### Manager-Eigenschaften

| Property                           | Typ             | Beschreibung                                                                 |
|------------------------------------|-----------------|------------------------------------------------------------------------------|
| **Zeit_Zwischen_Zustandswechseln** | Integer (Sek.)  | Dauer zwischen zwei Zyklen (Default: 5 s)                                     |
| **Interval**                       | Integer (Sek.)  | Haupt-Timerintervall zur Neuberechnung                                       |
| **Sollleistung_Max**               | Float (Watt)    | Maximale erlaubte Gesamtleistung am Netzanschluss                            |
| **Ueberschussleistung**            | Float (Watt)    | Untergrenze für Solarlade-Mode (z. B. 0 W)                                    |
| **HauptmanagerAktiv**              | Boolean         | Schaltet die gesamte Manager-Logik ein/aus                                   |
| **Verbraucher_Liste**              | InstanceList    | Liste aller Verbraucher-Instanzen, die der Manager steuern soll              |

### Manager-Statusvariablen

| Ident                   | Typ       | Beschreibung                                                                 |
|-------------------------|-----------|------------------------------------------------------------------------------|
| **Is_Peak_Shaving**     | Boolean   | `true` = Peak-Shaving-Mode; `false` = Solarlade-Mode                         |
| **LetzteBerechnung**    | DateTime  | Zeitstempel der letzten Ausführung                                           |
| **Aktuelle_Differenz**  | Float (W) | Zuletzt berechnete Soll–Ist-Differenz                                        |

---

## 2. Verbraucher-Instanzen anlegen

Für jedes zu steuernde Gerät:

1. Rechtsklick auf **Instanzen** → **Instanz hinzufügen**  
2. Filter: **Belevo**  
3. **„Belevo EMS Verbraucher“** auswählen und Instanz erstellen  

### Verbraucher-Eigenschaften

| Property        | Typ        | Beschreibung                                                               |
|-----------------|------------|----------------------------------------------------------------------------|
| **PV_Prio**     | Integer    | Priorität im Solarlade-Mode (niedriger = höhere Priorität)                |
| **Sperre_Prio** | Integer    | Priorität im Peak-Shaving-Mode (niedriger = höhere Priorität)            |
| **PowerSteps**  | String     | JSON-Array möglicher Leistungsstufen in Watt, z. B. `[0,1000,2000]`       |

### Automatisch angelegte Variablen

| Ident                | Typ      | Profil       | Beschreibung                                                          |
|----------------------|----------|--------------|-----------------------------------------------------------------------|
| **Power**            | Float    | ~Watt~~W~    | Aktuell angeforderte Leistung (W)                                     |
| **Aktuelle_Leistung**| Float    | ~Watt~~W~    | Vom Manager zugewiesene Leistung im aktuellen Zyklus (W)             |
| **Bezogene_Energie** | Float    | Wh           | Kumulierte Energieabnahme seit Zyklusstart (Wh)                       |
| **Leistung_Delta**   | Float    | ~Watt~~W~    | Differenz zwischen `Power` und `Aktuelle_Leistung` (W)                |
| **Idle**             | Boolean  | —            | `true`, wenn Verbraucher gerade keine Änderung benötigt               |

---

## 3. Funktionsweise

### 3.1 Mode-Entscheid

- In jedem Zyklus liest der Manager den **aktuellen Ist-Netzanschlusswert** (Summe aller `Aktuelle_Leistung`).  
- Er berechnet den **Schwellwert** als  
Threshold = (Sollleistung_Max + Ueberschussleistung) / 2

markdown
Kopieren
Bearbeiten
- Ist der Ist-Wert **> Threshold**, setzt er **Peak-Shaving** (`Is_Peak_Shaving = true`), sonst **Solarladen** (`false`).  
- Diese Boolean teilt er allen Verbrauchern mit, damit sie ihre `PowerSteps`-Arrays entsprechend vorbereiten.

### 3.2 Soll–Ist-Berechnung

- Differenz **D** = `Sollleistung_Max` − Ist-Wert  
- **D > 0**: Bedarf → Solarlade-Zuteilung  
- **D < 0**: Überschuss → Peak-Shaving-Reduktion  

### 3.3 Leistungszuweisung

- Für jeden Verbraucher wählt der Manager die **höchste** Stufe aus `PowerSteps`, die die verbleibende Differenz \|D\| **nicht überschreitet**.  
- Er durchläuft die Verbraucher nacheinander (Round-Robin), bis \|D\| annähernd erschöpft ist.  

**Beispiel**  
- Verbraucher A: `[0,1000,2000]`  Prio 1  5 kWh aktuell 2000 W  
- Verbraucher B: `[0,500,1500,2500]`  Prio 2  0 kWh  aktuell 500 W  
- Verbraucher C: `[0,500,1500,4000]`  Prio 2  10 kWh  aktuell 0 W  
- Verbraucher D: `[0,500,1200,2500]`  Prio 2  15 kWh  aktuell 0 W  
- Verbraucher E: `[0,200,1500]`  Prio 3  15 kWh  aktuell 0 W  

---

#### Sortierte Stufen-Arrays

**Prio 1**  
[A0], [A1000], [A2000]

**Prio 2**  
[B0], [C0], [D0],
[B500], [C500], [D500],
[D1200], [B1500], [C1500],
[B2500], [D2500], [C4000]


**Prio 3**  
[E0], [E200], [E1500]


---

#### Verteilungsschritte

1. **Delta berechnen**  
   - Netzbezug = –5000 W  
   - Sollwert = 0 W  
   → Differenz D = 5000 W  

2. **Bereits verteilte Leistungen aufsummieren**  
   - A = 2000 W  
   - B = 500 W  
   → GesamtVerteilbareLeistung = 5000 + 2000 + 500 = **7500 W**

3. **Prio 1**  
7500 − 0 W (A0) = 7500
7500 − 1000 W (A1000) = 6500
(6500 + 1000 W vorher) − 2000 W (A2000) = 5500

→ A erhält **2000 W**  
→ Rest: 5500 W  

4. **Prio 2**  
5500 − 0 W (B0) = 5500
5500 − 0 W (C0) = 5500
5500 − 0 W (D0) = 5500
5500 − 500 W (B500) = 5000
5000 − 500 W (C500) = 4500
4500 − 500 W (D500) = 4000
(4000 + 500 W vorher) − 1200 W (D1200) = 3300
(3300 + 500 W vorher) − 1500 W (B1500) = 2300
(2300 + 500 W vorher) − 1500 W (C1500) = 1300
(1300 + 1500 W vorher) − 2500 W (B2500) = 300
(300 + 1500 W vorher) − 2500 W (C2500) → negativ → nicht möglich

→ B erhält **2500 W**, C **1500 W**, D **1200 W**  
→ Rest: 300 W  

5. **Prio 3**  
300 − 0 W (E0) = 300
300 − 200 W (E200) = 100

→ E erhält **200 W**  
→ Verteilung beendet (Rest 100 W ungenutzt)  

---

Durch dieses Verfahren – Auf­addierung der bereits verteilten Leistungen, Sortierung nach Priorität und Fairness sowie sukzessive Abarbeitung der Stufen-Arrays – wird die **Gesamtleistung optimal und gerecht** auf alle Verbraucher verteilt.  




---

## 4. Registrierung der Verbraucher

- **Aktuell müssen alle Verbraucher manuell** in `Verbraucher_Liste` eingetragen werden.  
- **Zukünftige Versionen** werden eine automatische Geräteerkennung unterstützen, so dass neue Verbraucher ohne Konfigurationsaufwand hinzukommen können.

---

## 5. Support & Entwicklung

- **Issues & Feature-Requests** bitte im Git-Repository eröffnen.  
- **Entwickler**: Belevo AG  
