Ich für meine Teil habe hier eine lösung gefunden die auch gut funtioniert ich habe eine Software die grafana visualisiert da ich ier eh schon viele geräte auslese, hier habe in Grafana ein text Plugin wo ich mir buttons konfiguriere und shellys damit schalte so hab ich in jedem Raum wo es von nöten ist ein kleines Display wo ich grafana und die Buttons aufrufen kann und die shellys schalten kann wenn jetzt noch die neuen anwesenheitssensoren von shelly kommen muss mann gar nichts mehr schalten den das machen dann die sensoren für einen.
Beiträge von Schwarzermann
VPN/Proxy erkannt
Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.
-
-
Code
Alles anzeigen// ########################################################### // Shelly 1PM Plus (Gen4) – folgt zwei Toren (Shelly 2PM im Cover-Modus) // mit Sonnenstands-Sperre (nur nachts aktiv) // ########################################################### // // Regeln (pro Tor geprüft, nur aktiv wenn es dunkel ist!): // - Bei 20% öffnen -> Licht EIN // - Bei 100% -> Licht holdTime EIN, danach AUS (nur einmal) // - Wenn Tor von 100% auf <100% fährt (Start Schließen) -> Licht EIN // - Bei 20% schließen -> Licht AUS // // ########################################################### // IP-Adressen der beiden Shelly 2PM (Torsteuerungen) let garageDoors = [ "192.168.178.109", // Tor 1 "192.168.178.110" // Tor 2 ]; // Abfrageintervall (ms) let interval = 5000; // alle 5 Sekunden // Haltezeit wenn Tor komplett offen (in Sekunden) let holdTime = 120; // interne Zustände let lastOn = false; let holdTimer = null; let holdActive = false; let lastPos = { "192.168.178.109": null, "192.168.178.110": null }; // Sonnenauf-/untergang let sunrise = null; let sunset = null; // === Hilfsfunktionen === function switchLight(on) { Shelly.call("Switch.Set", { id: 0, on: on }); lastOn = on; print("Licht", on ? "EIN" : "AUS"); } function cancelHoldTimer() { if (holdTimer !== null) { Timer.clear(holdTimer); holdTimer = null; print("Hold-Timer abgebrochen"); } } function isNight() { if (!sunrise || !sunset) return true; // wenn keine Werte -> sicherheitshalber aktiv let now = (new Date()).getTime() / 1000; // aktuelle Zeit in UNIX Sekunden return (now < sunrise || now > sunset); } function updateSunTimes() { Shelly.call("Sys.GetStatus", {}, function(res) { if (res && res.sunrise && res.sunset) { sunrise = res.sunrise; sunset = res.sunset; print("Sonnenaufgang:", sunrise, "Sonnenuntergang:", sunset); } else { print("Keine Sonnenzeiten gefunden – Nacht-Check immer TRUE"); } }); } // === Hauptfunktion: prüft beide Tore === function checkCovers() { if (!isNight()) { // Tagsüber -> Licht sicher ausschalten und überspringen if (lastOn) { switchLight(false); cancelHoldTimer(); holdActive = false; } print("Tag erkannt – Steuerung gesperrt"); return; } // Zustand pro Tor prüfen for (let i = 0; i < garageDoors.length; i++) { let ip = garageDoors[i]; let url = "http://" + ip + "/rpc/Cover.GetStatus?id=0"; Shelly.call("HTTP.GET", { url: url }, function(res) { if (!res || res.code !== 200) { print("HTTP Fehler an Tor", ip, ":", res ? res.code : "kein Ergebnis"); return; } try { let data = JSON.parse(res.body); let pos = data.current_pos; if (typeof pos === "string") pos = parseFloat(pos); print("Tor", ip, "Position:", pos, "%", "(last:", lastPos[ip], ")"); // --- Regel 2: Bei 100% -> Licht holdTime EIN, danach AUS (nur einmal) if (pos >= 100) { if (!holdActive) { holdActive = true; if (!lastOn) { switchLight(true); print("Licht EIN (Tor", ip, "100%, Timer gestartet)"); } cancelHoldTimer(); holdTimer = Timer.set(holdTime * 1000, false, function() { switchLight(false); print("Licht AUS (Timer abgelaufen bei 100%)"); }); } lastPos[ip] = pos; return; } // --- Regel 3: Start Schließen von 100% -> Licht EIN if (lastPos[ip] !== null && lastPos[ip] >= 100 && pos < 100) { if (!lastOn) { switchLight(true); print("Licht EIN (Start Schließen Tor", ip, ")"); } holdActive = false; cancelHoldTimer(); } // --- Regel 1: Bei 20% öffnen -> Crossing von <20% auf >=20% if (lastPos[ip] !== null && lastPos[ip] < 20 && pos >= 20) { if (!lastOn) { switchLight(true); print("Licht EIN (Tor", ip, "öffnet über 20%)"); } } // --- Regel 4: Bei 20% schließen -> Crossing von >20% auf <=20% if (lastPos[ip] !== null && lastPos[ip] > 20 && pos <= 20) { // prüfe, ob beide Tore <= 20 sind → erst dann aus let allClosed = true; for (let j = 0; j < garageDoors.length; j++) { if (garageDoors[j] !== ip && lastPos[garageDoors[j]] !== null && lastPos[garageDoors[j]] > 20) { allClosed = false; break; } } if (allClosed && lastOn) { switchLight(false); print("Licht AUS (beide Tore geschlossen, letzter war", ip, ")"); } holdActive = false; cancelHoldTimer(); } lastPos[ip] = pos; } catch (e) { print("Parsing Fehler an Tor", ip, ":", e); } }); } } // === Timer starten === Timer.set(interval, true, checkCovers); // Sonnenauf-/untergang alle 10 min aktualisieren updateSunTimes(); Timer.set(600000, true, updateSunTimes);So hier mal eine erweiterte Licht Steuerung für einen Shelly 1 pm gen 4 der das Licht schaltet und auf 2 x 2 pm im Rolltormodus horcht, das heißt ein Tor offen und das andere öffnet sich ebenfalls, bleibt das Licht 120 Sekunden an, erst wenn beide geschlossen sind, geht auch das Licht aus.
Entweder nach den 120 sek bei einem Offen eins geschlossen oder beide geschlossen sofort wieder aus.
Ihr müsst das Skript auf den 1 pm kopieren und die ip der Rolltore eben anpassen viel Spass damit.
*****************************ACHTUNG********ACHTUNG********************ACHTUNG**************ACHTUNG************************************************
Ich weise Ausdrücklich darauf 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. -
Das ist Richtig was du sagst und ja die Kontakte brennen da sehr schnell weg, ich kenne das noch von meiner Ex Arbeitsstelle (Kieswerk) wenn da die Brecher mit über 700kw hart abgeschaltet wurden da kanns schon mal etwas komisch im Schaltschrank riechen.
Ok Elektromotren sind jetzt nicht so empfindlich aber bei Klimaanlagen mit Inverter bzw Wärmepumpen da wäre ich auch vorschtig.
-
Ich hätte da keine Skrupel ich habe an einem 4 pm 3 Geräte hängen 1 Wärmepumpe mit 3000w eine Split Klima mit 3000w und eine weitere plit klima mit 2700W das reais bleibt dauerhaft geschaltet und soll nur die aufgenommene Leistung messen schaun mer mal wie lange es hält.
Die Leistungen sind das Maximale was sie können was aber selten abgefordert wird.
Les dir doch bitte diesen von mir geposteten Satz durch, und was da steht, es ist nicht Sinn und zweck die Geräte einfach weg zuschalten, es dient allein der Leistungsmessung und ja wenn das Gerät abgeschalten werden soll fahre ich es eh sauber runter.
Meine WP hat einen extra Kontakt den ich mit einem Shelly beschalte damit sie das dann auch zuverlässig tut ohne sie hart vom Netz zutrennen.
Und die Split Klimas sind nur Back up im Winter, und im Sommer eben zum Kühlen gerade des Dachgeschosses, vorteil für mich ich kann so 4 bzw aktuell 3 Geräte auslesen wieviel Strom sie wann brauchen, da ich hinten dran eine Solaranzeige mit Grafana laufen habe und hier mein Ganzes Haus Visualisiere
Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen. Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen. Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen. Hier mal einen kleinen Auszug aus den verschiedenen Visualisierungen
Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen. Und das ist noch nicht ganz Fertig gebaut aber man kann erkennen wohin die Reise geht, alleine das Bild mit der KI so zu generieren hat doch ein paar Stunden gekostet. Es ist nicht perfekt aber ich finde es für mich erst mal gelungen.
-
5 Monate nach dem Shelly wurde aber jedes Gerät nochmals mit eines Sicherung versehen und vor dem 4 PM sitzt ebenfalls eine Sicherung sollte also etwas nicht mehr funktionieren ist in allen Richtungen das ganze abgesichert der 4 pm soll 40 A Vertragen die WP zieht maimal 13A die grosse Splitt ebenfalls wenn so Vollgas läuft die kleine geht mit 9 A zugange.
Bis jetzt funktioniert alles we es soll im Sommer ist die WP eh aus da Heizen wir mit den Split kimas bzw Kühlen.
-
Ich hätte da keine Skrupel ich habe an einem 4 pm 3 Geräte hängen 1 Wärmepumpe mit 3000w eine Split Klima mit 3000w und eine weitere plit klima mit 2700W das reais bleibt dauerhaft geschaltet und soll nur die aufgenommene Leistung messen schaun mer mal wie lange es hält.
Die Leistungen sind das Maximale was sie können was aber selten abgefordert wird.
-
Ja und welche Leisung hat diese? es gibt sie in 6 Leistungsstufen wenn aber soviel falsch gemacht wurde denke ich das du da ein WP Mnster hast also ne relativ große und da wundert mich das tackten nicht.
-
Warum nicht nicht nach Sonnen aufgang und Sonnen Untergang regel?
-
Der schaltet aber normalerweise einen heizstab und nicht die Wärmepumpe oder verstehe ich da was falsch und welche Wärmepumpe hast du nun?
-
Veräts du mir was für eine WP du da hast und wo der Anschluss dazu ist?
-
Dokumentation: Shelly 2PM Pro Steuerung mit SOC +
PV-Überschuss
Dieses Skript wird auf einem **Shelly 2PM Pro** ausgeführt und dient der automatischen Steuerung eines Relais (z. B.
Netzladegerät für Batteriespeicher) basierend auf zwei Informationsquellen: 1. **Batterie-SOC (State of Charge)** aus
der InfluxDB (bereitgestellt durch die Solaranzeige). 2. **PV-Überschuss / Netzbezug** vom Bitshake-Lesekopf. Ziel
ist es, die Batterie zu schützen und gleichzeitig PV-Überschüsse sinnvoll zu nutzen.
■ Funktionsumfang
■ **SOC-Überwachung** - Abfrage alle 60 Sekunden aus der InfluxDB. - Wenn SOC < 30 % → Relais 0 EIN
(Netzladegerät einschalten). - Wenn SOC >= 70 % und kein PV-Überschuss → Relais 0 AUS. ■
**PV-Überschuss-Erkennung** - Abfrage alle 10 Sekunden über den Bitshake (HTTP). - Wenn negativer
Leistungswert (Überschuss) → Relais 0 EIN. - Bei Netzbezug und SOC >= 70 % → Relais 0 AUS. ■ **Manuelles
Schalten** - Wird das Relais manuell über das Dashboard oder die Shelly-Oberfläche geschaltet, wird die Automatik
deaktiviert, um Eingriffe des Benutzers nicht zu überschreiben. ■ **Automatikmodus** - Automatik ist standardmäßig
aktiviert. - Status wird in der **Key-Value-Storage (KVS)** des Shelly gespeichert. - Automatik kann reaktiviert werden
über einen HTTP-Aufruf: ``` http://[Shelly-IP]/rpc/Script.Eval?code=autoMode%3Dtrue%3BsaveKV() ```
■ Zweck
Dieses Skript sorgt dafür, dass die Batterie nicht tiefentladen wird (Schutz durch Mindest-SOC), gleichzeitig aber bei
PV-Überschuss zusätzliche Ladeleistung genutzt wird, um Netzbezug zu vermeiden. Dadurch wird die
**Eigenverbrauchsquote optimiert** und die **Lebensdauer der Batterie** verlängert. Das Relais 0 am Shelly 2PM Pro
kann z. B. ein **Netzladegerät (Studer, Meanwell, etc.)** steuern. -
Code
Alles anzeigen/* Shelly 2PM Pro Steuerung mit SOC + PV-Überschuss ------------------------------------------------ - SOC aus Influx (60s), Bitshake Power (10s) - Relais 0 EIN wenn SOC < 30% oder PV-Überschuss - AUS wenn SOC >= 70% und kein Überschuss - Manuelles Schalten stoppt Automatik - Automatik kann per HTTP-Befehl reaktiviert werden */ // ===== Konfiguration ===== let SOC_URL = "http://192.168.178.54:8086/query?db=JBDBMS1&q=SELECT+last(%22SOC%22)+FROM+Batterie"; let BIT_URL = "http://192.168.178.18/cm?cmnd=status%2010"; let RELAY_ID = 0; let POLL_SOC = 60000; let POLL_BIT = 10000; let SOC_ON = 30; let SOC_OFF = 70; let autoMode = true; // ===== Funktionen ===== function checkSOC(){ if(!autoMode) return; Shelly.call("http.get", { url:SOC_URL }, function(res){ if(res.code === 200){ try { let data = JSON.parse(res.body); let soc = data.results[0].series[0].values[0][1]; print("📊 SOC =", soc, "%"); if(soc < SOC_ON){ setRelay(true, "SOC niedrig"); } else if(soc >= SOC_OFF){ checkBitshake(false, soc); } } catch(e){ print("❌ Fehler SOC-Parse:", e); } } }); } function checkBitshake(forceOn, socVal){ if(!autoMode) return; Shelly.call("http.get", { url:BIT_URL }, function(res){ if(res.code === 200){ try { let data = JSON.parse(res.body); let power = data.StatusSNS.mMe4.Power; print("🔌 Bitshake Power =", power, "W"); if(forceOn){ setRelay(true, "SOC <"+SOC_ON+"%"); } else { if(power < 0){ setRelay(true, "PV-Überschuss"); } else if(socVal >= SOC_OFF){ setRelay(false, "SOC >="+SOC_OFF+"% und kein Überschuss"); } } } catch(e){ print("❌ Fehler Bitshake-Parse:", e); } } }); } function setRelay(state, reason){ Shelly.call("Switch.GetStatus", { id:RELAY_ID }, function(res){ if(res.output !== state){ Shelly.call("Switch.Set", { id:RELAY_ID, on:state }); print("⚡ Relais", RELAY_ID, state ? "EIN" : "AUS", "Grund:", reason); } }); } // === Automatik speichern === function saveKV(){ Shelly.call("KV.Set", { key:"autoMode", value:(autoMode ? "true":"false") }); } function loadKV(){ Shelly.call("KV.Get", { key:"autoMode" }, function(res){ if(res && typeof res.value !== "undefined" && res.value !== null){ autoMode = (res.value === "true"); } else { autoMode = true; } print("🔧 Automatik-Status geladen:", autoMode); }); } // === Manuelles Schalten abfangen === Shelly.addEventHandler(function(ev){ if(ev.component === "switch:"+RELAY_ID && typeof ev.info.output !== "undefined"){ if(autoMode){ print("🖐 Manuell geschaltet – Automatik deaktiviert!"); autoMode = false; saveKV(); } } }); // === HTTP-Kommando für Automatik aktivieren === // Aufruf im Browser oder von Grafana: // http://192.168.178.79/rpc/Script.Eval?code=autoMode%3Dtrue%3BsaveKV() // // Damit wird autoMode=true gesetzt und gespeichert. // === Start === print("▶️ Steuerung gestartet: SOC alle", POLL_SOC/1000, "s, Bitshake alle", POLL_BIT/1000, "s"); loadKV(); Timer.set(POLL_SOC, true, checkSOC); Timer.set(POLL_BIT, true, function(){ checkBitshake(false, 0); }); Ich habe hier ein Skript für eine Steuerungslogik für einen Akku und einem Ladegerät mit einem Shelly 2pm pro -
Ich hb hier 2 Somfy funkmotoren noch waren bei den Fenstern damals dabei ich hab nur Probleme damit und ich brauch einen extra Funkwandler um diese mit Shellys nun zuschalten nächstes Jahr fliegen die raus weil ich so keinen % einstellen kann und die rollos selbst auch schlecht sind trotz alu
-
Ich verwende Standart Rohrmotore mit Endabschaltung zum einstellen das funktioniert am zuverlässigsten und ist günstig, und man muss bei Stromausfall nicht immer wieder die Endpunkt anlernen was bei anderen pssieren kann.
Ansonten lässt sich mit en 2pm eine gute jalousie Steuerung realisieren.
-
Wenn du im Taster modus bleiben willst wirst du denke ich ohne Skript nicht auskommen, es darf hier gerne korrigiert werden wenn ich eine Falsche Aussage treffe, den soweit war ich noch nicht, was ich aber weis das es mit einem Skript funktionieren kann, es kann aber mehrere ANläufe brauchen bis gpt ds richtige funktionierende Skript ausgibt.
-
Oder du nimmst einen 2 ten Shelly der via Skript lauscht ob der erste Shelly geschalten wird oder nicht hab ich bei meinen Rolltoren so mit Zeit verzögerung und schaltdauer die ich einstellen kann.
-
Ich Fahre meine Rollos gegen den endabschaltpunkt der am Motor eingestellt ist dadurch erkennt der 2 pm zuverlässig den Anfang und das Ende hast du ihm im Rollo Modus?
-
Hätte mich auch gewundert, wenn eine KI es selbst schafft etwas bis zum Ende zu entwickeln. Meist wird etwas vorausgesetzt, was gar nicht funktioniert, so wie hier. Das wird irgendwo rausgesucht, durcheinander geworfen und dann als Lösung präsentiert, die nicht funktioniert. Da kann man ganz schön Zeit bei verbraten, wenn man solch eine KI nutzt.
Naja siehe es mal so rum dafür das ich null Ahnung vom programieren habe, funktioniert das ausserortentlich gut, ich bin Zufrieden es macht was es soll, habe ja auch meine Html programierung für das Grafana Text Plugin so hinbekommen das es funktioniert in Grafana mit Button die Shellys zuschalten.
-
Ja das hatte mir ie KI auch so mit implementieren wollen, nur ich muss klar sagen wie oft geht das Tor Tags über auf 2 eventuell 3 al da sind die LEd Leuchten mit 40 W denke ich das geringse Problem, zudem ich ne riesige PV Habe und auch nen rect grossen Speicher (100kwNetto)
-
Code
Alles anzeigen// ########################################################### // Shelly 1PM Plus (Gen4) – folgt Tor (Shelly 2PM im Cover-Modus) // mit Sonnenstands-Sperre (nur nachts aktiv) // ########################################################### // // Endgültige Regeln (nur aktiv wenn es dunkel ist!): // - Bei 20% öffnen -> Licht EIN // - Bei 100% -> Licht 20s EIN, danach AUS (nur einmal) // - Wenn Tor von 100% auf <100% fährt (Start Schließen) -> Licht EIN // - Bei 20% schließen -> Licht AUS // // ########################################################### // IP-Adresse des Shelly 2PM (Torsteuerung) let sourceShelly = "192.168.178.195"; // Abfrageintervall (ms) let interval = 2000; // alle 2 Sekunden // Haltezeit wenn Tor komplett offen (in Sekunden) let holdTime = 20; // interne Zustände let lastOn = false; let holdTimer = null; let holdActive = false; let lastPos = null; // Sonnenauf-/untergang let sunrise = null; let sunset = null; // Hilfsfunktionen function switchLight(on) { Shelly.call("Switch.Set", { id: 0, on: on }); lastOn = on; print("Licht", on ? "EIN" : "AUS"); } function cancelHoldTimer() { if (holdTimer !== null) { Timer.clear(holdTimer); holdTimer = null; print("Hold-Timer abgebrochen"); } } function isNight() { if (!sunrise || !sunset) return true; // wenn keine Werte -> sicherheitshalber aktiv let now = (new Date()).getTime() / 1000; // aktuelle Zeit in UNIX Sekunden return (now < sunrise || now > sunset); } function updateSunTimes() { Shelly.call("Sys.GetStatus", {}, function(res) { if (res && res.sunrise && res.sunset) { sunrise = res.sunrise; sunset = res.sunset; print("Sonnenaufgang:", sunrise, "Sonnenuntergang:", sunset); } else { print("Keine Sonnenzeiten gefunden – Nacht-Check immer TRUE"); } }); } // Hauptprüfung function checkCover() { if (!isNight()) { // Tagsüber -> Licht sicher ausschalten und überspringen if (lastOn) { switchLight(false); cancelHoldTimer(); holdActive = false; } print("Tag erkannt – Lichtsteuerung gesperrt"); return; } let url = "http://" + sourceShelly + "/rpc/Cover.GetStatus?id=0"; Shelly.call("HTTP.GET", { url: url }, function(res) { if (!res || res.code !== 200) { print("HTTP Fehler:", res ? res.code : "kein Ergebnis"); return; } try { let data = JSON.parse(res.body); let pos = data.current_pos; if (typeof pos === "string") pos = parseFloat(pos); print("Tor-Position:", pos, "%", "(last:", lastPos, ")"); // --- Regel 2: Bei 100% -> Licht 20s EIN, danach AUS (nur einmal) if (pos >= 100) { if (!holdActive) { holdActive = true; if (!lastOn) { switchLight(true); print("Licht EIN (Tor 100%, Timer gestartet)"); } cancelHoldTimer(); holdTimer = Timer.set(holdTime * 1000, false, function() { switchLight(false); print("Licht AUS (Timer abgelaufen bei 100%)"); }); } lastPos = pos; return; } // --- Regel 3: Start Schließen von 100% -> Licht EIN if (lastPos !== null && lastPos >= 100 && pos < 100) { if (!lastOn) { switchLight(true); print("Licht EIN (Start Schließen von 100% -> <100%)"); } holdActive = false; cancelHoldTimer(); } if (lastPos !== null) { // --- Regel 1: Bei 20% öffnen -> Crossing von <20% auf >=20% if (lastPos < 20 && pos >= 20) { if (!lastOn) { switchLight(true); print("Licht EIN (Öffnen: Crossing über 20%)"); } } // --- Regel 4: Bei 20% schließen -> Crossing von >20% auf <=20% if (lastPos > 20 && pos <= 20) { if (lastOn) { switchLight(false); print("Licht AUS (Schließen: Crossing unter 20%)"); } holdActive = false; cancelHoldTimer(); } } lastPos = pos; } catch (e) { print("Parsing Fehler:", e); } }); } // Timer starten Timer.set(interval, true, checkCover); // Sonnenauf-/untergang alle 10min aktualisieren updateSunTimes(); Timer.set(600000, true, updateSunTimes); // 10 minBesser so? hatte es aus dem Shelly kopiert und nicht darauf geachtet, leider funktioniert die tag Nacht schaltung nicht da anscheinend bei den gen 4 Geräten das noch nicht implementiert ist, aber es schaltet bei mir das Licht ein und Aus.