node-red-contrib-services-mentor
Version:
Mentor Services
196 lines (171 loc) • 8.38 kB
JavaScript
module.exports = function (RED) {
var log = RED.log;
var rusDiff = require('rus-diff').rusDiff;
function updateLastReading(node, msg) {
var sql = "UPDATE mqtt_snapshot SET content = '" + msg.payload + "', time = '" + msg.time + "' WHERE device='" + msg.code + "'";
node.mydbConfig.connection.query(sql, [], function (err, rows) {
//node.pool.query(sql, function (err, rows, fields) {
if (err) {
log.error(err);
} else
node.send({payload: {msg: rows.affectedRows + " record(s) updated", data: msg}});
});
}
function getLastReading(node, msg, callback) {
var data = {};
var sql = "SELECT time, device, content from mqtt_snapshot WHERE device='" + msg.code + "' LIMIT 1";
//node.pool.query(sql, function (err, rows, fields) {
node.mydbConfig.connection.query(sql, [], function (err, rows) {
if (err) {
log.error(err);
callback(null, err);
} else {
if (rows.length > 0 ) {
var content = JSON.parse(rows[0].content);
// content.time = msg.time;
data.payload = JSON.stringify(content);
callback(data, null);
} else
{
insertMysql(node, msg, "mqtt_snapshot");
getLastReading(node, msg, callback);
}
}
});
}
function insertMysql(node, msg, table) {
var sql = "INSERT INTO " + table + "(mentor_id, time, device, content, result, alarm) VALUES ('" + msg.mentor_id + "','" + msg.time + "','" + msg.code + "','" + msg.payload + "','" + msg.result + "','1')";
//node.pool.query(sql, function (err, rows, fields) {
node.mydbConfig.connection.query(sql, [], function (err, rows) {
if (err) {
log.error(err);
} else
node.send({payload: {msg: rows.affectedRows + " record(s) inserted", data: msg}});
});
}
function MysqlDBNodeIn(n) {
RED.nodes.createNode(this, n);
this.mydb = n.mysql;
this.mydbConfig = RED.nodes.getNode(this.mydb);
this.mentor = RED.nodes.getNode(n.mentor);
var node = this;
var busy = false;
var status = {};
this.interval = n.interval;
this.mentor_id = 0;
if (this.mentor) this.mentor_id = this.mentor.mentor_id;
if (this.mydbConfig) {
this.mydbConfig.connect();
node.mydbConfig.on("state", function (info) {
if (info === "connecting") {
node.status({fill: "grey", shape: "ring", text: info});
} else if (info === "connected") {
node.status({fill: "green", shape: "dot", text: info});
} else {
if (info === "ECONNREFUSED") {
info = "connection refused";
}
if (info === "PROTOCOL_CONNECTION_LOST") {
info = "connection lost";
}
node.status({fill: "red", shape: "ring", text: info});
}
});
node.on("input", function (msg) {
if (node.mydbConfig.connected) {
node.status({});
var obj = JSON.parse(msg.payload);
msg.code = obj.code;
msg.time = obj.time;
msg.mentor_id = node.mentor_id;
msg.result = 1;
msg.data = obj.data;
if (msg.payload.indexOf("Timeout") > -1 || msg.payload.indexOf("NaN") > -1) {
getLastReading(node, msg, function (data, err) {
if (err)
log.error(err);
else {
msg = data;
insertMysql(node, msg, "mqtt_lecturas");
}
});
} else {
getLastReading(node, msg, function (data, err) {
if (err)
log.error(err);
else {
if (data == null) {
insertMysql(node, msg, "mqtt_snapshot");
} else {
var obj = {};
var saved_alarm = false;
var head =JSON.parse(data.payload).head;
var _data = JSON.parse(data.payload).data;
var saved_time = JSON.parse(data.payload).time;
head.forEach(function(key,index) {
var value = _data[index];
if (value > 0) {
saved_alarm = true;
}
obj = Object.assign(obj, {[key]: value});
});
var saved_data = obj;
obj = {};
var new_alarm = false;
head =JSON.parse(msg.payload).head;
_data = JSON.parse(msg.payload).data;
head.forEach(function(key,index) {
var value = _data[index];
if (value > 0) {
new_alarm = true;
}
obj = Object.assign(obj, {[key]: value});
});
var new_data = obj;
// log.error(JSON.stringify(new_data));
if (rusDiff(new_data, saved_data) !== false) {
insertMysql(node, msg, "mqtt_lecturas");
node.send([null, {payload: msg.time}]);
status = {fill: "red", shape: "ring", text: "OK"};
busy = false;
updateLastReading(node, msg);
log.error("if");
} else if (node.interval > 0 && Math.round(msg.time/1000 - saved_time/1000) > node.interval && saved_alarm) {
insertMysql(node, msg, "mqtt_lecturas");
node.send([null, {payload: msg.time}]);
status = {fill: "red", shape: "ring", text: "OK"};
busy = false;
updateLastReading(node, msg);
log.error("if-else");
}
}
}
});
}
// node.send([msg, null]);
} else {
node.error("Database not connected", msg);
status = {fill: "red", shape: "ring", text: "not yet connected"};
}
if (!busy) {
busy = true;
node.status(status);
node.tout = setTimeout(function () {
busy = false;
node.status(status);
}, 500);
}
});
node.on('close', function () {
if (node.tout) {
clearTimeout(node.tout);
}
node.mydbConfig.removeAllListeners();
node.status({});
});
} else {
this.error("MySQL database not configured");
}
}
RED.nodes.registerType("Alarms", MysqlDBNodeIn);
};