grunig-nodes
Version:
Grünig Nodes Library
554 lines (494 loc) • 23.4 kB
JavaScript
module.exports = function(RED) {
function Visualization (config) {
RED.nodes.createNode(this, config);
var node = this;
var prevPumpLevel, prevActualPressure, prevRemainingTime, prevCurrentSweep, prevTotalSweeps, prevRemainingTime;
// Nachrichtenverarbeitungsfunktion
node.on('input', function(msg) {
// Einstellungen speichern
var stmEnabled = config.stmEnabled || false;
var g370Enabled = config.g370Enabled || false;
var mag1Enabled = config.mag1Enabled || false;
var mag2Enabled = config.mag2Enabled || false;
var moduleEnabled = config.moduleEnabled || false;
var machineNameSVG = msg.payload.MachineNameSVG;
var communication = msg.payload.Communication;
var machineState = msg.payload.MachineState;
var operationState = msg.payload.OperationState;
var moduleState = msg.payload.ModuleState;
var alarmState = msg.payload.AlarmState;
var modAlarmState = msg.payload.ModAlarmState;
var mag1AlarmState = msg.payload.Mag1AlarmState;
var mag2AlarmState = msg.payload.Mag2AlarmState;
var temperatureLed = msg.payload.TemperatureLed;
var temperatureDMD = msg.payload.TemperatureDMD;
var temperatureAmbient = msg.payload.TemperatureAmbient;
var temperatureFPGA = msg.payload.TemperatureFPGA;
var temperatureLedLimitRed = msg.payload.TemperatureLedLimitRed;
var temperatureLedLimit1 = msg.payload.TemperatureLedLimit1;
var temperatureDMDLimitRed = msg.payload.TemperatureDMDLimitRed;
var temperatureDMDLimit1 = msg.payload.TemperatureDMDLimit1;
var temperatureAmbientLimitRed = msg.payload.TemperatureAmbientLimitRed;
var temperatureAmbientLimit1 = msg.payload.TemperatureAmbientLimit1;
var temperatureFPGALimitRed = msg.payload.TemperatureFPGALimitRed;
var temperatureFPGALimit1 = msg.payload.TemperatureFPGALimit1;
var currentSweep = msg.payload.CurrentSweep;
var totalSweeps = msg.payload.TotalSweeps;
var remainingTime = msg.payload.RemainingTime;
var exposingState = msg.payload.ExposingState;
var pumpLevel = msg.payload.PumpLevel;
var actualPressure = msg.payload.ActualPressure;
var pressureUnit = msg.payload.PressureUnit;
var remainingTime = msg.payload.RemainingTime;
/* STM */
if (stmEnabled) {
/* INFLUX DB */
// umwandlung der Variablen-Werte für STM
var communication_stm = 0, machineState_stm = 0, operationState_stm = 0, alarmState_stm = 0, moduleState_stm = 0;
// Communication
if (communication === "OK") {
communication_stm = 1;
}
else if (communication === "NOK") {
communication_stm = 0;
}
// MachineState
if (machineState === "Initialising") {
machineState_stm = 0;
} else if (machineState === "Busy") {
machineState_stm = 1;
} else if (machineState === "Idle") {
global.idleState = global.idleState || false;
if (!global.idleState) {
machineState_stm = 3;
setTimeout(() => {
machineState_stm = 1;
global.idleState = true;
}, 2000);
} else {
machineState_stm = 1;
}
} else {
machineState_stm = 2;
//global.idleState = false;
}
// OperationState
if (operationState === "Initialising") {
operationState_stm = 3;
}
if (operationState === "Idle") {
operationState_stm = 0;
}
if (operationState === "Exposing") {
operationState_stm = 1;
}
if (operationState === "Alarm") {
operationState_stm = 0;
}
// ModuleState
if (moduleState === "Idle"){
moduleState_stm = 0;
}
if (moduleState === "Exposing") {
moduleState_stm = 1;
}
// AlarmState
alarmState_stm = 0;
if (machineState === "Alarm" || exposingState === "Alarm" || alarmState === "Alarm") {
alarmState_stm = 2;
}
// umwandlung der Variablen-Werte für STM
if (communication_stm == 0) {
machineState_stm = -1;
operationState_stm = -1;
moduleState_stm = -1;
alarmState_stm = -1;
}
function sendStateInflux(stateValue, stateName) {
// Erstelle das Payload-Objekt
var influxPayload = [{
payload: [{
[stateName]: stateValue
},
{
_type: "State"
}],
topic: stateName
}];
// Sende das Payload
node.send([null, influxPayload]);
}
// Sende die Zustände mit Überprüfung auf Änderungen
sendStateInflux(communication_stm, "Communication");
sendStateInflux(machineState_stm, "MachineState");
sendStateInflux(operationState_stm, "OperationState");
sendStateInflux(alarmState_stm, "AlarmState");
sendStateInflux(moduleState_stm, "ModAlarmState");
/* INFLUX DB */
/* VISU */
// Communication
var comVisibility = (communication_stm === 0) ? "visible" : "hidden";
var comPayload = {
"command": "update_attribute",
"selector": machineNameSVG + "_Communication",
"attributeName": "visibility",
"attributeValue": comVisibility
};
node.send([{
payload: comPayload,
topic: "Communication"
}, null]);
// MachineState
var machineColor = "white";
if (communication_stm !== 0) {
switch (machineState_stm) {
case 1:
machineColor = "lightgreen";
break;
case 2:
machineColor = "lemonchiffon";
break;
case 3:
machineColor = "orange";
break;
}
}
var magSelectors = [machineNameSVG + "_MachineState", machineNameSVG + "_MachineStatePanel1", machineNameSVG + "_MachineStatePanel2"];
if (mag1Enabled && mag2Enabled) {
magSelectors.push(machineNameSVG + "_MachineState1", machineNameSVG + "_MachineState2");
} else if (mag1Enabled) {
magSelectors.push(machineNameSVG + "_MachineState1");
} else if (mag2Enabled) {
magSelectors.push(machineNameSVG + "_MachineState2");
}
var magPayload = magSelectors.map(function(selector) {
var strokeWidth;
if (selector === machineNameSVG + "_MachineStatePanel1") {
strokeWidth = "0.1";
} else if (selector === machineNameSVG + "_MachineStatePanel2") {
strokeWidth = "0";
} else {
strokeWidth = "0.5";
}
return {
"command": "update_attribute",
"selector": selector,
"attributeName": "style",
"attributeValue": "fill:" + machineColor + ";stroke:black;stroke-width:" + strokeWidth + ";"
};
});
node.send([{
payload: magPayload,
topic: "MachineState"
}, null]);
// OperationState
var operationPayload = ["Stopped", "Running", "Paused", "Referencing"].map(function(state, index) {
return {
"command": "update_attribute",
"selector": machineNameSVG + "_" + state,
"attributeName": "visibility",
"attributeValue": (index === operationState_stm) ? "visible" : "hidden"
};
});
node.send([{
payload: operationPayload,
topic: "OperationState"
}, null]);
// AlarmState
var alarm = "hidden";
if (alarmState_stm === 2) {
alarm = "visible";
}
var alarmStatePayload = [{
"command": "update_attribute",
"selector": machineNameSVG + "_Warning",
"attributeName": "visibility",
"attributeValue": "hidden"
},
{
"command": "update_attribute",
"selector": machineNameSVG + "_Alarm",
"attributeName": "visibility",
"attributeValue": alarm
}]
node.send([{
payload: alarmStatePayload,
topic: "AlarmState"
}, null]);
// ModuleState
var moduleStateColor = "transparent";
if (operationState_stm === 0) {
moduleStateColor = "transparent";
}
else if (operationState_stm === 1) {
moduleStateColor = "green";
}
if (operationState_stm !== -1) {
//Temperature
if (temperatureLed > temperatureLedLimitRed) {
moduleStateColor = "red";
} else if (temperatureLed > temperatureLedLimit1) {
moduleStateColor = "#F3FF00";
} else if (temperatureDMD > temperatureDMDLimitRed) {
moduleStateColor = "red";
} else if (temperatureDMD > temperatureDMDLimit1) {
moduleStateColor = "#F3FF00";
} else if (temperatureAmbient > temperatureAmbientLimitRed) {
moduleStateColor = "red";
} else if (temperatureAmbient > temperatureAmbientLimit1) {
moduleStateColor = "#F3FF00";
} else if (temperatureFPGA > temperatureFPGALimitRed) {
moduleStateColor = "red";
} else if (temperatureFPGA > temperatureFPGALimit1) {
moduleStateColor = "#F3FF00";
}
}
var moduleStatePayload = {
"command": "update_attribute",
"selector": machineNameSVG + "_Mod",
"attributeName": "style",
"attributeValue": "fill:" + moduleStateColor + ";stroke:none;stroke-width:0.5;" + "fill-opacity:0.3;"
};
node.send([{
payload: moduleStatePayload,
topic: "ModuleState"
}, null]);
// Sweeps
var sweepsText = currentSweep + "/" + totalSweeps;
if (sweepsText !== prevCurrentSweep + "/" + prevTotalSweeps) {
var sweepsPayload = {
"command": "update_text",
"selector": machineNameSVG + "_Sweeps",
"textContent": sweepsText
};
node.send([{
payload: sweepsPayload
}, null]);
prevCurrentSweep = currentSweep;
prevTotalSweeps = totalSweeps;
}
// RemainingTime
if (remainingTime !== prevRemainingTime) {
var remainingTimePayload = {
"command": "update_text",
"selector": machineNameSVG + "_RemainingTime",
"textContent": remainingTime + "s"
};
node.send([{
payload: remainingTimePayload
}, null]);
prevRemainingTime = remainingTime;
}
// visibility sweeps / remaining time
var running = "hidden";
if (operationState === "Exposing"){
running = "visible";
}
var visibilityPayload = [
{
"command": "update_attribute",
"selector": machineNameSVG+ "_SweepsBox",
"attributeName": "visibility",
"attributeValue": running
},
{
"command": "update_attribute",
"selector": machineNameSVG + "_RemainingTimeBox",
"attributeName": "visibility",
"attributeValue": running
},
]
node.send([{
payload: visibilityPayload
}, null]);
/* VISU */
}
/* STANDARD MACHINE / G370 */
else {
/* INFLUX DB */
if (communication == 0) {
machineState = -1;
operationState = -1;
alarmState = -1;
moduleState = -1;
modAlarmState = -1;
mag1AlarmState = -1;
mag2AlarmState = -1;
}
function sendStateInflux(stateValue, stateName) {
// Erstelle das Payload-Objekt
var influxPayload = [{
payload: [{
[stateName]: stateValue
},
{
_type: "State"
}],
topic: stateName
}];
// Sende das Payload
node.send([null, influxPayload]);
}
// Sende die Zustände mit Überprüfung auf Änderungen
sendStateInflux(communication, "Communication");
sendStateInflux(machineState, "MachineState");
sendStateInflux(operationState, "OperationState");
sendStateInflux(alarmState, "AlarmState");
if (moduleEnabled) {
sendStateInflux(moduleState, "ModuleState");
sendStateInflux(modAlarmState, "ModAlarmState");
}
if (mag1Enabled) {
sendStateInflux(mag1AlarmState, "Mag1AlarmState");
}
if (mag2Enabled) {
sendStateInflux(mag2AlarmState, "Mag2AlarmState");
}
/* INFLUX DB */
/* VISU */
// Communication
var comVisibility = (communication === 0) ? "visible" : "hidden";
var comPayload = {
"command": "update_attribute",
"selector": machineNameSVG + "_Communication",
"attributeName": "visibility",
"attributeValue": comVisibility
};
node.send([{
payload: comPayload,
topic: "Communication"
}, null]);
// MachineState
var machineColor = "white";
switch (machineState) {
case 1:
machineColor = "lightgreen";
break;
case 2:
machineColor = "lightblue";
break;
case 3:
machineColor = "orange";
break;
case 4:
machineColor = "pink";
break;
}
var magSelectors = [machineNameSVG + "_MachineState"];
if (mag1Enabled && mag2Enabled) {
magSelectors.push(machineNameSVG + "_MachineState1", machineNameSVG + "_MachineState2");
} else if (mag1Enabled) {
magSelectors.push(machineNameSVG + "_MachineState1");
} else if (mag2Enabled) {
magSelectors.push(machineNameSVG + "_MachineState2");
}
var magPayload = magSelectors.map(function(selector) {
return {
"command": "update_attribute",
"selector": selector,
"attributeName": "style",
"attributeValue": "fill:" + machineColor + ";stroke:black;stroke-width:0.5;"
};
});
node.send([{
payload: magPayload,
topic: "MachineState"
}, null]);
// OperationState
var operationPayload = ["Stopped", "Running", "Paused", "Referencing"].map(function(state, index) {
return {
"command": "update_attribute",
"selector": machineNameSVG + "_" + state,
"attributeName": "visibility",
"attributeValue": (index === operationState) ? "visible" : "hidden"
};
});
node.send([{
payload: operationPayload,
topic: "OperationState"
}, null]);
// AlarmState
let warning = "hidden";
if (alarmState === 1){
warning = "visible";
}
var alarm = "hidden";
if (alarmState === 2) {
alarm = "visible";
}
var alarmStatePayload = [{
"command": "update_attribute",
"selector": machineNameSVG + "_Warning",
"attributeName": "visibility",
"attributeValue": warning
},
{
"command": "update_attribute",
"selector": machineNameSVG + "_Alarm",
"attributeName": "visibility",
"attributeValue": alarm
}]
node.send([{
payload: alarmStatePayload,
topic: "AlarmState"
}, null]);
/* VISU */
/* G370 */
if (g370Enabled) {
// PumpLevel
//if (pumpLevel !== prevPumpLevel) {
var pumpLevelPayload = {
"command": "update_text",
selector: machineNameSVG + "_PumpLevel",
textContent: pumpLevel + "%"
}
node.send([{
payload: pumpLevelPayload
}, null]);
prevPumpLevel = pumpLevel;
//}
// ActualPressure
if (actualPressure !== prevActualPressure) {
var actualPressurePayload = {
"command": "update_text",
selector: machineNameSVG + "_ActualPressure",
textContent: actualPressure + pressureUnit
}
node.send([{
payload: actualPressurePayload
}, null]);
prevActualPressure = actualPressure;
}
// RemainingTime
if (remainingTime !== prevRemainingTime) {
var remainingTimePayload = {
"command": "update_text",
selector: machineNameSVG + "_RemainingTime",
textContent: remainingTime + "s"
}
node.send([{
payload: remainingTimePayload
}, null]);
prevRemainingTime = remainingTime;
}
// visibility status
var running = "hidden";
if (operationState === 1){
running = "visible";
}
var visibilityStatusPayload = [{
"command": "update_attribute",
"selector": machineNameSVG + "_StatusText",
"attributeName": "visibility",
"attributeValue": running
}]
node.send([{
payload: visibilityStatusPayload
}, null]);
}
}
});
}
// Node-Typ registrieren
RED.nodes.registerType("Visualization", Visualization);
};