Resolving Browser Issues on SIMATIC IOT2050 for Node-RED

David Krause9 min read
HMI / SCADASiemensTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Resolving Browser Issues on SIMATIC IOT2050 for Node-RED Dashboard

The SIMATIC IOT2050 is a rugged industrial IoT gateway used as an edge device for collecting, processing, and visualizing PLC data through Node-RED dashboards. A common field problem is that locally installed browsers either crash, run too slowly, or fail to render the Node-RED Dashboard correctly. This article documents the root cause, the affected firmware versions, and verified remediation paths.

Primary symptom: Browsers installed directly on the IOT2050 (Firefox, Chromium, Dillo, Konqueror) either fail to launch, throw segmentation faults, or render Node-RED Dashboard pages with missing widgets, slow refresh, or partial layouts.

1. Problem Details

Engineers deploying a Node-RED HMI on the IOT2050 typically want the gateway itself to drive a connected panel display. The reported failure modes across the available browser engines are:

Browser Observed Behavior Root Cause Category
Firefox (lxde desktop) Opens but system becomes unresponsive; UI lags to unusable level Memory / CPU saturation
Chromium Segmentation fault on startup or during page load GPU / shared memory driver mismatch
Dillo Renders but cannot display Node-RED Dashboard widgets Lacks HTML5 / JavaScript engine support
Konqueror Runtime errors, fails to start under lxde session KDE dependency footprint on ARM

The IOT2050 is built around a TI Sitara ARM Cortex-A53 SoC with limited RAM (1 GB on the Basic variant, 2 GB on Advanced). The Example Image ships a minimal Debian-based userland optimized for headless service hosting, not for desktop-class browsing. Running a full browser engine on top of Node-RED, the system services, and the IOT2050 ARDT (Automation Runtime) interface consumes the available memory and CPU cycles.

2. Affected Hardware and Software Versions

Component Version / Article Number Notes
SIMATIC IOT2050 Basic 6ES7647-0BA00-0YA2 1 GB RAM, 4 GB eMMC
SIMATIC IOT2050 Advanced 6ES7647-0BA00-1YA2 2 GB RAM, 16 GB eMMC
Example Image V1.0.2 Released 2021 Known browser issue; default Chromium build is unstable
Example Image V1.0.x (later) GitHub master branch Chromium regression fix included
Node.js runtime 12.x or newer Mandatory for node-red-dashboard module
Node-RED Dashboard node-red-dashboard 2.x / 3.x Requires Node.js >= 12

Refer to the official Siemens Industry Online Support portal for the current IOT2050 image matrix and the meta-iot2050 GitHub repository for the Yocto layer that builds the production images.

3. Root Cause Analysis

Three independent causes converge:

3.1 Memory and CPU Headroom

The IOT2050 Basic reserves significant RAM for the ARDT runtime that bridges to S7-1500 / S7-1200 controllers via Snap7 or S7-node. Adding a desktop session plus a Chromium tab on top of the Node-RED runtime (Node.js + Express + Socket.IO + dashboard widgets) pushes the working set past the available physical memory, forcing aggressive swapping to eMMC and producing the reported slowness in Firefox.

3.2 Chromium GPU Initialization on Example Image V1.0.2

The prebuilt Chromium binary packaged in Example Image V1.0.2 expects a GPU acceleration path that is not consistently available on the Sitara SoC under the X11 stack shipped with that image. The resulting GPU process aborts with SIGSEGV, surfacing as a Chromium segmentation fault. The fix landed in the master branch of the meta-iot2050 Yocto layer; rebuilding the image or applying the updated Chromium recipe resolves the fault.

3.3 Dillo and Konqueror Capability Gap

Node-RED Dashboard widgets rely on AngularJS, WebSocket keepalives, and dynamic CSS transforms. Dillo does not implement the JavaScript engine APIs required by AngularJS, so widgets never instantiate. Konqueror's KHTML/KJS stack is heavy and pulls in KDE libraries that are not packaged in the lean IOT2050 userland, causing launch failures.

Mixed-content issues (HTTPS page embedding HTTP iframes or WebSocket upgrades) can also prevent Dashboard widgets from rendering even when the browser itself launches. If your Node-RED instance is reverse-proxied through TLS, ensure the upgrade headers and the ui base path are all served from the same scheme.

4. Solution Paths

Three remediation paths are field-validated, in order of preference:

  1. Run the dashboard in a browser on a remote engineering station (recommended). This is the lowest-risk path and the path Siemens support endorses for production deployments.
  2. Rebuild the IOT2050 image from the GitHub master branch to pick up the Chromium fix.
  3. Use a light-weight local browser only for static status pages, and serve the interactive dashboard remotely.

5. Step-by-Step: Remote Browser Access (Primary Path)

The Node-RED web server listens on TCP port 1880 by default. Any browser on the same network as the IOT2050 can render the full Dashboard without installing a browser on the gateway itself.

5.1 Prerequisites

  • SIMATIC IOT2050 with Example Image V1.0.2 or later running and reachable on the plant network.
  • Node-RED service started (systemd unit node-red.service enabled at boot).
  • Engineering PC with Chrome, Edge, or Firefox installed.

5.2 Procedure

  1. On the engineering PC, open a browser and navigate to http://<IOT2050-IP>:1880. Example: http://192.168.200.1:1880.
  2. Confirm the Node-RED flow editor loads. Open the Dashboard tab by appending /ui: http://<IOT2050-IP>:1880/ui.
  3. Bookmark the /ui URL on the engineering PC. For a panel display, set the browser to full-screen kiosk mode:
chrome.exe --kiosk --noerrdialogs --disable-infobars http://192.168.200.1:1880/ui
  1. If you need the panel to restart the dashboard view automatically after a power cycle, add the Chrome/Edge shortcut to the Windows startup folder, or use the autostart entry under ~/.config/autostart/ on a Linux kiosk host.
  2. For a fanless industrial panel connected directly to the IOT2050, use a separate thin client or an external panel PC as the display host rather than running the browser on the gateway.

6. Step-by-Step: Rebuild Image with Fixed Chromium

Use this path only when the IOT2050 itself must drive a connected display with no remote host available.

6.1 Prerequisites

  • Linux build host (Ubuntu 20.04 or 22.04) with at least 100 GB free disk space and 16 GB RAM.
  • Yocto dependencies installed (git, build-essential, chrpath, diffstat, texinfo, gawk, python3).
  • Read access to the siemens/meta-iot2050 repository.

6.2 Procedure

  1. Clone the BSP layer:
git clone https://github.com/siemens/meta-iot2050.git
cd meta-iot2050
git checkout master
  1. Initialize the Yocto build environment following the README. Select the machine matching your hardware:
MACHINE=iot2050-basic source meta-iot2050/setup.sh
# or for Advanced
MACHINE=iot2050-advanced source meta-iot2050/setup.sh
  1. Add Node-RED and the dashboard module to the image recipe iot2050-image.bb by including node-red and node-red-dashboard in IMAGE_INSTALL_append.
  2. Build the image:
bitbake iot2050-image
  1. Flash the resulting .wic image to a USB stick or SD card and boot the IOT2050 from it. The new Chromium build will not segfault on the Sitara GPU path.
Time and disk: A first-time Yocto build typically requires 6-12 hours and 80-120 GB of disk space. Use an SSD for the build host. Subsequent incremental builds are much faster.

7. Step-by-Step: Lightweight Local Browser for Static Pages

If you need a local browser on the IOT2050 to display read-only KPIs, a single-page status board, or a non-interactive overview, configure Dillo to serve a static HTML page generated by Node-RED.

  1. Install Dillo on the IOT2050 via apt install dillo after enabling the Debian feed in the image.
  2. In Node-RED, add an http in node configured with GET /kpi and a template node returning a minimal HTML response (no AngularJS).
  3. Launch Dillo pointing to http://127.0.0.1:1880/kpi. Avoid any URL ending in /ui; the Node-RED Dashboard UI requires JavaScript Dillo cannot execute.

8. Verification

After applying the remote-browser or rebuilt-image path, verify the following from the IOT2050 shell:

  1. Confirm Node-RED is listening:
systemctl status node-red
ss -tlnp | grep 1880
  1. From a remote PC, request the dashboard root and confirm HTTP 200:
curl -I http://192.168.200.1:1880/ui
  1. Open http://192.168.200.1:1880/ui in Chrome on the engineering PC. All Dashboard tabs and widgets should render within 3-5 seconds on a Gigabit network.
  2. Verify PLC connectivity from the dashboard by toggling an ui_switch bound to a Snap7 or S7 node; the state change should appear on the connected S7-1500 within one scan cycle.

9. Troubleshooting Matrix

Symptom Likely Cause Action
Chromium crashes immediately on launch Example Image V1.0.2 GPU bug Rebuild from master branch or upgrade image
Firefox opens but system hangs Out of memory Stop Node-RED, close other services, switch to remote browser
Dillo shows blank page on /ui No JS engine Dillo cannot run Dashboard; use Chrome on remote host
Dashboard loads but widgets missing Mixed HTTP/HTTPS content Unify scheme across reverse proxy and Node-RED
Dashboard 404 on /ui Dashboard module not installed Install via Palette Manager or npm i node-red-dashboard
Cannot reach port 1880 from PC Firewall or VLAN routing Open port 1880 in iptables; verify management VLAN
Node-RED will not start on boot Service not enabled systemctl enable --now node-red

10. Performance and Resource Notes

For an IOT2050 Basic driving both Node-RED and an S7 communication stack, plan for a steady-state RAM budget of approximately:

Component Typical RAM (MB)
Linux kernel and base system 120
Node.js runtime 80
Node-RED core 60
node-red-dashboard 40
Snap7 / S7-node 30
OpenSSL, systemd journal, misc 70
Total headless ~400 MB
+ local Chromium with one tab +350-500 MB

On a 1 GB IOT2050 Basic the Chromium path leaves almost no headroom and will swap. This is why the remote-browser path is the engineering default. The 2 GB Advanced variant can run a local Chromium if no other heavy services are loaded, but it is still not recommended for production.

11. Security and Hardening

  • Change the Node-RED admin password on first boot (settings.js -> adminAuth) and rotate the credentialSecret.
  • Restrict port 1880 to the management VLAN via iptables -A INPUT -p tcp --dport 1880 -s 192.168.200.0/24 -j ACCEPT.
  • For a panel display, serve the dashboard behind nginx with TLS and HTTP-to-HTTPS upgrade headers to avoid mixed-content failures.
  • Disable Node-RED package autocatalog updates in production (NODE_RED_DISABLE_TELEMETRY=1 and safe-mode on first boot).
Do not expose port 1880 directly to the plant OT network without authentication. Node-RED flows can execute arbitrary commands; a compromised dashboard is a vector into the controller network.

12. FAQ

Which browser version works on the SIMATIC IOT2050?

There is no officially supported browser that runs reliably on the IOT2050 for Node-RED Dashboard rendering. The recommended pattern is to run Chrome, Edge, or Firefox on a remote engineering PC or panel PC and connect to port 1880 of the IOT2050.

Why does Chromium segfault on IOT2050 Example Image V1.0.2?

The Chromium binary in V1.0.2 expects a GPU acceleration path that the Sitara X11 stack does not provide consistently, causing a SIGSEGV in the GPU process. The fix is included in the master branch of the meta-iot2050 GitHub layer; rebuild the image or upgrade to a later release to obtain a stable Chromium.

Can Dillo display the Node-RED Dashboard?

No. The Node-RED Dashboard module is built on AngularJS and WebSockets, which Dillo does not implement. Use Dillo only for static, server-rendered HTML pages, not the /ui endpoint.

What is the default port for the Node-RED Dashboard on the IOT2050?

The Node-RED web server listens on TCP 1880 by default. The Dashboard UI is served at http://<IOT2050-IP>:1880/ui, and the flow editor at http://<IOT2050-IP>:1880.

Does the IOT2050 support running Arduino IDE locally?

No. The Example Image is a minimal Debian userland and does not include the X11, Java, and library dependencies required by the Arduino IDE. Program the IOT2050 in high-level languages (Python, Node.js) using the ARDT interface, Snap7, or S7-node for PLC connectivity instead.

Back to blog