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

Hello,

Tu dois être dans le même cas que beaucoup de personnes : ton enfant n’a qu’une note pour le trimestre 2, ce qui fait que seule cette note apparaît.

J’étudie les pistes pour pouvoir remonter les notes de tous les trimestres. :wink:

Cette partie là est un peu plus compliquée que prévue, j’avais déjà un peu regarder, ça ne sera pas si simple que ça (même si ce n’est pas un non catégorique) :wink:

1 « J'aime »

Salut,J’ai une erreur dans les logs

  File "/config/custom_components/pronote/sensor.py", line 187, in extra_state_attributes
    lunch_break_time = datetime.strptime(
                       ~~~~~~~~~~~~~~~~~^
        self.coordinator.config_entry.options.get(
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        "%H:%M",
        ^^^^^^^^
    ).time()
    ^
  File "/usr/local/lib/python3.13/_strptime.py", line 573, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
                                    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/_strptime.py", line 352, in _strptime
    raise ValueError("time data %r does not match format %r" %
                     (data_string, format))
ValueError: time data '11h30' does not match format '%H:%M'

Le format de l’heure que tu as dû configurer pour l’heure du repas n’est pas bonne, tu as mis 11h30, alors qu’il faut mettre 11:30 :wink:

1 « J'aime »

Après vérification, c’est en effet la réponse. Début de trimestre, c’est ok. C’est donc pas un problème de remontée d’info. Merci

Bonjour
Quand j’ajoute une card, je n’ai pas les labels des options, ce n’est pas très pratique pour configurer tout ça :slight_smile:
Il y a une astuce pour les avoir ?
Dans le code source le label est vide

Merci pour votre aide

J’ai déjà eu ce souci effectivement, mais un refresh a suffit pour les faire ré-apparaitre :thinking:

Ah ben oui, ça fonctionne.
J’avais pourtant essayé sur un autre navigateur en mode privé mais sans succès
Désolé pour le dérangement !

Pas de souci, il doit quand même y avoir un petit bug quelque part, mais je ne sais pas si ça vient des cartes ou de HA :man_shrugging:

Hello !

Je viens de publier une version bêta, la version 1.16.0-dev, concernant des potentiels correctifs pour les fuites mémoire.
J’ai besoin de testeurs pour avoir des retours sur cette version.

Chez moi la baisse de consommation est notable, mais vu que ça tombe également pendant les vacances, possible que ça joue également…

J’installe cette beta de suite !!!

1 « J'aime »

Salut, comment tu vois les fuites de mémoires?
Histoire que je compare.

Tu peux installer l’intégration System Monitor :wink:

Bonjour
j’ai un soucis de connexion à Pronote depuis l’intégration depuis quelques jours.
j’ai tenté avec le QRcode et avec l’url
ent = hdf
url= https://pronote_0601799e.apps-etab.ac-amiens.fr/ et https://pronote_0601799e.apps-etab.ac-amiens.fr/parent.html? testé

voici les logs de ha avec test depuis le QRcode
il semble y avoir un problème de certificat.
est ce que quelqu’un aurait le même souci ?
ps: je me connecte correctement à pronote hors HA
merci d’avance

Enregistreur: aiohttp.server
Source: /usr/local/lib/python3.13/site-packages/aiohttp/web_protocol.py:451
S'est produit pour la première fois: 09:03:30 (2 occurrences)
Dernier enregistrement: 09:38:47

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/urllib3/connectionpool.py", line 716, in urlopen
    httplib_response = self._make_request(
        conn,
    ...<5 lines>...
        chunked=chunked,
    )
  File "/usr/local/lib/python3.13/site-packages/urllib3/connectionpool.py", line 404, in _make_request
    self._validate_conn(conn)
    ~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/usr/local/lib/python3.13/site-packages/urllib3/connectionpool.py", line 1061, in _validate_conn
    conn.connect()
    ~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/urllib3/connection.py", line 419, in connect
    self.sock = ssl_wrap_socket(
                ~~~~~~~~~~~~~~~^
        sock=conn,
        ^^^^^^^^^^
    ...<8 lines>...
        tls_in_tls=tls_in_tls,
        ^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/urllib3/util/ssl_.py", line 458, in ssl_wrap_socket
    ssl_sock = _ssl_wrap_socket_impl(
        sock, context, tls_in_tls, server_hostname=server_hostname
    )
  File "/usr/local/lib/python3.13/site-packages/urllib3/util/ssl_.py", line 502, in _ssl_wrap_socket_impl
    return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/ssl.py", line 455, in wrap_socket
    return self.sslsocket_class._create(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        sock=sock,
        ^^^^^^^^^^
    ...<5 lines>...
        session=session
        ^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/ssl.py", line 1076, in _create
    self.do_handshake()
    ~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/ssl.py", line 1372, in do_handshake
    self._sslobj.do_handshake()
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1020)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/requests/adapters.py", line 667, in send
    resp = conn.urlopen(
        method=request.method,
    ...<9 lines>...
        chunked=chunked,
    )
  File "/usr/local/lib/python3.13/site-packages/urllib3/connectionpool.py", line 802, in urlopen
    retries = retries.increment(
        method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
    )
  File "/usr/local/lib/python3.13/site-packages/urllib3/util/retry.py", line 594, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='pronote_0601799e.apps-etab.ac-amiens.fr', port=443): Max retries exceeded with url: /mobile.parent.html?fd=1&bydlg=A6ABB224-12DD-4E31-AD3E-8A39A1C2C335&login=true (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1020)')))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/aiohttp/web_protocol.py", line 480, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/aiohttp/web_app.py", line 569, in _handle
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/aiohttp/web_middlewares.py", line 117, 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 83, 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 86, 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 367, in async_configure
    result = await self._async_configure(flow_id, user_input)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 414, in _async_configure
    result = await self._async_handle_step(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        flow, cur_step["step_id"], user_input
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 517, in _async_handle_step
    result: _FlowResultT = await getattr(flow, method)(user_input)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/pronote/config_flow.py", line 159, 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.13/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/pronote/pronote_helper.py", line 82, in get_client_from_qr_code
    client = (pronotepy.ParentClient if data['account_type'] == 'parent' else pronotepy.Client).qrcode_login(
        qr_code=qr_code_json,
    ...<4 lines>...
        device_name=data.get('device_name', None)
    )
  File "/usr/local/lib/python3.13/site-packages/pronotepy/clients.py", line 216, in qrcode_login
    client = cls(
        urlunparse(fixed_url),
    ...<6 lines>...
        device_name=device_name,
    )
  File "/usr/local/lib/python3.13/site-packages/pronotepy/clients.py", line 987, in __init__
    super().__init__(
    ~~~~~~~~~~~~~~~~^
        pronote_url,
        ^^^^^^^^^^^^
    ...<7 lines>...
        device_name,
        ^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/pronotepy/clients.py", line 121, in __init__
    self.attributes, self.func_options = self.communication.initialise(
                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        self.client_identifier
        ^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/pronotepy/pronoteAPI.py", line 69, in initialise
    get_response = self.session.request(
        "GET",
        f"{self.root_site}/{self.html_page}",
        cookies=self.cookies,
    )
  File "/usr/local/lib/python3.13/site-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.13/site-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.13/site-packages/requests/adapters.py", line 698, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='pronote_0601799e.apps-etab.ac-amiens.fr', port=443): Max retries exceeded with url: /mobile.parent.html?fd=1&bydlg=A6ABB224-12DD-4E31-AD3E-8A39A1C2C335&login=true (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1020)')))

Bonjour,

Depuis quelques jours, j’ai les comptes qui sautent, et le seul moyen est de remettre le QR Code.

Voici l’erreur dans l’intégration : Failed setup, will retry: (‹ Decryption failed while trying to un pad. (probably bad decryption key/iv) ›, ‹ exception happened during login → probably bad username/password/ ›)

Et voici le log :

This error originated from a custom integration.

Logger: custom_components.pronote.coordinator
Source: helpers/update_coordinator.py:379
integration: Pronote (documentation, issues)
First occurred: 9:14:02 AM (6 occurrences)
Last logged: 9:14:21 AM

Unexpected error fetching ******* Mary (via compte parent) data
Unexpected error fetching ******* Tom (via compte parent) data
Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/pronotepy/pronoteAPI.py", line 325, in aes_decrypt
    return Padding.unpad(cipher.decrypt(data), 16)
           ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/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 "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 379, in _async_refresh
    self.data = await self._async_update_data()
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/pronote/coordinator.py", line 113, in _async_update_data
    client = await self.hass.async_add_executor_job(get_pronote_client, config_data)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/config/custom_components/pronote/pronote_helper.py", line 40, in get_pronote_client
    return get_client_from_qr_code(data)
  File "/config/custom_components/pronote/pronote_helper.py", line 129, in get_client_from_qr_code
    ).token_login(
      ~~~~~~~~~~~^
        pronote_url=qr_code_url,
        ^^^^^^^^^^^^^^^^^^^^^^^^
    ...<5 lines>...
        client_identifier=qr_code_client_identifier,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/pronotepy/clients.py", line 268, in token_login
    return cls(
        pronote_url,
    ...<6 lines>...
        device_name=device_name,
    )
  File "/usr/local/lib/python3.13/site-packages/pronotepy/clients.py", line 987, in __init__
    super().__init__(
    ~~~~~~~~~~~~~~~~^
        pronote_url,
        ^^^^^^^^^^^^
    ...<7 lines>...
        device_name,
        ^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/pronotepy/clients.py", line 151, in __init__
    self.logged_in = self._login()
                     ~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/pronotepy/clients.py", line 333, in _login
    dec = e.aes_decrypt(bytes.fromhex(challenge))
  File "/usr/local/lib/python3.13/site-packages/pronotepy/pronoteAPI.py", line 327, 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)', 'exception happened during login -> probably bad username/password')

Je précise que le login et le mot de passe est bon car si je refais le process d’initialisation, tout est ok

Merci

Hello, ca me fait pareil depuis la rentrée de septembre. C’est vrai que c’est chiant car obligé de passer par le pc pour remettre le QRCode… Au début des vacances, j’ai reconfigurer le compte en passant par mot de passe (le seul avantage est qu’il n’y a pas besoin du pc pour le qrCode). Pour le moment ça n’a pas sauté mais je pense pas qu’il y ait un lien

Je n’arrive plus à configurer le compte en utilisant le mot de passe et je ne sais pas pourquoi. J’ai mis le bon ENT (monbureaunumerique) la bonne URL (je présume), je suis également sur de mes identifiants.
Si quelqu’un a une idée, je la prends volontiers !

Est-ce le site est bien disponible ? Il était en rade chez moi cette semaine

Ouais il est up, j’y ai accès depuis le PC

Voici ce que donne le log :

2025-01-01 16:24:06.998 DEBUG (SyncWorker_7) [pronotepy.ent.generic_func] [ENT https://cas.monbureaunumerique.fr/login?selection=EDU&service=https://example.com/] Logging in with xxxxxxxxxxxx
2025-01-01 16:24:07.113 CRITICAL (SyncWorker_7) [custom_components.pronote.pronote_helper] Connection failure

le service=https://example.com/ me paraît étrange…