UNPKG

grunig-nodes

Version:

Grünig Nodes Library

548 lines (488 loc) 23.1 kB
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 { 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"; switch (machineState_stm) { case 1: machineColor = "lightgreen"; 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 = "lightgrey"; if (operationState_stm === 0) { moduleStateColor = "lightgrey"; } else if (operationState_stm === 1) { moduleStateColor = "green"; } if (operationState_stm !== -1) { //Temperature if (temperatureLed > temperatureLedLimitRed) { moduleStateColor = "red"; } else if (temperatureLed > temperatureLedLimit1) { moduleStateColor = "yellow"; } else if (temperatureDMD > temperatureDMDLimitRed) { moduleStateColor = "red"; } else if (temperatureDMD > temperatureDMDLimit1) { moduleStateColor = "yellow"; } else if (temperatureAmbient > temperatureAmbientLimitRed) { moduleStateColor = "red"; } else if (temperatureAmbient > temperatureAmbientLimit1) { moduleStateColor = "yellow"; } else if (temperatureFPGA > temperatureFPGALimitRed) { moduleStateColor = "red"; } else if (temperatureFPGA > temperatureFPGALimit1) { moduleStateColor = "yellow"; } } 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); };