GAZPAR/GRDF - MetersToHA compatible exigence CAPTCHA

Selon certains « forums » il faut redémarrer HA, mais je pense qu’il suffit de suivre la démarche suivante. La récupération/mise à jour de la liste demande peut-être un peu de patience.

Le dépôt à ajouter:

Ensuite: Rechercher les mises à jour à partir du menu à 3 points:

image

Puis recharger la page des add-ons (peut-être plusieurs fois si la mise à jour prend du temps).

Ensuite ceci devrait apparaître dans la « Boutique des modules complémentaires »:

sans le trait blue car il faudra l’activer pour cela.

1 « J'aime »

Effectivement un rechargement rapide a fait apparaître l’option. Y a plus qu’à s’y jeter :+1::heart:

Bonjour,
naufragé des superbes addons Gazpar en début d’année, j’ai tenté hier soir l’alternative metersToHA. Ceci étant, je ne suis pas sûr du process d’installation, car la doc n’évoque pas (encore) l’installation via les modules complémentaires.
C’est ce que j’ai fait, configuration via le module, mais doit-on forcément installer AppDaemon pour utiliser le module ? J’avoue être un peu confus entre la configuration en .json (qui semble requis pour appdaemon), et directement par le module (qui se lance bien, mais s’arrête au bout d’un moment). D’avance merci !

J’ai le gazpar depuis decembre 2021 et un esp32 installé 2mn après la pose.

Donc, soit en sans fil :

  • le zigbee avec une porté de 10m max environ,
  • soit il y a le réseau lora (reseau sans fil bas débit longue porté utilisé pour iot, c’est gratuit) couplé à un arduino ultralowpower (qui se reveille à chaque impulsion du gazpar),

En filaire :

  • tirer une alimentation à maxi 3m du gazpar pour y mettre un ESP32/ESPHome pour du wifi.
  • amplifier le signal du contact gazpar (opto, diode etc) pour de la longue distance
1 « J'aime »

Pour le sans-fil, n’importe quelle ‹ bouton › wifi/zigbee/rf433 peut le faire, il faut juste souder les fils dans le bouton et recuperer les impulses dans HA

Oui, il peut, mais avec les contraintes qui vont avec chacune des technologies.
Portée, autonomie perturbations/pollution/interférences

Logique/clair mais souvent pas d’option de tirer des cables. J’ai mon rf433 à 20m et ça marche bien. zigbee/wifi impossible pour ce distance

Effectivement, je dois encore en toucher un mot. EDIT: c’est fait - d’ailleurs, on peut aussi contribuer à la doc.

Je pense que la procédure suivante permets d’ajouter le Add-on facilement.

Un clic sur le bouton suivant va vous ouvrir une page de redirection de HA.

Ouvrir votre instance Home Assistant et afficher la page de configuration du add-on.

Ensuite un click sur le crayon (si c’est la première fois) pour mettre votre domaine (enregistré en local):

image

Après cela cliquer sur « Open Link ».

Ensuite dans Home Assistant j’ai cliqué « Confirmer » et été redirigé vers:

Ensuite, cliquer « Installer »:

image

Après cela, dans « Configuration », définir les champs nécessaires et puis démarrer le Add-On. Vérifier dans l’onglet Journal de l’Add-on le démarrage.

image

Quand il y a une ligne similaire à la suivante, l’Add-on a bien démarré. Dans le journal il y a aussi les informations de configuration que vous pouvez vérifier.

{"message":"API running."}"./haevent2exec.py" --config-json "//m2h_config.json" --external-program "//execEvent.sh" --log-level="debug"  call_veolia call_grdf

Merci, j’ai créé l’automatisme mais le module plante toujours après lancement.

Voici le log

 DISPLAY:'10.33.2.69'
EVENT CONF:grdf:call_grdf
Generated script '//execEvent.sh':
#!/bin/bash
#!/usr/bin/with-contenv bashio
{
TARGET_OPT=""
[[ "$1" == "call_veolia" ]] && TARGET_OPT=--veolia
[[ "$1" == "call_grdf" ]] && TARGET_OPT=--grdf
[[ "$TARGET_OPT" == "" ]] && ( echo "Unrecognized event '$1'" ; exit 1 )
date
echo "python3  MetersToHA/apps/meters_to_ha/meters_to_ha.py  -l /config --screenshot --keep-output -c \"//m2h_config.json\" $TARGET_OPT -r"
python3  MetersToHA/apps/meters_to_ha/meters_to_ha.py  -l /config --screenshot --keep-output -c "//m2h_config.json" $TARGET_OPT -r
echo "Done $(date)"
} >> "/config/m2h_exec.log" 2>&1
Test access to Home Assistant API (should show '{"message":"API running."}'
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service base-addon-log-level: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service base-addon-log-level successfully stopped
s6-rc: info: service base-addon-banner: stopping
s6-rc: info: service base-addon-banner successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped

Je suppose que la commande curl qui vérifie si l’API de HA est accessible pose un problème quelconque.

Pour en savoir plus, j’ai évolué MetersToHA afin de donner plus d’informations quand le « Niveau de débogue » est défini à « debug ».

J’obtiens dans ma trace:

Test access to Home Assistant API (should show '{"message":"API running."}'
curl -H 'Authorization: Bearer 7409665ec18XXXXXXXXXXXXXXXX8865' -H 'Content-Type: application/json' http://supervisor/core/api/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    26  100    26    0     0   3799      0 --:--:-- --:--:-- --:--:--  4333
{"message":"API running."}
"./haevent2exec.py" --config-json "//m2h_config.json" --external-program "//execEvent.sh" --log-level="debug"  call_veolia call_grdf

Quand il y a une erreur pour curl on devrait le voir désormais. J’espère que cela permet d’en savoir plus.

D’ailleurs la commande curl est visible dans la trace et peut être copié/collé dans le terminal ssh de home assistant s’il est disponible.

OK j’ai trouvé la source de l’erreur.
Dans la configuration du module, j’ai bien précisé « h t t p://homeassistant.local:8123 » comme serveur (et il apparaît bien ainsi, sans les espaces que j’ai rajouté car impossible de poster une URL ici)
Sauf que dans le log j’ai :

  "ha_server": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIxMDM5NjEyMTI4OTg0N2QzYTFjNzJkOTI2ZTFmZWEwMSIsImlhdCI6MTY5NjI3NjQ4NCwiZXhwIjoyMDExNjM2NDg0fQ.Sotosq-zzwZurgbgPmjpIVseUwgPFBaip5h-9LAWEhI",

Et de fait, cette adresse n’arrive pas à être résolue, ce qui arrête le processus.

Après vérification, ce champ est mon token. Dans le log, apparaît dans la configuration sur le champ token une entrée totalement inconnue, mais il me semble que le bug vient de là → ha_server ne tient pas compte de l’URL renseignée, mais après avoir effacé et modifié l’adresse.

J’ai apporté une correction. Avec le Add-on 99% des utilisateurs n’ont pas besoin de remplir le ha_server ni le ha_token, j’ai également apporté quelques indications aux descriptions des arguments.

Effectivement en retirant ces deux champs, ça marche merci !
EDIT:
En réalité, j’ai l’impression que la relève GRDF ne va pas jusqu’au bout. J’ai donc un token captchaai, le mois gratuit, et voici ce que j’ai dans service.log

2023-10-05 21:43:55,151 : WW : Connexion au site GRDF Traceback (most recent call last): -   File "//MetersToHA/apps/meters_to_ha/meters_to_ha.py", line 3144, in doWork -     gazpar_file = crawler.get_gazpar_file() -                   ^^^^^^^^^^^^^^^^^^^^^^^^^ -   File "//MetersToHA/apps/meters_to_ha/meters_to_ha.py", line 1576, in get_gazpar_file -     self.__browser.get(self.__class__.site_grdf_url) -   File "/usr/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 353, in get -     self.execute(Command.GET, {"url": url}) -   File "/usr/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 344, in execute -     self.error_handler.check_response(response) -   File "/usr/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response -     raise exception_class(message, screen, stacktrace) - selenium.common.exceptions.WebDriverException: Message: unknown error: session deleted because of page crash - from unknown error: cannot determine loading status - from tab crashed -   (Session info: headless chrome=117.0.5938.62) -
2023-10-05 21:43:55,183 : WW :  Encountered error -> Retrying once
2023-10-05 21:43:55,294 : EE :  Message: invalid session id

Je viens de voir ce message car je viens annoncer que j’ai approté une modification à l’appel API vers GRDF - je n’avais pas de données de puis quelques jours.
J’ai dû ajouter un paramètre - c’est passé. (J’ai aussi détecté une autre incompatibilité lié à undetected-chromedriver pour ceux qui l’utilisent - j’ai apporté un contournement - c’est lié à une mise à jour fin septembre de selenium).

Dans le cas de l’add-on il suffira de relancer normalement - sinon il faut mettre à jour MetersToHA.

EDIT : résolu avec un rédémarrage total du système.

J’ai maintenant ceci

2023-10-07 10:05:45,545 : ~~ :  Captchaai Service response OK|03AFcWeA444WKhzDHTvpOq3-QME_uik7ZLdfMQOrw-ODHyLmRks_cHpRAYzUkjZj3TTDcTJmCrzE6UePt30UeIc7kI2HWlEmvaMR34rlplY48w4bIjGEd-JAL_Z4yiAvALAGCGUD6P3CMXpNeIlNa6pqsMV2OOX9J6MEalV__sOwM-Q7GQX-6T3_s0DAoNXPROMCu9J44wUZMzaQ8rRF3Lz0TRmCtuCw6tFwHYx6FXSOmrevc60X0dVURWKjBloDFyuDRMdPMydYxcilciXaN-C-yNME5tUz_jMGKBX-HBQrAx7QV2YEoOdH51O3jlyr1HIwtSd0kCMFdARjIfwXcsARbyIw-A7L3Ctn3wDp9Vn2YV9h9Io_YBOQK5l09vyBcWTy9pYDzYoKOwdcW03qZvUJWES1Qh6XkboFtfHgoLcT3cAUy-UDRXrx8zFtIxpGvVS2vniZm6A3OksNiU1OqlGL184fPthUcYtxy9s_ab8ZvKsbC1gNippCcFqzdBO-G5t587cb9X-IYaGRIBLmOJaIZpqT8bqapTr3M8KlUdxUwkcHjxxvSUZmVQfNehexS9nydEmognwivLoTHkHoWuurL4QcZQ3xytX1yrNhUOMJeHlGDr_4G4q7StA8M_mKBUlt6VmLwecfAhQJXX3nEn2PDTBSz6_ochag
2023-10-07 10:05:53,766 : OK : Automatic resolution succeeded. Grab & Save '/config/screen_before_connection.png'. Wait for Button xpath://input[@value='Connexion']. 
2023-10-07 10:05:53,787 : ~~ : Wait before clicking (1.6s). 
2023-10-07 10:09:06,207 : WW : Click on connexionGet Data URL https://monespace.grdf.fr/api/e-conso/pce/consommation/informatives?dateDebut=2023-09-23&dateFin=2023-10-07&frequence=Journalier&pceList[]=<PCE> . Get Data Content. <pre> Element not found. This may be due to an issue with the captcha resolution. Check the log for other errors and check your captcha solver configuration Traceback (most recent call last): -   File "//MetersToHA/apps/meters_to_ha/meters_to_ha.py", line 3151, in doWork -     gazpar_file = crawler.get_gazpar_file() -                   ^^^^^^^^^^^^^^^^^^^^^^^^^ -   File "//MetersToHA/apps/meters_to_ha/meters_to_ha.py", line 1755, in get_gazpar_file -     raise Exception("No content") - Exception: No content
2023-10-07 10:09:06,264 : WW :  Encountered error -> Retrying once
2023-10-07 10:10:50,971 : OK : Connexion au site GRDF 
2023-10-07 10:11:22,237 : EE : Waiting for Password Message: failed, page timeout (timeout=30)
2023-10-07 10:11:23,252 : OK : Close Browser 
2023-10-07 10:11:23,331 : OK : Close Display 
2023-10-07 10:11:23,333 : EE :  Ended with error : // re-run the program with '--debug' option

Le PNG sauvegardé est

– message original –

Bonjour, merci. Après la mise à jour, j’ai maintenant :

2023-10-07 06:23:23,482 : OK : Try starting Chromium. Start virtual display (Chromium). 
2023-10-07 06:24:59,429 : EE : Start the browser Message: chrome not reachable
2023-10-07 06:24:59,478 : OK : Close Browser 
2023-10-07 06:24:59,505 : OK : Close Display 
2023-10-07 06:24:59,506 : EE :  Ended with error : // re-run the program with '--debug' option

(HA sur rpi3)

Bonne info - la capture d’écran suggère que le problème de fond c’est le popup d’acceptation des cookies… Chose que je n’ai pas observé de mon côté (je n’ai pas vérifié la capture lors du plantage, j’ai vérifié l’appel API).

Je vais tenter d’ajouter une vérification/tentative de clic, mais je ne pourrai pas le tester.

Bon, j’ai changé de solveur de captcha, le png est bien l’image de connexion (plus de problème de cookies). Je pense avoir trouvé la source de l’erreur, que j’ai à nouveau.
Je me suis connecté à mon compte GRDF, et ai copié/collé cette adresse citée dans le log https://monespace.grdf.fr/api/e-conso/pce/consommation/informatives?dateDebut=2023-09-23&dateFin=2023-10-07&frequence=Journalier&pceList[]=<PCE>
ça ne donne rien. J’ai remplacé par mon numéro de PCE et là j’ai bien un retour.

Extrait du log :

2023-10-07 14:43:24,791 : OK : Click on connexion 
2023-10-07 14:45:44,449 : EE : End of wait after connexion. Get Data URL https://monespace.grdf.fr/api/e-conso/pce/consommation/informatives?dateDebut=2023-09-23&dateFin=2023-10-07&frequence=Journalier&pceList[]=<PCE> . Get Data Content. <pre> Element not found. This may be due to an issue with the captcha resolution. Check the log for other errors and check your captcha solver configuration No content
2023-10-07 14:45:45,051 : OK : Close Browser 
2023-10-07 14:45:45,244 : OK : Close Display 

Après vérification du code, ce popup est traité dans le code

Il y a deux essais, le premier devrait donner qqchse comme ceci:

2023-02-20 20:00:40,108 : OK : Start the browser
2023-02-20 20:00:43,620 : OK : Waiting for cookie popup
2023-02-20 20:00:43,688 : OK : Click on deny
2023-02-20 20:00:43,912 : OK : Connexion au site GRDF
2023-02-20 20:00:43,946 : OK : Waiting for Password
2023-02-20 20:00:43,999 : OK : Waiting for Email

C’est aussi le premier essai qui m’intéresse le plus car l’erreur du 2ième est moins pertinent puor ce type de problème, donc ce qui m’intéresse c’est ce qui se passe avant « Encountered error → Retrying once ».

« Click on deny » apparait quand le popup est détecté et qu’un clic sur le refus est effectué.

Toutefois, c’est la trace que j’ai mis ci-dessu et une trace de début d’année et je n’ai pas ce clic de mon côté, et je n’obtiens pas ce popup.

Effectivement, dans la trace le script cache le vrai PCE à cet endroit par «  ». Ailleurs dans le script il y a "grdf_pce" = "2154..." - est-ce que c’est bien le même numéro là (pas d’espaces, etc)?