Featured image of post Récupérer la téléinformation Linky depuis un Raspberry Pi avec Python, InfluxDB et Grafana

Récupérer la téléinformation Linky depuis un Raspberry Pi avec Python, InfluxDB et Grafana

Commme j’aime souvent à le répéter “Si vous ne pouvez pas le mesurer, vous ne pouvez pas l’améliorer” (Lord Kelvin), et c’est particulièrement vrai pour notre consommation électrique. Je m’étais déjà intéressé au sujet il y a une dizaine d’années avec un compteur de consommation Energy Logger 3500 pour mesurer la consommation électrique d’un appareil en particulier. Avec la téléinformation du compteur Linky, il est possible de récupérer les données de consommation de son domicile pour les stocker (avec InfluxDB) et les exploiter (avec Grafana) pour avoir une vue d’ensemble de sa consommation.

Le compteur Linky est équipé d’une sortie de télé-information numérique, couramment appelée TIC (Télé-Information Client). Il s’agit d’une sortie série classique qui transmet en permanence les paramètres du compteur, c’est-à-dire l’équivalent des informations qui sont affichées sur l’écran LCD du Linky.

La télé-information est accessible en retirant la façade verte du Linky (simplement clipsée), puis en se branchant sur les bornes I1 et I2 (attention, ne pas utiliser la borne A qui est alimentée en 220V). Sur mon modèle de compteur Linky (il en existe plusieurs variantes), il s’agit d’un bornier pour connecteur rigide de type “Wago”, c’est pourquoi j’ai inséré un domino pour ensuite repartir sur un câble souple.

J’ai utilisé ensuite un module électronique pour assurer une isolation galvanique entre le Linky et le port GPIO de mon Rasperry Pi Zero. Pour les férus d’électronique, il existe de nombreux plans sur Internet pour réaliser soi-même ce module avec un optocoupleur. Pour ma part, j’ai préféré acheter le module PiTinfo qui fait parfaitement l’affaire pour 10€.

Le PiTinfo est le petit module rouge à droite

Le PiTinfo est le petit module rouge à droite

Pour la partie informatique, j’ai développé un script Python qui se lance en tant que service sur le Rasperry Pi. Il écoute en permanence la sortie série du Linky et envoie les données vers une base InfluxDB externe. En cas de panne réseau, les données sont conservées en mémoire puis envoyées dès que la connectivité Internet est rétablie.

Le code source est disponible sur Github : https://github.com/hleroy/teleinfo-linky. Lisez-bien le README pour le paramétrage préalable du Rasperry Pi.

La configuration se fait un fichier config.yml :

debug: false                   # true permet de logger plus d'information en cas de problème

linky:
  location: 'Votre ville'
  legacy_mode: true            # Mode TIC historique = true, sinon false
  checksum_method: 1           # Mode de calcul du checksum (1 ou 2, se référer à la notice ENEDIS)
  keys: [ISOUSC, BASE, IINST]  # Liste des étiquettes à récupérer via la téléinfo

raspberry:
  stty_port: '/dev/ttyAMA0'    # Port série du Raspberry Pi

influxdb:
  send_data: false             # false permet de tester le script en local sans envoyer de données
  url: https://url-serveur-influxdb
  bucket: teleinfo
  token: 
  org: 

# Liste des étiquettes transmises par la Téléinfo Client (TIC)

# ADCO     : Adresse du compteur
# OPTARIF  : Option tarifaire choisie
# ISOUSC   : Intensité souscrite
# BASE     : Index option Base
# HCHC     : Index Heures Creuses
# HCHP     : Index Heures Pleines
# EJPHN    : Index option EJP Heures Normales
# EJPHPM   : Index option EJP Heures de Pointe Mobile
# BBRHCJB  : Index option Tempo Heures Creuses Jours Bleus
# BBRHPJB  : Index option Tempo Heures Pleines Jours Bleus
# BBRHCJW  : Index option Tempo Heures Creuses Jours Blancs
# BBRHPJW  : Index option Tempo Heures Pleines Jours Blancs
# BBRHCJR  : Index option Tempo Heures Creuses Jours Rouges
# BBRHPJR  : Index option Tempo Heures Pleines Jours Rouges
# PEJP     : Préavis Début EJP
# PTEC     : Période Tarifaire en cours
# DEMAIN   : Couleur du lendemain
# IINST    : Intensité Instantanée
# ADPS     : Avertissement de Dépassement De Puissance Souscrite
# IMAX     : Intensité maximale appelée
# PAPP     : Puissance apparente
# HHPHC    : Horaire Heures Pleines Heures Creuses
# MOTDETAT : Mot d'état du compteur

Le dépôt Github contient également un modèle de dashboard Grafana dashboard_grafana.json pour afficher l’intensité instantanée, l’index du compteur, un historique mensuel et annuel.

Dashboard Grafana

Je vous recommande également la lecture d’autres articles et d’autres implémentations en Python qui m’ont aidé pour réaliser cet article :

Et enfin, si le GPIO header n’est pas soudé sur votre Raspberry Pi comme c’était mon cas, une petite révision s’impose quand on ne soude pas souvent :

Bon bricolage 😄

Généré avec Hugo
Thème Stack conçu par Jimmy