gerne würde ich mit NodeRed unsere Weihnachtsbeleuchtung automatisieren. Leider stehe ich vollkommen vor der Wand.
Wunschszenario wäre es, dynamisch das Datum vom 1.Advent zu ermitteln und entsprechend zu vergleichen…
" Wenn Datum aktueller Tag >= Datum 1.Advent → dann turn_on "
Ich habe daran gedacht das Datum von dem Sonntag vor dem 24.12.20XX zu vermittelt und von da aus 21 Tage vorzählen.
Du könntest folgendenCode mal in einem Function-Node versuchen:
var end_month = (Number(msg.end_month)) -1 || 0 ;
var end_day = (Number(msg.end_day) ) || 6 ;
var firstAdvent = new Date();
var currentDate = new Date();
firstAdvent.setMonth(11); // Dezember
firstAdvent.setDate(25);
firstAdvent.setDate(firstAdvent.getDate() - (21 + firstAdvent.getDay()));
msg.payload = (firstAdvent <= currentDate && currentDate <= new Date(firstAdvent.getFullYear(), 11, 31)) || currentDate <= new Date(currentDate.getFullYear(), end_month, end_day);
return msg;
Befindet sich das aktuelle Datum zwischen 1.Advent und dem Enddatum, wird true zurückgegeben, sonst false.
Das Enddatum ist per Default der 6.1. im nächsten Jahr, kann aber auch durch entsprechende Werte in msg.end_month und msg.end_day übersteuert werden. (Habe den Code aber nicht groß getestet!!!)
Vielen Dank für deine Mühe, genau sowas habe ich gesucht.
Ich probiere es aus und werde es mal in Ruhe studieren, um zu sehen was da wie passiert. Bei dem Code kann ich auf jeden Fall wieder etwas dazu lernen
firstAdvent.getDay() gibt nicht 25 zurück sondern den Wochentag auf den der 25. fällt. Es wird also eigentlich gerechnet 25.12.2023 - (21+1) da der 25. auf einen Montag fällt.
Das Script hat für mich gut funktionier aber eine Kleinigkeit habe ich lange nicht gesehen.
Genau am dem Tag des 31.12.20XX funktioniert es nicht, davor und danach immer problemlos.
Dies lag wohl an dem bevorstehenden Jahreswechsel.
In der aktualisieren Version wird nun noch zusätzlich verglichen:
Wenn wir im Dezember sind → 6. Januar NÄCHSTES Jahr
Wenn wir im Januar sind → 6. Januar dieses Jahres
Zusammenfassend:
Diese Berechnung bestimmt in jedem Jahr das Datum von dem 1. Advent (4. Sonntag vor Weihnachten) bis zum 06.01 jeden Folgejahrs. Innerhalb diesen Zeitraums (1.Advent → 06.01) erfolgt als Ausgabe ein true, sonst ein false!
let now = new Date();
// Advent-Jahr bestimmen
let adventYear = now.getMonth() === 0 ? now.getFullYear() - 1 : now.getFullYear();
// 1. Advent berechnen
let firstAdvent = new Date(adventYear, 11, 25);
firstAdvent.setDate(firstAdvent.getDate() - (21 + firstAdvent.getDay()));
// Enddatum 6. Januar
let endDate = new Date(adventYear + 1, 0, 6);
// Zeitraum prüfen
msg.payload = (now >= firstAdvent && now <= endDate);
return msg;