Pronote dans HA - les notes, devoirs, absences et emploi du temps des enfants

Merci pour les explications mais j’avoue que j’ai pas tout compris si tu peux me montrer des captures de ce que tu as fait ça sera plus parlant pour moi
Pour les notifs, je ne reçois plus la note en unavailable mais des fois 2 à 3 fois la note en math, surement du au fait qu’il passe de unavailable à la note de ma fille mais c’est pas grave c’est déjà top :slight_smile:

Je sais pourquoi tu recois plusieurs fois la meme note, j’ai le meme probleme.
Si une note tombe, mais que la note est pour le 1/3 par exemple, et qu’on est le 4/3, c’est la dernière remontée au 4/3 qui sera notifiée.
En gros, si tu recois 4 fois la meme note, c’est que tu as des notes incrites a des dates anterieures incrites par les profs aujourd’hui. Bref, je vais arreter les notifs pour le moment .

Merci pour les infos de toute façon je vais pas toucher cette partie déjà content que ça fonctionne :slight_smile:

Lors d’une absence ou d’un déplacement de cours, le status est toujours renseigné par les professeurs. Du moins dans l’établissement de ma fille alors que quand un cours est juste déplacé, le capteur annulation n’est pas sur « true » du coup pas de notif.

Voici ce que je te propose:
Dans le configuration.yaml, il faut déclarer les capteur status:

sensor:
  - platform: template
    pronote_absence_prof_j0_h_0_status:
      friendly_name: "Pronote_absence_prof_j0_h_0_status"
      icon_template: mdi:school
      value_template: "{% if state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[0] is defined %}
                       {{state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[0]['status']}}  
                       {% else %}
                            unknown
                       {% endif %}"
    pronote_absence_prof_j0_h_1_status:
      friendly_name: "Pronote_absence_prof_j0_h_1_status"
      icon_template: mdi:school
      value_template: "{% if state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[1] is defined %}
                       {{state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[1]['status']}}  
                       {% else %}
                            unknown
                       {% endif %}"
    pronote_absence_prof_j0_h_2_status:
      friendly_name: "Pronote_absence_prof_j0_h_2_status"
      icon_template: mdi:school
      value_template: "{% if state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[2] is defined %}
                       {{state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[2]['status']}}  
                       {% else %}
                            unknown
                       {% endif %}"
    pronote_absence_prof_j0_h_3_status:
      friendly_name: "Pronote_absence_prof_j0_h_3_status"
      icon_template: mdi:school
      value_template: "{% if state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[3] is defined %}
                       {{state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[3]['status']}}  
                       {% else %}
                            unknown
                       {% endif %}"
    pronote_absence_prof_j0_h_4_status:
      friendly_name: "Pronote_absence_prof_j0_h_4_status"
      icon_template: mdi:school
      value_template: "{% if state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[4] is defined %}
                       {{state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[4]['status']}}  
                       {% else %}
                            unknown
                       {% endif %}"
    pronote_absence_prof_j0_h_5_status:
      friendly_name: "Pronote_absence_prof_j0_h_5_status"
      icon_template: mdi:school
      value_template: "{% if state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[5] is defined %}
                       {{state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[5]['status']}}  
                       {% else %}
                            unknown
                       {% endif %}"
    pronote_absence_prof_j0_h_6_status:
      friendly_name: "Pronote_absence_prof_j0_h_6_status"
      icon_template: mdi:school
      value_template: "{% if state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[6] is defined %}
                       {{state_attr('sensor.pronote_demo_edt_aujourdhui', 'edt_aujourdhui')[6]['status']}}  
                       {% else %}
                            unknown
                       {% endif %}"

Ensuite l’automation:

alias: Pronote notif cours annulé J0
description: ''
trigger:
  - platform: state
    entity_id: sensor.pronote_absence_prof_j0_h_0_status
    from: unknown
  - platform: state
    entity_id: sensor.pronote_absence_prof_j0_h_1_status
    from: unknown
  - platform: state
    entity_id: sensor.pronote_absence_prof_j0_h_2_status
    from: unknown
  - platform: state
    entity_id: sensor.pronote_absence_prof_j0_h_3_status
    from: unknown
  - platform: state
    entity_id: sensor.pronote_absence_prof_j0_h_4_status
    from: unknown
  - platform: state
    entity_id: sensor.pronote_absence_prof_j0_h_5_status
    from: unknown
  - platform: state
    entity_id: sensor.pronote_absence_prof_j0_h_6_status
    from: unknown
condition:
  - condition: time
    after: '00:01'
    before: '23:59'
action:
  - variables:
      idcours: '{{ trigger.entity_id.split(''_'')[5] }}'
  - service: notify.notify
    data:
      message: '    ⚠Attention⚠, le {{state_attr('sensor.pronote_demo_edt_aujourdhui','edt_aujourdhui')[idcours]['date_heure']}},     {{state_attr('sensor.pronote_demo_edt_aujourdhui','edt_aujourdhui')[idcours]['cours']}},     {{state_attr('sensor.pronote_demo_edt_aujourdhui','edt_aujourdhui')[idcours]['status']}}'
mode: single

Et le résultat:

Tu pourras remarquer le is defined dans les templates, servent à n’ y mettre une valeur dans le capteur que si elle existe sinon le {% else %} unknown s’occupera de mettre « unknow » dedans (donc pas de « unavailable »).
Quand le status basculera de « unknow » à ‹ autre chose ›, la notif t’affichera alors ‹ autre chose › (cours annulé ou déplacé )

Pour les notes, en effet s’il y à 2 notes à la fois (chose qui arrive souvent), tu ne reçois que la dernière. Là j’ai creer un input.text dans lequel j’injecte la valeur de l’avant dernière note ensuite dans mon automation note, quand elle se déclenche(càd qd une ou plusieurs nouvelles notes sont arrivées), je compare la dernière (qui doit se retrouver en 2nde position s’il n’y à eu qu’une note) avec mon input.text. Si il correspond c’est qu’il n’y à eu qu’une seule note alors je notify la dernière note: « Tu as eu une note 15/20 » et je réinjecte la valeur de l’avant dernière note dans le input.text, s’il ne correspond pas (la dernière note se retrouve en 3e voire 4e… position) c’est qu’il y en à eu au moins deux et je notify la dernière et l’avant-dernière note: « Tu as eu deux notes 15/20 et 17/20 » et je réinjecte la valeur de l’avant dernière note dans le input.text.
Evidement ceci ne te notify qu’au max deux notes mais c’est rare qu’il y en ai plus à la fois. (tout dépend aussi de la fréquence de rafraichissement de ton script).

Je suis en test d’une autre manière de pouvoir les notifier sans en oublier une seule. En récupérant le nombre de notes totales depuis le début de l’année dans Pronote, c’est un compteur qui s’incrémente à chaque nouvelle note. Celui ci nous diras combien il y en à eue exactement et les notifier même si Pronote est down pendant un moment, quand il reviendra en ligne, le compteur de notes sera incrémenté de X notes donc je notifierai les X dernières notes.

1 « J'aime »

ouah top de tout m’avoir expliqué, je suis en train de mettre en place les sensors par contre j’ai une question pourquoi tu as 3x le même nom pour ce template sensor qui se répètent : pronote_absence_prof_j0_h_0_status alors que les friendly name sont friendly_name: « Pronote_absence_prof_j0_h_1_status » ou friendly_name: « Pronote_absence_prof_j0_h_2_status » ?

Pardon, tu as tout à fait raison. Tapé un peu vite. C’est corrigé. Merci

c’est moi, merci, je continue, je vais essayer de mettre ça en place ce soir :slight_smile:

Par contre pour la partie automation, elles sont basés sur Pronote notif cours annulé J1 donc avec des entités de type : sensor.pronote_absence_prof_j1_h_0_status sauf que dans l’étape du dessus lors de le création des templates on a créé des entités de type : Pronote_absence_prof_j0_h_1_status soit J0, du coup je comprends pas d’ou vient les sensors j1 , on les a pas créé ?

:sweat_smile: bien vu encore. C’est corrigé. C’est parce que j’ai fait j0 et j1 pour être averti des absences pour le lendemain aussi et me suis un peu mélangé.
Effectivement c’est inspiré du travail de @Dathosim, c’était juste pour t’expliquer la différence entre le capteur absence et status.

Merci et donc du coup je modifie cette partie également « prochainjour » par « aujourd’hui » ?:

message: '    ⚠Attention⚠, le {{state_attr('sensor.pronote_demo_edt_prochainjour','edt_prochainjour')[idcours]['date_heure']}},     {{state_attr('sensor.pronote_demo_edt_prochainjour','edt_prochainjour')[idcours]['cours']}},     {{state_attr('sensor.pronote_demo_edt_prochainjour','edt_prochainjour')[idcours]['status']}}'
mode: single

:grin::+1: Évidemment… En même temps, je suis sur mon tel là, pas évident.:wink: Merci !
Edit: corrigé

1 « J'aime »

c’est bon j’ai tout mis en place par contre tous les sensors template que j’ai créé sont dans un état ; Unknown pour les sensors de type :Pronote_absence_prof_j0_h_0_status, Pronote_absence_prof_j0_h_1_status etc…

est-ce que c’est parce qu’il n’y pas de cours annulé aujourd’hui ?

pourtant ma fille n’a pas eu EPS aujourd’hui cours annulé …

S’ils sont sur unknown(d’ailleurs tu peux mettre ce que tu veux. J’ai mis unknown parce que je m’en sert ailleurs pour filtrer) c’est que tu n’as pas de cours annulé ou déplacé dans ton Json. Est-ce que cette absence est bien notifié sur Pronote? Si oui fait moi un screen de ton Json.

Désolé mais quand tu parles de json je suis largué :slight_smile: il se trouve ou ce fichier ?

Tu vas dans Installer un module complémentaire puis tu y ajoute File editor par exemple.
Tu le lance en ouvrant l’interface Web puis ouvre le dossier blanc en haut à gauche, une liste s’ouvre, tu va tout en bas dans le dossier www. Dedans tu as le fichier au nom de ton enfant .Json dont je te parle.

désolé j’ai eu un trou, je savais plus ou était stocké mon json, j’ai trouvé les lignes concernés :

        {
            "id": "31523FD19B80BA",
            "date_heure": "07/03/2022, 10:46",
            "date": "07/03/2022",
            "heure": "10:46",
            "heure_fin": "12:39",
            "cours": "EPS",
            "salle": null,
            "annulation": false,
            "status": null,
            "background_color": "#AD75AE"
        },

Tu es allé voir sur Pronote ?

Dans pronote, j’ai le cours affiché il me semble, j’avoue que je ne me connecte jamais dessus :slight_smile:

et dans HA :

Donc tout simplement ton cours n’est pas annulé en tout cas pas sur Pronote.
Maintenant essaye de changer manuellement la valeur du statut. De "status": null, à "status": "cours annulé",

j"ai bien reçu la notif :slight_smile: si je modifie le status en « cours annulé »