NEWS
[gelöst]Anfänger: Variable über Uhrzeit
-
Hallo,
habe folgenden Code für meine Türklingel erstellt. Bei Betätigung eines Taster zwischen 06:00 - 09:00 und 14:00 - 19:45 soll nicht nur ein Telegram versendet werden, sondern auch die Glocke läuten:
var Zeit; schedule('0 6 * * *', function () {Zeit = '1'}); schedule('0 9 * * *', function () {Zeit = '0'}); schedule('0 14 * * *', function () {Zeit = '1'}); schedule('45 19 * * *', function () {Zeit = '0'}); on ('mqtt.0.ESP_Tuerklingeltaster.Glocke.State', function (obj) { if (obj.state.val == 1 && Zeit =='1') setState('sonoff.0.Sonoff_Bridge_.RfKey3', "555503" ) sendTo('telegram.0', 'send', {text: 'Es hat an der Haustüre geläutet'}); sendTo('telegram.1', 'send', {text: 'Es hat an der Haustüre geläutet'}); if (obj.state.val == 1 && Zeit =='0') {sendTo('telegram.0', 'send', {text: 'Es hat an der Haustüre geläutet'}) sendTo('telegram.1', 'send', {text: 'Es hat an der Haustüre geläutet'})}; });
Was passiert mit bei einem Reboot mit meiner Variable Zeit? Ist der Status dann undefinied bzw. wie sollte der Code aussehen, damit es besser funktioniert?
-
Die Variable Zeit is solange undefiniert bis sie die erste Zuweisung erhält.
Frage es doch direkt in der "on" Funktion ab.?
var Zeit; var currentTime = new Date(); var cH = currentTime.getHours() var cM = currentTime.getMinutes(); var cS = currentTime.getSeconds(); if ((cM>=6 && cM<9) || (cM>14 && (cM<19 || (cM==19 && cS<45)))) Zeit=1; else Zeit=0; console.log(Zeit);
oder damit es übersichtlicher ist:
if (cM>19 || (cM==19 && cS>=45)){ } else if (cM>=14) { } else if (cM>=9) { } else if (cM>=6) { } else { }
-
@ticaki Vielen Dank für deine Hilfe.
Ich glaube du hast cH, cM, cS vertauscht:
var Zeit; var currentTime = new Date(); var cH = currentTime.getHours() var cM = currentTime.getMinutes(); var cS = currentTime.getSeconds(); if ((cH>=6 && cH<12) || (cH>14 && (cH<19 || (cH==19 && cM<45)))) Zeit=1; else Zeit=0; console.log(Zeit);
So sollte es aussehen.
-
@Johannes-Bauerstatter
Du hast recht. Cron.... -
@ticaki Hier ist nochmal ne alternative, die vielleicht ein klein wenig übersichtlicher ist, da nicht Stunden und Minuten separat abgefragt werden. Sie jetzt nur voraus, dass dein Value von "mqtt.0.ESP_Tuerklingeltaster.Glocke.State" immer nur 0 oder 1 ist. Sonst müsste man die if-Abfrage nochmal anpassen.
on({id: 'mqtt.0.ESP_Tuerklingeltaster.Glocke.State', change: 'any'}, function (obj) { //Falls Value gleich 0, Funktion abbrechen if(obj.state.val == 0) return; //Aktuelle Dates generieren var currentTime = new Date(); var t06_00 = new Date(currentTime.getFullYear(), currentTime.getMonth(), currentTime.getDay(), 6,0,0); var t09_00 = new Date(currentTime.getFullYear(), currentTime.getMonth(), currentTime.getDay(), 9,0,0); var t14_00 = new Date(currentTime.getFullYear(), currentTime.getMonth(), currentTime.getDay(), 14,0,0); var t19_45 = new Date(currentTime.getFullYear(), currentTime.getMonth(), currentTime.getDay(), 19,45,0); // Abfragen, ob Zeit innerhalb der gewünschten Zeitspanne liegt if( (currentTime >= t06_00 && currentTime < t09_00) || (currentTime >= t14_00 && currentTime < t19_45) ) { setState('sonoff.0.Sonoff_Bridge_.RfKey3', "555503" ); } //Telegrammnachricht immer senden sendTo('telegram.0', 'send', {text: 'Es hat an der Haustüre geläutet'}); sendTo('telegram.1', 'send', {text: 'Es hat an der Haustüre geläutet'}); });
-
@Tictactoo
kann es sein das du anstatt getSeconds() getDay() schreiben wolltest?Aber schönes Beispiel danke
-
@ticaki Ja, natürlich.^^ Sry, war vorher wohl etwas verpeilt.^^