Reproduire la lumière naturelle sous Home Assistant

Domotique 5 min de lecture

Faire varier la température de couleur de ses ampoules selon la hauteur du soleil : un capteur, une automatisation, et une lumière qui suit la journée.

Ampoule devant un coucher de soleil
Photo de ameenfahmy

En parcourant le bilan 2022 de Loïc sur le blog de Jeedom, une idée m'a inspiré dans son article : un mode « natural light » qui fait suivre à ses lampes la teinte du soleil au fil de la journée. L'idée est restée dans un coin de ma tête, et j'ai fini par l'adapter à Home Assistant.

Le principe est simple. Le soleil ne produit pas la même lumière selon sa hauteur dans le ciel : très chaude et orangée quand il rase l'horizon, beaucoup plus froide et blanche à midi. Reproduire cette courbe à l'intérieur rend l'éclairage nettement moins artificiel, surtout en fin de journée où une lumière blanche tranche désagréablement avec ce qui se passe dehors.

Il faut deux choses : un capteur qui calcule la température de couleur du soleil, et une automatisation qui l'applique à une lampe.

⚠️ Votre lampe doit évidemment être capable de changer de température de couleur. Une ampoule à teinte fixe ne fera rien. Les ampoules Philips Hue White Ambiance font parfaitement l'affaire, mais n'importe quel modèle exposant color_temp_kelvin dans Home Assistant conviendra.

Le capteur

Il s'appuie sur l'élévation du soleil, exposée par l'entité sun.sun, et la convertit en kelvins. La valeur est bornée entre 0 et 90 degrés : sous l'horizon, on garde la teinte la plus chaude.

template:
  - sensor:
      - name: Température de couleur du soleil
        default_entity_id: sensor.sun_color_temp_kelvin
        unique_id: '54015957-0892-4ad0-88fe-0a7666b00c96'
        unit_of_measurement: 'K'
        state: >-
          {{ (4791.67 - 3290.66 / (1 + 0.222 *
             (min(max(state_attr("sun.sun", "elevation") | float(0), 0), 90) ** 0.81))) | int(0) }}
1 500 2 000 2 500 3 000 3 500 4 000 4 500 0 10 20 30 40 50 60 70 80 90 1 501 K 4 445 K Température de couleur en fonction de la hauteur du soleil Élévation du soleil (°) Température de couleur (K)

Le capteur descend jusqu'à environ 1 500 K lorsque le soleil est à l'horizon, et monte autour de 4 445 K quand il est au zénith. La courbe est très raide au début : presque toute la variation se joue dans les dix premiers degrés d'élévation, et au-delà de 30° elle est quasiment plate. Autrement dit, l'effet est marqué au lever et au coucher, imperceptible le reste de la journée. C'est précisément ce qu'on veut.

Ne vous inquiétez pas si votre ampoule ne descend pas jusqu'à 1 500 K, l'automatisation se charge de ramener la valeur dans les limites du matériel.

L'automatisation

Elle se déclenche à l'allumage de la lampe, puis à chaque évolution du capteur. Une condition limite les corrections à une toutes les cinq minutes, ce qui évite de solliciter la lampe en permanence pour des écarts de quelques kelvins.

automation:
  - alias: nom_de_votre_lampe_color_temperature
    description: Aligne la température de couleur de la lampe sur celle du soleil
    id: 'a92e823e-f16d-4199-b821-1ccdf7fc3c13'
    mode: single
    triggers:
      # À l'allumage, pour que la lampe démarre déjà à la bonne teinte
      - trigger: state
        entity_id: light.nom_de_votre_lampe
        id: light_on
        to: 'on'
      # À chaque évolution de la température de couleur du soleil
      - trigger: state
        entity_id: sensor.sun_color_temp_kelvin
        id: sun_color_temp_kelvin
    conditions:
      - condition: or
        conditions:
          # L'allumage passe toujours, sans attendre
          - condition: trigger
            id: light_on
          # Sinon la lampe doit être allumée, et la dernière correction
          # doit remonter à plus de 5 minutes
          - condition: and
            conditions:
              - condition: state
                entity_id: light.nom_de_votre_lampe
                state: 'on'
              - condition: template
                value_template: >-
                  {{ this.attributes.last_triggered is none
                     or (now() - this.attributes.last_triggered).total_seconds() > 300 }}
    variables:
      # Bornes réellement supportées par la lampe
      max_color: '{{ state_attr("light.nom_de_votre_lampe", "max_color_temp_kelvin") | int(1500) }}'
      min_color: '{{ state_attr("light.nom_de_votre_lampe", "min_color_temp_kelvin") | int(4500) }}'
      # Valeur du capteur, ramenée dans ces bornes
      color: '{{ min(max(states("sensor.sun_color_temp_kelvin") | int(0), min_color), max_color) }}'
    actions:
      - action: light.turn_on
        target:
          entity_id: light.nom_de_votre_lampe
        data:
          color_temp_kelvin: '{{ color }}'
          # Aucune transition à l'allumage, 5 secondes pour les ajustements
          # afin qu'ils passent inaperçus
          transition: '{{ 0 if trigger.id == "light_on" else 5 }}'

Deux détails qui font la différence à l'usage. Les variables min_color et max_color lisent les limites déclarées par la lampe elle-même, ce qui rend l'automatisation transposable telle quelle d'un modèle à l'autre. Et la transition passe de 0 à 5 secondes selon le déclencheur : à l'allumage on veut la bonne teinte immédiatement, alors qu'un ajustement en cours de journée doit se faire en douceur, sans qu'on le remarque.

Conclusion

Rien de spectaculaire, mais c'est typiquement le genre d'automatisation qu'on oublie complètement une fois en place, et qui manque cruellement quand on change de pièce.

Pour l'appliquer à d'autres lampes, il suffit de dupliquer l'automatisation en changeant l'entité, le capteur restant commun à toutes.