grunig-nodes
Version:
Grünig Nodes Library
140 lines (117 loc) • 6.31 kB
JavaScript
module.exports = function(RED) {
function MQTT_InfluxDB_Write(config) {
RED.nodes.createNode(this, config);
var node = this;
// Nachrichtenverarbeitungsfunktion
node.on('input', function(msg) {
// Einstellungen speichern
var topicPath = config.topicPath || ""; // Standardwert verwenden, wenn nicht vorhanden
var funct = config.function || ""; // Variable umbenannt von 'varfunction' zu 'funct'
var comEnabled = config.comEnabled || "false";
var format = config.format || "";
var type = config.typeDB || "";
var communication = msg.payload.Communication || false;
if (funct === "Write_MQTT"){
this.status({fill:"blue",shape:"dot",text:"write MQTT..."});
for (var i = 1; i <= 15; i++) {
// Speichern der Datenwerte
var variableName = "data" + i;
var dataString = config[variableName];
if (dataString !== undefined) {
// Trennen von Name und Datentyp
var parts = dataString.split(/\s*\[\s*/);
var name = parts[0].trim(); // Name ist der erste Teil
// Überprüfen, ob ein Datentyp vorhanden ist
var dataUnit = "";
if (parts.length > 1) {
dataUnit = parts[1].replace(']', '').trim(); // Datentyp ist der zweite Teil ohne das schließende eckige Klammern []
}
}
// Speichern des Topics
var topic = "GRUNIG/" + msg.payload.MachineID + topicPath + "/" + name; // 'path' durch 'topicPath' ersetzt
var topicInclude = topicPath.replace(/\//g, "."); // 'path' durch 'topicPath' ersetzt
// Prüfen, ob der Name und das Topic im Nachrichten-Topic enthalten sind
if (msg.topic.includes(name) && msg.topic.includes(topicInclude)){
var value = msg.payload.Value;
// Kommunikation überprüfen und Wert auf 0 setzen, wenn nicht aktiviert
if (comEnabled === "true" && !communication){
value = 0;
}
// Speichern der Ausgabe-Beschreibung basierend auf dem gewählten Format
var dataMsg;
if (format === "format_alarm") {
let output;
switch (value) {
case 1:
output = "ALARM_STATE_ACTIVE";
break;
case 2:
output = "ALARM_STATE_ACKNOWLEDGE";
break;
case 3:
output = "ALARM_STATE_INACTIVE";
break;
default:
output = "ALARM_STATE_NONE";
}
dataMsg = {
payload: {
"value": value,
"description": output
},
topic: topic
};
}
else if (format === "format_unit") {
dataMsg = {
payload: {
"value": value,
"unit": dataUnit
},
topic: topic
};
}
// Überprüfen, ob Name, Wert und Daten definiert sind und dann Nachricht senden
if (name !== "" && name !== undefined && value !== undefined && value !== "") {
node.send(dataMsg);
}
}
}
}
else if (funct === "Write_DB"){
this.status({fill:"yellow",shape:"dot",text:"write InfluxDB..."});
for (var i = 1; i <= 15; i++) {
// Speichern der Datenwerte
var variableName = "data" + i;
var dataString = config[variableName];
// Speichern des Topics
var topic = topicPath + "/" + dataString;
var value;
if (msg.topic.includes(topic)){
if (msg.payload.Value && typeof msg.payload.Value === 'object' && 'value' in msg.payload.Value){
value = msg.payload.Value.value
}
else{
value = msg.payload.Value;
}
//******************** */
var obj1 = {};
obj1[dataString] = value;
var obj2 = { _type: type };
var dataMsg = [obj1, obj2];
// Rückgabe des msg-Objekts
if (dataString !== "" && dataString !== undefined && value !== undefined && value !== "" && type !== undefined) {
msg.payload = dataMsg;
node.send(msg);
}
}
}
}
else{
node.warn("No action selected");
}
});
}
// Node-Typ registrieren
RED.nodes.registerType("MQTT-InfluxDB-Write", MQTT_InfluxDB_Write);
};