Problem Overview
The SIMATIC IOT2050 is a rugged industrial IoT gateway based on the TI ARM Cortex-A72 SoC, designed to bridge OT and IT networks in factory automation. Like any Linux-based embedded platform, its firmware and Example Image (a preconfigured Debian derivative with Node-RED, PLCnext, and Industrial Edge agents) must be updated carefully. A failed firmware flash on the IOT2050 most commonly manifests as a permanently illuminated red STAT LED after reboot, leaving the device unreachable over Ethernet and forcing a recovery path through UART and a re-flashed Example Image.
This reference covers the recovery procedure for the article number 6ES7647-0BA00-0YA2 (basic variant, FS:01) and the advanced sibling 6ES7647-0BA00-1YA2, drawing on the official meta-iot2050 release repository and the Industrial Edge Device release notes published at SIMATIC IOT2050 IED One DB release notes V1.25.
Affected Hardware and Firmware Matrix
| Article Number | Variant | FS State | Recommended Min FW | Compatible Example Image |
|---|---|---|---|---|
| 6ES7647-0BA00-0YA2 | Basic | FS:01 / FS:02 / FS:03 / FS:04 | V1.4.4 | V1.3.1 or newer |
| 6ES7647-0BA00-1YA2 | Advanced | FS:01 / FS:02 | V1.4.4 | V1.3.1 or newer |
Skipping intermediate firmware versions is the most common cause of a bricked IOT2050. For example, jumping directly from V1.1.0 to V1.5.1 corrupts the U-Boot environment and triggers the red STAT LED. The recovery path requires downgrading to a known-good Example Image first, then stepping up through intermediate versions.
Root Cause Analysis
Three failure modes account for nearly every IOT2050 firmware update incident:
-
Out-of-sequence flash – applying a newer firmware to a U-Boot environment that expects an older boot chain. U-Boot halts with the message
bootcmd_host1 not definedbecause the boot script references variables only present in newer environments. -
Missing runtime dependencies – the firmware update tool requires
python3-progressand related apt packages. On a freshly flashed image that has never runapt update, the package index is stale and the dependency resolution fails mid-update, leaving the filesystem in an inconsistent state. - Interrupted OTA – the Industrial Edge Device (IED) catalog service may hang in Activating state during update activation, as documented in the IOT2050 IED One DB release notes V1.25. The device remains unresponsive because the catalog service never finalises the new firmware slot.
Prerequisites for Recovery
- USB-to-UART serial cable (3.3 V logic, FTDI FT232R or CP2102 recommended). The IOT2050 exposes a 4-pin UART header on the front panel silk-screened
X10; pinout is1=VCC(3V3),2=GND,3=TXD,4=RXD. - Terminal emulator configured to
115200 8N1, no flow control. PuTTY, minicom (minicom -D /dev/ttyUSB0 -b 115200), or the Arduino Serial Monitor all work. - USB stick formatted FAT32 with the verified Example Image (for example,
iot2050-example-image-v1.3.1.wic) extracted and the corresponding firmware.binfile. - Local TFTP or HTTP server if you intend to reflash over the network (U-Boot supports
tftpbooton the eth0 management port). - Latest meta-iot2050 release artifacts, which bundle the
iot2050-module-firmware-updatetool that supersedes the legacy flash procedure.
Step-by-Step Recovery Procedure
Step 1 – Capture U-Boot Diagnostics Over UART
- Connect the USB-UART cable before powering the IOT2050.
- Apply 24 V DC to the X1 connector. Watch the console for U-Boot banner and halt-on-error output.
- Press any key within the 3-second autoboot window to drop into the U-Boot shell.
- Record the full boot log; the key indicators to capture are:
U-Boot 20xx.xxversion string, environment block CRC status (env: CRC OKorenv: CRC bad), and anyUnknown command/not definedmessages.
Step 2 – Restore Default U-Boot Environment
Recent meta-iot2050 releases ship two default U-Boot environments (bootcmd_mmc0 and bootcmd_mmc1). Restore them with:
env default -a
saveenv
reset
This wipes the corrupted bootcmd_host1 reference and reverts to the factory boot chain.
Step 3 – Flash a Known-Good Example Image
Use U-Boot's ums command to expose the internal eMMC as a USB mass-storage device to a host PC:
ums 0 mmc 0
On the Linux host, identify the new block device (typically /dev/sdX) and write the verified Example Image with bmaptool for resumable, checksummed flashing:
sudo bmaptool copy iot2050-example-image-v1.3.1.wic /dev/sdX
.wic and .wic.bmap files before flashing. A partially downloaded image is the silent killer of the eMMC boot partition.Step 3a – Alternative: Flash via SD Card Boot
- Write the Example Image to a microSD card using
balenaEtcherordd. - Insert the SD card and force boot from it by holding the USER button (S1) on power-up for 5 seconds until the STAT LED flashes blue rapidly.
- Once the SD-resident Linux is running, use
iot2050-module-firmware-update(see Step 4) to reflash the internal eMMC from the SD rootfs.
Step 4 – Apply Firmware With the Updated Tool
As of the V1.4.x release line, Siemens introduced iot2050-module-firmware-update in the meta layer. The legacy firmware-update.sh script is deprecated. The new tool syntax is:
sudo iot2050-module-firmware-update -f /media/usb/iot2050-firmware-v1.4.4.bin
Flags worth knowing:
| Flag | Function |
|---|---|
-f <file> |
Firmware image path (.bin) |
-c |
Verify current firmware slot only, no write |
-r |
Activate redundant slot after update |
-y |
Skip interactive confirmation |
-V |
Print tool version and exit |
Step 5 – Resolve the python3-progress not installed Error
This dependency error appears when the freshly booted Example Image has a stale apt index. Resolve with:
sudo apt update
sudo apt upgrade -y
sudo apt install -y python3-progress python3-serial python3-yaml
After the upgrade, re-run the firmware update tool. The python3-progress package provides the progress bar hooks used during the flash, and its absence causes silent aborts that masquerade as boot failures.
Step 6 – Step Through Intermediate Firmware Versions
If the device was originally on V1.1.x and was flashed directly to V1.3.1, the U-Boot environment mismatch persists even after a clean Example Image reinstall. Step through the firmware versions in order:
- V1.3.1 (verify boot, STAT LED green)
- V1.4.1
- V1.4.4 (consolidation release, recommended baseline)
- V1.5.1 (target)
Each step requires a full reboot and visual confirmation that the STAT LED transitions from amber (boot) → green (operational). If the LED turns red at any step, capture the UART log before powering off.
STAT LED Behavior Reference
| LED Color | Pattern | State |
|---|---|---|
| Off | — | No power or POST failure (check 24 V supply and X1 polarity) |
| Green | Solid | Linux userspace running, Industrial Edge agents healthy |
| Green | Slow blink (~1 Hz) | Firmware update in progress |
| Amber | Solid | U-Boot bootloader active, no Linux boot yet |
| Amber | Blink | Example Image application phase |
| Blue | Rapid blink | Boot source override active (SD card boot) |
| Red | Solid | Firmware flash failed or boot chain corrupt — recovery required |
| Red | Slow blink | Watchdog reset triggered, check system journal |
Node-RED and Node.js Version Matrix
The Example Image bundles Node-RED as the default flow editor. The shipped version is determined by the firmware/Example Image pair, not by the underlying Debian release:
| Example Image Version | Node-RED | Node.js | Notes |
|---|---|---|---|
| V1.03 | 2.2.2 | 14.x | Legacy LTS line |
| V1.04 | 3.0.2 | 16.x | First 3.x release |
| V1.05 | 3.0.2 | 16.x | Same Node-RED, refreshed security patches |
If a custom flow requires a newer Node-RED version, install it manually using npm install -g node-red@<version> after disabling the systemd-managed nodered.service, or use the IOT2050's container runtime to run an isolated Node-RED image. Do not overwrite the system /usr/bin/node symbolic link; it breaks the iot2050-module-firmware-update tool.
Verification Checklist
- STAT LED returns to solid green within 90 seconds of power-up.
- Serial console shows clean systemd boot sequence with no
FAILEDlines. - Ethernet management port obtains an IP via DHCP (default hostname
iot2050, mDNSiot2050.local). -
sudo iot2050-module-firmware-update -creports the target firmware version and slot status asactive. - Web UI accessible at
https://<ip>:8443(Industrial Edge Device portal) or Node-RED athttp://<ip>:1880/ui. -
journalctl -u iot2050-module-firmware-update --no-pagershows the last update completed with exit code 0.
Troubleshooting Matrix
| Symptom | Likely Cause | Remediation |
|---|---|---|
| Red STAT LED, no UART output | U-Boot missing or eMMC erase | Re-flash via SD boot or ums from external host |
U-Boot: bootcmd_host1 not defined
|
Skipped firmware version | Run env default -a; saveenv; reset
|
Update fails with python3-progress not installed
|
Stale apt index | apt update && apt upgrade -y && apt install python3-progress |
| IED device stuck in Activating | IE Device Catalog service crash | Per release notes V1.25, restart the connector and re-trigger activation |
| Solid amber LED, never green | Boot script points to missing rootfs partition | Edit bootcmd_mmc0 in U-Boot, set root= to correct partition UUID |
| Watchdog red blink | Userspace hang or kernel panic | Capture dmesg, check for OOM in journalctl -k
|
Factory Reset Path
A full factory reset on the IOT2050 requires writing the original Siemens Example Image from the support portal (6ES7647-0AA00-0YA2 Service Pack media) using the SD card boot method. After the factory image boots:
- Log in as
admin(default password printed on the device label). - Run
sudo /usr/bin/iot2050-factory-reset(available in V1.4.4 and later Example Images). - Confirm with
y; the tool reformats the user data partition while preserving the firmware slot. - Reboot and reapply the desired firmware in sequence.
If the iot2050-factory-reset binary is absent (older images), manually wipe the data partition from U-Boot:
mmc erase 0xC200000 0x3E000000
reset
Edge Cases and Field Notes
- Static IP configuration persists across firmware updates in the
/etc/network/interfaces.d/eth0file. Do not rely on DHCP for permanent installations where recovery access matters. - The advanced variant (6ES7647-0BA00-1YA2) has a larger eMMC (16 GB vs. 8 GB) and a redundant firmware slot. Always update to the redundant slot first (
-rflag), validate, then activate to minimise downtime. - Power supply ripple above 5% on the 24 V input can corrupt eMMC writes mid-flash. Use a regulated supply or UPS, especially during production-floor updates.
- The IOT2050 ARDUINO header exposes the SoC GPIOs for custom sensor I/O. Firmware updates do not touch the ARDUINO pin mux, but a custom device tree overlay may need to be reapplied after switching Example Image versions.
- Industrial Edge Device connector version must match the IEM (Industrial Edge Management) server. Mismatched versions cause the activation loop documented in release notes V1.25.
FAQ
What does a solid red STAT LED on the SIMATIC IOT2050 mean?
A solid red STAT LED indicates a failed firmware flash or corrupted U-Boot boot chain on the IOT2050. The device will not boot Linux userspace. Connect via UART at 115200 8N1 to capture the boot error, then restore the default environment with env default -a; saveenv; reset and reflash a known-good Example Image from SD card or USB mass-storage.
How do I fix the python3-progress not installed error during firmware update?
This error occurs because the freshly booted Example Image has a stale apt package index. Run sudo apt update && sudo apt upgrade -y followed by sudo apt install -y python3-progress python3-serial python3-yaml. Once installed, re-run iot2050-module-firmware-update with your firmware .bin file.
Can I skip firmware versions when updating the IOT2050?
No. Skipping from V1.1.x directly to V1.5.x corrupts the U-Boot environment and causes the bootcmd_host1 not defined error. Step through V1.3.1, V1.4.1, and V1.4.4 in order, rebooting and verifying a green STAT LED at each stage. From V1.4.4 onward, the consolidated boot chain supports direct updates to V1.5.x.
Which Node-RED version ships with each IOT2050 Example Image?
Example Image V1.03 ships Node-RED 2.2.2 on Node.js 14.x. V1.04 and V1.05 ship Node-RED 3.0.2 on Node.js 16.x. The bundled versions are chosen for compatibility with the firmware update tooling; do not replace the system Node.js binary, as it breaks iot2050-module-firmware-update. Use a containerised Node-RED instead if you need a newer runtime.
How do I perform a factory reset on the IOT2050?
On Example Images V1.4.4 and newer, run sudo /usr/bin/iot2050-factory-reset and confirm. On older images, erase the data partition from U-Boot with mmc erase 0xC200000 0x3E000000 followed by reset, then reflash the Siemens-supplied factory Example Image from SD card.