grunig-nodes
Version:
Grünig Nodes Library
304 lines (277 loc) • 15.9 kB
JavaScript
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);
};