Home Assistant : Automatisation générale des volets RTS V2026

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_illuminance
  • sun.sun

Helpers

  • input_number.luminosite_seuil_haut
  • input_number.luminosite_seuil_bas
  • input_datetime.horaire_ete_volet_ouv
  • input_datetime.horaire_ete_volet_ferm
  • input_datetime.horaire_hiver_volet_ouv
  • input_select.volets

Scripts

  • script.0_0_1_ouverture_volets_rts
  • script.1706464871250
  • script.0_1_0_fermeture_volets_mode_absent_rts
  • script.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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *