Da Zenudure es leider noch nicht geschafft hat, eine Möglichkeit anzubieten den Speicher direkt mit dem Shelly zu verbinden hab ich mich selber mal hingesetzt und ein Skript geschrieben welches dies tut. Alle Infos dazu sind auch hier auf Github.
Getestet habe ich das ganze mit dem SolarFlow 800 Pro.
Vorgesehener Einstellung des Herstellers
Um beide Geräte miteinander zu verbinden müsste folgendes getan werden: Einen Account bei Zendure und bei Shelly angelegt werden. Danach kann sich in der Zendure-App mit dem Shelly account angemeldet werden und beide Geräte Tauschen alle Einstellungen über das Internet aus. Danach funktioniert die Kommunikation über das Lokale Netzwerk. (Unter der Voraussetzung das beide Geräte im Selben Netzwerk sind und einander erreichen können.) Ist dies nicht möglich funktioniert die Kommunikation immer über die Cloud.
Funktion des Skriptes ohne Cloud
Um diese beiden Accounts nicht zu benötigen und auch eine Funktion ohne Cloud zu realisieren ist es möglich den Shelly so zu programmieren, dass er die Steuerung des Speichers übernimmt.
Das eigentliche Setup sieht so aus das der Speicher die aktuellen Zählerdaten vom Shelly aufruft und seine eigene Leistung anpasst. Alternativ ist es dank der Rest Schnittstelle der Zendure Geräte möglich das Ganze umzudrehen und die aktuellen Werte des Zählers an den Speicher zu übermitteln.
Funktion des Skripts
Das Skript besteht aus verschiedenen Teilen bzw. gibt es mehrere Versionen des Skripts.
Hauptfunktion
Die Hauptfunktion des Skripts fragt die aktuelle Leistung des Speichers ab, vergleicht diesen mit dem aktuellen Zählerwerten und passt die Differenz an und übermittelt diesen neuen Wert an den Speicher.
Erweitertes Verhalten
Um den Speicher im Netzwerk zu finden, gibt es drei Versionen des Skriptes. Bei dem ersten wird die IP-Adresse oder Hostname manuell eingestellt. In dem zweiten wird die Mac-Adresse des Speichers angegeben (dies Funktioniert, nur wenn der Speicher mit dem Access-Point des Shelly verbunden ist und dieser im Repeater Mode ist). Das dritte Skript sucht anhand der Seriennummer selbständig dem Speicher in allen verfügbaren Netzwerken.
Suche des Speichers im Netzwerk
In dem Skript mit der Suche nach dem Speicher werden alle möglichen IP-Adressen in allen verfügbaren Netzwerk via Http-Rest-Call aufgerufen bis der Speicher gefunden wurde. Die gefundene IP-Adresse wird danach im Lokalen Speicher des Skripts gespeichert, um dies beim Nächsten Start sofort wieder zur Verfügung zu haben. Sollte der Speicher über einen längeren Zeitraum nicht erreichbar sein wird dieser erneut automatisch gesucht. Somit ist eine dauerhafte Funktion des Skrips gewährleistet, auch wenn der Speicher eine neue IP-Adresse erhält oder ein neues WLAN-Netzwerk eingerichtet wird.
Einrichtung des Skripts
Um das Skript einzurichten wird auf dem Shelly die Skriptseite http://192.168.33.1/#/scripts aufgefunden und ein neues Skript erstellt. Danach wird der Quellcode des gewünschten Skriptes eingefügt. Anschließend können die benötigten Variablen gesetzt werden.
Die genaue Beschreibung aller Variablen kann auch hier nachgelesen werden.
Alternativ kann auch meine eigene Solar-App (Windows/Linux/Android) zur Einrichtung verwendet werden. Diese ist etwas komfortabler, als es manuell zu machen. Eine Anleitung dazu gibt es hier.
Benötigte Variablen
Die Folgen Variablen müssen eingestellt werden
- SERIAL: Die Seriennummer des Speichers
- HOST: (Nur im IP-Skript) IP-Adresse oder Hostname des Speichers im Netzwerk
- MAC: (Nur im Mac-Script) Die Mac Adresse des Speichers
Nachtrag: Mittlerweile gibt es auch eine Auto-Discovery-Variante des Skripts, die den Speicher selber findet (keine IP- oder Mac-Adresse mehr benötigt).
Optionale Variablen
Mit den folgenden Variablen lässt sich das Verhalt des Skripts anpassen. Die Standardparameter sind im Normalfall allerdings passend.
- REVERSE: Einstellung ob der Speicher vom Netz laden soll, wenn der verbrauch Negativ ist. Dies kann hilfreich sein, wenn ein zweiter Wechselrichter parallel zum Speicher betrieben wird. Der überschüssige Strom kann dann auch in den Speicher fließen. Ist dies nicht der Fall, kann der Wert auf „false“ gelassen werden.
- MAX_POWER: Maximal abzugebender Strom vom Speicher an das Stromnetz
- MAX_POWER_REVERSE: Maximaler Strom den der Speicher vom Stromnetz bezieht.
- STARTUP_POWER: Stromverbrauch ab welchem der Speicher anfängt Storm in Netz abzugeben. Geringe Mengen werden vom Speicher ignoriert.
- STOP_POWER: Stromverbrauch Obergrenze, ab welchem der Speicher abschaltet und in den Standby-Modus wechselt.
- REVERSE_STARTUP_POWER: Überschussstrom ab welchem der Speicher anfängt Storm in Netz abzugeben. Geringe Mengen werden vom Speicher ignoriert.
- REVERSE_STOP_POWER: Überschussstrom Untergrenze, ab welchem der Speicher abschaltet und in den Standby-Modus wechselt.
- DEBUG: Aktiviert erweitertes Logging zum Bessern Verständnis des Skriptes oder zur Fehlersuche.
Erweiterte Variablen
Die folgenden Parameter können angepasst werden, sind allerdings schon gut gewählt. Es kann sein das bei Falschen werten eine Funktion oder zumindest eine gute Funktion des Skripts nicht mehr gewährleistet ist.
- INTERVAL_RUN_MAIN_SCRIPT: Zeitintervall in Sekunden in welchem die Leistungssteuerung ausgeführt wird.
- INTERVAL_RESOLVE_MAC: (Nur im Mac-Skript) Zeitintervall in Sekunden in dem versucht wird die Mac-Adresse zur IP-Adresse aufzulösen.
- INTERVAL_SCAN_NETWORK: (Nur im Find-Skript) Zeitintervall in Sekunden in dem versucht wird das Gerät zu finden (wenn es nicht erreichbar ist).
- INTERVAL_DEVICE_OFFLINE: (nur im Find-Skript) Zeitintervall, in welchem der Speicher als nicht erreichbar angesehen wird und ein erneuter Scan ausgeführt wird.
- CHECK_WIFI_AP, CHECK_WIFI_STA, CHECK_ETH: Mit diesen Variablen wird angegeben welche Netzwerke nach dem Speicher gescannt werden sollen. Das Abschalten der nicht verwendeten beschleunigt den Scan.
Nach dem Einrichten der Variablen muss das Skript nur noch gestartet werden und der Autostart des Skript eingestellt werden.
Erweiterungen
Verbesserung des Skripts um Fehlverhalten des Speichers auszugleichen.
Nach einiger Laufzeit des Skripts sind mir einige Probleme aufgefallen, welche zwar eher auf ein nicht ganz optimales Verhalten des Speicher zurückzuführen sind weniger auf einen Fehler im Skript. Nichtsdestoweniger könnten dies verbessert werden. Das Verhalten des Speichers kann hier begutachtet werden. Dies ist ein Testaufbau mit eingerichtetem Skript.
Speicher leer bei hoher Leistung
Näher sich der Speicher dem Ende seiner Kapazität und sinkt die Batteriespannung unter einen bestimmten Wert, wird die Batterie nachträglich wieder vom Netz geladen, da die aktuelle Ermittlung der Restkapazität wohl falsch war.
Hier könnte es von Vorteil sein die Leistung etwas zu Drosseln, wenn sich der Kapazität dem Ende neigt.
Stromabgabe bei geringer Solarleistung
Wird der Speicher Morgens wieder geladen und es könnte bereits wieder Strom abgegeben werden. Toggelt der Speicher immer wieder zwischen dem Zustand einspeisen mit voller Leistung und abschalten da er gelehrt ist. Hier könnte es hilfreich sein die geforderte Leistung geringer als wirklich einzustellen, um dies zu vermeiden. Allerdings sollte der Speicher hier auch wieder in den Bypass Modus wechseln was aber nicht immer der Fall ist…
Überwachung und Neustart des Skripts
Da es nicht ausgeschlossen ist dass, das Skript mal abstürzt, wegen eines Fehlers, kann hier ein zweites Skript installiert werden, welches den Zustand des ersten Skripts überwacht und bei einem Absturz neu startet.
Online Monitoring
Da der Speicher leider keine Statistiken anbietet, müssen diese zusätzlich ermittelt und berechnet werden. Dies kann gut mit Homassistant oder einem anderen Tool gemacht werden. Wer dies allerdings nicht hat oder aufsetzten möchte, kann mit dieser externen online Monitoring Seite (Github hier) und diesem Skript, welches die Daten ermittelt dies realisieren.
Verbindung des Speichers mit dem Heim-WLAN
Ach ja das noch. Um den Speicher mit dem Heim-WLAN zu verbinden, sollte eigentlich die Hersteller App verwendet werden. Dies ist allerdings auch mit diesem Skript oder dieser App möglich. Somit muss auch hierfür kein Account erstellt werden.
Hi,
ich versuche gerade das ‚control_zendure_power_ip.js‘ mit Zendure Flow 800 Pro
und erhalte diese logs:
[136579 Zendure Power Script]: Skipped execution still one running: 50000 9:19:26
[141579 Zendure Power Script]: Skipped execution still one running: 10000 09:19:31
[146579 Zendure Power Script]: Skipped execution still one running: 15000 09:19:36
[147711 Zendure Power Script]: error while getting status of power station, no post performed: -104 -104: Timed out 09:19:38
[156579 Zendure Power Script]: Skipped execution still one running: 4999 09:19:46
Habe
die Shelly-Firmware auch mal auf die Beta 2.0.0 geupdated mit demselben Ergebnis.
Hast Du einen Tipp?
Andy
Hallo Andy,
das Problem ist, dass der Speicher unter der angegebenen Adresse keine Antwort gibt. Ist die IP-Adresse korrekt? Probier mal im Browser die URL http://HIER_IP_ADRESSE_EINFÜGEN/properties/report aufzurufen. Hier sollte dir der Speicher eine Antwort liefern. Wenn nicht, ist entweder die Adresse falsch oder aber die API ist nicht aktiviert. Letzteres hab ich zwar noch nie gesehen, aber in einigen Foren habe ich gelesen, dass man die wohl über die offizielle App ein und ausschalten kann (bei meinen Geräten habe ich das aber noch nie gesehen).
Hallo Tost,
sorry, war ’ne Woche weg:
„http://192.168.178.139/properties/report“ funktioniert:
{„timestamp“:1782553897,“messageId“:1,“sn“:“EOA1NHN3Nxxxxxx“,“version“:2,“product“:“solarFlow800Pro“,“properties“:{„heatState“:0,“packInputPower“:0,“outputPackPower“:488,“outputHomePower“:100,“remainOutTime“:59940,“packState“:1,“electricLevel“:72,“gridInputPower“:0, ….etc
(oder willst Du den Output komplett)?
Seriennummer ist auch korrekt
Hi Andy,
das sieht doch erst mal sehr gut aus. Allerdings läuft der Request vom Shelly aus mit Timeout von dem Shelly ins Leere. Nur noch mal zum Verständnis:
Was du auch mal versuchen könntest, ist, auf dem Shelly bei Advanced → Diagnostics einen HTTP-Ping auf die Speicher-URL zu machen und zu schauen, was da rauskommt (keine Garantie, dass das überhaupt geht oder hilfreich ist).
Hi,
beide Geräte im selben WLAN, kein Gast-WLAN o.ä., Variable HOST = „192.168.xxx.xxx“;
Ping geht nicht: FAILED
Muß ich den SF800Pro irgendwie auf „Smart-Modus“ setzen? Wenn ja, wie?
Mhm…
Merkwürdig. Fakt ist das der Shelly den speicher nicht erreichen oder aber in einen Timeout läuft (also der Speicher nicht schnell genug auf die Anfrage antwortet, wobei 15 Sekunden auf jeden Fall reichen sollten (Standardeinstellung)). Da der Speicher aber die Anfrage von deinem eigenen Gerät antwortet, liegt das Problem nicht am Speicher selber. Selbst wenn die Antwort, die er gibt, nicht passen würde, würde es einen anderen Fehler geben. Kannst du mal zu Testzwecken das Skript hier installieren? Diese scannt dein Netzwerk automatisch und sucht den Speicher IP selbständig. Im Skript musst du wieder die variable: SERIAL wieder setzten und stell auch die DEBUG Variable mal auf true um alles mitzulesen was passiert.
Das Scannen aller Adressen kann eine ganze weile in Anspruch nehmen als lass das Skript einfach mal ein paar Minuten laufen.
[625912830 Zendure Power Script]: HTTP request error (-104): -104: Timed out from IP: 192.168.178.137
15:08:55
[625912934 Zendure Power Script]: check ip for zendure: 192.168.178.138
15:08:55
[625913855 Zendure Power Script]: Main script no run -> Hostname or ip not set, scanning?: true
15:08:56
[625914301 Zendure Power Script]: HTTP request error (-104): -104: Timed out from IP: 192.168.178.138
15:08:56
[625914396 Zendure Power Script]: check ip for zendure: 192.168.178.139
15:08:56
[625915765 Zendure Power Script]: HTTP request error (-104): -104: Timed out from IP: 192.168.178.139
15:08:58
[625915863 Zendure Power Script]: check ip for zendure: 192.168.178.140
15:08:58
[625917232 Zendure Power Script]: HTTP request error (-104): -104: Timed out from IP: 192.168.178.140
15:08:59
[625917326 Zendure Power Script]: check ip for zendure: 192.168.178.141
15:08:59
[625918696 Zendure Power Script]: HTTP request error (-104): -104: Timed out from IP: 192.168.178.141
15:09:01
[625918789 Zendure Power Script]: check ip for zendure: 192.168.178.142
15:09:01
[625918889 Zendure Power Script]: Main script no run -> Hostname or ip not set, scanning?: true
15:09:01
[625920217 Zendure Power Script]: HTTP request error (-104): -104: Timed out from IP: 192.168.178.142
15:09:02
Habe das Script gestoppt, nachdem die Zendure-IP durch war. Also time out error
Mhm… das habe ich fast schon erwartet, du kannst das Skript noch etwas laufen lassen es erhöht mit jedem Durchlauf den gesetzten Timeout, aber ich befürchte, es wird nichts ändern.
Meine Vermutung ist, dass du eine merkwürdige Netzwerkkonfiguration (vielleicht Firewall auf dem Router oder Zugriffsbeschränkung für bestimmte Geräte) hast, die es verbietet dem Shelly via Rest auf dem Speicher zuzugreifen. Um das genauer zu testen, könntest du dir erstmal ein eigenes Shelly Skript schreiben (oder mit KI generieren), welches den Speicher abfragt und das Resultat auf die Konsole ausgibt. Wenn das geht, sollte auch das Skript danach auch laufen. Bei dem eigenen Skript kannst du auch den Timeout für die Anfrage, hochsetzten um zu prüfen, ob das vielleicht hilft.
Immerhin weiß ich jetzt, wo ich suchen kann. Danke.
Bin für heute aber erstmal durch.
LG
Hallo Tost,
muß ich den SF800Pro noch irgendwo auf „Smart“ umstellen? Oder den Shelly irgendwo umschalten, HEMS oder sowas? Oder erstmal das machen was Du unter „Vorgesehener Einstellung des Herstellers“ beschrieben hast?
bisher habe ich:
Netzwerk nochmal gecheckt,
Fritzbox gecheckt,
Account bei Shelly angelegt (hatte bisher nur über die Shelly-IP 192.168.33.1 zugegriffen und ins Heimnetz eingebunden),
Shelly in die App eingebunden,
Script über Rechner in den Shelly geschmissen,
Script über die App gestartet:
In der Zendure-App sehe ich keine Änderung im Energiefluss.
Die Shelly-App gibt keine Errors aus, wo auch? Über den Browser habe ich aber dasselbe Ergebnis wie vorgestern.
LG
2 Fragen und eine Anmerkung:
F1: tost11 beschreibt Zendure Solarflow 800 Pro in seinem Projekt. Weiss jemand, ob das Script auch mit einem Zendure Hub 2000 kommunizieren kann? Es ist natürlich denkbar, dass die ZenAPI für beide Typen identisch ist, aber verlässliche Aussagen dazu fand ich bisher noch nicht.
F2: Ich kann als C++-Entwickler Javascript halbwegs lesen, aber nicht schreiben. Weiss jemand, ob die Scripte von tost11 auch mit paar Anpassungen oder Umleitungen auf der Kommandozeile unter Linux mit einem Zendure Gerät kommunizieren können?
Anmerkung an @brony zu „Allerdings sollte der Speicher hier auch wieder in den Bypass Modus wechseln was aber nicht immer der Fall ist“: zum einen lese ich in diversen Foren, dass bei Zendure die Bypass-Relais besser nicht so oft geschaltet werden sollen, zum anderen ist die Bypass-Funktion doch wie bei Anker Solix eher „Wenn Akku 100% voll, dann Bypass alles vom PV auf den Ausgang“, also erst gegen Mittag, wenn der Akku endlich ganz voll ist zu erwarten, oder?
F1: Keine Ahnung, ich habe noch nicht den HUB testen können und in der Doku vom Zendure-SDK ist er noch nicht aufgeführt (aber z. B. der Solar Flow 800 Pro 2 auch nicht, aber der geht!). Solange aber die Rest-Endpunkte verfügbar sind und die Parameter gleich heißen, sollte es laufen.
F2: Ja klar, man müsste halt die Shelly-internen Funktionen wie z. B. HTTP.Get durch nen Curl ersetzen und irgendwie anders an die aktuellen Stromwerte vom Zähler kommen. Aber sonst steht einer Implementierung da nichts im Wege.