Fun with Linky

Pourquoi ?

De plus en plus de maisons se voient équiper d'un compteur Linky et la mienne ne fait pas exception à la règle. J'ai cherché par hasard sur Internet comment on pouvait s'amuser avec lui et j'ai vu qu'il était assez facile de s'interfacer avec le compteur, pour obtenir quelques métriques de consommation en temps réel.

Les sites qui m'ont donnés cette idée sont les suivants:

Comment ?

On trouve pas mal d'explications pour faire ce genre de chose à base de raspberry pi, mais j'avais envie d'utiliser autre chose pour arriver à mes fins et c'était le projet idéal pour apprendre à utiliser un ESP8266. Il a l'avantage comparé au RPI d'être vraiment minimaliste et de consommer vraiment très peu et pour faire ce que je veux faire, c'est amplement suffisant.

Partie Hardware

Pour récupérer la téléinformation produite par le linky, il est nécessaire de convertir le signal qui n'est pas directement utilisable par un ordinateur (RPI, ESP8266…). Pour cela j'ai utilisé un PiTInfo, qui permet de faire cette conversion. Il transforme le signal produit par le linky en un signal série à 1200 bps.

Ensuite j'ai utilisé un NodeMCU faisant tourner l'ESP8266, que j'ai fixé sur un circuit imprimé.

NodeMCU sur circuit imprimé

De l'autre coté, j'ai collé le PiTInfo avec de la colle.

PiTInfo collé sur le verso du circuit imprimé

Le PiTInfo contient 6 PIN qui doivent/peuvent être utilisées:

  • VCC pour l'alimentation en 3.3V
  • 2 GND (une seule est nécessaire)
  • Une PIN pour la gestion de la LED du PiTInfo (optionnelle)
  • TXD pour récupérer le signal du Linky

PIN du PiTInfo

Chaque PIN du PiTInfo est reliée au PIN suivantes sur le NodeMCU:

PiTInfo NodeMCU
3.3V 3.3V
GND GND
TXD RXD0
LED GPIO12

PIN du NodeMCU

Après quelques soudures de débutant, on arrive au résultat suivant:

Soudures

Comme on peut le voir, j'ai relié la LED du PiTInfo sur le NodeMCU pour pouvoir la piloter, en fonction des opérations effectuées.

La connexion sur le linky se fait via deux cables:

Connexion au linky

Appréciez la petite boite construite en LEGO qui amuse beaucoup mes filles :)

Boite en LEGO

Partie software

Par défaut, le langage utilisé pour coder sur l'ESP8266 est le C, mais il est possible d'utiliser plein d'autres langages en changeant le firmware par défaut. Pour mes besoins, coder en C ne me semble pas être le plus adapté, je me suis donc tourné vers le python en utilisant le firmware MicroPython. La mise à jour du firmware est très bien expliquée ici.

Pour minimiser le code tournant sur l'ESP8266, celui-ci récupère uniquement les données de consommation électrique du Linky et les envoie en MQTT sur un serveur mosquitto déjà présent sur une de mes machines. J'ai ajouté un moyen de debug permettant d'envoyer des messages TCP sur un serveur configurable, car il faut bien l'avouer quand le code ne fonctionne pas, les moyens d'investigation sont très limitées. Le code tournant sur l'ESP8266 peut se trouver dans le repo pylinky. Il est dépendant du fichier python simple.py implémentant un client MQTT. Ce fichier est renommé umqttsimple.py dans mon repo github.

Les informations récupérées du linky ont cette forme (après parsing):

{'ADCO': 'XXXXXXXXXXX', 'PTEC': 'TH..$', 'BASE': '270403', 'MOTDETAT': '00000', 
'PAP': '920', 'IINST': '4', 'IMAX': '090', 'OPTARIF': 'ASE', 'HHPHCA': ',', 
'ISOUSC': '3'}

La signification peut se trouver ici, mais grosso-mode l'information qui m'intéresse est IINST représentant l'intensité instantanée.

Chaîne de bout en bout

En résumé, chaque fois qu'une information est envoyée par le Linky, elle est récupérée par l'ESP8266 et est envoyée en MQTT sur le serveur mosquitto. Un programme appelé mqtt2influxdb que j'ai développé et que l'on peut trouver ici, est en attente des messages sur le serveur mosquitto et alimente une base influxdb.

La configuration de mqtt2influxdb.py est basique, il faut spécifier l'adresse du serveur MQTT et de la base influxdb. Ensuite une règle générique permettant de dire que tel message MQTT va dans telle table influxdb.

[GENERAL]
influxdb = IP_INFLUXDB
mqtt = IP_MOSQUITTO

[linky]
/linky/(?P<type>[^/]+) = {"measurement":"electricity","tags":{"linky":"(*type*)"},"fields":{"value":(*payload*)}}

Enfin, tout ceci est graphé par grafana comme on peut le voir dans la capture d'écran suivante.

Consommation électrique

Quelques bugs

Quand on lit les forums des gens qui ont fait ça, on se rend compte que beaucoup ont des problèmes de stabilité. Je ne fais pas exception à la règle et en moyenne, je suis obligé de redémarrer l'ESP8266 une fois par mois, ce qui reste quand même assez peu. Pour le moment j'ai rencontré deux problèmes différents:

  • Un plantage complet de l'ESP8266, c'est arrivé uniquement une fois. Il n'était même plus accessible en utilisant webrepl.py
  • Un blocage lors de la lecture sur le lien série de l'ESP8266. Ce problème intervient beaucoup plus fréquement et je pense qu'il doit être possible de réinitialiser l'ESP pour rendre ce problème plus transparent.