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();.