Upload
laurenthuet
View
915
Download
1
Embed Size (px)
DESCRIPTION
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.
Citation preview
Monitoring d'un compteur EDF avec Node.js
@lhuet35SOFTEAM 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/lhuet
Résumé en images
Hard
« Hacking » compteur EDF
Rien n'est illégal dans ce montage (hacking != illégal)
UART
Liaison Téléinfo(Bornier client)
Adaptateur « custom »
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 000028290000 POPTARIF BASE 0ISOUSC 30 9BASE 002247218 %PTEC TH.. $IINST 003 ZIMAX 030 BPAPP 00630 *MOTDETAT 000000 B
ADCO 000028290000 POPTARIF BASE 0ISOUSC 30 9BASE 002247218 %PTEC TH.. $IINST 003 ZIMAX 030 BPAPP 00630 *MOTDETAT 000000 B
Exemple de trame(Tarif bleu)
Module Teleinfo sur Node.js
• https://github.com/lhuet/teleinfo-node
var teleinfo = require('teleinfo');var util = require('util');
// Exemple d'utilisation sur Raspberry Pivar trameEvents = teleinfo('/dev/ttyAMA0');
// Évt 'tramedecodee' pour chaque trame reçuetrameEvents.on('tramedecodee', function (data) {// data : objet avec données validées (checksum) console.log(util.inspect(data));});
var teleinfo = require('teleinfo');var util = require('util');
// Exemple d'utilisation sur Raspberry Pivar trameEvents = teleinfo('/dev/ttyAMA0');
// Évt 'tramedecodee' pour chaque trame reçuetrameEvents.on('tramedecodee', function (data) {// data : objet avec données validées (checksum) console.log(util.inspect(data));});
Module Teleinfo sur Node.js
• Objet data
{ ADCO: '000000000000', OPTARIF: 'BASE', ISOUSC: 30, BASE: 6366719, PTEC: 'TH..', IINST: 1, IMAX: 30, PAPP: 300, MOTDETAT: '000000' }
{ ADCO: '000000000000', OPTARIF: 'BASE', ISOUSC: 30, BASE: 6366719, PTEC: 'TH..', IINST: 1, IMAX: 30, PAPP: 300, MOTDETAT: '000000' }
Module Tarifbleu sur Node.js
• https://github.com/lhuet/tarifbleu-node
var tarifbleu = require('tarifbleu');var util = require('util');
var logger = function (data) {console.log(util.inspect(data));
};
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);
var tarifbleu = require('tarifbleu');var util = require('util');
var logger = function (data) {console.log(util.inspect(data));
};
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);
Module Tarifbleu sur Node.js
• Objet reçu en paramètre de logger
{ imini: 1, imaxi: 1, imoy: 1, pmini: 200, pmaxi: 210, pmoy: 208.57142857142858, index: 6401853, pinst: 210, iinst: 1 }
{ imini: 1, imaxi: 1, imoy: 1, pmini: 200, pmaxi: 210, pmoy: 208.57142857142858, index: 6401853, pinst: 210, iinst: 1 }
Application
• MongoDB– SAAS– Aggregation framework
• Node.js– Express + Liaison Téléinfo
• AngularJS
https://github.com/lhuet/teleinfo-app
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")}
Aggregation Framewoork
• Ex : Puissance max par heure
db.teleinfo.aggregate([{$match: {datetime: {$gte:ISODate('2014-02-16T00:00:00.000Z'), $lte:ISODate('2014-02-17T00:00:00.000Z')}}},{$project: {mois:{'$month':'$datetime'}, jour:{'$dayOfMonth':'$datetime'}, heure:{'$hour':'$datetime'}, minute:{'$minute':'$datetime'}, datetime:1, pmax:1}},{$group: {_id:{mois:'$mois', jour:'$jour', heure:'$heure'}, pmax:{$max:'$pmax'}}},{$project: {heure:'$_id.heure', Pmax:1}}])
db.teleinfo.aggregate([{$match: {datetime: {$gte:ISODate('2014-02-16T00:00:00.000Z'), $lte:ISODate('2014-02-17T00:00:00.000Z')}}},{$project: {mois:{'$month':'$datetime'}, jour:{'$dayOfMonth':'$datetime'}, heure:{'$hour':'$datetime'}, minute:{'$minute':'$datetime'}, datetime:1, pmax:1}},{$group: {_id:{mois:'$mois', jour:'$jour', heure:'$heure'}, pmax:{$max:'$pmax'}}},{$project: {heure:'$_id.heure', Pmax:1}}])
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
Application Web
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/
Merci :-)
Questions ?