Problem Overview
On a SIMATIC IOT2050 (article number 6ES7 647-0BA00-1YA2) running IOT2050_IndustrialOS_Service_Stick_V3.2.2, a Node-RED flow that bridges to a SIMATIC S7-1518 PLC over OPC UA fails immediately on deploy. The editor banner reports:
Flow stopped due to missing node type
The missing node classes observed in the flow configuration are:
OpcUa-EndpointOpcUa-ClientOpcUa-Itemui_tabui_base
The first three are provided by the node-red-contrib-opcua Node-RED package; ui_tab and ui_base are contributed by the node-red-dashboard palette. The combined failure pattern indicates that the OPC UA plugin failed to load at runtime, dragging the dashboard nodes down with it, so the editor surfaces every dependency as a "missing type".
node_modules and the node-red.log before assuming a palette corruption.Affected Hardware and Software Stack
| Component | Value in this incident | Source |
|---|---|---|
| IOT2050 article number | 6ES7 647-0BA00-1YA2 | SIMATIC IOT2050 device label |
| IndustrialOS image | V3.2.2 (Service Stick) | Siemens IOT2050 IndustrialOS release notes |
| Node.js runtime | v12.22.12 (out-of-the-box) |
node -v shell output |
| Node-RED version | Bundled with IndustrialOS V3.2.2 | IndustrialOS release manifest |
| node-red-contrib-opcua | 0.2.339 (newest at time of incident) | npm registry |
| Target controller | SIMATIC S7-1518 (S7-1500 family) | Project TIA Portal configuration |
| Protocol | OPC UA over TCP, port 4840 | OPC UA specification IEC 62541 |
Refer to the official SIMATIC IOT2050 product page and operating instructions on Siemens Industry Online Support for the canonical device description and download area for IndustrialOS service sticks.
Root Cause: Node.js Runtime Incompatibility
The fundamental cause is a Node.js major-version mismatch. The node-red-contrib-opcua package at version 0.2.339 (and every release on the 0.2.x and 0.3.x lines that followed) requires a Node.js runtime newer than the v12 LTS that ships with IndustrialOS V3.2.2. When the Node-RED loader tries to require() the plugin's compiled native bindings, the engine check throws and the module is never registered. Node-RED then reports every node class defined in that package as a missing type.
Specific failure chain:
- Operator updates the palette in Node-RED →
node-red-contrib-opcuais upgraded to 0.2.339. - Node-RED restarts and tries to load the new module against the bundled Node.js v12.22.12 runtime.
- The plugin's
engines.nodeconstraint is violated. The native OPC UA stack (built against newer V8 API) aborts duringrequire(). - Node-RED's runtime registry is missing five node types, so the flow is suspended with the missing-type error.
sudo apt-get update && sudo apt-get upgrade refreshes Debian packages but does not change the Node.js major version that was pinned into the image. This is why a routine upgrade still returns v12.22.12 from node -v.Diagnostic Procedure
Run the following sequence on the IOT2050 console or over SSH. Capture each output for the support ticket.
-
Confirm Node.js version
node -v npm -vExpected on IndustrialOS V3.2.2 out of the box:
v12.22.12. -
Confirm Node-RED version and user data directory
node-red --version node-red --help -
Inspect the loaded palette
ls -la ~/.node-red/node_modules | grep -E 'opcua|dashboard'Verify whether
node-red-contrib-opcuaandnode-red-dashboardare present in the user data directory. -
Reproduce the failure in safe mode
node-red --safeSafe mode disables all third-party nodes. If the flow deploys in safe mode, the failure is a plugin load error, not a flow JSON error.
-
Read the runtime log
tail -n 200 ~/.node-red/node-red.log | grep -iE 'opcua|missing|error'Look for lines such as
Error: The module '...' was compiled against a different Node.js version. This is the smoking gun. -
Check apt for available Node.js
apt-cache policy nodejsThis will confirm that the IOT2050 apt mirror is pinned to Node.js 12 packages, which is why a simple upgrade cannot lift the runtime.
Resolution Path A: Migrate to IndustrialOS 4.2.1 (Recommended)
Siemens provides a pre-release of IndustrialOS 4.2.1 for the IOT2050 that ships with Node.js v18.19.0, the LTS line supported by the current node-red-contrib-opcua releases. This is the cleanest path because the OS image also refreshes the entire Node-RED container dependencies and the underlying Debian base packages.
- Request the pre-release image from Siemens technical support for IOT2050. The pre-release is delivered out-of-band and is not in the public download center at the time of writing.
- Validate project requirements: IndustrialOS 4.2.1 pre-release does not support Secure Boot. Confirm with the plant security officer that UEFI Secure Boot is not mandated for this device, or accept the risk and disable Secure Boot in the BIOS before booting the new image.
- Back up the existing user data directory:
sudo systemctl stop node-red sudo tar czf /tmp/node-red-backup.tar.gz /home/iot2050/.node-red - Flash the new service stick and boot. IndustrialOS 4.2.1 will mount
/var/lib/iot2050from a new image but preserve the existing partition if you choose to retain user data during the first-boot wizard. - Verify the runtime:
node -v # expect v18.19.0 node-red --version - Restore the flow export:
node-red-admin install [email protected] node-red-admin install node-red-dashboard - Deploy the flow and confirm the editor banner is clear.
Resolution Path B: Manual Node.js Upgrade on IndustrialOS V3.2.2
If a full image migration is not possible because of Secure Boot or change-control constraints, upgrade the Node.js runtime in place using the NodeSource distribution. This path is unsupported by Siemens and must be documented in the change ticket.
- Install prerequisites:
sudo apt-get install -y ca-certificates curl gnupg - Add the NodeSource repository for Node.js 18 LTS (Bullseye track matches IndustrialOS V3.2.2):
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key \ | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x bullseye main" \ | sudo tee /etc/apt/sources.list.d/nodesource.list sudo apt-get update - Upgrade Node.js and npm:
sudo apt-get install -y nodejs node -v # expect v18.x - Reinstall the global Node-RED and OPC UA packages so that their native bindings recompile against the new V8 ABI:
sudo npm install -g --unsafe-perm node-red sudo npm install -g --unsafe-perm [email protected] sudo npm install -g --unsafe-perm node-red-dashboard - Restart the Node-RED service and deploy the flow.
rauc (the IOT2050 update framework) before applying.Resolution Path C: Pin node-red-contrib-opcua to a v12-Compatible Release
If neither of the above paths is acceptable (locked image, no Secure Boot exemption, regulated environment), the OPC UA plugin can be downgraded to the last release that still supports Node.js 12. This is a tactical workaround, not a long-term solution.
- Identify the last compatible release. The 0.2.x line dropped Node.js 12 support progressively; the final v12-capable build is typically in the early 0.2.3xx range. Inspect the package's
enginesfield across versions:npm view [email protected] engines npm view [email protected] engines - Pin the working version in the user data directory:
cd ~/.node-red npm install node-red-contrib-opcua@<last-v12-build> --save - Lock the version to prevent auto-upgrade by editing
~/.node-red/package.jsonso that the dependency line has no^or~prefix. - Disable palette auto-update in
~/.node-red/settings.js:editorTheme: { projects: { enabled: false } }, palette: { editable: false }
Verification Steps
After applying any of the three resolution paths, run the following checklist before handing the device back to operations:
- Confirm Node.js and Node-RED are on the intended versions:
node -v node-red --version - Open the Node-RED editor at
http://<iot2050-ip>:1880. The banner must readConnected; the missing-type error must be gone. - Click each OPC UA node in the flow and confirm the type picker (top right) shows
OpcUa-Endpoint,OpcUa-Client, andOpcUa-Itemas recognised classes. - Trigger a deploy and watch the debug sidebar. Expected: no
ReferenceErrororcompiled against a different Node.js versionlines. - Verify the OPC UA session against the S7-1518. The S7-1500 OPC UA server is enabled per default in TIA Portal V17 and later, listening on
opc.tcp://<plc-ip>:4840:- Endpoint URL:
opc.tcp://<plc-ip>:4840 - Security policy:
Nonefor the first test, then move toBasic256Sha256with a server certificate - Authentication:
Anonymousfor the first test, then a configured user in the S7-1500 user management
- Endpoint URL:
- Subscribe to a single tag, force a value change in TIA Portal, and confirm the change appears in the Node-RED debug pane within one polling cycle.
OPC UA Client Configuration for the SIMATIC S7-1518
For a stable link between the IOT2050 Node-RED flow and a SIMATIC S7-1518, configure the OPC UA client nodes as follows. These settings reflect the OPC UA server that the S7-1500 CPU exposes once the option is activated in TIA Portal under Device configuration > OPC UA > Server.
| Parameter | Value | Notes |
|---|---|---|
| Endpoint | opc.tcp://<plc-ip>:4840 |
Default port per IEC 62541 |
| Security Mode |
None or SignAndEncrypt
|
Match TIA Portal OPC UA server setting |
| Security Policy |
None or Basic256Sha256
|
S7-1500 supports up to Aes128Sha256RsaOaep in firmware V2.9+ |
| Authentication |
Anonymous or Username
|
Usernames are managed in TIA Portal > Users and Roles |
| Namespace | 0 (default) or the configured manufacturer namespace | S7-1500 exposes ns=1;s=DB<x>.<y> for data blocks |
| NodeId example | ns=1;s="MyDB".MyVar |
Must match the symbolic name exported by the S7-1500 |
Refer to the SIMATIC S7-1500 OPC UA server manual on Siemens Industry Online Support for the namespace mapping rules and the firmware-specific security policy list.
Troubleshooting Matrix
| Symptom | Likely cause | Remediation |
|---|---|---|
Flow stopped due to missing node type after palette update |
New package requires newer Node.js | Path A (IndustrialOS 4.2.1) or Path B (NodeSource Node 18) |
| Same error after a clean restart with no palette change | Corrupt node_modules in user data dir |
Delete ~/.node-red/node_modules and reinstall |
Only mqttssl or one specific node type missing |
That single module's bindings broken | Boot node-red --safe, search for the type, delete, redeploy |
| Missing-type error after restoring a flow export from a different device | Export references modules not installed locally | Install the missing packages on the target IOT2050 first, then import the flow |
Native binding error: NODE_MODULE_VERSION mismatch
|
Module compiled for a different Node.js ABI |
npm rebuild in the user data directory after upgrading Node.js |
node -v still returns v12 after apt upgrade
|
IndustrialOS image pins the Node.js package | Path A or Path B above; apt cannot bridge major versions on this image |
| OPC UA session connects but no data updates | Wrong NodeId syntax or subscription interval too aggressive | Confirm ns=1;s=... matches TIA Portal; raise requestedPublishingInterval to 500 ms for the first test |
Editor banner shows multiple missing UI nodes (ui_tab, ui_base) |
Dashboard plugin failed to load (often cascading from OPC UA failure) | Fix the root module first; UI nodes will reappear once the loader reaches them |
Best Practices and Prevention
- Pin the Node.js runtime in the IOT2050 documentation. IndustrialOS V3.2.2 = Node.js 12. IndustrialOS 4.x = Node.js 18. Treat any deviation as a configuration drift event.
- Always test a Node-RED palette update on a non-production IOT2050 first. The native bindings of
node-red-contrib-opcuarecompile on install, and a successful install on a workstation does not guarantee a successful install on the ARM-based IOT2050. - Snapshot the IOT2050 with the bundled
raucupdate framework before any manual Node.js upgrade. IndustrialOS supportsraucfor A/B partition rollback. - Maintain a version manifest for the OPC UA plugin. Record the exact
node-red-contrib-opcuaversion, Node.js version, and the S7-1500 firmware version in the change ticket. - Disable palette auto-update in regulated environments by setting
palette.editable: falseinsettings.js. Operators must raise a change request to update a package. - When migrating to IndustrialOS 4.2.1, involve the plant security team early. Secure Boot is disabled in the pre-release and the change must be approved and documented before flashing.
FAQ
What does "Flow stopped due to missing node type" mean on the IOT2050?
It means the Node-RED runtime could not register one or more node classes from the user data directory's node_modules. The most common cause on IndustrialOS V3.2.2 is a palette package that was built against a newer Node.js major version than the v12.22.12 that ships with the image. Inspect ~/.node-red/node-red.log for the underlying load error.
Why does sudo apt-get upgrade not raise Node.js from v12 to v18?
IndustrialOS V3.2.2 is built on a Debian snapshot with the Node.js 12 package pinned. apt-get upgrade only advances within the configured distribution; it does not cross a major version boundary. To get Node.js 18, you must either flash the IndustrialOS 4.2.1 service stick or add a third-party repository such as NodeSource and install the new package manually.
Which Node.js version does the latest node-red-contrib-opcua require?
Releases in the 0.2.3xx line and newer require Node.js 14 or later, and the most recent 0.3.x releases require Node.js 18 LTS. The IOT2050 IndustrialOS V3.2.2 default of v12.22.12 is below the minimum and must be upgraded before the plugin will load.
Can I run the new Node-RED flow on IndustrialOS V3.2.2 without changing the image?
Yes, by following Resolution Path B: add the NodeSource repository for Node.js 18, reinstall Node-RED and the OPC UA plugin, and recompile the native bindings. This is a deviation from the Siemens-shipped runtime and must be approved through change control and snapshotted with rauc before deployment.
Does IndustrialOS 4.2.1 support Secure Boot?
No. The pre-release of IndustrialOS 4.2.1 delivered for IOT2050 is signed with a development key and does not support UEFI Secure Boot. If Secure Boot is mandated by the plant security policy, you must use Resolution Path B (manual Node.js upgrade) on IndustrialOS V3.2.2, or wait for a signed production image of IndustrialOS 4.2.x.