Shelly Script | Auslösen PV-Überschuss an VIOLET per Netzwerk request

Fragen zur Anbindung / Integration von VIOLET an Hausautomationssysteme.
Benutzeravatar
Alex
Administrator
Beiträge: 10043
Registriert: 28. Mai 2014, 23:00

Shelly Script | Auslösen PV-Überschuss an VIOLET per Netzwerk request

Beitrag von Alex »

Sofern bei eurer PV Anlage ein herstellereigenes EnergieManagement-System (EMS) dabei ist oder ihr z.B. einen Wechselrichter habt, der (typischerweise) keine Netzwerkrequests versenden kann aber einen Schaltausgang (potentialfrei) hat um irgendwie PV-Überschuss zu signalisieren, kann man sich mit einem Shelly, der einen Schaltereingang hat (z.B. 1PM, 2PM, beide jeweils auch als plus oder mini) behelfen, um das PV-Überschuss Signal per Netzwerk an VIOLET zu schicken (falls eine Kabelverbindung zw. EMS / Wechselrichter und VIOLET nicht möglich oder nur sehr aufwändig zu realisieren wäre).

Im Prinzip steuert man mit dem potentialfreien Ausgang des EMS / des Wechselrichters den Schaltereingang am Shelly an und das untenstehende Script setzt die Statusänderung am Schaltereingang des Shelly auf einen Netzwerkrequest an VIOLET um. Einzige Voraussetzung wäre dann, dass der WLan Empfang beim EMS / Wechselrichter gut ist, damit der dort zu installierende Shelly auch brauchbaren Empfang hat.

Das notwendige Script für den Shelly wird über die Benutzeroberfläche des Shelly (im Menü "Scripts") auf dem Shelly gespeichert (Screenshot ganz unten). In der obersten Zeile einen beliebigen Namen für das Script vergeben („sendPVSurplusToViolet“ im Screenshot) und den Code von hier in das Textfeld reinkopieren. Im Script dann:
- violetIP anpassen
- violetUSER anpassen
- violetPASS anpassen
- ggf. pumpRPM anpassen
dann SAVE, dann START klicken

Das Script reagiert auf eine direkte Statusänderung am Schaltereingang des Shelly, frägt den Eingang dann zusätzlich alle 60 Sekunden ab und wiederholt die Requests an VIOLET (damit auch bei eventuellen, kurzen Netzwerk-Verbindungsabbrüchen sichergestellt ist, das der Status an VIOLET immer korrekt gesetzt wird).

Zeile 52: ... Shelly.call("Input.GetStatus", {"id": 0} ... muss bei einem Shelly mit mehr als einem Schaltereingang ggf. angepasst werden. Je nachdem, wo der Ausgang des EnergieManagement-Systems / Wechselrichters am Shelly angeschlossen wurde.
Shelly.call("Input.GetStatus", {"id": 1} … die 1 würde hier dann für den 2. Eingang an einem Shelly stehen.

Code: Alles auswählen

///////////////////////////////////////////////////////////////////////////
// INDIVIDUAL PARAMETERS
///////////////////////////////////////////////////////////////////////////
let INTERVAL   = 60000;              // 60 seconds interval in milliseconds
let violetIP   = "192.168.2.61";     // IP of your VIOLET
let violetUSER = "admin";            // your username for VIOLET
let violetPASS = "violet";           // your password for VIOLET
let pumpRPM    = 2;                  // Pump RPM for PV-surplus. Either: 1 or 2 or 3



////////////////////////////////////////////////////////////////////////
// DO NOT MODIFY
////////////////////////////////////////////////////////////////////////
let authHeader = btoa(violetUSER+":"+violetPASS);
let onURL = "http://"+violetIP+"/setFunctionManually?PVSURPLUS,ON,"+pumpRPM;
let offURL = "http://"+violetIP+"/setFunctionManually?PVSURPLUS,OFF,"+pumpRPM; 
let timerId = null;


function sendRequest(state)
{
  let reqURL = state?onURL:offURL;
  let header =
  {
    method: "GET",
    url: reqURL,
    headers: { authorization: "Basic "+authHeader },
    timeout: 10
  };
    
  try
  {
    Shelly.call("HTTP.Request", header, function (res, err_code, err_msg)
    {
      if (err_code !== 0) { print("HTTP request failed: "+err_msg); }
      else                { 
                            print("Request sent: "+reqURL);
                            if      (res.code && res.code === 401)         { print("VIOLET said: Authentication failed (check username & password)"); }
                            else if (res.body && res.body !== 'undefined') { resbody = (res.body).split('\n'); print("VIOLET said: "+resbody); }
                            else                                           { }
                          }
    });
  }
  catch(e) { /* something went wrong. no worries */ }
}


function checkInputAndSendRequest()
{
  try
  {
    Shelly.call("Input.GetStatus", {"id": 0},function (result, error_code, error_message)
    {
      if (error_code === 0) { sendRequest(result.state); } 
      else                  { print("Failed to get input status: "+error_message); }
    });
  }
  catch(e){ /* something went wrong. no worries */ }
}

/////////////////////////////////////////////////////////////////////////////////
// event handler for input changes
/////////////////////////////////////////////////////////////////////////////////
Shelly.addEventHandler(function(event)
{
  if (event.name === "input" && event.id === 0) { sendRequest(event.info.state); }
});


/////////////////////////////////////////////////////////////////////////////////
// Set up interval timer
/////////////////////////////////////////////////////////////////////////////////
timerId = Timer.set(INTERVAL, true, checkInputAndSendRequest);
checkInputAndSendRequest();
shelly_script.png

.

JohnMainhard
Beiträge: 303
Registriert: 14. November 2024, 01:19

Re: Shelly Script | Auslösen PV-Überschuss an VIOLET per Netzwerk request

Beitrag von JohnMainhard »

Du bist so ein Typ :D Ich dachte mir gerade "lässt dir mal von Grok ein Script schreiben und guckst ob es funzt", hab erstellen lassen und bevor ich es eingeben wollte hab ich hier die Addresse vom Violet Debugging gesucht und sehe ein Script - welches übrigens funktioniert! Habe Pumpendrehzahl auf 0 gestellt, die kann ruhig laut Plan laufen bleiben. Und den Input hab ich von 0 auf 1 angepasst, damit er den richtigen nimmt. NACHTRAG: sehe gerade, dass du das oben schon beschrieben hattest. Ich muss mir wirklich angewöhnen lange Beiträge bis zum Ende zu lesen :HUG:

Mein Grok Script sieht so aus, aber da wäre halt die IP weiter freigegeben

Code: Alles auswählen

// === KONFIGURATION ===
let INPUT_INDEX = 1; // Input 1 (meist SW oder S1)
let URL_ON = "http://deine-server.de/input1/on";   // URL bei HIGH / EIN
let URL_OFF = "http://deine-server.de/input1/off"; // URL bei LOW / AUS

// Timer-ID speichern
let timerId = null;

// Funktion: Status von Input 1 prüfen und GET senden
function checkInputStatus() {
    Shelly.call("Switch.GetStatus", { id: 0 }, function (result) {
        // Prüfen, ob Input 1 aktiv ist (true = HIGH, false = LOW)
        let inputState = result.input;

        let url = inputState ? URL_ON : URL_OFF;
        print("Input 1 ist: " + (inputState ? "EIN" : "AUS") + " → Sende GET an: " + url);

        // HTTP GET Request senden
        Shelly.call("HTTP.GET", { url: url }, function (response) {
            if (response.code === 200) {
                print("GET erfolgreich gesendet.");
            } else {
                print("Fehler beim Senden: " + response.code);
            }
        });
    });
}

// Timer alle 60 Sekunden starten
timerId = Timer.set(60000, true, checkInputStatus);

// Erste Ausführung sofort (optional)
checkInputStatus();

print("Shelly Script gestartet: Input 1 wird alle 60 Sekunden abgefragt.");

Gruß JM

Benutzeravatar
Alex
Administrator
Beiträge: 10043
Registriert: 28. Mai 2014, 23:00

Re: Shelly Script | Auslösen PV-Überschuss an VIOLET per Netzwerk request

Beitrag von Alex »

War auch faul… hab‘s auch erstmal grok schreiben lassen 🤪 und dann nur paar Kleinigkeiten verändert
- die variablen „lesbarer“ gemacht
- die Authentifizierung mit dazu gebaut (macht er falsch)
- try / catch drumrum, damit es nicht crasht.
… und noch ne Fehlermeldung, wenn die Zugangsdaten halt nicht passen.

JohnMainhard
Beiträge: 303
Registriert: 14. November 2024, 01:19

Re: Shelly Script | Auslösen PV-Überschuss an VIOLET per Netzwerk request

Beitrag von JohnMainhard »

Auf jeden Fall funktioniert es sehr gut! Die 60s reichen auch völlig aus. Bei 6 kW Last hast durch das Intervall im schlimmsten Fall 0,1 kWh verschenkt oder verbraten - glaube auf die 3 Cent kommt es nicht an... Selbst wenn es 200 Tage in der Saison passiert.


Gruß JM

Benutzeravatar
Alex
Administrator
Beiträge: 10043
Registriert: 28. Mai 2014, 23:00

Re: Shelly Script | Auslösen PV-Überschuss an VIOLET per Netzwerk request

Beitrag von Alex »

Hast im Shelly die Option „Run on startup“ auch mit aktiviert?
…musst ab und zu mal kucken, ob das Script noch läuft, oder gestoppt wurde… dann müsst ich’s nochmal überarbeiten.

JohnMainhard
Beiträge: 303
Registriert: 14. November 2024, 01:19

Re: Shelly Script | Auslösen PV-Überschuss an VIOLET per Netzwerk request

Beitrag von JohnMainhard »

Ja, das hatte ich vorhin noch aktiviert.

Ich achte hin und wieder auf ordnungsgemäßen Lauf solange wie ich auf Seiten der Überschuss Quelle noch Tests durchführe.


Gruß JM