NodeRed 1.Advent Datum berechnen

Hallo Zusammen,

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.

Hat jemand eine Idee, wie ich das umsetzen kann

turn_on soll dann vom 1. Advent bis wann erfolgen?

Die Hauptbedingung, also das Datum, wäre vom 1.Advent 20XX bis 06.01.20XX+1 geplant.

Nebenbedingungen wie Helligkeit und Uhrzeiten würden entsprechend nachgelagert folgen.

In der home-assistant.io community habe ich diese Formel für einen Template Sensor gefunden, der das von dir gewünschte Verhalten hat:

Template for Christmas Season - Configuration - Home Assistant Community
{% set first_advent = now().replace(day=25, month=12) - timedelta(days = 21 + now().replace(day=25, month=12).isoweekday() ) %} {{ first_advent <= now() <= now().replace(day=31, month=12) or now() <= now().replace(day=6, month=1) }}

3 „Gefällt mir“

Vielen Dank für den Hinweis, sieht gut aus… und auch echt kompliziert :sweat_smile:

Wäre auf jeden Fall eine gute Alternative wenn es in Node Red nicht klappt.

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!!!)

2 „Gefällt mir“

Wow…

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 :sweat_smile:

Hallo @crypton,

ich habe den Code mit firstAdvent.setYear für die nächsten 3 Jahre mal durchgespielt und das Datum vom 1.Advent stimmt immer :+1:

Ich habe da mal eine Verständnisfrage zu der Berechnung…

firstAdvent.setDate(25);
firstAdvent.setDate(firstAdvent.getDate() - (21 + firstAdvent.getDay()));

Wenn ich dies bereinigt mit “25” betrachte, komme ich immer auf ein anderes Datum…
firstAdvent.setDate(25ter - (21tage + 25ter));

Kannst du mir sagen wie da gerechnet wird?

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.

Vielen Dank für die Erklärung. Das ist ein echt eleganter Weg :+1: