Code: Alles auswählen
// ###########################################################
// Shelly 1PM Plus (Gen4) Script zur Steuerung über InfluxDB
// ###########################################################
//
// Dieses Skript fragt alle 30 Sekunden einen Wert ("Sonnenstrahlung")
// aus der InfluxDB ab und schaltet das Relais abhängig von einem
// einstellbaren Schwellenwert ("threshold").
//
// Zusätzlich kann festgelegt werden, ob das Relais eingeschaltet wird,
// wenn der Wert >= threshold ("greater") oder <= threshold ("less") ist.
//
// Die Konfiguration (threshold + mode) wird dauerhaft im Shelly gespeichert,
// sodass sie nach einem Neustart erhalten bleibt.
// ###########################################################
// -------------------------------
// 1. Verbindungs-Einstellungen
// -------------------------------
let influxHost = "192.168.178.54"; // IP-Adresse des InfluxDB-Servers (hier Raspberry Pi mit Solaranzeige)
let dbName = "wunderweather"; // Name der Influx-Datenbank
let measurement = "weather"; // Measurement, in dem die Daten stehen
let field = "Sonnenstrahlung"; // Feldname (Column), dessen Wert abgefragt wird
let interval = 30000; // Abfrageintervall in Millisekunden (30000 ms = 30 Sekunden)
// -------------------------------
// 2. Script-Verwaltung
// -------------------------------
// Die Script-ID ist im Shelly-Webinterface unter "Scripts" zu sehen.
// Wenn nur ein Script läuft, ist die ID fast immer 0.
let scriptId = 0;
// -------------------------------
// 3. Konfigurierbare Parameter
// -------------------------------
// Diese Werte können fest im Code geändert werden oder per RPC (Script.SetData)
// von außen gesetzt werden.
let threshold = 68; // Schwellwert, Standardwert
let mode = "less"; // Vergleichsmodus:
// "greater" = Relais EIN, wenn Wert >= threshold
// "less" = Relais EIN, wenn Wert <= threshold
// -------------------------------
// 4. Interner Status
// -------------------------------
// Wird benutzt, um nur bei einer Änderung den Schaltbefehl zu senden.
let lastState = null;
// -------------------------------
// 5. Beim Start gespeicherte Werte laden
// -------------------------------
Shelly.call("Script.GetData", { id: scriptId }, function(res) {
if (res && res.data) {
// Falls Daten gespeichert sind, überschreiben wir die Standardwerte
if (res.data.threshold !== undefined) threshold = res.data.threshold;
if (res.data.mode) mode = res.data.mode;
print("Geladene Einstellungen: threshold =", threshold, "mode =", mode);
} else {
print("Standardwerte: threshold =", threshold, "mode =", mode);
}
});
// -------------------------------
// 6. Funktion zum Speichern neuer Werte
// -------------------------------
// Diese Funktion kann aus einem RPC-Aufruf heraus genutzt werden.
// Beispiel:
// curl -X POST http://192.168.178.60/rpc/Script.SetData -d '{"id":0,"data":{"threshold":100,"mode":"less"}}'
function saveConfig(newThreshold, newMode) {
let cfg = { threshold: newThreshold, mode: newMode };
Shelly.call("Script.SetData", { id: scriptId, data: cfg });
// Werte auch im Script direkt setzen
threshold = newThreshold;
mode = newMode;
print("Neue Konfiguration gespeichert:", JSON.stringify(cfg));
}
// -------------------------------
// 7. Hauptfunktion: checkSun()
// -------------------------------
// Abfrage der InfluxDB und Schalten des Relais
function checkSun() {
// InfluxQL Query vorbereiten:
// SELECT last("Sonnenstrahlung") FROM "weather"
// → hier URL-encoded wegen Sonderzeichen
let query = "SELECT%20last(%22" + field + "%22)%20FROM%20%22" + measurement + "%22";
let url = "http://" + influxHost + ":8086/query?db=" + dbName + "&q=" + query;
// HTTP GET an InfluxDB
Shelly.call("HTTP.GET", { url: url }, function(result) {
if (!result || result.code !== 200) {
print("HTTP Fehler:", result ? result.code : "kein Ergebnis");
return;
}
try {
// JSON-Antwort parsen
let data = JSON.parse(result.body);
let value = data.results[0].series[0].values[0][1];
print("Sonnenstrahlung:", value, "(threshold:", threshold, "mode:", mode, ")");
// Schaltlogik je nach Modus
let newState = false;
if (mode === "greater") {
newState = value >= threshold;
} else if (mode === "less") {
newState = value <= threshold;
}
// Nur schalten, wenn sich der Zustand geändert hat
if (lastState === null || newState !== lastState) {
Shelly.call("Switch.Set", { id: 0, on: newState });
print("Relais", newState ? "EIN" : "AUS");
lastState = newState;
} else {
print("Keine Änderung – Relais bleibt", newState ? "EIN" : "AUS");
}
} catch (e) {
print("Parsing Fehler:", e);
}
});
}
// -------------------------------
// 8. Timer starten
// -------------------------------
// Alle 30 Sekunden wird checkSun() automatisch ausgeführt.
Timer.set(interval, true, checkSun);
// Einmal direkt beim Start ausführen
checkSun();
;
Und das ist dabei raus gekommen, ich kann hier zb mit dem Wert der Sonneneinstrahlung meiner Wetterstation aktuell mein Licht im Arbeitszimmer ein und ausschalten.
Das ganze abhängig nach dem Wert und ob dieser grösser oder eben kleiner als der Wert ist.
Worin sehe ich den Vorteil ganz klar volle flexibilität das Skript läuft auf dem Shelly und ist somit Eigenständig.
Nachteil an der Geschichte man muss die Werte im Skript ändern, was aber mit der Dokumentation auch im Skript problemlos möglich sein sollte.
Aktuell hab ich es mit meinem Shelly 1 pm plus gen4 getestet es funktioniert, nun werde ich versuchen das ganze auch auf Shelly 2 pm plus zu bekommen, dann kann man zb bei Rollos hier nach der echten Helligkeit die Rollos aufund zu fahren lassen.
*****************************ACHTUNG********ACHTUNG********************ACHTUNG**************ACHTUNG************************************************
Ich weise Ausdrücklich daruaf hin das programierungen mit Skripten funktionieren können und nicht müssen hier ist jeder selbst dafür verantwortlich und muss auch alle Sicherheitsregeln beachten alle meine Angaben sind somit ohne Gewähr und rechtlichkeit verbunden.