UNPKG

node-red-contrib-services-mentor

Version:

Mentor Services

196 lines (171 loc) 8.38 kB
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); };