NEWS
X-Minuten nach/vor Sunset Funktion auslösen
-
Hi!
ich habe mein Rolladenscript als Javascript mit Unterstützung hier im Forum realisiert. Ich selbst kann leider kein JS Programmieren und bin da auf Hilfe angewiesen. Das script sieht momentan wie folgt aus:
// Datenpunkt-IDs const idAuto = '0_userdata.0.Rollladenautomatik'; // Dummyschalter für Rolladenautomatik const idAusschlafen = '0_userdata.0.Rollo_Ausschlafen'; // Dummyschalter für Ausschlaf-Modus const idAusschlafenRauf = 'scene.0.Rollladen.Rollo_ausschlafen_hoch'; // Szene Rolladen rauf bei Ausschlafen const idNormalRauf = 'scene.0.Rollladen.Rollo_normal_hoch'; // Szene Rolladen rauf normalbetrieb const idAusschlafenZu = 'scene.0.Rollladen.Rollo_normal_runter'; // Szene Rolladen runter bei Ausschlafen const idNormalZu = 'scene.0.Rollladen.Rollo_normal_runter'; // Szene Rolladen runter Normalbetrieb // Variablen werden bei Skriptstart initialisiert var auto = getState(idAuto).val; var ausschlafen = getState(idAusschlafen).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(ausschlafen) setState(idAusschlafenRauf, true); else setState(idNormalRauf, true); } } function Rollosrunter() { if(auto) { if(ausschlafen) setState(idAusschlafenZu, true); else setState(idNormalZu, 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', shift: 20}, function () { tag = false; if(abends) Rollosrunter(); }); on(idAuto, function(dp) { auto = dp.state.val; }); on(idAusschlafen, function(dp) { ausschlafen = dp.state.val; });
Im Grunde geht es darum innerhalb eines Zeitkorridors bei Sunset und Sunrise Szenen zu aktivieren bei denen die Rollläden hoch bzw. runter sind bzw. einige Zimmer im Ausschlaf-Modus ausgelassen werden. Das klappt auch vorzüglich.
Nun ist es im Sommer so, dass man auch noch paar Minuten nach Sunset sie Rollos oben haben will, weil es halt noch ausreichend hell und warm ist - im Winter genau umgekehrt. Aktuell habe ich das mit shift: 20 für die Abends Funktion realisiert - klappt auch.
Nun hätte ich aber gerne, dass das Offset (hier 20 Minuten) als Variable aus einem Custom-State von ioBroker genommen wird. Der state soll via Schieberegler in Lovelace einstellbar sein von -30 bis +30. Das müsste doch via getstate machbar sein, aber ich bekomme die Syntax nicht hin. Vieleicht könnt ihr mir helfen?
Besten Dank vorab! -
@lastactionhero sagte in X-Minuten nach/vor Sunset Funktion auslösen:
Nun hätte ich aber gerne, dass das Offset (hier 20 Minuten) als Variable aus einem Custom-State von ioBroker genommen wird. Der state soll via Schieberegler in Lovelace einstellbar sein von -30 bis +30. Das müsste doch via getstate machbar sein, aber ich bekomme die Syntax nicht hin. Vieleicht könnt ihr mir helfen?
z.B.
var off = getState("dein DP").val;
getState hast du doch zig-fach in deinem Script drin.
-
@bahnuhr
Ja, das stimmt, aber wird die variable dann auch jedes mal erneuert wenn einer den schieber betätigt oder nur beim start de scripts?
Und wie muss die syntax dann hier lauten anstatt „shift: 20“? shift: ´off´ ? -
-
@LastActionHero
Versuche mal:var shift = getState(idShift).val; on(idShift, function(dp) { shift = dp.state.val; }); schedule({astro: 'sunset', shift: shift}, function () {
-
@paul53 Hallo Paul, danke für deine Unterstützung! Ich habe den Code nun in das Script eingearbeitet, der Code ist unten angefügt. Allerdings wird dann die Funktion scheinbar nicht ausgelöst. Die Rolläden schließen um 21:50 wie im Script als Endzeitpunkt angegeben, aber nicht um 21:20+X Minuten (ich hatte 15 ausgewählt, hätten also um 21:35 schließen sollen).
Passt denn das Script so? Oder kann es am Typ des Datenpunkts Rollo_offset liegen? Diesen hatte ich als Zahl eingestellt. Habe nun mal auf String umgestellt und warte damit den morgigen Abend ab.
// Datenpunkt-IDs const idAuto = '0_userdata.0.Rollladenautomatik'; // Dummyschalter für Rolladenautomatik const idAusschlafen = '0_userdata.0.Rollo_Ausschlafen'; // Dummyschalter für Ausschlaf-Modus const idAusschlafenRauf = 'scene.0.Rollladen.Rollo_ausschlafen_hoch'; // Szene Rolladen rauf bei Ausschlafen const idNormalRauf = 'scene.0.Rollladen.Rollo_normal_hoch'; // Szene Rolladen rauf normalbetrieb const idAusschlafenZu = 'scene.0.Rollladen.Rollo_normal_runter'; // Szene Rolladen runter bei Ausschlafen const idNormalZu = 'scene.0.Rollladen.Rollo_normal_runter'; // Szene Rolladen runter Normalbetrieb const idRolloOffset = '0_userdata.0.Rollo_offset'; // Offset Schieberegler // Variablen werden bei Skriptstart initialisiert var auto = getState(idAuto).val; var ausschlafen = getState(idAusschlafen).val; var tag = isAstroDay(); var morgens = compareTime('6:30', '8:00', 'between'); var abends = compareTime('17:00', '21:50', 'between'); var rollooffset = getState(idRolloOffset).val; function Rollosrauf() { if(auto) { if(ausschlafen) setState(idAusschlafenRauf, true); else setState(idNormalRauf, true); } } function Rollosrunter() { if(auto) { if(ausschlafen) setState(idAusschlafenZu, true); else setState(idNormalZu, 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', shift: rollooffset}, function () { tag = false; if(abends) Rollosrunter(); }); on(idAuto, function(dp) { auto = dp.state.val; }); on(idAusschlafen, function(dp) { ausschlafen = dp.state.val; }); on(idRolloOffset, function(dp) { rollooffset = dp.state.val; });
-
@lastactionhero sagte: kann es am Typ des Datenpunkts Rollo_offset liegen? Diesen hatte ich als Zahl eingestellt.
Es muss eine Zahl sein.
Der Wert für "shift" wird nur bei Skriptstart übernommen. Für eine dynamische Anpassung während der Laufzeit müsste schedule() gestoppt und neu generiert werden, was aber mit Astro-Schedules nicht möglich ist.
Man muss also ein "normales" Schedule mit Uhrzeit verwenden, wobei die Uhrzeit einmal pro Tag per getAstroDate('sunset') und Korrektur um "shift" ermittelt wird.EDIT: Etwa so:
var sunset; function sunsetWithOffset() { const sunsetOff = getAstroDate('sunset').getTime() + 60000 * getState(idRolloOffset).val; const minute = new Date(sunsetOff).getMinutes().toString(); const hour = new Date(sunsetOff).getHours().toString(); sunset = schedule(minute + ' ' + hour + ' * * *', function() { tag = false; if(abends) Rollosrunter(); }); } sunsetWithOffset(); // Skriptstart on(idRolloOffset, function(dp) { // Offset wird geändert clearSchedule(sunset); sunsetWithOffset(); }); schedule('0 14 * * *', function() { // einmal täglich vor Ereignis clearSchedule(sunset); sunsetWithOffset(); });
-
@paul53 ah, verstehe, das ist eine wertvolle Information, da hätte ich lange mit Astro hantieren können! D.h. dieser Schedule kommt weg, stattdessen dein Scriptblock an diese stelle.
schedule({astro: 'sunset', shift: rollooffset}, function () { tag = false; if(abends) Rollosrunter(); });
Dann müsste auch der Zeitkorridor noch funktionieren - also zwischen 6:30-8:00 und 17:00-21:50?
-
@lastactionhero sagte: Scriptblock an diese stelle.
Dieser Skriptblock funktioniert nur bei Skriptstart. Eine dynamische Veränderung von
shift
während der Laufzeit erfolgt nicht. Deshalb ist die aufwändigere Version mit der täglichen Ermittlung der Uhrzeit erforderlich. -
@paul53 ich möchte mich ganz recht herzlich für deine Hilfe bedanken! Ich habe zeitbedingt ein paar Tage gebraucht das Script umzusetzen, aber das ganze klappt wirklich wie geschmiert! Dankeschön!
hier nochmal der aktuelle Stand:
// Datenpunkt-IDs const idAuto = '0_userdata.0.Rollladenautomatik'; // Dummyschalter für Rolladenautomatik const idAusschlafen = '0_userdata.0.Rollo_Ausschlafen'; // Dummyschalter für Ausschlaf-Modus const idAusschlafenRauf = 'scene.0.Rollladen.Rollo_ausschlafen_hoch'; // Szene Rolladen rauf bei Ausschlafen const idNormalRauf = 'scene.0.Rollladen.Rollo_normal_hoch'; // Szene Rolladen rauf normalbetrieb const idAusschlafenZu = 'scene.0.Rollladen.Rollo_normal_runter'; // Szene Rolladen runter bei Ausschlafen const idNormalZu = 'scene.0.Rollladen.Rollo_normal_runter'; // Szene Rolladen runter Normalbetrieb const idRolloOffset = '0_userdata.0.Rollo_offset'; // Offset Schieberegler // Variablen werden bei Skriptstart initialisiert var auto = getState(idAuto).val; var ausschlafen = getState(idAusschlafen).val; var tag = isAstroDay(); var morgens = compareTime('6:30', '8:00', 'between'); var abends = compareTime('17:00', '22:15', 'between'); var rollooffset = getState(idRolloOffset).val; function Rollosrauf() { if(auto) { if(ausschlafen) setState(idAusschlafenRauf, true); else setState(idNormalRauf, true); } } function Rollosrunter() { if(auto) { if(ausschlafen) setState(idAusschlafenZu, true); else setState(idNormalZu, 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('15 22 * * *', function() { abends = false; if(tag) Rollosrunter(); }); schedule({astro: 'sunrise'}, function () { tag = true; if(morgens) Rollosrauf(); }); var sunset; function sunsetWithOffset() { const sunsetOff = getAstroDate('sunset').getTime() + 60000 * getState(idRolloOffset).val; const minute = new Date(sunsetOff).getMinutes().toString(); const hour = new Date(sunsetOff).getHours().toString(); sunset = schedule(minute + ' ' + hour + ' * * *', function() { tag = false; if(abends) Rollosrunter(); }); } sunsetWithOffset(); // Skriptstart on(idRolloOffset, function(dp) { // Offset wird geändert clearSchedule(sunset); sunsetWithOffset(); }); schedule('0 14 * * *', function() { // einmal täglich vor Ereignis clearSchedule(sunset); sunsetWithOffset(); }); on(idAuto, function(dp) { auto = dp.state.val; }); on(idAusschlafen, function(dp) { ausschlafen = dp.state.val; }); on(idRolloOffset, function(dp) { rollooffset = dp.state.val; });