Danke dir, habe das Ticket eröffnet: https://support.shelly.cloud/support/tickets/59293
Beiträge von Dominik Foerster
-
-
Ich habe das Problem mit einem Downgrade der Firmware behoben. Wie das geht steht hier: Downgradelinks zu 0.14.X
Außerdem habe ich das Skript nochmal überarbeitet. Der neue Code:
Code
Alles anzeigenlet interval = 300000; // Intervall in Millisekunden (5 Minuten) let targetPower = 1.5; // Startzielwert let powerChecked = false; function checkPowerFlow() { Shelly.call( "HTTP.GET", { url: "https://monitoringapi.solaredge.com/site/3111507/currentPowerFlow.json?api_key=GZZLOMDHIMPE3ZQE7N8MAAMK89YKI24H", //ssl_ca: "*", }, function (res, error_code, error_msg, ud) { if (res && res.code === 200) { let resobj = JSON.parse(res.body); print("GRID_currentPower: ", resobj.siteCurrentPowerFlow.GRID.currentPower); if (!powerChecked) { if (resobj.siteCurrentPowerFlow.GRID.currentPower >= targetPower) { Shelly.call("Switch.Set", "{ id:0, on:true }", null, null); powerChecked = true; } } else { if (resobj.siteCurrentPowerFlow.GRID.currentPower < 0.75) { targetPower = 1.5; } if (resobj.siteCurrentPowerFlow.GRID.currentPower >= targetPower) { Shelly.call("Switch.Set", "{ id:0, on:true }", null, null); } else { Shelly.call("Switch.Set", "{ id:0, on:false }", null, null); } } } } ); } // Erstelle den Timer für die erste Überprüfung Timer.set(interval, true, checkPowerFlow, null); // Starte die Überprüfung beim Laden des Skripts checkPowerFlow();
Beschreibung des Skript:
Dieses mJS-Skript dient dazu, den aktuellen Stromfluss (currentPower) eines Solarstromsystems mithilfe einer externen API (SolarEdge API) abzurufen und basierend auf dem abgerufenen Stromfluss eine Schaltung (Switch) ein- oder auszuschalten. Hier ist eine schrittweise Erklärung, was das Skript tut:
- Es legt ein Intervall von 300.000 Millisekunden (5 Minuten) fest, in dem die Abfrage des Stromflusses wiederholt wird.
- Es initialisiert `targetPower` auf 1.5 und `powerChecked` auf `false`. `targetPower` ist der Zielwert, den der Stromfluss erreichen muss, damit die Schaltung eingeschaltet wird. `powerChecked` wird verwendet, um zu überprüfen, ob die Bedingung bereits einmal erfüllt wurde.
- Die Hauptfunktion `checkPowerFlow` wird definiert. Diese Funktion verwendet die `Shelly.call`-Funktion, um den aktuellen Stromfluss von der angegebenen URL abzurufen.
- Wenn die Antwort von der API erfolgreich ist (HTTP-Statuscode 200), wird die Antwort analysiert, und der aktuelle Stromfluss (`resobj.siteCurrentPowerFlow.GRID.currentPower`) wird extrahiert und ausgegeben.
- Das Skript überprüft, ob `powerChecked` gleich `false` ist. Wenn dies der Fall ist, wird überprüft, ob der aktuelle Stromfluss größer oder gleich `targetPower` (1.5) ist. Wenn ja, wird die Schaltung eingeschaltet (`Shelly.call("Switch.Set", "{ id:0, on:true }", null, null);`) und `powerChecked` auf `true` gesetzt.
- Wenn `powerChecked` bereits `true` ist (d.h., die Bedingung wurde bereits einmal erfüllt), wird überprüft, ob der aktuelle Stromfluss kleiner als 0.75 ist. Wenn ja, wird `targetPower` auf 1.5 zurückgesetzt.
- Schließlich wird erneut überprüft, ob der aktuelle Stromfluss größer oder gleich `targetPower` ist. Abhängig von diesem Ergebnis wird die Schaltung ein- oder ausgeschaltet.
- Das Skript verwendet einen Timer, um die `checkPowerFlow`-Funktion in regelmäßigen Abständen aufzurufen. Dies ermöglicht die periodische Überwachung des Stromflusses.
Zusammengefasst: Dieses Skript überwacht den Stromfluss eines Solarstromsystems und schaltet eine Schaltung ein, wenn der Stromfluss ein bestimmtes Ziel erreicht, wobei es sicherstellt, dass die Schaltung wieder ausgeschaltet wird, wenn der Stromfluss unter einen anderen Schwellenwert fällt. Das Skript setzt dann die Überwachung fort und passt die Bedingungen an.
-
Hallo zusammen,
ich brauche bei der Erstellung eines Skript etwas Unterstützung.
Was soll das Skript tun
- Einen Shelly Plug S bei Überschuss meiner PV Anlage (solaredge) schalten.
- Die Prüfung nach x Millisekunden wiederholen.
Code
Code
Alles anzeigenlet interval = 30000; let notifyTimer = Timer.set(interval, true, function () { Shelly.call( "HTTP.GET", { url: "https://monitoringapi.solaredge.com/site/3111507/currentPowerFlow.json?api_key=xxx", //ssl_ca: "*", }, function (res, error_code, error_msg, ud) { if (res && res.code === 200) { let resobj = JSON.parse(res.body); print("GRID_currentPower: ", resobj.siteCurrentPowerFlow.GRID.currentPower); if (resobj.siteCurrentPowerFlow.GRID.currentPower > 1.0) { Shelly.call("Switch.Set", "{ id:0, on:true }", null, null); } else { Shelly.call("Switch.Set", "{ id:0, on:false }", null, null); } } }, null ); });
Fehlermeldung
- shos_rpc_inst.c:230 HTTP.GET via loopback
- shelly_http_client.:302 0x3ffe165c: HTTPS GET https://monitoringapi.solaredge.com/site/3111507/c…son?api_key=xxx (CA ca.pem)
- shos_init.c:81 New min heap free: 101820
- shelly_http_client.:606 0x3ffe165c: Finished; bytes 655, code 0, redir 0/3, auth 0, status -12: Failed to parse headers
- shelly_notification:163 Status change of switch:0: {"id":0,"aenergy":{"by_minute":[0.000,0.000,0.000],"minute_ts":1696430579,"total":0.000}}
- shos_rpc_inst.c:230 script.stop via WS_in 192.168.0.55:59298
Es gibt scheinbar ein Problem mit dem parsen des headers, siehe Zeile 4
Leider komme ich mit der Dokumentation zu HTTP nicht weiter: https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/HTTP
Die Antwort meines Wechselrichters
Response-Headers
X-Firefox-Spdy: h2
cache-control: no-cache, no-store, max-age=0
content-language: de
content-type: application/json;charset=UTF-8
date: Wed, 04 Oct 2023 14:30:21 GMT
expires: Thu, 01 Jan 1970 00:00:00 GMT
pragma: no-cache
server: nginx
Resquest-Headers
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: de,en-US;q=0.7,en;q=0.3
Connection: keep-alive
Host: monitoringapi.solaredge.com
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
TE: trailers
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
Ich hoffe jemand mit mehr Erfahrung kann mir hier helfen.
Danke euch und liebe Grüße
Dominik