"addressSpaceScript":"function constructAlarmAddressSpace(server, addressSpace, eventObjects, done) {\n // server = the created node-opcua server\n // addressSpace = address space of the node-opcua server\n // eventObjects = add event variables here to hold them in memory from this script\n\n // internal sandbox objects are:\n // node = the compact server node,\n // coreServer = core compact server object for debug and access to NodeOPCUA\n // this.sandboxNodeContext = node context node-red\n // this.sandboxFlowContext = flow context node-red\n // this.sandboxGlobalContext = global context node-red\n // this.sandboxEnv = env variables\n // timeout and interval functions as expected from nodejs\n\n\n const opcua = coreServer.choreCompact.opcua;\n const LocalizedText = opcua.LocalizedText;\n const namespace = addressSpace.getOwnNamespace();\n\n const Variant = opcua.Variant;\n const DataType = opcua.DataType;\n const DataValue = opcua.DataValue;\n\n var flexServerInternals = this;\n\n\n const rootFolder = addressSpace.findNode(\"RootFolder\");\n\n this.sandboxFlowContext.set(\"Humidity\", false);\n this.sandboxFlowContext.set(\"Temperature\", false);\n this.sandboxFlowContext.set(\"access\", false);\n this.sandboxFlowContext.set(\"illuminance\", false);\n\n\n const sensor_Data = namespace.addFolder(rootFolder.objects, {\n\"browseName\": \"Sensor_data\"\n });\n const access_control = namespace.addFolder(rootFolder.objects, {\n\"browseName\": \"access_control\"\n });\n const access = namespace.addFolder(access_control, {\n\"browseName\": \"access_event\"\n });\n const temperature = namespace.addFolder(sensor_Data, {\n\"browseName\": \"temperature\"\n });\n const humidity = namespace.addFolder(sensor_Data, {\n\"browseName\": \"humidity\"\n });\n const temperature_float = namespace.addFolder(temperature, {\n\"browseName\": \"Float_C\"\n });\n const humidity_float = namespace.addFolder(humidity, {\n\"browseName\": \"humidity_%\"\n });\n const tempCritical = namespace.addFolder(sensor_Data, {\n\"browseName\": \"Temp_critical\"\n });\n const humidityCritical = namespace.addFolder(sensor_Data, {\n\"browseName\": \"Humidity_critical\"\n });\n const illuminance = namespace.addFolder(sensor_Data, {\n\"browseName\": \"illuminance\"\n });\n const temperature_var = namespace.addVariable({\n\"organizedBy\": temperature_float,\n\"browseName\": \"temperature\",\n\"nodeId\": \"ns=1;s=Temperature_value\",\n\"dataType\": \"Double\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Double,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"Temperature\")\n });\n },\n\"set\": function (Variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"Temperature\",\n Variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n const humidity_var = namespace.addVariable({\n\"organizedBy\": humidity_float,\n\"browseName\": \"Humidity\",\n\"nodeId\": \"ns=1;s=Humidity_value\",\n\"dataType\": \"Double\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Double,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"Humidity\")\n });\n },\n\"set\": function (Variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"Humidity\",\n Variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n const temperatureCritical = namespace.addVariable({\n\"organizedBy\": tempCritical,\n\"browseName\": \"Value\",\n\"nodeId\": \"ns=1;s=Temp_critical_value\",\n\"dataType\": \"Boolean\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Boolean,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"critical_temperature\")\n });\n },\n\"set\": function (variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"Value\",\n variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n\n const humidityCrit = namespace.addVariable({\n\"organizedBy\": humidityCritical,\n\"browseName\": \"Value\",\n\"nodeId\": \"ns=1;s=Humidity_critical_value\",\n\"dataType\": \"Boolean\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Boolean,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"critical_humidity\")\n });\n },\n\"set\": function (variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"humiditycriticalvl\",\n variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n const accessevent= namespace.addVariable({\n\"organizedBy\": access_control,\n\"browseName\": \"Value\",\n\"nodeId\": \"ns=1;s=accessevent\",\n\"dataType\": \"Boolean\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Boolean,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"access\")\n });\n },\n\"set\": function (variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"access\",\n variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\nconst illuminance_var = namespace.addVariable({\n\"organizedBy\": illuminance,\n\"browseName\": \"illuminance\",\n\"nodeId\": \"ns=1;s=illuminance_value\",\n\"dataType\": \"Double\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Double,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"Temperature\")\n });\n },\n\"set\": function (Variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"lux\",\n Variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n\n done();\n}",
"addressSpaceScript":"function constructAlarmAddressSpace(server, addressSpace, eventObjects, done) {\n // server = the created node-opcua server\n // addressSpace = address space of the node-opcua server\n // eventObjects = add event variables here to hold them in memory from this script\n\n // internal sandbox objects are:\n // node = the compact server node,\n // coreServer = core compact server object for debug and access to NodeOPCUA\n // this.sandboxNodeContext = node context node-red\n // this.sandboxFlowContext = flow context node-red\n // this.sandboxGlobalContext = global context node-red\n // this.sandboxEnv = env variables\n // timeout and interval functions as expected from nodejs\n\n\n const opcua = coreServer.choreCompact.opcua;\n const LocalizedText = opcua.LocalizedText;\n const namespace = addressSpace.getOwnNamespace();\n\n const Variant = opcua.Variant;\n const DataType = opcua.DataType;\n const DataValue = opcua.DataValue;\n\n var flexServerInternals = this;\n\n\n const rootFolder = addressSpace.findNode(\"RootFolder\");\n\n this.sandboxFlowContext.set(\"Humidity\", false);\n this.sandboxFlowContext.set(\"Temperature\", false);\nthis.sandboxFlowContext.set(\"humiditycriticalvl\", false);\n this.sandboxFlowContext.set(\"tempecriticalvl\", false);\n\nthis.sandboxFlowContext.set(\"access\", false);\n this.sandboxFlowContext.set(\"illuminance\", false);\n\n\n const sensor_Data = namespace.addFolder(rootFolder.objects, {\n\"browseName\": \"Sensor_data\"\n });\n const access_control = namespace.addFolder(rootFolder.objects, {\n\"browseName\": \"access_control\"\n });\n const access = namespace.addFolder(access_control, {\n\"browseName\": \"access_event\"\n });\n const temperature = namespace.addFolder(sensor_Data, {\n\"browseName\": \"temperature\"\n });\n const humidity = namespace.addFolder(sensor_Data, {\n\"browseName\": \"humidity\"\n });\n const temperature_float = namespace.addFolder(temperature, {\n\"browseName\": \"Float_C\"\n });\n const humidity_float = namespace.addFolder(humidity, {\n\"browseName\": \"humidity_%\"\n });\n const tempCritical = namespace.addFolder(sensor_Data, {\n\"browseName\": \"Temp_critical\"\n });\n const humidityCritical = namespace.addFolder(sensor_Data, {\n\"browseName\": \"Humidity_critical\"\n });\n const illuminance = namespace.addFolder(sensor_Data, {\n\"browseName\": \"illuminance\"\n });\n const temperature_var = namespace.addVariable({\n\"organizedBy\": temperature_float,\n\"browseName\": \"temperature\",\n\"nodeId\": \"ns=1;s=Temperature_value\",\n\"dataType\": \"Double\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Double,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"Temperature\")\n });\n },\n\"set\": function (Variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"Temperature\",\n Variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n const humidity_var = namespace.addVariable({\n\"organizedBy\": humidity_float,\n\"browseName\": \"Humidity\",\n\"nodeId\": \"ns=1;s=Humidity_value\",\n\"dataType\": \"Double\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Double,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"Humidity\")\n });\n },\n\"set\": function (Variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"Humidity\",\n Variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n const temperatureCritical = namespace.addVariable({\n\"organizedBy\": tempCritical,\n\"browseName\": \"Value\",\n\"nodeId\": \"ns=1;s=Temp_critical_value\",\n\"dataType\": \"Boolean\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Boolean,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"tempecriticalvl\")\n });\n },\n\"set\": function (variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"tempecriticalvl\",\n variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n\n const humidityCrit = namespace.addVariable({\n\"organizedBy\": humidityCritical,\n\"browseName\": \"Value\",\n\"nodeId\": \"ns=1;s=Humidity_critical_value\",\n\"dataType\": \"Boolean\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Boolean,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"humiditycriticalvl\")\n });\n },\n\"set\": function (variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"humiditycriticalvl\",\n variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n const accessevent= namespace.addVariable({\n\"organizedBy\": access_control,\n\"browseName\": \"Value\",\n\"nodeId\": \"ns=1;s=accessevent\",\n\"dataType\": \"Boolean\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Boolean,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"access\")\n });\n },\n\"set\": function (variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"access\",\n variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\nconst illuminance_var = namespace.addVariable({\n\"organizedBy\": illuminance,\n\"browseName\": \"illuminance\",\n\"nodeId\": \"ns=1;s=illuminance_value\",\n\"dataType\": \"Double\",\n\"value\": {\n\"get\": function () {\n return new Variant({\n\"dataType\": DataType.Double,\n\"value\": flexServerInternals.sandboxFlowContext.get(\"lux\")\n });\n },\n\"set\": function (Variant) {\n flexServerInternals.sandboxFlowContext.set(\n\"lux\",\n Variant.value\n );\n return opcua.StatusCodes.Good;\n }\n }\n });\n\n done();\n}",
"x":540,
"y":1120,
"wires":[]
...
...
@@ -418,7 +418,7 @@
"type":"function",
"z":"2df1dfd158b253ed",
"name":"check_critical_temperature_trigger",
"func":"var inputObject = msg.payload;\n\nvar criticalTemperature = inputObject.criticaltemp;\nvar criticalHumidity = inputObject.criticalhumidity;\n\nif (criticalTemperature || criticalHumidity) {\n // If either critical temperature or critical humidity is true\n msg.payload = \"Critical temperature or humidity condition is met.\";\n return msg;\n} else {\n// If neither critical temperature nor critical humidity is true\n msg.payload = \"Critical conditions are not met.\";\n}\n\n",
"func":"msg.topic=\"node-red-notification\"\nvar inputObject = msg.payload;\n\nvar criticalTemperature = inputObject.criticaltemp;\nvar criticalHumidity = inputObject.criticalhumidity;\n\n// Define the interval time in milliseconds (e.g., 10 minutes = 600000 ms)\nvar intervalTime = 600000;\n\nif (criticalTemperature || criticalHumidity) {\n // Get the current time\n var currentTime = Date.now();\n\n // Get the last sent time from the global context, defaulting to 0 if not set\n var lastSentTime = context.global.get('lastSentTime') || 0;\n\n // Check if the interval has passed since the last message was sent\n if (currentTime - lastSentTime > intervalTime) {\n // Update the last sent time in the global context\n context.global.set('lastSentTime', currentTime);\n\n // Set the message payload to indicate critical conditions\n msg.payload = \"Critical temperature or humidity condition is met.\";\nreturn msg;\n} else {\n // Interval has not passed, do not send a message\n return null;\n }\n} else {\n // Critical conditions are not met, do not send a message\n return null;\n}\n",