Monitoring d'un compteur 
EDF avec Node.js 
@lhuet35 
SOFTEAM Cadextan
Qui suis-je 
• 10 ans de Java/Web 
• 4 ans de développement – Grosse SSII 
• 4 ans dans le bâtiment ! 
https://github.com/...
Résumé en images
Hard
« Hacking » compteur EDF 
UART 
Rien n'est illégal dans ce montage 
(hacking != illégal) 
Liaison Téléinfo 
(Bornier clien...
Montage téléinfo 
• Composants 
– 1 optocoupleur (VISHAY SFH620A-2) 
– 2 résistances (1.2 kΩ – 3.3 kΩ)
Prototype 
Coût ~ 2 €
Cablage sur le compteur
Soft
Protocole Teleinfo 
● Liaison série 1200 7E1 
– http://www.erdf.fr/medias/DTR_Racc_Comptage/ERDF-NOI-CPT_02E.pdf 
ADCO 000...
Module Teleinfo sur Node.js 
• https://github.com/lhuet/teleinfo-node 
var teleinfo = require('teleinfo'); 
var util = req...
Module Teleinfo sur Node.js 
• Objet data 
{ ADCO: '000000000000', 
{ ADCO: '000000000000', 
OPTARIF: 'BASE', 
ISOUSC: 30,...
Module Tarifbleu sur Node.js 
• https://github.com/lhuet/tarifbleu-node 
var var tarifbleu tarifbleu = = require('require(...
Module Tarifbleu sur Node.js 
• Objet reçu en paramètre de logger 
{ imini: 1, 
{ imini: 1, 
imaxi: 1, 
imoy: 1, 
pmini: 2...
Application 
• MongoDB 
– SAAS 
– Aggregation framework 
• Node.js 
– Express + Liaison Téléinfo 
• AngularJS 
https://git...
Stockage dans MongoDB 
{ 
{ 
"datetime" : ISODate("2013-12-29T21:38:00.521Z"), 
"indexcpt" : 6399600, 
"imoy" : 1, 
"imax"...
Aggregation Framewoork 
• Ex : Puissance max par heure 
db.teleinfo.aggregate([ 
{$match: {datetime: 
db.teleinfo.aggregat...
Frontend Web 
• AngularJS 
– Rudimentaire pour le moment 
• Node.js 
– API REST Données → temps réels + Données 
consolidé...
Application Web
Liens utiles 
Repos Github 
– https://github.com/lhuet/teleinfo-node 
– https://github.com/lhuet/tarifbleu-node 
– https:/...
Merci :-) 
Questions ?
Prochain SlideShare
Chargement dans…5
×

Monitoring d'un compteur EDF avec node.js @bdx.io

1 911 vues

Publié le

Venez voir comment coupler votre compteur EDF à une carte RaspberryPi / Beaglebone / ... pour avoir une vision temps réel de votre consommation électrique.

Coté hardware, un montage électronique rudimentaire est utilisé (< 2 €).

Coté soft, Node.js, MongoDB et AngularJS constituent les briques applicatives principales.

Publié dans : Technologie
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 911
Sur SlideShare
0
Issues des intégrations
0
Intégrations
25
Actions
Partages
0
Téléchargements
18
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Monitoring d'un compteur EDF avec node.js @bdx.io

  1. 1. Monitoring d'un compteur EDF avec Node.js @lhuet35 SOFTEAM Cadextan
  2. 2. Qui suis-je • 10 ans de Java/Web • 4 ans de développement – Grosse SSII • 4 ans dans le bâtiment ! https://github.com/lhuet
  3. 3. Résumé en images
  4. 4. Hard
  5. 5. « Hacking » compteur EDF UART Rien n'est illégal dans ce montage (hacking != illégal) Liaison Téléinfo (Bornier client) Adaptateur « custom »
  6. 6. Montage téléinfo • Composants – 1 optocoupleur (VISHAY SFH620A-2) – 2 résistances (1.2 kΩ – 3.3 kΩ)
  7. 7. Prototype Coût ~ 2 €
  8. 8. Cablage sur le compteur
  9. 9. Soft
  10. 10. Protocole Teleinfo ● Liaison série 1200 7E1 – http://www.erdf.fr/medias/DTR_Racc_Comptage/ERDF-NOI-CPT_02E.pdf ADCO 000028290000 P OPTARIF BASE 0 ISOUSC 30 9 BASE 002247218 % PTEC TH.. $ IINST 003 Z IMAX 030 B PAPP 00630 * MOTDETAT 000000 B ADCO 000028290000 P OPTARIF BASE 0 ISOUSC 30 9 BASE 002247218 % PTEC TH.. $ IINST 003 Z IMAX 030 B PAPP 00630 * MOTDETAT 000000 B Exemple de trame (Tarif bleu)
  11. 11. Module Teleinfo sur Node.js • https://github.com/lhuet/teleinfo-node var teleinfo = require('teleinfo'); var util = require('util'); // Exemple d'utilisation sur Raspberry Pi var trameEvents = teleinfo('/dev/ttyAMA0'); // Évt 'tramedecodee' pour chaque trame reçue trameEvents.on('tramedecodee', function (data) { // data : objet avec données validées (checksum) var teleinfo = require('teleinfo'); var util = require('util'); // Exemple d'utilisation sur Raspberry Pi var trameEvents = teleinfo('/dev/ttyAMA0'); // Évt 'tramedecodee' pour chaque trame reçue trameEvents.on('tramedecodee', function (data) { // data : objet avec données validées (checksum) console.log(util.inspect(data)); console.log(util.inspect(data)); }); });
  12. 12. Module Teleinfo sur Node.js • Objet data { ADCO: '000000000000', { ADCO: '000000000000', OPTARIF: 'BASE', ISOUSC: 30, BASE: 6366719, PTEC: 'TH..', IINST: 1, IMAX: 30, PAPP: 300, MOTDETAT: '000000' } OPTARIF: 'BASE', ISOUSC: 30, BASE: 6366719, PTEC: 'TH..', IINST: 1, IMAX: 30, PAPP: 300, MOTDETAT: '000000' }
  13. 13. Module Tarifbleu sur Node.js • https://github.com/lhuet/tarifbleu-node var var tarifbleu tarifbleu = = require('require('tarifbleu'); tarifbleu'); var var util util = = require('require('util'); util'); var var logger logger = = function function ((data) data) { { console.log(util.inspect(data)); console.log(util.inspect(data)); }; var info = tarifbleu('/dev/ttyAMA0', '00 * * * * *', }; var info = tarifbleu('/dev/ttyAMA0', '00 * * * * *', logger); setInterval(function() { console.log(info.getPuissanceApparente() + ' VA'); console.log(info.getIntensite() + ' A'); console.log(info.getIndex() + ' Wh'); }, 2000); logger); setInterval(function() { console.log(info.getPuissanceApparente() + ' VA'); console.log(info.getIntensite() + ' A'); console.log(info.getIndex() + ' Wh'); }, 2000);
  14. 14. Module Tarifbleu sur Node.js • Objet reçu en paramètre de logger { imini: 1, { imini: 1, imaxi: 1, imoy: 1, pmini: 200, pmaxi: 210, pmoy: 208.57142857142858, index: 6401853, pinst: 210, iinst: 1 } imaxi: 1, imoy: 1, pmini: 200, pmaxi: 210, pmoy: 208.57142857142858, index: 6401853, pinst: 210, iinst: 1 }
  15. 15. Application • MongoDB – SAAS – Aggregation framework • Node.js – Express + Liaison Téléinfo • AngularJS https://github.com/lhuet/teleinfo-app
  16. 16. Stockage dans MongoDB { { "datetime" : ISODate("2013-12-29T21:38:00.521Z"), "indexcpt" : 6399600, "imoy" : 1, "imax" : 1, "pmoy" : 296.1538461538461, "pmax" : 300, "_id" : ObjectId("52c096386e463dd40cdc5ef2") } "datetime" : ISODate("2013-12-29T21:38:00.521Z"), "indexcpt" : 6399600, "imoy" : 1, "imax" : 1, "pmoy" : 296.1538461538461, "pmax" : 300, "_id" : ObjectId("52c096386e463dd40cdc5ef2") }
  17. 17. Aggregation Framewoork • Ex : Puissance max par heure db.teleinfo.aggregate([ {$match: {datetime: db.teleinfo.aggregate([ {$match: {datetime: {$gte:ISODate('2014-02-16T00:00:00.000Z'), $lte:ISODate('2014-02-17T00:00:00.000Z')}}}, {$gte:ISODate('2014-02-16T00:00:00.000Z'), $lte:ISODate('2014-02-17T00:00:00.000Z')}}}, {$project: {mois:{'$month':'$datetime'}, {$project: {mois:{'$month':'$datetime'}, jour:{'$dayOfMonth':'$datetime'}, heure:{'$hour':'$datetime'}, minute:{'$minute':'$datetime'}, datetime:1, pmax:1}}, jour:{'$dayOfMonth':'$datetime'}, heure:{'$hour':'$datetime'}, minute:{'$minute':'$datetime'}, datetime:1, pmax:1}}, {$group: {_id:{mois:'$mois', jour:'$jour', heure:'$heure'}, {$group: {_id:{mois:'$mois', jour:'$jour', heure:'$heure'}, pmax:{$max:'$pmax'}}}, pmax:{$max:'$pmax'}}}, {$project: {$project: {heure:'$_id.heure', Pmax:1}}]) {heure:'$_id.heure', Pmax:1}}])
  18. 18. Frontend Web • AngularJS – Rudimentaire pour le moment • Node.js – API REST Données → temps réels + Données consolidées • Build avec Gulp.js – Livereload serveur + client
  19. 19. Application Web
  20. 20. Liens utiles Repos Github – https://github.com/lhuet/teleinfo-node – https://github.com/lhuet/tarifbleu-node – https://github.com/lhuet/teleinfo-app • Blog – http://lhuet.github.io/blog/
  21. 21. Merci :-) Questions ?

×