Photo by Dan Gold / Unsplash

Mise en place d'une gestion des états de la maison

Home assistant 18 nov. 2024

L'essence même de la domotique est de rendre sa maison "intelligente". Autrement dit, qu'elle soit capable d'agir en fonction du contexte et des événements. Par exemple : baisser le chauffage quand personne n'est à la maison, allumer la lumière extérieure quand quelqu'un arrive et qu'il fait noir, ...

La gestion des automatisations de Home Assistant permet cela facilement mais on peut se rendre compte que l'on recopie très souvent les déclencheurs (si on sépare les différentes automatisations) ou que l'on se retrouve avec des automatisations de plus en plus complexes.

Identifier des modes adaptés à vos besoins

La première étape, bien que logique, est certainement sous estimée mais il est primordial et essentiel de vous poser la question. En fonction de la composition de votre foyer, de vos habitudes de vie, de vos contraintes personnelles et professionnelles, vos besoins seront différents.

Voici quelques exemples / inspirations :

Mode Description
Jour - présence Il fait jour et quelqu'un est à la maison
Jour - absence Il fait jour et personne n'est à la maison
Nuit - présence Il fait nuit et quelqu'un est à la maison
Nuit - absence Il fait nuit et personne n'est à la maison
Vacances Tout le monde est partie en vacances
Télétravail Quelqu'un est présent mais en télétravail (on peut imaginer n'avoir à chauffer qu'une seule pièce)
Femme de ménage Tout le monde est absent mais la femme de ménage est présente (on peut imaginer devoir couper l'alarme)
Enfants Seuls les enfants sont à la maison
... ...

Vous l'avez compris, les possibilités sont infinies, il faut "juste" identifier quel mode peut répondre à un ou plusieurs de vos besoins.

💡
Un conseil : commencez simple ! Si votre gestion de modes de la maison est une usine à gaz, elle vous desservira plus qu'elle apportera de la valeur.

Rendons les choses concrètes : focus sur mon implémentation

Pour la suite de l'article, je vous propose de rendre les choses concrètes en nous basant sur mes choix, mon implémentation. J'essaierai tant que possible d'expliquer pourquoi j'ai fait ces choix et, le cas échéant, indiquer ce que j'aurais pu/du faire différemment.

Pré-requis et informations sur mon instance Home Assistant

Avant d'entrer dans le vif du sujet, faisons le point sur les pré-requis qui nous permettront d'aller plus loin et que je ne re-préciserai plus.

1. Déclarer les personnes du foyer

Chaque personne de votre foyer doit exister dans Home Assistant. Pour cela, rendez-vous dans Paramètres > Personnes. Et déclarez les personnes qui composent votre foyer. Vous aurez une entité du domaine "Person" par personne déclarée (person.xxx_xxx). J'ai choisi de créer des utilisateurs rattachés à ces personnes, mais cela n'est pas obligatoire.

Il est important de sélectionner les "appareils appartenant à cette personne". Cela permettra à Home Assistant de savoir qui est à la maison ou non. Je ne rentrerai pas ici dans le détail, libre à vous de choisir une géolocalisation basée sur l'application ou sur un capteur wifi.

2. Créer un groupe de personnes

Plutôt que de gérer dans nos automatisations la présence des différentes personnes du foyer, il est plus simple de déléguer ceci via la gestion d'un groupe.

La gestion des groupes a évolué dans Home Assistant et il n'est actuellement pas possible de créer un groupe pour le domaine Person via les paramètres. Il vous faudra passer par la mise à jour du fichier configuration.yaml pour y ajouter l'instruction ad hoc comme indiqué dans la documentation officielle.

Mon groupe se nomme group.home. Il a la valeur home lorsqu'au moins une personne est à la maison et not_home si tout le monde est absent.

J'ai basé mon système sur un groupe de personnes pour gérer la présence / absence des membre du foyer mais il est également possible (et semble-t-il plus standard depuis les dernières mises à jour), de se baser sur le sensor zone.home. Sa valeur 0 indiquera que personne n'est à la maison.

3. Créer 2 entrées utilisateur input_datetime de type heure

Les heures de début et de fin de journée peuvent être indiquées "en dur" dans nos automatisations mais cela implique de devoir les mettre à jour potentiellement à plusieurs endroits si on souhaite les ajuster.

J'ai donc choisi de créer deux entrées, l'une pour l'heure de début de la journée et l'autre pour l'heure de fin de la journée. Respectivement, ces champs sont nommés input_datetime.day_begin et input_datetime.day_end. Il est important de préciser que l'on ne souhaite renseigner que l'heure.

Déclaration de l'entrée utilisateur pour le début de la journée
A l'époque de la mise en place de cette mécanique, les schedule n'existaient pas encore. Il peut être intéressant de passer sur cette solution si, par exemple, les heures de début et de fin de journée doivent être différentes selon les jours de la semaine. On remplacerait alors les deux input_datetime par un seul input_schedule permettant d'indiquer si c'est le jour ou non (et donc la nuit).

5 modes pour couvrir tous mes besoins

ℹ️
Il est plus facile de nommer les modes en anglais. Les mots n'ont aucun accent et c'est souvent plus facile d'être concis. C'est le choix que j'ai fait, comme pour tous mes identifiants d'appareil / entité / script / automatisation / ... dans Home Assistant.

A titre personnel et depuis que j'ai mis ce système en place (il y a bien des années maintenant), je suis parti sur un modèle simple, basé sur 5 modes :

Mode Description
Home Il fait jour et quelqu'un est à la maison
Away Personne n'est à la maison
Night Il fait nuit et quelqu'un est à la maison
Hollidays Nous sommes absents pour une longue durée (plus de 24h)
Guests Nous avons des invités à la maison
💡
Vous remarquerez que j'ai fait le choix de ne pas faire la distinction entre le fait qu'il fasse nuit ou jour lorsque nous sommes absents. En fait, qu'il fasse nuit ou jour lorsque nous sommes accent ne change rien dans le comportement de notre maison.

Dans le détail, voici ce que je souhaite pour chacun des modes.

HOME : Quelqu'un est à la maison et il fait jour

Lorsque la maison passe en mode HOME, je souhaite que les caméras extérieures soient désactivées.

J'ai également une automatisation permettant de rétablir la température de consigne du chauffage mais que je n'aborderai pas ici.

AWAY : Personne n'est à la maison

Lorsque la maison passe en mode AWAY, je souhaite que la porte d'entrée se verrouille et que les caméras extérieures soient activées.

J'ai également une automatisation permettant de baisser la température de consigne du chauffage mais que je n'aborderai pas ici.

NIGHT : Quelqu'un est à la maison et il fait jour

Lorsque la maison passe en mode NIGHT, je souhaite que les caméras extérieures soient activées.

J'ai également une automatisation permettant de baisser la température de consigne du chauffage mais que je n'aborderai pas ici.

HOLLIDAYS : Absence prolongée

Lorsque la maison passe en mode HOLLIDAYS, je souhaite que les caméras extérieures soient activées et qu'il y ait une simulation de présence.

J'ai également une automatisation permettant de baisser la température de consigne du chauffage mais que je n'aborderai pas ici.

GUESTS : Des invités sont à la maison

Lorsque la maison passe en mode GUESTS, je souhaite que le robot tondeuse soit désactivé, que les volets de la terrasse ne se ferment pas lorsqu'il fait noir et que la consigne de chauffage ne soit pas diminuée.

On pourrait également imaginer vouloir lancer automatiquement une playlist de musique dans les enceintes de la maison.

Les mains dans le cambouis : enfin un peu de technique et de configuration

Ca y est, maintenant que le décor est planté, place à l'action. Je sais ce que je veux, ne reste plus qu'à voir comment intégrer tout cela.

💡
Mon leitmotiv : rendre les choses génériques et simples à mettre à jour. Je suis parti sur 5 modes mais rien de me garantit que cela ne changera pas dans le temps.
L'implémentation que j'ai mise en place et que je propose ici n'est certainement pas la plus directe ni la plus simple mais est, je pense, celle qui est la plus flexible et qui me permettra de la faire évoluer simplement.

Liste des modes de la maison

Pour avoir une liste de modes qui ne soit pas figée et que je puisse mettre à jour facilement, j'ai créé un simple input_select avec 5 valeurs :
- home
- away
- night
- holliday
- guest

Comme c'est original !

ℹ️
Notez que les valeurs sont en minuscules (et toujours en anglais). Cela a son importance.
Par convention, j'ai choisi de mettre les valeurs au singulier.

Un mode = Un script

Une fois cette liste créée et configurée comme il se doit, j'ai créé un script par mode. Le nom de ces scripts aura toute son importance pour la suite. Le modèle est le suivant : mode_{mode}. {mode} étant le mode que je souhaite gérer (par exemple mode_home).

Cet exercice est possible via les paramètres de Home Assistant dans Paramètres > Automatisations et scènes > Scripts mais cela ne permet pas de faire appel aux secrets. L'activation et désactivation de mes caméras requièrent un code que je ne souhaite pas enregistrer en clair (ce qui est le cas lorsque l'on crée le script depuis l'interface). J'ai donc créé ces scripts dans un fichier YAML qui est importé depuis configuration.yaml.

# Extrait du fichier configuration.yaml
script: !include_dir_merge_named includes/scripts

Import de tous les fichiers du répertoire includes/scripts en tant que script

mode_home:
  description: Activation du mode A la maison
  mode: single
  sequence:
    # Disable Arlo cameras
    - action: alarm_control_panel.alarm_disarm
      entity_id: alarm_control_panel.aarlo_station_arlo
      data:
        code: !secret alarm_code

mode_away:
  description: Activation du mode absent
  mode: single
  sequence:
    # Enable Arlo cameras
    - action: alarm_control_panel.alarm_arm_away
      entity_id: alarm_control_panel.aarlo_station_arlo
      data:
        code: !secret alarm_code
        
    # Lock the door
    - action: lock.lock
      data: {}
      target:
        entity_id: lock.nuki

mode_night:
  description: Activation du mode nuit
  mode: single
  sequence:
    # Enable Arlo cameras
    - action: alarm_control_panel.alarm_arm_away
      entity_id: alarm_control_panel.aarlo_station_arlo
      data:
        code: !secret alarm_code

mode_holliday:
  description: Activation du mode vacances
  mode: single
  sequence:
    # Enable Arlo cameras
    - action: alarm_control_panel.alarm_arm_away
      entity_id: alarm_control_panel.aarlo_station_arlo
      data:
        code: !secret alarm_code

mode_guest:
  description: Activation du mode Invités
  mode: single
  sequence:
    # Disable Arlo cameras
    - action: alarm_control_panel.alarm_disarm
      entity_id: alarm_control_panel.aarlo_station_arlo
      data:
        code: !secret alarm_code

Extrait du fichier includes/scripts/house_mode.yaml

🏃
A vous de jouer ! Créez vos scripts, intégrez les actions que vous souhaitez voir lancées. Le seul point d'attention est le nom de votre script. Pour le reste : quartier libre !

Exécution automatique du script en fonction du mode sélectionné

Nous avons la liste des modes de la maison ainsi que les actions associées, il ne nous reste donc plus qu'à orchestrer tout cela. C'est maintenant que vous allez comprendre l'importance du naming de nos entrées de la liste ainsi que le nom de nos scripts.

Dans Paramètres > Automatisations et scènes, créons une nouvelle automatisation dont voici le contenu :

alias: House mode has been updated
description: ""
triggers:
  - entity_id: input_select.house_mode
    trigger: state
actions:
  - action: script.mode_{{ states('input_select.house_mode') }}

Automatisation permettant d'exécuter le script associé à la valeur de mode sélectionnée

La valeur du mode sélectionné est directement récupérée pour lancer le script répondant au pattern que nous avons défini précédemment. De cette manière, une seule automatisation permet de lancer le bon script. Si je souhaite ajouter un mode à la maison, je n'ai qu'à ajouter une entrée dans ma liste et créer le script associé.

Il est désormais possible de changer le mode de la maison, depuis votre dashboard par exemple et la maison réagit en conséquence.

Changement automatique du mode de la maison

Je vous vois venir au fond :

OK, c'est cool de pouvoir changer le mode mais si ma maison est "intelligente" pourquoi ce serait à moi de lui dire quand changer de mode ?

Vous avez raison. D'autant que vous avez fait l'effort, en début d'article, de suivre - à la lettre - les pré-requis.

Alors, concrètement, voyons comment faire. Rendez-vous dans les automatisations de Home Assistant (oui, dans Paramètres > Automatisations et Scènes). Prenons le temps de créer 4 automatisations : passage automatique en mode absent, passage automatique en mode jour, passage automatique en mode nuit, passage automatique en mode vacances.

💡
Le passage au mode GUEST est manuel. Je n'ai personnellement pas besoin de l'automatiser, il est pour moi une exception.
Liste des automatisations

Cette étape peut entièrement être configurée depuis l'interface d'administration de Home assistant. Je vous donne en exemple la valeur yaml pour simplifier le partage.

Le passage automatique en mode ABSENT est le plus simple à mettre en oeuvre.

alias: Automatically switch to AWAY mode
triggers:
  - entity_id: group.home
    to: not_home
    trigger: state
actions:
  - entity_id: input_select.house_mode
    data:
      option: away
    action: input_select.select_option

Automatisation : passage automatique en mode ABSENT (away)

En fonction des déclencheurs (ici : plus personne n'est à la maison), il nous suffit de modifier la valeur sélectionnée de la liste déroulante. L'automatisation House mode has been updated fera le reste en lançant le script associé à cette nouvelle valeur.

Le passage automatique en mode A LA MAISON ou NUIT est plus complexe car nous devons prendre en compte à la fois le fait de rentrer à la maison mais aussi l'heure à laquelle nous rentrons. En effet, si je rentre à 13h, il est logique de passer en mode HOME alors que si je rentre à 22h, je passe en mode NIGHT.

alias: Automatically switch to HOME mode
triggers:
  - entity_id: group.home
    to: home
    trigger: state
  - value_template: "{{ states('sensor.time') == states('input_datetime.day_begin')[0:5] }}"
    trigger: template
conditions:
  - condition: state
    entity_id: group.home
    state: home
  - condition: template
    value_template: >-
      {{ strptime(states('sensor.time'), '%H:%M') <
      strptime(states('input_datetime.day_end'), '%H:%M:00')}}
  - condition: template
    value_template: >-
      {{ strptime(states('sensor.time'), '%H:%M') >=
      strptime(states('input_datetime.day_begin'), '%H:%M:00')}}
actions:
  - entity_id: input_select.house_mode
    data:
      option: home
    action: input_select.select_option

Automatisation : passage automatique en mode A LA MAISON (home)

alias: Automatically switch to NIGHT mode
triggers:
  - entity_id: group.home
    to: home
    trigger: state
  - value_template: "{{ states('sensor.time') == states('input_datetime.day_end')[0:5] }}"
    trigger: template
conditions:
  - condition: state
    entity_id: group.home
    state: home
  - condition: or
    conditions:
      - condition: template
        value_template: >-
          {{ strptime(states('sensor.time'), '%H:%M') >=
          strptime(states('input_datetime.day_end'), '%H:%M:00')}}
      - condition: template
        value_template: >-
          {{ strptime(states('sensor.time'), '%H:%M') <
          strptime(states('input_datetime.day_begin'), '%H:%M:00')}}
actions:
  - entity_id: input_select.house_mode
    data:
      option: night
    action: input_select.select_option

Automatisation : passage automatique en mode NUIT (night)

Prenons un peu de temps pour comprendre ces automatisations.

En premier lieu, les déclencheurs (triggers). Dans les deux cas, nous avons 2 déclencheurs. Le premier étant tout simplement un retour à la maison (group.home devient home). Le second déclenche l'automatisation respectivement lorsque l'heure courante est égale à l'heure configurée (cf pré-requis).

Ici, nous avons besoin de configurer en sus des conditions. En effet, sans ces conditions, dès lors que nous rentrons à la maison, les deux automatisations seront déclenchées (puisque group.home devient home est un déclencheur des 2 automatisations). Il nous faut donc tester l'heure à laquelle cela se déclenche :

Si day_begin <= heure_courante < day_end Alors
  Passage en mode jour
Fin Si

Les fonctions strptime() permettent de convertir des valeurs au format HH:mm en un format numérique qu'il est alors possible de comparer.

Pour considérer que nous passons en mode jour, il nous faut mettre en place la condition suivante :

group_home = home ET heure_courante est entre day_begin (inclus) et day_end (exclus)

La condition pour passer en mode nuit est l'inverse. La condition à mettre en place est alors la suivante :

group_home = home ET heure_courante n'est est pas entre day_begin (inclus) et day_end (exclus)

Ces conditions sont simples bien qu'elles puissent paraître compliquées de prime abord à la lecture du yaml des automatisations.

Il ne nous reste plus que le passage automatique au mode HOLLIDAY à implémenter. Celui se base sur un calendrier partagé avec ma compagne sur google calendar. Ce calendrier est intégré à Home Assistant et j'y crée un événement lorsque nous sommes en vacances / week-end. L'automatisation est très simple, basée sur le fait qu'un événement est en cours dans ledit calendrier :

alias: Automatically switch to HOLLIDAY mode
triggers:
  - entity_id: calendar.vacances
    to: "on"
    trigger: state
actions:
  - entity_id: input_select.house_mode
    data:
      option: holliday
    action: input_select.select_option

Automatisation : passage automatique en mode VACANCES (holliday)

Un trou dans la raquette à réparer

En l'état, il nous reste un problème à couvrir. Vous l'avez vu ? Que se passe-t-il si mon événement "vacances" commence avant que je ne sois parti ?

Le mode holliday doit effectivement bloquer le passage automatique des modes home, night et away. Sans cela, la maison va passer en mode holliday dès le début de l'événement et quand je vais partir de chez moi, elle passera en mode away.

Cette mécanique est la même quand je passe en mode guest. En fait, dans ces 2 cas, je veux que le changement de mode soit désactivé. J'ai choisi de gérer cela directement dans mes scripts en activant et désactivant les automatisations à bon escient.

Il suffit alors d'ajouter une action supplémentaire pour désactiver les automatisations dans les scripts mode_holliday et mode_guest

    # Disable autoswitch modes
    - action: automation.turn_off
      entity_id:
        - automation.mode_autoswitch_home
        - automation.mode_autoswitch_away
        - automation.mode_autoswitch_night

Désactivation des automatisations

Et cette action permettant de réactiver les automatisations dans les scripts mode_home, mode_away, mode_night.

    # Enable autoswitch modes
    - action: automation.turn_on
      entity_id:
        - automation.mode_autoswitch_home
        - automation.mode_autoswitch_away
        - automation.mode_autoswitch_night

Activation des automatisations

C'est fait, votre système est en place. Il est temps de l'éprouver, de le faire évoluer en fonction de vous et de vos besoins.

Ne pas hésiter à sortir du cadre

Le système créé est flexible et permet de s'adapter à tous vos besoins. Par contre, je suis convaincu qu'il est important de le garder simple. Il ne faut donc pas vous interdire de sortir du cadre et de créer des exceptions.

J'ai moi-même fait des exceptions. En voici quelques exemples et pourquoi je les ai gérés différemment.

1. Fermeture / ouverture des volets

Il semblerait logique d'ouvrir les volets au passage au mode jour et de les fermer au passage en mode nuit. J'ai fait le choix d'avoir des horaires fixes pour le passage en mode jour et en mode nuit (cf pré-requis).

J'ai un détecteur de mouvement à l'entrée de ma maison qui intègre un capteur de luminosité. Je suis donc en mesure de gérer l'ouverture et la fermeture de mes volets en fonction de la luminosité extérieure. Cela est bien plus pratique et adapté.

2. Gestion de l'alarme

Mon alarme est gérée grâce à l'intégration Alarmo (HACS). J'ai des cas d'usage très spécifiques pour l'activation / désactivation de l'alarme, en fonction du fait que l'aspirateur passe pendant mon absence ou que la femme de ménage est présente.

Cette gestion a donc été complètement déportée de ma gestion des modes. J'ai d'ailleurs fait un article dédié que vous pouvez retrouver ici : Comment créer une alarme puissante grâce à Alarmo ?

Mots clés

Teddy HENNART

Passionné par les nouvelles technologies et fervent utilisateur de Home Assistant depuis de nombreuses années après avoir été un utilisateur de Domoticz et avoir essayé Jeedom.