Mes enfants ont un interrupteur sur le frigo. Quand ils appuient dessus, la maison devient une discothèque le temps d’une chanson — le thème de Bluey — puis redevient une maison.

C’est le « puis redevient une maison » qui est tout le problème d’ingénierie.

N’importe qui peut faire clignoter des lumières. Le difficile, c’est de garantir qu’à la fin de la chanson le volume revient là où il était, que les enceintes repointent où elles pointaient, que la chambre des enfants retrouve son préréglage du soir, et que les automatisations qu’on avait désactivées se réactivent. Sinon la fête ne finit jamais, et à 21 h on remonte une maison à la main pendant qu’un enfant de quatre ans demande pourquoi la cuisine est mauve.


Une humeur, un moment

Ma maison distingue deux choses.

Une humeur est un état dans lequel elle se repose : Matin, Soirée, Nuit. Ça persiste, ça se transmet de pièce en pièce, c’est le rythme de la journée. J’en ai parlé ailleurs, dans Mood Controller.

Un moment est une interruption. Ça se déclenche, ça se déroule, ça se termine, et la maison retourne à l’humeur où elle était.

Les humeurs sont des noms. Les moments sont des verbes.

Il y en a huit chez moi : dance_modekeepy_uppyclubfireelement_fireunicornrainbow et rainbow_single_light. La plupart sont pour les enfants. Ce n’est pas un détail — j’y reviens à la fin.


La forme : try / finally, dans un langage qui n’a ni l’un ni l’autre

Le déclencheur tient en quelques étapes. La première chose qu’il fait est de résoudre quel moment appeler, par convention de nommage :

script_to_call: script.moment_{{ moment | lower }}

Puis, dans l’ordre :

  1. Vérifier que le moment existe avant de s’engager dans quoi que ce soit
  2. Lever input_boolean.moment — un drapeau que les autres automatisations peuvent lire
  3. Désactiver toutes les automatisations portant l’étiquette guest_mode — rien ne doit venir se battre avec le moment
  4. Couper la musique en cours
  5. Journaliser
  6. Appeler le moment
  7. Toujours appeler moment_stop

C’est la septième ligne qui est l’article.


Le démontage mérite plus de place que le démarrage

moment_stop fait six choses, et aucune n’est spectaculaire :

L’astuce que je referais partout, c’est l’étiquette. En ciblant label_id: moment plutôt qu’une liste de scripts, le démontage n’a pas besoin de savoir lequel a tourné. Il éteint tout ce qui porte l’étiquette. J’ajouterai un neuvième moment un jour, et le nettoyage fonctionnera sans que j’y touche.

Le démarrage, c’est de l’optimisme. Le démontage, c’est du respect.


Là où mon finally n’en est pas un

Il faut que je sois honnête sur la faiblesse, parce que c’est la partie la plus intéressante.

Dans moment_start, l’appel à moment_stop est simplement la dernière étape de la séquence. Ça fonctionne quand le moment se termine normalement. Ça ne fonctionne pas si le script du moment échoue : Home Assistant interrompt la séquence, et l’étape de nettoyage n’est jamais atteinte. La maison reste une discothèque.

Ce n’est pas un finally. C’est un « et ensuite » qui lui ressemble tant que rien ne casse.

Trois façons de le régler, par coût croissant :

continue_on_error: true sur l’appel. Une ligne. Ça couvre l’échec du script appelé, pas un plantage de Home Assistant lui-même. C’est bon marché et partiel.

Un chien de garde sur input_boolean.moment. Une automatisation qui surveille le drapeau et force moment_stop s’il reste levé plus de dix minutes. Ça couvre tous les cas, y compris un redémarrage en plein moment. C’est ce que je ferais en premier.

Sortir l’orchestration du YAML. Un script Python ou une application AppDaemon, où finally est un vrai mot-clé du langage. C’est la bonne réponse et c’est celle que je n’ai pas prise, parce que le reste de la maison vit en YAML et que je n’ai pas envie d’entretenir deux mondes.

J’aime mieux publier la version honnête que celle où je fais semblant que le YAML m’a donné la gestion d’exceptions.


Les moments sont pour ceux qui ne savent pas lire la doc

Voilà pourquoi les huit moments sont surtout pour les enfants.

Un enfant de quatre ans ne peut pas ouvrir l’application Home Assistant. Il ne peut pas lire le nom d’une scène. Il ne peut pas retenir qu’il faut appuyer deux secondes plutôt qu’une. Tout ce qu’il peut faire, c’est appuyer sur un bouton qui se trouve là où il passe déjà.

Alors l’interface, c’est un interrupteur physique, sur le frigo, à sa hauteur. Le moment dure le temps d’une chanson — pas d’une minuterie qu’il faudrait comprendre. Et il n’y a rien à annuler : ça s’arrête tout seul.

Concevoir pour quelqu’un sans manuel, sans vocabulaire et sans patience, c’est la contrainte d’utilisabilité la plus stricte qui existe. Il n’y a pas de « l’utilisateur finira par comprendre ». Ça marche du premier coup ou ça ne sert à rien.

Si ça marche pour lui, ça marche.


Ce que je retiens

Presque tout ce qu’on écrit sur la domotique parle de faire arriver des choses. Presque rien ne parle de les faire cesser proprement.

Pourtant la différence entre une maison qui enchante et une maison qui épuise est entièrement là. Une maison qui s’allume est facile. Une maison qui se range est un système.

Construis la sortie avant l’entrée.


Francis Fontaine est développeur et photographe à Québec. Il a passé quinze ans à photographier des gens qui ne voulaient pas être photographiés, ce qui s’avère une excellente préparation pour concevoir des interfaces destinées à des enfants de quatre ans.

Are you absolutely sure?

This action cannot be undone.