[
    {
        "id": "9f075ff2e2a04c12",
        "type": "tab",
        "label": "OPCUA Server - basic",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "780fb182a24ec3fd",
        "type": "function",
        "z": "9f075ff2e2a04c12",
        "name": "Create Basic OPCUA Server with one counter variable",
        "func": "// Demonstrates the GLOBALS path — works under `functionExternalModules: false`.\n//\n// No `libs:` Setup-tab entry. No settings.js edit. The Sterfive palette\n// populates `global.get(\"sterfive\")` at startup via bootstrapOnce(); user\n// code reaches into it instead of importing.\nconst sterfive = global.get(\"sterfive\");\nif (!sterfive) {\n    node.error(\"global.get('sterfive') is not set — is opcua-for-nodered loaded?\");\n} else {\n    const { bootstrap, opcua } = sterfive;\n    const { bootstrapServer } = bootstrap;\n\n    const cfg = msg.config || {};\n\n    const handle = await bootstrapServer({\n        port: cfg.port ?? 4840,\n        endpoint: cfg.endpoint || \"node-red-server\",\n        nodesets: [\n            \"standard\",\n            \"di\",\n            \"ia\",\n            \"machinery\"\n        ],\n        onPopulate: (addressSpace, exposed) => {\n\n            const ns = addressSpace.getOwnNamespace();\n            exposed.myCounter = ns.addVariable({\n                organizedBy: \"RootFolder\",\n                nodeId: \"s=Counter\",\n                browseName: \"Counter\",\n                dataType: \"Double\",\n                value: { dataType: \"Double\", value: 3.14 },\n            });\n        },\n    });\n\n    flow.set(\"$myCounter\", handle.exposed.myCounter);\n\n    node.send({ payload: `OPC UA Server (globals path) running at ${handle.server.getEndpointUrl()}` });\n}\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 540,
        "y": 140,
        "wires": [
            [
                "a6b49c71d09a9b8c"
            ]
        ]
    },
    {
        "id": "de0711735c90a8cf",
        "type": "inject",
        "z": "9f075ff2e2a04c12",
        "name": "Start Server",
        "props": [
            {
                "p": "config",
                "v": "{ \"port\": 26550 }",
                "vt": "json"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "x": 210,
        "y": 140,
        "wires": [
            [
                "780fb182a24ec3fd"
            ]
        ]
    },
    {
        "id": "a6b49c71d09a9b8c",
        "type": "debug",
        "z": "9f075ff2e2a04c12",
        "name": "debug output",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 850,
        "y": 200,
        "wires": []
    },
    {
        "id": "838a2f9ddea59a54",
        "type": "function",
        "z": "9f075ff2e2a04c12",
        "name": "update OPCUA counter variable",
        "func": "var v = flow.get(\"$myCounter\");\nconst value = v.readValue()\nvalue.value.value += 1;\nv.setValueFromSource(value.value)\nreturn { ...msg, payload: value.value.value };",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 470,
        "y": 240,
        "wires": [
            [
                "a6b49c71d09a9b8c"
            ]
        ]
    },
    {
        "id": "18ea982bc2a9e0e5",
        "type": "inject",
        "z": "9f075ff2e2a04c12",
        "name": "Count Up",
        "props": [],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "x": 200,
        "y": 240,
        "wires": [
            [
                "838a2f9ddea59a54"
            ]
        ]
    }
]
