Récupérer ses informations de consommation électriques via l'API ENEDIS

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
singinglarvae
Messages : 17
Inscription : 04 avr. 2016, 11:03

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par singinglarvae »

epierre a écrit :bon pour simplifier, si impossible de se loguer, le script s'arrête sans message d'injure.

message dans linky.log:
2018-01-26 22:56:36,955 Unable to log in
Bonjour,

Et bien je pense avoir trouvé :D J'ai ce message :

Code : Tout sélectionner

pi@raspberrypi ~/domoticz/domoticz_linky $ cat linky.log
2018-01-27 07:51:53,632 logging in as XX@YY...
2018-01-27 07:51:53,760 Starting new HTTPS connection (1): espace-client-connexion.enedis.fr
2018-01-27 07:51:54,506 logged in successfully!
2018-01-27 07:51:54,509 retreiving data...
2018-01-27 07:51:54,578 Starting new HTTPS connection (1): espace-client-particuliers.enedis.fr
2018-01-27 07:51:55,196 Unable to log in
C'est effectivement bien plus explicite ! Or mon mot de passe pour Enedis (généré aléatoirement) comporte un caractère spécial ("@" pour ne pas le citer). Je pense que la connexion - avec ce caractère dans le mot de passe - via le site internet est possible, mais pas via l'API d'authentification !

Je devais tester ce matin, mais bien sur, le site Enedis est en maintenance... Pas possible pour l'instant de modifier le dit-mot de passe.

En tous les cas, j'espère revenir avec de bonnes nouvelles :roll:
FreeFred
Messages : 9
Inscription : 22 janv. 2016, 22:55

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par FreeFred »

Bonjour à tous.

Tout d'abord un grand merci à epierre pour ce module !!
J'ai testé aujourd'hui et malheureusement, j'ai la même erreur que singinglarvae.

Code : Tout sélectionner

2018-01-27 20:07:35,516 logging in as xxxxxxxx.yyyyyyyy@zzzzz...
2018-01-27 20:07:35,556 Starting new HTTPS connection (1): espace-client-connexion.enedis.fr
2018-01-27 20:07:35,934 logged in successfully!
2018-01-27 20:07:35,935 retreiving data...
2018-01-27 20:07:35,951 Starting new HTTPS connection (1): espace-client-particuliers.enedis.fr
2018-01-27 20:07:37,659 Starting new HTTPS connection (2): espace-client-particuliers.enedis.fr
2018-01-27 20:07:39,065 Unable to log in
Rencontrez vous le même pb ou est que ça serait un problème de conf chez moi ?

Pareil pour moi, j'ai un caractère spécial ( ! ) dans le mot de passe. Le site d'Enedis impose d'avoir au moins un caractère spécial dans le mdp.
singinglarvae
Messages : 17
Inscription : 04 avr. 2016, 11:03

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par singinglarvae »

singinglarvae a écrit : En tous les cas, j'espère revenir avec de bonnes nouvelles :roll:
Et bien les nouvelles ne sont pas bonnes... Impossible de récupérer quoique ce soit.

Je suis rentré un peu dans le code. A priori, le problème se situe au niveau du contrôle de la connexion (fichier linky.py ; ligne 69 à 74) :

Code : Tout sélectionner

    session_cookie = req.cookies.get('iPlanetDirectoryPro')

    if not 'iPlanetDirectoryPro' in session.cookies:
        raise LinkyLoginException("Login unsuccessful. Check your credentials.")

    return session
Si je demande à voir le contenu du cookie de session ("à la barbare", en passant par LinkyLoginException(session.cookies) ), j'obtiens dans mon cas le contenu suivant :

Code : Tout sélectionner

<<class 'requests.cookies.RequestsCookieJar'>[<Cookie AMAuthCookie=AQIC5wM2LY4SfcwZmrks3u8t6IFEgLRhFcbxPA8A9feTbvU.*AAJTSQACMDIAAlNLABMyNDQxNTMwNjczMjI3MzU4NTczAAJTMQACMDQ.* for .enedis.fr/>, <Cookie amlbcookie=04 for .enedis.fr/>, <Cookie JSESSIONID=1C5E8EEB088057DAFFE059EF8354CD11 for espace-client-connexion.enedis.fr/auth/>]>
A aucun moment, il n’apparaît iPlanetDirectoryPro ; j'ai bien l'impression qu'Enedis a changé le nom de domaine utilisé...

J'ai changé le code pour :

Code : Tout sélectionner

    cookie_name = 'iPlanetDirectoryPro'
    session_cookie = req.cookies.get(cookie_name)

    if not cookie_name in session.cookies:
        raise LinkyLoginException("Login unsuccessful. Check your credentials.")

    return session
Puis j'ai changé la valeur de cookie_name pour 'enedis', 'espace-client-connexion.enedis.fr', etc. Mais jusqu'à présent, sans succès.

J'ai essayé de retirer ce contrôle (retrait des lignes 71 & 72), mais rien à faire, j'ai les erreurs habituelles qui tombent.

Et enfin, si je demande à voir le contenu de session_cookie, et bien là, je n'ai tout simplement rien du tout (retour 'None').

Une idée ? Merci d'avance
Martial
Messages : 201
Inscription : 03 mars 2017, 18:58

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par Martial »

Bonjour,
De mon côté cela a marché ce matin en automatique, sans problème (je n'ai pas encore intégré la dernière version).
FreeFred
Messages : 9
Inscription : 22 janv. 2016, 22:55

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par FreeFred »

Bonjour à tous,
Vous avez réussi à faire fonctionner le script ?
J'ai toujours les mêmes erreurs et j'ai beau retourner le pb dans tous les sens, je n'arrive pas à trouver où se situe le problème.
singinglarvae
Messages : 17
Inscription : 04 avr. 2016, 11:03

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par singinglarvae »

Bonjour à tous,

Je suis comme FreeFred, incapable de faire fonctionner le script... Je me suis un peu replongé dans le code.

A priori, il n'y a pas de soucis avec ma connexion, gérée par le fichier linky.py. Si je fais l'historique de mes recherches, mes identifiants sont bien acceptés, je passe par une première connexion qui retourne un statuts 302 ; le script lance alors une deuxième connexion (comme codé ligne 118). Cette deuxième connexion me donne alors un statuts de type 200.

Maintenant, c'est à ce stade que le script bloque... Si je demande de voir le contenu de la requête en modifiant le code comme suit :

Code : Tout sélectionner

    if req.status_code == 200 and req.text is not None and "Conditions d'utilisation" in req.text:
        raise LinkyLoginException("You need to accept the latest Terms of Use. Please manually log into the website, "
                                  "then come back.")

    try:
        res = req.json()
    except:
    	## Modification ci-dessous
        logging.info(req.text)
        sys.exit(os.EX_SOFTWARE)

    if res['etat'] and res['etat']['valeur'] == 'erreur' and res['etat']['erreurText']:
        raise LinkyServiceException(html.unescape(res['etat']['erreurText']))

    return res

J'ai alors le log suivant :

Code : Tout sélectionner

cat linky.log
2018-02-01 10:33:02,315 logging in as XX@YY...
2018-02-01 10:33:02,445 Starting new HTTPS connection (1): espace-client-connexion.enedis.fr
2018-02-01 10:33:03,187 logged in successfully!
2018-02-01 10:33:03,190 retreiving data...
2018-02-01 10:33:03,261 Starting new HTTPS connection (1): espace-client-particuliers.enedis.fr
2018-02-01 10:33:06,793 Starting new HTTPS connection (2): espace-client-particuliers.enedis.fr
2018-02-01 10:33:07,994 {"etat":{"valeur":"termine"},"graphe":{"decalage":0,"puissanceSouscrite":0,"periode":{"dateFin":"31/01/2018","dateDebut":"01/02/2015"},"data":[{"valeur":-2,"ordre":0},{"valeur":-2,"ordre":1},{"valeur":1393.021,"ordre":2},{"valeur":416.208,"ordre":3}]}}
Donc, le script de connexion me renvoie bien des infos, mais qui semblent assez bizarres (puissance souscrite = 0 ?? dateDebut en 2015 ???), avec quelques informations correctes (416.208 correspond bien à la puissance consommée le mois passé)... :shock:

Des pistes ?
FreeFred
Messages : 9
Inscription : 22 janv. 2016, 22:55

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par FreeFred »

Rebonjour à tous.

J'ai également avancé de mon côté.
Un exception semble être levée par l'appel à req.json() (ligne 127 du script linky.py).
Je ne sais pas pourquoi car les valeurs semblent correctes : le contenu de req.text :

Code : Tout sélectionner

{"etat":{"valeur":"termine"},"graphe":{"decalage":0,"puissanceSouscrite":0,"periode":{"dateFin":"31/01/2018","dateDebut":"01/02/2015"},"data":[{"valeur":-2,"ordre":0},{"valeur":5094.186,"ordre":1},{"valeur":13093.637,"ordre":2},{"valeur":2248.57,"ordre":3}]}}
J'ai essayé de remplacer cet appel par un appel à une autre librairie json.
J'ai donc fait un import json
puis j'ai remplacé l'appel à

Code : Tout sélectionner

req.json()
par

Code : Tout sélectionner

res = json.dumps(req.text)
Je vais donc plus loin, mais j'ai l'erreur :
Traceback (most recent call last):
File "/home/pi/domoticz_linky/linky_json.py", line 190, in <module>
main()
File "/home/pi/domoticz_linky/linky_json.py", line 139, in main
res_year = linky.get_data_per_year(token)
File "/home/pi/domoticz_linky/linky.py", line 91, in get_data_per_year
return _get_data(session, 'urlCdcAn')
File "/home/pi/domoticz_linky/linky.py", line 135, in _get_data
if res['etat'] and res['etat']['valeur'] == 'erreur' and res['etat']['erreurText']:
TypeError: string indices must be integers

Des idées ?
FreeFred
Messages : 9
Inscription : 22 janv. 2016, 22:55

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par FreeFred »

Ouf... j'ai réussi à récupérer des données.
J'ai finalement remplacé

Code : Tout sélectionner

res = req.json()
par

Code : Tout sélectionner

res = json.loads(req.text)
J'ai des données quotidiennes et annuelles correctes, Mais, par contre, j'ai quand même une courbe 48h assez particulière... :o
Image
Je vais le faire tourner quelques jours et je verrai comment ça se comporte.

Donc pour résumer... tout fonctionne chez moi sauf la méthode req.json(). Que j'ai dû remplacer par un appel à json.loads(req.text)
singinglarvae
Messages : 17
Inscription : 04 avr. 2016, 11:03

Re: Récupérer ses informations de consommation électriques via l'API ENEDIS

Message par singinglarvae »

Merci FreeFred !

En appliquant tes modifications, je réussis moi aussi enfin à récupérer mes données 8-)

A tester dans le temps pour voir si ça tient correctement. Encore merci
Répondre