Hi All,
it is been a wile but i picked up this project again. i still not receiving any data on the website. I will explain what i did.
I followed every bit of the instructions on the website. also on the end i created 1 file for the smartmeter and webserverfile.
Code: Select all
serialport = require('serialport'); var mqtt = require('mqtt');
var mclient,
config,
SerialPort,
smartMeter;
mclient = mqtt.createClient(1883, 'localhost'); //set ip of the Rasp or localhost
var net = require('net');
var client = new net.Socket();
function SmartMeter() {
this.ConsumedPowerRate1 = 0;
this.ConsumedPowerRate2 = 0;
this.ProducedPowerRate1 = 0;
this.ProducedPowerRate2 = 0;
this.ActualPowerRate = 0;
this.ActualConsumedPower = 0;
this.ActualProducedPower = 0;
this.GasTimestamp = 0;
this.ConsumedGas = 0;
}
SmartMeter.prototype.update = function(data) {
//publish the complete telegram to a different topic for logging to for example a mysql dbase (handled in my next blog)
mclient.publish('historical/smartmeter/data', JSON.stringify(data));
if(data.ConsumedPowerRate1 != this.ConsumedPowerRate1) {
this.ConsumedPowerRate1 = data.ConsumedPowerRate1;
mclient.publish('smartmeter/consumed_low', data.ConsumedPowerRate1.toString(), {retain: true});
//console.log(data.ConsumedPowerRate1)
}
if(data.ConsumedPowerRate2 != this.ConsumedPowerRate2) {
this.ConsumedPowerRate2 = data.ConsumedPowerRate2;
mclient.publish('smartmeter/consumed_high', data.ConsumedPowerRate2.toString(), {retain: true});
//console.log(data.ConsumedPowerRate2)
}
if(data.ProducedPowerRate1 != this.ProducedPowerRate1) {
this.ProducedPowerRate1 = data.ProducedPowerRate1;
mclient.publish('smartmeter/produced_low', data.ProducedPowerRate1.toString(), {retain: true});
//console.log(data.ProducedPowerRate1)
}
if(data.ProducedPowerRate2 != this.ProducedPowerRate2) {
this.ProducedPowerRate2 = data.ProducedPowerRate2;
mclient.publish('smartmeter/produced_high', data.ProducedPowerRate2.toString(), {retain: true});
//console.log(data.ProducedPowerRate2)
}
if(data.ActualPowerRate != this.ActualPowerRate) {
//console.log(this.ActualPowerRate);
if (data.ActualPowerRate == 1) {var new_ActualPowerRate = 'Low'}
else {var new_ActualPowerRate = 'High'};
this.ActualPowerRate = data.ActualPowerRate;
mclient.publish('smartmeter/actual_rate', new_ActualPowerRate, {retain: true});
//console.log(new_ActualPowerRate);
}
if(data.ActualConsumedPower != this.ActualConsumedPower) {
this.ActualConsumedPower = data.ActualConsumedPower;
mclient.publish('smartmeter/actual_consumed', data.ActualConsumedPower.toString(), {retain: true});
console.log(data.ActualConsumedPower)
}
if(data.ActualProducedPower != this.ActualProducedPower) {
this.ActualProducedPower = data.ActualProducedPower;
mclient.publish('smartmeter/actual_produced', data.ActualProducedPower.toString(), {retain: true});
//console.log(data.ActualProducedPower)
}
};
function processTelegram(telegram) {
var smartMeterId,
consumedPowerRate1,
consumedPowerRate2,
actualConsumedPower,
actualPowerRate,
producedPowerRate1,
producedPowerRate2,
actualProducedPower,
gasTimestamp,
consumedGas;
if(telegram.length === 14) {
// Process equipment label
smartMeterId = telegram[0].substr(1);
// Process consumed power
consumedPowerRate1 = parseFloat(telegram[3].substr(10,9));
consumedPowerRate2 = parseFloat(telegram[4].substr(10,9));
actualConsumedPower = parseFloat(telegram[8].substr(10,9));
actualPowerRate = parseInt(telegram[7].substr(12,4));
// Process produced power
producedPowerRate1 = parseFloat(telegram[5].substr(10,9));
producedPowerRate2 = parseFloat(telegram[6].substr(10,9));
actualProducedPower = parseFloat(telegram[9].substr(10,9));
smartMeter.update({
ConsumedPowerRate1: consumedPowerRate1,
ConsumedPowerRate2: consumedPowerRate2,
ProducedPowerRate1: producedPowerRate1,
ProducedPowerRate2: producedPowerRate2,
ActualConsumedPower: actualConsumedPower,
ActualProducedPower: actualProducedPower,
ActualPowerRate: actualPowerRate
});
} else {
console.log('Invalid number of lines in telegram (' +
telegram.length + ')');
}
}
function main() {
var telegram = [];
console.log('Starting Smart Meter');
SerialPort = serialport.SerialPort;
smartMeter = new SmartMeter();
serialPort = new SerialPort("/dev/ttyAMA0", {
baudrate: 9600,
databits: 7,
parity: 'even',
parser: serialport.parsers.readline('\n')
});
serialPort.on('data', function(line) {
console.log('Received: ' + line);
if(line[0] === '!') {
processTelegram(telegram);
telegram.length = 0;
} else {
telegram.push(line);
}
});
}
main();
var url = require('url');
var path = require('path');
var mqtt = require('mqtt');
var httpd = require('http').createServer(handler),
io = require('socket.io').listen(httpd),
fs = require('fs');
httpd.listen(8300);
var client = mqtt.createClient(1883, 'localhost');
io.set('log level', 1);
var consumedValues = new Array();
var tmpValue;
var tmpValue1;
// HTTP server
var MIMETYPES = {
"html": "text/html",
"jpeg": "image/jpeg",
"jpg" : "image/jpeg",
"png" : "image/png",
"js" : "text/javascript",
"css" : "text/css"};
function handler(req, res) {
function html404(uri, res){
console.log("404 not found: " + uri);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('404 Not Found\n');
res.end();
}
var uri = url.parse(req.url).pathname;
if(uri != '/'){
var filename = path.join(process.cwd(), uri);
fs.exists(filename, function(exists) {
if(!exists) {
html404(filename, res);
return;
}
var mimeType = MIMETYPES[path.extname(filename).split(".")[1]];
res.writeHead(200, {'Content-Type':mimeType});
var fileStream = fs.createReadStream(filename);
fileStream.pipe(res);
});
} else {
html404(uri, res);
return;
}
}
httpd.on('clientError', function (exception, socket) {
console.log('Client error occurred');
});
io.sockets.on('connection', function (socket) {
var clientbb = socket.handshake.address;
console.log("New connection from " + clientbb.address + ":" + clientbb.port);
socket.on('subscribe', function (data) {
console.log('Subscribing to '+data.topic);
//socket.join(data.topic);
client.subscribe(data.topic);
});
});
client.on('message', function(topic, payload){
io.sockets.emit('mqtt', {'topic': String(topic),'payload':String(payload) });
var newPayload = payload;
switch (topic) { //settings for the graph
case 'smartmeter/actual_produced':
if (tmpValue1 == newPayload || newPayload == 0 ) {
return;
};
tmpValue = newPayload;
newPayload = newPayload - (newPayload * 2); //make produced value negative for chart
break;
case 'smartmeter/actual_consumed':
if (tmpValue == newPayload) {
return;
};
tmpValue1 = newPayload;
break;
default:
return;
};
//if (tmpValue != newPayload || tmpValue1 != newPayload) {
consumedValues.push(newPayload);
//console.log(consumedValues);
if (consumedValues.length >= 50) {
//console.log ('Powervalue shifted');
consumedValues.shift();
}
//};
io.sockets.emit('mqtt', {'topic': "smartmeter/graph",'payload':consumedValues });
});
and as server.js
Code: Select all
var url = require('url');
var path = require('path');
var mqtt = require('mqtt');
var httpd = require('http').createServer(handler),
io = require('socket.io').listen(httpd),
fs = require('fs');
httpd.listen(8300);
var client = mqtt.createClient(1883, 'localhost');
io.set('log level', 1);
var consumedValues = new Array();
var tmpValue;
var tmpValue1;
// HTTP server
var MIMETYPES = {
"html": "text/html",
"jpeg": "image/jpeg",
"jpg" : "image/jpeg",
"png" : "image/png",
"js" : "text/javascript",
"css" : "text/css"};
function handler(req, res) {
function html404(uri, res){
console.log("404 not found: " + uri);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('404 Not Found\n');
res.end();
}
var uri = url.parse(req.url).pathname;
if(uri != '/'){
var filename = path.join(process.cwd(), uri);
fs.exists(filename, function(exists) {
if(!exists) {
html404(filename, res);
return;
}
var mimeType = MIMETYPES[path.extname(filename).split(".")[1]];
res.writeHead(200, {'Content-Type':mimeType});
var fileStream = fs.createReadStream(filename);
fileStream.pipe(res);
});
} else {
html404(uri, res);
return;
}
}
httpd.on('clientError', function (exception, socket) {
console.log('Client error occurred');
});
io.sockets.on('connection', function (socket) {
var clientbb = socket.handshake.address;
console.log("New connection from " + clientbb.address + ":" + clientbb.port);
socket.on('subscribe', function (data) {
console.log('Subscribing to '+data.topic);
//socket.join(data.topic);
client.subscribe(data.topic);
});
});
client.on('message', function(topic, payload){
io.sockets.emit('mqtt', {'topic': String(topic),'payload':String(payload) });
var newPayload = payload;
switch (topic) { //settings for the graph
case 'smartmeter/actual_produced':
if (tmpValue1 == newPayload || newPayload == 0 ) {
return;
};
tmpValue = newPayload;
newPayload = newPayload - (newPayload * 2); //make produced value negative for chart
break;
case 'smartmeter/actual_consumed':
if (tmpValue == newPayload) {
return;
};
tmpValue1 = newPayload;
break;
default:
return;
};
//if (tmpValue != newPayload || tmpValue1 != newPayload) {
consumedValues.push(newPayload);
//console.log(consumedValues);
if (consumedValues.length >= 50) {
//console.log ('Powervalue shifted');
consumedValues.shift();
}
//};
io.sockets.emit('mqtt', {'topic': "smartmeter/graph",'payload':consumedValues });
});
the html
Code: Select all
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script type="text/javascript" src="http://192.168.2.104:8300/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script type="text/javascript" src="http://192.168.2.104:8300/js/jquery.sparkline.min.js"></script>
<link href='http://fonts.googleapis.com/css?family=Orbitron:700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="style.css" type="text/css" />
<script type='text/javascript'>
var powerValues = new Array();
var socket = io.connect('http://192.168.2.104:8300');
socket.on('connect', function () {
//$("#sockconn").html("Connected");
socket.on('mqtt', function (msg) {
var tp_arr=msg.topic.split("/");
var d = new Date();
var now = d.toLocaleTimeString();
var tp=tp_arr[1];
switch (tp) {
case 'graph':
$('.hpowerValue').sparkline(msg.payload, {
type: 'bar',
//zeroAxis: false,
barColor: '#ff0000',
negBarColor: '#009933',
zeroColor: '#009933',
width: '200',
height: '50',
});
break;
default:
$('#message').html(msg.topic + ', ' + msg.payload + ' at: ' + now);
var payloadOld = $('#'.concat(tp)).html();
$('#'.concat(tp)).html(msg.payload);
if(payloadOld != $('#'.concat(tp)).html()) {
$("#".concat(tp)).effect("highlight", { color: "#2C3539" }, 1000);
}
};
});
socket.on('disconnect', function (msg) {
//$("#sockconn").html("Disconnected");
});
socket.emit('subscribe',{topic:'smartmeter/#'});
});
</script>
</head>
<body>
<div id="cnt">
<div style="margin-bottom:5px;">
<div id="frame">
<div id="consumed_high" style="font-size:35px;color:#ff3333;"></div>
<div id="label_lg">Power High Rate counter (kWh)</div>
</div>
<div id="frame">
<div id="actual_consumed"></div>
<div id="label_lg" style="font-size:18px;">Current Power consuming (kW)</div>
</div>
<div id="frame">
<div id="consumed_low" style="font-size:35px;color:#ff3333;"></div>
<div id="label_lg">Power Low Rate counter (kWh)</div>
</div>
<div id="frame">
<div id="produced_high" style="font-size:35px;color:#009933;"></div>
<div id="label_lg">Produced High Rate counter (kWh)</div>
</div>
<div id="frame">
<div id="actual_produced"></div>
<div id="label_lg" style="font-size:18px;">Current Power producing (kW)</div>
</div>
<div id="frame">
<div id="produced_low" style="font-size:35px;color:#009933;"></div>
<div id="label_lg">Produced Low Rate counter (kWh)</div>
</div>
<div id="frame">
<div id="gas" style="font-size:35px;;color:#ff3333;"></div>
<div id="label_lg">Gas Usage counter (m3)</div>
</div>
<div id="frame">
<div id="sockconn" style="font-size:35px"></div>
<div id="label_lg">Current Usage/Producing graph (kW)</div>
<div id="graph_lg" class="hpowerValue"></div>
</div>
<div id="frame">
<div id="actual_rate" style="font-size:35px"></div>
<div id="label_lg">Actual Power Rate</div>
</div>
<div id="frame">
<div style="font-size:15px;color:#999;">Latest MQTT message: <small id="message">no message received</small></div>
</div>
</div><br>
</div>
</div>
</body>
</html>
The output on the site is still blank.
- Knipsel.JPG (49.81 KiB) Viewed 13873 times
the node file gives some errors but after googling i found out that it is not an issue only it would be better to upgrade the files.
- Knipsel2.JPG (56.24 KiB) Viewed 13873 times
The files are working because when i load the website i get the line "New connection from undefined:undefined"
after some digging and trying to get aquainted with nodeJS and the rest i tried to debug the file on the socket.io. maybe it gives some information for you to help out if possible
- Knipsel3.JPG (142 KiB) Viewed 13873 times
- Knipsel4.JPG (110.41 KiB) Viewed 13873 times
I really like to work with this and tried a lot by myself but i can't figure it out. (sorry for that)
Can you help me?