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

Attends quelques jours, on va s’y remettre. Normalement Pronote activé de mon côté dans la semaine. A bientot

Pas de probléme, on va attendre les retours de la rentré :slight_smile: Merci pour le retour

Hello à tous chers parents d’élèves ! :wave:

Je ré-apparais après quelques mois de coupure, je ne vous ai pas oubliés, soyez rassurés !
J’ai eu pas mal de changements (positifs !) dans ma vie pro et ma vie perso, donc j’ai préféré concentrer mon temps et mon énergie là-dessus :slight_smile:

Je vais essayer de rattraper mon retard rapidement sur les messages et retours qu’on m’a laissés et continuer à faire évoluer l’intégration et les cartes !

Bonne rentrée à vous et vos bambins (et même aux plus grands, c’était la rentrée au lycée pour le plus grand ici, ça met une petite claque :joy: )

9 « J'aime »

Salut à tous,
Le collège de ma fille vient de relancer pronote qu’ils avaient suspendu pendant les vacances afin de faire des modifs. Sur le web ou application c’est ok par contre pas sur HA, j’ai ça:


J’ai relancer pronote et HA sans succes

Hello,

Est-ce que tu as essayé de supprimer puis ré-ajouter la config ?

J’ai eu ça ce matin, recharger l’intégration a suffit. Tout est reparti comme en 14.

Salut,
supprimer et c’est reparti!!

1 « J'aime »

Merci @delphiki !

Première rentrée au lycée ici aussi !

1 « J'aime »

Hello,

Pour la connexion au lycée, alors que tout fonctionne bien depuis le client mobile Pronote ainsi que l’application web, je n’arrive pas à configurer l’intégration. J’ai essayé avec la méthode qrcode comme identifiants sans succès. Voici ce que je trouve dans les logs :

Enregistreur: aiohttp.server
Source: /usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py:433
S'est produit pour la première fois: 22:42:56 (2 occurrences)
Dernier enregistrement: 22:52:39

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 462, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 537, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 210, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 85, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 242, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 32, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 81, in with_admin
    return await func(self, request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 222, in post
    return await super().post(request, flow_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 74, in wrapper
    return await method(view, request, data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 122, in post
    result = await self._flow_mgr.async_configure(flow_id, data)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 366, in async_configure
    result = await self._async_configure(flow_id, user_input)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 413, in _async_configure
    result = await self._async_handle_step(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 516, in _async_handle_step
    result: _FlowResultT = await getattr(flow, method)(user_input)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/pronote/config_flow.py", line 134, in async_step_qr_code_login
    client = await self.hass.async_add_executor_job(get_client_from_qr_code, user_input)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/pronote/pronote_helper.py", line 52, in get_client_from_qr_code
    client = (pronotepy.ParentClient if data['account_type'] == 'parent' else pronotepy.Client).qrcode_login(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pronotepy/clients.py", line 146, in qrcode_login
    return cls(url, login, jeton, mode="qr_code", uuid=uuid)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pronotepy/clients.py", line 768, in __init__
    super().__init__(pronote_url, username, password, ent, mode, uuid)
  File "/usr/local/lib/python3.12/site-packages/pronotepy/clients.py", line 406, in __init__
    super().__init__(pronote_url, username, password, ent, mode, uuid)
  File "/usr/local/lib/python3.12/site-packages/pronotepy/clients.py", line 106, in __init__
    self.logged_in = self._login()
                     ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pronotepy/clients.py", line 259, in _login
    self, self.parametres_utilisateur["donneesSec"]["donnees"]["ressource"]
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
KeyError: 'ressource'

Voici un aperçu de mon json :

{"avecPageConnexion":false,"jeton":"MASQUE","login":"MASQUE","url":"https://0951710t.index-education.net/pronote/mobile.parent.html"}

Quelqu’un en Ile de France a-t’il/elle pu tester ?

Merci.

Matt.

Souci aussi de mon côté.
Le scan du QR code fonctionne sur l’application mobile PRONOTE.
PS : Si les chiffres au début de l’URL correspondent à un établissement, j’ai le même que toi :slight_smile:
Camille Claudel

EDIT : J’ai essayé avec le compte PARENT en QRCODE ou en identifiant, ça ne fonctionnait pas.
Je viens d’essayer avec le compte ELEVE (avec les identifiants) et ça a fonctionné directement.

Hello,

Pour les soucis de login, je regarder pour mettre à jour la version de pronotepy utilisée par l’intégration, j’ai vu qu’il y avait eu des correctifs.

D’ailleurs pronotepy n’intégrera plus de nouveautés, uniquement des correctifs de bugs.

Sinon, j’ai sorti hier soir un petit fix pour la carte des devoirs dans le cas où il n’y a pas de devoirs : la version 1.6.2

4 « J'aime »

Merci pour ton aide !!!

Bonjour à tous.
Parmi les retours de rentrée :

  1. tout fonctionne à nouveau, c’est génial
  2. effectivement j’ai dû supprimer mes 2 enfants et les ajouter à nouveau (méthode QR code parents) probablement dû à des modifs de l’admin Pronote chez nous.
  3. la configuration du surnom ne semble pas mieux fonctionner chez moi que l’an dernier ou alors je n’ai pas bien compris son rôle : je croyais que ça renommer les entités mais ce n’est pas le cas (j’ai donc dû reparamétrer mes automatisations, capteurs et sources de données dans les cartes lovelace). Par contre, dans lovelace, les surnoms sont bien pris en compte (c’est peut-être l’unique objectif).

Encore merci aux auteurs, l’usage de cette intégration est fantastique !!!

1 « J'aime »

Le surnom ne sert en effet que pour de l’affichage, ça ne modifie pas le nom des entités :slight_smile:

1 « J'aime »

Bonjour,

Suite à l’intégration de Pronote je souhaite créer les cards comme suivie sur le tuto.

J’ai un message d’erreur dans le code .

type: horizontal-stack
columns: 1
square: false
cards:
  - type: vertical-stack
    cards:
      - type: markdown
        content: >-
          {% set items =
          state_attr('sensor.pronote_xx_coralie_timetable_today','lessons')
          %} <div>Emploi du temps du : {{as_timestamp(items[0].start_at) | int |
          timestamp_custom('%d/%m/%Y', true)}} </div>

          <table>   {% for i in range(0, items | count, 1) %}  <tr> 
            {%- if items[i].canceled != True -%} 
            <td><mark>{{ items[i].start_time}}</td> 
            <td><mark>{{ items[i].end_time }}</td></mark>
            <td>{{ items[i].lesson }}
          {% else %} <td><del>{{ items[i].start_time }}</td> <td><del>{{
          items[i].end_time}}</td> <td><del>{{ items[i].lesson }}</del>&emsp;{%-
          endif -%} {% if items[i].status != None %} <span> {{ items[i].status
          }}</td> {% endif %} <td> {{items[i].classroom }}</td> </tr> {% endfor
          %} </table> 
        card_mod:
          style:
            .: |
              ha-card ha-markdown {
                padding:0px
              }
              ha-card ha-markdown.no-header {
                padding:10px
              }
            ha-markdown$: |
              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-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;
              }
      - type: markdown
        content: >-
          {% set items =
          state_attr('sensor.pronote_xx_coralie_timetable_next_day','lessons')
          %} <div>Emploi du temps du : {{as_timestamp(items[0].start_at) | int |
          timestamp_custom('%d/%m/%Y', true)}} </div>

          <table>   {% for i in range(0, items | count, 1) %}  <tr> 
            {%- if items[i].canceled != True -%} 
            <td><mark>{{ items[i].start_time}}</td> 
            <td><mark>{{ items[i].end_time }}</td></mark>
            <td>{{ items[i].lesson }}
          {% else %} <td><del>{{ items[i].start_time }}</td> <td><del>{{
          items[i].end_time}}</td> <td><del>{{ items[i].lesson }}</del>&emsp;{%-
          endif -%} {% if items[i].status != None %} <span> {{ items[i].status
          }}</td> {% endif %} <td> {{items[i].classroom }}</td> </tr> {% endfor
          %} </table> 
        card_mod:
          style:
            .: |
              ha-card ha-markdown {
                padding:0px
              }
              ha-card ha-markdown.no-header {
                padding:10px
              }
            ha-markdown$: |
              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-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;
              }
      - type: markdown
        content: |-
          <div>Devoirs</div>
          <table>
              <tbody>
                  {% set items = state_attr('sensor.pronote_xx_coralie_homework','homework') %}
                  {%-for i in range(0, items | count, 1) -%}
                  <tr>
                      <td>
                      {%- if items[i].done == true -%}
                          <mark>
                          {{items[i].date.strftime("%d/%m")}}
                          </mark>
                      {%- else -%}
                          <span>
                          {{items[i].date.strftime("%d/%m")}}
                          </span>
                      {% endif %}</td>              
                      <td>{{items[i].subject}}</td>
                      <td>{{items[i].description}}</td>
                  </tr>
                  {% endfor %}
            </tbody>
          </table>
        card_mod:
          style:
            .: |
              ha-card ha-markdown {
                padding:0px
              }
              ha-card ha-markdown.no-header {
                padding:10px
              }
            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-weight:normal;
                font-size:1.2em;
                font-family: Roboto;
                width: auto;
                outline: 0px solid #393c3d;
                margin-top: 10px;
              } 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: 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;
              }
      - type: markdown
        content: >-
          <div>Absences</div><table> 

          {% set items =
          state_attr('sensor.pronote_xx_coralie_absences','absences') %}

          {% for i in range(0, items | count, 1) %}

          <tr>

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

          <td> <mark> {{ items[i].from.strftime("%d-%m") }}</mark></td>

          {% else %}

          <td> <span>{{ items[i].from.strftime("%d-%m") }}</span></td> 

          {%- endif -%} 

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

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

          {% endfor %}
        card_mod:
          style:
            .: |
              ha-card ha-markdown {
                padding:0px
              }
              ha-card ha-markdown.no-header {
                padding:10px
              }
            ha-markdown$: |
              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-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;
              }
      - type: custom:auto-entities
        card:
          type: entities
        filter:
          include:
            - entity_id: binary_sensor.ouvrable_aujourd_hui
            - entity_id: binary_sensor.ouvrable_demain
            - entity_id: binary_sensor.vacances_scolaires_aujourdhui
            - entity_id: binary_sensor.vacances_scolaires_demain
            - entity_id: sensor.debut_des_cours_de_coralie_aujourd_hui
            - entity_id: sensor.debut_des_cours_de_coralie_demain
            - entity_id: sensor.coralie_next_alarm
      - type: custom:auto-entities
        card:
          type: entities
        filter:
          include:
            - entity_id: sensor.derniere_mise_a_jour_de_pronote
  - type: vertical-stack
    cards:
      - type: markdown
        content: >-
          <div>Evaluations</div> {% set items =
          state_attr('sensor.pronote_xx_coralie_evaluations','evaluations')%}
          <table width='100%'>
            <tbody>
            {% for i in range(0, items | count, 1) %}
            <tr><td width='10%'>{{ items[i].date.strftime("%d-%m") }}</td><td width='60%'>{{ items[i].subject }}</td><td width='30%'>
            {% set acquisitions = items[i].acquisitions %}
            {% for j in range(0,acquisitions|count,1) %}{% if acquisitions[j].level == 'Très bonne maîtrise' %}💚{% elif acquisitions[j].level == 'Maîtrise satisfaisante' %}🟢{% elif acquisitions[j].level == "Début de maîtrise" %}🟡{% elif acquisitions[j].level == 'Maîtrise fragile'  %}🟡{% elif acquisitions[j].level == 'Maîtrise insuffisante'  %}🟠{% else %}?{% endif %}{% endfor %}</td></tr>
            {% endfor %}
          </tbody> </table>
        card_mod:
          style:
            .: |
              ha-card ha-markdown {
                padding:0px
              }
              ha-card ha-markdown.no-header {
                padding:10px
              }
            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-weight:normal;
                font-size:1.2em;
                font-family: Roboto;
                width: auto;
                outline: 0px solid #393c3d;
                margin-top: 10px;
              } caption {
                  text-align: center;
                  font-weight: bold;
                  font-size: 1.2em;
              } td {
                  padding: 0px 5px 0px 5px;
                  text-align: left;
                  border-bottom: 0px solid #1c2020;
              }
              tr {
                  border-bottom: 0px solid #1c2020;
                  line-height: 4px;
              }
              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;
              }

Voici une capture.
image

Merci de votre aide.

Hello @goran1410,

Le plus simple est d’utiliser les cartes déjà faites : GitHub - delphiki/lovelace-pronote: Lovelace cards for the Pronote integration :slight_smile:

hello, et merci encore pour ces cartes. Penses tu créer celles des retards? Elle doit ressembler a peu de choses pres a celles des absences

Salut Juste au cas ou j’avais récupéré cette carte custom sur les retards (bien sur à adapter avec tes sensors , ça marchait bien l’année dernières , j’ai pas encore eu de retards sur ma fille cette année :-)):

##Retards Lina
     - type: vertical-stack
       cards:
        - type: "custom:button-card"
          template: card_title
          name: Retards de Lina
        - type: markdown
          content: >-
              {% if state_attr('sensor.pronote_lucchini_Lina_delays', 'delays')[0] is
              defined %} <table> 
                <tr>
                <td><h4>Date</td>
                <td><h4>Min.</td>
                <td><h4>Justification/Raison</td>
                </tr>
                {% set items = state_attr('sensor.pronote_lucchini_Lina_delays','delays')
              %}
            
              {% for i in range(0, items | count, 1) %}
            
              <tr>
            
              {%- if items[i].justified == True -%}
            
              <td> <mark> {{ items[i].date.strftime("%d-%m") }}</mark></td>
            
              {% else %}
            
              <td> <span>{{ items[i].date.strftime("%d-%m") }}</span></td> 
            
              {%- endif -%} 
            
              <td>{{ items[i].minutes }}</td>
            
              <td>({{ items[i].justification }}){{ items[i].reasons }} {% endfor %}   {%
              else %}Pas de retard ce Trimestre {% endif %}
          title: Retards
          card_mod:
          style:
                .: |
                  ha-card ha-markdown {
                            padding:0px
                            border-top: 1px groove var(--divider-color);
                            overflow-y: scroll;
                            height: 100px;
                          }
                  ha-card ha-markdown.no-header {
                    padding:0px
                  }
                $: |
                  h1.card-header {
                    background-color:rgb(100, 100, 100);
                      padding: 0px 0px 0px 12px !important;
                      color: white !important;
                      font-weight: normal;
                      font-size: 1.5em !important;
                      border-top-left-radius: 5px; 
                      border-top-right-radius: 5px; 
                      height: 100%;
                  }        
                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: 10px;
                  } 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:last-of-type {
                      border-bottom: transparent;
                  }
                  tr:nth-of-type(even) {
                      background-color: rgb(54, 54, 54, 0.3);
                  }
                  mark {
                      background: lightgreen;
                      border-color: green;
                      border-radius: 10px;
                      padding: 5px;
                  }
                  span {
                      background: orange;
                      color: #222627;
                      border-radius: 5px;
                      padding: 5px;
                  }
                  tr:nth-child(n+2) > td:nth-child(2) {
                    text-align: left;
                  }

MErci, mais cela ne match pas niveau charte avec les autres cartes

Oui ce n’est pas une carte de Delphiki mais c’est une carte d’absence quand même :wink: