Troubleshooting IOT2050 Firmware Update Failures and Red STAT LED

David Krause9 min read
Other TopicSiemensTroubleshooting
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

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:

  1. 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 defined because the boot script references variables only present in newer environments.
  2. Missing runtime dependencies – the firmware update tool requires python3-progress and related apt packages. On a freshly flashed image that has never run apt update, the package index is stale and the dependency resolution fails mid-update, leaving the filesystem in an inconsistent state.
  3. 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.
Critical: Never power-cycle the IOT2050 during the green blinking phase of a firmware update. The amber blinking phase (during Example Image application) is safe to interrupt only if the device is reachable over UART for a manual U-Boot recovery.

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 is 1=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 .bin file.
  • Local TFTP or HTTP server if you intend to reflash over the network (U-Boot supports tftpboot on the eth0 management port).
  • Latest meta-iot2050 release artifacts, which bundle the iot2050-module-firmware-update tool that supersedes the legacy flash procedure.

Step-by-Step Recovery Procedure

Step 1 – Capture U-Boot Diagnostics Over UART

  1. Connect the USB-UART cable before powering the IOT2050.
  2. Apply 24 V DC to the X1 connector. Watch the console for U-Boot banner and halt-on-error output.
  3. Press any key within the 3-second autoboot window to drop into the U-Boot shell.
  4. Record the full boot log; the key indicators to capture are: U-Boot 20xx.xx version string, environment block CRC status (env: CRC OK or env: CRC bad), and any Unknown command / not defined messages.

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
Always validate the SHA-256 hash printed in the release notes against the downloaded .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

  1. Write the Example Image to a microSD card using balenaEtcher or dd.
  2. 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.
  3. 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:

  1. V1.3.1 (verify boot, STAT LED green)
  2. V1.4.1
  3. V1.4.4 (consolidation release, recommended baseline)
  4. 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

  1. STAT LED returns to solid green within 90 seconds of power-up.
  2. Serial console shows clean systemd boot sequence with no FAILED lines.
  3. Ethernet management port obtains an IP via DHCP (default hostname iot2050, mDNS iot2050.local).
  4. sudo iot2050-module-firmware-update -c reports the target firmware version and slot status as active.
  5. Web UI accessible at https://<ip>:8443 (Industrial Edge Device portal) or Node-RED at http://<ip>:1880/ui.
  6. journalctl -u iot2050-module-firmware-update --no-pager shows 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:

  1. Log in as admin (default password printed on the device label).
  2. Run sudo /usr/bin/iot2050-factory-reset (available in V1.4.4 and later Example Images).
  3. Confirm with y; the tool reformats the user data partition while preserving the firmware slot.
  4. 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/eth0 file. 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 (-r flag), 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.

Back to blog