Habe beschlossen, daß Ostern vorüber ist:
Beiträge von Viedotraum
-
-
Im übrigen würde ich das Script auch völlig anders gestalten.
1. Ein Day-Loop programmieren der 24h immer wieder durchläuft -> Takt ca alle 5 min.
2. Mitternacht muss per Code behandelt werden -> 23:59 -> 0:00 Uhr:
- Nach Mitternacht z.B. 1 Uhr nachts evtl. Rest der Variablen ausführen und die (Neuer Tag) Sunset, Sunrise abrufen.
- Im Loop dann immer die aktuelle Zeit auslesen : let now = new Date();
- Dabei muss man um nachher vergleichen zu können now formatieren von 6:30 auf 06:30.
- Mit einer Substract Funktion evtl. die Sunset und Sunrise Zeiten bearbeiten. -> Vorlauf - Nachlauf
- Im Loop dann die Zeiten abfragen und vergleichen Ja / Nein -> um das Abschalten zu steuern. -
Im Shelly Script kannst du nicht die Sunset, Sunrise so auslesen.
sysStatus.sunrise;Um an diese beiden Variablen zu kommen musst du über das internet die Daten abrufen -> hier eine Funktion die das macht:
Code
Alles anzeigenfunction openMetroRead() { Shelly.call( "HTTP.GET", { url: "https://api.open-meteo.com/v1/forecast?latitude=50.12345&longitude=8.12345&daily=sunrise,sunset,temperature_2m_max&timezone=Europe%2FBerlin&forecast_days=1" }, function (result, error_code, error_message) { if (error_code !== 0) { console.log('Fehler:', error_message); } else { let response = JSON.parse(result.body); let sunrise = response.daily.sunrise[0].split("T")[1]; let sunset = response.daily.sunset[0].split("T")[1]; print("Sunrise: " + sunrise + " / Sunset: " + sunset); } } ); } openMetroRead();
latitude=50.12345&longitude=8.12345
anpassen auf deine Koordinaten Zuhause!
-
Die Beispiel Script Function ließt nur vom aktuellen Tag den Sonnenauf- und Sonnenuntergang über die API Schnittstelle von open-meteo.com.
Mehr nicht.
Ich benutze auch diese Function bei meinen Beschattung Scripts.
-
Code
Alles anzeigenfunction openMetroRead() { Shelly.call( "HTTP.GET", { url: "https://api.open-meteo.com/v1/forecast?latitude=50.110891&longitude=8.669930&daily=sunrise,sunset,temperature_2m_max&timezone=Europe%2FBerlin&forecast_days=1" }, function (result, error_code, error_message) { if (error_code !== 0) { console.log('Fehler:', error_message); } else { let response = JSON.parse(result.body); let sunrise = response.daily.sunrise[0].split("T")[1]; let sunset = response.daily.sunset[0].split("T")[1]; print("Sunrise: " + sunrise + " / Sunset: " + sunset); } } ); } openMetroRead();
Standort:
latitude=50.110891&longitude=8.669930
Kann unter: https://www.koordinaten-umrechner.de/decimal/50.110…reetMap&zoom=12
berechnet werden.
-
Für alle die es nicht verstanden haben was eiche gemeint hat:
Unterschied zwischen den beiden Bedingungen
Obwohl die Schreibweise anders ist, bewirken beide Bedingungen exakt das Gleiche.
Das liegt daran, dass die De-Morgan’schen Gesetze in der Logik folgendes sagen:Nicht (A und B) ist dasselbe wie (Nicht A oder Nicht B).
Mathematisch:
!(A && B) == (!A || !B)Deshalb sind diese beiden Bedingungen funktional identisch und führen zum gleichen Ergebnis.
-
Aber man kann doch keinen Timer in der Action starten, bevor ein Relais geschaltet wird. Oder habe ich da was übersehen?
-
-
Ich habe damals auch versucht per Actions ein DelayON zu erstellen. Das ist mir leider nicht gelungen. Vielleicht kann man so etwas mit Schedule machen.
Aber da kenne ich mich nicht aus. -
Alles Quatsch. Wenn Jemand denkt (war auch mein Gedanke), das der " In 1 oder 2" vom Uni etwas mit dem Switch in der Aktion zu tun hat, dann ist das ein Irrtum.
Genau deswegen kann man, wenn man die IN / Out in der App trennt, nicht einfach per push Button in der App das Script testen.
Man würde einfach nur das Relais bzw. den Switch auf dem Uni An oder Aus schalten. -
-
hätte da noch eine Verbesserung. Kann diese aber wie gesagt nicht testen.
Wenn der EventHandler öfters "ON" meldet könnte das den timer mehrfach starten.Hier eine Version die das verhindern sollte.
Code
Alles anzeigenlet delayTimeIn = 5; // 5 Sekunden Verzögerung Ein let delayTimeOut = 5; // 5 Sekunden Verzögerung Aus let relayURL = "http://localhost/rpc/Switch.Set?id=0"; // Relais 1 auf Shelly Plus Uni var saveCondition = null; function onInputChange(state) { if (state) { // Eingang 2 ist auf ON -> Relais nach 5 Sekunden einschalten Timer.set(delayTimeIn * 1000, false, function () { Shelly.call("http.get", { url: relayURL + "&on=true" }); print("Relais 1 AN nach 5s Verzögerung"); }); } else { // Eingang 2 ist auf OFF -> Relais noch 5 Sekunden AN lassen, dann ausschalten Timer.set(delayTimeOut * 1000, false, function () { Shelly.call("http.get", { url: relayURL + "&on=false" }); print("Relais 1 AUS nach 5s Verzögerung"); }); } } // Event-Listener für Eingang 1 Shelly.addEventHandler(function (event) { print (event.info); if (saveCondition == event.info.state) {return}; if (event.info.component == "input:0") { onInputChange(event.info.state); saveCondition = event.info.state; } });
-
Code
Alles anzeigenlet delayTimeIn = 5; // 5 Sekunden Verzögerung Ein let delayTimeOut = 5; // 5 Sekunden Verzögerung Aus let relayURL = "http://localhost/rpc/Switch.Set?id=0"; // Relais 1 auf Shelly Plus Uni function onInputChange(state) { if (state) { // Eingang 2 ist auf ON -> Relais nach 5 Sekunden einschalten Timer.set(delayTimeIn * 1000, false, function () { Shelly.call("http.get", { url: relayURL + "&on=true" }); print("Relais 1 AN nach 5s Verzögerung"); }); } else { // Eingang 2 ist auf OFF -> Relais noch 5 Sekunden AN lassen, dann ausschalten Timer.set(delayTimeOut * 1000, false, function () { Shelly.call("http.get", { url: relayURL + "&on=false" }); print("Relais 1 AUS nach 5s Verzögerung"); }); } } // Event-Listener für Eingang 1 Shelly.addEventHandler(function (event) { print (event.info); if (event.info.component == "input:0") { onInputChange(event.info.state); } });
probiere das mal...
-
Um dir ein Script zu erstellen benötige ich den "EventHandler" der mir sagt wann du den Input 0 auf ON und auf Off schaltest.
Dieser wird automatisch aufgerufen und gibt mir die Informationen zurück, was passiert ist.
Das Script muss wissen wann der timer gestartet werden soll. -
(event.info) schränkt die Ausgabe der JSON Datei, also die Console Ausgabe ein.
Eingang einmal EIN und dann wieder AUS. Nicht in der Shelly App den Button betätigen. Das ist das Relais.
Der Eingang ist wichtig. Der muss physisch geschaltet werden. -
-
-
Ja, die Console unter den Scripts meinte ich.
-
-