Funktionierende "Advent" Schaltung/Berechnung

Hello.

Gibt es eine funktionierende Advent berechnung welche mir einen Schalter einschaltet wenn wir zwischen dem ersten Advent und dem 07.01 sind?

Bzw. wie realisiert man so einene Berechnung?

Ich habe das hier gefunden, aber ich vertsehe nicht wie man das im HA einbindet… Adventberechnung

Kann jemand helfen?

Ich habe eine korrekte Berechung seit Jahrem im FHEm aber wie ich diese im HA integriere bin ich noch meileweit von weg…

use strict;
use warnings;
use POSIX;
use HTTP::Date;

sub Advent() {
	my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
    my $adv=0;
    $Jahr+=1900;
    if($Monat<1) {
     if ($Monatstag<7) {$adv=1;}
    }
	else
	{      my $time = str2time("$Jahr-12-25");
  		my $wday = (localtime($time))[6];
  		$wday = $wday ? $wday : 7;
  		$time -= ($wday+22)*86400;
  		$adv=1 if ($time<time)
	}
    return $adv;
}

hast du interesse mehr als nur die eine Routine in HA zu übernehmen? Wenn ja schau dir Node-Red an. Da kannst du die Automatisierungen besser abbilden als in HA selber. Da kannst auch problemlos javascript als Funktion einbinden. Die Logik aus fhem kannst dann einfach in JS umschreiben und weiter nutzen.

Alternativ kannst das auch irgendwie per Template irgendwie lösen.

Altternativ2 shellscript und das aus HA aufrufen

Könnte man damit realisieren:

{% 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) }}

Dieser Jinja2-Code berechnet das Datum des ersten Advents und überprüft, ob das aktuelle Datum innerhalb des Zeitraums von diesem ersten Advent bis zum 6. Januar liegt. Hier ist eine Schritt-für-Schritt-Erklärung:

  1. Berechnung des ersten Advents:
{% set first_advent = now().replace(day=25, month=12) - timedelta(days = 21 + now().replace(day=25, month=12).isoweekday() ) %}
  • now().replace(day=25, month=12) legt den 25. Dezember des aktuellen Jahres fest.
  • timedelta(days = 21 + now().replace(day=25, month=12).isoweekday()) berechnet die Differenz in Tagen zum ersten Advent. 21 Tage vorher liegt immer auf einem Sonntag, und isoweekday() bestimmt den Wochentag des 25. Dezembers, um den genauen ersten Advent festzulegen.
  1. Überprüfung des Zeitraums:
{{ first_advent <= now() <= now().replace(day=31, month=12) or now() <= now().replace(day=6, month=1) }}
  • first_advent <= now() <= now().replace(day=31, month=12) prüft, ob das heutige Datum zwischen dem ersten Advent und dem 31. Dezember liegt.
  • or now() <= now().replace(day=6, month=1) fügt die Bedingung hinzu, dass das Datum auch vor oder am 6. Januar sein darf.

Dieser Ausdruck gibt true zurück, wenn das heutige Datum im Adventszeitraum bis zum 6. Januar liegt, sonst false.

Nachtrag:
noch ein Tip zur praktischen Umsetzung.

Kopiert man folgenden Code in die configuration.yaml

binary_sensor:
  - platform: template
    sensors:
      adventszeit:
        friendly_name: "Adventszeit"
        value_template: >
          {% set today = now() %}
          {% set first_advent = today.replace(day=25, month=12) - timedelta(days=21 + today.replace(day=25, month=12).isoweekday()) %}
          {{ first_advent <= today <= today.replace(day=31, month=12) or today <= today.replace(day=6, month=1) }}

so erzeugt dieser einen binären Sensor/Entität mit Namen “Adventszeit” welcher dann einfach als Bedingung in der entsprechenden Automation benutzt werden kann!
Viel einfacher geht’s nicht, oder?

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

5 „Gefällt mir“

@mostie ich bin glücklich wenn ich erstmal die Sache bei HA verstehe, wollte nicht noch ein weiteres system fahren, erstmal…
Werd es mir aber sicherlich mal ansehen.

@anon27776569 COOL! Danke dir schon mal dafür und die Erklärung. Da ich aber echt voll der HA noob bin und Jahrelang nur DOIF benutzt habe, wo muss ich diesen Code einbinden im HA um mit Ihm meinen Schalter zu schalten als optische Darstellung das Advent ist oder nicht…

HA! da hat sich eben mein Gedanke mit deinem Überschnitten!

KLASSE!!! Vielen Dank! Werde ich gleich testen!

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

Uj, das ging ja schnell mit dem zusammenführen der Posts. An sich danke für deine Mühe @harryp aber ich finde das man leicht eine Ergänzung schnell mal übersieht weil man es ja an sich ja schon gelesen hat… und so ist der Verlauf etwas “zerstört” wenn man es zusammenführt.

Aber okay, wenn das so gewollt ist, kein Problem. Muss mich nur dran gewöhnen. :wink:

zum testen kannst du den code auch erst einmal im " Template-Editor" ausprobieren! Findest du unter “Entwicklerwerkzeuge/Template”. da einfach ins linke Fenster am Ende einfügen und im rechten Fenster das Ergebnis bewundern! :wink:

Saubere Sache. Vielen Dank schon mal.

Eine Frage: Wie verhält sich dieser Code im HA wenn es schon seit x Tagen Advent ist und HA mal neugestatret wird? Wird die Überprüfung immer neu initialisiert?

Ich muss fragen weil ich das im FHEM “manuell” überprüfen lassen musste nach dem Neustart weil ich ein EVENT ZUM Zeitpunkt des Adventeintritts bekommen habe und danach nicht wieder. Somit war nach dem Neustart KEIN Advent außer ich habe es mit einem DOIF alle x Minuten überprüfen lassen…

Anders gesagt/gefragt: Wird mit dem Code bei einem Neustart von HA mein “Helfer-Schalter” ADVENT wieder auf ON gesetzt falls es schon Advent seit ein Paar tagen ist?

Oh Mann, sorry für solche Fragen :rofl:

Sensoren werden permanent abgefragt! Da spielt ein Neustart keine Rolle, ist ja auch besser so! :wink:

1 „Gefällt mir“

Ich habe jetzt eine Automation erstellt die einen “Helfer” schalter ein oder ausschalten soll…

Ich habe mal den YAML Code kopiert, wie erkläre ich dem Code das er bitte alle 10 Min oder eine andere Zeit überprüfen soll welchen status Adventszeit hat um den Status des Schalters anzupassen falls er manuell umgestellt wurde?

alias: Advent Dummy
description: ""
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.adventszeit
conditions: []
actions:
  - if:
      - condition: state
        entity_id: binary_sensor.adventszeit
        state: "true"
    then:
      - action: input_boolean.turn_on
        metadata: {}
        data: {}
        target:
          entity_id: input_boolean.advent
    else:
      - action: input_boolean.turn_off
        metadata: {}
        data: {}
        target:
          entity_id: input_boolean.advent
mode: single

Du solltest “binary_sensor.adventszeit” nicht als “Trigger” sondern nur als Bedingung nutzen!

Ich mache das in etwa so:

alias: Adventsbeleuchtung
description: ""
triggers:
  - trigger: sun
    event: sunset
    offset: "-00:30:00"
    id: Adventsbeleuchtung anschalten
  - trigger: sun
    event: sunrise
    offset: "00:30:00"
    id: Adventsbeleuchtung ausschalten
conditions:
  - condition: state
    entity_id: binary_sensor.adventszeit
    state: "on"
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Adventsbeleuchtung anschalten
        sequence:
          - action: switch.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: switch.adventsbeleuchtung
      - conditions:
          - condition: trigger
            id:
              - Adventsbeleuchtung ausschalten
        sequence:
          - action: switch.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: switch.adventsbeleuchtung
mode: single

30 Minuten vor Sonnenuntergang wird eingeschaltet und 30 Minuten nach Sonnenaufgang wieder ausgeschaltet!

Alle zu schaltenden “Geräte” sind in der Gruppe “Adventsbeleuchtung”(switch.adventsbeleuchtung).
Gruppen kannst du unter “Helfer” anlegen!
Es gibt auch noch eine Zweite Gruppe in der alle “Indoor-Geräte” stehen welche nicht die ganze Nacht an sein sollen, diese Gruppe wird dann wenn es zu Bett zum “schlafen” geht ausgeschaltet!
Ich hoffe du kommst klar damit, ansonsten fragen!

Zum besseren Verständniss mal von ChatGPT die Erklärung zum Script:

Erklärungen der einzelnen Bereiche

  1. Alias und Beschreibung
alias: Adventsbeleuchtung
description: ""
  • alias: Der Name der Automatisierung, wie er in der Home Assistant Oberfläche angezeigt wird.
  • description: Ein freies Textfeld für Beschreibungen. Hier leer gelassen.
  1. Auslöser (Triggers)
triggers:
  - trigger: sun
    event: sunset
    offset: "-00:30:00"
    id: Adventsbeleuchtung anschalten
  - trigger: sun
    event: sunrise
    offset: "00:30:00"
    id: Adventsbeleuchtung ausschalten
  • Es gibt zwei Auslöser, basierend auf dem Sonnenstand:
    • Der erste Auslöser (sunset) tritt 30 Minuten vor Sonnenuntergang ein und schaltet die Beleuchtung ein.
    • Der zweite Auslöser (sunrise) tritt 30 Minuten nach Sonnenaufgang ein und schaltet die Beleuchtung aus.
  • Die id-Werte (Adventsbeleuchtung anschalten und Adventsbeleuchtung ausschalten) werden verwendet, um diese Auslöser später in der Bedingung zu identifizieren.
  1. Bedingung (Condition)
conditions:
  - condition: state
    entity_id: binary_sensor.adventszeit
    state: "on"
  • Diese Bedingung stellt sicher, dass die Aktionen nur ausgeführt werden, wenn der binary_sensor.adventszeit den Zustand "on" hat – also während der Adventszeit.
  • Der Sensor binary_sensor.adventszeit prüft, ob das aktuelle Datum in die Adventszeit fällt. Er ist in deiner Konfiguration separat definiert.
  1. Aktionen (Actions)
actions:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Adventsbeleuchtung anschalten
        sequence:
          - action: switch.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: switch.adventsbeleuchtung
      - conditions:
          - condition: trigger
            id:
              - Adventsbeleuchtung ausschalten
        sequence:
          - action: switch.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: switch.adventsbeleuchtung
  • Die choose-Aktion trifft eine Auswahl basierend auf den Bedingungen.
    • Wenn der Adventsbeleuchtung anschalten-Auslöser aktiv ist, wird die switch.adventsbeleuchtung eingeschaltet.
    • Wenn der Adventsbeleuchtung ausschalten-Auslöser aktiv ist, wird die switch.adventsbeleuchtung ausgeschaltet.
  1. Modus (Mode)
mode: single
  • Der single-Modus stellt sicher, dass diese Automatisierung nur einmal zur gleichen Zeit aktiv sein kann.

Gesamtfunktion

Die Automatisierung schaltet die Adventsbeleuchtung basierend auf Sonnenstand und einer Jahreszeit-Bedingung ein und aus.

2 „Gefällt mir“

Krass, vielen Dank. Das leuchtet ein.

Denke damit kann ich gut arbeiten ABER ich muss noch viel Lernen…

Das DOIF ist in Textform irgendwie klarer in meiner Murmel mit dem YAML Code und erst recht mit der GUI Darstellung komme ich noch nicht wirklich zu recht.

1 „Gefällt mir“

Hi!

Noch eine Frage:

  1. Kann man sich irgendwie das Datim Im HA anzeigen lassen wann es denn soweit ist mit dem ersten Advent?

  2. Was müsste ich machen dmait die “Adventszeit” am Montag NAch dem TotenSonntag “wahr” wird? also Quasi am kommenden Montag…
    Vielen Dank!

Wird ja alles mehr oder weniger hier berechnet!

Ich überlasse mal die Erklärung “ChatGPT”:

Dein Code berechnet das Datum des ersten Advents basierend auf dem aktuellen Datum (today). Hier ist eine Erklärung, wie der Code funktioniert:

  1. today.replace(day=25, month=12)
  • Setzt das Datum auf den 25. Dezember des aktuellen Jahres.
  1. today.replace(day=25, month=12).isoweekday()
  • Gibt den Wochentag des 25. Dezembers zurück (1 = Montag, …, 7 = Sonntag).
  1. timedelta(days=21 + ...)
  • Der 1. Advent ist immer 4 Wochen (also 21 Tage) vor Weihnachten, plus die Differenz, um auf den Sonntag der vorherigen Woche zu gelangen. Diese Differenz basiert auf isoweekday().
  1. - timedelta(...)
  • Subtrahiert die gesamte Zeitdifferenz von Weihnachten, um den ersten Advent zu berechnen.

Zusammengefasst:

  • Der Code berechnet die Anzahl der Tage, die vom 25. Dezember zurückgerechnet werden müssen, um zum ersten Advent zu gelangen. Dies geschieht, indem zunächst 21 Tage (3 Wochen) abgezogen werden und dann noch einmal so viele Tage, wie nötig sind, um auf den letzten Sonntag vor diesem Zeitpunkt zu kommen.

Anwendungsbeispiel

Wenn heute der 2. November 2024 ist:

  • today.replace(day=25, month=12) → 25. Dezember 2024
  • today.replace(day=25, month=12).isoweekday() → 3 (Mittwoch)
  • 21 + 3 → 24
  • timedelta(days=24) → 24 Tage
  • 25. Dezember - 24 Tage1. Dezember 2024 (1. Advent)

Und nun überlege mal selber wo du was “addieren oder subtrahieren” musst damit sich der “Start” verschiebt? :wink:

Hier mal der Code mit einem “Korrekturfaktor” der den Start entsprechend verschieben kann:

{% set today = now() %}
{% set korrektur_tage = -3 %}
{% set first_advent = today.replace(day=25, month=12) - timedelta(days=21 + today.replace(day=25, month=12).isoweekday() + korrektur_tage) %}

zum Probieren einfach unter “Entwicklerwerkzeuge/Template” folgendes anhängen und ausprobieren:

{% set today = now() %}
{% set korrektur_tage = -3 %}
{% set first_advent = today.replace(day=25, month=12) - timedelta(days=21 + today.replace(day=25, month=12).isoweekday() + korrektur_tage) %}
Start={{ first_advent.date() }}
1 „Gefällt mir“

hmm…

ich glaube ich hab es hinbekommen.

habe mir ind der config.yaml 2 Einträge erstellt für 1. Advent und den erstem Montag nach Toten Sonntag…

binary_sensor:
  - platform: template
    sensors:
      adventszeit:
        friendly_name: "Adventszeit"
        value_template: >
          {% set today = now() %}
          {% set first_advent = today.replace(day=25, month=12) - timedelta(days=21 + today.replace(day=25, month=12).isoweekday()) %}
          {{ first_advent <= today <= today.replace(day=31, month=12) or today <= today.replace(day=6, month=1) }}
         
         
  - platform: template
    sensors:
      montagnachtotensonntag:
        friendly_name: "MontagNachTotenSonntag"
        value_template: >
          {% set today = now() %}
          {% set totensonntag = today.replace(day=25, month=12) - timedelta(days=27 + today.replace(day=25, month=12).isoweekday()) %}
          {{ totensonntag <= today <= today.replace(day=31, month=12) or today <= today.replace(day=6, month=1) }}

Sowie 2 Sensoren die mir anzeigen ob es an oder aus ist…

ABer irgendwie bekomme ich es nicht hin mir das Datum anzeigen zu lassen…
Also in einer Kachel oder unter dem (AUS) von dem Sensor…

Wie stelle ich das an?

Das sind nur “binäre” Sensoren! Da gibt es nur ein “wahr/1” oder “unwahr/0” zurück!

Es ist eigentlich nur als “Bedingung” angedacht und nicht um Werte auszugeben!

Ja, aber gibt es denn keine Möglichkeit mir das Datum Irgendwie Irgendwo anzeigen zu lassen?

Na sicher doch gibt es das!
Hier ein Sensor der den Start der Adventszeit als Datum auswirft!

sensor:
  - platform: template
    sensors:
      adventszeit_start_date:
        friendly_name: "Adventszeit Start Datum"
        value_template: >
          {% set today = now() %}
          {% set first_advent = today.replace(day=25, month=12) - timedelta(days=21 + today.replace(day=25, month=12).isoweekday()) %}
          {% set first_advent_date = first_advent.strftime('%Y-%m-%d') %}
          {{ first_advent_date }}