Contents
Intro
Dans cette V2026, j’ai revu mon automatisation générale des volets RTS sous Home Assistant afin de simplifier la gestion du passage jour/nuit.
L’objectif était clair :
- supprimer un booléen intermédiaire
input_boolean.nuit_jour - rendre la logique plus lisible
- améliorer le comportement après redémarrage de Home Assistant
Le résultat est un automatisme plus direct, plus simple à maintenir, tout en gardant les différents modes de fonctionnement que j’utilise au quotidien.
Vous pouvez également consulté l’article sur la mise en oeuvre du pilotage des volets Somfy RTS: https://domo.rem81.com/index.php/2024/11/01/ha-pilotage-volets-somfyr-rts/
Le besoin
Sur mon installation, les volets RTS sont pilotés selon plusieurs modes :
- Auto Ete
- Auto Hiv
- Absent
J’avais déjà une base fonctionnelle, mais elle reposait sur un helper booléen calculé par une automatisation séparée.
Cette approche marchait, mais elle ajoutait une couche intermédiaire peu utile.
J’ai donc choisi de simplifier le tout en intégrant directement la logique de transition jour/nuit dans l’automatisme principal.
Le principe retenu
La détection du jour et de la nuit ne repose pas uniquement sur sun.sun, mais également sur une mesure réelle de luminosité via un capteur BH1750.
J’utilise :
- un seuil haut pour valider le passage nuit → jour
- un seuil bas pour valider le passage jour → nuit
Cela permet de créer une hystérésis, ce qui évite les bascules parasites quand la luminosité fluctue autour d’une seule valeur.
La logique devient donc :
Passage nuit vers jour
Le passage est validé si :
- la luminosité est supérieure au seuil haut
- et que le soleil est au-dessus de l’horizon
Passage jour vers nuit
Le passage est validé si :
- la luminosité est inférieure au seuil bas
- et que le soleil est sous l’horizon
Les modes de fonctionnement
Mode Auto Hiv
En mode hiver :
- les volets s’ouvrent à une heure définie
- ils se ferment au passage jour → nuit
L’intérêt est de garder la lumière naturelle aussi longtemps que possible, sans dépendre d’une simple heure fixe de fermeture.
Mode Auto Ete
En mode été :
- ouverture sur horaire
- fermeture sur horaire
Ici, j’ai volontairement gardé un fonctionnement simple et prévisible.
Mode Absent
En mode absent :
- les volets s’ouvrent sur transition nuit → jour
- ils se ferment sur transition jour → nuit
Cela permet de simuler une présence tout en restant cohérent avec la luminosité réelle extérieure.
Pourquoi supprimer le booléen nuit_jour
Dans ma version précédente, un automatisme séparé se chargeait de calculer un booléen input_boolean.nuit_jour, ensuite exploité par l’automatisme principal.
Avec le recul, ce booléen n’apportait pas grand-chose :
- il ajoutait une automatisation de plus
- il complexifiait la lecture de la logique
- il rendait le dépannage moins direct
Dans cette V2, les transitions sont désormais gérées directement par des template triggers dans l’automatisation principale.
On gagne donc en lisibilité et en simplicité.
Gestion du redémarrage de Home Assistant
Un point important de cette V2 est la gestion du redémarrage de Home Assistant.
Sans traitement particulier, un redémarrage en pleine journée ou en pleine nuit peut laisser l’automatisme dans un état incohérent, car les transitions ne sont pas forcément rejouées spontanément.
J’ai donc ajouté un trigger :
- trigger: homeassistant
event: start
id: ha_start
Au démarrage, l’automatisme vérifie la situation courante :
- s’il fait déjà nuit, il peut lancer la fermeture adaptée
- s’il fait déjà jour, il peut lancer l’ouverture adaptée selon le mode
Ce petit ajout rend le comportement plus robuste au quotidien.
Le code YAML
Voici la version complète de l’automatisme :
alias: Volet Automatisme Général RTS V2
description: >-
Ete -> ouvre et ferme sur horaire Hiver -> ouvre sur horaire et ferme sur
transition jour/nuit Absent -> ouvre et ferme sur transitions jour/nuit
triggers:
- trigger: homeassistant
event: start
id: ha_start
- trigger: template
id: jour_vers_nuit
value_template: |-
{{ states('sensor.bh1750_illuminance') | float(0)
< states('input_number.luminosite_seuil_bas') | float(0)
and is_state('sun.sun', 'below_horizon') }}
- trigger: template
id: nuit_vers_jour
value_template: |-
{{ states('sensor.bh1750_illuminance') | float(0)
> states('input_number.luminosite_seuil_haut') | float(0)
and is_state('sun.sun', 'above_horizon') }}
- trigger: time
at: input_datetime.horaire_ete_volet_ouv
id: heure_ouv_ete
- trigger: time
at: input_datetime.horaire_ete_volet_ferm
id: heure_ferm_ete
- trigger: time
at: input_datetime.horaire_hiver_volet_ouv
id: ouv_hiv
actions:
- variables:
lux: "{{ states('sensor.bh1750_illuminance') | float(0) }}"
seuil_haut: "{{ states('input_number.luminosite_seuil_haut') | float(0) }}"
seuil_bas: "{{ states('input_number.luminosite_seuil_bas') | float(0) }}"
is_day_now: "{{ lux > seuil_haut and is_state('sun.sun', 'above_horizon') }}"
is_night_now: "{{ lux < seuil_bas and is_state('sun.sun', 'below_horizon') }}"
mode_volets: "{{ states('input_select.volets') }}"
- choose:
- conditions:
- condition: state
entity_id: input_select.volets
state: Auto Hiv
- condition: trigger
id: jour_vers_nuit
sequence:
- action: script.1706464871250
- conditions:
- condition: state
entity_id: input_select.volets
state: Auto Hiv
- condition: trigger
id: ouv_hiv
sequence:
- action: script.0_0_1_ouverture_volets_rts
- conditions:
- condition: state
entity_id: input_select.volets
state: Auto Hiv
- condition: trigger
id: ha_start
- condition: template
value_template: "{{ is_night_now }}"
sequence:
- action: script.1706464871250
- conditions:
- condition: state
entity_id: input_select.volets
state: Auto Ete
- condition: trigger
id: heure_ouv_ete
sequence:
- action: script.0_0_1_ouverture_volets_rts
- conditions:
- condition: state
entity_id: input_select.volets
state: Auto Ete
- condition: trigger
id: heure_ferm_ete
sequence:
- action: script.1706464871250
- conditions:
- condition: state
entity_id: input_select.volets
state: Absent
- condition: trigger
id: jour_vers_nuit
sequence:
- action: script.0_1_0_fermeture_volets_mode_absent_rts
- conditions:
- condition: state
entity_id: input_select.volets
state: Absent
- condition: trigger
id: nuit_vers_jour
sequence:
- action: script.0_1_1_ouverture_volets_mode_absent_rts
- conditions:
- condition: state
entity_id: input_select.volets
state: Absent
- condition: trigger
id: ha_start
- condition: template
value_template: "{{ is_day_now }}"
sequence:
- action: script.0_1_1_ouverture_volets_mode_absent_rts
- conditions:
- condition: state
entity_id: input_select.volets
state: Absent
- condition: trigger
id: ha_start
- condition: template
value_template: "{{ is_night_now }}"
sequence:
- action: script.0_1_0_fermeture_volets_mode_absent_rts
default: []
mode: single
Les entités utilisées
Cette automatisation s’appuie sur les entités suivantes :
Capteurs
sensor.bh1750_illuminancesun.sun
Helpers
input_number.luminosite_seuil_hautinput_number.luminosite_seuil_basinput_datetime.horaire_ete_volet_ouvinput_datetime.horaire_ete_volet_ferminput_datetime.horaire_hiver_volet_ouvinput_select.volets
Scripts
script.0_0_1_ouverture_volets_rtsscript.1706464871250script.0_1_0_fermeture_volets_mode_absent_rtsscript.0_1_1_ouverture_volets_mode_absent_rts
Dans mon installation, j’ai gardé les actions réelles dans des scripts séparés, ce qui permet de centraliser facilement les commandes envoyées aux volets RTS.
Tableau HA:
J’ai ajouté ce « markdown » me permettant de suivre l’automatisme:
type: grid
cards:
- type: markdown
content: |2-
{% set mode = states('input_select.volets') %}
{% set lux = states('sensor.bh1750_illuminance') | float(0) %}
{% set seuil_haut = states('input_number.luminosite_seuil_haut') | float(0) %}
{% set seuil_bas = states('input_number.luminosite_seuil_bas') | float(0) %}
{% set sun_state = states('sun.sun') %}
{% set cond_nuit_vers_jour = lux > seuil_haut and sun_state == 'above_horizon' %}
{% set cond_jour_vers_nuit = lux < seuil_bas and sun_state == 'below_horizon' %}
{% if cond_nuit_vers_jour %}
{% set etat = 'JOUR' %}
{% set raison = 'Lux > seuil haut et soleil au-dessus de l’horizon' %}
{% elif cond_jour_vers_nuit %}
{% set etat = 'NUIT' %}
{% set raison = 'Lux < seuil bas et soleil sous l’horizon' %}
{% else %}
{% set etat = 'INTERMÉDIAIRE' %}
{% set raison = 'Aucune transition validée' %}
{% endif %}
{% if mode == 'Auto Hiv' and cond_jour_vers_nuit %}
{% set action = 'Fermeture volets (mode hiver)' %}
{% elif mode == 'Auto Hiv' %}
{% set action = 'Attente horaire ouverture hiver ou transition nuit' %}
{% elif mode == 'Auto Ete' %}
{% set action = 'Pilotage uniquement sur horaires été' %}
{% elif mode == 'Absent' and cond_nuit_vers_jour %}
{% set action = 'Ouverture volets mode absent' %}
{% elif mode == 'Absent' and cond_jour_vers_nuit %}
{% set action = 'Fermeture volets mode absent' %}
{% elif mode == 'Absent' %}
{% set action = 'Attente prochaine transition jour/nuit' %}
{% else %}
{% set action = 'Aucune action automatique' %}
{% endif %}
## Volets RTS – État général
**Mode :** {{ mode }}
**État calculé :** **{{ etat }}**
**Raison :** {{ raison }}
**Luminosité :** {{ lux | round(0) }} lx
**Seuil haut :** {{ seuil_haut | round(0) }} lx
**Seuil bas :** {{ seuil_bas | round(0) }} lx
**Soleil :** {{ sun_state }}
**Transition nuit → jour :**
{% if cond_nuit_vers_jour %}✅ vraie{% else %}❌ fausse{% endif %}
**Transition jour → nuit :**
{% if cond_jour_vers_nuit %}✅ vraie{% else %}❌ fausse{% endif %}
**Action attendue :** {{ action }}
text_only: true
Ce que j’aime dans cette V2
Cette nouvelle version présente plusieurs avantages :
- une logique plus directe
- moins d’entités intermédiaires
- un code plus simple à lire
- une meilleure robustesse au redémarrage
- une hystérésis conservée grâce aux seuils haut et bas
C’est une évolution discrète, mais très utile au quotidien.
Pistes d’amélioration
Comme toujours avec Home Assistant, cette version peut encore évoluer.
Quelques idées pour la suite :
- afficher explicitement l’état calculé : jour, nuit ou intermédiaire
- temporiser davantage la transition selon la stabilité de la luminosité
- croiser la logique avec d’autres capteurs météo ou de présence
Conclusion
Avec cette V2, j’ai simplifié mon automatisation générale des volets RTS tout en la rendant plus robuste.
La suppression du booléen nuit_jour allège la configuration et rend l’ensemble plus logique.
La détection directe des transitions via la luminosité et l’état du soleil reste simple, efficace et parfaitement adaptée à mon besoin.
C’est typiquement le genre d’évolution qui ne révolutionne pas l’usage, mais qui améliore nettement la maintenance et la compréhension du système.
