[Article] Intégration Pronote : cours, devoirs, notes, etc

et aussi a rebootée votre home assistant,

oui reboot et vidé cache et test avec autre navigateur.

1 « J'aime »

Le truc bête c’est que je ne trouve pas la card-mod dans ajouter une carte. Je pense que ça viens de là, mais pas possible de savoir pourquoi. le module est bien installé dans community pourtant


et j’ai mis le code dans config:
Capture d'écran 2023-09-12 230932
Mais pas de Mod-card.

D’ailleurs, très bon blog de @Sigalou au passage qui a fait un superbe boulot! Blog de Signalou
Mais je reste un boulet sur ce coup ci :cry:.
Bon, j’ai jusqu’au début Juillet 2024 pour y arriver quand même :flushed:

1 « J'aime »

Salut

l’insatllation de card mod dans l’onglet interfaces de HACS ne fonctionne pas ?

Me concernant je n’ai pas eu de soucis d’install et je le retrouve bien dans WWW/comnity/lovelace_card_mod

image

et elle apparait bien dans HACS (interfaces)

si tu passes par hacs , pas besoin de l’ajouter en yaml


Tu la bien le mode carte.

Hello !

La nouvelle version 0.5.1 avec le correctif pour la mise à jour des données est sortie ! :tada:

Vous pouvez mettre à jour via HACS directement (n’oubliez pas de redémarrer HA suite à la mise à jour).

N’hésitez pas à me faire vos retours si vous avez des soucis.

7 « J'aime »

Si pas encore trouvé, le code dans la carte cherche qqc qui n’est pas encore dispo.On pourrait eviter rentrer dans le code avec un teste, par example:
tout au début (avant ‹ table ›)

type: markdown
content: >-
  {% if state_attr('sensor.pronote_NOM_PRENOM_evaluation','acquisition_name')
  != none %} 
.....
...code déjà existant
.....
{% endif %}

Je l’ai installé et pour le moment tout est ok.
Un grand merci a toi.
Je te fais un retour demain pour valider.
:sunglasses::+1:t4:

1 « J'aime »

Bonjour,

depuis que j’ai pu régler mes soucis de connexion, je me suis pas mal amusé avec cette intégration.

J’ai mis en place une premiere automatisation pour recevoir une notification lorsqu’un cours est annulé. Pas évident d’aller chercher la propriété cancelled = true où en tout cas je ne sais pas faire du coup j’ai contourné en créant de nouveaux sensors (2 par enfant, un pour aujourd’hui, l’autre pour le prochain jour :

- platform: template
  sensors:
    pronote_edt_marilou_aujourdhui_cours_annulation:
      friendly_name: "Edt Marilou Cours annulation"
      value_template: >-
        {% set cours = state_attr('sensor.pronote_xx_marilou_timetable_today' , 'lessons') %}
        {% for cour in cours -%}
          {%- if cour.canceled %} Aujourd'hui - {{cour.start_time}} - {{cour.end_time}} : {{ cour.lesson }} {% endif -%} 
        {%- endfor %}

    pronote_edt_marilou_prochainjour_cours_annulation:
      friendly_name: "Edt Marilou Cours annulation prochain jour"
      value_template: >-
        {% set cours = state_attr('sensor.pronote_xx_marilou_timetable_next_day' , 'lessons') %}
        {% for cour in cours -%}
          {%- if cour.canceled %} Prochain jour - {{cour.start_time}} - {{cour.end_time}} : {{ cour.lesson }} {% endif -%} 
        {%- endfor %}

J’ai ensuite créé les automatisations qui vont bien :

- id: '1694535869007'
  alias: Annulation cours Marilou
  description: ''
  trigger:
  - platform: state
    entity_id:
    - sensor.pronote_edt_marilou_aujourdhui_cours_annulation
  - platform: state
    entity_id:
    - sensor.pronote_edt_marilou_prochainjour_cours_annulation
  condition: []
  action:
  - service: notify.telegram_maison
    data:
      message: 'Cours Marilou annulé : {{states(''sensor.pronote_edt_marilou_aujourdhui_cours_annulation'')}}
        {{states(''sensor.pronote_edt_marilou_prochainjour_cours_annulation'')}}'
  mode: single

Je ne suis pas certain que ce soit la meilleure manière de procéder, des idées pour faire mieux ?

Je souhaite maintenant avoir un automatisation me prévenant dès que l’un de mes enfants a une nouvelle absence. J’ai fait plus simple mais ça ne fonctionne pas ou plutôt trop bien. Depuis cette nuit, je reçois une notification à chaque rafraîchissement pour la même absence.

- id: '1694381315656'
  alias: Nouvelle absence Pronote Camille
  description: ''
  trigger:
  - platform: state
    entity_id:
    - sensor.pronote_guionnet_camille_absences
    attribute: absences
  condition: []
  action:
  - service: notify.telegram_maison
    data:
      message: Nouvelle absence pour Camille 
  mode: single

Je n’avais pas constaté ce comportement auparavant. Cela a commencé hélas en même temps que la mise à jour du core ha et que celle de cette intégration cette nuit.

Avez-vous une idée ?

D’une manière générale, je souhaiterais recevoir une notification à chaque nouvel événement (note, absence, punition…). Possible ?

Enfin je voudrais savoir si à terme il est envisageable d’être notifié également des nouveaux messages (discussion, communication, observation…) ?

Merci beaucoup et encore bravo pour tout ce travail.

Mattieu.

Bon, solution trouvée!
:warning: Attention de bien respecter TOUS les points de @Sigalou :warning:. Vous devez passer par l’Add-on" Auto-entities", sinon, peau de lapin, ça marche point pour moi.
Ensuite, vous faites à votre sauce les modifs. Petit point important si la carte lovelace-card-mod, bien vérifier votre chemin d’accès dans le fichier config de votre HA (dépend de comment vous bosser sur votre HA).

Et bien sur, redémarrer et vider son cache au besoin.
Voili, voilou. J’espère avoir pu filer un coup de main a ceux qui comme moi galéraient un pneu. Allez, je file à la pharmacie m’acheter du LUXEOL « Anti Perte de cheveux » à cause de tous ça. :vulcan_salute:

Pour info, l’intégration est désormais directement intégrée à HACS par défaut, plus besoin d’ajouter le repo manuellement :slight_smile:

4 « J'aime »

Merci beaucoup pour l’intégration elle est top!
J’ai un problème pour l’heure de début de cours, aujourd’hui un cours était annulé mais mon sensor « Début des cours de Louisa - aujourd’hui début de cours » ne l’a pas indiqué:


Voici mon template utilisé grâce à @Sigalou :

    sensors:
      debut_des_cours_de_louisa_aujourdhui:
        friendly_name: Début des cours de Louisa - aujourd'hui
        unique_id: sensor.debut_des_cours_de_louisa_aujourdhui
        value_template: >-            
                {% if state_attr('sensor.pronote_XXX_louisa_timetable_today', 'lessons')[0] is defined %}
                    {{state_attr('sensor.pronote_XXX_louisa_timetable_today', 'lessons')[0]['start_at'].strftime('%H:%M')}}
                {% else %}
                    Pas cours
                {% endif %}

Comment faire pour que cela indique la bonne heure de cours, c’est à dire 9H10?

Vous pouvez utiliser directement l’attribut day_start_at dans le sensor, c’est recalculé automatiquement : state_attr('sensor.pronote_XXXXX_timetable_today', 'day_start_at')

2 « J'aime »

Hello,

Je partage avec vous si ça peut intéresser quelqu’un un rework de la tuile « emploi du temps sur 15 jours ».

Je me suis limité à la semaine en cours et j’ai ajouté une pastille qui indique le cours qui normelement en cours.

Voici la partie template pour la mise en forme.

{% set months = ["Janvier","Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"] %}
{% set days = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"] %}
{% set weeknum = now().strftime("%W") %} 
 <table>  {% set items =
 state_attr('sensor.pronote_leroux_corentin_timetable_period','lessons') %}
   <tr>
   <td><h4>Début</h4></td>
   <td><h4>Fin</h4></td>
   <td><h4>Cours</h4></td>
   <td></td>
   <td><h4>Salle</h4></td>
   </tr>
 {% for i in range(0, items | count, 1) %}

 {% if items[i].start_at.strftime("%W") != weeknum %}

 {% continue %}

 {% endif %}


 {% if i == 0 %}

 <tr><td colspan="5" class="table-info"><b>{{ days[items[i].start_at.strftime('%w')| int - 1] }} {{ items[i].start_at.strftime("%d") }}</b></td></tr>

 {% endif %}

 {% if items[i].start_at.strftime("%F") > items[i-1].start_at.strftime("%F")
 %} 

 <tr><td colspan=5><b>{{ days[items[i].start_at.strftime('%w')| int - 1] }} {{ items[i].start_at.strftime("%d") }}</b></td></tr>

 {% endif %}

 <tr>

 {%- if items[i].canceled != True -%}

 <td><mark>{{ items[i].start_time }}</mark></td>

 <td> <mark>{{ items[i].end_time }}</mark></td>
 <td>{{ items[i].lesson }}</td>

 {% else %}

 <td><del>{{ items[i].start_time }}</del></td>

 <td><del>{{ items[i].end_time }}</del></td>
 <td><del>{{ items[i].lesson }}</del></td>

 {%- endif -%} 

 {% if as_timestamp(items[i].start_at) | timestamp_local <= as_timestamp(now()) | timestamp_local and as_timestamp(items[i].end_at) | timestamp_local >= as_timestamp(now()) | timestamp_local %}
 <td>🟢</td>
 {% else %}
 <td>⚪</td>
 {% endif %}
 


 {%- if items[i].canceled == False -%}

 <td>{{ items[i].classroom }}</td>

 {% else %}
 <td><span>{{ items[i].status }}</span></td>

 {% endif %}
</tr>
 {% endfor %}
</table>
3 « J'aime »

Bonjour,

En remplaçant

    sensors:
      debut_des_cours_de_clara_aujourdhui:
        friendly_name: Début des cours de Clara- aujourd'hui
        unique_id: sensor.debut_des_cours_de_clara_aujourdhui
        value_template: >-            
                {% if state_attr('sensor.pronote_XXX_clara_timetable_today', 'lessons')[0] is defined %}
                    {{state_attr('sensor.pronote_XXX_clara_timetable_today', 'lessons')[0]['start_at'].strftime('%H:%M')}}
                {% else %}
                    Pas cours
                {% endif %}

par

    sensors:
      debut_des_cours_de_clara_aujourdhui:
        friendly_name: Début des cours de Clara- aujourd'hui
        unique_id: sensor.debut_des_cours_de_clara_aujourdhui
        value_template: >-            
                {% if state_attr('sensor.pronote_XXX_clara_timetable_today', 'day_start_at')[0] is defined %}
                    {{state_attr('sensor.pronote_XXX_clara_timetable_today', 'day_start_at')[0]['start_at'].strftime('%H:%M')}}
                {% else %}
                    Pas cours
                {% endif %}

Il m’indique pas de cours.
pourtant l’attribut a bien un horaire.

1 « J'aime »

Retire les [0] à la fin de state_attr('sensor.pronote_XXX_clara_timetable_today', 'day_start_at') :slight_smile:

{% if state_attr('sensor.pronote_XXX_clara_timetable_today', 'day_start_at') is defined %}
    {{state_attr('sensor.pronote_XXX_clara_timetable_today', 'day_start_at').strftime('%H:%M')}}
{% else %}
    Pas cours
{% endif %}
3 « J'aime »

Salut tu mes ça ou? Dans une carte ou dans te répertoire template ?

Top !

De la même façon tu saurais ajouter un attribut « cancelled_lessons » (par exemple) dans les timetable qui indiquerait pour chaque table s’il y a des cours annulés ou combien il y en a…

ce serait plus simple pour faire des triggers…

Tu as peut être déjà ça dans ta shopping list d’ailleurs…

Je l’ai mis dans une carte markdown.

Bon je butte sur un truc bête, mais j’avoue que je ne comprends pas:

J’essaie juste de compter les cours annulés

Dans l’outil de développement, quand je teste le code suivant:

{% set items = state_attr('sensor.pronote_xxxx_timetable_period','lessons') %}
{% set nb = 0 %}
{% for i in range(0, items | count, 1) %}
debug : {{nb}}
{%- if items[i].canceled == True -%} 
cour annulé
{% set nb = nb + 1 %}
{%- endif -%}
{% endfor %}

la variable nb n’évolue jamais et reste à 0 pourtant le prompt « cour annulé » monte bien…

[Edit]

J’ai trouvé un code qui marche pour créer 3 sensors:
cour annulés aujourd’hui / jour suivant / total qui remontent le nb de cours au statut cancelled dans les timetable respectives:

  - sensor:
      - name: Cours annulés Louise - Total
        unique_id: sensor.cancelled_lesson_louise_period
        icon: "mdi:clock-time-five-outline"
        state: >-            
                {% set nb = namespace(counter=0) %}
                {% set items = state_attr('sensor.pronote_xxxx_louise_timetable_period','lessons') %}
                {% for i in range(0, items | count, 1) %}
                {%- if items[i].canceled == True -%} 
                {% set nb.counter = nb.counter + 1 %}
                {%- endif -%}
                {% endfor %}
                {{nb.counter}}

      - name: Cours annulés Louise - aujourd_hui
        unique_id: sensor.cancelled_lesson_louise_today
        icon: "mdi:clock-time-five-outline"
        state: >-            
                {% set nb = namespace(counter=0) %}
                {% set items = state_attr('sensor.pronote_xxxx_louise_timetable_today','lessons') %}
                {% for i in range(0, items | count, 1) %}
                {%- if items[i].canceled == True -%} 
                {% set nb.counter = nb.counter + 1 %}
                {%- endif -%}
                {% endfor %}
                {{nb.counter}}       
                
      - name: Cours annulés Louise - prochain
        unique_id: sensor.cancelled_lesson_louise_next
        icon: "mdi:clock-time-five-outline"
        state: >-            
                {% set nb = namespace(counter=0) %}
                {% set items = state_attr('sensor.pronote_xxxx_louise_timetable_next_day','lessons') %}
                {% for i in range(0, items | count, 1) %}
                {%- if items[i].canceled == True -%} 
                {% set nb.counter = nb.counter + 1 %}
                {%- endif -%}
                {% endfor %}
                {{nb.counter}}     
            

A voir si ceci me permet de servir de trigger pour des automatisations de notification…