Home Assistant : Routine le matin avant l’école

Grâce à l’utilisation des événements créés, je pouvais diffuser des messages le matin pour rythmer l’activité de mes enfants pour ne pas être en retard pour l’école. Nous nous réveillons à la même heure, prenons notre petit déjeuner ensemble. Parfois, on pouvait laisser le temps s’écouler tranquillement et ainsi être en retard. De ce fait, cette routine était la bienvenue.

Avant Home Assistant

Comme indiqué dans le second article de la série « Home Assistant, ma domotique open source », j’utilisais les événements dans un calendrier Google Agenda pour lancer des messages. J’utilisais le même principe pour la routine des enfants le matin pour leur autonomie. Ils aiment se préparer sans avoir leurs parents sur le dos. 😊 Je ne les blâmerais pas sur le sujet. Ils ont appris à être autonome très rapidement.

Configuration

Pour la configuration, là encore, tout est expliqué dans mon second article. Nous utilisons :

  • Google Agenda
  • Les Google Home Mini
  • Google Translate TTS
  • Les automations HA
  • Les scripts HA

Disclaimer

Pour des raisons de « vie privée », je donnerai un exemple de planning commun à un ensemble de parents et d’enfants. Le but n’est pas dire si oui ou non mes enfants ou les enfants en général ont CE programme. L’exemple pourrait très bien être un programme pour un adulte. Ce n’est qu’un scénario de mise en place d’automatisation.

Le principe de fonctionnement

En période scolaire, nos enfants se réveillent à 7h. Puis vont prendre leur petit-déjeuner.
À 7h30, ils doivent aller se préparer dans la salle de bain.
À 7h45, un petit rappel est lancé au cas où ce matin on aurait du mal.
À 8h00, c’est bientôt l’heure d’aller à l’école. Donc, on doit avoir fait les dernières tâches de la matinée.
À 8h10, il est temps de mettre ses chaussures.
À 8h15, on prend son sac à dos et on part à l’école.

Le déroulé est très simple comme vous pouvez le voir. Nous avons le principe suivant :

  • Nous sommes un jour d’école primaire
  • Nous ne sommes pas en période de vacances
  • Nous sommes à une heure précise de la matinée.

Nous avons tous nos critères pour exécuter la routine.

Les capteurs (sensors)

Nous allons créer à minima 2 capteurs :

  • Période scolaire : déterminer si nous sommes en vacances ou pas ;
  • Jour d’école primaire : dans notre académie, les enfants ont écoles le lundi, mardi, jeudi et vendredi.

Capteurs « Période scolaire »

Pour ce capteur, nous utiliserons 2 calendriers :

Vous pouvez ajouter très facilement des calendriers au format ics dans Google Agenda. Ce qui permettra à notre intégration HA de les retrouver. Cf. https://www.home-assistant.io/integrations/calendar.google/
Le calendrier des jours fériés en France sera nommé dans le présent article calendar.jours_feries_en_france. Et le calendrier des vacances scolaires calendar.calendrier_scolaire_zone_c.
Pour le calendrier de « vacances scolaires complémentaires », il suffira de créer au besoin un événement sur une journée entière (donc sans horaire) pour indication.

Dans notre fichier configuration.yaml, je dois indiquer où trouver mes sensors. Je choisis, comme pour les automatisations d’avoir tous mes sensors dans un répertoire :

Cela fait, je crée un fichier periode_scolaire.yaml dans le répertoire sensors/

Ce capteur vérifie si les 2 calendriers ont la valeur off pour savoir à quelle période je me trouve. La valeur off pour ces calendriers signifient qu’il n’y a pas d’événements dans la journée. Donc, pas de vacances, pas de jours fériés, pas de pont du weekend, etc.
Nous serons bien en période scolaire.

Capteurs « jours d’école primaire »

Pour ce capteur ci, nous allons simplement indiquer que nous sommes l’un de ces jours :

  • Lundi
  • Mardi
  • Jeudi
  • Vendredi

Le mercredi, l’école primaire n’a pas classe le mercredi dans notre région.
Pour les enfants au collège, on pourrait tout simplement utiliser l’intégration de « workday ». https://www.home-assistant.io/integrations/workday/

Même principe que précédemment, nous créons un fichier jour_ecole_primaire.yaml dans le répertoire sensors/ :

Nous utilisons les fonctions now() et weekeday() qui retourneront, combinées, un chiffre correspondant au numéro de la semaine (Lundi -> 0, mardi -> 1, mercredi -> 2, jeudi -> 3, vendredi -> 4, samedi -> 5 et dimanche -> 6).
On pourrait écrire ce template de façon plus condensée. Mais j’ai voulu privilégier la lisibilité dans le présent article.

L’automatisation

Nous pourrions créer une automatisation par heure de déclenchement… Ça se fait… Mais plus nous avons d’heure de déclenchement, plus nous auront de fichiers à créer et à maintenir.
Nous allons donc créer un fichier d’automatisation et utiliser la méthode choose de HA. https://www.home-assistant.io/docs/scripts/#choose-a-group-of-actions

Voici le code que j’ai utilisé :

id: automation_ecole_routines
alias: Routines en période scolaire.
trigger:
 platform: time_pattern
 hours: '*'
 minutes: '*'
condition:
 - condition: and
   conditions:
     - condition: state
       entity_id: sensor.periode_scolaire
       state:  'on'
action:
 - choose:
##############################
##############################
   ## 07:05
   - conditions:
     - condition: and
       conditions:
         - condition: template
           value_template: "{{ (now().timestamp() | timestamp_custom('%H:%M')) == '07:05' }}"
         - condition: state
           entity_id: sensor.jour_ecole_primaire
           state: 'on'
     sequence:
       - service: rest_command.mm_showalert
         data_template:
           titre: '<h2>Attention</h2>'
           texte: 'Il est l’heure de se réveiller les enfants. Il faut se réveiller.'
           duree: "120000"
       - service: script.media_player_notify_all
         data_template:
           message: >
             {{ [
             "Il est l’heure de se réveiller les enfants. Il faut se réveiller.",
             "Il est l'or! L'or de se réveiller! Il est l'or",
             "Bonjour mes amours, il est temps de se lever.",
             "Bien grandir, ça commence dès le matin !"
             ] | random }}
           volume: 0.6
##############################
##############################
   ## 07:35
   - conditions:
     - condition: and
       conditions:
         - condition: template
           value_template: "{{ (now().timestamp() | timestamp_custom('%H:%M')) == '07:35' }}"
         - condition: state
           entity_id: sensor.jour_ecole_primaire
           state: 'on'
     sequence:
       - service: rest_command.mm_showalert
         data_template:
           titre: '<h2>Attention</h2>'
           texte: 'Les enfants, il faut aller se préparer maintenant, brossage de dents et des cheveux.'
           duree: "120000"
       - service: script.media_player_notify_all
         data_template:
           message: >
             {{ [
             "Les enfants, il faut aller se préparer maintenant, brossage de dents et des cheveux.",
             "L'heure de se pouponner est arrivée.",
             "Il est temps de se revêtir de son plus bel apparat!",
             "Le soin à son hygiène et son apparence sont très importants! Direction la salle de bain."
             ] | random }}
           volume: 0.6
##############################
##############################
   ## 07:45
   - conditions:
     - condition: and
       conditions:
         - condition: template
           value_template: "{{ (now().timestamp() | timestamp_custom('%H:%M')) == '07:45' }}"
         - condition: state
           entity_id: sensor.jour_ecole_primaire
           state: 'on'
     sequence:
       - service: rest_command.mm_showalert
         data_template:
           titre: '<h2>Attention</h2>'
           texte: '1er rappel, les enfants, il faut aller se préparer maintenant, brossage de dents et des cheveux.'
           duree: "120000"
       - service: script.media_player_notify_all
         data_template:
           message: >
             {{ [
             "1er rappel, les enfants, il faut aller se préparer maintenant, brossage de dents et des cheveux.",
             "1er rappel, l'heure de se pouponner est arrivée.",
             "1er rappel, il est temps de se revêtir de son plus bel apparat!",
             "1er rappel, le soin à son hygiène et son apparence sont très importants! Direction la salle de bain."
             ] | random }}
           volume: 0.6
##############################
##############################
   ## 08:00
   - conditions:
     - condition: and
       conditions:
         - condition: template
           value_template: "{{ (now().timestamp() | timestamp_custom('%H:%M')) == '08:00' }}"
         - condition: state
           entity_id: sensor.jour_ecole_primaire
           state: 'on'
     sequence:
       - service: rest_command.mm_showalert
         data_template:
           titre: '<h2>Attention</h2>'
           texte: "Dernière ligne droite avant l'école, donc tâches ménagères, bisous et câlins."
           duree: "120000"
       - service: script.media_player_notify_all
         data_template:
           message: >
             {{ [
             "Dernière ligne droite avant l'école, donc tâches ménagères, bisous et câlins.",
             "Bientôt le départ pour l'école, attenons-nous à nos dernières tâches.",
             "Le sourire aux lèvres, tenons-nous prêt pour le départ à l'école.",
             "La vie a la couleur que tu lui donnes! Choisie bien la couleur pour que chaque jour soit un kif."
             ] | random }}
           volume: 0.6
##############################
##############################
   ## 08:10
   - conditions:
     - condition: and
       conditions:
         - condition: template
           value_template: "{{ (now().timestamp() | timestamp_custom('%H:%M')) == '08:10' }}"
         - condition: state
           entity_id: sensor.jour_ecole_primaire
           state: 'on'
     sequence:
       - service: rest_command.mm_showalert
         data_template:
           titre: '<h2>Attention</h2>'
           texte: 'Il est 8h10, on met les chaussures. Hop hop hop. Dans la joie et la bonne humeur!'
           duree: "120000"
       - service: script.media_player_notify_all
         data_template:
           message: >
             {{ [
               "Il est 8h10, on met les chaussures. Hop hop hop. Dans la joie et la bonne humeur!",
               "Dernière ligne droite avant le départ pour ce lieu de savoir!",
               "Mettons nos derniers accessoires, C'est bientôt l'heure du départ."
             ] | random }}
           volume: 0.6
##############################
##############################
   ## 08:15
   - conditions:
     - condition: and
       conditions:
         - condition: template
           value_template: "{{ (now().timestamp() | timestamp_custom('%H:%M')) == '08:15' }}"
         - condition: state
           entity_id: sensor.jour_ecole_primaire
           state: 'on'
     sequence:
       - service: rest_command.mm_showalert
         data_template:
           titre: '<h2>Attention</h2>'
           texte: 'Il est 8h15, on prend son sac à dos et on commence sa journée!'
           duree: "120000"
       - service: script.media_player_notify_all
         data_template:
           message: >
             {{ [
               "Il est 8h15, on prend son sac à dos et on commence sa journée!",
               "C'est l'heure du départ des troupes pour l'école! Soyons fort!",
               "Ce n'est pas parce que nous nous quittons maintenant, que nous ne nous retrouverons pas mieux ce soir."
             ] | random }}
           volume: 0.6

Je n’explique pas plus ce code car tout a été dit auparavant. Sauf un petit point, un bonus : le service rest_command. Vous avez pu voir que j’ai un Magic Mirror à la maison. Je l’utilise pour afficher un message selon l’alerte.

RESTful command

Il n’y a rien de complexe ici. J’utilise l’intégration HA des rest_command. Cf. https://www.home-assistant.io/integrations/rest_command/

Voici mon code inséré dans configuration.yaml :

J’ai installé sur le MagicMirror le module « MMM Remote Control » pour bénéficier de l’API https://github.com/Jopyth/MMM-Remote-Control/blob/master/API/README.md#basic-examples-for-showing-an-alert-on-the-screen

Je n’offre pas de SAV sur le sujet ☺️ C’est juste un bonus pour cette automatisation.

Pour aller plus loin

On pourrait aller beaucoup plus loin en prenant en compte par exemple des capteurs :

  • Est-ce que l’humidité a augmenté dans la salle de bain ? Si oui, c’est qu’elle est en cours d’utilisation, donc, pas la peine de lancer le rappel.
  • Est-ce que le capteur de mouvement a perçu une présence dans la salle à manger ou la cuisine ?
  • Est-ce qu’il y a encore des personnes à la maison ? Détection d’un téléphone portable sur le réseau ? Non, alors tout le monde est parti.

La seule limite à ces automatisations est notre imagination. Les capteurs sont accessibles financièrement et facilement intégrable à HA. Il faut juste prendre le temps nécessaire pour l’acquérir et l’intégrer. 😁

Voilà. Comme d’habitude, je suis preneur de vos points d’améliorations, de votre vision des choses.

Dans la même série

Présentation