Describe the issue you are experiencing
The OpenThread Border Router app repeatedly fails to start, crash-looping with a TimeoutError in migrate_otbr_settings.py during the SPINEL handshake. This happens with a network-connected Thread radio (SMLIGHT SLZB-06 on the LAN, not a USB dongle), so it doesn't appear to be strictly a USB-passthrough issue like some related reports.
May be related to #4210, #4266, #4475, #4414 — but with a network-connected radio, not USB
What type of installation are you running?
Home Assistant OS
Which operating system are you running on?
Home Assistant Operating System
Which app are you reporting an issue with?
OpenThread Border Router
What is the version of the app?
3.1.0
Steps to reproduce the issue
Not consistently reproducible on demand — occurs intermittently, but once triggered, recurs on every subsequent start attempt.
Steps already taken to rule out the radio itself as the cause
SLZB-06's own web dashboard showed it fully healthy throughout: fresh device uptime after a manual reboot, Ethernet connected via DHCP, reachable via ping.
Socket connected: No on the SLZB-06 the entire time — indicating nothing was even reaching it to attempt a handshake; the migration script times out before a real connection is established.
Restarting just the app: crash-loops immediately, identical traceback every time.
Rebooting the SLZB-06 device: came back clean, app still crash-looped afterward.
Restarting the whole Home Assistant host/VM: resolved the issue the first time it occurred, but on a later occurrence, a full VM restart did not resolve it — suggesting the failure state may persist somewhere beyond the container/network stack
System Health information
System Information
| version |
core-2026.7.4 |
| installation_type |
Home Assistant OS |
| dev |
false |
| hassio |
true |
| docker |
true |
| container_arch |
amd64 |
| user |
root |
| virtualenv |
false |
| python_version |
3.14.6 |
| os_name |
Linux |
| os_version |
6.18.39-haos |
| arch |
x86_64 |
| timezone |
Pacific/Auckland |
| config_dir |
/config |
Home Assistant Cloud
| logged_in |
false |
| can_reach_cert_server |
ok |
| can_reach_cloud_auth |
ok |
| can_reach_cloud |
ok |
HACS
| GitHub API |
ok |
| GitHub Content |
ok |
| GitHub Web |
ok |
| HACS Data |
ok |
| GitHub API Calls Remaining |
5000 |
| Installed Version |
2.0.5 |
| Stage |
running |
| Available Repositories |
3932 |
| Downloaded Repositories |
24 |
Home Assistant Supervisor
| host_os |
Home Assistant OS 18.2 |
| update_channel |
stable |
| supervisor_version |
supervisor-2026.07.5 |
| agent_version |
1.10.0 |
| docker_version |
29.6.2 |
| disk_total |
46.5 GB |
| disk_used |
27.3 GB |
| healthy |
true |
| supported |
true |
| host_connectivity |
true |
| supervisor_connectivity |
true |
| ntp_synchronized |
true |
| virtualization |
kvm |
| board |
ova |
| supervisor_api |
ok |
| version_api |
ok |
| installed_addons |
Studio Code Server (6.0.1), NGINX Home Assistant SSL proxy (4.5.1), Advanced SSH & Web Terminal (24.0.1), Samba share (12.10.0), Network UPS Tools (0.18.0), Duck DNS (2.0.0), AirSonos (5.1.1), Whisper (3.5.1), Piper (2.3.2), openWakeWord (2.1.1), Music Assistant (2.9.13), MQTT Explorer (browser-1.0.3), Mosquitto broker (7.1.0), Zigbee2MQTT (2.13.0-1), Glances (0.22.0), ESPHome Device Builder (2026.7.4), Matter Server (9.2.0) |
Dashboards
| dashboards |
9 |
| resources |
14 |
| views |
34 |
| mode |
storage |
Network Configuration
| adapters |
lo (disabled), enp0s18 (enabled, default, auto), hassio (disabled), docker0 (disabled), vethe1e96cf (disabled), vethbc47994 (disabled), vethe1c20a1 (disabled), veth86a7968 (disabled), veth66ae453 (disabled), veth15b82d1 (disabled), veth39e163e (disabled), veth95b5254 (disabled), veth52963e8 (disabled), vethc04efea (disabled) |
Recorder
| oldest_recorder_run |
August 13, 2026 at 7:03 AM |
| current_recorder_run |
August 16, 2026 at 7:19 PM |
| estimated_db_size |
419.07 MiB |
| database_engine |
sqlite |
| database_version |
3.53.2 |
Anything in the Supervisor logs that might be useful for us?
Anything in the app logs that might be useful for us?
[INFO] Migrating OTBR settings if needed...
... Sending frame SpinelFrame(... command_id=<CommandID.RESET: 1> ...)
... Device did not respond to reset, continuing
... Sending frame SpinelFrame(... command_id=<CommandID.PROP_VALUE_GET: 2> ...)
... Failed to send SpinelFrame(...), trying again in 0.10s (attempt 1 of 3)
... Failed to send SpinelFrame(...), trying again in 0.10s (attempt 2 of 3)
... Failed to send SpinelFrame(...), trying again in 0.10s (attempt 3 of 3)
Traceback (most recent call last):
File ".../universal_silabs_flasher/spinel.py", line 260, in send_frame
return await asyncio.shield(future)
asyncio.exceptions.CancelledError
...
File "/usr/local/bin/migrate_otbr_settings.py", line 156, in main
hwaddr = await get_adapter_hardware_addr(...)
File "/usr/local/bin/migrate_otbr_settings.py", line 103, in get_adapter_hardware_addr
rsp = await protocol.send_command(...)
File ".../universal_silabs_flasher/spinel.py", line 292, in send_command
return await self.send_frame(frame, **kwargs)
TimeoutError
[WARNING] otbr-agent exited with code 1 (by signal 0).
s6-rc: warning: unable to start service otbr-agent: command exited 1
fatal: stopping the container.
Additional information
Add-on/app version: 3.1.0
Home Assistant OS: 18.2
Home Assistant Core: 2026.7.4
Supervisor: 2026.07.5
Host: Home Assistant OS running as a Proxmox VM
Thread radio: SMLIGHT SLZB-06, connected via LAN using the app's network_device setting (:6638), not USB
Expected behavior
A transient SPINEL communication failure during the settings-migration step shouldn't be treated as fatal for the entire app/container — at minimum, it should retry with backoff or fail gracefully into a state that a normal restart can recover from, rather than requiring destructive workarounds (host reboot) that aren't always effective.
Workaround used
Migrated the affected Matter/Thread devices to Zigbee2MQTT instead, as there was no reliable in-app recovery path.
Describe the issue you are experiencing
The OpenThread Border Router app repeatedly fails to start, crash-looping with a TimeoutError in migrate_otbr_settings.py during the SPINEL handshake. This happens with a network-connected Thread radio (SMLIGHT SLZB-06 on the LAN, not a USB dongle), so it doesn't appear to be strictly a USB-passthrough issue like some related reports.
May be related to #4210, #4266, #4475, #4414 — but with a network-connected radio, not USB
What type of installation are you running?
Home Assistant OS
Which operating system are you running on?
Home Assistant Operating System
Which app are you reporting an issue with?
OpenThread Border Router
What is the version of the app?
3.1.0
Steps to reproduce the issue
Not consistently reproducible on demand — occurs intermittently, but once triggered, recurs on every subsequent start attempt.
Steps already taken to rule out the radio itself as the cause
SLZB-06's own web dashboard showed it fully healthy throughout: fresh device uptime after a manual reboot, Ethernet connected via DHCP, reachable via ping.
Socket connected: No on the SLZB-06 the entire time — indicating nothing was even reaching it to attempt a handshake; the migration script times out before a real connection is established.
Restarting just the app: crash-loops immediately, identical traceback every time.
Rebooting the SLZB-06 device: came back clean, app still crash-looped afterward.
Restarting the whole Home Assistant host/VM: resolved the issue the first time it occurred, but on a later occurrence, a full VM restart did not resolve it — suggesting the failure state may persist somewhere beyond the container/network stack
System Health information
System Information
Home Assistant Cloud
HACS
Home Assistant Supervisor
Dashboards
Network Configuration
Recorder
Anything in the Supervisor logs that might be useful for us?
Anything in the app logs that might be useful for us?
[INFO] Migrating OTBR settings if needed... ... Sending frame SpinelFrame(... command_id=<CommandID.RESET: 1> ...) ... Device did not respond to reset, continuing ... Sending frame SpinelFrame(... command_id=<CommandID.PROP_VALUE_GET: 2> ...) ... Failed to send SpinelFrame(...), trying again in 0.10s (attempt 1 of 3) ... Failed to send SpinelFrame(...), trying again in 0.10s (attempt 2 of 3) ... Failed to send SpinelFrame(...), trying again in 0.10s (attempt 3 of 3) Traceback (most recent call last): File ".../universal_silabs_flasher/spinel.py", line 260, in send_frame return await asyncio.shield(future) asyncio.exceptions.CancelledError ... File "/usr/local/bin/migrate_otbr_settings.py", line 156, in main hwaddr = await get_adapter_hardware_addr(...) File "/usr/local/bin/migrate_otbr_settings.py", line 103, in get_adapter_hardware_addr rsp = await protocol.send_command(...) File ".../universal_silabs_flasher/spinel.py", line 292, in send_command return await self.send_frame(frame, **kwargs) TimeoutError [WARNING] otbr-agent exited with code 1 (by signal 0). s6-rc: warning: unable to start service otbr-agent: command exited 1 fatal: stopping the container.Additional information
Add-on/app version: 3.1.0
Home Assistant OS: 18.2
Home Assistant Core: 2026.7.4
Supervisor: 2026.07.5
Host: Home Assistant OS running as a Proxmox VM
Thread radio: SMLIGHT SLZB-06, connected via LAN using the app's network_device setting (:6638), not USB
Expected behavior
A transient SPINEL communication failure during the settings-migration step shouldn't be treated as fatal for the entire app/container — at minimum, it should retry with backoff or fail gracefully into a state that a normal restart can recover from, rather than requiring destructive workarounds (host reboot) that aren't always effective.
Workaround used
Migrated the affected Matter/Thread devices to Zigbee2MQTT instead, as there was no reliable in-app recovery path.