Sensor für Sommer und Winterzeit und Zeitumstellung allgemein

Hallo in die Runde,
ich habe relativ lange gesucht um dies umzusetzen.
Ggf. wird dies mal gebraucht bzw. gesucht oder jemand kann es gebrauchen.
Deshalb hier mal wie ich das bewerkstelligt habe.
Ob es schön ist oder nicht. Geschmackssache :wink:

Über folgenden Code bekommt man raus ob Sommerzeit oder Winterzeit herrscht.

now().timetuple().tm_isdst

Der Sensor sieht dann bei mir so aus:

# Sommer und Winterzeit (1=Sommerzeit 0=Winterzeit)
  - sensor:
      - name: "Sommer-Winterzeit"
        unique_id: sommer_winterzeit
        state: >
           {% if now().timetuple().tm_isdst == 1 %}
             Sommerzeit
           {% else %}
             Winterzeit
           {%- endif %}
        icon: mdi:hours-24

Erklärung zu now().timetuple().tm_isdst soweit ich das rausgefunden habe.

now(): gibt das aktuelle Datum und die aktuelle Uhrzeit zurück.
timetuple(): Diese Methode wandelt das datetime Objekt, das von now() zurückgegeben wird, in ein time.struct_time Objekt um.
u.a. auch Tag des Jahres und Sommerzeit-Flag.
tm_isdst: tm_isdst ist ein Flag, das anzeigt, ob die Sommerzeit aktiv ist oder nicht.
Wenn die Sommerzeit aktiv ist, ist tm_isdst 1, wenn sie nicht aktiv ist, ist tm_isdst 0 und (Vermutung meinerseits) wenn unbekannt ist, ob die Sommerzeit aktiv ist, ist tm_isdst -1.

Will man noch weiter ins Thema rein habe ich noch folgendes gefunden.
Nicht mein Gehirnschmalz. Gefunden nach Suche.

Sensoren für

  • Datum nächste Zeitumstellung
  • Tage bis zur nächsten Zeitumstellung
  • Zeitumstellungsphase

Realisiert über REST.

rest:
- resource_template: "http://worldtimeapi.org/api/timezone/{{ now().tzinfo }}"
  sensor:
  - name: "Naechste Zeitumstellung"
    unique_id: naechste_zeitumstellung
    value_template: >
      {{ ((value_json.dst_from, value_json.dst_until) | map('as_datetime') | map('as_local') | select('>', now()) | first).isoformat() }}
    device_class: timestamp

  - name: "Tage bis zur naechsten Zeitumstellung"
    unique_id: tage_bis_zur_naechsten_zeitumstellung
    value_template: >
      {%- set next =  (value_json.dst_from, value_json.dst_until) | map('as_datetime') | map('as_local') | select('>', now()) | first  %}
      {{ (next-today_at()).days }}
    unit_of_measurement: days

  - name: "Zeitumstellungsphase"
    unique_id: zeitumstellungsphase
    value_template: >
      {%- macro phrase(seconds, name, divisor, mod=None) %}
        {%- set value = ((seconds | abs // divisor) % (mod if mod else divisor)) | int %}
        {%- set end = 's' if value > 1 else '' %}
        {{- '{} {}{}'.format(value, name, end) if value > 0 else '' }}
      {%- endmacro %}
      {% set next = (value_json.dst_from, value_json.dst_until) | select('>', utcnow().isoformat()) | first %}
      {% set name, value = value_json.items() | list | selectattr('1', '==', next) | first %}
      {% set seconds = value_json.dst_offset %}
      {%- set values = [ 
        phrase(seconds, 'Stunde', 60*60, 60*60*24),
        phrase(seconds, 'Minute', 60, 60),
        ] | select('!=','') | list %}
      {{ 'plus' if name == 'dst_until' else 'minus' }} {{ values[:-1] | join(', ') ~ ' and ' ~ values[-1] if values | length > 1 else values | first }}

Sieht dann so aus:

zeit

Ich hoffe das verkürzt nun das Suchen :grinning:

VG
Supergrobi

6 „Gefällt mir“

Hey @Supergrobi ich bin so froh, dass ich über deinen Beitrag gestolpert bin. Vielen Dank fürs posten! Ich hatte schon viele verschiedene, manuelle Konstrukte ausprobiert um die Zeitumstellung zu tracken. Dabei kann es so einfach sein, man muss es nur kennen. :wink:

Da ich nicht wollte, dass der Sensor ständig aktualisiert wird, habe ich mir einen Trigger Based Template Sensor erstellt, der Dank der neuen Möglichkeit conditions zu verwenden, nur jeden Sonntag kurz nach 3 gecheckt und aktualisiert wird. Das sieht dann wie folgt aus, falls es jemanden interessiert:


- trigger:
    - trigger: time
      at: "03:01:00"
  condition:
    - condition: template
      value_template: >
        {{ now().isoweekday() == 7 }}
  sensor:
    - name: Zeitmodus
      unique_id: zeitmodus
      state: >
        {% if now().timetuple().tm_isdst == 1 %}
          Sommerzeit
        {% else %}
          Normalzeit
        {% endif %}
      icon: mdi:calendar-clock
      attributes:
        Mögliche_Zustände: "Sommerzeit (1), Normalzeit (0)"

1 „Gefällt mir“