O Ouvrir le menu
Les notes d'Ailothaen

Mesures et graphiques d'un compteur Linky avec un Raspberry Pi et Grafana – Partie 2/2 (logiciel)

Articles techniques

Suite de l'article sur comment lire les données d'un compteur Linky avec un Raspberry Pi.
La première partie était dédiée à la connexion physique entre le Raspberry et le Linky, dans cette deuxième partie nous allons lire les données et les exploiter.

Se connecter au compteur

Le protocole de communication est simple : il s'agit d'une simple transmission série RS232. Le compteur crache en permanence ses informations, il suffit donc de se mettre à écouter et récupérer ce qui nous intéresse.

Si vous avez branché correctement la carte électronique sur les broches du Raspberry Pi, vous devriez la voir apparaître en tant que /dev/ttyS0 (ou similaire) :

root@hephaistos:~ # ls /dev/ttyS*
/dev/ttyS0

(Si /dev/ttyS0 n'apparaît pas, vérifiez que vous avez bien activé la transmission série dans raspi-config)

Les paramètres sont normalement : 1200 bauds, 7 bits de données et pas de contrôle de flux.
Si tout est fait correctement, vous devriez voir ceci apparaître (pour quitter picocom, il faut faire Ctrl+A puis Ctrl+X, oui c'est tordu) :

root@hephaistos:~ # picocom -b 1200 -d 7 -f n /dev/ttyS0
picocom v3.1

port is        : /dev/ttyS0
flowcontrol    : none
baudrate is    : 1200
parity is      : even
databits are   : 7
stopbits are   : 1
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
hangup is      : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv -E
imap is        :
omap is        :
emap is        : crcrlf,delbs,
logfile is     : none
initstring     : none
exit_after is  : not set
exit is        : no

Type [C-a] [C-h] to see available commands
Terminal ready
002078240 "
PTEC TH.. $
IINST 000 W
IMAX 090 H
PAPP 00070 (
HHPHC A ,
MOTDETAT 000000 B
ADCO xxxxxxxxxxxx O
OPTARIF BASE 0
ISOUSC 30 9
BASE 002078240 "
PTEC TH.. $
IINST 000 W
IMAX 090 H
Terminating...
Thanks for using picocom

Ça marche ! On voit apparaître des données qui nous intéressent : IMAX est la puissance maximale de l'abonnement, BASE est le compteur en Wh, PAPP est la puissance en kVA utilisée actuellement... Le dernier caractère est la somme de contrôle.
La liste complète des champs est dans la même documentation que celle en partie 1.

Parfait, cela fonctionne ! Prochaine étape, mettre ces données dans une base de données !

Un service pour tout récupérer (et enregistrer)

À partir de là, il est possible d'exploiter ces données en faisant un script avec le langage de votre choix, tant qu'il peut écouter une transmission série.

J'ai réalisé un service Python qui se connecte à cette transmission, et enregistre toutes les minutes les données qui nous intéressent (compteur et puissance instantanée notamment) dans une base de données MySQL. Une fois par jour, le service fait également un « résumé » de la journée, et le stocke dans une autre table (cela permet de grandement simplifier la suite).
Le dépôt Github se trouve ici. Je vais utiliser ce code pour la suite, mais vous pouvez faire le vôtre si vous n'aimez pas Python 🙂

D'abord, nous allons installer le serveur MariaDB et créer une base ainsi qu'un utilisateur associé à cette base. Je ne vais pas m'étendre là-dessus, il y a beaucoup d'autres articles expliquant comment faire, comme celui-là ou celui-là.

Ensuite, placez le code du Github dans un répertoire sur votre Raspberry (j'ai choisi /srv/linky, donc il faudra le changer dans les fichiers de configuration si vous le mettez ailleurs). Installez les dépendances avec python3 -m pip install -r requirements.txt, puis éditez le fichier config.yml pour mettre les bons paramètres pour la connexion à la base et au port série.

Enfin, placez le fichier linky.service dans /etc/systemd/system (en éditant éventuellement l'utilisateur et le répertoire spécifiés à l'intérieur), puis lancez les commandes suivantes :

systemctl daemon-reload
systemctl enable linky
systemctl start linky

Cela permet de créer un service qui va faire tourner notre script en continu.

Attendez quelques minutes, et si tout fonctionne normalement, la base de données devrait commencer à se remplir :

root@hephaistos:/srv/linky # mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
(...)
MariaDB [(none)]> use linky;
(...)
MariaDB [linky]> select * from stream;
+---------------------+---------+------+-----------+
| clock               | BASE    | PAPP | BASE_diff |
+---------------------+---------+------+-----------+
| 2022-07-14 17:02:55 | 2086442 |   70 |         0 |
| 2022-07-14 17:03:57 | 2086443 |   70 |         1 |
| 2022-07-14 17:04:58 | 2086443 |   70 |         0 |
+---------------------+---------+------+-----------+
4 rows in set (0.002 sec)

Si cela ne fonctionne pas, regardez soit dans les logs du script Python (dossier logs), soit dans les logs du service (journalctl -u linky)

Affichage dans de jolis graphiques

Nous avons maintenant une table dans une base de données qui se remplit automatiquement. Mais des données brutes, c'est compliqué à visualiser... Il nous faudrait donc une interface de visualisation.

Nous pouvons pour cela utiliser Grafana. Il s'agit d'un logiciel côté serveur qui se connecte à une source de données (une base de données, un fichier texte, un service) et qui peut générer des graphiques selon les paramètres qu'on veut. Il est initialement prévu pour de la métrologie : supervision de serveurs, de sondes de température, etc. Cela tombe bien, c'est exactement notre cas d'utilisation.

Vous trouverez ici les instructions officielles sur comment installer Grafana. La partie compliquée est de choisir la bonne architecture. Si comme moi vous avez un Raspberry Pi Zero, c'est l'architecture « ARMv6 ».
Une fois installé, vous devez installer le service, et attendre une ou deux minutes le temps que Grafana s'initialise pour la première fois :

systemctl daemon-reload
systemctl enable grafana-server
systemctl start grafana-server

Ensuite, allez sur http://IP_DE_VOTRE_RASPBERRY:3000. Vous devriez voir la fenêtre de connexion (par défaut les identifiants sont admin / admin)

grafana1.png, juil. 2022

Pour créer des graphiques, il faut d'abord dire à Grafana où trouver les données. Allez dans Configuration > Data Sources :

grafana2.png, juil. 2022
... puis ajoutez la base de données en sélectionnant le type « MySQL ».

Ensuite, créons un nouveau dashboard (c'est une vue qui affiche un ou plusieurs graphiques) :

grafana3.png, juil. 2022

... et créez un panel (une boîte qui contient un graphique).

grafana4.png, juil. 2022

Vous pouvez soit utiliser l'éditeur de requêtes, soit écrire une requête SQL à la main. Personnellement j'ai écrit cette requête SQL qui permet de récupérer la puissance instantanée sur une période et de l'afficher :

SELECT
  clock AS "time",
  PAPP
FROM stream
WHERE
  $__timeFilter(clock)
ORDER BY clock

Une fois la requête indiquée, Grafana sait chercher automatiquement les données et les affiche. (La période peut se régler en haut à gauche).

notice.png, juil. 2022
La classe, non ?

Enregistrez le graphique. Il sera désormais visible sur votre dashboard quand vous y accéderez. Vous avez la possibilité de changer le panel de taille/place, et de créer plusieurs panels sur un dashboard.

Vous savez maintenant comment ça marche. Vous pouvez vous amuser avec l'interface pour générer d'autres types de graphiques, changer la couleur de la ligne, changer la période pour comparer des journées par exemple...
Un autre exemple de graphique intéressant est la consommation sur une journée entière (SELECT clock AS "time", BASE_diff/1000 AS "kWh" FROM `dailies` WHERE $__timeFilter(clock);).
Ensuite, vous pouvez découvrir les possibilités de Grafana en générant plusieurs dashboards, autoriser à voir certains dashboards/graphiques sans avoir à se connecter...

Amusez-vous bien ! 🦉

aucun commentaire

Ajouter un commentaire