Aller au contenu

Exemples d'utilisation des blueprints

Huit automatisations complètes, une par blueprint, à copier et à adapter.

Cette page ne remplace pas Les huit blueprints, en détail, qui explique chaque réglage et nomme le piège que chacun évite. Celle-ci sert à autre chose : partir d'un cas concret et d'un bloc prêt à coller, plutôt que d'un formulaire vide.


Avant de copier quoi que ce soit

Trois pièges d'appel, qui ne se voient qu'une fois l'automatisation muette.

Le chemin n'est pas celui du dépôt

Le dépôt range les blueprints dans blueprints/automation/pronote_ng/fr/. Ce n'est pas le chemin à écrire. Quand Home Assistant importe un blueprint depuis une URL GitHub, il le range sous le nom du propriétaire du dépôt :

use_blueprint:
  path: FiveElements/wake_up_alarm.yaml     # ✅ ce que Home Assistant a réellement
  # path: pronote_ng/fr/wake_up_alarm.yaml  # ❌ ce que tout le monde suppose

Pour vérifier chez vous : Paramètres → Automatisations et scènes → onglet Blueprints. Le chemin réel est celui affiché sous chaque modèle.

Le français et l'anglais s'écrasent l'un l'autre

Les deux versions d'un même blueprint aboutissent au même chemin — FiveElements/absence_alert.yaml — parce que seul le nom du fichier est conservé, pas le dossier fr/ ou en/. Importer l'anglais après le français remplace le français. Les deux langues ne cohabitent pas sans renommer l'un des deux fichiers à l'import.

Les identifiants d'entité dépendent de la langue

Home Assistant fabrique l'identifiant d'une entité à partir de son nom traduit. Les exemples ci-dessous sont écrits pour une installation en français et un enfant nommé « Enfant Un » :

Capteur Sur une installation française Sur une installation anglaise
Prochain réveil sensor.enfant_un_prochain_reveil sensor.enfant_un_next_wake_up
Devoirs pour demain sensor.enfant_un_devoirs_pour_demain sensor.enfant_un_homework_tomorrow
Fin des cours sensor.enfant_un_fin_des_cours sensor.enfant_un_end_of_lessons
Menu du jour sensor.enfant_un_menu_du_jour sensor.enfant_un_menu_today
Cours du jour sensor.enfant_un_cours_du_jour sensor.enfant_un_lessons_today
Jour de classe binary_sensor.enfant_un_jour_de_classe binary_sensor.enfant_un_school_day

Remplacez enfant_un par le préfixe réel de votre enfant, et n'inventez pas le suffixe : lisez-le dans Outils de développement → États.

L'identifiant d'appareil ne se devine pas

Quatre blueprints demandent l'appareil de l'élève et non un capteur, parce qu'un déclencheur d'appareil est indépendant de la langue. Les exemples portent donc un child_device factice :

child_device: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4   # à remplacer

Pour trouver le vôtre : Paramètres → Appareils et services → Pronote NG → l'appareil de l'enfant. L'identifiant est la dernière portion de l'URL de sa page. Il est propre à votre installation : recopier celui d'un exemple ne produit aucune erreur, juste une automatisation qui ne se déclenche jamais.

Où coller ces blocs

Paramètres → Automatisations et scènes → Créer une automatisation → Créer une automatisation puis, dans le menu en haut à droite, Modifier en YAML. Effacez le contenu et collez le bloc.


Sommaire


1. Réveil adaptatif

Le cas. Le réveil doit sonner à la bonne heure sans que personne n'y pense la veille — et se taire les jours sans cours, sans qu'on ait à maintenir un calendrier de vacances.

alias: Réveil scolaire d'Enfant Un
description: Sonne à l'heure calculée pour le premier cours du lendemain.
use_blueprint:
  path: FiveElements/wake_up_alarm.yaml
  input:
    wake_up_sensor: sensor.enfant_un_prochain_reveil
    extra_offset:
      hours: 0
      minutes: -10
      seconds: 0
    earliest_time: "06:00:00"
    latest_time: "09:00:00"
    wake_up_action:
      - action: light.turn_on
        target:
          entity_id: light.chambre_enfant_un
        data:
          brightness_pct: 30
          transition: 300
      - delay:
          minutes: 5
      - action: media_player.play_media
        target:
          entity_id: media_player.enceinte_chambre
        data:
          media_content_id: "https://icecast.example.invalid/radio.mp3"
          media_content_type: music

L'écart supplémentaire est ici négatif : il sonne dix minutes avant l'heure calculée par l'intégration. Il ne remplace pas la « Marge de réveil » des options, il s'y ajoute.

Variante : réveil en douceur, puis annonce parlée

    wake_up_action:
      - action: light.turn_on
        target:
          entity_id: light.chambre_enfant_un
        data:
          brightness_pct: 60
          transition: 600
      - action: tts.speak
        target:
          entity_id: tts.piper
        data:
          media_player_entity_id: media_player.enceinte_chambre
          message: "{{ message }}"

message vaut ici Premier cours à 08:30 (MATHÉMATIQUES).

Variante : ne rien faire si personne n'est à la maison

Le champ « Action » accepte une séquence entière, conditions comprises. Une condition qui échoue arrête la séquence — c'est ainsi qu'on ajoute un filtre sans toucher au blueprint.

    wake_up_action:
      - condition: state
        entity_id: person.enfant_un
        state: home
      - action: switch.turn_on
        target:
          entity_id: switch.radio_reveil

2. Rappel des devoirs du lendemain

Le cas. Un rappel le soir, mais uniquement s'il reste vraiment quelque chose à faire — pas un message quotidien qu'on apprend à ignorer.

alias: Devoirs d'Enfant Un pour demain
description: Rappelle à 19 h 30 les devoirs non cochés dus le lendemain.
use_blueprint:
  path: FiveElements/homework_reminder.yaml
  input:
    homework_tomorrow_sensor: sensor.enfant_un_devoirs_pour_demain
    reminder_time: "19:30:00"
    minimum_items: 0
    only_unfinished: true
    notify_action:
      - action: notify.mobile_app_telephone
        data:
          title: "{{ title }}"
          message: "{{ message }}"

minimum_items: 0 veut dire « dès le premier devoir » : le seuil est strictement supérieur, pas « ou égal ».

Variante : sur l'enceinte de la cuisine, et seulement en semaine

    notify_action:
      - condition: time
        weekday: [mon, tue, wed, thu, sun]
      - action: tts.speak
        target:
          entity_id: tts.piper
        data:
          media_player_entity_id: media_player.enceinte_cuisine
          message: "{{ message }}"

Le dimanche est inclus et le vendredi exclu : c'est la veille des jours de classe qui compte, pas le jour de classe lui-même.

Variante : rappeler deux fois, à deux endroits

    notify_action:
      - action: notify.mobile_app_telephone_parent
        data:
          message: "{{ message }}"
      - action: notify.mobile_app_telephone_enfant
        data:
          message: "{{ message }}"

3. Cours annulé ou modifié

Le cas. Savoir tout de suite si le premier ou le dernier cours saute — ce sont les seuls changements qui déplacent l'heure du trajet. Une salle changée en milieu de journée n'intéresse personne.

alias: Emploi du temps d'Enfant Un — bords de journée
description: Notifie une annulation ou un déplacement du premier ou du dernier cours.
use_blueprint:
  path: FiveElements/lesson_canceled.yaml
  input:
    child_device: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
    changes:
      - lesson_canceled
      - lesson_restored
      - lesson_moved
    only_day_edges: true
    lessons_today_sensor: sensor.enfant_un_cours_du_jour
    notify_action:
      - action: notify.mobile_app_telephone
        data:
          title: "{{ title }}"
          message: "{{ message }}"

lesson_restored mérite d'être coché avec lesson_canceled. Une annulation levée est un évènement distinct, et l'oublier produit exactement la panne qu'on redoute : « pas de premier cours, on dort plus tard » envoyé le matin où le cours est finalement rétabli.

only_day_edges exige le capteur « Cours du jour » : c'est lui qui dit quels créneaux sont les bords de la journée.

Variante : tout suivre, mais discrètement

    changes:
      - lesson_canceled
      - lesson_restored
      - lesson_moved
      - room_changed
      - teacher_changed
      - lesson_status_changed
    only_day_edges: false
    notify_action:
      - action: persistent_notification.create
        data:
          title: "{{ title }}"
          message: "{{ message }}"

Une notification persistante s'empile dans l'interface sans faire sonner un téléphone — le bon compromis quand on veut tout voir sans être interrompu.


4. Absence, retard ou punition

Le cas. Être prévenu quand l'établissement saisit une absence, sans être réveillé pour un retard de deux minutes.

alias: Vie scolaire d'Enfant Un
description: Notifie une absence, ou un retard d'au moins dix minutes.
use_blueprint:
  path: FiveElements/absence_alert.yaml
  input:
    child_device: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
    events:
      - absence_added
      - delay_added
      - punishment_added
    minimum_delay_minutes: 10
    notify_action:
      - action: notify.mobile_app_telephone
        data:
          title: "{{ title }}"
          message: "{{ message }}"

Le seuil ne s'applique qu'aux retards. Une absence et une punition passent toujours, quelle que soit sa valeur.

Variante : les absences sur le téléphone, le reste dans le journal

    notify_action:
      - if:
          - condition: template
            value_template: "{{ 'bsence' in message }}"
        then:
          - action: notify.mobile_app_telephone
            data:
              message: "{{ message }}"
        else:
          - action: logbook.log
            data:
              name: Vie scolaire
              message: "{{ message }}"

5. Nouvelle note

Le cas. Être prévenu d'une note en dessous de la moyenne, pas de toutes les notes.

alias: Notes d'Enfant Un sous la moyenne
description: Notifie à la publication d'une note strictement inférieure à 10/20.
use_blueprint:
  path: FiveElements/new_grade.yaml
  input:
    child_device: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
    threshold: 10
    notify_sentinels: false
    notify_action:
      - action: notify.mobile_app_telephone
        data:
          title: "{{ title }}"
          message: "{{ message }}"

Le seuil est appliqué après remise à l'échelle sur 20. Un 7/10 est comparé comme un 14/20 et ne déclenche donc rien : c'est le comportement voulu, et c'est aussi la raison pour laquelle il ne faut pas écrire ce filtre soi-même.

notify_sentinels: false écarte les notes sans valeur numérique — « Absent », « Non rendu », « Dispensé ». Passez-le à true pour être prévenu d'un devoir non rendu, qui n'a pas de note mais mérite souvent plus d'attention qu'un 9.

Variante : toutes les notes, avec la couleur de la matière

    threshold: 20
    notify_sentinels: true
    notify_action:
      - action: notify.mobile_app_telephone
        data:
          message: "{{ message }}"

threshold: 20 laisse tout passer, le seuil étant strictement supérieur.


6. Nouveau message ou information

Le cas. Ne rater aucune information qui demande une réponse — un sondage, une autorisation de sortie — sans lire les annonces générales.

alias: Sondages et messages d'Enfant Un
description: Notifie les messages, et seulement les informations contenant un sondage.
use_blueprint:
  path: FiveElements/new_message.yaml
  input:
    child_device: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
    sources:
      - message_received
      - information_added
    surveys_only: true
    notify_action:
      - action: notify.mobile_app_telephone
        data:
          title: "{{ title }}"
          message: "{{ message }}"

surveys_only ne filtre que les informations. Les messages de la messagerie passent tous : personne n'écrit à un parent pour ne rien demander.

Variante : une alerte critique, parce qu'un sondage a une date limite

    notify_action:
      - action: notify.mobile_app_telephone
        data:
          message: "{{ message }}"
          data:
            push:
              interruption-level: time-sensitive

7. Menu de la cantine

Le cas. Annoncer le menu à voix haute pendant le petit-déjeuner, et se taire les jours où l'enfant ne déjeune pas au collège.

alias: Menu de la cantine d'Enfant Un
description: Annonce le menu du jour à 7 h 15, les jours de classe seulement.
use_blueprint:
  path: FiveElements/canteen_menu.yaml
  input:
    menu_sensor: sensor.enfant_un_menu_du_jour
    school_day_sensor: binary_sensor.enfant_un_jour_de_classe
    announce_time: "07:15:00"
    announce_action:
      - action: tts.speak
        target:
          entity_id: tts.piper
        data:
          media_player_entity_id: media_player.enceinte_cuisine
          message: "{{ message }}"

Le capteur « Jour de classe » est optionnel et vaut une liste vide par défaut ; une condition d'état sur une liste vide passe toujours. Le renseigner ajoute un filtre, le laisser vide n'en retire aucun autre.

Variante : l'afficher sur une tablette plutôt que le dire

    announce_action:
      - action: persistent_notification.create
        data:
          notification_id: menu_du_jour
          title: "{{ title }}"
          message: "{{ message }}"

notification_id fixe fait que l'annonce du jour remplace celle de la veille au lieu de s'empiler.


8. Retour de l'école

Le cas. Allumer le chauffage de la chambre et prévenir quand les cours finissent — y compris, et surtout, les jours écourtés par une annulation.

alias: Retour d'Enfant Un
description: Prévient et chauffe la chambre quinze minutes avant la fin des cours.
use_blueprint:
  path: FiveElements/end_of_day.yaml
  input:
    end_of_lessons_sensor: sensor.enfant_un_fin_des_cours
    offset:
      hours: 0
      minutes: -15
      seconds: 0
    only_when_shortened: false
    earliest_time: "11:00:00"
    latest_time: "20:00:00"
    arrival_action:
      - action: climate.set_temperature
        target:
          entity_id: climate.chambre_enfant_un
        data:
          temperature: 19
      - action: notify.mobile_app_telephone
        data:
          title: "{{ title }}"
          message: "{{ message }}"

L'écart de −15 minutes fait agir avant la sonnerie, le temps que la chambre chauffe.

Variante : n'alerter que les jours écourtés

    only_when_shortened: true
    offset:
      hours: 0
      minutes: 0
      seconds: 0
    arrival_action:
      - action: notify.mobile_app_telephone
        data:
          message: "{{ message }}"

C'est le seul réglage de cette page qui repose sur un test qu'on écrirait faux soi-même. Il compte les cours annulés après l'heure de sortie (canceled_after) au lieu de comparer la fin prévue à la fin réelle — une dispense décale la seconde sans qu'aucun cours ne soit annulé, et la comparaison annoncerait une annulation ce jour-là.

Avant d'y accrocher un portail

Les heures de fin ne sont pas toujours publiées par PRONOTE ; elles sont alors déduites de la durée du créneau, et sur certains établissements c'est le cas de toutes. L'attribut end_inferred le dit. Une notification supporte l'approximation ; l'ouverture d'un portail ou un départ en voiture, non.


Deux recettes qui ne sont pas des blueprints

Certaines choses ne méritent pas un modèle. Les voici en entier.

Prévenir quand les collectes s'arrêtent

C'est la seule panne qui ne se voit pas : quand une collecte échoue, les entités gardent leur dernière valeur et rien n'a l'air cassé.

alias: Collectes PRONOTE interrompues
triggers:
  - trigger: state
    entity_id: sensor.mon_etablissement_etat_du_limiteur
    from: nominal
    for: "01:00:00"
conditions: []
actions:
  - action: notify.mobile_app_telephone
    data:
      message: >-
        Collectes PRONOTE interrompues :
        {{ states('sensor.mon_etablissement_etat_du_limiteur') }}
mode: single

credentials_hold mérite une alerte immédiate, sans le délai d'une heure : il signale des identifiants refusés à répétition, ce qui expose à une suspension d'adresse IP par PRONOTE.

alias: PRONOTE — connexions suspendues
triggers:
  - trigger: state
    entity_id: sensor.mon_etablissement_etat_du_limiteur
    to: credentials_hold
conditions: []
actions:
  - action: notify.mobile_app_telephone
    data:
      title: PRONOTE
      message: >-
        Connexions suspendues : identifiants refusés à répétition.
        Ne ressaisissez pas le mot de passe avant d'avoir vérifié.
mode: single

Comparez l'état brut, jamais le libellé traduit. Le déclencheur ci-dessus teste credentials_hold et non « Connexions suspendues » : un déclencheur écrit sur le libellé ne se déclenche jamais, sans erreur ni avertissement.

Ne rien faire pendant les vacances

Aucun blueprint n'en a besoin — c'est déjà gratuit dans les huit, parce qu'un capteur sans valeur n'arme pas un déclencheur horaire. Mais pour vos propres automatisations :

conditions:
  - condition: state
    entity_id: binary_sensor.enfant_un_jour_de_classe
    state: "on"

Pour aller plus loin

Document Pour qui
Les huit blueprints, en détail Chaque réglage, et le piège que chacun évite
§ 9 du guide Écrire une automatisation sans blueprint
Migrer ses automatisations Vous arrivez de l'intégration pronote
Annexe A L'origine exacte de chaque donnée, et les attributs de chaque évènement