NEWS
Zendure zenSDK Lokal API, SmartMode, SolarFlow AC 800 Pro 2
-
Also habe ich das richtig interpretiert, das eine 8 Sekundenabfrage kein Problem darstellt
Richtig.
Es kann auch mit 6 Sek. gefahrlos getestet werden.
Das Skript arbeitet mit einer Warteschlange (Queue). Das heißt, alle Anfragen (Watt lesen oder Werte schreiben) werden nacheinander abgearbeitet. Damit das stabil bleibt, müssen die Intervalle auf die Timeout-Zeit (2 Sek.) abgestimmt sein.
Voraussetzung ist eine gute, stabile und nicht überlastete WLAN-Verbindung.
Evtl. ein extra WLAN mit Access Point (AP) nur für Zendure-Gerät(e).
Abfrage-Intervall (GET)
const intervalGet = 8;Standard (Empfohlen): 8 Sekunden
Technisches Minimum: 5 Sekunden@Daniel-8 sagte:
und zwischen dem senden immer 5 Sekunden Pause sind?Richtig.
Man kann zwar theoretisch schneller Befehle im ioBroker auslösen, aber das Skript lässt diese erst nach der eingestellten Pause, der Reihe nach, in die Warteschlange.Sende-Pause (POST)
const minTimeBreakForSetDpSec = 5;Standard (Empfohlen): 5 Sekunden
Technisches Minimum: 4 SekundenEDIT:
Siehe vorheriges POST.
Pause kann mit Wert: 0 komplett deaktiviert werden.const minTimeBreakForSetDpSec = 0;
Warum diese Mindestwerte?
Stabilität.-
Die 2x-Timeout-Regel:
Sobald Du einen Wert sendest (POST), schickt das Skript sofort eine Abfrage (GET) hinterher, um den Status zu aktualisieren.
Im Fehlerfall (WLAN-Lag) dauert dieser Vorgang bis zu 4 Sekunden (2x 2 Sek. bei 2000ms Timeout). Die Sende-Pause muss also immer länger als diese 4 Sekunden sein, sonst stauen sich die Befehle in der Warteschlange.. -
Abfrage-Puffer:
Das Abfrage-Intervall (GET) muss deutlich über dem Timeout liegen, damit das Skript Zeit hat, die Warteschlange nach einem Fehler sauber zu leeren.
Wichtig: Bei schlechtem WLAN
Wenn das WLAN nicht absolut stabil ist, sollte man die Zeiten nicht verringern, sondern eher erhöhen:
- intervalGet: auf 10–12 Sekunden
- minTimeBreak (Pause): auf 8 Sekunden
Bei schlechtem Empfang laufen Anfragen evtl. oft in den 2-Sekunden-Timeout.
Wenn man dann zu schnell neue Anfragen nachschiebt, "verstopft" die Kommunikation zum Zendure-Gerät komplett und der interne Prozessor (ESP) kommt nicht mehr hinterher.
Könnte evtl. sogar die Kommunikation beenden.
Nur so ist sichergestellt, dass über HTTP alles reibungslos funktioniert.
Mir ist kein Weg bekannt, das auf andere Weise "sicherer" über HTTP zu gewährleisten.Mit den Standard-Einstellungen funktioniert es im Dauerbetrieb sehr zuverlässig.
Dufte 2 neue Geräte testen.
Herzlichen Dank an die Leihsteller (die nicht genannt werden möchten) für das Vertrauen und den Rabatt beim Übernehmen eines Geräts.
Schade ist nur, dass die gesetzliche EN 18031-Norm bei MQTT/TLS umgesetzt werden musste, was für mich keinen Mehrwert bedeutet.
Das Problem ist die fehlende Flexibilität:
Durch die strikte TLS-Umsetzung (Certificate Pinning) lassen sich die Geräte leider nicht mehr mit einem lokalen MQTT-Broker als Cloud-Ersatz verwenden.Das herkömmliche 'offizielle, lokale MQTT' ist mit der langsamen Aktualisierung, der anderen Struktur und weniger Möglichkeiten zu reglementiert und für mich leider völlig unbrauchbar.
Hoffe nur, dass das zenSDK nicht weiter eingeschränkt wird.
Noch einmal vielen Dank.
-
-
Habe gestern mal dein neues Script eingebunden. Irgendwie habe ich ein Problem, das er den Smartmode nicht immer auf 1 schaltet. Ich trigger auf änderung, lasse eine Email senden, das funktioniert immer. Und gleich im Anschluss steure ich auf 1. Kann es sein wenn der Status noch nicht aktualisert wurde das es dann zum Problem kommt? Habe jetzt mal eine Verweilzeit von 5 sekunden gemacht. Da scheint es zu funktionieren.
Gibt es eigentlich eine Möglichkeit, zu sehen ob in der Warteschlange befehle sind?
-
@maxclaudi
Hab dein Script (Version 2026.04.19_01.15h) jetzt mal mit dem Solarflow 800 Pro 2 getestet (Firmware 1.02) .
Kann ich dieses Script für Windows nehmen ?Ich erhalte beim Start folgenden Fehler:
GET parse error: SyntaxError: Unexpected token 'N', "Not Found" is not valid JSON -
@maxclaudi
Hab dein Script (Version 2026.04.19_01.15h) jetzt mal mit dem Solarflow 800 Pro 2 getestet (Firmware 1.02) .
Kann ich dieses Script für Windows nehmen ?Ich erhalte beim Start folgenden Fehler:
GET parse error: SyntaxError: Unexpected token 'N', "Not Found" is not valid JSON@Bernd1967
sorry im meeting.
Firmware aktuell?
Danach oder wenn ja:
To enable the local API, add HEMS and then exit to apply.Also HEMS aktivieren. etwas warten und danach wieder deaktivieren.
-
Okay, Fehler gefunden, das Mistding hat sich ne neue IP im LAN gegönnt und war deswegen nicht erreichbar.Die Daten trudeln jetzt rein.
Super@Bernd1967
Freut mich.
Dann bitte nicht vergessen: mindestens über den Router eine dauerhafte, feste IP zuzuweisen -
Habe gestern mal dein neues Script eingebunden. Irgendwie habe ich ein Problem, das er den Smartmode nicht immer auf 1 schaltet. Ich trigger auf änderung, lasse eine Email senden, das funktioniert immer. Und gleich im Anschluss steure ich auf 1. Kann es sein wenn der Status noch nicht aktualisert wurde das es dann zum Problem kommt? Habe jetzt mal eine Verweilzeit von 5 sekunden gemacht. Da scheint es zu funktionieren.
Gibt es eigentlich eine Möglichkeit, zu sehen ob in der Warteschlange befehle sind?
Habe jetzt mal eine Verweilzeit von 5 sekunden gemacht. Da scheint es zu funktionieren.
Damit meinst Du:
const minTimeBreakForSetDpSec = 5;oder intervall?
minTimeBreakForSetDpSec ist eigentlich nicht nötig und nur eine Schutzfunktion, falls – wie Du richtig erkannt hast:
Kann es sein wenn der Status noch nicht aktualisert wurde das es dann zum Problem kommt?
oder
- wenn ein script zu schnell commands schreibt
- oder mehrere commands (fast) gleichzeitig feuern
edit: dann bitte script(e) der Regelung kontrollieren. - oder das intervall zu groß ist.
Gibt es eigentlich eine Möglichkeit, zu sehen ob in der Warteschlange befehle sind?
Nein, nicht nötig und geht zu schnell.
Bin gerade an einer kompletten Überarbeitung und einem neuen Skript, damit States nicht dauernd so oft geschrieben werden etc. Das geht leider nur schleppend voran, da mir momentan die Zeit fehlt und auch noch die Zeitverschiebung zu meinem Kontakt mit reinspielt.
Edit PPS:
Oder hast Du auf Änderung getriggert und sendest das command erst 5 sek. später?
Falls ja, ist das ein guter Ansatz für einen stabilen Ablauf.
Eventuell könntest du zusätzlich das Intervall noch etwas verkürzen. Das ist jedoch individuell vom Setup abhängig (WLAN-Qualität, Zendure-Geräte etc.). -
Ich habe heute mal angefangen mein ganzes Steuerungsscript umzuschreiben mit deinem Script zur Abfrage. Da ist mir aufgefallen, das im pass Modus der wert nicht 1 sondern 2 ist.

Ich habe heute mal angefangen mein ganzes Steuerungsscript umzuschreiben mit deinem Script zur Abfrage. Da ist mir aufgefallen, das im pass Modus der wert nicht 1 sondern 2 ist.

Ok, laut Dokumentation sollte es eigentlich nur 0 und 1 geben.
Das Skript schreibt exakt den Wert in den Datenpunkt, der im JSON-Stream unter dem Key pass geliefert wird.
Warum dort eine 2 ankommt, obwohl das SDK nur 0 und 1 vorsieht, ist mir rätselhaft.
Es gibt auch über die Cloud für pass nur 0 (Bypass aus) oder 1 (Bypass aktiv).Zur Steuerung wird eigentlich ein separater, interner Key verwendet (passMode). Dieser hat die Werte 0 (Automatik), 1 (immer ausgeschaltet) und 2 (immer eingeschaltet).
pass selbst informiert normalerweise nur darüber, ob der Bypass aktiv ist oder nicht.Bleibt abzuwarten, ob Zendure hier etwas an der API-Struktur ändert oder ob es ein temporärer Fehler im zenSDK-Output ist/war.
-
Ich logge gerade die Variable pass mit. Irgendwie schaltet die so ziemlich oft am Tag. In der früh ist das ja noch ok. Aber ab ca. 10 Uhr hat der Akku eigentlich genug SOC das der Speicher nicht in den Bypass schalten muss. Ich bin mir auch nicht sicher ob der Wirklich schaltet oder das nur ein Anzeigefehler ist. Hat jemand ein ähnliches Verhalten. Ich habe einen 800Pro
0 = Bypass aus
2 = Bypass ein
Die Zahl dazwischen ist nur eine addierte Zahl, das ich sehe wie oft er geschalten hat
-
Ich logge gerade die Variable pass mit. Irgendwie schaltet die so ziemlich oft am Tag. In der früh ist das ja noch ok. Aber ab ca. 10 Uhr hat der Akku eigentlich genug SOC das der Speicher nicht in den Bypass schalten muss. Ich bin mir auch nicht sicher ob der Wirklich schaltet oder das nur ein Anzeigefehler ist. Hat jemand ein ähnliches Verhalten. Ich habe einen 800Pro
0 = Bypass aus
2 = Bypass ein
Die Zahl dazwischen ist nur eine addierte Zahl, das ich sehe wie oft er geschalten hat
Ich logge gerade die Variable pass mit. Irgendwie schaltet die so ziemlich oft am Tag. In der früh ist das ja noch ok. Aber ab ca. 10 Uhr hat der Akku eigentlich genug SOC das der Speicher nicht in den Bypass schalten muss. Ich bin mir auch nicht sicher ob der Wirklich schaltet oder das nur ein Anzeigefehler ist. Hat jemand ein ähnliches Verhalten. Ich habe einen 800Pro
0 = Bypass aus
2 = Bypass ein
Die Zahl dazwischen ist nur eine addierte Zahl, das ich sehe wie oft er geschalten hat@Daniel-8, habe dich nicht vergessen, habe nur gerade viel Arbeit.
Nebenher ist ein neues, verbessertes Skript in Arbeit und zu 80 % fertig.Ich wundere mich sehr, dass dir bei so vielen Aufrufen des Threads bisher niemand geantwortet hat.
Kurz zum Thema:
pass (Info) zeigt bei dir viele Schaltvorgänge des Bypass.
Auffällig ist zudem, dass hier anscheinend der passMode gespiegelt wird. Statt der reinen Info 0/1 siehst du 0/2
(was normalerweise der echte Set Key für den Bypass-Modus passMode wäre).Das kann aber durchaus so sein und zusätzlich an bestimmten Tagen auftreten.
Der Bypass schaltet am Anfang öfter ein und aus, weil die Batterien bei 100 % SoC nicht sofort dauerhaft stabil auf diesem Wert bleiben.
Das BMS gönnt den Batterien gegen Ende "Ruhephasen",
wodurch sie abkühlen.
Nach der Ladung bzw. in der Ruhephase sinkt die Spannung leicht wieder ab (das nennt man auch Sackspannung).
Dann wird gewartet und der Bypass wieder aufgehoben, damit die Batterien noch einmal „langsam“ nachgeladen werden.
Dies wiederholt sich ein paar Mal, bis die Batterien letzten Endes als wirklich voll gelten.
Das wird von der Firmware und dem BMS anhand diverser Parameter festgestellt – wie z. B. minVol, maxVol oder der Differenz dazwischen (Zelldrift), Temperatur usw.
So bestimmt das BMS den Gesundheitszustand (State of Health) und den echten „Full“-Status.
Dass die Firmware hier bei wechselhafter Bewölkung (fluktuierende PV-Leistung) oder wechselnden Lasten etwas „nervös“ reagiert, ist ein bekanntes Verhalten bei Solar-Firmware-Logiken.Bei mir funktionierte das mit allen Zendure-Geräten bisher immer zufriedenstellend.
Große Ausnahme war und ist das automatische Abschalten des Bypass.
Deshalb lasse ich den Bypass zwar automatisch einschalten, aber das Ausschalten erledige ich manuell bzw. per Skript.
Dazu nutze ich:
- Astronomischer Sonnenuntergang + Versatz von -x Min.
- Ab dann wird geprüft, ob die PV-Leistung für x Min. unter x Watt liegt.
Wenn ja, setze ich Bypass auf „immer aus“ (passMode: 1). In der Nacht schalte ich dann wieder auf passMode: 0 (Bypass auf Automatik).
Leider ist (zumindest Stand heute, 28.04.2026) das Umschalten des Bypass-Modus im offiziellen zenSDK (noch?) nicht vorgesehen.
Bei der Verwendung eines 1600AC+ stört mich das weniger, da ich selbst entscheide, wann geladen/entladen wird und keine PV-DC-Anschlüsse vorhanden sind.
Aber bei Systemen mit direkten PV-Modul-Anschlüssen ist das natürlich.... nicht ideal.Jetzt war's mal wieder doch nicht so "kurz zum Thema", sorry.
-
Vielen Dank für die Infos.
Ja das in der Früh der Bypass öfter hin und her schaltet sehe ich ja noch ein. Aber das er am Mittag hin und her schaltet ist komisch. Weil da der Akku definitiv nicht voll war. Er war gestern auf maximal 66%. Ich bin mir auch nicht sicher ob er wirklich umschaltet. Denn PassMode kann ich ja leider nicht umschalten beim Solarflow 800Pro. Zumindest habe ich noch keine Möglichkeit gefunden -
@maxclaudi
"Nebenher ist ein neues, verbessertes Skript in Arbeit und zu 80 % fertig."Was wird denn verbessert? hat es was mit meinem Smartmode zu tun? Ich hoffe ich muss nicht nochmal alles neu machen für mein Steuerungsscript.
-
Hallo,
ich habe ein für mich unerklärliches Problem mit dem Script. Alles läuft problemlos und dann kommt eine Fehlermeldung:
javascript.0
2026-04-30 21:35:55.654 info script.js.Scripte.Zendure_Pro_2: Stopping scriptjavascript.0
2026-04-30 21:35:55.654 error script.js.Scripte.Zendure_Pro_2: Script is calling setState more than 1000 times per minute! Stopping Script now! Please check your script!
Ich habe nur ein kleines Script laufen, was alle 10 Sekunden Setoutputlimit anhand eines Bedarfswertes ändert.

-
Hat sich erledigt. Ich habe diese Erklärung zu den Einstellungen erst im Nachgang gefunden:
-> Instanzen -> javascript-Adapter -> Allgemeine Einstellungen -> "Maximale setState-Anfragen pro Minute pro Skript" auf 5000 erhöhen.@peschu und @Alle
Bitte auch sicherstellen, dass Zendure-Gerät(e) immer die gleiche IP im Heimnetz zugewiesen bekommen.
Beispiel FRITZ!Box 7590:
Übersicht -> Heimnetz -> Netzwerk -> Netzwerkverbindungen.
Hier Zendure-Gerät(e) ausfindig machen.
Dann auf Stiftsymbol (rechts davon) klicken (bearbeiten).
Oben klicken auf TAB (Reiter) "Heimnetz"."IPv4-Adresse dauerhaft zuweisen" aktivieren.
Danach "übernehmen" (speichern).

Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden
