Récupération des informations de consommation d'eau sur portail fournisseur

Bonjour à tous,

Est-ce que quelqu’un aurait avancé sur ce type de projet?
J’ai déjà regardé le plugin là: GitHub - tetienne/veolia-custom-component: Home Assistant custom component to retrieve information from Veolia
mais rien de nouveau depuis 2 ans et comme dit plus haut, il existe plusieurs layout chez chaque veolia régionaux.
Pour ma part, à la souris, on peut soit avoir un CSV, Excel, ou direct sur le site avec un beau tableau html tout simple sans offuscation de code.
Autant je peux faire un pandas.read_html() sur ledit tableau et faire un peu ce que je veux même avec mechanize pour entrer mon login password (bon ça reste pas évident, mais ça va), mais je me vois pas faire une intégration HA. Je saurais même pas par ou commencer.

Avant de sortir le bazzoka et faire de l’assembleur, il n’y aurait pas une sorte de meta-intégration en hacs qui par exemple ferait ceci:

  1. demande url ou mettre le couple login password
  2. navigue jusqu’à une url donnée une fois authentification faite
  3. prend le premier tableau venu, ou le premier CSV à disposition et le transforme en données utilisables

la plupart du temps c’est des données genre IoT avec une liste timestamp, valeur.
Franchement rares sont les sites ou utiliser selenium est indispensable

Je suis sur que ca couvrirait déjà 50% des besoins pour n’importe quel noob qui serait seul à utiliser un truc super particulier d’un fournisseur encore plus particulier, c’est pas beaucoup, mais c’est tj mieux que rien du tout

Quand je vois des projets de fous qui font encore mieux que les appli des plus grands noms (Samsung Xiaomi, etc), je suis un peu pantois de voir que le plus simple comme lire un csv n’est pas accessible au néophyte

QQ’un aurait une piste de travail concrète et simple?

Salut,

Je n’ai pas du tout avancé sur le sujet. Pas le temps de me poser tranquillement pour y réfléchir et plein d’autres trucs à gérer au quotidien…

Malgré tout, je t’invite à faire quelques tests pour comprendre par toi même que c’est pas aussi simple que 3 clics que tu fais à la souris pour récupérer un fichier CSV… Entre les évolutions du site d’un jour à l’autre sans prévenir (modification des liens, du noms des champs, modèles régionaux avec différentes versions…), des mécanismes qui visent volontairement à empêcher l’automatisation (pas d’api, token, captcha …) et la présentation des données qui n’est pas simple (les timestamps tout ça, ça n’existe dans ce cas précis), il y a de quoi passer quelques soirées bien occupées ! Et je mets volontairement tous les autres aspects lié à l’intégration dans HA.
Quant à l’application Veolia, c’est pareil : teste là… Elle n’apporte rien

Je ne sais pas trop comment je dois prendre ce message :shushing_face: mais tu te doutes bien que si c’était concret et simple ça serait déjà disponible. Je peux déjà t’affirmer qu’un bout de code en assembleur ne sera pas la solution.

Je pense que tu as compris l’inverse de ce que je voulais dire.
Et forcément je ne demandais à personne de travailler, clairement pas.
Relis bien stp pour pas rester sur une mauvaise interprétation, limite tu me fais culpabiliser

Par contre: HA c’est rédhibitoire pour faire des choses simples, de plus en plus de gens bidouillent en python, à part, en dehors de HA, et justement, dans le cas qui nous intéresse, y’a certains sites véolia qui sont plus simples (donc pas le tien, qui apparemment demande des captcha)

D’ou la fameuse question: si y’avait un truc fait par HA de « générique », qui prémâche les trucs les plus simples, plein de petits codeurs du dimanche comme moi pourraient p’être proposer des choses pour justement ceux qui ne savent pas coder du tout. Là on/je dis véolia, mais y’a plein d’autres trucs qui pourraient être intégrés facilement au delà de la domotique.

Pour être très clair, voir un code git hub d’une intégration pour HA je sais lire et je crois comprendre, mais quand je vois que le cœur de la méthode fais 5 lignes et que tout l’enrobage HA fait 1Mo de code, suis désolé, mais ça me donne pas la motivation de m’y mettre sur plusieurs soirées pour faire un truc one-shot.

J’aurais p"erte pas du écrire ici, t’as du comprendre que je demandais des comptes, mais c’était une question générique . Bref encore désolé si t’aurais pu croire à un truc négatif de ma part, ct tout le contraire.

Pas de souci, je ne prends pas les choses pour moi :wink: On a tous une expérience/un passif différent donc il y a forcement des moments ou c’est pas évident de se comprendre

Malgré tout, je pense quand même que tu ne doutes pas réellement de ce qu’il y a derrière HA. Ou alors c’est une question d’habitude. Il y a assez peu de choses rédhibitoires dans HA à mon avis.
C’est justement parce tout est prémâché (et que ça fait plusieurs Go) , tu n’as besoin que de faire que 5 lignes yaml pour que ça fonctionne sans aucun autre code pour remonter une valeur ou créer un affichage. Derrière tout ça il y a une grosse réflexion sur l’organisation, sur les besoins génériques, l’uniformatisation et sur la maintenabilité. Donc comme tout est prévu, le dernier codeur/bidouilleur à la vie belle. Certes, ça demande par contre un peu de relecture et d’analyse quand on veut proposer un truc qui rentre dans ce framework. Mais c’est pour ça aussi que ça fonctionne avec les solutions pro de Google, de Legrand, Tuya aussi bien qu’avec des machins codés au fond d’un lit d’étudiant… bref des trucs très hétéroclites, hétérogènes mais qui marchent à la fin.
Et quand il y a une mise à jour, c’est suffisamment robuste et bien pensé pour tu n’ai pas besoin de refaire tout depuis le début.
Ce principe de framework est couteux en terme de stockage et de ressources cpu/mémoire mais offre beaucoup de souplesse pour le reste. Et comme actuellement les machines sont largement dimensionnées pour traiter des pages web de plusieurs 100aines de KO, ça ne pose généralement pas de souci.
A la différence de l’assembleur que tu sembles connaitre où il y a beaucoup de réflexion sur le taille des objets manipulé, la complexité des algos et la vitesse d’exécution.

Dans le cas de Véolia, il y a mon avis une vraie volonté de ne pas rendre les choses simples. Je ne sais pas trop pourquoi mais c’est absolument pas fait pour que les choses à la fois accessibles, ou facilement exploitables ailleurs que sur leur(s) site(s). Je mets de coté volontairement les demandes au service client sur une documentation qui reste mystérieusement sans réponse.
La difficulté n’est absolument pas d’intégrer la donnée dans HA mais de la capter chez Veolia.

Depuis peu il y a une application android (Veolia et moi) qui semble être en mesure d’unifier un peu les choses mais c’est pareil. Pas de documentation publique et il faudra passer un peu de temps à faire du reverse engineering pour voir s’il n’y a pas une api derrière. C’est une piste à etudier, mais je ne me suis pas lancé là-dedans.

Bonjour,
Je suis développeur python et j’utilise HA depuis 5 ans maintenant.
Ce plugin m’intéresse, @Pulpy-Luke peux tu mettre un git de ce que tu as déjà fait et je vois si je peux t’aider à faire avancer ce plugin ?

Merci d’avance

2 « J'aime »

Bonjour,

Les nouvelles ne sont pas bonnes concernant mes tests.
Merci @Pulpy-Luke de m’avoir fourni l’accès à tes sources.

Je vais tenter de résumer les différents problèmes rencontrés.

Tout d’abord, le module en cours de développement s’appuie sur appdaemon, selenium et chromium.
Je n’ai pas hass en mode OS mais uniquement en conteneur sur un raspberry et cela pose déjà 2 gros points de blocages :

  • Appdaemon en dehors de hass, c’est pas un cadeau à faire fonctionner
  • selenium et chrome à l’intérieur d’ appdaemon n’existe pas pour un Raspberry pi 3 (y compris dans la version hass, si j’ai bien compris)

J’ai donc monté une machine virtuelle Home assistant sur mon PC, j’ai pu via Hass os ajouter appdaemon et ajouter selenium et chromium.

Maintenant, place au programme. J’ai fais tourner le programme mais il y avait quelques erreurs (@Pulpy-Luke , si tu veux je peux te filer mes fichiers modifiés ) mais le vrai problème c’est Veolia !!!

En effet, je ne sais pas si c’était le cas mais à présent il y a un friendly captcha au moment de se loguer.
Apparemment ce captcha est plutôt basique puisqu’il suffit de cliquer et de patienter, pour que la vérification se valide, en réalité la techno est plutôt aboutie car, dès qu’on lance un navigateur piloté (par selenium) que ce soit Chrome ou Firefox, le captcha le détecte et se bloque.

Cette piste me mène donc à un mur.

J’ai vu par contre qu’il y avait une application sur le play store : Veolia & moi.

Je l’ai téléchargé et on trouve bien des éléments de consommation à l’intérieur. Je me suis dit qu’il était probable que cette appli échange ce genre d’infos via des api, j’ai essayé de sniffer les trames mais je n’ai pas la compétence pour comprendre ce qui est réellement échangé.

J’arrête donc faute de compétence.

Salut et merci pour ce retour.

Globalement ça corrobore le diagnostique que j’avais déjà, la captcha c’est le b***
J’avais mis en place 2 bidouilles :

  • le changement du user-agent randomisé
  • une tempo variable pour attendre

Malgré tout, c’est pas suffisant/confluant et j’ai pas poursuivi.
Je suis preneur des correctifs sur github (via PR ?) c’est toujours un étape.

Concernant l’appli ‹ Veolia & moi › j’ai cru voir sur jeedom que l’appli a été décompilé et le code/l’api inclue réutilisée pour en faire un plugin (payant), donc c’est possible à faire mais ça demande de savoir quand même

Merci !!!
Tu me relances dans la course :smile:
Je vais tenter de récupérer de l’info depuis jeedom :partying_face: :disguised_face:

Bonsoir à tous,

Pour info, une fois j’étais tombé sur ce site en essayant de récupérer les info Veolia sur Domoticz.

https://developers.api.eau.veolia.fr/get-started

Je ne sais pas si cela peut vous aider.

Bonne soirée

Je viens de tester.
Mon système:

La configuration AppDaemon:

init_commands: []
python_packages:
  - selenium
  - PyVirtualDisplay
system_packages:
  - py-urllib3
  - py3-colorama
  - xvfb
  - py3-pip
  - xorg-server-xephyr
  - chromium-chromedriver
  - chromium
  - py3-openssl
  - py3-pysocks
  - py3-wsproto
  - py3-sniffio
  - py3-async_generator
  - py3-sortedcontainers
  - py3-attrs
  - py3-outcome
  - py3-trio

La fin de la trace d’installation:

(100/102) Installing libxslt (1.1.35-r0)
(101/102) Installing chromium (102.0.5005.182-r0)
(102/102) Installing chromium-chromedriver (102.0.5005.182-r0)
Executing busybox-1.35.0-r17.trigger
Executing glib-2.72.1-r0.trigger
Executing shared-mime-info-2.2-r1.trigger
Executing gdk-pixbuf-2.42.8-r0.trigger
Executing gtk-update-icon-cache-2.24.33-r3.trigger
Executing fontconfig-2.14.0-r0.trigger
Executing mkfontscale-1.2.2-r0.trigger
OK: 419 MiB in 203 packages
OK: 419 MiB in 203 packages
(1/5) Installing py3-cparser (2.20-r2)
(2/5) Installing py3-cffi (1.15.0-r0)
(3/5) Installing py3-idna (3.3-r2)
(4/5) Installing py3-cryptography (3.4.8-r1)
(5/5) Installing py3-openssl (21.0.0-r1)
OK: 424 MiB in 208 packages
(1/1) Installing py3-pysocks (1.7.1-r3)
OK: 424 MiB in 209 packages
(1/2) Installing py3-h11 (0.13.0-r1)
(2/2) Installing py3-wsproto (1.1.0-r0)
OK: 425 MiB in 211 packages
(1/2) Installing py3-curio (1.5-r2)
(2/2) Installing py3-sniffio (1.2.0-r2)
OK: 425 MiB in 213 packages
(1/1) Installing py3-async_generator (1.10-r3)
OK: 425 MiB in 214 packages
(1/1) Installing py3-sortedcontainers (2.4.0-r1)
OK: 426 MiB in 215 packages
(1/1) Installing py3-attrs (21.4.0-r0)
OK: 426 MiB in 216 packages
(1/1) Installing py3-outcome (1.1.0-r3)
OK: 426 MiB in 217 packages
(1/1) Installing py3-trio (0.19.0-r1)
OK: 429 MiB in 218 packages
Looking in links: https://wheels.home-assistant.io/musllinux/
Collecting selenium
  Downloading selenium-4.6.0-py3-none-any.whl (5.2 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.2/5.2 MB 7.6 MB/s eta 0:00:00
Requirement already satisfied: trio~=0.17 in /usr/lib/python3.10/site-packages (from selenium) (0.19.0)
Collecting trio-websocket~=0.9
  Downloading trio_websocket-0.9.2-py3-none-any.whl (16 kB)
Requirement already satisfied: certifi>=2021.10.8 in /usr/lib/python3.10/site-packages (from selenium) (2022.9.24)
Requirement already satisfied: urllib3[socks]~=1.26 in /usr/lib/python3.10/site-packages (from selenium) (1.26.12)
Requirement already satisfied: attrs>=19.2.0 in /usr/lib/python3.10/site-packages (from trio~=0.17->selenium) (22.1.0)
Requirement already satisfied: sortedcontainers in /usr/lib/python3.10/site-packages (from trio~=0.17->selenium) (2.4.0)
Requirement already satisfied: async_generator>=1.9 in /usr/lib/python3.10/site-packages (from trio~=0.17->selenium) (1.10)
Requirement already satisfied: idna in /usr/lib/python3.10/site-packages (from trio~=0.17->selenium) (3.4)
Requirement already satisfied: outcome in /usr/lib/python3.10/site-packages (from trio~=0.17->selenium) (1.1.0)
Requirement already satisfied: sniffio in /usr/lib/python3.10/site-packages (from trio~=0.17->selenium) (1.2.0)
Requirement already satisfied: wsproto>=0.14 in /usr/lib/python3.10/site-packages (from trio-websocket~=0.9->selenium) (1.1.0)
Requirement already satisfied: PySocks!=1.5.7,<2.0,>=1.5.6 in /usr/lib/python3.10/site-packages (from urllib3[socks]~=1.26->selenium) (1.7.1)
Requirement already satisfied: h11<1,>=0.9.0 in /usr/lib/python3.10/site-packages (from wsproto>=0.14->trio-websocket~=0.9->selenium) (0.13.0)
Installing collected packages: trio-websocket, selenium
Successfully installed selenium-4.6.0 trio-websocket-0.9.2
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
Looking in links: https://wheels.home-assistant.io/musllinux/
Collecting PyVirtualDisplay
  Downloading PyVirtualDisplay-3.0-py3-none-any.whl (15 kB)
Installing collected packages: PyVirtualDisplay
Successfully installed PyVirtualDisplay-3.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
cont-init: info: /etc/cont-init.d/appdaemon.sh exited 0
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
services-up: info: copying legacy longrun appdaemon (no readiness notification)
s6-rc: info: service legacy-services successfully started
[21:45:13] INFO: Starting AppDaemon...
2022-11-08 21:45:29.058210 INFO AppDaemon: AppDaemon Version 4.2.1 starting
2022-11-08 21:45:29.059150 INFO AppDaemon: Python version is 3.10.5
2022-11-08 21:45:29.060209 INFO AppDaemon: Configuration read from: /config/appdaemon/appdaemon.yaml
2022-11-08 21:45:29.061253 INFO AppDaemon: Added log: AppDaemon
2022-11-08 21:45:29.062416 INFO AppDaemon: Added log: Error
2022-11-08 21:45:29.063707 INFO AppDaemon: Added log: Access
2022-11-08 21:45:29.064641 INFO AppDaemon: Added log: Diag
2022-11-08 21:45:29.729598 INFO AppDaemon: Loading Plugin HASS using class HassPlugin from module hassplugin
2022-11-08 21:45:30.491721 INFO HASS: HASS Plugin Initializing
2022-11-08 21:45:30.492747 INFO HASS: HASS Plugin initialization complete
2022-11-08 21:45:30.495441 INFO AppDaemon: Initializing HTTP
2022-11-08 21:45:30.497625 INFO AppDaemon: Using 'ws' for event stream
2022-11-08 21:45:30.520479 INFO AppDaemon: Starting API
2022-11-08 21:45:30.646352 INFO AppDaemon: Starting Admin Interface
2022-11-08 21:45:30.648332 INFO AppDaemon: Starting Dashboards
2022-11-08 21:45:30.725707 INFO HASS: Connected to Home Assistant 2022.11.1
2022-11-08 21:45:30.784968 INFO AppDaemon: App 'hello_world' added
2022-11-08 21:45:30.790179 INFO AppDaemon: Found 1 total apps
2022-11-08 21:45:30.793887 INFO AppDaemon: Starting Apps with 1 workers and 1 pins
2022-11-08 21:45:30.801651 INFO AppDaemon: Running on port 5050
2022-11-08 21:45:31.000490 INFO HASS: Evaluating startup conditions
2022-11-08 21:45:31.039718 INFO HASS: Startup condition met: hass state=RUNNING
2022-11-08 21:45:31.041366 INFO HASS: All startup conditions met
2022-11-08 21:45:31.118903 INFO AppDaemon: Got initial state from namespace default
2022-11-08 21:45:32.827272 INFO AppDaemon: Scheduler running in realtime
2022-11-08 21:45:32.837982 INFO AppDaemon: Adding /config/appdaemon/apps to module import path
2022-11-08 21:45:32.845298 INFO AppDaemon: Loading App Module: /config/appdaemon/apps/hello.py
2022-11-08 21:45:33.007093 INFO AppDaemon: Initializing app hello_world using class HelloWorld from module hello
2022-11-08 21:45:33.322386 INFO hello_world: Hello from AppDaemon
2022-11-08 21:45:33.326931 INFO hello_world: You are now ready to run Apps!
2022-11-08 21:45:33.332933 INFO AppDaemon: App initialization complete

Voir veolia-idf/.github at ha-app · mdeweerd/veolia-idf · GitHub .

Par ailleur j’ai aussi mis en place divers Dockerfile qui fonctionnent sous Windows, le plus petit étant apline - veolia-idf/dockerAlpineRun.BAT at ha-app · mdeweerd/veolia-idf · GitHub .

Salut,

je vais tenter de faire une synthèse de mes recherches sur l’API.
il y a un bien un plugin jeedom (payant) qui réussit à lire les infos depuis l’API veolia.
J’ai donc dépackagé l’APK android et dans le fichier bundle j’ai trouvé les fonctions qui échangent avec cet API. Ce fichier est minimisé donc je n’ai pas vraiment tout décrypté.

je sais que l’adresse pour les webservices est https://www.service.eau.veolia.fr/icl-ws/iclWebService
C’est du SOAP avec une couche sécurité géré par wsse Security.
De ce que j’ai compris du code j’ai effectué une requête POST sur l’adresse https://www.service.eau.veolia.fr/icl-ws/iclWebService avec le body suivant :

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!-- xmlns:ch0', this.targetNamespace) -->
    <!-- 'xmlns:tns', this.targetNamespace -->
    <!-- 'xmlns:ch1', this.commonTypes -->
    <!-- 'xmlns:cmn', this.commonTypes -->
    <soap:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-aiehdbsf52">
                <wsse:Username>free@email.com</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
                <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">1dWl+HzD/sJsWzAcDHQX6Q==</wsse:Nonce>
                <wsse:Created>2022-11-18T13:48:00.000Z</wsse:Created>
            </wsse:UsernameToken>
        </wsse:Security>
    </soap:Header>
    <soap:Body>
    
    <ns2:getAuthentificationFront xmlns:ns2="http://ws.icl.veolia.com/">
        <cptEmail>free@email.com</cptEmail>
        <cptPwd>password</cptPwd>
    </ns2:getAuthentificationFront>
    
</soap:Body>
</soap:Envelope>

avec évidemment mon adresse mail et mon mot de passe mais j’obtiens systématiquement l’erreur suivante :

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Authentification impossible</faultstring>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

je ne vois pas trop comment faire je pense que le problème peux se situer dans la valeur du wsse:UsernameToken et/ou du wsse:Nonce ou bien encore dans le contenu de ns2:getAuthentificationFront

J’ai fait une demande auprès du développeur du plugin jeedom mais même si c’est bientôt noël, je ne me fais pas d’illusion

1 « J'aime »

Merci Jonathan et bon courage pour la suite !

Grosse nouvelle

Merci @Pulpy-Luke, j’ai oublié de mettre à jour dans ce sujet :smiley:

1 « J'aime »

L’émotion sans doute :wink:

1 « J'aime »

Bonjour,
Bonne nouvelle, merci ! Pouvez-vous m’indiquer la façon de l’installer ? Merci d’avance …

Exactement comme la documentation l’indique …
Documentation dispo dans le lien principal du sujet que je mentionne

Merci Pulpy de ta réponse, j’ai suivi le readme mais j’ai une erreur « Le flux de configuration n’a pas pu être chargé: 500 Internal Server Error Server got itself in trouble » quand j’essaie d’installer l’intégration.

Dans ce cas détaille les étapes qui te mènent jusqu’à l’erreur. Accessoirement dans le sujet du l’intégration que le dev puisse en prendre connaissance facilement si besoin

Ok, je le fais dans le sujet de l’intégration.
Merci