Superviser sa consommation d'électricité

mar. 03 nov. 2020 by Marmotte

Lorsqu'on veut améliorer quelque chose (un objet, un comportement, un fonctionnement...), il est nécessaire de pouvoir l'analyser, afin de mieux le connaître. C'est une des raisons pour lesquelles j'ai voulu intégrer la consommation électrique de mon logement dans mon système de supervision.

Linky : Le compteur connecté

La première idée qui m'est venue, puisque mon logement dispose d'un compteur Linky, est d'utiliser les données qu'il transmet à Enedis. Ça avait l'avantage d'être simple et rapide à mettre en place... jusqu'à début 2020.

Pour cela, j'ai créé un compte sur le site Enedis, et j'ai écris un script à l'aide de la bibliothèque pyLinky (ou plus exactement, un fork de cette bibliothèque dans lequel j'ai corrigé un bug qui intervient lors du changement d'heure d'hiver).

Cette approche avait cependant quelques inconvénients :

  • Le compteur Linky ne transmet ses données qu'une fois par jour, je n'avais donc pas les informations en direct.
  • Il ne transmet qu'un point toutes les 30 minutes, ce qui ne donne pas une précision suffisante.
  • Les données reçues n'indiquent pas le tarif correspondant, j'ai donc écrit en dur les horaires dans le code.

Le module pyLinky, comme toutes les bibliothèques équivalentes, se connectait sur le site Enedis, puis utilisait l'API de l'interface web pour récupérer les données. Cependant, ce fonctionnement ne semblait pas convenir à Enedis, puisqu'ils ont ajouté un captcha début 2020.

Parallèlement au blocage de cet accès, ils ont développé une API destinée à l'automatisation. Le problème est que pour utiliser cette API avec des données réelles, il faut absolument fournir un numéro de SIRET et signer un contrat. N'étant qu'un particulier, je n'y ai donc pas accès, et je trouve aberrant de devoir donner accès à mes données à une entreprise uniquement dans le but de pouvoir y accéder moi-même. Je ne peux donc pas utiliser cette API, et je refuse d'utiliser un des nombreux services qui ont dû être mis en place pour permettre aux box domotiques de pouvoir continuer à recevoir les informations du compteur Linky.

La sortie TIC (TéléInformation Client)

La sortie TIC, disponible sur de nombreux compteurs EDF (pas uniquement le Linky), permet au client de récupérer les informations transmises par le compteur en direct. Je connaissais cette solution depuis longtemps, mais, étant plus complexe à mettre en place, je l'avais laissée de coté. Maintenant que mon accès aux données du Linky est plus difficile, je me suis enfin motivé à utiliser la sortie TIC.

Description

La sortie TIC n'est finalement qu'un simple port série, qui envoie des données en continu. Elle se présente sous la forme de deux connecteurs, dans lesquels on peut insérer des fils, afin de pouvoir connecter un dispositif adapté.

L'interroger directement permet de récupérer les données de consommation instantanément, sans attendre le lendemain, et permet d'avoir un point toutes les deux secondes environ.

Montage électronique

De nombreux schémas du montage électronique nécessaire pour s'interfacer avec la sortie TIC sont disponibles sur Internet. La plupart sont basés sur un optocoupleur SFH620A. Cependant, le magasin d'éleectronique dans lequel je suis allé n'en possédait pas, j'ai donc opté pour un PC817, comme proposé par akila dans son article sur le même sujet.

N'ayant pas la possiblité de connecter directement le compteur à une machine de mon réseau, j'ai acheté un OrangePi Zero afin de l'utiliser comme intermédiaire placé directement dans l'armoire électrique, au plus près du compteur, grâce à sa petite taille. Il sera connecté au réseau en WiFi, évitant ainsi d'avoir à tirer des câbles dans tout le logement.

Préparation de l'OrangePi Zero

Deux possibilités existent pour connecter un tel montage sur un OrangePi Zero : Par le port USB, ou directement connecté à un UART disponible sur les pins GPIO. N'ayant pas envie de cumuler plusieurs montages à la suite (TIC-UART, puis UART-USB), j'ai opté pour la connexion par le GPIO. Cependant, même si l'OrangePi Zero dispose de GPIO, aucun connecteur n'est présent lors de l'achat de la carte, j'ai donc dû en souder un.

OrangePi Zero GPIO

Coté logiciel, il est nécessaire qu'un UART du GPIO soit activé. Le dtb fourni par Armbian, que j'utilise sur ma Debian, ne les active pas par défaut. Il est alors nécessaire d'ajouter un override qui s'en charge. Cette partie n'étant pas le sujet principal de cet article, je ne m'étends pas plus ici.

Prototype

Une fois les composants rassemblés, j'ai réalisé le montage sur une plaque d'expérimentation :

Prototype

Le prototype m'a permis, entre autres, de trouver la bonne valeur de résistance à placer en sortie de l'optocoupleur. En effet, les schémas présents sur internet proposent beaucoup de valeurs différentes, il ne semble pas y avoir de consensus à ce niveau. Le rôle de cette résistance est principalement de placer le niveau du signal de sortie dans les normes attendues par l'UART pour la bonne détection des bits 0 et 1. Après quelques tests, j'ai réussi à avoir un signal correct avec une résistance de 10kΩ.

Afin de tester la lecture des données reçues sur le port série, il suffit de configurer le port sur lequel est connecté le montage (/dev/ttyS1 dans mon cas), puis de lire ce qui y transite au moyen de cat, screen, ou équivalent. Mon compteur Linky fonctionnant en mode historique, les paramètres du port série sont les suivants :

  • Vitesse : 1200 bauds
  • Un bit de start
  • Sept bits de données (caractère ASCII)
  • Un bit de parité paire
  • Un bit de stop

Ce qui correspond, pour configurer le port série, à la commande :

$ sudo stty -F /dev/ttyS1 1200 sane evenp parenb cs7 -crtscts

Si le montage est correct, la sortie ressemble à cela :

IMAX 090 H
PAPP 02390 /
HHPHC A ,
MOTDETAT 000000 B
ADCO XXXXXXXXXXXX ;
OPTARIF HC.. <
ISOUSC 30 9
HCHC XXXXXXXXX ,
HCHP XXXXXXXXX 1
PTEC HC.. S
IINST 011 Y
IMAX 090 H
PAPP 02390 /
HHPHC A ,
MOTDETAT 000000 B
ADCO XXXXXXXXXXXX ;
OPTARIF HC.. <
ISOUSC 30 9
HCHC XXXXXXXXX -
HCHP XXXXXXXXX 1
PTEC HC.. S
IINST 011 Y
IMAX 090 H

Réalisation du montage final

Une fois la communication établie, j'ai pu passer à l'assemblage et au soudage du circuit final. Rien de particulier à cette étape, à part le petit trou percé dans le boîtier de mon OrangePi Zero pour permettre aux deux fils de données d'en sortir.

Circuit final

Réalisation de la partie logicielle

Après avoir réussi à établir la communication et faire défiler les informations dans une console, il est temps de développer un script pour permettre le stockage de ces informations. Comme d'habitude, je me suis tourné vers le langage Python pour envoyer les informations dans mon InfluxDB.

Deux bibliothèques nécessaires sont pyserial et influxdb. Sous Debian, il suffit d'installer les paquets python3-serial et python3-influxdb.

Une fois la lecture de données fonctionnelle depuis un programme python, il est nécessaire de décoder le contenu reçu. La documentation décrit le format des trames envoyées, ainsi que la méthode de calcul de la somme de contrôle.

Comme les précédents, mon script est disponible sur Framagit.

J'ai ensuite ajouté un panneau dans un dashboard Grafana existant pour afficher ces données.

Données TIC

Finalisation

Après avoir réuni tous les éléments nécessaire, il reste à mettre en place physiquement l'OrangePi Zero, fixé au tableau électrique au moyen d'un petit morceau de velcro adhésif pour pouvoir le retirer temporairement si nécessaire. Le câble de l'alimentation passe dans la charnière de la porte, et ne gène ni l'ouverture, ni la fermeture de celle-ci.

Projet terminé