Suivi de consommation électrique avec telinfuse et OpenEnergyMonitor (emoncms)

De manière à pouvoir suivre ma consommation électrique, j’ai cherché une solution réalisable rapidement, à moindre frais, et qui puisse s’intégrer dans un système domotique.

Background

En attendant les compteurs Linky (Big Brother ?), les compteurs électriques français pas trop anciens disposent d’une sortie série  « Téléinfo » accessible à l’usager et permettant de relever les données : numéro du compteur, courant et puissance apparente instantanés,  type de tarification (de base, heure creuse …), relevés de consommation en Wh…

Outre le bon vieux compteur ERDF, il est aussi possible d’installer chez soi d’autres sous-compteurs qui permettront de faire un suivi détaillé de la consommation d’une partie de son installation (un peu encombrant, mais dans un garage ou une dépendance ça peut avoir du sens). L’intérêt par rapport à d’autres solutions telles que des gestionnaires d’énergie de type OWL ou les prises plugwise ou Zwave Aeon Labs est que la mesure est censée être vraiment fiable. D’ailleurs même si ce n’est pas le cas, ça correspond tout de même à ce qu’on va payer …

Côté hardware

Il existe de nombreux schémas électroniques disponibles sur la toile qui permettent de récupérer la sortie téléinfo sur un port USB ou série. Ca va du  simple  à un peu plus sophistiqué.

Si on est un peu paresseux ou qu’on n’a pas le matériel, on peut comme moi acheter un montage tout fait ou un module bien packagé sur un site en ligne.  Personnellement, j’ai acheté un (puis 2 quand j’ai vu que ça marchait bien!) modules USB teleinfo

Côté software

Je reste fidèle à Linux et mon fidèle Seagate Dockstar sous Linux (Debian). Ce dernier étant pour l’instant un peu chargé en mémoire avec ses fonctions de serveur Squeezebox, DNS, DHCP, samba et tellstick, j’ai cherché une solution évolutive permettant de valider le concept en utilisant des services hébergés dans le Cloud qui puisse évoluer vers un auto-hébergement.

  • Pour le relevé des informations, le programme teleinfuse est impeccable : s’appuyant sur fuse, il permet d’accéder aux informations de son compteur via un système de fichier virtuel.
  • Pour le stockage et la visualisation des données, j’ai d’abord testé Sen.Se, service Cloud gratuit à la Pachube (Cosm maintenant) : il permet de sortir de jolis graphes et réaliser différentes fonctions intéressantes, mais à l’usage s’avère assez buggé et reste propriétaire. Dès que j’ai un peu de temps je teste ThingSpeak qui semble équivalent mais est libre. Je me suis finalement orienté vers le logiciel emoncms du projet OpenEnergyMonitor que j’ai découvert sur le forum touteladomotique.com: il s’appuie sur les mêmes principes, mais est complètement orienté vers le suivi énergétique.

Branchement du module teleinfo

On branche la bête sur le compteur (ne pas se tromper : c’est I1-I2, pas C1-C2). Voir « How to plug » sur la page du plugin teleinfo de Domogik pour des photos. La loupiotte rouge s’allume dès que je branche le port USB sur mon brave petit Seagate Dockstar, qui reconnait bien le dispositif ( le driver USB série ftdi_sio est de base dans mon système Debian Squeeze).

# dmesg
1 usb 1-1.3: new full speed USB device using orion-ehci and address 5
2 usb 1-1.3: New USB device found, idVendor=0403, idProduct=6001
3 usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
4 usb 1-1.3: Product: FT232R USB UART
5 usb 1-1.3: Manufacturer: FTDI
6 usb 1-1.3: SerialNumber: A500DB1Q
7 usb 1-1.3: configuration #1 chosen from 1 choice
8 usbcore: registered new interface driver usbserial
9 USB Serial support registered for generic
10 usbcore: registered new interface driver usbserial_generic
11 usbserial: USB Serial Driver core
12 USB Serial support registered for FTDI USB Serial Device
13 ftdi_sio 1-1.3:1.0: FTDI USB Serial Device converter detected
14 usb 1-1.3: Detected FT232RL
15 usb 1-1.3: Number of endpoints 2
16 usb 1-1.3: Endpoint 1 MaxPacketSize 64
17 usb 1-1.3: Endpoint 2 MaxPacketSize 64
18 usb 1-1.3: Setting MaxPacketSize 64
19 usb 1-1.3: FTDI USB Serial Device converter now attached to ttyUSB0
20 usbcore: registered new interface driver ftdi_sio
21 ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver

Premier test pour vérifier si ça fonctionne bien

On lit le port série correspondant en le paramétrant correctement :

  • avec minicom

configurer en 1200 bauds, 7 bits data, 1 bit stop, parité paire, sur /dev/ttyUSB0

  • ou directement
# stty -F /dev/ttyUSB0 1200 sane evenp parenb cs7 -crtscts
# cat /dev/ttyUSB0
ETAT 000000 B
ADCO xxxx
OPTARIF BASE 0
ISOUSC 45 ?
BASE 006765514 -
...

teleinfuse : accès aux infos téléinfo en mode fichier

Deux programmes sympa permettent d’accéder aux informations de son compteur via un système de fichier virtuel. Le premier (chronologiquement) est codé en python. Hélas, teleinfofs ne fonctionne pas sur mon arm :

NotImplementedError: Linux armv5tel is not supported.

Heureusement, ça fonctionne bien mieux avec le programme C teleinfuse (source migré de googlecode vers github):

# apt-get install subversion
# svn checkout http://teleinfuse.googlecode.com/svn/trunk/ teleinfuse-read-only
# git clone https://github.com/itineric/teleinfuse
# apt-get install libfuse-dev
# apt-get install fuse-utils
# cd teleinfuse
# make
# cp teleinfuse /usr/local/bin
# mkdir /mnt/teleinfo-maison
# ./teleinfuse /dev/ttyUSB0 /mnt/teleinfo-maison
# cd /mnt/teleinfo-maison
# ls
ADCO BASE IINST IMAX ISOUSC MOTDETAT OPTARIF PAPP PTEC status

Chacun des fichiers correspond à un type d’informations remonté par le compteur (voir détail ici). Par exemple, BASE contient l’index de compteur si on a souscrit à l’option tarifaire de base chez EDF

Pour lancer le montage du système de fichier à chaque boot, la première méthode que j’ai utilisé a été de modifier /etc/rc.local (copier teleinfo dans /usr/bin ou /usr/local/bin):

# releve teleinfo EDF
teleinfuse /dev/ttyUSB0 /mnt/teleinfo-maison -o allow_other
teleinfuse /dev/ttyUSB1 /mnt/teleinfo-garage -o allow_other

[EDIT 26/09/2014] On peut procéder de manière plus élégante, et grâce à Pierre (voir les commentaires) j’ai enfin pu utiliser /etc/fsab :

/usr/local/bin/teleinfuse#/dev/ttyUSB0 /mnt/teleinfo-maison fuse user,allow_other 0 0
/usr/local/bin/teleinfuse#/dev/ttyUSB1 /mnt/teleinfo-garage fuse user,allow_other 0 0

Remarque

Il peut être utile de modifier le Makefile de teleinfuse pour enlever l’option DEBUG si on veut avoir une syslog plus propre

Remontée des info vers emoncms (OpenEnergyMonitor)

Principe

Voir Sending data to emoncms

Avec une crontab

J’ai créé un petit script shell à lancer en cron toutes les mn. Il relève puissance apparente et index de base de tous les compteurs énumérés et les remonte à emoncms, ainsi que le reste de la différence entre le compteur global et tous les autres.

Le script est à adapter si on a du triphasé ou un abonnement autre que celui de base. Il faut par ailleurs modifier 3 constantes en fonction de sa config (APIKEY et BASEURL pour le serveur emoncms, MOUNTBASE pour le préfixe des noms de répertoire de montage teleinfuse)

Paramètres : liste des suffixes identifiant les différents compteurs. Le dernier compteur correspond au compteur EDF global

/usr/local/bin/teleinfo2emoncms

#!/bin/bash
APIKEY="METTRE_ICI_SON_API_KEY_ECRITURE"
MOUNTBASE="/mnt/teleinfo-"
BASEURL="http://vis.openenergymonitor.org/emoncms3/api/post?apikey="${APIKEY}"&json={"

if [ $# -eq 0 ] ; then
        echo $0 [compteurn ...] compteurglobal
        exit -1
fi

url=$BASEURL
i=0
for a in ${BASH_ARGV[*]} ; do
 if [ -r ${MOUNTBASE}$a/status ]; then
  if [ `cat ${MOUNTBASE}$a/status` = online ]; then
     BASE=`cat ${MOUNTBASE}$a/BASE` # read counter value (Kwh)
     BASEWH=`expr $BASE + 0`        # remove leading zeros
     let "BASEKWH=$BASEWH/1000"     # convert to Kwh
     PAPP=`cat ${MOUNTBASE}$a/PAPP` # read power value
     PAPP=`expr $PAPP + 0`

     if [ $i -eq 0 ]; then
        url=${url}${a}.BASEKWH:${BASEKWH},${a}.PAPP:${PAPP}
        RESTEWH=$BASEWH
        RESTEPAPP=$PAPP
     else
        url=${url},${a}.BASEKWH:${BASEKWH},${a}.PAPP:${PAPP}
        RESTEWH=$(($RESTEWH - $BASEWH))
        RESTEPAPP=$(($RESTEPAPP - $PAPP))
     fi
     i=$(($i + 1))
  else
     echo teleinfo $a is not online 1>&2
     exit 1
  fi
else
  echo teleinfo $a is not mounted 1>&2
  exit 1
 fi
done
if [ $# -eq 1 ]; then
   url=${url}"}"
else
   let "RESTEKWH=${RESTEWH} / 1000"       # convert to Kwh
   url=${url},reste.BASEKWH:${RESTEKWH},reste.PAPP:${RESTEPAPP}"}"
fi
#echo "$url"
curl -silent --request GET $url >/dev/null

Il est appelé en crontab :

# Consommation electrique
* * * * * /usr/local/bin/teleinfo2emoncms garage maison >/dev/null 2>&1

Avec FHEM

Depuis que j’ai écrit ce post, j’ai développé un petit module TELEINFO pour le logiciel libre de domotique FHEM. Il est possible de l’utiliser pour remonter ses données dans emoncms.

Configuration d’emoncms

On peut lire avec profit les explications du site OpenEnergyMonitor : using Emoncms

Pour ma part, j’ai commencé en utilisant le service en Cloud proposé sur emoncms. Ce qui m’a causé quelques soucis à cause des évolutions fréquentes… Il est aussi possible de l’auto-héberger (quelques conseils pour le faire sur un serveur mutualisé OVH)

Créer un compte puis utiliser le service sur http://emoncms.org/

Aller sur http://emoncms.org/ .

Ne pas utiliser l’ancien site vis.openenergymonitor.org qui tourne avec une version plus ancienne d’emoncms, plus limitée au niveau de la création visuelle des dashboards.

Transformer et stocker les données

Les données remontées par le script teleinfo2emoncms arrivent sous forme de sources (input) qu’il faut transformer en flux (feeds) au moyen de traitements (process) :

La chaîne de traitement est celle-ci, dans le cas où on part de l’information de puissance comme donnée de base (c’est le principe de la chaîne d’acquisition du projet OpenEnergyMonitor ):

Avec les données téléinfo, pas la peine de convertir puissance apparente (PAPP), en kWh/j, car on a déjà tout ce qu’il faut, avec une meilleure précision (pas besoin d’échantillonner à une fréquence élevée), en s’appuyant sur le compteur en kWh (BASE , dans le cas d’un abonnement de base) :

Dans les faits ça se rentre comme ça :

utiliser les feeds pour créer des dashboards

Creating a dashboard donne des explications succinctes sur le mode opératoire à suivre pour les créer et sur les différents widgets utilisables.

Par exemple, voici ce qu’il est possible de faire  :

Dashboard emoncms

Références

Un bon point d’entrée est Téléinformation compteur électrique qui donne en premier lien le thread du forum neufbox4.org relatif à la téléinfo et qui a vu le développement de teleinfuse

Informations sur la téléinformation ERDF

Hardware  :

Software :

  1. 740736
  2. 856819
  3. 863747
  4. 871118
  5. 875673
  6. 879702
  7. 884652
  8. 632461
  9. 643808
  10. 650521
  11. 657107
  12. 709652
  13. 716909
  14. 724009
  15. 727862
  16. 732203
  17. 737018
  18. 741842
  19. 746941
  20. 754364
  21. 760134

19 commentaires sur “Suivi de consommation électrique avec telinfuse et OpenEnergyMonitor (emoncms)”

  1. Bonjour

    merci pour ce tuto. Pour ma part j’ai récupéré les données de téléinfo sur le port série : /dev/ttyAMA0. Tout défile bien via car /dev/ttyAMA0

    Est ce que la procédure est adaptable ?
    J’ai essayé avec
    # ./teleinfuse /dev/ttyAMA0 /mnt/teleinfo-maison
    sans succès

    Merci !

  2. Par contre tel quel, /mnt/tic n’est lisible que par root. Je n’ai pas encore fouillé dans les options de mount.fuse mais la réponse y est certainement.

    Côté /dev/ttyUSB* ça doit dépendre de l’ordre de branchement (quel port) mais je voudrais ne pas avoir à noter où doit être branché quoi.

    Le ftdi a bien un serial number, et apparemment ça fait partie des prérequis de certification pour qu’un produit ait le logo usb. Certains ne s’embêtent pas pour si peu 🙂

    J’ai testé avec ça, pas de /dev/tic après avoir débranché/rebranché le ftdi.

    # udevadm info -a -p $(udevadm info -q path -n ttyUSB0) | egrep -i « ATTRS{serial}|ATTRS{idVendor}|ATTRS{idProduct} » -m 3
    ATTRS{idVendor}== »0403″
    ATTRS{serial}== »A5025UJD »
    ATTRS{idProduct}== »6001″
    # vi /etc/udev/rules.d/10-ftdi.rules
    BUS== »usb », SYSFS{idProduct}== »6001″, SYSFS{idVendor}== »0403″, SYSFS{serial}== »A5025UJD », NAME= »tic »

  3. Pour monter le fs teleinfuse avec /etc/fstab :
    A adapter évidemment au chemin du binaire et dev du port série.

    /usr/local/bin/teleinfuse#/dev/ttyUSB0 /mnt/tic fuse user,defaults 0 0

    Reste encore le problème du chemin du /dev/ttyUSBx quand on a plusieurs FTDI, mais visiblement les FTDI ont un numéro de série que n’ont pas forcément d’autres chips (là j’ai un prolific technologies sous la main et il ne donne que le vendor & device id, pas de serial number)

    http://aeturnalus.com/robotics/mapping-ftdi-to-files-with-udev/

    A suivre

    1. Bonjour,
      C’est quoi ton récepteur : une emonBase sur raspberry pi ?
      Je ne connais pas de prise qui remonte les infos directement vers emonbase de la même manière qu’un emontx. Par contre si tu es sur un raspberry pi tu peux utiliser un logiciel tel que FHEM pour récupérer les infos de prises « compteur d’energie » , pour peu que la prise utilise un protocole reconnu.
      Personnellement je n’ai pas de prises mais j’utilise ce principe avec une sonde OWL micro+ dont j’intercepte les données avec FHEM et un module radio RFXtrx433 pour les renvoyer à emoncms.

  4. Salut Olivier,
    Je viens de te faire un commentaire sur ton install chez OVH.
    En fait ce n’est pas une instal auto-hebergée (en local il y a juste un Raspberry qui envoie des les entrées sur un serveur emoncms en distant) Je ne voulais pas que le RPI fasse encore serveur de base de donnée sur la carte memoire, il héberge un web serveur qui visualise les tableaux de bords distants.
    Oui j’utilise dyndns. et oui je confirme, chez OVH il y a un dynamic DNS des que tu as un abonnement.

    1. Salut Pat,
      Ca y est, ça a l’air de marcher avec quelques paramétrages : Installation d’emoncms sur serveur mutualisé OVH. Je n’ai pas eu de problème comme toi pour me loguer mais d’abord pour avoir la mire de logging (problème d’une directive .htaccess non reconnue) puis avec le stockage des données (MySQL n’est plus par défaut).
      Sympa ton install autohébergée. Tu utilises dyndns.org pour chez toi? A priori je crois qu’il y a un dynamic DNS gratuit dès lors qu’on est sur OVH.

    1. Bonjour Pat,
      C’étais mon idée de le faire mais je n’ai pas encore mis en oeuvre. A priori les quelques tests que j’avais fait semblaient montrer que ça devait marcher
      A priori intéressant car permet d’adapter le code qui comporte quelques bugs du genre affichage du symbole euro, etc.
      Olivier

  5. bonjour,
    J’utilise depuis peu Emoncms , et j’ai du mal à obtenir des graphiques Kwh/day a partir des index des compteurs EDF.
    J’alimente la base chaque heure et le graphique me montre des valeurs enormes et non pas la difference de deux valeurs d’index poutant j’utilise la fonction kwhinckwd. Qu’y a t il de plus à parametrer ?

    1. Il faut utiliser la fonction « kWh to kWh/d » (attention à ne pas utiliser non plus « kWh to kWh/d (OLD) ». Si on utilise emoncms en français, il y a deux fonctions « kWh vers kWh/j » : il faut prendre la deuxième. Attention à partir d’une situation saine en supprimant les flux de type kWh/j éventuellemnt créés, sans les réutiliser, car ils ne sont pas nécessairement compatibles côté base de données.

  6. Le prix du KWh est attaché au widget de visualisation, pas à un feed. On peut donc imaginer, en utilisant le produit brut de pomme, avoir un feed pour les HC, un pour les HP et les visualiser séparément pour avoir leur coût. Ou créer un feed avec le coût de chaque (ce qui permet de gérer le changement de tarification – à la hausse il va sans dire-) et sommer les 2.

  7. Hello ! Superbe article ! Moi qui utilise open.sen.se et le trouve un peu généraliste, je serais bien tenté de basculé sur emoncms ! je vois que tu as un forfait sans distinction HP/HC, sais-tu si EmonCMS permet de gérer correctement ce type d’abonnement (avec donc des prix du kW différents) ?

Répondre à Bruno Annuler la réponse

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.