node-red-contrib-services-mentor
Version:
Mentor Services
148 lines (117 loc) • 5.06 kB
JavaScript
var mysql = require('mysql');
var DB = require('./base.js');
var mysql_login_details = {
connectionLimit: 10,
host: '',
port: '',
user: '',
password: '',
database: ''
};
module.exports = function(RED) {
var log = RED.log;
function Node(config) {
RED.nodes.createNode(this, config);
var node = this;
this.mentor = RED.nodes.getNode(config.mentor);
this.mysql = RED.nodes.getNode(config.mysql);
this.mqtt = RED.nodes.getNode(config.mqtt);
mysql_login_details.host = this.mysql.host;
mysql_login_details.port = this.mysql.port;
mysql_login_details.user = this.mysql.credentials.user;
mysql_login_details.password = this.mysql.credentials.password;
mysql_login_details.database = this.mysql.dbname;
var pool = mysql.createPool(mysql_login_details);
this.on('input', (msg) => { handleMsg(RED, node, msg, pool) });
}
async function updateData(pool, connection, node, maxtime, msg)
{
pool.query("SELECT device, time, content from mqtt_lecturas Where time*1 = " + maxtime +" And device ='" + msg.device +"'",
function (err, _rows, fields)
{
if (err) { log.error(err); connection.release(); node.send(err); }
else if (_rows.length > 0)
{
var _msg = {payload:{}};
_msg.payload.time = msg.time;
_msg.payload.code = msg.device;
var content = JSON.parse(_rows[0].content);
content.time = msg.time;
_msg.payload.content = JSON.stringify(content);
//----------------------------------------------------------------------------------------
pool.query("Update mqtt_lecturas Set restful_tries = 99, content = '"+_msg.payload.content+"' Where device='"+msg.device+"' And time*1="+msg.time,
function (err, r, fields)
{
if (err) { log.error(err); connection.release(); node.send(err);}
else {
this.status({fill:"green",shape:"dot",text:"Updated" + " Time:" + msg.time + " Device:" + msg.device});
}
});
}
else
{
//-------------------------------------------------------------------------------------
pool.query("Delete FROM mqtt_lecturas Where device='"+msg.device+"' And time*1="+msg.time,
function (r, err)
{
if (err) { log.error(err); node.send(err);}
else {
log.error("Fixed & Deleted");
}
});
}
});
}
async function processData(pool, connection, node, msg)
{
//Obtener Fecha de De data válida
pool.query("SELECT MAX(time) as max_time, device from mqtt_lecturas Where time*1 < " + msg.time +" And device ='" + msg.device+"' And INSTR(content, 'Timeout') = 0",
function (err, __rows, fields)
{
if (err) { log.error(err); connection.release(); node.send(err);}
else if(__rows.length > 0)
{
//-------------------------------------------------------------------------------------------
// Obtener el Contenio de la Data
updateData(pool, connection, node, __rows[0].max_time, msg);
}
});
}
function handleMsg(RED, node, msg, pool) {
pool.getConnection(function (err, connection) {
if (err) {
// connection.release();
log.error(err);
return;
}
pool.query("Update mqtt_lecturas Set content= REPLACE(content, 'NaN', '0.00') Where INSTR(content, 'NaN') > 0",
function (err, r, fields)
{
if (err) { log.error(err); connection.release(); node.send(err);}
else {
this.status({fill:"green",shape:"dot",text:"Updated NaN values, "+ result.affectedRows + " record(s) affected"});
}
});
// Obtains records with errors.
pool.query("SELECT t1.device, t1.time, t1.content, t1.restful FROM mqtt_lecturas t1 JOIN ( SELECT MIN(TIME) AS min_value, device FROM mqtt_lecturas WHERE INSTR(content, 'Timeout') >0 GROUP BY device ) AS t2 ON t1.device = t2.device AND t1.time = t2.min_value WHERE INSTR(content, 'Timeout') >0",
function (err, rows, fields) {
if (err) { log.error(err); connection.release(); node.send(err);}
else
{
//log.error("Found " + rows.length + " records...");
for (var item in rows) {
var _msg = {};
_msg.device = rows[item].device;
_msg.time = rows[item].time;
//--------------------------------------------------------------------------------------------
processData(pool, connection, node, _msg );
//break;
}
}
connection.release();
}
)
})
}
RED.nodes.registerType("Repairer", Node);
}