no message

This commit is contained in:
2026-05-26 14:01:13 +02:00
parent 296df5aee0
commit f3208942a5
4 changed files with 214 additions and 0 deletions
+143
View File
@@ -0,0 +1,143 @@
# Enelix
Diese Modulbibliothek implementiert das Energiemanagementsystem der Belevo AG (Enelix) 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/Enelix.git
4. Modul installieren
5. Ein Managermodul sowie die gewünschen Verbrauchermodule erstellen und konfigurieren.
---
## 1 Funktionsweise
### 1.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.
### 1.2 SollIst-Berechnung
- Differenz **D** = `Sollleistung_Max` Ist-Wert
- **D > 0**: Bedarf → Solarlade-Zuteilung
- **D < 0**: Überschuss → Peak-Shaving-Reduktion
### 1.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.
## Für das oben beschriebene Verteilverfahren ist ein Patentanmeldeverfahren für den Europäischen Raum im Gange (25207583.3 - 1002)
## Anmelder/Patentinhaber ist die Belevo AG
+16
View File
@@ -0,0 +1,16 @@
{
"elements": [
{
"type": "ValidationTextBox",
"name": "Info",
"caption": "Dieses Modul published MQTT-Nachrichten für andere Module."
}
],
"actions": [
{
"type": "Button",
"caption": "Test Publish",
"onClick": "MBPUB_Publish($id, 'test/mqtt-publish-helper', 'hello');"
}
]
}
+18
View File
@@ -0,0 +1,18 @@
{
"id": "{34978110-F1AA-5FCC-F692-766359C13A57}",
"name": "MQTTPublishHelper",
"type": 3,
"vendor": "Belevo AG",
"aliases": [
"MQTT Publish Helper"
],
"parentRequirements": [
"{043EA491-0325-4ADD-8FC2-A30C8EEB4D3F}"
],
"childRequirements": [],
"implemented": [
"{7F7632D9-FA40-4F38-8DEA-C83CD4325A32}"
],
"prefix": "MBPUB",
"url": ""
}
+37
View File
@@ -0,0 +1,37 @@
<?php
class MQTTPublishHelper extends IPSModule
{
public function Create()
{
parent::Create();
$this->ConnectParent('{F7A0DD2E-7684-95C0-64C2-D2A9DC47577B}');
}
public function ApplyChanges()
{
parent::ApplyChanges();
$this->SetStatus(IS_ACTIVE);
}
public function Publish(string $topic, string $payload)
{
if ($topic == '') {
return;
}
$this->SendDebug('Publish', $topic . ' => ' . $payload, 0);
$this->SendDataToParent(json_encode([
'DataID' => '{043EA491-0325-4ADD-8FC2-A30C8EEB4D3F}',
'PacketType' => 3,
'QualityOfService' => 0,
'Retain' => false,
'Topic' => $topic,
'Payload' => $payload
]));
}
}
?>