Suivre sa consommation avec un Raspbbery Pi et le téléinfo d’EDF

Un petit projet que je prévoyais depuis longtemps : mesurer ma consommation électrique plus ou moins en temps réel avec un Raspberry Pi. Si vous avez un compteur EDF assez récent (moins de 10 ans), c’est assez simple à faire avec un Raspberry Pi, même si les valeurs restent indicatives (et surévaluées, je l’explique dans le texte).

C’est assez long, je vous préviens. Première chose, le matériel. J’ai utilisé un Raspberry Pi A+ relié en Wi-Fi et – pour m’éviter les soudures – un adaptateur pour connecter directement la prise téléinfo aux GPIO du Raspberry Pi. Ca existe aussi en USB () et il est parfaitement possible de se monter l’adaptateur manuellement, ce site (sur lequel j’ai récupéré le code) l’explique.

Le branchement au compteur ne pose pas de soucis : il existe deux prises (à vis) dans lesquelles il suffit de mettre des câbles et c’est tout. Pas besoin de couper le courant, étant donné que le disjoncteur est généralement après le compteur.

La prise sur le compteur

La prise sur le compteur


Le Raspberry Pi et son adaptateur sur GPIO

Le Raspberry Pi et son adaptateur sur GPIO

La partie logicielle demande plus de travail pour un truc propre.

Première chose, mettre à jour l’OS.

sudo apt-get update
sudo apt-get upgrade

Ensuite, lancez un raspi-config et désactivez la console série dans les options. Il est aussi nécessaire de bien fixer la date (et le lieu) pour être certain d’être à l’heure.

sudo raspi-config

Enfin, une petite modification est nécessaire pour lire correctement les données téléinfo.

sudo nano /etc/rc.local

Dans le fichier, juste avant exit 0, il faut ajouter la ligne suivante.

stty -F /dev/ttyAMA0 1200 sane evenp parenb cs7 -crtscts

Un truc que je fais toujours, ce qui simplifie l’accès à distance avec un Mac, c’est d’annoncer via Bonjour. J’explique ça sur un post dédié.

Etape suivante, un serveur Web. L’idée va être de faire une page dédiée avec les données. J’ai utilisé ce qui est expliqué sur ce site, avec quelques corrections.

sudo apt-get install apache2 php5 php5-sqlite libapache2-mod-php5
sudo a2enmod rewrite
sudo /etc/init.d/apache2 restart
cd /var/www/html
sudo rm index.html

Premièrement, le fichier avec les fonctions (teleinfo_func.php) du magdiblog. Vu la taille, je vous mets la version originale directement là. Les corrections à effectuer :

ligne 10, remplacer $handle = fopen ('/dev/ttyACM0', "r"); par $handle = fopen ('/dev/ttyAMA0', "r");.
ligne 3, remplacer $sqlite = 'teleinfo.sqlite'; par $sqlite = '/home/pi/teleinfo.sqlite';.
ligne 137, remplacer $month = date("n", $row['timestamp']-1); par $month = date("n", $row['timestamp'])-1;.
ligne 142, remplacer kW par W.

Ensuite, un fichier qui va récupérer la puissance (en V.A, je vais développer ensuite).

sudo nano teleinfo_puissance.php

Le contenu :
#!/usr/bin/php5
<?php
header('Content-type: text/html; charset=utf-8');
require_once('/var/www/html/teleinfo_func.php');
handlePuissance();
?>

Ensuite, un fichier qui va récupérer la consommation journalière (en kWh).

sudo nano teleinfo_conso.php

Le contenu :
#!/usr/bin/php5
<?php
header('Content-type: text/html; charset=utf-8');
require_once('/var/www/html/teleinfo_func.php');
handleConso();
?>

Enfin, la page qui va afficher les graphiques. Même chose, c’est un peu long, donc je vous file le fichier brut de Magdiblog.

Pour des raisons pratiques, je l’appelle index.php, avec une modification cosmétique : ligne 21, remplacer kW par W.

Maintenant, il faut lancer les deux petits scripts régulièrement pour stocker les données dans une base de données. Il faut donc les rendre exécutables et programmer une tâche. Le premier toutes les minutes, le second tous les jours à 23h58.

sudo chmod +x teleinfo_puissance.php
sudo chmod +x teleinfo_conso.php

crontab -e

Ajoutez les deux lignes suivantes.

* * * * * php /var/www/html/teleinfo_puissance.php
58 23 * * * php /var/www/html/teleinfo_conso.php

Techniquement, si votre Raspberry Pi est branché, il suffit de tester avec les lignes suivantes.

cat /dev/ttyAMA0

Cette ligne devrait afficher les données envoyées par le compteur. Si rien ne s’affiche, vous avez mal effectué les branchements. Si une seule ligne s’affiche et qu’elle commence par ADCO, la gestion téléinfo n’est pas activée, vous pouvez demander à EDF de le faire.

Normalement, il suffit ensuite de se connecter sur le Raspberry en tapant son adresse IP dans la barre d’adresse pour accéder au graphique.

Un graphique

Un graphique


V.A vs. W

V.A vs. W

Les valeurs en V.A et en W sont intéressantes : elles ne représentent pas la consommation réelle. En fait, la gestion téléinfo ne donne pas en temps réel la consommation en W classique (puissance active), mais bien la consommation en V.A (puissance apparente). Chez les particuliers, c’est la première qui est facturée, la seconde étant plus élevée. En simplifiant, EDF doit envoyer plus de puissance dans le réseau, et c’est cette valeur (non corrigée) qui est affichée. La valeur en V.A est donc systématiquement plus élevée que la valeur facturée par EDF (si des puristes veulent me corriger, pas de soucis). Le script utilisé ici affiche la valeur en V.A mais aussi la valeur en « Watts » qui est en fait calculé de façon basique en multipliant l’intensité renvoyée par 220 V (la tension théorique). En pratique, les deux valeurs de la courbe ne sont pas identiques parce que la tension varie. De plus, comme la gestion téléinfo ne renvoie pas de décimale pour l’intensité, la valeur réelle peut être plus faible ou plus élevée (en fonction de l’intensité réelle et de la façon d’arrondir le résultat). Les valeurs de consommation sont donc surévaluées, mais les courbes restent valables pour identifier un pic de consommation ou un appareil qui se met en marche périodiquement.

Techniquement, il est possible de récupérer la valeur en kWh en comparant deux relevés de consommation, mais ça demande un peu de travail d’adaptation pour le script.

Les bonus

Si comme moi, vous connectez le Raspberry Pi en Wi-Fi, quelques petits trucs.

Premièrement, activer le Wi-Fi et empêcher la mise en veille de la carte.

sudo nano /etc/network/interfaces

Remplacez auto lo par auto wlan0.
Remplacez iface wlan0 inet manual par iface wlan0 inet dhcp.
Ajoutez wireless-power off.

Deuxièmement, configurez les paramètres du réseau.

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

Ajoutez les lignes suivantes (pour un réseau protégé en WPA2).

network={
ssid="YOUR_NETWORK_NAME"
psk="YOUR_NETWORK_PASSWORD"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}

Le second, pratique avec un Mac, c’est d’annoncer la présence de la page sur le réseau, pour un acès via Bonjour. Une fois l’accès SSH activé (comme expliqué là), il suffit des deux commandes suivantes.

sudo nano /etc/avahi/services/teleinfo.service

Avec comme contenu.

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name>Téléinfo</name>
<service>
<type>_http._tcp</type>
<port>80</port>
<txt-record>path=/index.php</txt-record>
</service>
</service-group>

Puis de relancer le démon.

sudo service avahi-daemon restart

Ensuite, la page téléinfo sera accessible via Bonjour avec Safari.