Smart Bulb Firmware Update Stuck Home Assistant: Common Issues & Solutions
A smart bulb firmware update stuck in Home Assistant usually means the OTA (over‑the‑air) process started but never completed due to a dropped connection, coordinator limitation, or incompatible update channel. Open the bulb’s device page in Home Assistant: if it shows “OTA in progress” and hasn’t budged in 15+ minutes, the update is stalled rather than slow. Your next move depends on which integration the bulb is paired to and what network conditions look like – a few quick checks will point you to the right fix.
Run through these quick checks first
Before digging into specific fixes, verify these five conditions. Each one is a simple pass/fail check that can save you an hour of wasted effort.
- Check the update status – In Home Assistant, go to Settings → Devices & Services → Devices, select the bulb, and look at the firmware update field. If it shows “0%” and hasn’t moved, the connection may be too weak. If it shows a partial percentage (e.g., 42%), the stalled state is likely a packet-loss issue.
- Is the bulb still responsive? – Toggle the bulb on/off from HA. If it doesn’t respond, the update may have bricked the firmware. Power‑cycle it at the wall switch before proceeding.
- What protocol is the bulb using? – Check the integration (ZHA, Zigbee2MQTT, ESPHome, etc.). OTA handling differs drastically between Zigbee and Wi‑Fi bulbs.
- How old is your Zigbee coordinator? – If you’re using a CC2531 stick, it frequently drops packets on updates over 100 KB. If you have a CC2652‑based coordinator (e.g., Sonoff ZBDongle-P), it’s less likely the bottleneck.
- Is the bulb near a Zigbee router? – A bulb more than two rooms away from the coordinator, or behind a concrete wall, will struggle to hold a stable OTA session. Look at the network map.
If you answered “stalled” to the first check and “yes” to an old coordinator, jump straight to the coordinator hardware section below — that’s the most common root cause.
Match your fix to your integration
Each Home Assistant integration handles OTA firmware updates differently, and a fix that works for Zigbee2MQTT won’t help a Wi‑Fi bulb. Identify your integration first.
Zigbee: ZHA, Zigbee2MQTT, or deCONZ
- ZHA – Go to Settings → Devices → Devices, select the bulb, and click the firmware update button if available. If it’s stuck, call the service `zha:otaupdate` with `entityid: your_bulb` and `command: refresh`. This resumes a stalled transfer. If that fails, try `command: cancel` then re‑initiate.
- Zigbee2MQTT – Open the Zigbee2MQTT frontend (usually port 8080), find the bulb, and click Update. If the progress bar sits at 0% for more than 5 minutes, your coordinator may be dropping packets. Check the log for “OTA timeout” errors.
- deCONZ – Updates are triggered from the Phoscon app or deCONZ GUI. A stuck update usually requires restarting the `deconz` add‑on, then re‑fetching the update file. If the issue persists, try updating via another coordinator – deCONZ’s Conbee II can be slower than a dedicated Z‑Stack stick.
Branch decision: If you’re using ZHA or Zigbee2MQTT and the update stalls repeatedly at 0% on multiple bulbs, don’t keep re‑trying the same fix — upgrade your coordinator. Replacing a CC2531 with a CC2652‑based stick (like the Sonoff ZBDongle-P) often resolves the problem immediately. This is the key decision criterion: if the coordinator is old and you’ve seen failures on more than one bulb, replace the coordinator before replacing any bulb.
Matter / Thread
Matter bulbs don’t do traditional OTA through Home Assistant. Firmware updates come from the manufacturer’s app (e.g., Philips Hue, Nanoleaf). If you see a “firmware update stuck” in HA, the bulb likely doesn’t support OTA via the Matter bridge. Verify that the update is actually being handled by your Matter controller (Apple Home hub, Google Nest Hub, etc.), not HA. Power‑cycle the controller and check the manufacturer app — the “stuck” status in HA is often a display glitch.
Wi‑Fi: ESPHome, Tasmota, Tuya
- ESPHome – Use the ESPHome dashboard and send an OTA update with `safe_mode: true`. If it stalls, the ESP32/8266 may have insufficient flash space. Try a wired serial update via USB.
- Tasmota – Open the web UI, go to Firmware Upgrade, and upload the binary. A stuck update usually means the file is too large for the flash. Use a minimal build first, then upgrade to the full version.
- Tuya Local / LocalTuya – Cloud‑dependent bulbs rarely allow OTA through HA. A stuck update indicates the update was initiated from the Smart Life app and never completed. Power‑cycle the bulb and retry from the app; if it still stalls, contact the manufacturer — Tuya bulbs often block third‑party OTA.
Check your coordinator and network environment
A healthy radio environment is essential for OTA updates, which send large payloads over the mesh. Verify these three conditions before spending time on individual bulb fixes.
Zigbee channel interference and signal strength
Use Home Assistant’s Zigbee Network Map (Zigbee2MQTT) or the ZHA Network card to check the bulb’s LQI (Link Quality Indicator). If the LQI is below 80, update packets are likely being dropped. Common causes:
- Wi‑Fi overlapping on Zigbee channels 11, 15, 20, or 25. Use a Wi‑Fi analyzer app to find a clear channel — channel 25 is often less congested. Changing the Zigbee channel requires re‑pairing all devices, so do this only if you’re seeing widespread connectivity issues.
- Too many devices on the same coordinator. OTA updates are CPU‑intensive; if your coordinator is also handling 40+ other devices, the update may time out. Temporarily remove non‑critical devices to free up bandwidth.
Coordinator hardware limitations
| Coordinator | Suitable for OTA? | Common issue |
|---|---|---|
| CC2531 (USB stick) | ❌ Poor | Drops packets on updates over 100 KB; frequent timeouts |
| CC2652 (Z‑Stack 3.x, e.g., Sonoff ZBDongle-P) | ✅ Good | Reliable; handles multi‑bulb OTA without issues |
| Conbee II | ⚠️ Fair | OTA supported but slow; single‑bulb updates only |
| SkyConnect | ✅ Good | No common OTA issues reported |
If you’re stuck on a CC2531, upgrade to a CC2652‑based coordinator. The improvement is dramatic — updates that previously stalled at 10% will complete in under 10 minutes.
Router‑bulb proximity
A bulb far from the coordinator may lose packets during long OTA sessions. Place a Zigbee router device (a mains‑powered smart plug) close to the bulb to strengthen the link. You can check routing paths in the network map — if the bulb is routing through five hops, the update is more likely to fail.
Step‑by‑step fix sequence
Follow these steps in order. After each, check if the update resumed or the progress bar moved.
1. Restart the update from HA – Use the integration’s resume/refresh function (see integration‑specific instructions above). If the bulb was at 30% and restarts from 0%, the previous session timed out — proceed to step 2.
2. Power‑cycle the bulb – Turn it off at the wall switch for 10 seconds, then back on. This clears a hung update state. Check the device page again — many bulbs will automatically retry the update after power‑cycle.
3. Re‑pair the bulb – Remove the bulb from the integration, factory reset it (typically 5 on/off cycles in quick succession), and add it back. Initiate the update again. This bypasses any corrupted state in the bulb’s memory.
4. Update the coordinator firmware – Use a tool like Z‑Flash (for CC2531) or the manufacturer’s updater (for Sonoff sticks). Coordinators running outdated firmware may not handle newer OTA cluster commands.
5. Move the bulb to a better router – Temporarily place a Zigbee smart plug next to the bulb to improve the link. Re‑initiate the update.
6. Use a dedicated OTA coordinator – For very large updates (over 500 KB), pair the bulb with a CC2652‑based coordinator just for the update, then switch it back. This is extreme, but works when nothing else does.
Checkpoint: After each step, wait 10 minutes and check the bulb’s firmware status. If it still shows “in progress” with no movement, move to the next step.
When to stop troubleshooting and replace the bulb
If the update fails after all the above, the bulb’s flash memory may be corrupted or the firmware image is simply incompatible. Stop DIY troubleshooting when you see these concrete signs:
- The update stalls at the exact same percentage every time (e.g., 42%) — that’s a corrupted image, not a network issue.
- The bulb becomes unresponsive after a failed update, even after a factory reset. The flash is bricked.
- The manufacturer no longer supports OTA for that bulb model (check the support page). Some older bulbs have no update path.
A common failure mode is trying to update multiple bulbs simultaneously over the same coordinator. Zigbee OTA is a heavy task — each update can take 5–15 minutes. If you initiate updates on 3 or 4 bulbs at once, the coordinator will queue them, time out repeatedly, and leave all bulbs in a stuck state. Always update one bulb at a time, and wait for it to finish before starting the next.
If the bulb is under warranty and the update never worked, contact the manufacturer. Otherwise, consider replacing it — a bricked bulb can’t be fixed at home.
Explore This Topic
- Back to Smart Home Troubleshooting
- Back to Firmware & Update Help
Related guides in this cluster:
- Smart Doorbell Firmware Update Stuck Home Assistant: Common Issues & Solutions
- Smart Light Firmware Update Failed Home Assistant: Common Issues & Solutions
- Smart Plug Firmware Update Stuck Google Home: Common Issues & Solutions
Smart home integrator and troubleshooting specialist with 8+ years of hands-on experience across Zigbee, Z-Wave, Wi-Fi, Matter, and Thread protocols. Works daily with Home Assistant, Alexa, Google Home, and Apple HomeKit ecosystems. Believes that no smart home problem should require a factory reset as the first step.
