Automatiser ses volets roulants avec Home Assistant
Un moteur générique pour piloter ses volets roulants sous Home Assistant : routine de positionnement, conditions immédiates et suspension automatique.
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 donc lancé dans la réalisation d'un équivalent natif sous Home Assistant. Je tenais à remercier Philipp et Lionel pour l'aide qu'ils ont pu m'apporter.
⚠️ Cet article a été publié initialement en 2022 et la syntaxe des exemples a vieilli. Avec la version 2024.8 de Home Assistant, service est devenu action dans les automatisations, et la 2024.10 a introduit les formes plurielles triggers, conditions et actions. L'ancienne syntaxe fonctionne toujours pour le moment.
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 de 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 via l'intégration native Shelly de 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 concret : automatiser le volet roulant de ma cuisine.
Règles de gestion des volets roulants
-
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).
-
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).
-
Forcer certaines conditions immédiates à être exécutées même si la gestion automatique du volet est suspendue.
-
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).
-
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 repose sur une durée : suivant le point de départ, la position obtenue peut donc ê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 au fonctionnement du moteur de gestion.
- Un input_number afin de mémoriser la position désirée du volet roulant, qui est différente de sa position réelle. Home Assistant ne permet pas de forcer la répétition d'une valeur : il faut donc pouvoir sortir de la plage de positionnement du volet, comprise entre 0 et 100, pour simuler cette répétition. J'ai choisi une plage 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: "%"
- Un input_number pour indiquer la durée (s) que le volet met pour effectuer un mouvement complet d'ouverture et de fermeture. C'est cette durée qui servira de 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 et de fermeture
min: "5"
max: "600"
step: "5"
unit_of_measurement: "s"
- 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
- Un timer pour gérer la suspension du volet.
timer:
nom_du_volet_roulant:
name: Durée de suspension restante
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 selon les conditions (par exemple : si le soleil est au-dessus de l'horizon, j'ouvre le volet roulant). 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éclenche 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_detection" 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(0)) }}" # ⚠️ à 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 par ordre de priorité :
- Si le soleil est sous l'horizon, je veux que le volet soit fermé (0 %)
- 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)
- 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_detection" 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(0)) }}" # ⚠️ à 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.nom_du_volet_roulant_desired_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.nom_du_volet_roulant_desired_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_desired_position
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, disponibles 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 !
- 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 correspondant à 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)
- 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 %) en dessous de laquelle le volet se fermera complètement avant de se positionner
- 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 suspendue
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. Elle ne nous a jamais fait défaut et nous améliorons les conditions au fur et à mesure pour, par exemple, anticiper les canicules ou 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 concret : automatiser le 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