The objective this project is the development the a tool to monitoring power consumption in real time, Daily / monthly registration of consumption and allow schedule when device will is turn on/off.
The system measure power of appliances, the information of power (apparent, active, reactive), voltage and current are show in webinterface. In this interface there are four button to turn on/off any device connected on relay module.
In interface, there are two graphics: the first shows voltage and current, the other shows de power on bar graphics. The graphics are update every 1 second.
Daily / monthly registration of consumption is in development currently.
smartgrid.js - webserver
JavaScriptthis script will run with node.js in intel galileo
In node.js you should have installed:
-socket.io
-ejs
-express
-galileo-io
-serialport
In node.js you should have installed:
-socket.io
-ejs
-express
-galileo-io
-serialport
var express = require("express");
var app = express();
app.set('view engine', 'ejs');
var http = require('http');
var server = http.createServer(app);
var io = require('socket.io').listen(server);
var fs = require('fs');
var mraa = require('mraa');
Gpio_2 = new mraa.Gpio(2);
Gpio_3 = new mraa.Gpio(3);
Gpio_4 = new mraa.Gpio(4);
Gpio_5 = new mraa.Gpio(5);
Gpio_6 = new mraa.Gpio(6);
Gpio_7 = new mraa.Gpio(7);
Gpio_2.dir(mraa.DIR_OUT);
Gpio_3.dir(mraa.DIR_OUT);
Gpio_4.dir(mraa.DIR_OUT);
Gpio_5.dir(mraa.DIR_OUT);
Gpio_6.dir(mraa.DIR_IN);
Gpio_7.dir(mraa.DIR_IN);
Gpio_2.write(0);
Gpio_3.write(0);
Gpio_4.write(0);
Gpio_5.write(0);
An_0 = new mraa.Aio(0);
An_1 = new mraa.Aio(1);
var intervalHandler;
var dados_send = {v0: 0, v1: 0, v2: 0, v3: 0, v4: 0, v5: 0, v6: 0, v7: 0};
var com = require('serialport');
var serialPort = new com.SerialPort("/dev/ttyS0", {
baudrate: 115200,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
parser: com.parsers.readline('\n')
});
serialPort.on('open', function(){
console.log('\nSerial OK\n');
});
serialPort.on('data', function(data){
var str = data.toString();
var vet = str.split('x');
dados_send.v0 = Math.sqrt(parseFloat(vet[0]));
dados_send.v1 = Math.sqrt(parseFloat(vet[1])*0.001);
dados_send.v2 = parseFloat(vet[2]);
dados_send.v3 = Math.sqrt(Math.abs(parseFloat(vet[3])*0.001))*dados_send.v0;
dados_send.v4 = Math.sqrt(Math.abs(parseFloat(vet[4])*0.001))*dados_send.v0;
//console.log(dados_send);
/*
if(str.indexOf("V") == 0){
dados_send.v0 = parseFloat(str.replace("V","0"))/10.0;
}else if(str.indexOf("I") == 0){
dados_send.v1 = parseFloat(str.replace("I","0"))/1.0;
}else if(str.indexOf("P") == 0){
dados_send.v2 = parseFloat(str.replace("P","0"))/10.0;
}else if(str.indexOf("Q") == 0){
dados_send.v3 = parseFloat(str.replace("Q","0"))/10.0;
}else if(str.indexOf("D") == 0){
dados_send.v4 = parseFloat(str.replace("D","0"))/1.0;
}
*/
});
app.use(express.static(__dirname + '/js'));
app.get('/', function(request, response) {
response.render('smartgrid', {
title: '',
message: ''
});
});
app.get('/set', function(request, response) {
response.render('smartgrid', {
title: '',
message: ''
});
});
io.on('connection', function(socket) {
socket.on('cmd_general',function(dados){
console.log('teste');
console.log(An_0.read());
console.log(Gpio_6.read());
fs.appendFile('leituras.txt','Nova linha ' + An_0.read()+ '\n');
});
socket.on('cmd_rele',function(dados){
//console.log(dados);
Gpio_2.write(dados.r1);
Gpio_3.write(dados.r2);
Gpio_4.write(dados.r3);
Gpio_5.write(dados.r4);
//console.log(fs.readFileSync('leituras.txt')+"");
//serialPort.write("teste", function(){});
});
});
var intervalFunction = function(){
fs.readFile('/sys/class/thermal/thermal_zone0/temp','utf8',function(err,data){
dados_send.v5 = data.replace('\n','');
});
io.emit('data',dados_send);
};
function isr_Gpio_7(){
console.log('Interrupcao');
if(Gpio_7.read()){
//io.emit('isr_gpio_7',dados_send);
}
}
Gpio_7.isr(mraa.EDGE_BOTH,isr_Gpio_7);
intervalHandler = setInterval(intervalFunction,1999);
server.listen(8080);
console.log("\nServidor OK\n");
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript" src="canvasjs.min.js"></script>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
window.onload = function () {
var time = new Date;
//var socket = io();
var corrente = [
{x: time.getTime() , y: 0}
];
var tensao = [
{x: time.getTime() , y: 0}
];
var potencia = [
{label: "S(VA)", y: 50},
{label: "P(W)", y: 47},
{label: "Q(VAR)", y: 55},
{label: "D(VAR)", y: 51},
{label: "Temp", y: 0}
];
var pot_name = ["S(VA)", "P(W)", "Q(VAR)", "D(VAR)"];
var chart_VI_2 = new CanvasJS.Chart("chartContainerVI_2",
{
animationEnabled: true,
theme: "theme3",
title:{
text: "Monitoramento"
},
axisY:[{
lineColor: "#4F81BC",
tickColor: "#4F81BC",
labelFontColor: "#4F81BC",
titleFontColor: "#4F81BC",
labelFontStyle: "normal",
labelFontWeight: "normal",
labelFontFamily: "Arial",
lineThickness: 2,
//minimum:
//maximum:
//interval:
title: "Tensao (V)",
},
{
lineColor: "#C0504E",
tickColor: "#C0504E",
labelFontColor: "#C0504E",
titleFontColor: "#C0504E",
labelFontStyle: "normal",
labelFontWeight: "normal",
labelFontFamily: "Arial",
lineThickness: 2,
title: "Corrente (mA)",
}],
data: [
{
type: "spline", //change type to bar, line, area, pie, etc
showInLegend: true,
name: "Tensao",
xValueType: "dateTime",
markerSize: 0,
dataPoints: tensao
},
{
type: "spline",
axisYIndex: 1,
showInLegend: true,
name: "Corrente mA",
xValueType: "dateTime",
markerSize: 0,
dataPoints: corrente
}
],
legend: {
cursor: "pointer",
itemclick: function (e) {
if (typeof(e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
e.dataSeries.visible = false;
} else {
e.dataSeries.visible = true;
}
chart_VI_2.render();
}
}
});
chart_VI_2.render();
var chart_potencia_2 = new CanvasJS.Chart("chartContainerPower_2", {
title:{
text:"Potencia"
},
animationEnabled: true,
axisX:{
gridThickness: 0,
labelFontSize: 12,
labelFontStyle: "normal",
labelFontWeight: "normal",
labelFontFamily: "Arial"
},
axisY2:{
minimum: 0,
maximum: 1000,
//interlacedColor: "rgba(1,77,101,.2)",
gridColor: "rgba(1,77,101,.1)"
},
data: [
{
type: "bar",
name: "power",
axisYType: "secondary",
color: "#014D65",
dataPoints: potencia
}
]
});
chart_potencia_2.render();
//Conexao servidor
var newV = 0;
var newI = 0;
var newP = 0;
var newQ = 0;
var newD = 0;
var newCPU_temp = 9;
var currentTime = 1000;
//time.setHours(9);
//time.setMinutes(30);
//time.setSeconds(00);
//time.setMilliseconds(00);
socket.on('data', function(dados) {
newV = (dados.v0);
newI = (dados.v1)*1000;
newP = (dados.v2);
newQ = (dados.v3);
newD = (dados.v4);
newCPU_temp = dados.v5/1000;
//$("#tempcpu").val(cpu);
//$("#p_s").val(msg.v0*msg.v1/1000);
//$("#p_p").val(msg.v2);
//$("#p_q").val(msg.v3);
//$("#p_d").val(msg.v4*msg.v1/1000);
});
socket.on('isr_dpin7', function(msg){
alert('Evento');
});
var boilerColor;
var updateInterval = 1000;
var updateChart = function () {
time.setTime(time.getTime()+ updateInterval);
currentTime = currentTime + 1000;
tensao.push({x: time.getTime(), y: newV});
corrente.push({x: time.getTime(), y: newI});
if (tensao.length > 59 ){
tensao.shift();
corrente.shift();
}
//Atualizacao potencia
var yVal = 0;
for (var i = 0; i < potencia.length-1; i++) {
// generating random variation deltaY
if(i == 0)
yVal = Math.sqrt(newQ*newQ+newD*newD+newP*newP) ;
// color of dataPoint dependent upon y value.
if(i == 1)
yVal = newP;
if(i == 2)
yVal = newQ;
if(i == 3)
yVal = newD;
potencia[i] = {label: pot_name[i] , y: yVal, color: "#6B8E23"};
};
boilerColor =
newCPU_temp > 59 ? "#FF2500":
newCPU_temp >= 55 ? "#FF6000":
newCPU_temp < 51 ? "#6B8E23 ":
null;
potencia[i] = {label: "CPU" , y: newCPU_temp, color: boilerColor};
chart_VI_2.render();
chart_potencia_2.render();
};
updateChart();
//update chart after specified interval
setInterval(function(){updateChart()}, updateInterval);
socket.on('isr_gpio_7', function(msg){
alert('Evento');
});
};
var socket = io();
var rele_status = {r1: 0, r2: 0, r3: 0, r4: 0};
function cmd_rele(rele){
//$("#id_input").val();
if(rele == 1){
rele_status.r1 ^= 0x01;
}else if(rele == 2){
rele_status.r2 ^= 0x01;
}else if(rele == 3){
rele_status.r3 ^= 0x01;
}else if(rele == 4){
rele_status.r4 ^= 0x01;
}
socket.emit('cmd_rele',rele_status);
};
function cmd_general(){
socket.emit('cmd_general',rele_status);
};
</script>
</head>
<body>
<div id="chartContainerVI_2" style="height: 300px; width: 100%;"></div>
<div id="chartContainerPower_2" style="height: 300px; width: 100%;"></div>
<input type="button" onclick="cmd_rele(1);" value="RELE 1"> <input type="button" onclick="cmd_rele(2);" value="RELE 2">
<input type="button" onclick="cmd_rele(3);" value="RELE 3"> <input type="button" onclick="cmd_rele(4);" value="RELE 4">
<input type="button" onclick="cmd_general();" value="CMD">
</body>
</html>
Comments