Reproduire la lumière naturelle sous Home Assistant
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.
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) }}
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.