Suivi consommation électrique compteur EDF Linky avec Raspberry Pi Zero W
C'est un petit projet qui date un peu auquel je ne m'étais jamais attelé. Connecter un Raspberry Pi au compteur EDF. J'avais avant le modèle blanc et bleu avec un afficheur LCD. Depuis quelques mois c'est le sulfureux Linky qui trône au dessus du tableau électrique. Comme l'ancien, ce compteur possède une sortie dite de "téléinformation" coté client. Une sorte de port informatique à relier à un ordinateur pour obtenir des informations avec protocole UART-TTL ("série"). Autant dire de suite que je n'ai rien inventé, j'ai juste appliqué une petite recette que vous pourrez retrouver sur ce site : http://www.magdiblog.fr/gpio/teleinfo-edf-suivi-conso-de-votre-compteur-electrique/ ou sur le blog de Charles (créateur du shield). Recette suivie également par Pierre Dandumont.
Attention il existe deux protocoles de communication, le mode historique (celui que j'ai) et le mode standard. N'hésitez pas à regarder ces liens :
Comme vous le savez sans doute il existe beaucoup de versions différentes du Raspberry Pi. Le plus adapté à cet usage est bien sûr le modèle zéro. Pas la peine d'avoir plein de ports USB, pas besoin de multi-cœurs, pas besoin de sortie son. L'objet devant être le plus discret possible, moins il prend de place et mieux c'est. Le modèle zéro est disponible en plusieurs versions. La plus intéressante étant la version Zero W qui embarque le Bluetooth et le Wi-Fi en intégré. L'appareil est donc accessible à distance sans fil et sans avoir à devoir bricoler une interface réseau ou acheter un dongle USB-Ethernet ou Wi-Fi.
Pour capter les données du compteur, il y juste à lire les données arrivant d'un port série (broche RXD). Il existe deux matériels disponibles pour lire les données du compteur depuis un RPi :
J'ai opté pour la première solution qui est plus classe que de passer par le port USB dans le cas d'un modèle Zéro. Car cela réclame un fil adaptateur micro-USB qui pendouille. Pour les autres modèles 1/2/3 à vous de voir. Dans ce cas il faut le "header" (les broches GPIO à souder soi-même). J'ai acheté le module (shield) PiTInfo de Charles disponible sur Tindie. Il consiste uniquement à un petit PCB rouge :
Concernant la solution via USB, c'est la même chose mais avec un FT230XS qui fait pont USB-UART :
Le RPi peut dans ce cas être utilisé de plusieurs façons, en lui confiant plus ou moins de tâches à réaliser. Est-il simplement un lecteur de port série et envoyer ce qu'il lit ailleurs ? Doit-il stocker les données collectées en local ? Doit-il intégrer lui-même un site ou une interface de restitution des données ?
Pour le moment, c'est la troisième solution que j'ai choisi car c'est la plus simple sinon il faut éparpiller l'application.
Un problème se pose, comment alimenter le RPi ? N'ayant pas de prise à proximité, j'ai opté pour la solution la moins chère (4 euros) : ajouter une prise au tableau électrique.
Il existe des solutions plus élégantes à base de modules d'alimentations sur rail DIN mais c'est un peu plus cher. Maintenant que je sais que ça marche, cette solution me tente pour plus tard. Car cela permettrait d'enfouir le RPi. C'est chose faite en novembre 2018.
Bon je ne vais pas trop m'étendre sur cette étape, vue, revue, et re-revue maintes fois sur le web. Prendre le fichier image de la distribution raspbian disponible sur le web et l'installer sur une carte microSD.
On boot dessus. Pour cela il faut relier un écran et un clavier. 3 câbles : alimentation en micro-USB, clavier en micro-USB et vidéo en mini-HDMI :
Il est vivant :
Login OK. Utilisateur = "pi" et mot de passe = "raspberry". Attention le clavier est en qwerty il faut donc taper "rqspberry".
Avant de rendre le RPi autonome il faut le configurer. Déjà passer le clavier en français :
https://raspberrypi.stackexchange.com/questions/10060/raspbian-keyboard-layout
Ensuite il faut que le RPi se connecte de lui-même au Wi-Fi local :
https://core-electronics.com.au/tutorials/raspberry-pi-zerow-headless-wifi-setup.html
On s’aperçoit que le service ssh est désactivé au démarrage. Il faut donc l'activer. Son démarrage est OK.
Ensuite tant qu'on y est un récupère l'adresse MAC de l'interface wi-fi wlan0 :
Reboot final pour test, le RPi a bien récupéré son adresse 192.168.0.5 !
Maintenant que le RPi est autonome, il reste à le poser (coller) au disjoncteur général 500mA.
Ok c'est moche, mais ça fonctionne.
Il reste encore à peaufiner quelques détails... maintenant on fait ça tranquille via SSH.
On vérifie que le RPi peut accéder au réseau local et à internet.
On configure les fichiers config.txt et cmdline.txt pour activer le port série du GPIO :
https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/
Après reboot, il y a bien 2 ports série, un ttyS0 qu'il faudra utiliser et le ttyAMA0 pour le Bluetooth.
Un petit essai avec picocom avec une vitesse de 1200 bauds, 7 bits de données, parité paire, aucune gestion du flux de données.
On voit des infos texte débouler du compteur. CTRL-A et CTRL-Q pour quitter picocom.
Si on laisse défiler, on remarque le compteur crache en permanence le même pavé/bloc de 11 lignes séparé par le caractère ASCII n°2 = STX (Start of Text) :
Après avoir installé Apache2 et PHP 7.0, il faut ensuite déposer les scripts PHP sur le RPi et placer une exécution automatique en crontab. On relève la consommation toutes les minutes 24h/24 7j/7.
On vérifie que les données sont bien stockées dans la base sqlite3 :
En cas de problème, les logs d'erreurs peuvent donner des pistes :
Reste à configurer la timezone via l'outil raspi-config :
On installe également NTP pour conserver le RPi toujours à l'heure :
Ne pas oublier aussi de désactiver la mise en veille du Wi-Fi : https://www.raspberrypi.org/forums/viewtopic.php?t=194619
On peut également installer phpliteadmin pour administrer la base sqlite3 à distance via navigateur à la manière d'un phpMyAdmin :
Ça marche. Les graphiques sont construits par la bibliothèque JS Charts de Google. Un accès au net est donc nécessaire pour générer les graphiques.
J'ai l'impression que ça marche moyen (que font ici les années 2030, 2040, 2050 ???). Et j'ai toujours le décalage de l'heure dans les données restituées en web alors que bash me donne la bonne heure système. Les scripts sont prévus pour PHP 5.0 et j'ai installé la 7.0. Cela reste à creuser.
Résolution de problèmes de stabilité du port série. Bascule de module UART.
Attention il existe deux protocoles de communication, le mode historique (celui que j'ai) et le mode standard. N'hésitez pas à regarder ces liens :
- https://lucidar.me/fr/home-automation/linky-customer-tele-information/
- https://www.yadnet.com/domotique/protocole-teleinfo-du-compteur-linky/
- https://forum.jeedom.com/viewtopic.php?f=149&t=39461
Choix du Raspi
Comme vous le savez sans doute il existe beaucoup de versions différentes du Raspberry Pi. Le plus adapté à cet usage est bien sûr le modèle zéro. Pas la peine d'avoir plein de ports USB, pas besoin de multi-cœurs, pas besoin de sortie son. L'objet devant être le plus discret possible, moins il prend de place et mieux c'est. Le modèle zéro est disponible en plusieurs versions. La plus intéressante étant la version Zero W qui embarque le Bluetooth et le Wi-Fi en intégré. L'appareil est donc accessible à distance sans fil et sans avoir à devoir bricoler une interface réseau ou acheter un dongle USB-Ethernet ou Wi-Fi.
Captation des données & Module
Pour capter les données du compteur, il y juste à lire les données arrivant d'un port série (broche RXD). Il existe deux matériels disponibles pour lire les données du compteur depuis un RPi :
- soit depuis le port UART intégré au connecteur GPIO
- soit depuis un dongle USB contrôleur UART indépendant
J'ai opté pour la première solution qui est plus classe que de passer par le port USB dans le cas d'un modèle Zéro. Car cela réclame un fil adaptateur micro-USB qui pendouille. Pour les autres modèles 1/2/3 à vous de voir. Dans ce cas il faut le "header" (les broches GPIO à souder soi-même). J'ai acheté le module (shield) PiTInfo de Charles disponible sur Tindie. Il consiste uniquement à un petit PCB rouge :
Concernant la solution via USB, c'est la même chose mais avec un FT230XS qui fait pont USB-UART :
Choix du stockage des données
Le RPi peut dans ce cas être utilisé de plusieurs façons, en lui confiant plus ou moins de tâches à réaliser. Est-il simplement un lecteur de port série et envoyer ce qu'il lit ailleurs ? Doit-il stocker les données collectées en local ? Doit-il intégrer lui-même un site ou une interface de restitution des données ?
- Mode IoT actif : le Rpi capte les données de manière active : lecture les données de téléinformation déclenchée via crontab locale et envoi des informations dans une base distante stockée ailleurs sur un serveur local ou internet via appel webservice.
- Mode IoT passif : le Rpi capte les données de manière passive : lecture des données de téléinformation sur demande et restitue les données via une connexion distante via SSH ou appel webservice depuis un serveur local ou internet.
- Mode serveur : le RPi capte les données de téléinformation déclenchée via crontab locale, stocke les données en local (sur carte SD) et dispose d'un serveur web interne pour l'interroger à distance. Tout se fait sur le RPi. Rien n'est stocké ailleurs.
Pour le moment, c'est la troisième solution que j'ai choisi car c'est la plus simple sinon il faut éparpiller l'application.
Ajout d'une prise au tableau électrique
Un problème se pose, comment alimenter le RPi ? N'ayant pas de prise à proximité, j'ai opté pour la solution la moins chère (4 euros) : ajouter une prise au tableau électrique.
Il existe des solutions plus élégantes à base de modules d'alimentations sur rail DIN mais c'est un peu plus cher. Maintenant que je sais que ça marche, cette solution me tente pour plus tard. Car cela permettrait d'enfouir le RPi. C'est chose faite en novembre 2018.
Préparation de la carte microSD
Bon je ne vais pas trop m'étendre sur cette étape, vue, revue, et re-revue maintes fois sur le web. Prendre le fichier image de la distribution raspbian disponible sur le web et l'installer sur une carte microSD.
- http://matechnologie.com/spip.php?article301
- http://www.mistipi.com/raspberry-pi-creer-une-image-de-votre-carte-sd-avec-win32-disk-imager/
- https://etcher.io/
Premier démarrage
On boot dessus. Pour cela il faut relier un écran et un clavier. 3 câbles : alimentation en micro-USB, clavier en micro-USB et vidéo en mini-HDMI :
Il est vivant :
Login OK. Utilisateur = "pi" et mot de passe = "raspberry". Attention le clavier est en qwerty il faut donc taper "rqspberry".
Configuration locale
Avant de rendre le RPi autonome il faut le configurer. Déjà passer le clavier en français :
https://raspberrypi.stackexchange.com/questions/10060/raspbian-keyboard-layout
Ensuite il faut que le RPi se connecte de lui-même au Wi-Fi local :
https://core-electronics.com.au/tutorials/raspberry-pi-zerow-headless-wifi-setup.html
On s’aperçoit que le service ssh est désactivé au démarrage. Il faut donc l'activer. Son démarrage est OK.
Ensuite tant qu'on y est un récupère l'adresse MAC de l'interface wi-fi wlan0 :
Reboot final pour test, le RPi a bien récupéré son adresse 192.168.0.5 !
Installation au compteur
Maintenant que le RPi est autonome, il reste à le poser (coller) au disjoncteur général 500mA.
Ok c'est moche, mais ça fonctionne.
Configuration à distance
Il reste encore à peaufiner quelques détails... maintenant on fait ça tranquille via SSH.
On vérifie que le RPi peut accéder au réseau local et à internet.
On configure les fichiers config.txt et cmdline.txt pour activer le port série du GPIO :
https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/
Tests de lecture du port série
Après reboot, il y a bien 2 ports série, un ttyS0 qu'il faudra utiliser et le ttyAMA0 pour le Bluetooth.
Un petit essai avec picocom avec une vitesse de 1200 bauds, 7 bits de données, parité paire, aucune gestion du flux de données.
On voit des infos texte débouler du compteur. CTRL-A et CTRL-Q pour quitter picocom.
Si on laisse défiler, on remarque le compteur crache en permanence le même pavé/bloc de 11 lignes séparé par le caractère ASCII n°2 = STX (Start of Text) :
Installation de l'application (scripts PHP)
Après avoir installé Apache2 et PHP 7.0, il faut ensuite déposer les scripts PHP sur le RPi et placer une exécution automatique en crontab. On relève la consommation toutes les minutes 24h/24 7j/7.
On vérifie que les données sont bien stockées dans la base sqlite3 :
En cas de problème, les logs d'erreurs peuvent donner des pistes :
Encore quelques réglages...
Reste à configurer la timezone via l'outil raspi-config :
On installe également NTP pour conserver le RPi toujours à l'heure :
Ne pas oublier aussi de désactiver la mise en veille du Wi-Fi : https://www.raspberrypi.org/forums/viewtopic.php?t=194619
Un outil supplémentaire...
On peut également installer phpliteadmin pour administrer la base sqlite3 à distance via navigateur à la manière d'un phpMyAdmin :
Tadaaaa !
Ça marche. Les graphiques sont construits par la bibliothèque JS Charts de Google. Un accès au net est donc nécessaire pour générer les graphiques.
J'ai l'impression que ça marche moyen (que font ici les années 2030, 2040, 2050 ???). Et j'ai toujours le décalage de l'heure dans les données restituées en web alors que bash me donne la bonne heure système. Les scripts sont prévus pour PHP 5.0 et j'ai installé la 7.0. Cela reste à creuser.
MAJ du 2 octobre 2018
Résolution de problèmes de stabilité du port série. Bascule de module UART.