Afficher et analyser les données téléinfo du compteur EDF avec Raspberry PI et NodeJS

Cet article explique pas à pas comment extraire les informations de consommation énergétique depuis un compteur EDF électronique (mis en place systématiquement depuis pas mal de temps, mon immeuble date de 1998).

Mon objectif est double :

  • récupérer les informations de consommation du foyer pour information, et comprendre les enjeux de posséder ces informations
  • monter en compétence sur Raspberry Pi, Node JS et l’échange client/serveur en temps réel

La plupart des informations (surtout électronique) ont été glanées sur le web, je n’ai fait qu’un travail de compréhension/compilation. Ces articles ont été très utiles et je remercie leurs auteurs :

Cet article est composé de 4 parties :

  1. principes de base et architecture globale
  2. montage électronique
  3. installation du raspberry
  4. développement et installation de l’application NodeJS

Principes de base et architecture globale

Le principe est donc d’utiliser la sortie téléinformation du compteur EDF, qui diffuse des informations de consommation (bornes I1/I2), pour l’enregistrer dans une base de donnée, puis d’exploiter cette base pour agréger les informations dans le temps, et afficher des courbes de consommation électrique.

La partie acquisition du signal électronique sera fait par un petit montage électronique fait maison.

Montage électronique

Je suis loin d’être un expert en électronique, je me contente donc juste de vous montrer le montage à réaliser. Personnellement j’ai utilisé une plaque d’essai à pastilles. Les composants nécessaires sont :

  • optocoupleur SFH620A
  • résistance 1.2 kΩ
  • résistance 3.3 kΩ
  • plaque d’essai ou tout support de montage électronique (plaque de prototypage par exemple)

Budget : quelques euros l’ensemble.

Voici le montage électronique à réaliser (merci Magdiblog) :

teleinfo_schema

 

I1 / I2 sont les sorties du compteur EDF. X1-1, X1-2 et X1-3 sont les entrées du Raspberry Pi (cf ci-dessous).

Et concrètement en photos :

DSC00259_2 DSC00260_2

Branchement et installation du Raspberry PI

La 1ère étape, avant de brancher le montage précédent au Raspberry, est d’installer Linux. J’ai opté pour Raspbian :

  • Formater la carte micro SD en FAT :
mkdosfs -I -F32 /dev/sdc
cp NOOBS/* /dev/sdc
  • Brancher le port HDMI sur votre écran, clavier/souris USB, insérer carte micro SD et booter, suivre les instructions.

Ensuite, il faut faire quelques manipulations pour activer le port série du Raspberry :

Dans le fichier /boot/cmdline.txt, supprimer les paramètres suivants :

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

Puis dans le fichier /etc/inittab, commentez la ligne suivante (tout en bas du fichier) en ajoutant un # devant :

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Dans /etc.rc.local, ajouter la ligne tout en bas :

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

Le Raspberry est maintenant capable de récupérer les données sur sa borne RX15 :

  • X1-1 = 3.3V = fil rouge
  • X1-2 = RX15 = fil blanc
  • X1-3 = masse = fil noir

DSC00258_2

Pour vérifier, afficher le contenu de /dev/ttyAMA0, les informations de téléinformation devraient s’afficher en direct :

cat /dev/ttyAMA0

Développement et installation de l’application NodeJS

L’application que j’ai développé se base sur un module NodeJS : teleinfo-node (merci à Laurent Huet). Une base MySQL est utilisée pour stocker les informations.

Les sources sont publiées sur mon GitHub : https://github.com/frinux/nodejs-Teleinfo_EDF. Son README détaille l’installation de NodeJs sur Raspberry (un peu touchy) et le déploiement de l’application.

Une fois l’application lancée, voici les écrans que vous aurez à votre disposition (les samedi et dimanche sont en couleur plus estompées, heures creuses en bleu, heures pleines en rouge) :

Vue en temps réel (utilise socket.io pour remonter les données du compteur au navigateur) :

live

 

Consommation par heure :

heure

 

Consommation par jour :

jour

Constats et bilan

Il est intéressant de noter qu’à l’aube du déploiement de Linky, les citoyens ont en fait déjà la possibilité de récupérer leurs informations de consommation et ne s’en privent pas. Je suis loin d’être le seul à m’être intéressé au sujet, de nombreux articles existent sur le sujet, à base de Raspberry, d’Arduino…

Le pas d’intensité remontée par la téléinfo étant 1A, l’information de puissance temps réel est très approximative, à 230W près. Ce n’est clairement pas l’outil adéquat pour afficher une consommation temps réel. Une pince ampèremétrique serait plus adaptée.

Le constat final de ce projet ouvre vers un nouveau projet : les données de consommation seules ne permettent pas d’en déduire une corrélation directe avec les appareils électriques. Il est donc nécessaire de croiser cette information avec la température intérieure, la température extérieure au moins, voire la consommation spécifique de certains appareils (je pense notamment au ballon d’eau chaude, qui vient gonfler la consommation en heure creuse du lendemain). Nouveau projet donc : remonter la température intérieure/extérieure avec un Arduino cette fois.

  • Eric

    super article je vais essayer!!!

  • Charly86

    Salut,

    Génial ton article, je cherchais justement des infos sur la téléinfo et node, je viens de trouver. Et comme je voulais faire çà avec des socketio je vais me servir de tes exemples. Un grand merci.

    J’ai écrit un article concernant une petite carte téléinfo a enficher sur le Pi mais aussi çà y parle de Node Red et sa simplicité.

    Et comme tu as node d’installé sur le Pi je me disais que çà pourrait être sympa de remplir la BDD via node Red (c’est surtout super visuel, pas besoin de ssh une fois installé et tout se fait via le navigateur).

    L’article est dispo ici http://hallard.me/pitinfo/

    Pour l’intensité tu as raison le pas est de 1A et c’est pas terrible, mais nous avons une valeur bien plus précise, le PAPP (la puissance apparente) qu’il suffit de diviser par la valeur de TENSION (je sais çà reste approximatif) mais dans mon exemple PAPP=810 TENSION=236 résultat 810/326=3.43A alors que IISNT m’indique 3A ;-)