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

@sosordinet : Merci pour ton retour !
Bravo pour l’installation - c’est une bonne nouvelle pour ceux qui veulent aussi utiliser ce module :wink:
Par contre peux-tu détailler stp ce que tu entend pas « installer le script en ssh »
Est-ce que tu passes par un des 2 addons SSH de HA ?
Est-ce que tu accès par ailleurs avec un client SSH sur ton ordinateur à une commande SSH qui te donne accès au serveur en ligne de commande ?
Je ne sais pas vraiment ce qu’est HASSIO ?

Merci de ton retour

1 « J'aime »

Le script, tu le colles dans un fichier que tu créés sous:
/config/python_scripts/pronote.py

Après effectivement, avec l’addon « Ssh & Web Terminal » (l’autre est moins bien je pense), tu lances la commande :
python3 /config/python_scripts/pronote.py
et cela lancera le script tu as créé précédemment.
Cet addon te permettra effectivement de lancer des commandes sur la machine où est hébergée ton HA

HASSIO est une des versions de Home Assistant (qui, si je en dis pas de bêtises, a été remplacé par HA OS). Comme autres versions, tu as je crois : Home Assistant Container, Home Assistant Supervised ou Home Assistant Core.

1 « J'aime »

Bonjour ,
merci pour ce partage !!! ça fonctionne parfaitement pour moi .
Pouriez vous partager la config des markdown et sensors pour les notes et les devoirs ? Je n’ai pas reussi a les trouver dans le lovelace.yaml et configuration.yaml en exemple sur github .
merci par avance .

C’est copier coller de emploi du temps et changer les attributes pour notes et devoirs…

- platform: rest
    name: edt_note_demo 
    json_attributes:
      - note
    value_template: >
        {% if value_json.note.0 is defined %}
            {{ value_json.note.0.date_heure }}
        {% else %}
            None
        {% endif %}
    resource: http://192.168.XX.XX:8123/local/pronote_edt_demo.json```
1 « J'aime »

Merci @Dathosim pour la partage. Ça marche très bien.
Vous pouvez partager la partie notifications & réveil svp?

1 « J'aime »

Pour ma part après avoir installé le module pronotepy, je lance le script et j’ai l’erreur suivante :

chris@hass:/usr/share/hassio/homeassistant/python_script$ python3 pronote.py
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/dist-packages/pronotepy/pronoteAPI.py", line 261, in aes_decrypt
    return Padding.unpad(cipher.decrypt(data), 16)
  File "/usr/local/lib/python3.9/dist-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 "/usr/share/hassio/homeassistant/python_script/pronote.py", line 16, in <module>
    client = pronotepy.Client('https://'+prefix_url+'.index-education.net/pronote/eleve.html?login=true', username, password)
  File "/usr/local/lib/python3.9/dist-packages/pronotepy/clients.py", line 283, in __init__
    super().__init__(pronote_url, username, password, ent)
  File "/usr/local/lib/python3.9/dist-packages/pronotepy/clients.py", line 78, in __init__
    self.logged_in = self._login()
  File "/usr/local/lib/python3.9/dist-packages/pronotepy/clients.py", line 130, in _login
    dec = e.aes_decrypt(bytes.fromhex(challenge))
  File "/usr/local/lib/python3.9/dist-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)
chris@hass:/usr/share/hassio/homeassistant/python_script$

Une idée?

merci , je récupère désormais bien les notes dans le sensor sensor.edt_note visible dans l’onglet ‹ outils de développement › .

en revanche, j’ai essayé de les formater dans un tableau , et même avec quelque chose de minimum comme ceci , rien ne remonte

type: markdown
content: |-
  <div>Note</div>
  <table>
          {%-for attr in states.sensor.edt_note.attributes.edt_note -%}
          <tr style="background-color:#FF0000">
              <td>{{state_attr('sensor.edt_note', 'edt_note')[loop.index-1]['date']}}</td>
              <td>{{state_attr('sensor.edt_note', 'edt_note')[loop.index-1]['cours']}}</td>
              <td>{{state_attr('sensor.edt_note', 'edt_note')[loop.index-1]['note']}}</td>
              <td>{{state_attr('sensor.edt_note', 'edt_note')[loop.index-1]['sur']}}</td>
              <td>{{state_attr('sensor.edt_note', 'edt_note')[loop.index-1]['moyenne_classe']}}</td>           
          </tr>
          {% endfor %}
  </table>
card_mod:
  style:
    .: |
      ha-card ha-markdown {
        padding:0px
      }
      ha-card ha-markdown.no-header {
        padding:0px
      }
    ha-markdown:
      $:
        ha-markdown-element: |
          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; 
          }

identifiants parent?
(voir issue #3 GitHub)

Qu’entendez vous par installer le script par SSH?

Effectivement il s’agit des identifiants parents pour moi

Je galeree aussi avec les ‹ card-mod ›…
C’est plus facile avec le code (Lovelace.yaml) e après adapter.
Pour moi le tableau:

...
<table>
      <tbody>
          {%-for attr in states.sensor.pronote_note.attributes.note -%}
          <tr>
              <td>{{state_attr('sensor.pronote_note', 'note')[loop.index-1]['date_courte']}}</td>
              <td>{{state_attr('sensor.pronote_note', 'note')[loop.index-1]['cours']}}</td>
              <td width="25%">{{state_attr('sensor.pronote_note', 'note')[loop.index-1]['note_sur']}}</td>
              <td>(moy:{{state_attr('sensor.pronote_note', 'note')[loop.index-1]['moyenne_classe']}})</td>
          </tr>
          {% endfor %}
    </tbody>
  </table>
...```

Alors, il faut modifier comme ceci :

#Connection à Pronote
client = pronotepy.ParentClient('https://'+prefix_url+'.index-education.net/pronote/parent.html?login=true', username, password)

Je pense que ceci répond à ta question ?
https://forum.hacf.fr/t/pronote-dans-ha-les-notes-devoirs-et-emploi-du-temps-des-enfants/9120/43?u=elekrea

A priori c’est bon.
Ne pas oublier de lancer le script avec un sudo aussi

J’ai enfin pu créer les sensors.

En revanche lorsque je crée la carte elle est vide.

Le code de la carte emploi du temps aujourd’hui :

type: markdown
content: |-
  <div>Emploi du temps d'aujourd'hui </div>
  <table>
      <tbody>
          {%-for attr in states.sensor.edt_clara_aujourdhui.attributes.edt_aujourdhui -%}
          <tr style="background-color:#FF0000"><td>
              {%- if state_attr('sensor.edt_clara_aujourdhui', 'edt_aujourdhui')[loop.index-1]['annulation'] == false -%}
                  <mark>
                  {{state_attr('sensor.edt_clara_aujourdhui', 'edt_aujourdhui')[loop.index-1]['heure']}}
                  </mark>
              {%- else -%}
                  <span>
                  {{state_attr('sensor.edt_clara_aujourdhui', 'edt_aujourdhui')[loop.index-1]['heure']}}
                  </span>
              {% endif %}</td>
              <td>{{state_attr('sensor.edt_clara_aujourdhui', 'edt_aujourdhui')[loop.index-1]['heure_fin']}}</td>
              <td>
              {{state_attr('sensor.edt_clara_aujourdhui', 'edt_aujourdhui')[loop.index-1]['cours']}}
              {% if not state_attr('sensor.edt_clara_aujourdhui', 'edt_aujourdhui')[loop.index-1]['status'] == None %}<span>{{state_attr('sensor.edt_clara_aujourdhui', 'edt_aujourdhui')[loop.index-1]['status']}}</span>
              {% endif %}</td>
              <td>{{state_attr('sensor.edt_clara_aujourdhui', 'edt_aujourdhui')[loop.index-1]['salle']}}</td>
          </tr>
          {% endfor %}
    </tbody>
  </table>
card_mod:
  style:
    .: |
      ha-card ha-markdown {
        padding:0px
      }
      ha-card ha-markdown.no-header {
        padding:0px
      }
    ha-markdown:
      $:
        ha-markdown-element: |
          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:5px;
          } caption {
              text-align: center;
              font-weight: bold;
              font-size: 1.2em;
          } td {
              padding: 5px 10px 5px 10px;
              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: 5px;
              padding: 5px;
          }
          span {
              background: #EC4B34;
              color: #222627;
              border-radius: 5px;
              padding: 5px;
          }
          span {
              padding: 5px;
          }
          tr:nth-child(n+2) > td:nth-child(2) {
            text-align: left;
          }

et le sensor associé :

edt_aujourdhui:
  - id: 3120A11774D175
    date_heure: 04/02/2022, 10:37
    date: 04/02/2022
    heure: '10:37'
    heure_fin: '11:30'
    cours: MATHEMATIQUES
    salle: B11
    annulation: false
    status: null
    background_color: '#E73A1F'
  - id: 3105B21474D1EC
    date_heure: 04/02/2022, 11:34
    date: 04/02/2022
    heure: '11:34'
    heure_fin: '12:27'
    cours: DEVOIRS FAITS & ACCOMPAGNEMENT
    salle: null
    annulation: false
    status: null
    background_color: '#C0C0C0'
  - id: 31BB8B1774D1A9
    date_heure: 04/02/2022, 13:48
    date: 04/02/2022
    heure: '13:48'
    heure_fin: '14:54'
    cours: ANGLAIS LV1
    salle: B15
    annulation: false
    status: null
    background_color: '#4576BA'
  - id: 311AF31774D132
    date_heure: 04/02/2022, 15:12
    date: 04/02/2022
    heure: '15:12'
    heure_fin: '16:04'
    cours: ESPAGNOL LV2
    salle: B18
    annulation: false
    status: null
    background_color: '#6974B6'
friendly_name: edt_aujourdhui_clara

Je m’auto répond le nom du sensor était pas bon. Quel boulet. C’est ça le copié coller

Je suis comme toi, j’ai bien le fichier json qui se crée dans le répertoire www mais aucun sensor après avoir complété les lignes de configuration.yaml:

  - platform: rest
    name: edt_aujourdhui_lina 
    scan_interval: 10
    json_attributes:
      - edt_aujourdhui
    value_template: >
        {% if value_json.edt_aujourdhui.0 is defined %}
            {{ value_json.edt_aujourdhui.0.date_heure }}
        {% else %}
            None
        {% endif %}
    resource: http://192.168.31.20:8123/local/pronote_edt_lina.json

J’ai procédé comme cela:
J’ai installé l’addon « ssh & web terminal » avec les commandes supplémentaires qu’@elkrea a donné. J’ai ensuite tapé cette ligne : pip 3 install pronotepy puis celle-ci : python3 /config/python_scripts/pronote.py
Je n’ai rien fait pour le « crontab » c’est peut être mon erreur
Je passe également par duckdns
Je tourne en rond depuis hier :thinking:

C’est l’adresse local de ton HA qu’il faut renseigner :
resource: http://192.168.X.X:8123//pronote_edt_demo.json

As-tu redémarré ton HA après la création des Sensors ?
As-tu regardé le journal des logs HA, il y a peut être un indice de ce côté là ?
As-tu bien fait attention à la fin de la ligne « resource », d’avoir renseigner le bon nom du .json ?
Je ne pense pas qu’il y ait de rapport avec Duckdns, j’y suis aussi et cela n’a pas posé de problème.

Moi de mon côté, c’est justement du côté du « crontab » que je bloque. Pour le moement, obligé de relancer la commande Python à la main pour que cela se mette à jour.
J’ai fait crontab -e pour modifier mon crontab.
J’ai ajouté :
*/0 * * * * /usr/bin/python3 /usr/share/hassio/homeassistant/python_scripts/pronote.py > /tmp/pronote.log 2>&1
Mais rien ne se passe… J’ai loupé un truc ? @Dathosim , une idée ?
Merci d’avance.

@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: