NEWS
Rollladen Script mit Sunrise/Sunset und zusätzlicher Bedingung
-
Hi!
Ich versuche grade mein Rollladen Script mit Blocky zu erstellen. Leider gibt es mehrere Bedingungen und ich komme nicht weiter! Ich habe mal mein aktuellen Stand angehangen.
Das Rollladenscript soll bei Sonnenuntergang prüfen ob der Dummy Rollladenautomatik aktiviert ist (manuell angelegter Datenpunkt true/false), soll dann im nächsten Schritt prüfen ob der Dummy Rollo_Winter aktiviert ist und dann die Szene Winter_Rollo true setzen, falls der Winter Dummy false ist, soll er Sommer_Rollo true setzen. Ich nutze 2 versch. Szenen im Sommer/Winter weil im Winter zusätzlich der Balkon Rollo geschlossen werden soll, im Sommer bleibt der offen.
So, nun zu meiner frage: In FHEM konnte man bei der Astrofunktion definieren, dass die Aktionen bei Sinrise, aber in keinem Fall vor einer bestimmten Uhrzeit auszuführen waren.
Beispiel: Sommersunrise ist 5:40Uhr, wenn man nun als variable nicht-vor-uhrzeit 7:00Uhr eingestellt hatte, wurde die aktion auch erst um 7:00 ausgeführt. War sunrise dann 7:10Uhr, kam die aktion um 7:10. In die andere Richtung ging das genau so: Sunset bei 8:00, die aktion soll aber nicht nach 7:30 ausgeführt werden, d.h. jede aktion sunset später 7:30 wird bei 7:30uhr ausgeführt.
Wie lässt sich das hier in iobroker umsetzen?!
3800_unbenannt.png -
Sommersunrise ist 5:40Uhr, wenn man nun als variable nicht-vor-uhrzeit 7:00Uhr eingestellt hatte, wurde die aktion auch erst um 7:00 ausgeführt. War sunrise dann 7:10Uhr, kam die aktion um 7:10. In die andere Richtung ging das genau so: Sunset bei 8:00, die aktion soll aber nicht nach 7:30 ausgeführt werden, d.h. jede aktion sunset später 7:30 wird bei 7:30uhr ausgeführt.
Wie lässt sich das hier in iobroker umsetzen?! `
Mit Skriptvariablen, die zu den entsprechenden Zeitpunkten gesetzt werden.Wenn es nicht Blockly sein muss, dann etwa so:
// Datenpunkt-IDs const idAuto = '...'; // Rolladenautomatik const idWinter = '...'; const idWinterRauf = '...'; // Rolladen rauf im Winter const idSommerRauf = '...'; // Rolladen rauf im Sommer // Variablen werden bei Skriptstart initialisiert var auto = getState(idAuto).val; var winter = getState(idWinter).val; var tag = isAstroDay(); var morgens = compareTime('7:00', '7:30', 'between'); function Rollosrauf() { if(auto) { if(winter) setState(idWinterRauf, true); else setState(idSommerRauf, true); } } schedule('0 7 * * *', function() { morgens = true; if(tag) Rollosrauf(); }); schedule('30 7 * * *', function() { morgens = false; if(!tag) Rollosrauf(); }); schedule({astro: 'sunrise'}, function () { tag = true; if(morgens) Rollosrauf(); }); schedule({astro: 'sunset'}, function () { tag = false; }); on(idAuto, function(dp) { auto = dp.state.val; }); on(idWinter, function(dp) { winter = dp.state.val; });
Das muss natürlich noch um "Rollos runter" am Abend erweitert werden
-
Hi!
Habe mir das script übers wochenende angeschaut und auch grade nochmal. Ich verstehs nicht könntest du mir die einzelnen blöcke nochmal komentieren? Ich würde die logik gerne verstehen, das würde mir sehr weiter helfen!
Variablen, Function, constanten sind klar! ich stelle mal meine Fragen bzw. meine Komentare direkt in den Code:
schedule('0 7 * * *', function() { /// Morgens um 7Uhr wird geprüft... morgens = true; // Wozu das? warum hier nochmal die Zeitspanne zw. 7:00 und 7:30? if(tag) Rollosrauf(); // wenn Uhrzeit nach Sunrise -> Rollos hochfahren }); schedule('30 7 * * *', function() { /// Morgens um 7:30Uhr wird geprüft... morgens = false; // Verstehe ich auch nicht, warum ist 7:30 nun false? if(!tag) Rollosrauf(); // Wenn zwar immernoch kein Sunrise, aber 7:30Uhr trotzdem Rollos hochfahren }); schedule({astro: 'sunrise'}, function () { // Bei sunrise ausführen.... tag = true; // Versteh ich auch nicht, warum wird nochmal Tag abgefragt? Wenn Sunrise ist, ist doch automatisch Tag if(morgens) Rollosrauf(); // Wenn Zeit zwischen 7:00 und 7:30Uhr rollos hochfahren }); schedule({astro: 'sunset'}, function () { // Bei sunset nix machen?! tag = false; }); on(idAuto, function(dp) { // was machen die beiden Blöcke hier? auto = dp.state.val; }); on(idWinter, function(dp) { winter = dp.state.val; });
-
Das gesamte Skript wird nur ein einziges Mal bei Start des Skriptes ausgeführt. Wenn danach etwas passieren soll, werden Auslöser benötigt. Das können zeitliche Auslöser sein (schedule()) oder Auslöser, die auf Ereignisse reagieren(on()).
schedule('0 7 * * *', function() { // Morgens um 7Uhr wird ausgelöst morgens = true; // die Variable wird aktualisiert (morgens beginnt)
schedule('30 7 * * *', function() { // Morgens um 7:30Uhr wird ausgelöst morgens = false; // die Variable wird aktualisiert (morgens endet)
tag = true; // Variable wird aktualisert (Tag beginnt), Variable tag wurde bei Sonnenuntergnag auf false gesetzt
schedule({astro: 'sunset'}, function () { // Bei sunset nix machen?! tag = false; // Variable wird aktualisiert (Tag endet) }); ```` `
Das muss natürlich noch um "Rollos runter" am Abend erweitert werden `
Die Bedingungen für "Rollos runter" am Abend hast Du noch nicht mitgeteilt.on(idAuto, function(dp) { // was machen die beiden Blöcke hier? auto = dp.state.val; }); on(idWinter, function(dp) { // Triggern bei Wertänderung winter = dp.state.val; // winter = Wert des Datenpunktes }); ```` `
Diese beiden Blöcke aktualisieren die Skripvariablen auto und winter genau dann, wenn sich der Wert des entsprechenden Datenpunktes ändert.
Eine Beschreibung der Funktionen des Javascript-Adapters inkl. Auslöser findes Du auf https://github.com/ioBroker/ioBroker.javascript/blob/master/doc/en/javascript.md.
-
mensch was eine komplexe logik, aber ich habs verstanden mit deiner Hilfe, Danke! naja eigentlich nicht komplex, aber da muss man erstmal drauf kommen wenn man das nicht tag für tag programmiert
Ich habs mal versucht selbst um die abendliche Funktion zu erweitern! Habs jetzt so mal ans Laufen gebracht und bin gespannt obs klappt
// Datenpunkt-IDs const idAuto = 'Dummyschalter.0.Automation.Rolloautomatik'; // Dummyschalter für Rolladenautomatik const idWinter = 'Dummyschalter.0.Automation.Rollo_winter'; // Dummyschalter für Winterbetrieb const idWinterRauf = 'scene.0.Rollo_hoch'; // Szene Rolladen rauf im Winter const idSommerRauf = 'scene.0.Rollo_hoch'; // Szene Rolladen rauf im Sommer const idWinterZu = 'scene.0.Rollo_winter_runter'; // Szene Rolladen runter im Winter const idSommerZu = 'scene.0.Rollo_sommer_runter'; // Szene Rolladen runter im Sommer // Variablen werden bei Skriptstart initialisiert var auto = getState(idAuto).val; var winter = getState(idWinter).val; var tag = isAstroDay(); var morgens = compareTime('6:30', '8:00', 'between'); var abends = compareTime('17:00', '21:50', 'between'); function Rollosrauf() { if(auto) { if(winter) setState(idWinterRauf, true); else setState(idSommerRauf, true); } } function Rollosrunter() { if(auto) { if(winter) setState(idWinterZu, true); else setState(idSommerZu, true); } } schedule('30 6 * * *', function() { morgens = true; if(tag) Rollosrauf(); }); schedule('0 8 * * *', function() { morgens = false; if(!tag) Rollosrauf(); }); schedule('0 17 * * *', function() { abends = true; if(!tag) Rollosrunter(); }); schedule('50 21 * * *', function() { abends = false; if(tag) Rollosrunter(); }); schedule({astro: 'sunrise'}, function () { tag = true; if(morgens) Rollosrauf(); }); schedule({astro: 'sunset'}, function () { tag = false; if(abends) Rollosrunter(); }); on(idAuto, function(dp) { auto = dp.state.val; }); on(idWinter, function(dp) { winter = dp.state.val; });