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

Meme chose, cela marche pour moi avec periods[1].
Pour info, et si cela peut etre une piste, je n’ai pas de ENT faisant partie de l’academy bordeaux. Peut etre, ne reconnait il pas le current periods comme le trimestre en cours?

Resolution en cours : https://github.com/bain3/pronotepy/pull/197

Merci beaucoup, c’était effectivement ça le problème ! Tout fonctionne pour moi maintenant :slight_smile:

Je viens de verifier mais je ne vois pas quelle dépendence il pourrait manquer.

J’ai fait que quelques tests mais pour moi, en docker, c’est pas facile et des soucis aussi qui je ne pourrait pas avertir sans plus de dev.

Je te propose d’ouvrir un issue ici: dathosim/Pronote2Homeassistant: Tuto et bout de code pour ajouter des éléments de Pronote dans Home assistant (github.com)

Coucou, j’ai le même souci que toi, et l’astuce de cbroissa-github ne fonctionne pas chez moi, mais je suis un vrai boulet alors… :slight_smile:
Bon petit retour d’expérience, tout fonctionne enfin, c’était juste un problème de syntaxe, l’automatisation fonctionne nickel, tout remonte bien, encore 2/3 trucs à régler dans le markdown mais le plus dur est fait.
Merci à Dathosim pour son super boulot et à tous les membres qui ont posté leurs astuces et autre bout de code.

1 « J'aime »

Bonjour à tous, j’ai un soucis sur la partie automatisation. En effet, tout fonctionne correctement mais j’ai remarqué que les données ne se mettaient pas à jour. En relancant le script, j’ai ce message d’erreur

➜  ~ python3 /config/python_scripts/pronote.py
Traceback (most recent call last):
  File "/config/python_scripts/pronote.py", line 5, in <module>
    import pronotepy
  File "/config/python_scripts/local-packages/pronotepy/__init__.py", line 11, i                                              n <module>
    from .dataClasses import *
  File "/config/python_scripts/local-packages/pronotepy/dataClasses.py", line 21                                              , in <module>
    from autoslot import Slots  # type: ignore
ModuleNotFoundError: No module named 'autoslot'

Quand je relance la commande pip install pronotepy, je peux ensuite relancer le script sans problème mais je dois refaire ça à chaque fois.

Avez-vous une idée du soucis ?

Merci d’avance pour votre aide.

Hello @milousebw :
je n’ai pas le même problème car je suis sur une version Supervised de HA sur une Debian
Et du coup, je fais tourner les scripts sur la Debian qui dépose le fichier json dans un endroit accessible pour Ha.
Toi tu dois être sous HAOS non ?
Et du coup, pronotepy se décharge à chaque fois que tu fermes la commande de script
Je crois que certains on trouvé dans ce thread comment faire mais c’est vrai qu’il faut trouver parmi plus de 500 messages :frowning:

Si HAOS, c’est aussi un container et dans ce cas il faut re-installer avec tout maj de HAOS…mais j’attend que entre les maj ça doit rester stable

@vingerha : perso je n’ai pas compris :frowning:
Tu peux faire en sorte que su HAOS la lib pronotepy reste chargée ? comment tu fais ?

Quand on installe pronotepy, soit sur le OS, soit dans une container, ça doit normalement resté dispo…chez moi c’est le cas. Mais, dès qu’on fait une maj le tout est remplacé, effacant pronotepy car ça ne fait pas parti de l’install .
EDIT: en réalité, sans savoir comment @milousebw déclenche ses scripts… je ne suis pas 100% sûre

J’ai commencé mon HAOS à côté mais avec terminal&ssh je n’ais pas python3 ni pip pour installer pronotepy… stp me detailler comment tu l’as fait (je sais docker mais pas haos)

Merci pour ta réponse. Je suis effectivement sous HAOS. Je redémarre régulièrement Home Assistant car je modifie beaucoup de choses. Est-ce que cela vient juste de ça ? Je vais tester en ne touchant plus rien pendant plusieurs jours.

Si votre enfant est en retenue (je ne vous le souhaite pas) cela génère une erreur, j’ai fait cette modification dans la boucle pour les cours :

            lessonName = 'Retenue'
            lessonStatus = 'Retenue'
            lessonClassroom = 'Salle de retenue'
            if lesson.subject is not None :
                lessonName = lesson.subject.name
                lessonStatus = lesson.status
                lessonClassroom = lesson.classroom
...
                'cours': lessonName,
                'salle': lessonClassroom,
                'status': lessonStatus,

Bonjour,
je ne suis pas un pro du codage mais je viens de modifier mon fichier Pronote afin de changer automatiquement de periode.

j’ai rajouté les points suivants:

en haut:
import datetime

plus bas:

#Gestion auto du trimestre en cours
#trimestre 0 de septembre a novembre    1 de decembre a fevrier   2 de mars a aout
moisactuel = datetime.datetime.now().month
if 1 <= moisactuel <= 2 :
    trimestre = 1
elif 3 <= moisactuel <= 8 :
    trimestre = 2
elif 9 <= moisactuel <= 11 :
    trimestre = 0
elif moisactuel == 12 :
    trimestre = 1
else:
    trimestre = 0

et j’ai modifié les points suivant:

    #Récupération des notes 
    #current_period  ou  periods[0 1 2]
    grades = client.periods[trimestre].grades
    grades = sorted(grades, key=lambda grade: grade.date, reverse=True)

plus:

    #Récupération  des absences pour l'année
    #absences = [period.absences for period in client.periods]
    #Récupération  des absences pour la période en cours 
    #current_period  ou  periods[0 1 2]
    absences = client.periods[trimestre].absences
    absences = sorted(absences, key=lambda absence: absence.from_date, reverse=True)

et enfin:

    #Récupération des evaluations
    #current_period  ou  periods[0 1 2]
    evaluations = client.periods[trimestre].evaluations
    evaluations = sorted(evaluations, key=lambda evaluation: (evaluation.subject.name, evaluation.date))

cela fonctionne bien pour l’instant pour moi.
a vous de voir si cela peut aider.

Bonjour; je n’ai plus accès aux notes et j’ai cette erreur une idée ? :

2023-02-04 20:44:44.097 ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'value_json' is undefined when rendering '{% if value_json.note.0 is defined %}
{{ value_json.note.0.cours }} : {{ value_json.note.0.note_sur }}
{% else %}
None
{% endif %}'

Dans quel fichier vous modifiez manuellement la période ?

Merci de votre aide

C’est bon j’avais oublié de mettre /local/ dans le lien ressource…mais j’ai encore ces deux messages :

2023-02-05 18:22:33.838 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template("{{ state_attr('sensor.pronote_edt_lou_aujourdhui', 'edt_aujourdhui')[0]['annulation'] }}")
Traceback (most recent call last):
File "/usr/lib/python3.10/site-packages/homeassistant/helpers/template.py", line 457, in async_render
render_result = _render_with_context(self.template, compiled, **kwargs)
File "/usr/lib/python3.10/site-packages/homeassistant/helpers/template.py", line 1984, in _render_with_context
return template.render(**kwargs)
File "/usr/lib/python3.10/site-packages/jinja2/environment.py", line 1301, in render
self.environment.handle_exception()
File "/usr/lib/python3.10/site-packages/jinja2/environment.py", line 936, in handle_exception
raise rewrite_traceback_stack(source=source)
File "<template>", line 1, in top-level template code
File "/usr/lib/python3.10/site-packages/jinja2/sandbox.py", line 303, in getitem
return obj[argument]
jinja2.exceptions.UndefinedError: list object has no element 0
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/lib/python3.10/site-packages/homeassistant/helpers/template.py", line 575, in async_render_to_info
render_info._result = self.async_render(variables, strict=strict, **kwargs)
File "/usr/lib/python3.10/site-packages/homeassistant/helpers/template.py", line 459, in async_render
raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: UndefinedError: list object has no element 0
2023-02-05 18:22:33.843 ERROR (MainThread) [homeassistant.helpers.template_entity] TemplateError('UndefinedError: list object has no element 0') while processing template 'Template("{{ state_attr('sensor.pronote_edt_lou_aujourdhui', 'edt_aujourdhui')[0]['annulation'] }}")' for attribute '_state' in entity 'binary_sensor.pronote_edt_lou_aujourdhui_cours_0_annulation'
2023-02-05 18:22:33.876 ERROR (MainThread) [homeassistant.helpers.event] Error while processing template: Template("{{ state_attr('sensor.pronote_edt_demo_prochain_jour', 'edt_prochainjour')[0]['annulation'] }}")
Traceback (most recent call last):
File "/usr/lib/python3.10/site-packages/homeassistant/helpers/template.py", line 457, in async_render
render_result = _render_with_context(self.template, compiled, **kwargs)
File "/usr/lib/python3.10/site-packages/homeassistant/helpers/template.py", line 1984, in _render_with_context
return template.render(**kwargs)
File "/usr/lib/python3.10/site-packages/jinja2/environment.py", line 1301, in render
self.environment.handle_exception()
File "/usr/lib/python3.10/site-packages/jinja2/environment.py", line 936, in handle_exception
raise rewrite_traceback_stack(source=source)
File "<template>", line 1, in top-level template code
File "/usr/lib/python3.10/site-packages/jinja2/sandbox.py", line 303, in getitem
return obj[argument]
jinja2.exceptions.UndefinedError: None has no element 0
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/lib/python3.10/site-packages/homeassistant/helpers/template.py", line 575, in async_render_to_info
render_info._result = self.async_render(variables, strict=strict, **kwargs)
File "/usr/lib/python3.10/site-packages/homeassistant/helpers/template.py", line 459, in async_render
raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: UndefinedError: None has no element 0
2023-02-05 18:22:33.877 ERROR (MainThread) [homeassistant.helpers.template_entity] TemplateError('UndefinedError: None has no element 0') while processing template 'Template("{{ state_attr('sensor.pronote_edt_demo_prochain_jour', 'edt_prochainjour')[0]['annulation'] }}")' for attribute '_state' in entity 'binary_sensor.pronote_edt_demo_prochain_jour_cours_0_annulation'

Ces messages sont identiques pour les sensors 0 à 6 à chaque fois .

Est ce un comportement normal si pas cours auj (dimanche) et cours annulés demain ? Sinon une idée de ce qui peut provoquer ces erreurs ?

Merci

Hello !

Super Boulot ! c’est vraiment top comme intégration !

J’ai quelques pb :

  • Je suis obligé de commenter toute la partie « absence » sinon j’ai des erreurs python :
Traceback (most recent call last):
  File "/usr/share/hassio/homeassistant/python_scripts/pronote.py", line 274, in <module>
    absences = client.current_period.absences()
TypeError: 'list' object is not callable
  • Dans lovelace, les emplois du temps de demain et après-demain sont identiques.
  • Dans le collège ils ne fonctionnent pas avec des notes mais des évaluations. Et je n’en récupère aucune (ce sont des couleurs).

J’avoue ne pas avoir tout lu le fil car c’est … gros ! :wink:

Bonne journée

Damien

1 « J'aime »

Je me réponds à moi-même : pour les absence c’est dû au pb de period. Après application du correctif de @Sami_Tatsu c’est ok.
Les 2 autres pb restent… Sachant que ds le json, j’ai bien les évaluations. C’est dans le lovelace que je ne les ai pas. Si quelqu’un peu me filer sont bout de code lovelace pour cela… svp ?

Bonjour,

J’ai un petit soucis d’affichage.
Sur le PC tout se passe bien, par contre je cast un dashboard contenant, météo, attente des bus et emploi du temps du petit sur un Google Nest dans l’entrée de l’appartement et lui m’affiche les couleurs sans card-mod.

PC :

Nest :

Je suppose que c’est du aux limitation du Nest, mais au cas ou l’un d’entre vous aurait une solution je me suis décidé à poster.

Bonjour,

voici mon code lovelace pour les abs (pensez à modifier les sensors)

type: markdown
content: |-
  <div>Absences</div>
  <table width="100%">
      <tbody width="100%">
          {%-for attr in states.sensor.pronote_absence.attributes.absence -%}<tr>
              <td>{{state_attr('sensor.pronote_absence', 'absence')[loop.index-1]['date_debut_format']}}
                  <br>{{state_attr('sensor.pronote_absence', 'absence')[loop.index-1]['nb_heures']}} de cours manqué(s)
              </td>
              <td>
              {%- if state_attr('sensor.pronote_absence', 'absence')[loop.index-1]['raison'] == '' -%}
                  Motif : inconnu<br/>
              {%- else -%}
                  Motif : {{state_attr('sensor.pronote_absence', 'absence')[loop.index-1]['raison']}}<br/>
              {% endif %}
              {%- if state_attr('sensor.pronote_absence', 'absence')[loop.index-1]['justifie'] == false -%}
                  <span>Absence non justifiée</span>
              {%- else -%}
                  <mark>Absence justifiée</mark>
              {% endif %}</td>               
          </tr>
          {% endfor %}
    </tbody>
  </table>
card_mod:
  style:
    .: |
      ha-card {
        padding:0px
      }
      ha-card ha-markdown.no-header {
        padding:0px
      }
    ha-markdown $: |
      h1 {
          font-weight: normal;
          font-size: 24px;
      }
          div {
              background-color:rgb(100, 100, 100);
              padding: 12px 12px;
              color:white;
              font-weight:normal;
              font-size:1.2em;
              border-top-left-radius: 5px; 
              border-top-right-radius: 5px; 
          }
          table{
            border-collapse: collapse;
            font-size: 0.9em;
            font-family: Roboto;
            width: 100%;
            outline: 0px solid #393c3d;
            margin-top: 0px;
          } caption {
              text-align: center;
              font-weight: bold;
              font-size: 1.2em;
          } td {
              padding: 5px 5px 5px 5px;
              text-align: left;
              border-bottom: 0px solid #1c2020;
          }
          tr {
              border-bottom: 0px solid #1c2020;
          }

          tr:nth-of-type(even) {
              background-color: rgb(54, 54, 54, 0.3);
          }
          tr:last-of-type {
              border-bottom: transparent;
          }
          mark {
              background: #009767;
              color: #222627;
              border-radius: 10px;
              padding: 5px;
          }
          span {
              background: #EC4B34;
              color: #222627;
              border-radius: 10px;
              padding: 5px;
          }
          span {
              padding: 5px;
          }
          tr:nth-child(n+2) > td:nth-child(2) {
            text-align: left;
          }