Überschussschaltung via Shelly Plug S und Skript

  • 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

    Fehlermeldung

    1. shos_rpc_inst.c:230 HTTP.GET via loopback
    2. shelly_http_client.:302 0x3ffe165c: HTTPS GET https://monitoringapi.solaredge.com/site/3111507/c…son?api_key=xxx (CA ca.pem)
    3. shos_init.c:81 New min heap free: 101820
    4. shelly_http_client.:606 0x3ffe165c: Finished; bytes 655, code 0, redir 0/3, auth 0, status -12: Failed to parse headers
    5. 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}}
    6. 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

  • 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:

    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:

    1. Es legt ein Intervall von 300.000 Millisekunden (5 Minuten) fest, in dem die Abfrage des Stromflusses wiederholt wird.
    2. 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.
    3. Die Hauptfunktion `checkPowerFlow` wird definiert. Diese Funktion verwendet die `Shelly.call`-Funktion, um den aktuellen Stromfluss von der angegebenen URL abzurufen.
    4. 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.
    5. 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.
    6. 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.
    7. 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.
    8. 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.

  • Super Anleitung, genau das was ich benötige.

    Nur, das ich eine Varta XML auslesen muss anstatt solaredge. Allerdings bekomme ich ebenfalls einen Fehler bei der Parse-Anweisung. Hast du bereits eine Rückmeldung zu deinem Ticket erhalten?

    Leider kann ich aktuell auch keinen Downgrade zu der von dir genannten Firmware durchführen.