Zirkadianes Licht mit WiZ — Farbtemperatur die der Sonne folgt

Wie ich ein zirkadianes Beleuchtungssystem mit WiZ-Lampen und der HA Sonnen-Entität gebaut habe — keine Drittanbieter-Integration, nur eine einzige Automatisierung die alle 30 Minuten die Sonnenhöhe auf Farbtemperatur abbildet.

#wiz #licht #zirkadian #automatisierung #home-assistant
12. Dezember 2025
Zirkadianes Licht mit WiZ — Farbtemperatur die der Sonne folgt

Natürliches Tageslicht ist nicht weiß. Mittags ist es ein kühles Neutral — etwa 5500K. Morgens und abends ist es warm orange. Nach Sonnenuntergang wie Kerzenlicht. Der Körper nutzt diese Verschiebungen um Wachheit und Schlaf zu regulieren. Die meisten Smart-Beleuchtungssysteme ignorieren das völlig und sitzen den ganzen Tag bei derselben Farbtemperatur — meistens irgendwas Generisches um 3000K — unabhängig davon was die Sonne draußen gerade macht.

Die WiZ-Lampen unterstützen Farbtemperatur nativ. Die WiZ-Integration ist in HA eingebaut — sie erkennt Lampen automatisch im lokalen Netzwerk, kein HACS nötig. Home Assistant kennt den genauen Elevationswinkel der Sonne zu jedem Zeitpunkt über die eingebaute sun.sun-Entität. Die beiden zu verbinden erfordert eine einzige Automatisierung.

Die Hardware

Vier WiZ-Lampen im Wohnzimmer: zwei WiZ Plafond superslim Ø43cm 22W Deckenleuchten und zwei WiZ Smart E27 13W in den Ecklampen. Beide Typen unterstützen Farbtemperatur nativ — die Plafonds sind Tunable White; die E27s sind RGBW und können sowohl Farbe als auch Warmweiß darstellen.

Die Sonnen-Entität

HA’s sun.sun-Entität hat ein elevation-Attribut — den Winkel der Sonne über (oder unter) dem Horizont in Grad. Beim Sonnenhöchststand in Dänemark im Sommer erreicht er etwa 55°. Im Winter schafft er kaum 15°. Bei Sonnenauf- und -untergang ist er 0°. Nachts ist er negativ.

Diese eine Zahl beschreibt die Qualität des Außenlichts zu jedem gegebenen Moment. Die Automatisierung verwendet sie als Eingabe für eine Farbtemperaturberechnung.

Die Mathematik

variables:
  elevation: "{{ state_attr('sun.sun', 'elevation') | float(0) }}"
  color_temp_k: >
    {{ [[5000 if elevation > 45
         else ((3500 + (elevation - 15) / 30 * 1500) | int) if elevation > 15
         else ((2700 + elevation / 15 * 800) | int) if elevation > 0
         else 2200,
        2200] | max,
       6500] | min }}

Drei Zonen, zwei Übergänge:

SonnenhöheFarbtemperatur
Über 45°5000K — helles neutrales Tageslicht
15° – 45°3500K → 5000K linearer Übergang
0° – 15°2700K → 3500K linearer Übergang
Unter dem Horizont2200K — warmes Bernstein

Die max- und min-Klammern am Ende stellen sicher dass das Ergebnis unabhängig von Fließkomma-Abweichungen nie unter 2200K oder über 6500K geht. An einem klaren Sommermittag ist der Ausgabewert 5000K. An einem dunklen Dezemberabend um 17 Uhr mit der Sonne weit unter dem Horizont sind es 2200K.

Wann sie läuft

trigger:
  - platform: time_pattern
    minutes: "/30"
  - platform: state
    entity_id:
      - light.wiz_rgbw_tunable_414776
      - light.wiz_tunable_white_601970
      - light.wiz_tunable_white_60421e
      - light.wiz_rgbw_tunable_44a4a4
    to: "on"
    for: "00:00:05"

Alle 30 Minuten berechnet die Automatisierung neu und passt alle eingeschalteten Lampen an. Der zweite Trigger ist der wichtige: wenn man eine Lampe einschaltet bekommt sie sofort die richtige Farbtemperatur anstatt bis zu 30 Minuten auf die nächste geplante Aktualisierung zu warten. Die 5-Sekunden-for-Verzögerung verhindert eine Race Condition bei der der Einschaltbefehl selbst überschrieben wird bevor die Lampe reagiert hat.

Berührt nur eingeschaltete Lampen

repeat:
  for_each:
    - light.wiz_rgbw_tunable_414776
    - light.wiz_tunable_white_601970
    - light.wiz_tunable_white_60421e
    - light.wiz_rgbw_tunable_44a4a4
  sequence:
    - if:
        - condition: template
          value_template: "{{ is_state(repeat.item, 'on') }}"
      then:
        - action: light.turn_on
          target:
            entity_id: "{{ repeat.item }}"
          data:
            color_temp_kelvin: "{{ color_temp_k }}"

Das if innerhalb der Schleife macht sie unauffällig. Wenn eine Lampe aus ist passiert nichts. Die Automatisierung schaltet niemals Lampen ein — sie passt nur Lampen an die bereits eingeschaltet sind. Man kann die Hälfte der Lampen ausgelassen haben und die eingeschalteten folgen trotzdem der Sonne.

Wie es sich anfühlt

Die Verschiebung ist langsam genug dass man nicht bemerkt wie sie passiert. Was man stattdessen bemerkt ist dass der Raum sich richtig anfühlt — wach und neutral tagsüber, wärmer und entspannter wenn der Abend kommt, bernsteinfarben wenn man zur Ruhe geht. Der Übergang von 2700K zu 2200K in der letzten Stunde vor Mitternacht ist besonders spürbar wenn man darauf achtet: das Licht wird deutlich orange, was für die meisten Menschen ein Signal zum Entschleunigen ist.

Es bedeutet auch dass die Kinomodus-Automatisierung (die für Filme 2200K setzt) jetzt konsistent ist mit dem was die Lampen am Abend ohnehin natürlich erreichen würden. Die beiden Automatisierungen stehen nicht in Konflikt — die Film-Automatisierung übernimmt vorübergehend und die zirkadiane passt was eingeschaltet ist beim nächsten 30-Minuten-Tick an.

Was WiZ nativ kann

WiZ hat eigene “Dynamisch”-Modi in ihrer App — Sonnenaufgangs-Simulation, Kerzenlicht usw. Ich habe sie ausprobiert. Sie laufen lokal auf der Lampe und reagieren auf nichts in HA. Man kann sie nicht als Ausgangspunkt nehmen und basierend auf anderen Bedingungen anpassen. Es in HA zu bauen gibt volle Kontrolle: die Berechnung verwendet echte Solardaten für den eigenen genauen Standort, der 30-Minuten-Takt ist präzise, und die Logik kann angepasst werden ohne die WiZ-App überhaupt anzufassen.