@lhuet35#MonitoringEdfNode
Monitoring d'un compteur EDF
avec Node.js
@lhuet35
SOFTEAM Cadextan
@lhuet35#MonitoringEdfNode
Qui suis-je ?
•9 ans de Java/Web chez
•4 ans de dév. dans une grosse SSII
•4 ans dans le bâtiment !
@lhuet35#MonitoringEdfNode
Résumé en images
@YourTwitterHandle#DVXFR14{session hashtag} @lhuet35#MonitoringEdfNode
H
ard
@lhuet35#MonitoringEdfNode
« Hacking » compteur EDF
Rien n'est illégal dans ce montage (hacking != illégal)
UART
Liaison Téléinfo
(Bornier client)
Adaptateur
« custom »
@lhuet35#MonitoringEdfNode
Montage téléinfo
•Composants
• 1 optocoupleur (VISHAY SFH620A-2)
• 2 résistances (1.2 kΩ – 3.3 kΩ)
@lhuet35#MonitoringEdfNode
Prototype
Coût ~ 2 €
@lhuet35#MonitoringEdfNode
Cablage sur le compteur
@YourTwitterHandle#DVXFR14{session hashtag} @lhuet35#MonitoringEdfNode
Soft
@lhuet35#MonitoringEdfNode
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)
@lhuet35#MonitoringEdfNode
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');
// Événement 'tramedecodee' pour chaque trame reçue du compteur
trameEvents.on('tramedecodee', function (data) {
// data : objet avec les données validées (checksum)
console.log(util.inspect(data));
});
var teleinfo = require('teleinfo');
var util = require('util');
// Exemple d'utilisation sur Raspberry Pi
var trameEvents = teleinfo('/dev/ttyAMA0');
// Événement 'tramedecodee' pour chaque trame reçue du compteur
trameEvents.on('tramedecodee', function (data) {
// data : objet avec les données validées (checksum)
console.log(util.inspect(data));
});
@lhuet35#MonitoringEdfNode
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'
}
@lhuet35#MonitoringEdfNode
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 infoCompteur = tarifbleu('/dev/ttyAMA0', '00 * * * * *', logger);
setInterval(function() {
console.log(infoCompteur.getPuissanceApparente() + ' VA');
console.log(infoCompteur.getIntensite() + ' A');
console.log(infoCompteur.getIndex() + ' Wh');
}, 2000);
var tarifbleu = require('tarifbleu');
var util = require('util');
var logger = function (data) {
console.log(util.inspect(data));
};
var infoCompteur = tarifbleu('/dev/ttyAMA0', '00 * * * * *', logger);
setInterval(function() {
console.log(infoCompteur.getPuissanceApparente() + ' VA');
console.log(infoCompteur.getIntensite() + ' A');
console.log(infoCompteur.getIndex() + ' Wh');
}, 2000);
@lhuet35#MonitoringEdfNode
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
}
@lhuet35#MonitoringEdfNode
Application
•MongoDB
• Stockage des données (SAAS)
• Aggregation Framework pour la consolidation
•Node.js
• Serveur Express + Liaison Téléinfo
•AngularJS
•https://github.com/lhuet/teleinfo-app
@lhuet35#MonitoringEdfNode
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")
}
@lhuet35#MonitoringEdfNode
Aggregation Framework
•Ex : consommation journalière entre 2 dates
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}}])
@lhuet35#MonitoringEdfNode
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
@lhuet35#MonitoringEdfNode
Application Web
@lhuet35#MonitoringEdfNode
Sites 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/
@YourTwitterHandle#DVXFR14{session hashtag} @lhuet35#MonitoringEdfNode
Q
&
A

Monitoring Compteur EDF avec node.js