UNPKG

grunig-nodes

Version:

Grünig Nodes Library

304 lines (277 loc) 15.9 kB
module.exports = function(RED) { function G_Measurement(config) { RED.nodes.createNode(this, config); var node = this; var mysql = require('mysql'); var mssql = require('mssql'); node.databaseConfig = RED.nodes.getNode(config.database); if (this.databaseConfig) { } else { // Keine Konfigurationsnode konfiguriert node.console.warn();("Keine Konfigurationsnode konfiguriert"); } // MySQL-Verbindungsinformationen var host = node.databaseConfig.host; var port = node.databaseConfig.port; var user = node.databaseConfig.user; var password = node.databaseConfig.password; var database = node.databaseConfig.database; var mssqlSelected = node.databaseConfig.mssql; node.status({fill:"red",shape:"ring",text:"disconnected"}); var connection; var connected = false; var sqlResult = null; var msgData = null; connect(); // Verbindung zur MySQL-Datenbank herstellen, wenn gültige Verbindungsinformationen vorhanden sind function connect() { node.status({ fill: "green", shape: "ring", text: "connecting..." }); if (host && port && user && password && database) { if (mssqlSelected) { // MSSQL-Konfiguration const sqlConfig = { user: user, password: password, server: host, port: parseInt(port, 10), // Port in Zahl umwandeln database: database, options: { encrypt: true, enableArithAbort: true, trustServerCertificate: true // Akzeptiert selbstsignierte Zertifikate } }; connection = new mssql.ConnectionPool(sqlConfig); connection.connect().then(() => { node.status({ fill: "green", shape: "dot", text: "connected to MSSQL" }); connected = true; }).catch(err => { node.status({ fill: "red", shape: "ring", text: "ERROR: " + err.message }); node.error("Error connecting to MSSQL: " + err.message); }); } else { // MySQL-Verbindung connection = mysql.createConnection({ host: host, port: port, user: user, password: password, database: database }); connection.connect(function (err) { if (err) { node.status({ fill: "red", shape: "ring", text: "ERROR: " + err.message }); node.error("Error connecting to MySQL: " + err.message); } else { node.status({ fill: "green", shape: "dot", text: "connected to MySQL" }); connected = true; } }); } } else { node.error("Missing connection information"); } } // Function to close the database connection function disconnect() { if (mssqlSelected && connection) { connection.close().then(() => { node.status({ fill: "red", shape: "ring", text: "disconnected from MSSQL" }); connected = false; }).catch(err => { node.error("Error disconnecting from MSSQL: " + err.message); }); } else if (connection) { connection.end(err => { if (err) { node.error("Error disconnecting from MySQL: " + err.message); } else { node.status({ fill: "red", shape: "ring", text: "disconnected from MySQL" }); connected = false; } }); } } function getSQLresult(topic, callback) { try { if (connection && topic) { connection.query(topic, function(error, results, fields) { if (error) { node.error("Error executing MySQL query: " + error.message); return callback(error, null); } // Ergebnis zur Nachricht hinzufügen und senden callback(null, results); }); } } catch (error) { node.error("Error executing MySQL query: " + error.message); callback(error, null); } } // Nachrichtenverarbeitungsfunktion node.on('input', function(msg) { if (!connection || connected === false) { host = node.databaseConfig.host; port = node.databaseConfig.port; user = node.databaseConfig.user; password = node.databaseConfig.password; database = node.databaseConfig.database; connect(); } else { if (msg.topic.includes("ProcessControl/Measurement") && !msg.topic.includes("ProcessControl/Measurement/Status")) { var frameID = msg.payload.FrameId; var tension = msg.payload.Tension; var eom = msg.payload.EOM; var rz = msg.payload.RZ; var successfulIDs = 0; var failedIDs = 0; var failedFrames = []; var successfulFrames = []; var topic = ` SELECT FrameId FROM FrameId WHERE FrameId.FrameId = '` + frameID + `'`; if (!frameID) { node.error("frameID s missing"); } else { getSQLresult(topic, function(error, result) { if (error) { node.error("Error executing MySQL query: " + error.message); } else { if (!result || /^\s*$/.test(result) || result === undefined || result.length === 0) { failedIDs++; failedFrames[failedIDs] = {FrameID: frameID, Tension: tension, EOM: eom, RZ: rz}; } else { successfulIDs++; successfulFrames[successfulIDs] = {FrameID: frameID, Tension: tension, EOM: eom, RZ: rz}; } var msgData; // Erfolgreiche Frames hinzufügen for (var i = 1; i <= successfulIDs; i++) { var frame = successfulFrames[i]; var updates = []; if (frame.Tension.Target !== 0) updates.push(`MeshData.MeshTension = '${frame.Tension.Target}'`); if (frame.Tension.X !== 0) updates.push(`MeshData.MeshTensionValueX = '${frame.Tension.X}'`); if (frame.Tension.Y !== 0) updates.push(`MeshData.MeshTensionValueY = '${frame.Tension.Y}'`); if (frame.Tension.LastX !== 0) updates.push(`MeshData.MeshTensionLastX = '${frame.Tension.LastX}'`); if (frame.Tension.LastY !== 0) updates.push(`MeshData.MeshTensionLastY = '${frame.Tension.LastY}'`); if (frame.EOM.Value !== 0) updates.push(`MeshData.EomValue = '${frame.EOM.Value}'`); if (frame.EOM.Target !== 0) updates.push(`MeshData.EomTargetValue = '${frame.EOM.Target}'`); if (frame.RZ.Value !== 0) updates.push(`MeshData.RzValue = '${frame.RZ.Value}'`); if (frame.RZ.Target !== 0) updates.push(`MeshData.RzTargetValue = '${frame.RZ.Target}'`); if (updates.length > 0) { var setClause = updates.join(",\n"); var topic; if (mssqlSelected) { topic = ` UPDATE MeshData SET ${setClause} FROM MeshData JOIN FrameId ON MeshData.PKey_MeshData = FrameId.FKey_MeshData WHERE FrameId.FrameId = '${frame.FrameID}'; `; } else { topic = ` UPDATE MeshData JOIN FrameId ON MeshData.PKey_MeshData = FrameId.FKey_MeshData SET ${setClause} WHERE FrameId.FrameId = '${frame.FrameID}'; `; } } else { // Kein Update nötig – alle Werte sind 0 } // Daten für InfluxDB vorbereiten if (frame?.FrameID) { getSQLresult(topic, function(error, result) { if (error) { node.error("Error executing SQL query: " + error.message); } else { const payload = { FrameID: frame.FrameID }; // Tension-Werte nur hinzufügen, wenn sie ≠ 0 sind const tension = {}; if (frame.Tension?.Target !== 0) tension.Target = frame.Tension.Target; if (frame.Tension?.X !== 0) tension.X = frame.Tension.X; if (frame.Tension?.Y !== 0) tension.Y = frame.Tension.Y; if (frame.Tension?.LastX !== 0) tension.LastX = frame.Tension.LastX; if (frame.Tension?.LastY !== 0) tension.LastY = frame.Tension.LastY; if (Object.keys(tension).length > 0) payload.Tension = tension; // EOM const eom = {}; if (frame.EOM?.Value !== 0) eom.Value = frame.EOM.Value; if (frame.EOM?.Target !== 0) eom.Target = frame.EOM.Target; if (Object.keys(eom).length > 0) payload.EOM = eom; // RZ const rz = {}; if (frame.RZ?.Value !== 0) rz.Value = frame.RZ.Value; if (frame.RZ?.Target !== 0) rz.Target = frame.RZ.Target; if (Object.keys(rz).length > 0) payload.RZ = rz; const msgData = [{ payload, measurement: "MeshData", }]; node.send([msgData,]); } }); } else { node.error("FrameID is missing"); } } if (failedIDs > 0) { // Fehlgeschlagene Frames hinzufügen var failedFrameIDs = ""; for (var j = 1; j <= failedIDs; j++) { if (failedFrameIDs === "") { failedFrameIDs = failedFrames[j].FrameID; } else { failedFrameIDs = failedFrameIDs + ", " + failedFrames[j].FrameID; } } // Payload-Objekte erstellen msgData = [{ payload : { Success: false, Message: "FrameID: " + failedFrameIDs + " not found" }, topic: "GRUNIG/ProcessControl/Measurement/Status" }]; } else { msgData = [{ payload : { Success: true, Message: "Successful", }, topic: "GRUNIG/ProcessControl/Measurement/Status" }]; } node.send([,msgData]); } }); } } } }); // Node wird geschlossen node.on('close', function() { disconnect(); }); } // Node-Typ registrieren RED.nodes.registerType("G-Measurement", G_Measurement); };