Intégration Ecole Directe (version 0.2.5)

Hello @Giga77,

Bon millésime cette 0.0.10 :
Affichage des notes ok (via carte proposée plus haut) mais KO via carte pronote.
Uniquement les plus récentes en décroissant, mais c’est deja bien.

Les devoirs font leur apparition avec un sensor qui me semble correctement rempli, mais KO via carte pronote et suis bien trop limité pour en fabriquer un :slight_smile:

Ca progresse pas mal !

Les notes de la version Alpha 0.0.10 fonctionnent très bien:

2 « J'aime »

Nouvelle version béta v0.1.0 :partying_face: :tada:
Vu que ça commence à ressembler à quelque chose, passage en béta :crazy_face:

Pour la compatibilité avec les cartes pronotes, j’ai modifié les noms des sensors.
Donc pour cette version, je vous conseille de désinstaller/supprimer l’intégration et d’installer la nouvelle version.
Faite des screenshots pour que je vois à quoi ça ressemble, ou envoyez moi les bugs :rofl:

Et voilà, la carte adaptée à cette nouvelle version:

type: custom:flex-table-card
title: Note Ecole Directe
strict: true
sort_by:
  - date-
columns:
  - name: Date
    data: grades
    modify: |
      x.date
    id: date
    align: left
  - name: Notes
    align: center
    data: grades
    modify: >
      if ( x.valeur.length === 0 && parseInt(x.noteSur) == 0 )
        ''
      else if ( parseFloat(x.valeur) >= parseFloat(x.moyenneClasse) )
        '<div style="color:#139523;">' + x.valeur +  ' / ' + x.noteSur + '&nbsp;</div>'
      else if ( parseFloat(x.valeur) <= 8 )
        '<div style="color:#E70B0B;">' + x.valeur +  ' / ' + x.noteSur + '&nbsp;</div>'
      else if (( parseFloat(x.valeur) + (parseFloat(2))) >=
      parseFloat(x.moyenneClasse))
        '<div style="color:#6fd442;">' + x.valeur +  ' / ' + x.noteSur + '&nbsp;</div>'
      else
        '<div style="color:#ff8200;">' + x.valeur +  " / " + x.noteSur + '&nbsp;</div>'
  - name: Moyenne
    align: center
    data: grades
    modify: |
      x.moyenneClasse
  - name: devoir
    align: center
    data: grades
    modify: x.devoir
  - name: libelleMatiere
    align: center
    data: grades
    modify: x.libelleMatiere
entities:
  include: sensor.ecole_directe_xxxx_yyyy_grades
card_mod:
  style: |
    tbody tr:hover {
      background-color: coral !important;
    }
css:
  table+: 'border-collapse: collapse; padding: 1px;'
  th+: 'border: 1px solid white; padding: 3px;'
  td+: 'border: 1px solid white; padding: 3px;'

Les données sont déjà dans les attributs, mais il faut voir comment les extraire.

Merci,

Si on veut réutiliser le dashboard pronote ( Pronote2Homeassistant/lovelace.yaml at main · dathosim/Pronote2Homeassistant · GitHub )

Il faut faire le jeux des 7 differences :

  • la partie « devoir » qui était :
<div>Devoirs</div>
<table>
    <tbody>
        {%-for attr in states.sensor.pronote_devoir_demo.attributes.devoir -%}
        <tr>
            <td>
            {%- if state_attr('sensor.pronote_devoir_demo', 'devoir')[loop.index-1]['done'] == true -%}
                <mark>
                {{state_attr('sensor.pronote_devoir_demo', 'devoir')[loop.index-1]['date']}}
                </mark>
            {%- else -%}
                <span>
                {{state_attr('sensor.pronote_devoir_demo', 'devoir')[loop.index-1]['date']}}
                </span>
            {% endif %}</td>              
            <td>{{state_attr('sensor.pronote_devoir_demo', 'devoir')[loop.index-1]['title']}}</td>
            <td>{{state_attr('sensor.pronote_devoir_demo', 'devoir')[loop.index-1]['description']}}</td>
        </tr>
        {% endfor %}
  </tbody>
</table>

devient

<div>Devoirs</div>
<table>
    <tbody>
        {%-for attr in states.sensor.ecole_directe_prenom_nom_homework.attributes.homework -%}
        <tr>
            <td>
            {%- if state_attr('sensor.ecole_directe_prenom_nom_homework', 'homework')[loop.index-1]['done'] == true -%}
                <mark>
                {{state_attr('sensor.ecole_directe_prenom_nom_homework', 'homework')[loop.index-1]['date']}}
                </mark>
            {%- else -%}
                <span>
                {{state_attr('sensor.ecole_directe_prenom_nom_homework', 'homework')[loop.index-1]['date']}}
                </span>
            {% endif %}</td>              
            <td>{{state_attr('sensor.ecole_directe_prenom_nom_homework', 'homework')[loop.index-1]['subject']}}</td>
            <td>{{state_attr('sensor.ecole_directe_prenom_nom_homework', 'homework')[loop.index-1]['description']}}</td>
        </tr>
        {% endfor %}
  </tbody>
</table>
  • et pour la partie notes :
<div>Notes</div>
<table>
    <tbody>
        {%-for attr in states.sensor.pronote_note_demo.attributes.note -%}
        <tr>
            <td>{{state_attr('sensor.pronote_note_demo', 'note')[loop.index-1]['date_courte']}}</td>
            <td>{{state_attr('sensor.pronote_note_demo', 'note')[loop.index-1]['cours']}}</td>
            <td width="25%">{{state_attr('sensor.pronote_note_demo', 'note')[loop.index-1]['note_sur']}}</td>
            <td>(moy:{{state_attr('sensor.pronote_note_demo', 'note')[loop.index-1]['moyenne_classe']}})</td>
        </tr>
        {% endfor %}
  </tbody>
</table>

devient

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

avec ce résultat (j’ai tronqué la hauteur) :

je pense que je préfère l’affichage avec custom:flex-table-card , …

:stuck_out_tongue_closed_eyes: je me suis basé sur ces cartes pronotes : GitHub - delphiki/lovelace-pronote: Lovelace cards for the Pronote integration
Normalement, il ya juste besoin de configurer la carte sans toucher au code

Effectivement ça semble bien mieux ces « vrais » cartes (j’ai « bêtement » suivi le lien du sujet pronote : Pronote dans HA - les notes, devoirs, absences et emploi du temps des enfants mais celle-ci semble obsolete )

par contre, les 2 cartes type: custom:pronote-homework-card , type: custom:pronote-grades-card sont vides (mais sans erreur)

ecole_direct_dashboard pronote2

Je sais pas trop comment d’où vient le souci et comment faire pour debugger ces parties-là , …

Dans la console de web delelopper de firefox , j’ai ce message d’erreur en boucle quand je suis sur le dashboard pronote :

13:03:40.804 Uncaught (in promise) TypeError: this.hass.states[e] is undefined
    getCardHeader pronote.js:104
    render pronote.js:123
    update lit-element.ts:160
    performUpdate reactive-element.ts:1329
    scheduleUpdate reactive-element.ts:1261
    _$Ej reactive-element.ts:1233
    requestUpdate reactive-element.ts:1208
    set reactive-element.ts:726
    value hui-view.ts:190
    value hui-view.ts:188
    performUpdate reactive-element.ts:1329
    scheduleUpdate reactive-element.ts:1261
    _$Ej reactive-element.ts:1233
    requestUpdate reactive-element.ts:1208
    set reactive-element.ts:726
    value hui-root.ts:512
    _$AE reactive-element.ts:1378
    performUpdate reactive-element.ts:1343
    scheduleUpdate reactive-element.ts:1261
    _$Ej reactive-element.ts:1233
    requestUpdate reactive-element.ts:1208
    set reactive-element.ts:726
    j lit-html.ts:1883
    _$AI lit-html.ts:1825
    v lit-html.ts:1192
    g lit-html.ts:1540
    _$AI lit-html.ts:1384
    z lit-html.ts:2183
    update lit-element.ts:165
    performUpdate reactive-element.ts:1329
    scheduleUpdate reactive-element.ts:1261
    _$Ej reactive-element.ts:1233
    requestUpdate reactive-element.ts:1208
    set reactive-element.ts:726
    value partial-panel-resolver.ts:101
    value hass-router-page.ts:91
    performUpdate reactive-element.ts:1329
    scheduleUpdate reactive-element.ts:1261
    _$Ej reactive-element.ts:1233
    requestUpdate reactive-element.ts:1208

Donc il semble que l’erreur est Uncaught (in promise) TypeError: this.hass.states[e] is undefined

T’as bien désinstaller Ecole directe ?

Sinon tu dois renommer ton capteur avec ce format :
ecole_directe_penom_nom

image

Le plus simple, ç’est de désinstaller pour être sûr qu’il n’y a plus de capteurs.

@Giga77
dans ton code plus haut, tu as laissé dans le sensor :
sensor.ecole_directe_notesXXXX_YYYY

j’ai mis celui là pour que ca fonctionne :
sensor.ecole_directe_XXXX_YYYY_grades

ç’est corrigé
Merci!

Super initiative :+1:
Je vais tester.

Les serveurs api d’ecole directe sont dans les choux ce matin (même pour l’utiliser avec le site web https://www.ecoledirecte.com

sur la page web, j’ai des

Erreur
Votre connexion Internet semble être hors ligne. La mise à jour des données peut ne pas aboutir.

et des

Erreur
Http failure response for https://api.ecoledirecte.com/v3/groupesFlexibles.awp?verbe=get&idEleve=2233&v=4.53.2: 503 OK

idéalement, si c’est possible, on devrait garder les anciennes valeurs/status si le serveur ne répond pas bien , …

Mar 27 10:08:05 pi hass[224514]: 2024-03-27 10:08:05.851 ERROR (MainThread) [homeassistant.config_entries] Error setting up entry Roumano for ecole_directe
Mar 27 10:08:05 pi hass[224514]: Traceback (most recent call last):
Mar 27 10:08:05 pi hass[224514]:   File "/opt/homeassistant/lib/python3.12/site-packages/homeassistant/config_entries.py", line 504, in async_setup
Mar 27 10:08:05 pi hass[224514]:     result = await component.async_setup_entry(hass, self)
Mar 27 10:08:05 pi hass[224514]:              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Mar 27 10:08:05 pi hass[224514]:   File "/opt/homeassistant/.homeassistant/custom_components/ecole_directe/__init__.py", line 26, in async_setup_entry
Mar 27 10:08:05 pi hass[224514]:     await coordinator.async_config_entry_first_refresh()
Mar 27 10:08:05 pi hass[224514]:   File "/opt/homeassistant/lib/python3.12/site-packages/homeassistant/helpers/update_coordinator.py", line 283, in async_config_entry_first_refresh
Mar 27 10:08:05 pi hass[224514]:     await self._async_refresh(
Mar 27 10:08:05 pi hass[224514]:   File "/opt/homeassistant/lib/python3.12/site-packages/homeassistant/helpers/update_coordinator.py", line 460, in _async_refresh
Mar 27 10:08:05 pi hass[224514]:     await super()._async_refresh(
Mar 27 10:08:05 pi hass[224514]:   File "/opt/homeassistant/lib/python3.12/site-packages/homeassistant/helpers/update_coordinator.py", line 318, in _async_refresh
Mar 27 10:08:05 pi hass[224514]:     self.data = await self._async_update_data()
Mar 27 10:08:05 pi hass[224514]:                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Mar 27 10:08:05 pi hass[224514]:   File "/opt/homeassistant/.homeassistant/custom_components/ecole_directe/coordinator.py", line 87, in _async_update_data
Mar 27 10:08:05 pi hass[224514]:     homeworks_json = await self.hass.async_add_executor_job(
Mar 27 10:08:05 pi hass[224514]:                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Mar 27 10:08:05 pi hass[224514]: asyncio.exceptions.CancelledError

Effectivement, t’as raison.
Nouvelle version v0.1.2-beta

Hello,
Juste pour te remercier !
0.1.2 installé.
Devoirs OK
Notes OK
Cartes pronote ok !

on a moyen de se faire un sensor sur nouvelles notes ou truc du genre ?

1 « J'aime »

Hello,

tout est ok chez moi, Notes + devoirs
au top
merci

1 « J'aime »

:thinking: un sensor ? non
Une notification, oui!

Rajoute cette nouvelle automatisation :

alias: Ecole Directe - notification nouvelle note
description: >-
  Notification en cas de nouvelle note sur Ecole Directe
trigger:
  - platform: event
    event_type: ecole_directe_event
    event_data:
      type: new_grade
action:
  - service: notify.xxxxxxxxxxxx
    data:
      message: >-
        {{ trigger.event.data.data.subject }} : {{
        trigger.event.data.data.grade_out_of }} ({{
        trigger.event.data.data.comment }})
      title: Nouvelle note pour {{ trigger.event.data.child_name }}

Et dis moi si ça fonctionne, car je ne peux pas la tester moi-même :crazy_face:

1 « J'aime »

Pour l’automatisation de la note, il y a juste le notify.xxxxx à changer ?

Tout à fait :slight_smile:

2 « J'aime »

C’est installé, je te tiens au courant du fonctionnement :+1:

1 « J'aime »

Comment transformer la date en format français: 2024-03-26 ==> 26/03/2024 ?

type: custom:flex-table-card
title: Notes Ecole Directe
strict: true
sort_by:
  - date-
columns:
  - name: Date
    data: grades
    modify: x.date
    id: date
    align: left