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.
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.
ui base path are all served from the same scheme.4. Solution Paths
Three remediation paths are field-validated, in order of preference:
- 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.
- Rebuild the IOT2050 image from the GitHub master branch to pick up the Chromium fix.
- 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.serviceenabled at boot). - Engineering PC with Chrome, Edge, or Firefox installed.
5.2 Procedure
- On the engineering PC, open a browser and navigate to
http://<IOT2050-IP>:1880. Example:http://192.168.200.1:1880. - Confirm the Node-RED flow editor loads. Open the Dashboard tab by appending
/ui:http://<IOT2050-IP>:1880/ui. - Bookmark the
/uiURL 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
- 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
autostartentry under~/.config/autostart/on a Linux kiosk host. - 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
- Clone the BSP layer:
git clone https://github.com/siemens/meta-iot2050.git
cd meta-iot2050
git checkout master
- 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
- Add Node-RED and the dashboard module to the image recipe
iot2050-image.bbby includingnode-redandnode-red-dashboardinIMAGE_INSTALL_append. - Build the image:
bitbake iot2050-image
- Flash the resulting
.wicimage 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.
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.
- Install Dillo on the IOT2050 via
apt install dilloafter enabling the Debian feed in the image. - In Node-RED, add an
http innode configured withGET /kpiand atemplatenode returning a minimal HTML response (no AngularJS). - 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:
- Confirm Node-RED is listening:
systemctl status node-red
ss -tlnp | grep 1880
- From a remote PC, request the dashboard root and confirm HTTP 200:
curl -I http://192.168.200.1:1880/ui
- Open
http://192.168.200.1:1880/uiin Chrome on the engineering PC. All Dashboard tabs and widgets should render within 3-5 seconds on a Gigabit network. - Verify PLC connectivity from the dashboard by toggling an
ui_switchbound 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 thecredentialSecret. - 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=1andsafe-modeon first boot).
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.