lumapu / ahoy

Various tools, examples, and documentation for communicating with Hoymiles microinverters
https://ahoydtu.de
Other
954 stars 226 forks source link

Documentation: Tagesertrag zurücksetzen (Ahoy DTU mit Batteriespeicher) Shelly Script Action #1515

Open okapi21 opened 8 months ago

okapi21 commented 8 months ago

Version 0.8.83 Ich betreibe meine Anlage mit einem Batteriespeicher-System. Welche Einstellung muss ich vornehmen, um den Tagesertrag um Mitternacht oder zu einen anderen Zeitpunkt zurückzusetzen? Grüße Ralf

Peertje-62 commented 8 months ago

settings Hope this wil do regards

MetaChuh commented 8 months ago

hi @okapi21 zusätzlich zu den einstellungen in dem unteren screenshot, musst du den batterie inverter um 23:59 via api oder mqtt restarten.

grund: wenn du nur die internen werte der ahoydtu um mitternacht zurücksetzt, wird sich die dtu die noch nicht zurückgesetzten werte des inverters erneut wieder einlesen (darum auch die uhrzeit 23:59 für den neustart des inverters, damit dieser zu mitternacht vorab bereits auf null ist)

Bildschirmfoto 2024-03-20 um 13 39 45

der api befehl, falls du dies mit cron oder taskplaner machen willst, ist:

curl --header "Content-Type:application/json" --request POST \ 
  --data '{"auth": "dein_passwort", "cmd": "restart", "id": deine_inverter_id}' \
  "http://deine_ahoydtu_ip/api/ctrl"

bitte ersetze die werte dein_passwort, deine_inverter_id (0 für den ersten inverter), und deine_ahoydtu_ipmit den werten, die für dich zutreffen.

greetings, metachuh

okapi21 commented 8 months ago

Nur mit den oben gezeigten Einstellungen funktioniert es nicht. Also wie Metachuh schreibt, muss ich den Wechselrichter um 23:59 Uhr zurücksetzen. Leider bin ich totaler Laie was API Befehle und Programmieren angeht. Gibt es irgendwo eine Schritt für Schritt Anleitung? Grüße Ralf

MetaChuh commented 8 months ago

dazu müssten wir wissen was du hast. sonst wissen wir nicht, welche anleitung für dich gilt.

auf was läuft deine steuerung ? also welches gerät ist zu mitternacht 100% jeden tag an ?

raspberry pi ? synology ? mac ? linux pc ? windows?

okapi21 commented 8 months ago

Ich betreibe den Zenture Solarflow, und es geht darum den reinen Tagesvertrag, zurückzusetzen. Von den oben aufgeführten Geräten läuft keins Nachts. Grüße Ralf

MetaChuh commented 8 months ago

Von den oben aufgeführten Geräten läuft keins Nachts.

dann köntest du schauen, ob es in der zendure app eine art timer einstellung gibt, um die dc spannungsversorgung zum inverter um 23:59 kurz zu deaktivieren.

alternative, ohne dem inverter den strom komplett zu nehmen: hast du zufälligerweise einen shelly plus plug s, shelly pro 3em oder ein anderes shelly pm oder em gerät ab generation 2 ? weil auf gen2 geräten, könnten wir, zusätzlich zu den normalen shelly funktionen, eigene kleine scripts einspielen.

okapi21 commented 8 months ago

Ein Shelly Pro 3em (2 Generation) ist voll in Betrieb (funzt auch super). Ein Skript über Diesen wäre natürlich eine Alternative. Wie müsste das Shelly Skript aussehen?

MetaChuh commented 8 months ago

Ein Shelly Pro 3em (2 Generation) ist voll in Betrieb (funzt auch super)

perfekt 👍

Wie müsste das Shelly Skript aussehen?

ich werde mal eins basteln und vorab bei mir testen. shelly user scripts wollte ich schon lange zusätzlich ausprobieren, jetzt gibts einen guten, spezifischen grund.

okapi21 commented 8 months ago

Super, und keine Hektik.👍

MetaChuh commented 8 months ago

super, absolut keine hektik ist immer gut 👍

dev info: im test funktionieren die ersten scripts via shelly bereits einwandfrei. sowohl einen testserver ansprechen, der eine dtu response simuliert und die kommunikation loggt, als auch den inverter reell wahlweise via ahoydtu, opendtu, und opendtu-onbattery zu restarten.

derzeit code ich gerade an dem shelly interface modul, damit user dies nicht nur ausführen können, sondern beliebig im lokalen web interface des shelly devices, oder in der shelly cloud, dieses modul jederzeit aktivieren, deaktivieren, oder die uhrzeiten selbst ändern können.

greetings, metachuh

MetaChuh commented 8 months ago

ein paar zusatzfragen noch:

wieviele inverter hast du, und wieviele davon sind batterie inverter ? wenn mehr als ein inverter existiert, bitte um die reihenfolge aller inverter und ihrer aufgaben (solar/batterie) sowie bitte um die interne lan ip (falls möglich fixe ip) deiner ahoydtu.

grund: die erste version wird vorerst aus zeitgründen nur für dieses spezifische issue gemacht, hat keinen autodetect, und benötigt eine manuelle konfiguration von zumindest der ip der dtu.

okapi21 commented 8 months ago

Ich habe nur einen Wechselrichter Hoymiles HM -1500. Die feste IP der Ahoy DTU lautet 192.168.188.47 Grüße Ralf

MetaChuh commented 8 months ago

@okapi21

hier die erste release inverter mit shelly gen2 via ahoydtu restarten. inklusive einer ersten schritt für schritt anleitung.

anmerkung: die screenshots sind von einem shelly plus plug s. falls die web oberfläche vom pro 3em stark abweicht, könntest du evtl. nachträglich die screenshots ergänzen.


schritt für schritt anleitung: 1) das modul entweder über den direct download link herunterladen, oder aus dem copy-paste bereich kopieren. (bitte das dreieck beim copy paste code anklicken, um den copy-paste bereich sichtbar auszuklappen)

direct download: restart-battery-inverter-via-ahoydtu(meta).mjs.zip

vorschau der modul konfiguration:

// restart-battery-inverter-via-ahoydtu(meta).mjs v0.24.3.22:
// zeitplaner für das neustarten von batterie invertern via shelly script
// (c) 2024 MetaChuh, assigned by lumapu

// ahoydtu und inverter konfiguration:
var dtu_ip =            "192.168.188.47";   // ip der ahoydtu
var dtu_password =      "deinpasswort";     // passwort der ahoydtu
var dtu_inverter_id=        0;          // inverter id (erster inverter=0)
kompletter copy-paste code: restart-battery-inverter-via-ahoydtu(meta).mjs ```mjs // restart-battery-inverter-via-ahoydtu(meta).mjs v0.24.3.22: // zeitplaner für das neustarten von batterie invertern via shelly script // (c) 2024 MetaChuh, assigned by lumapu // ahoydtu und inverter konfiguration: var dtu_ip = "192.168.188.47"; // ip der ahoydtu var dtu_password = "deinpasswort"; // passwort der ahoydtu var dtu_inverter_id= 0; // inverter id (erster inverter=0) // modulbereich: let CONFIG = { KVS_KEY: "Script-Schedule-" + JSON.stringify(Shelly.getCurrentScriptId()), // default zeitplan einstellung, jeden tag um 23:59 durchführen (mcron format) // zeiten und aktivierung/deaktivierung können nachträglich direkt im shelly web interface, oder in der shelly cloud app verändert werden. SCHEDULE_TIMESPEC: "0 59 23 * * *", SCHEDULE_ID: -1, }; // zeitplan aufgabe checken ob bereits vorhanden, wenn nicht, dann neu anlegen: function create_shelly_schedule() { Shelly.call ( "KVS.Get", { key: CONFIG.KVS_KEY, }, function (result, error_code, error_message) { // zeitplan aufgabe anlegen: if (error_code !== 0) { install_schedule(); return; } CONFIG.SCHEDULE_ID = result.value; // zeitplan aufgabe neu anlegen, falls eine vorangegangene aufgabe manuell gelöscht und danach wieder reaktiviert wurde: Shelly.call ( "Schedule.List", {}, function (result) { let i = 0; for (i = 0; i < result.jobs.length; i++) { if (result.jobs[i].id === CONFIG.SCHEDULE_ID) return; } install_schedule(); } ); } ); } // id der zeitplan aufgabe mit abgefragter id im internen key/value storage eintragen: function save_schedule_id_in_kvs(scheduleId) { Shelly.call ( "KVS.Set", { key: CONFIG.KVS_KEY, value: scheduleId, } ); } // zeitplan aufgabe neu anlegen: function install_schedule() { Shelly.call ( "Schedule.Create", { enable: true, timespec: CONFIG.SCHEDULE_TIMESPEC, calls: [ { method: "script.eval", params: { id: Shelly.getCurrentScriptId(), code: "shelly_meta_task()", }, }, ], }, function (result) { // zeitplan aufgabe mit result.id im key/value storage eintragen: save_schedule_id_in_kvs(result.id); } ); } // aufgabe durchführen: function shelly_meta_task() { let post_url = "http://" + dtu_ip + "/api/ctrl"; let post_data = '{"auth": "' + dtu_password + '", "cmd": "restart", "id": ' + dtu_inverter_id + '}'; let post_content_type = "application/json"; Shelly.call ( "HTTP.POST", { "url": post_url, "body": post_data, "content_type": post_content_type, "timeout": 5 } ); } create_shelly_schedule(); ```

2) das web interface des shelly gen2+ gerätes über http://ip_des_shelly_produktes öffnen (in deinem fall der pro 3em) der text ip_des_shelly_produktes ist durch die ip adresse des gerätes zu ersetzen, zb. 192.168.0.50

3) das scripts menü im shelly web interface anklicken und auf create script klicken

shelly gen2 scriptbereich

4) das script in das editor feld einfügen, einen namen vergeben, und auf speichern klicken. (der name kann nach belieben entweder der dateiname sein, oder ein freier text)

shelly gen2 script einfügen

5) im bereich ahoydtu und inverter konfiguration die werte dtu_ip dtu_password und dtu_inverter_idbeliebig anpassen, und danach erneut auf speichern klicken. anmerkung: wenn das shelly device gerade mit anderen aufgaben beschäftigt ist, wird sich der script editor bereich neu laden, und man muss eventuell die daten erneut eingeben und speichern. darum unbedingt die eingaben kontrollieren, bevor man zu schritt 6 weitergeht.

6) um den editor zu verlassen erneut auf das türkise <> scripts menü klicken. dann auf den play button drücken

shelly gen2 script play button

anmerkung: wenn der play button gedrückt wurde, und das script korrekt gestartet werden konnte, erscheint dauerhaft ein pause button

shelly gen2 script play button wurde gedrückt, pause button erscheint

7) mit klick auf das Schedules menü, in den zeitschaltuhr bereich wechseln. hier sollte jetzt restart-battery-inverter-via-ahoydtu(meta).mjsals aufgabe erscheinen und bereits aktiviert sein (schieberegler rechts türkis). und der zeitplan in textform erscheinen (standardwert ist At second 0. At minute 59. At hour 23. Every days. Every months. Every weekdays.)

shelly gen2 schedules bereich

8) optional: mit dem scheberegler bei den schedules lasst sich diese aufgabe nach belieben temporär deaktivieren. mit einem klick auf die aufgabe restart-battery-inverter-via-ahoydtu(meta).mjs erreicht man das advanced schedule für die zeiteinstellung und kann diese beliebig anpassen. in diesem menü kann diese aufgabe auch nach belieben gelöscht, und mit klick auf den play button im shelly script bereich wieder erneut mit den default werten hinzugefügt werden.

shelly gen2 schedules advanced

greetings und viel spaß damit, metachuh

MetaChuh commented 8 months ago

@lumapu please review this assignment and code for completeness, thx.

okapi21 commented 8 months ago

Vielen Dank für Ihre Mühe und die umfangreiche Anleitung schon mal im Voraus. Werde zeitnah Feedback geben.👍 Grüße Ralf

lumapu commented 8 months ago

ich kenne mich mit Shelly Scripten nicht aus, sieht sehr nach Javascript aus

MetaChuh commented 8 months ago

ja, sehr js ähnlich bis identisch.

ich sehe dadurch, sowohl für solar einsteiger die keine weiteren devices haben, sowie für power user, die nur eine kleine spezifische funktion schnell für ihre spezifische anwendung brauchen, durchaus potential wegen der möglichkeit, dass user sich ihre geräte selbst anpassen können, entweder durch selbst einlernen, oder durch vorgefertigte scripts, die man bald vermehrt finden kann.

in theorie haben wir bei jedem user mit zumindest einem shelly plus device, einen bis mehrere weitere esp32 zur verfügung, auf denen ohne custom firmware zu flashen bis zu einer kleinen solar und batteriesteuerung ablaufen könnte.

okapi21 commented 8 months ago

Hallo, Metachuh habe alles bis Punkt 7 abgearbeitet

7. mit klick auf das Schedules menü, in den zeitschaltuhr bereich wechseln.
hier sollte jetzt restart-battery-inverter-via-ahoydtu(meta).mjsals aufgabe erscheinen und bereits aktiviert sein (schieberegler rechts türkis).

Bild_1 leider erscheint in Schedules bei mir nichts. was könnte ich noch ändern? Grüße Ralf

MetaChuh commented 8 months ago

@okapi21

danke dir für dein feedback.

was könnte ich noch ändern?

derzeit gibt es uns nichts bekanntes und verifiziertes was du ändern könntest, da aus der zugewiesenen dev gruppe keiner einen pro 3em hat, und wir derzeit nur auf plus1pm, plus plug s testen konnten.

frage an unsere community: hat jemand einen pro 3em und einem anderen gen2 device, der beides verifizieren kann, und ggf die unterschiede und notwendigen änderungen sieht ?

MetaChuh commented 8 months ago

hallo @okapi21 könntest du vom shelly editor bereich einen screenshot oder foto von ganz oben ab zeile 1 machen ? (dein passwort unkenntlich machen, aber die anführungszeichen sichtbar lassen zur kontrolle) zeile 1 sollte beinhalten: // restart-battery-inverter-via-ahoydtu(meta).mjs v0.24.3.22:

sowie einen screenshot von ganz unten bis zeile 121 machen ? zeile 121 sollte beinhalten: create_shelly_schedule();

und kontrollieren, dass das script korrekt läuft und man den pause button sieht (nicht den play button) ?

evtl ist nur beim einfügen eine kleinigkeit passiert.

MetaChuh commented 8 months ago

anmerkungen:

1) bei der script liste muss nur auf den play button geklickt werden, um das schedule anzulegen. der autostart nach reboot schieberegler im scriptbereich kann deaktiviert (grau) bleiben. ein zeitgesteuerter start wird nur durch shelly schedules durchgeführt.

2) wenn das script einmalig korrekt durchgelaufen ist, sieht man im menü Advanced > KVS die zeile Script-Schedule-[nummer] mit einem wert, der 1 sein sollte. (siehe screenshot)

Bildschirmfoto 2024-03-24 um 06 58 56
okapi21 commented 8 months ago

Hallo Metachuh

könntest du vom shelly editor bereich einen screenshot oder foto von ganz oben ab zeile 1 machen ?
(dein passwort unkenntlich machen, aber die anführungszeichen sichtbar lassen zur kontrolle)

Zeile 1-23 Bild_2 Zeile 23-46 Bild_3 Zeile 47-70 Bild_4 Zeile 71-94 Bild_5 Zeile 95-118 Bild_6 Zeile 118-121 Bild_7

bei der script liste muss nur auf den play button geklickt werden, um das schedule anzulegen.
der autostart nach reboot schieberegler im scriptbereich kann deaktiviert (grau) bleiben

Bild_1

wenn das script einmalig korrekt durchgelaufen ist, sieht man im menü 
Advanced > KVS die zeile Script-Schedule-[nummer] mit einem wert, der 1 sein sollte

Bild_8

Bis hierhin funktioniert alles so wie du es beschreibst nur das Schedules-Menü bleibt leer. Grüße aus der Oberlausitz Ralf

`

RealNBB commented 3 months ago

Bei mir läuft das Skript leider auch nicht auf einem Shelly PRO 3EM bzw. kein Eintrag wie bereits beschrieben unter Schedules.

Kann es aber sein, dass ein Leerzeichen im Skript in Zeile 8 fehlt?

var dtu_inverter_id = 0;

In diesem Zusammenhang: Bei mehreren WR, die neu gestartet werden sollen, würde es so aussehen oder?

var dtu_inverter_id = 1,2;

stefan123t commented 3 weeks ago

@RealNBB nein das Script funktioniert so wie es geschrieben ist nur für genau einen Inverter. Ggf. mehrmals mit unterschiedlichen Namen restart-battery-inverter-via-ahoydtu-0.mjs anlegen und jeweils eine andere dtu_inverter_id angeben

@MetaChuh ich habe Dein Script mal bei mir auf einem Shelly Plus1PM installiert, es wird aber unter Schedules als Call may not work as expected angegeben, obwohl ich die Sonderzeichen ( und ) vorsorglich aus dem Script / Dateinamen entfernt habe. Der Schedule selbst wird ordentlich übernommen und wie im MCRON Eintrag beschreiben At second 0. At minute 59. At hour 23. Every days. Every months. Every weekdays. eingeplant.

Schedule

Im Advanced Schedule bzw. Edit Schedule steht dann unter

Actions: {"method":"script.eval","params":{"id":1,"code":"shelly_meta_task()"}}

Actions

Der KVS Key-Value Storage hat die von Dir erwähnte Variable Script-Schedule-1 mit dem Wert 1

Key-Value Storage

Key Value
Script-Schedule-1 1
appliance_types 4

KVS

stefan123t commented 3 weeks ago

@MetaChuh ich habe es auch auf meinem Shelly Pro3EM mal kurz eingespielt und laufen lassen, leider noch weniger Erfolg.

Dort habe ich ähnlich wie @okapi21 keinen Schedule Eintrag erhalten. Lediglich im KVS wird die Variable Script-Schedule-1 angelegt.

Hier die Ausgabe auf der Diagnostic Console

shos_rpc_inst.c:242 script.start via WS_in 192.168.178.42:36790 21:40:45
shelly_user_script.:211 JS RAM stat: initial: 70596 after: 70568, used: 28 21:40:45
shelly_script.cpp:90 Running 'script_1.js'... 21:40:45
shelly_ejs_rpc.cpp:41 Shelly.call KVS.Get {"key":"Script-Schedule-1"} 21:40:45
shelly_user_script.:223 JS RAM stat: after user code: 70596 after: 69436, used: 1160 21:40:45
shelly_notification:162 Status change of script:1: {"id":1,"running":true} 21:40:45
shos_rpc_inst.c:242 KVS.Get via loopback 21:40:45
shelly_ejs_rpc.cpp:41 Shelly.call Schedule.List {} 21:40:45
shos_rpc_inst.c:242 Schedule.List via loopback 21:40:45 

Diagnostic

Vielleicht hängt es mit der API Version Gen 2+ Device API des Shelly Plus1PM und des Shelly Pro3EM zusammen ?

Eventuell hängt es damit zusammen dass man erst eine Action anlegen muß, die man dann im Scheduler aufrufen kann.

Actions [Create Action] You do not have any actions. Actions allow creating automation scenarios based on device functionality.

Create Action

In diesem Zusammenhang macht dann auch die Fehlermeldung Sinn:

Schedules There are no actions that can be scheduled.

Schedule