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

@DNT @Chris_Tophe :
J’ai mis à jour le Github pour ajouter les 2 sensors dans le Lovelace pour les notes et les devoirs (mais @DNT avait vu juste : bravo)
Et j’ai corrigé le configuration.yaml au début pour accorder les noms des sensors avec ceux du lovalace
(désolé c’était un peu brouillon)

Par contre je vois une erreur dans les Lovelace de @Chris_Tophe :
{%-for attr in states.sensor.edt_note.attributes.edt_note -%} : il ne faut pas mettre edt_note à la fin mais note
a remplacer par
{%-for attr in states.sensor.edt_note.attributes.note -%}

'.note" représente le noeud dans le fichier json :wink:

@Elekrea :
La crontab que tu ajoutes n’est pas valide
Pour qu’elle se lance toutes les 10 minutes c’est :
*/10 * * * *
et pas */0 * * * *

Pour vérifier la syntaxe :

Merci, faute de frappe ! Désolé.
C’est bien */30 * * * * que j’ai, vu que je ne voudrait le lancer que toutes les 30 min
Il n’y aurait pas une différence de chemin du fait que je sois sous Hass OS ?

Qqun peut nous aider a dire comment « mettre ce cron tab » en place? Sur une install std type odroid ou RPI4 faisant tourner HA Supervised.

Merci pour ton aide.
J’ai redémarré HA de nombreuses fois.
ma ligne ressource n’était pas bonne en effet /config/www/pronote_lina.json je l’ai changé dans le configuration.yaml resource: http://192.168.31.20:8123/local/pronote_lina.json
mais j’ai toujours le même problème.
J’ai revérifié l’adresse de home assistant sur mon routeur miwifi et mon adresse apparait bien dans la console ssh IPv4 addresses for eth0: 192.168.31.20/24
Je n’ai rien trouvé dans les logs :thinking:

Un grand merci à Dathosim pour ce script !

Je suis sur une install HA OS, et par défaut le cron daemon n’est pas lancé. Un container docker n’est pas censé avoir des taches en background. Je n’ai pas voulu changé ce principe.
J’ai copié le script dans le répertoire /config/python_scripts et déclaré une commande shell:

shell_command:
  pronote_get_data: python /config/python_scripts/pronote.py

J’ai défini une automation qui s’exécute toutes les 10mn et appelle le service shell_command.pronote_get_data

Pour contourner le problème des modules python « pronotepy » et « pycryptodome-3.14.0.dist-info » qui n’existent pas dans le container Home Assistant, je les ai copié dans un répertoire : /config/python_scripts/local-packages.
Je les avais d’abord installé dans le container SSH. Il suffit de les copier depuis l’install Python de ce container, dans mon cas sur un PC /usr/lib/python3.9/site-packages/.

Il faut modifier le script Python pronote.py pour qu’il aille les chercher en ajoutant au tout début du fichier :

import sys
sys.path.append("/config/python_scripts/local-packages")

Sinon il doit y avoir moyen d’utiliser un Command Line Sensor qui permet de récupérer directement des données json renvoyées par la sortie du script sans passer par un fichier.

3 « J'aime »

Ok. Du bon chinois tout cela pour moi. Je vais attendre que cette intégration soit correctement Documentée dans GitHub avec une description plus détaillée de toute la partie script et python et je retenterai l’installation.

@Plouf34 : si je peux me permettre ce n’est pas tant une histoire de documentation car ceci n’est pas une intégration au sens propre
En pre-requis en effet il faut avoir quelques notions de Linux et de scripting en python

Il le sera très difficile de détailler la documentation sur des choses qui sont en dehors de HA et qui dépendent tellement de la configuration du serveur qui fait tourner HA et du type de HA (container, hassio, supervised…)

Bref, la solution serait de développer une véritable intégration !
Qui se lance ? Je peux donner un coup de main !

@defre : alors la bravo !:tada:
J’avais essayé de faire ça aussi mais sans succès
C’est d’ailleurs ce qui est expliqué dans la documentation de l’intégration python_script
(L’histoire de la copie des lib dans le dossier local_packages)
C’est une belle solution de contournement mais qui peut être encore plus complexe pour des néophytes il me semble - car copier les packages c’est pas simple
En tous les ça bravo !
Ça mériterait de détailler encore plus en détails commande après commande pour d’autres utilisateurs
Bravo encore !

Merci @Dathosim , mais surtout bravo pour ce script qui est vraiment très utile.

La copie d’un package est très simple. Il suffit de copier le répertoire du package.
Exemple pour pronotepy:

cp -R /usr/lib/python3.9/site-packages/pronotepy /config/python_scripts/local-packages/

Il faut ajuster le chemin des packages en fonction de la plateforme.

Afin de déterminer les packages nécessaires, j’étais d’abord passé par un shell script:

shell_command:
  pronote_get_data_bash: bash /config/scripts/pronote.sh

Et le script pronote.sh:

/usr/local/bin/python3 /config/python_scripts/pronote.py > /config/scripts/pronote.log 2>&1

Cela permet de récupérer les erreurs dans le log de home assistant en activant le niveau Debug. On voit alors pour qu’elle raison le script plante et le module manquant. On l’ajoute et on recommence jusqu’à ce que cela fonctionne. Dans mon cas il n’y avait que deux packages.

1 « J'aime »

j’ai résolu mon problème en mettant mon adresse exterieur dans la ligne ressource https://xxxx.duckdns.org:8123/config/www/pronote_lina.json
Merci beaucoup pour ce script!!
MAJ:
Finalement c’est pas bon : les sensors sont bien créés mais l’état est « unknown »

2 « J'aime »

as-tu essayé d’accéder à l’url de la ressource via ton navigateur ?
Il faut que ça te renvoie le json
Et à mon avis c’est /local/ et pas /config/www/
Ton HA est-il accessible aussi avec une ip local ? et sans https (en http) ?

1 « J'aime »

:+1: oui c’est bien ça! https://xxxx.duckdns.org:8123/local/pronote_lina.json cela fonctionne!!
Merci beaucoup

Hello ,
tout marche impeccable , merci pour vos retours @Dathosim et @DNT .
J’essaye de mettre en valeur certaines notes , notamment celle en dessous de la moyenne de classe afin d’identifier les axes de progrès cependant , j’ai un comportement bizarre … j’obtiens des mises en évidence mais qui correspondent pas a ma clause de if (notes entourées en bleu sur l’image) . Des idées ?

        <td width="25%">{%- if state_attr('sensor.edt_note', 'note')[loop.index-1]['note'] > state_attr('sensor.edt_note', 'note')[loop.index-1]['moyenne_classe'] -%}
        {{state_attr('sensor.edt_note', 'note')[loop.index-1]['note_sur']}}
        {%- else -%}
        <mark>{{state_attr('sensor.edt_note', 'note')[loop.index-1]['note_sur']}}</mark>
        {% endif %}</td>

Capture d’écran 2022-02-06 135359

Bonjour merci pour ce magnifique travail !
J’ai une erreur quand j’'execute le script :
J’ai testé avec le compte de ma fille (qui fonctionne quand je me connecte le site pronote) et avec les identifiants parent comme indiqué sur les posts précédents, est-ce que vous auriez une idée du problème svp ?

➜  ~ python3 /config/python_scripts/pronote.py
Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/pronotepy/pronoteAPI.py", line 261, in aes_decrypt
    return Padding.unpad(cipher.decrypt(data), 16)
  File "/usr/lib/python3.9/site-packages/Crypto/Util/Padding.py", line 92, in unpad
    raise ValueError("Padding is incorrect.")
ValueError: Padding is incorrect.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/config/python_scripts/pronote.py", line 20, in <module>
    client = pronotepy.Client('https://'+prefix_url+'.index-education.net/pronote/eleve.html?login=true', username, password)
  File "/usr/lib/python3.9/site-packages/pronotepy/clients.py", line 283, in __init__
    super().__init__(pronote_url, username, password, ent)
  File "/usr/lib/python3.9/site-packages/pronotepy/clients.py", line 78, in __init__
    self.logged_in = self._login()
  File "/usr/lib/python3.9/site-packages/pronotepy/clients.py", line 130, in _login
    dec = e.aes_decrypt(bytes.fromhex(challenge))
  File "/usr/lib/python3.9/site-packages/pronotepy/pronoteAPI.py", line 263, in aes_decrypt
    raise CryptoError('Decryption failed while trying to un pad. (probably bad decryption key/iv)')
pronotepy.exceptions.CryptoError: Decryption failed while trying to un pad. (probably bad decryption key/iv)

Merci

Pour info, j’ai testé au préalable le compte de démo et ça marche pas d’erreur en lançant le script mais dés que je change le prefix, le user et le mot de passe j’ai l’erreur ci-dessus

@Chris_Tophe : ça doit venir du fait que les attributs sont des chaines de caractères et pas des nombres réels :wink:
Il faut convertir en nombre pour les comparer

@umustseeit : je n’ai pas encore testé avec mes ID parents mais en effet on m’a remonté ce problème déjà…
Peux-tu bien vérifier tes id mot de passe et prefix en reconstituant l’url dans un navigateur
Et en saisissant à la main ce que tu as mis dans le code

Rappel le code fait ça :

client = pronotepy.Client('https://'+prefix_url+'.index-education.net/pronote/eleve.html?login=true', username, password)

Donc tu vois que pour l’instant le code n’est fait que pour des identifiant élève
Et je force login=true pour ne pas être redirigé sur le CAS (car dans mon cas à Paris, on a les ENT mais j’ai préféré me logger directement sur Pronote

Merci pour ton aide !
Alors j’ai tapé l’URL dans mon browser :
https://0911145a.index-education.net/pronote/eleve.html?login=true
et là j’ai tapé mon login et mdp mais il ne le reconnait pas

Par contre je suis bien sûr de mes identifiants :
car si je me connecte sur l’URL ci-dessous et que je vais dans l’appli pronote, mes identifiants fonctionnent, voir en PJ:

https://www.moncollege-ent.essonne.fr/

Je me demande si ce n’est pas parce que le mot de passe contient un caractère spécial mais il me semble que j’étais obligé de mettre un caractère spécial pour respecter la complexité du mot de passe.

Très bizarre, tu as déjà vu ce souci ?

on est bien d’accord c’est les même identifiants ? J’ai un gros doute là :thinking: