Mise en place d'une gestion des états de la maison
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.
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.
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.
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
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 |
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.
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 !
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
.
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 :
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é.
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.
GUEST
est manuel. Je n'ai personnellement pas besoin de l'automatiser, il est pour moi une exception.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.
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
.
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
ETheure_courante
est entreday_begin
(inclus) etday_end
(exclus)
La condition pour passer en mode nuit est l'inverse. La condition à mettre en place est alors la suivante :
group_home
=home
ETheure_courante
n'est est pas entreday_begin
(inclus) etday_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 :
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
Et cette action permettant de réactiver les automatisations dans les scripts mode_home
, mode_away
, mode_night
.
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 ?