Intelligente Lade- und Entladesteuerung für Zendure Solarflow Systeme mit 7 Betriebsmodi, dynamischer Pack-Überwachung und wetter-adaptiven Schwellwerten.
- 7 flexible Betriebsmodi – Von vollautomatisch bis manuell
- CT-Modus mit Schnellregelung – Hausverbrauchsregelung in 2-15 Sekunden
- Dynamische Pack-Erkennung – Automatische Anpassung an 2-4+ Akkupacks
- Wetter-adaptive Schwellwerte – Normal/Schlechtwetter für optimalen Zellschutz
- Sticky Charging – Verhindert Regelflackern durch intelligente Laderegelung
- Zeitplan-System – Bis zu 12 zeitbasierte Slots (Dropdowns statt JSON)
- Multi-Level Logging – ERROR/WARN/INFO/DEBUG für bessere Fehlersuche
- Error Recovery – Automatischer Stop nach 5 Fehlern
- Pure Function Design – Vollständig testbar (24 Testfälle)
- ioBroker Installation
- Zendure Solarflow Adapter
- Stromzähler (Sonoff POWR3, Shelly 3EM, o.ä.) für Hausverbrauchsmessung
- JavaScript Adapter in ioBroker
- Astro Adapter (optional, für Sonnenzeit-Modus)
-
Script importieren
- Script in ioBroker JavaScript Adapter kopieren
- Script aktivieren
-
User-Config anpassen (Zeilen 103-140)
// 1️⃣ ZENDURE DEVICES const HUB_PRODUCT_ID = '73bkTV'; const HUB_DEVICE_ID = '2KpL9mW7'; // ANPASSEN! const ACE_PRODUCT_ID = '8bM93H'; const ACE_DEVICE_ID = 'Xh5Tn3Q8'; // ANPASSEN! // 2️⃣ BATTERY PACKS (2-4+ möglich) const BATTERY_PACKS = [ 'BO4KXMFBM270767', // Pack 1 (AB2000) 'CO4KMCJMD800896', // Pack 2-4 (AB1000) 'CO4KMDWMEK01529', 'CO4KHNAFN091088' ]; // 3️⃣ STROMZÄHLER const POWER_METER_DP = 'sonoff.0.Lesekopf.MT691_Power_curr'; // 4️⃣ ASTRO VARIABLEN const ASTRO_SUNRISE_DP = 'javascript.0.variables.astro.sunrise'; const ASTRO_SUNSET_DP = 'javascript.0.variables.astro.sunset'; // 5️⃣ LOGGING & DEBUG const LOG_LEVEL = 2; // 0=ERROR, 1=WARN, 2=INFO, 3=DEBUG
-
Datenpunkte werden automatisch erstellt
0_userdata.0.Zendure/ ├── Status/ → Script-Ausgaben (Modus, Akku-Status, Alarm) ├── Steuerung/ → Benutzer-Konfiguration (Modus, Schwellwerte, etc.) ├── Persist/ → Interne Variablen (Last-States, Error-Counter) └── Werte/ → Berechnete Werte (minVol, minVol_Schwelle)
Der intelligente Allrounder für täglichen Betrieb.
- Tag: Laden bei PV-Überschuss mit Netzbezugsgrenze
- Nacht: Entladen mit konfigurierbarer Leistung
- SOC 100%: Automatisches Tag-Entladen aktiviert
- Sticky Charging: Ladeleistung steigt schnell, fällt verzögert
Maximales Laden mit PV-Überschuss bis 100% SOC.
- Lädt nur aus PV-Überschuss (kein Netzbezug)
- Dauerhaft max. Ladeleistung solange PV verfügbar
- Kein Entladen (Standby bei 100%)
- Ideal für: Sonnentag vorhergesagt, Akku voll bekommen
Maximales Entladen Tag+Nacht.
- Konstante Entladeleistung (konfigurierbar)
- Minimales Laden nur bei minVol-Schutz
- Ideal für: Netzbezug minimieren, Akku leeren
Kompletter Standby für Service/Transport.
- 0W Laden & Entladen
- Nur Notladen bei kritischem minVol
- Ideal für: Wartung, Lagerung, Updates
Zeitbasierte Automatisierung mit Slots.
- 12 Slots (Slot01-Slot12) frei konfigurierbar via Dropdowns
- Pro Slot: Startzeit (HH:MM), Action (Laden/Entladen/Standby), Leistung (0-1200W)
- Aktiv-Schalter pro Slot (nur aktive Slots werden ausgeführt)
- Automatische Validierung (ungültige Slots werden übersprungen mit Warning)
- Ideal für: Nacht-Tarife, feste Lade-/Entladezeiten
Aktives AC-Laden direkt aus dem Netz.
- Lädt aktiv aus dem Stromnetz (unabhängig von PV)
- Max. Ladeleistung 900W bis 100% SOC
- Dann automatisch Standby
- Ideal für: Schnellladen bei Bedarf, Akkutest, vor erwartetem Stromausfall
Schnelle Hausverbrauchsregelung.
- Schnellregelung: 2-15 Sekunden Takt (Standard: 5s)
- Hysterese: ±10W Totband gegen Überregulierung (konfigurierbar)
- Ziel: Netzbezug konstant auf Zielwert halten (Standard: 0W)
- Nur Entladung (PV-Überschuss lädt automatisch durch HUB)
- Ideal für: 0-Einspeisung, Eigenverbrauchsoptimierung, dynamische Lastanpassung
Alle Einstellungen erfolgen über Datenpunkte in 0_userdata.0.Zendure.Steuerung/:
| Datenpunkt | Beschreibung | Standard |
|---|---|---|
Modus |
Betriebsmodus (Dropdown) | Sonnenzeit |
Netzbezug_Ziel_Laden |
Max. Netzbezug beim Laden | 100W |
Netzbezug_Ziel_Entladen |
Ziel-Netzbezug im CT-Modus | 0W |
Max_Ladeleistung |
Maximale Ladeleistung | 900W |
Entladeleistung_Tag |
Entladeleistung Tag | 1000W |
Entladeleistung_Nacht |
Entladeleistung Nacht | 1000W |
Sunrise_Offset_Min |
Sonnenaufgang +/- Minuten | 0 |
Sunset_Offset_Min |
Sonnenuntergang +/- Minuten | 0 |
Sticky_Charging_Aktiv |
Sticky-Charging ein/aus | true |
Tag_Entladen_Bei_100_Aktiv |
Tag-Entladen bei 100% SOC | true |
CT_Update_Rate_Sekunden |
CT-Regelgeschwindigkeit | 5s |
CT_Hysterese_Watt |
CT-Totband | 10W |
| Datenpunkt | Beschreibung | Standard |
|---|---|---|
Schlecht_Wetter |
Boolean-Schalter für Wetteranpassung | false |
MinVol_Notlade_Schwelle |
Notlade-Schwelle (Normal) | 3.00V |
MinVol_Notlade_Schwelle_Schlecht |
Notlade-Schwelle (Schlechtwetter) | 3.05V |
MinVol_Entladestopp_Schwelle |
Entladestopp-Schwelle (Normal) | 3.10V |
MinVol_Entladestopp_Schwelle_Schlecht |
Entladestopp-Schwelle (Schlechtwetter) | 3.20V |
Automatisierung mit externem Script:
// Home Assistant / ioBroker Forecast-Script
if (temperature < 10 || rainProbability > 60) {
setState('0_userdata.0.Zendure.Steuerung.Schlecht_Wetter', true);
// → Script nutzt automatisch höhere Schwellwerte
} else {
setState('0_userdata.0.Zendure.Steuerung.Schlecht_Wetter', false);
}Jeder Slot hat (Dropdown-basiert, kein JSON mehr!):
- Zeit: Startzeit im Format
HH:MM(00:00-23:59) - Action: Dropdown:
Laden/Entladen/Standby - Leistung: Watt-Wert 0-1200W (je nach Action)
- Aktiv: Boolean-Schalter (nur aktive Slots werden verwendet)
Automatische Validierung:
- Ungültige Zeiten → Slot übersprungen + Warning
- Leistung außerhalb 0-1200W → Auto-Korrektur + Warning
- Ungültige Actions → Fallback auf Standby
- Greift bei
minVol <= minVolNotladein allen Modi- Normal: 3.00V (konfigurierbar 2.90-3.10V)
- Schlechtwetter: 3.05V (konfigurierbar 2.95-3.15V)
- Lädt mit 900W bis
minVol >= Schwelle + 0.10V(Hysterese) - Schützt vor Tiefentladung bei allen Temperaturen
- Blockiert Entladung bei
minVol <= minVolEntladestopp- Normal: 3.10V (konfigurierbar 3.00-3.30V)
- Schlechtwetter: 3.20V (konfigurierbar 3.10-3.40V)
- Hysterese: +0.10V zum Wiederfreigeben
- Dynamisch umschaltbar per
Schlecht_WetterDP
- Erkennt automatisch 2-4+ Akkupacks
- Berechnet minVol aus allen konfigurierten Packs
- Warning bei < 2 Packs erkannt
- Alarm-DP bei 0 Packs (System-Ausfall)
- Fallback auf 3.5V bei fehlenden Werten
Verhindert Flattern an Grenzwerten:
- Notladen: +0.10V Hysterese (gilt für Normal + Schlechtwetter)
- Entladestopp: +0.10V Hysterese (gilt für Normal + Schlechtwetter)
- CT-Regelung: ±10W Totband (konfigurierbar 5-50W)
- Error Counter: Zählt fehlerhafte setState-Versuche
- Auto-Stop: Nach 5 Fehlern Script-Stop + Alarm
- Auto-Reset: Nach 5 Min fehlerfreiem Betrieb
- Watchdog: Überwacht minVol, SOC, hausPower, Astro-Zeiten
- Alarm bei längerem Ausfall kritischer Sensoren
Alle Eingangsdaten werden auf plausible Bereiche geprüft:
- SOC: 0-100% (Fallback: 50%)
- minVol: 2.5-4.0V (Fallback: 3.5V)
- hausPower: -10kW bis +10kW (Fallback: 0W)
- Sunrise/Sunset: HH:MM Format validiert (Fallback: 06:00/18:00)
- Pack-Voltages: 2.5-4.0V, ungültige Werte werden übersprungen
Bei korrupten/fehlenden Sensordaten werden sichere Fallback-Werte verwendet und Warnings geloggt. Verhindert Script-Crashes bei Sensor-Ausfällen.
Status-Datenpunkte in 0_userdata.0.Zendure.Status/:
Modus_Aktuell: Aktueller Modus mit Details (z.B. "Sonnenzeit: Lade 300W")Akku_Leer: Entladestopp aktiv (true/false)Akku_Voll_Tag: 100% SOC, Tag-Entladen aktiv (true/false)Watchdog_Alarm: Sensor-Ausfall erkannt (String mit Details)Modus_Wechsel_Aktiv: Sanfter Modus-Übergang läuft (true/false)
Persist-DPs in 0_userdata.0.Zendure.Persist/:
Error_Counter: Anzahl Fehler seit letztem ResetLast_Ladeleistung: Letzte Ladeleistung (für Sticky Charging)Notladen_Aktiv: Notladen-Flag persistentLast_AcMode: Letzter acMode (für sanfte Übergänge)
Update-Rate anpassen:
- 2-3s: Sehr schnell, höhere Regelgenauigkeit, mehr Schaltvorgänge
- 5s: Empfohlen, guter Kompromiss
- 10-15s: Langsamer, schont Hardware
Hysterese anpassen:
- 5-10W: Höhere Regelgenauigkeit, mehr Anpassungen
- 15-30W: Mehr Toleranz, weniger Schaltvorgänge
- 50W: Maximum, sehr träge Regelung
Standardmäßig aktiv (empfohlen). Deaktivierbar über Sticky_Charging_Aktiv.
Funktionsweise:
- Ladeleistung steigt sofort bei PV-Überschuss
- Ladeleistung fällt nur wenn Netzbezug > Zielwert
- Verhindert nervöses Regelverhalten bei Wolken
Multi-Level Logging System:
const LOG_LEVEL = 2; // Im User-Config-Block- 0 = ERROR: Nur kritische Fehler
- 1 = WARN: Warnungen + Fehler
- 2 = INFO: Standard-Betrieb (empfohlen)
- 3 = DEBUG: Volle Details für Fehlersuche
Log-Beispiele:
ℹ️ INFO: Zeitplan: 5 Slot(s) aktiv (2 übersprungen)
⚠️ WARN: Zeitplan Slot 03: Leistung 1500W außerhalb 0-1200W - korrigiert auf 1200W
❌ ERROR: KRITISCH: 5 konsekutive Fehler - Script wird gestoppt!
🔍 DEBUG: Pack 1 (BO4NHMFBM270767): 3.245V
🐛 Kritische Bugfixes:
- KRITISCH: Akku-Leer-Schutz blockiert nur noch Entladen, nicht Laden (Tag)
- Vorher: Akku-Leer-Flag blockierte sowohl Entladen ALS AUCH Laden → Spannung konnte nicht erholen
- Neu: Tag erlaubt Laden aus PV-Überschuss (normale Regelung), nur Nacht geht in Standby
- Entfernt: Falscher Block der bei Akku-Leer mit max. Leistung aus Netz geladen hätte
- KRITISCH: BLOCK C (Tag-Entladen SOC 100%) prüft jetzt
!akkuLeervor Entladung- Verhindert Entladung trotz niedriger Spannung wenn SOC=100% (kann bei defekten Zellen vorkommen)
- akkuVollTag-Reset: Erfolgt jetzt bei Sonnenuntergang (modusnunabhängig) statt nur in Sonnenzeit-Modus
- Verhindert akkuVollTag bleibt nach Modus-Wechsel hängen
- Zeitplan stoppt Laden bei SOC=100%: Verhindert Energie-Verschwendung im Zeitplan-Modus
- Alle Modi propagieren akkuVollTag: Verhindert Verlust des Flags bei Modus-Wechseln
- Flag-Synchronisation:
akkuLeer/akkuVollTagwerden nach jedemevaluateStep()mit DPs synchronisiert
🔧 Verbesserungen:
- Code-Deduplizierung:
checkAkkuLeer()Helper-Funktion eliminiert ~42 Zeilen duplizierte Entladestopp-Hysterese-Logik aus 6 Modi - akkuVollTag in weiteren Modi: Manuell-Laden und Laden-Prio setzen jetzt
akkuVollTagbei SOC=100% am Tag (nicht nur Sonnenzeit) - CT-Modus akkuLeer-Propagierung:
dpAkkuLeerwird jetzt korrekt propagiert statt hart auffalsegesetzt - Detailliertes Debug-Logging bei Akku-Leer-Flag-Übergängen (Schwellen, Hysterese, Status)
- Test-Konstanten hinzugefügt:
TEST_MINVOL_NORMAL,TEST_MINVOL_WARN,TEST_MINVOL_RECOVERfür Simulation
🔧 Verbesserungen:
- Erhöhte Hysterese für Notladen/Entladestopp: 0.05V → 0.10V (bessere Akku-Erholung)
- Zeitplan-Validierung nur bei aktivem Zeitplan-Modus (verhindert Log-Spam)
- Klarere Unterscheidung zwischen Laden-Prio (nur PV) und Manuell-Laden (aktiv Netz)
- Duplicate Action Prevention: schreibt
setInputLimit/setOutputLimit/setAcModenur bei echter Änderung (±5W Toleranz) - CT-Fallback & Logging: nutzt letztes gültiges OutputLimit bei Sensorfehlern, mit klarer Logmeldung
Neu: Schreib-Toleranz (±W) konfigurierbar
- Datenpunkt:
0_userdata.0.Zendure.Steuerung.Write_Toleranz_Watt - Wirkung: Unterdrückt wiederholte Schreibvorgänge auf
setInputLimit/setOutputLimit, wenn der Unterschied zum Istwert innerhalb der Toleranz liegt. - Empfehlung: 5–20W.
0deaktiviert die Unterdrückung. - Beispiel: Ist=302W, Soll=310W, Toleranz=±10W → kein Write; bei Soll=335W → Write (Δ=33W).
✨ Neue Features:
- User-Config-Block: Alle Einstellungen prominent am Script-Start (Zeilen 103-140)
- Dynamische Pack-Erkennung: Automatisch 2-4+ Packs, Warnings bei Fehlern
- Wetter-adaptive Schwellwerte: 4 konfigurierbare DPs (Normal/Schlecht für Notlade/Entladestopp)
- Multi-Level Logging: ERROR/WARN/INFO/DEBUG statt nur DEBUG-Flag
- Zeitplan-Validierung: HH:MM-Format, 0-1200W Range mit Auto-Korrektur
- Sensor-Daten Validierung: Strikte Bereichsprüfung (SOC 0-100%, minVol 2.5-4.0V, hausPower ±10kW)
- checkNotladen() Helper: ~80 Zeilen eingespart durch Deduplizierung
- validateConfig(): Zentrale Validierung für alle Steuerungs-DPs
- Sanfte Modus-Übergänge: 0W → acMode-Wechsel → neue Leistung (schont Hardware)
- Error Recovery: Auto-Stop nach 5 Fehlern, Reset nach 5min Ruhe
- Pack-Alarm: Watchdog-Alarm bei Pack-Überwachungsausfall
- Astro-Fallbacks: Sichere Defaults (06:00/18:00) bei fehlenden Sunrise/Sunset-Werten
- Code-Optimierung: ~180 Zeilen gespart (deprecated Code entfernt, Kommentare komprimiert)
Feedback und Verbesserungsvorschläge sind willkommen!
Dieses Projekt ist Open Source. Nutze es frei für deine eigenen Zendure Solarflow Installationen.
Dieses Script steuert dein Batteriesystem. Teste gründlich und überwache die ersten Tage aktiv. Keine Garantie für Schäden an Hardware oder Datenverlust. Nutzung auf eigene Gefahr.
Version: 1.03 | Datum: 2025-12-22