Relever sa consommation d’électricité sur Home Assistant

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 . Je vais donc m’intéresser aux valeurs de PTEC (le tarif en cours), DEMAIN (la couleur du lendemain) et PAPP (la puissance apparente).

port série compteur EDF

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 teleinfo2
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
teleinfo@c:~$ sudo systemctl enable teleinfo

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.

Jauge puissance

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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *