Skip to content

OTBR app crash-loops on migrate_otbr_settings.py SPINEL timeout with network-connected radio (SLZB-06); full VM restart not always sufficient to recover #4784

Description

@MaranelloAH

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions