Mieux que Linky sans Linky. Les compteurs d’électricité électroniques délivre sur une interface série quelques informations utiles que nous allons collecter via un adaptateur µTeleinfo.
Disposant d’un abonnement EDF Tempo, il m’est important de savoir quand nous sommes un jour rouge au tarif 4 fois plus cher. Nous allons récupérer cette information et la présenter sur Home Assistant. Nous présenterons aussi la puissance consommée, parce qu’on peut le faire.
µTeleinfo
µTeleinfo est un dongle qui se raccorde au compteur et présente un connecteur USB. Son optocoupleur évite tout risque de faire cramer votre PC. Les plans sont disponibles, j’ai préférer l’acheter tout fait. Livré en une semaine, je l’ai brancher et en quelques secondes, avec picocom, j’ai vu défiler sur mon écran les informations de mon compteur. L’explication détaillée de ce qui s’affiche est là. Je vais donc m’intéresser aux valeurs de PTEC (le tarif en cours), DEMAIN (la couleur du lendemain) et PAPP (la puissance apparente).

Sur un Raspberry PI
Un Raspberry PI, à proximité de mon compteur, via un script Python va relayer vers mon relai MQTT les informations qui m’intéressent. En plus du package python3, il nous donc faut les packages python3-serial et python3-paho-mqtt.
Un utilisateur dédié
Comme, j’aime bien séparer les droits d’accès, nous allons créer un utilisateur dédié. De plus, je note que pour accéder au port série, il faut être membre du groupe ‘dialout’, nous ajoutons donc ce nouvel utilisateur à ce groupe.
pi@c:~ $ ls -l /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 0 août 20 21:26 /dev/ttyUSB0 pi@c:~ $ sudo adduser teleinfo Ajout de l'utilisateur « teleinfo » … Ajout du nouveau groupe « teleinfo » (1002) … Ajout du nouvel utilisateur « teleinfo » (1002) avec le groupe « teleinfo » … Création du répertoire personnel « /home/teleinfo »… Copie des fichiers depuis « /etc/skel »… Nouveau mot de passe : Retapez le nouveau mot de passe : passwd: password updated successfully Changing the user information for teleinfo2 Enter the new value, or press ENTER for the default Full Name []: Teleinfo Room Number []: Work Phone []: Home Phone []: Other []: Cette information est-elle correcte ? [O/n]O pi@c:~ $ sudo usermod -G dialout teleinfo pi@c:~ $
Un script pour pousser les données
Nous coupons la session en cours, pour nous reconnecter sous l’identité de ce nouvel utilisateur. Avec notre éditeur préféré, nous créons un joli script /home/teleinfo/teleinfo-enedis.py
#!/usr/bin/python3 import time import serial import paho.mqtt.client as mqtt ser = serial.Serial( port='/dev/ttyUSB0', baudrate=1200, # 1200 bauds bytesize = serial.SEVENBITS, # 7bits parity = serial.PARITY_EVEN, # parité paire stopbits = serial.STOPBITS_ONE, # un bit de stop xonxoff = False, # pas de contrôle de flux timeout = 1 ) def on_disconnect(mqtc, obj, rc): print("reconnecte") mqttc.reconnect() print("Lancement téléinfo") # creation du client MQTT mqttc = mqtt.Client(client_id="teleinfo") # connexion au relai mqttc.connect("mqtt-relai.home", 1883, 60) # pour traiter les éventuels évènements mqttc.loop_start() boucle infinié while 1: # lecture d'une ligne de données x = ser.readline() # on transforme en chaine et un peu de nettoyage x = x.decode('utf-8').rstrip() # on sépare les champs" c=x.split(' ') # puis on sélectionne ceux qui nous intesse if c[0] == "PTEC": mqttc.publish("teleinfo/couleurJour",c[1]) if c[0] == "DEMAIN": mqttc.publish("teleinfo/couleurDemain",c[1]) if c[0] == "PAPP": # autant changer le type de données maintenant. mqttc.publish("teleinfo/puissance",int(c[1]))
Là, nous le transformons en exécutable avec un chmod +x et le lançons. Puis, nous regardons si cela fonctionne sur le relai MQTT.
marc@mqtt-relai:~$ mosquitto_sub -h localhost -t "#" -v teleinfo/couleurJour HPJB teleinfo/couleurDemain ---- teleinfo/puissance 780 teleinfo/couleurJour HPJB teleinfo/couleurDemain ---- teleinfo/puissance 780 teleinfo/couleurJour HPJB teleinfo/couleurDemain ---- teleinfo/puissance 780
\o/, youpi, cela fonctionne… dans un terminal.
Lançons-le au boot
Inspirons-nous d’un tutoriel. Dans /etc/systemd/system créons un fichier sous root dénommé teleinfo.service et contenant :
[Unit] Description=Teleinfo compteur Enedis After= multi-user.target [Service] ExecStart=/home/teleinfo/teleinfo-enedis.py StandardOutput=inherit StandardError=inherit User=teleinfo Group=dialout [Install] WantedBy=graphical.target
Edit du 11/09/2018 : En recopiant le tuto, j’avais mis after=network.target. À ce moment du boot, l’interface réseau est « up », mais n’a pas encore d’adresse IP. Du coup, le démarrage du service était aléatoire.
Toujours sous root, on lance le service et on l’inscrit pour un démarrage au boot.
teleinfo@c:~$ sudo systemctl start teleinfo.service teleinfo@c:~$ sudo systemctl enable teleinfo.service
Il est conseillé de rebooter pour vérifier que le service démarre bien.
Pour la collecte des données, c’est terminé. Regardons la présentation de celle-ci côté Home Assistant
Home Assistant
Les capteurs dans la configuration.
Dans notre fichier de configuration global ou de « sensors » (si nous avons un fichier séparé), ajoutons les trois valeurs collectées
- platform: mqtt name: "teleinfo.couleurJour" state_topic: "teleinfo/couleurJour" - platform: mqtt name: "teleinfo.couleurDemain" state_topic: "teleinfo/couleurDemain" device_class: power - platform: mqtt name: "teleinfo.puissance" state_topic: "teleinfo/puissance" unit_of_measurement: "VA" device_class: power
Ajout de la jauge
Pour la puissance apparente, une jauge convient parfaitement. Entrons en édition de l’interface, ajoutons une carte « gauge ». J’ai mis 9000 comme valeur maximale, cela correspond à mon abonnement 9kW/45A. Pour ajouter de la couleur activons « define severity » et saisissons des valeurs intermédiaires.

Un « horizontal stack »
En lisant la doc de l’interface graphique de Home Assistant, nous constatons que la carte ‘picture’ permet de changer l’image de fond en fonction de la valeur d’une sonde. Pile ce qu’il nous faut, nous n’afficherons que des images aux couleurs des tarifs et supprimerons les autres paramètres. Avec Gimp j’ai crée une dizaine d’images de 200×200 correspondant aux différents états et les ai stockées dans /usr/share/hassio/homeassistant/www/icons (ces répertoires n’existent pas par défaut il faut les créer). Dans le paramétrage de l’image, le répertoire ‘www’ correspond à /local.
Nous devons afficher le tarif en cours (bleu, blanc, rouge + HP/HC) et la couleur du lendemain. Nous assemblons les deux images dans un ‘horizontal stack’ pour les mettre côte à côte. Éditons l’interface et ajoutons un ‘horizontal-stack’ comme suit :

Au final nous avons ceci :

On peut aussi ajouter une automatisation envoyant sur une messagerie, une notification lorsque la couleur du lendemain passe au rouge.
très bon post !! j’ai pu intégrer ma téléinfo facilement à HA,
j’ai un problème d’équilibrage de phase dans mon installation triphasé, ça va vraiment m’aider ; merci
Merci du commentaire. Je n’avais pas imaginé l’usage pour l’équilibrage des phases.
ce script fonctionne bien mais uniquement en mode historique sur le linky. le mode standard est plus sioux et demande a ce que le checksum des trames soient vérifié….
Ayant le compteur présenté sur la photo, je ne saurai dire si ce script fonctionne avec le Linky.