cyr-ius / hass-livebox-component

Livebox Component for Home assistant
MIT License
52 stars 21 forks source link

Fix building diagnostics data #89

Closed brenard closed 5 months ago

brenard commented 6 months ago

I see you publish this new feature and I tested it on my dev environment. Their was some mistakes about the name of API methods which I first corrected (api.ddns.* vs api.dyndns.*, api.profile.* vs api.profiles.*, ...), but their was also errors about async methods not await (and api_raw was empty), so I reworked on the method to build api_raw.

After, I was able to download a diagnostics JSON file, but it's taken around 30 seconds to build it and its size was approximately 50MB. I noticed that it was mostly due to 3 called methods, so I commented them. Now, the file is generated in 4 seconds and its size is approximately 1.3MB.

Furthermore, many methods always failed, so I firstly put the produced exception in the diagnostics file and I commented them (with exception). I think we could at least remove some of them that required arguments.

Please let me know what you think.

cyr-ius commented 6 months ago

Awesome. Afterwards I put a large part of the type GET APIs but I was well aware that some require params that I did not pass

Afterwards I slipped this into the Home Assistant addon but it is mainly used to have a test set for the aiosysbus API.

if behind you have the possibility to post a diagnostic file. I can to code a whole section of tests in aiosysbus.

We could thus code aiosysbus asynchronously. this will be more efficient by using the Epenet's PR. I never merged because I no longer have livebox and there are a lot of people who use the addon. I never took the risk.

cyr-ius commented 6 months ago

Je viens voir que tu étais Francais. Donc si tu es chaud pour tester aiosysbus en mode asynchrone. Je suis preneur.

brenard commented 6 months ago

Awesome. Afterwards I put a large part of the type GET APIs but I was well aware that some require params that I did not pass

Afterwards I slipped this into the Home Assistant addon but it is mainly used to have a test set for the aiosysbus API.

Effectivement, c'est un peu trop verbeux et détaillé actuellement au vu des fonctionnalités aujourd'hui proposées par l'intégration. À mon sens, tout ce qui est dans api_raw pourrait en réalité est supprimé, car ce qui est dans les données du coordinator (data) est déjà très complet. On pourrait cependant y conserver les méthodes utilisées (indirectement) par le coordinator pour mettre à jour ses données, histoire d'avoir quand même les données brutes à ce niveau.

if behind you have the possibility to post a diagnostic file. I can to code a whole section of tests in aiosysbus.

J'ai pris le temps de regarder ce qu'il y avait dans le fichier et j'ai fait en sorte de passer le api_raw dans async_redact_data et j'ai ajouté la réécriture du mot de passe Wifi récupéré en clair par la méthode api.connection.get_lan_MIBS. Même comme ça, ça reste un peu intrusif, donc je préférais ne pas te le partager publiquement. En outre, pas de souci pour te l'envoyer directement. Je ne trouve pas ton mail dans ton profil github, mais le mien y est : peux-tu m'envoyer un mail que je te renvoie le fichier en retour ?

We could thus code aiosysbus asynchronously. this will be more efficient by using the Epenet's PR. I never merged because I no longer have livebox and there are a lot of people who use the addon. I never took the risk.

Pas de souci. Si j'ai bien compris, ton idée est à terme d'écrire un jeu de tests unitaires. Si tel est le cas, j'imagine que tu chercheras à mocker l'API de la livebox et dans ce cas, si tu utilises et publie les données que je te fournis, merci de prendre le temps de les offusquer en détails, je pense notamment à tout ce qui est adresses IP (notamment v6, par définition routées depuis le net, mais v4 idéalement aussi), adresses MAC, nom de périphériques, ... N'hésite pas à me partager ton code avant publication si c'est plus simple pour toi, je m'occuperai de l'offuscation.

cyr-ius commented 6 months ago

Awesome. Afterwards I put a large part of the type GET APIs but I was well aware that some require params that I did not pass Afterwards I slipped this into the Home Assistant addon but it is mainly used to have a test set for the aiosysbus API.

Effectivement, c'est un peu trop verbeux et détaillé actuellement au vu des fonctionnalités aujourd'hui proposées par l'intégration. À mon sens, tout ce qui est dans api_raw pourrait en réalité est supprimé, car ce qui est dans les données du coordinator (data) est déjà très complet. On pourrait cependant y conserver les méthodes utilisées (indirectement) par le coordinator pour mettre à jour ses données, histoire d'avoir quand même les données brutes à ce niveau.

if behind you have the possibility to post a diagnostic file. I can to code a whole section of tests in aiosysbus.

J'ai pris le temps de regarder ce qu'il y avait dans le fichier et j'ai fait en sorte de passer le api_raw dans async_redact_data et j'ai ajouté la réécriture du mot de passe Wifi récupéré en clair par la méthode api.connection.get_lan_MIBS. Même comme ça, ça reste un peu intrusif, donc je préférais ne pas te le partager publiquement. En outre, pas de souci pour te l'envoyer directement. Je ne trouve pas ton mail dans ton profil github, mais le mien y est : peux-tu m'envoyer un mail que je te renvoie le fichier en retour ?

We could thus code aiosysbus asynchronously. this will be more efficient by using the Epenet's PR. I never merged because I no longer have livebox and there are a lot of people who use the addon. I never took the risk.

Pas de souci. Si j'ai bien compris, ton idée est à terme d'écrire un jeu de tests unitaires. Si tel est le cas, j'imagine que tu chercheras à mocker l'API de la livebox et dans ce cas, si tu utilises et publie les données que je te fournis, merci de prendre le temps de les offusquer en détails, je pense notamment à tout ce qui est adresses IP (notamment v6, par définition routées depuis le net, mais v4 idéalement aussi), adresses MAC, nom de périphériques, ... N'hésite pas à me partager ton code avant publication si c'est plus simple pour toi, je m'occuperai de l'offuscation.

C'est exactement ça , je mock l'api aiosysbus à partir de tes données. Bien sur on offusque tout le fichie des données sensibles.

cyr-ius commented 6 months ago

Du coup, je te propose qu'on bascule nos échanges sur le repo aiosysbus. https://github.com/cyr-ius/aiosysbus/issues/39

De là , je fais une nouvelle branche que j'appel asyncio , je prépare l'api en mode asynchrone et un fichier example complet.

Ensuite , il te suffirait de lancer un python3.11 dans un venv , de faire un pip -r requirements.txt et de jouer le fichier example.py Si il ne plante pas. On est bon , on a une API opérationnelle. On pourrait ainsi l'utiliser dans l'addon Livebox de Home Assistant

cyr-ius commented 5 months ago

@brenard , je viens de publier la version 2.0.0-beta en se basant sur la refonte du module aiosysbus que vous avez fait avec @epenet Si tu souhaites tester cette version. Y a plus qu à activer le mode Beta de HACS Comme d' hab , n ayant pas de continue livebox , j ai pas pu mocker les appels . J ai bouchonné quuelques appels. Mais un tour complet de test est nécessaire

cyr-ius commented 5 months ago

J ai garder le vieux fichier de diagnostic.py. Et si le retour est positif, je verrais à faire une seconde refonte par une class Entity qui chapotte les class des sensors car on a pas mal de répétitions de code sur les init

cyr-ius commented 5 months ago

Voir la issue #93 pour tracer les feedbacks

brenard commented 5 months ago

Désolé, j'étais sur d'autres devs en ce moment, je viens seulement de tester (cf. #93). À ce sujet, je viens de voir que le diag était HS en version 2.0.7 :

2024-01-20 13:49:49.189 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aiohttp/web_app.py", line 543, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/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 85, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 100, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 28, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 80, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 233, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 31, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 149, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/diagnostics/__init__.py", line 249, in get
    data = await info.config_entry_diagnostics(hass, config_entry)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/livebox/diagnostics.py", line 104, in async_get_config_entry_diagnostics
    coordinator.api.system.async_get_remoteaccess,
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'System' object has no attribute 'async_get_remoteaccess

Je regarde ça plus tard.

cyr-ius commented 5 months ago

async_get_remoteaccess n'existe pas dans aiosysbus. On a du se rater quand on a testé. J'ai commenté l'appel :async_get_remoteaccess

brenard commented 5 months ago

async_get_remoteaccess n'existe pas dans aiosysbus. On a du se rater quand on a testé. J'ai commenté l'appel :async_get_remoteaccess

Pour moi, c'est async_get_remoteauth qui a pris sa place et qui appel une méthode côté Livebox qui n'existe pas (Remoteauth.get vs RemoteAccess.get). De mon côté, j'ai fais des tests en renomant tout remoteauth en remoteaccess (comme avant) et les méthodes fonctionnent correctement. C'est également ce que je retrouve dans la doc de l'api dans le projet LiveboxMonitor.

brenard commented 5 months ago

async_get_remoteaccess n'existe pas dans aiosysbus. On a du se rater quand on a testé. J'ai commenté l'appel :async_get_remoteaccess

Pour moi, c'est async_get_remoteauth qui a pris sa place et qui appel une méthode côté Livebox qui n'existe pas (Remoteauth.get vs RemoteAccess.get). De mon côté, j'ai fais des tests en renomant tout remoteauth en remoteaccess (comme avant) et les méthodes fonctionnent correctement. C'est également ce que je retrouve dans la doc de l'api dans le projet LiveboxMonitor.

J'ai oublié de te faire une PR à ce sujet tout à l'heure, mais je tâcherai de te faire ça demain.