Gestion des volets avec Home Assistant

Avant de migrer sur Home Assistant, j'utilisais Jeedom et plus particulièrement le plugin sunshutter pour gérer finement le positionnement de mes volets roulants. J'ai été déçu de ne pas trouver d'équivalent sur Home Assistant.

J'ai fait, dans un premier temps, quelques essais avec Schedy mais il ne répondait pas à mes attentes. Je me suis lancé dans l'idée de refaire un équivalant en natif sous Home Assistant. Je tenais également à remercier Philipp et Lionel pour l'aide qu'ils ont pu m'apporter.

Prérequis

  • Lire l'article en entier avant de se lancer
  • Posséder un ou plusieurs volets roulants sous Home Assistant
  • Être sur une version d'Home Assistant supérieure ou égale à 2022.5

À titre d'information, j'utilise des volets roulants contrôlés par des modules Shelly 2.5 utilisant l'intégration native Shelly sur Home Assistant.

Ce moteur de gestion des volets a été réalisé pour être le plus générique possible et hautement personnalisable. Il vous faudra l'adapter à vos propres cas d'utilisation.

Une présentation d'un cas réel d'utilisation est disponible ici : Exemple de gestion du volet roulant de ma cuisine.

Règles de gestion des volets roulants

  1. Gérer une routine pour le positionnement des volets roulants (Exemple : Si le soleil est au-dessus de l'horizon, j'ouvre le volet roulant sinon je le ferme).

  2. Gérer des conditions immédiates permettant à un volet roulant de sortir de sa routine (Exemple : Maintenir le volet à 30% d'ouverture s'il fait trop chaud).

  3. Forcer certaines conditions immédiates à être exécutés même si la gestion automatique du volet est suspendue

  4. Suspendre la gestion automatique du volet s'il sort de sa routine avec reprise au bout d'un délai de X minutes (Exemple : Si je bouge le volet manuellement, il ne doit plus se repositionner automatiquement pendant 1 heure)

  5. Gérer un positionnement précis (Exemple : Si je demande au volet de se positionner à 20% d'ouverture, il doit d'abord se fermer complètement). Sur les modules Shelly 2.5, le positionnement du volet se fait à l'aide du temps, malheureusement, suivant le point de départ, la position demandée peut être approximative.

Automatisation d'un volet

Dans la suite de l'article, l'entité du volet roulant sera cover.nom_du_volet_roulant. Cet article contient les éléments pour automatiser un seul volet. Il faudra recommencer ces étapes pour chacun de vos volets roulants.

La gestion d'un volet nécessitera, au minimum, une automatisation et 3 blueprints (pour respecter toutes les règles de gestion).

C'est parti, mon kiki… enfin presque…

Avant toute chose, nous allons devoir ajouter quelques entités indispensables pour faire fonctionner le moteur de gestion.

  1. Un input_number afin de mémoriser la position désirée du volet roulant (qui est différente de la position réelle). Cependant Home Assistant ne permet pas de forcer la répétition d'une valeur, il faut donc utiliser un nombre en dehors de la plage de positionnement du volet, comprise entre 0 et 100, afin de simuler la répétition de la position désirée. J'ai choisi d'utiliser une plage de position allant de -1 à 100%.
input_number:
  nom_du_volet_roulant_desired_position:
    name: Nom du volet roulant - Position désirée
    min: "-1"
    max: "100"
    step: "1"
    unit_of_measurement: "%"
  1. Un input_number pour indiquer la durée (s) que le volet met pour effectuer un mouvement complet d'ouverture et de fermeture qui correspondra au temps de détection avant de suspendre le volet (j'ai simplement chronométré le temps que met mon volet pour s'ouvrir et se fermer complètement).
input_number:
  nom_du_volet_roulant_detection:
    name: Durée (s) pour effectuer un mouvement complet d'ouverture ou de fermeture
    min: "5"
    max: "600"
    step: "5"
    unit_of_measurement: "s"
  1. Un input_datetime pour définir la durée (min) de suspension du volet.
input_datetime:
  nom_du_volet_roulant_duration_suspension:
    name: Durée (min) de suspension du volet roulant
    has_date: false
    has_time: true
  1. Un timer pour gérer la suspension du volet.
timer:
  nom_du_volet_roulant:
    name: Durée de suspension restant
    restore: true

Positionnement du volet

C'est l'automatisation qu'il vous appartient de personnaliser pour correspondre à votre gestion du volet. Je vous conseille dans un premier temps de noter les positions voulues suivant les conditions (Par exemple: Si le soleil est au-dessus de l'horizon, j'ouvre le volet roulant) et il est très important de bien déterminer l'ordre des conditions. À la première règle de gestion satisfaite, le positionnement se déclenchera sans vérifier les conditions suivantes.

automation:
  - description: Nom_du_volet_roulant - Positionnement
    alias: nom_du_volet_roulant_positioning
    id: f8811757-05f7-420d-8c34-379788af5b24
    mode: restart
    trigger:
      - platform: time_pattern
        minutes: "/10" # ⚠️ à modifier : durée entre chaque calcul de positionnement
      - platform: event
        event_type:
          - timer.cancelled
          - timer.finished
        event_data:
          entity_id: timer.nom_du_volet_roulant
    condition:
      - condition: state # Le volet ne doit pas être déjà en cours de suspension
        entity_id: timer.nom_du_volet_roulant # ⚠️ à modifier avec le nom de votre timer
        state: "idle"
      - condition: template # La position réelle du volet doit avoir changé depuis plus de "nom_du_volet_roulant_duration_open_close" secondes
        value_template: "{{ (as_timestamp(now()) - as_timestamp(states.cover.nom_du_volet_roulant.last_changed) | int(0)) > (states('input_number.nom_du_volet_roulant_detection') | int) }}" # ⚠️ à modifier avec le nom de vos entités
    action:
      - choose:
          [...] # ⚠️ à modifier avec vos règles de gestion

Par exemple, prenons ces 3 règles (classées dans l'ordre de priorité) :

  1. Si le soleil est sous l'horizon, je veux que le volet soit fermé (0%)
  2. Si je suis absent de la maison, je veux que le volet se positionne à 40% (voir mon article sur la gestion des présences avec HomeKit)
  3. Dans tous les autres cas, mon volet doit être ouvert à 100%

L'automatisation précédente devient :

automation:
  - description: Nom_du_volet_roulant - Positionnement
    alias: nom_du_volet_roulant_positioning
    id: f8811757-05f7-420d-8c34-379788af5b24
    mode: restart
    trigger:
      - platform: time_pattern
        minutes: "/10" # ⚠️ à modifier : durée entre chaque calcul de positionnement
      - platform: event
        event_type:
          - timer.cancelled
          - timer.finished
        event_data:
          entity_id: timer.nom_du_volet_roulant
    condition:
      - condition: state # Le volet ne doit pas être déjà en cours de suspension
        entity_id: timer.nom_du_volet_roulant # ⚠️ à modifier avec le nom de votre timer
        state: "idle"
      - condition: template # La position réelle du volet doit avoir changé depuis plus de "nom_du_volet_roulant_duration_open_close" secondes
        value_template: "{{ (as_timestamp(now()) - as_timestamp(states.cover.nom_du_volet_roulant.last_changed) | int(0)) > (states('input_number.nom_du_volet_roulant_detection') | int) }}" # ⚠️ à modifier avec le nom de vos entités
    action:
      - choose:
          - conditions: # 1. Si le soleil est sous l'horizon, je veux que le volet soit fermé (0%)
              - condition: numeric_state
                entity_id: sun.sun
                attribute: elevation
                below: 0
            sequence:
              - service: input_number.set_value
                target:
                  entity_id: input_number.cuisine_volet_roulant_planned_position
                data:
                  value: 0
          - conditions: # 2. Si je suis absent de la maison, je veux que le volet se positionne à 40%
              - condition: template
                value_template: "{{ is_state('input_boolean.presence_at_home_xxx', 'off') }}"
            sequence:
              - service: input_number.set_value
                target:
                  entity_id: input_number.cuisine_volet_roulant_planned_position
                data:
                  value: 40
        default: # 3. Dans tous les autres cas, mon volet doit être ouvert à 100%
          - service: input_number.set_value
            target:
              entity_id: input_number.nom_du_volet_roulant_planned_to_go
            data:
              value: 100

Le moteur de gestion

Maintenant que vos règles sont bien définies dans une automatisation, il faudra importer et configurer chacun des 3 blueprints suivants disponible sur mon github.

Je vous invite à être très rigoureux dans le nommage de vos automatisations car suivant le nombre de volets que vous possédez, il pourra être compliqué de les retrouver facilement !
  1. cover_immediate.yaml (cliquez ici pour l'importer sur votre Home Assistant)

Ce blueprint sert à gérer les conditions immédiates :

  • Immediate conditions : Entités correspondantes à vos conditions immédiates (exemples : état de l'alarme et/ou d'une fenêtre, la gestion des présences...)
  • Timer : Le timer qui gère la suspension du volet roulant (timer.nom_du_volet_roulant)
  • Desired roller shutter position : L'input_number qui mémorise la position désirée du volet roulant (input_number.nom_du_volet_roulant_desired_position)
  • Roller shutter positioning : L'automatisation qui correspond au positionnement du volet roulant (automation.nom_du_volet_roulant_positioning)
  1. cover_move.yaml (cliquez ici pour l'importer sur votre Home Assistant)
  • Roller shutter : Le volet roulant (cover.nom_du_volet_roulant)
  • Timer : Le timer qui gère la suspension du volet (timer.nom_du_volet_roulant)
  • Desired roller shutter position : L'input_number qui mémorise la position désirée du volet roulant (input_number.nom_du_volet_roulant_desired_position)
  • Time to complete a full opening or closing motion : L'input_number qui indique la durée que le volet met pour effectuer un mouvement complet d'ouverture et de fermeture (input_number.nom_du_volet_roulant_detection)
  • Enable accurate positioning : Activation ou non du positionnement précis (si oui, il faut remplir le champ suivant)
  • Accurate position : Un input_number qui indique la position (entre 1 et 99%) pour laquelle le volet se fermera complètement avant de se positionner
  1. cover_suspend.yaml (cliquez ici pour l'importer sur votre Home Assistant)
  • Roller shutter : Le volet roulant (cover.nom_du_volet_roulant)
  • Timer : Le timer qui gère la suspension du volet (timer.nom_du_volet_roulant)
  • Desired roller shutter position : L'input_number qui mémorise la position désirée du volet roulant (input_number.nom_du_volet_roulant_desired_position)
  • Duration of roller shutter suspension : L'input_datetime qui indique la durée de suspension du volet roulant (input_datetime.nom_du_volet_roulant_duration_suspension)
  • Time to complete a full opening or closing motion : L'input_number qui indique la durée que le volet met pour effectuer un mouvement complet d'ouverture et de fermeture (input_number.nom_du_volet_roulant_detection)
  • Check a condition before automatic positioning : Activation ou non de la vérification d'une condition avant de suspendre le volet (si oui, il faut remplir le champ suivant)
  • Condition to be checked : La condition à vérifier pour activer la suspension automatique. Si cette condition est fausse, la gestion du volet roulant ne sera jamais suspendu (la suspension automatique est désactivée)

Voilà, vos 3 blueprints sont maintenant configurés et la gestion automatique du volet est en place. Il ne vous reste plus qu'à recommencer ces étapes pour tous vos autres volets roulants.

Conclusion

C'est la base de la gestion que j'utilise pour contrôler mes sept volets roulants depuis l'année dernière. Il ne nous a jamais fait défaut et on améliore les conditions au fur et à mesure pour, par exemple, anticiper les canicules ou encore, optimiser la température de la maison en hiver.

N'hésitez pas à me poser vos questions grâce au formulaire de contact ou sur HACF.

Une présentation d'un cas réel d'utilisation est disponible ici : Exemple de gestion du volet roulant de ma cuisine. Vous avez également accès à l'ensemble des automatisations que j'utilise pour gérer mes volets roulants : Automatisations - Volets roulants