I want to share the full troubleshooting path and final fix for a Matter-over-Thread commissioning issue with an Eve Thermo (Gen 5) on Home Assistant OS running in a VM on a Ugreen NAS.
This might help if your Thread device seems to join the Thread network, but Matter commissioning never really starts or stays stuck at “Checking Thread connection”.
Setup
Home Assistant OS 17.2 in a VM
Home Assistant Core 2026.4.3
OpenThread Border Router add-on 2.16.7
Matter Server
Home Assistant Connect ZBT-2
Ugreen NAS as VM host
Network interface in HA VM: enp0s3
Device: Eve Thermo (5th gen) via Matter over Thread
Symptom
The Eve Thermo would appear to join Thread, but Matter commissioning never actually started.
Typical behavior:
Home Assistant UI stayed around “Checking Thread connection”
OTBR looked mostly alive
Thread seemed to work
but Matter never moved into real commissioning
What I checked
1) OTBR startup and radio health
First I verified that OTBR itself was not completely broken:
ZBT-2 was detected correctly
OTBR started normally
OTBR REST API came up
IPv4 and IPv6 mDNS sockets opened
OTBR later became Thread leader / Border Agent
That told me the radio and OTBR add-on were basically alive, so I should not jump straight to “the dongle is faulty”.
2) Thread network in Home Assistant
I checked the Thread integration and made sure:
the correct Thread network was present
it was marked as the preferred network
Home Assistant had the credentials/dataset for that network
credentials had been sent to the phone as needed
This is important because Home Assistant can detect Thread border routers or Thread networks without necessarily having the usable dataset needed to add new devices. HA must actually know the credentials, not just “see” the network.
3) Device reset
For Eve Thermo (5th generation), I used the official reset procedure:
open battery compartment
press and hold RESET
keep holding until “00” blinks
That gives a clean start before retrying commissioning.
4) Reachability checks with ping6
I also checked what can actually be reached over IPv6, because Thread looking “alive” is not enough by itself.
Useful checks from the HA side:
Shell
ip -6 addr
ip -6 route
That tells you whether:
the HA host has IPv6 addresses on its LAN interface
the Thread prefix / routes exist
the box has a sane IPv6 path
Then test actual reachability:
Shell
ping -6
ping -6
ping -6
If you test an IPv6 link-local address (fe80::), remember that it must be scoped to an interface. A plain ping6 fe80::... can fail even if the device is reachable; you need to specify the interface, e.g. -I enp0s3 or %enp0s3.
Example:
Shell
ping -6 -I enp0s3 fe80:5678:abcd:ef01
This turned out to be a very useful distinction:
if HA can reach the Thread/LAN IPv6 path but the phone cannot, suspect Wi‑Fi isolation / guest network
if HA cannot reach what it should, suspect bridge / IPv6 / OTBR host setup
5) FRITZ!Box settings to check
This part is easy to miss.
A. Do not use the FRITZ!Box guest WLAN for commissioning
The FRITZ!Box guest network is intentionally separated from the home network. Devices in the guest network cannot access devices in the home network, which makes it the wrong place for Matter-over-Thread commissioning if HA is in the normal LAN.
So for testing:
phone should be on the normal home Wi‑Fi
not on guest Wi‑Fi
and ideally on the same local segment as HA
B. Check client/AP isolation
On FRITZ!Box, make sure WLAN devices are allowed to communicate with each other. The relevant option is:
If AP/client isolation is active, devices on the same Wi‑Fi may not be able to talk to each other properly, which can break local commissioning workflows.
In practical terms:
phone and HA must be able to communicate locally
phone must not be stuck in an isolated guest WLAN
if your phone can browse the internet but cannot reach local devices, this is a strong clue
6) Ugreen NAS VM network settings
This was also important.
On Ugreen NAS, the VM should use bridged networking, not an isolated NAT-only style setup.
The documented Ugreen path is:
Control Panel → Network Connection
Network Bridging → Virtual Bridging
enable Virtual Network Bridging
select the LAN port you actually use
apply the settings
Then in the VM app:
Virtual Machine → Manage → Network
set the virtual subnet(s) such as vnet-bridge0 / vnet-bridge1
to Bridged Mode – LinuxBridge
Also important: after changing bridge mode or VM network mode, the VM should be fully powered off and started again. A simple in-guest reboot is not always enough.
So if you change VM networking:
shut the VM down completely
start it again
then retest
7) Promiscuous mode / spoofing notes on the VM host
This was not the final fix in my case, but it is worth mentioning because VM hosts can silently block the kind of traffic needed for low-level networking scenarios.
In general, hypervisors only deliver frames to a VM that are explicitly meant for that VM’s virtual NIC. Promiscuous mode changes that behavior so the VM/port group can receive all traffic on the virtual switch / port group. It is disabled by default on most virtualization platforms.
If your Ugreen VM / bridge / virtual switch setup exposes security options such as:
Promiscuous mode
MAC spoofing
forged transmits
anti-spoofing / address filtering
then for troubleshooting it is worth allowing them temporarily for the Home Assistant VM, especially if you suspect multicast, RA, or unexpected MAC/address handling is being filtered.
At minimum, make sure the HA VM is on a real bridged interface (LinuxBridge on Ugreen) and not on an isolated or incompatible virtual network mode.
The key clue
In my OTBR startup log I had this warning:
Plain Text
WARNING: IPv6 routing/forwarding is not enabled! Make sure the Home Assistant host has IPv6 forwarding enabled.
Weitere Zeilen anzeigen
That turned out to be the main clue.
Root cause
The actual problem was:
IPv6 was not enabled correctly for the HAOS Docker environment running OTBR / Matter on the HA VM.
So the setup looked like this:
Thread could look partially alive
OTBR could still boot
but the full end-to-end IPv6 path required for Matter-over-Thread commissioning was broken
The fix
From the Home Assistant CLI (not inside the add-on container), I ran:
Shell
ha docker options --enable-ipv6=true
Weitere Zeilen anzeigen
Then I rebooted Home Assistant / restarted the VM.
That was the fix.
Result
After enabling IPv6 for HAOS Docker:
the OTBR startup warning disappeared
OTBR came up cleanly
Matter-over-Thread commissioning worked
the Eve Thermo could finally be paired successfully
What I would recommend others check first
If your Matter-over-Thread device seems to join Thread but commissioning never finishes, I would check in this order:
1. OTBR startup log
Look for:
Plain Text
WARNING: IPv6 routing/forwarding is not enabled!
Weitere Zeilen anzeigen
If you see that, fix it first.
2. HAOS Docker IPv6
Run:
Shell
ha docker options --enable-ipv6=true
Weitere Zeilen anzeigen
Then reboot.
3. Ugreen VM network mode
Make sure Ugreen NAS is using:
Virtual Network Bridging
VM network = Bridged Mode – LinuxBridge
4. FRITZ!Box WLAN
Make sure:
phone is not on guest Wi‑Fi
client/AP isolation is not blocking local communication
normal Wi‑Fi clients are allowed to communicate with each other
5. IPv6 reachability tests
Check:
ip -6 addr
ip -6 route
ping -6 to known LAN IPv6 addresses
ping -6 to Thread device ULA if known
if using fe80::, include the interface scope (-I enp0s3 or %enp0s3)
6. Thread dataset / preferred network
Make sure Home Assistant has the actual Thread credentials/dataset and the correct preferred network.
7. Clean device reset
For Eve Thermo 5th gen:
hold RESET until “00” blinks
Short version
In my case, the real issue was not Eve, not ZBT-2, and not OTBR itself.
It was an IPv6 problem in the HAOS Docker environment on a Home Assistant VM running on Ugreen NAS.
The fix was:
Shell
ha docker options --enable-ipv6=true
After rebooting, Matter-over-Thread commissioning worked.
Also worth checking:
Ugreen VM is really in bridged LinuxBridge mode
FRITZ!Box guest Wi‑Fi is not used for commissioning
Sorry idk, the only workaround i know is to get a cheap but good Bluetooth-Dongle like an Asus BT500 and commission devices directly to the Thread Network without relying on a working Phone-HA-Thread Chain.
Once you done that first time, you’ll never want to return to that QR-Code mess. !-)
Thanks for your effort to share your results with the whole community!
The latest HA updates made it really painful to connect devices with Matter/thread.
Check the HA UI->Settings->System->Network->IPv6 and make sure it is set to “auto”.
If it is, then for some odd reason, your system is not accepting Router Advertisements from the OTBR (or some other IPv6 router sending RAs). HAOS comes with this enabled.
You should be seeing a route something like: fd12:1e52:b729:1::/64 via fe80::d748:345d:bd81:54ee proto ra metric 105 pref medium. Note the ra indicator.
[core-ssh ~]$ ip -6 addr show dev eth0
2: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 state UP
inet6 fd0c:ac1e:2100::8/48 scope global flags 02
valid_lft forever preferred_lft forever
inet6 fe80::acd2:acff:fe1c:f498/64 scope link
valid_lft forever preferred_lft forever
[core-ssh ~]$ ip -6 route show
fd0c:ac1e:2100::/48 dev eth0 metric 256
fe80::/64 dev eth0 metric 256
default via fd0c:ac1e:2100::1 dev eth0 metric 1024
maddr won’t produce any output. I may be doing something wrong…
IPv6 and mDNS discovery are working correctly. Thread services are advertised and visible on the LAN. The issue occurs after discovery, during Matter DNS‑SD resolution and proxying.
---->>>>> HAOS shows only a single ULA IPv6 address with no IPv6 gateway, which is sufficient for multicast browsing but not always for the unicast DNS‑SD follow‑up traffic required by Matter commissioning.
This leads to OTBR/Matter ResponseTimeout errors. The problem is not multicast, VLANs, or Thread itself, but an incomplete IPv6 routing context for OTBR↔Matter communication.
I guess you need to force fortigate to give correct adresses (seems borderouter sends RA and gives out thread adresses… did you activate something like " advertise mesh prefix to LAN" on the borderrouter?)
Set Fortigate to give IPv6 adresses (example fd20:1234:abcd::1/64) NOT! fd66…
RA Mode enalbed on fortigate
retart HA cleanly and resend “ha network info” there should be a gateway and a correct IPv6 adress (something with fd20… now)
Has anybody here the latest Core Update (2026.4.x) running? Does it fix (under the hood, or so?) anything in regards to Matter/Thread/IPv6 forwarding? I don’t dare to update from 2026.3.4 because my Thread network is running okayish so far.
[core-ssh ~]$ ip -6 addr show eth0
2: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 state UP
inet6 fd0c:ac1e:2100::8/48 scope global flags 02
valid_lft forever preferred_lft forever
inet6 fe80::c55:ddff:fe0b:2865/64 scope link
valid_lft forever preferred_lft forever
[core-ssh ~]$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 state UP
inet6 fd0c:ac1e:2100::8/48 scope global flags 02
valid_lft forever preferred_lft forever
inet6 fe80::c55:ddff:fe0b:2865/64 scope link
valid_lft forever preferred_lft forever
[core-ssh ~]$ ip -6 route
fd0c:ac1e:2100::/48 dev eth0 metric 256
fe80::/64 dev eth0 metric 256
and for the record, this is the current configuration on my Fortigate:
config ipv6
set ip6-address fd20:1234:abcd::1/64
set ip6-send-adv enable
set ip6-other-flag enable
config ip6-prefix-list
edit fd20:1234:abcd::/64
set autonomous-flag enable
set onlink-flag enable
set valid-life-time 2592000
set preferred-life-time 86400
next
end
end
I wonder where inet6 fd0c:ac1e:2100::8/48 scope global flags 02comes from…
This is the output that I see on Matter add-on:
s6-rc: info: service matter-server successfully stopped
s6-rc: info: service banner: stopping
s6-rc: info: service banner successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service banner: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
-----------------------------------------------------------
Add-on: Matter Server
Matter WebSocket Server for Home Assistant Matter support.
-----------------------------------------------------------
Add-on version: 8.4.0
You are running the latest version of this add-on.
System: Home Assistant OS 17.2 (aarch64 / raspberrypi4-64)
Home Assistant Core: 2026.4.4
Home Assistant Supervisor: 2026.04.0
-----------------------------------------------------------
Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
s6-rc: info: service banner successfully started
s6-rc: info: service matter-server: starting
s6-rc: info: service matter-server successfully started
s6-rc: info: service legacy-services: starting
[01:22:06] INFO: Starting Matter Server...
s6-rc: info: service legacy-services successfully started
[01:22:06] INFO: Using Python Matter Server
[01:22:08] INFO: Using 'end0' as primary network interface.
[01:22:08] INFO: Successfully send discovery information to Home Assistant.
2026-04-26 01:22:14.855 (MainThread) INFO [matter_server.server.stack] Initializing CHIP/Matter Logging...
2026-04-26 01:22:14.856 (MainThread) INFO [matter_server.server.stack] Initializing CHIP/Matter Controller Stack...
[1777159334.929561][117:117] CHIP:CTL: Setting attestation nonce to random value
[1777159334.930107][117:117] CHIP:CTL: Setting CSR nonce to random value
[1777159334.931816][117:117] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_kvs
[1777159334.942113][117:117] CHIP:DL: Wrote settings to /tmp/chip_kvs
[1777159334.942672][117:117] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /data/chip_factory.ini
[1777159334.943009][117:117] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /data/chip_config.ini
[1777159334.943139][117:117] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /data/chip_counters.ini
[1777159334.950113][117:117] CHIP:DL: Wrote settings to /data/chip_counters.ini
[1777159334.950200][117:117] CHIP:DL: NVS set: chip-counters/reboot-count = 25 (0x19)
[1777159334.951329][117:117] CHIP:DL: Got Ethernet interface: end0
[1777159334.952108][117:117] CHIP:DL: Found the primary Ethernet interface:end0
[1777159334.952859][117:117] CHIP:DL: Got WiFi interface: wlan0
[1777159334.952937][117:117] CHIP:DL: Failed to reset WiFi statistic counts
[1777159334.952956][117:117] CHIP:PAF: WiFiPAF: WiFiPAFLayer::Init()
2026-04-26 01:22:14.954 (MainThread) INFO [chip.storage] Initializing persistent storage from file: /data/chip.json
2026-04-26 01:22:14.954 (MainThread) INFO [chip.storage] Loading configuration from /data/chip.json...
2026-04-26 01:22:15.232 (MainThread) INFO [chip.CertificateAuthority] Loading certificate authorities from storage...
2026-04-26 01:22:15.233 (MainThread) INFO [chip.CertificateAuthority] New CertificateAuthority at index 1
2026-04-26 01:22:15.238 (MainThread) INFO [chip.CertificateAuthority] Loading fabric admins from storage...
2026-04-26 01:22:15.238 (MainThread) INFO [chip.FabricAdmin] New FabricAdmin: FabricId: 0x0000000000000002, VendorId = 0x134B
2026-04-26 01:22:15.239 (MainThread) INFO [matter_server.server.stack] CHIP Controller Stack initialized.
2026-04-26 01:22:15.240 (MainThread) INFO [matter_server.server.server] Matter Server initialized
2026-04-26 01:22:15.240 (MainThread) INFO [matter_server.server.server] Using 'end0' as primary interface (for link-local addresses)
2026-04-26 01:22:15.242 (MainThread) INFO [matter_server.server.server] Starting the Matter Server...
2026-04-26 01:22:15.253 (MainThread) INFO [matter_server.server.helpers.paa_certificates] Skip fetching certificates (already fetched within the last 24h).
2026-04-26 01:22:15.253 (MainThread) INFO [chip.FabricAdmin] Allocating new controller with CaIndex: 1, FabricId: 0x0000000000000002, NodeId: 0x000000000001B669, CatTags: []
2026-04-26 01:22:15.438 (Dummy-2) CHIP_ERROR [chip.native.DIS] Failed to advertise records: src/inet/UDPEndPointImplSockets.cpp:417: OS Error 0x02000065: Network is unreachable
2026-04-26 01:22:15.454 (Dummy-2) CHIP_ERROR [chip.native.DL] Long dispatch time: 198 ms, for event type 2
2026-04-26 01:22:15.479 (MainThread) INFO [matter_server.server.vendor_info] Loading vendor info from storage.
2026-04-26 01:22:15.501 (MainThread) INFO [matter_server.server.vendor_info] Loaded 419 vendors from storage.
2026-04-26 01:22:15.502 (MainThread) INFO [matter_server.server.vendor_info] Fetching the latest vendor info from DCL.
2026-04-26 01:22:15.900 (MainThread) INFO [matter_server.server.vendor_info] Fetched 418 vendors from DCL.
2026-04-26 01:22:15.901 (MainThread) INFO [matter_server.server.vendor_info] Saving vendor info to storage.
2026-04-26 01:22:15.924 (MainThread) INFO [matter_server.server.device_controller] Loaded 1 nodes from stored configuration
2026-04-26 01:22:15.938 (MainThread) INFO [matter_server.server.server] Matter Server successfully initialized.
2026-04-26 01:22:16.649 (MainThread) INFO [matter_server.server.device_controller.mdns] <Node:3> Discovered on mDNS
2026-04-26 01:22:16.650 (MainThread) INFO [matter_server.server.device_controller] <Node:3> Setting-up node...
2026-04-26 01:22:17.156 (MainThread) INFO [matter_server.server.device_controller.mdns] <Node:3> Discovered on mDNS
2026-04-26 01:22:18.159 (MainThread) INFO [matter_server.server.device_controller.mdns] <Node:3> Discovered on mDNS
2026-04-26 01:22:19.503 (MainThread) INFO [matter_server.server.device_controller] <Node:3> Setting up attributes and events subscription.
2026-04-26 01:22:22.889 (MainThread) INFO [matter_server.server.device_controller] <Node:3> Subscription succeeded with report interval [0, 900]
and this is the output that I see on the OTBR log:
[01:01:53] INFO: otbr-agent exited with code 0 (by signal 0).
Chain OTBR_FORWARD_INGRESS (0 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
otbr-ingress-deny-src
otbr-ingress-deny-src-swap
otbr-ingress-allow-dst
otbr-ingress-allow-dst-swap
Chain OTBR_FORWARD_EGRESS (0 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
Chain OTBR_FORWARD_NAT64 (0 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 mark match 0x1001
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
[01:01:53] INFO: OTBR firewall/NAT64 rules teardown completed.
s6-rc: info: service otbr-agent successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service banner: stopping
s6-rc: info: service banner successfully stopped
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: warning: service s6rc-oneshot-runner is marked as essential, not stopping it
[01:03:31] INFO: Beta mode enabled, using OpenThread built-in mDNS.
[01:03:31] INFO: Web UI and REST API port are exposed, starting otbr-web.
/run/s6/basedir/scripts/rc.init: info: hook /etc/s6-overlay/scripts/enable-check.sh exited 0
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service banner: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
-----------------------------------------------------------
Add-on: OpenThread Border Router
OpenThread Border Router add-on
-----------------------------------------------------------
Add-on version: 2.16.7
You are running the latest version of this add-on.
System: Home Assistant OS 17.2 (aarch64 / raspberrypi4-64)
Home Assistant Core: 2026.4.4
Home Assistant Supervisor: 2026.04.0
-----------------------------------------------------------
Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
s6-rc: info: service banner successfully started
s6-rc: info: service otbr-agent: starting
[01:03:32] INFO: Migrating OTBR settings if needed...
2026-04-26 01:03:34 homeassistant asyncio[230] DEBUG Using selector: EpollSelector
2026-04-26 01:03:34 homeassistant zigpy.serial[230] DEBUG Opening a serial connection to '/dev/serial/by-id/usb-Itead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_V2_8a14446a09f4ef11be82c41b6d9880ab-if00-port0' (baudrate=460800, xonxoff=False, rtscts=False)
2026-04-26 01:03:34 homeassistant serialx.platforms.serial_posix[230] DEBUG Configuring serial port '/dev/serial/by-id/usb-Itead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_V2_8a14446a09f4ef11be82c41b6d9880ab-if00-port0'
2026-04-26 01:03:34 homeassistant serialx.platforms.serial_posix[230] DEBUG Configuring serial port: [0, 0, 3248, 0, 4100, 4100, [b'\x03', b'\x1c', b'\x7f', b'\x15', b'\x04', 0, 0, b'\x00', b'\x11', b'\x13', b'\x1a', b'\x00', b'\x12', b'\x0f', b'\x17', b'\x16', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00']]
2026-04-26 01:03:34 homeassistant serialx.platforms.serial_posix[230] DEBUG Setting low latency mode: True
2026-04-26 01:03:34 homeassistant serialx.platforms.serial_posix[230] DEBUG Setting modem pins: ModemPins[!dtr !rts]
2026-04-26 01:03:34 homeassistant serialx.platforms.serial_posix[230] DEBUG TIOCMBIC: 0x00000006
2026-04-26 01:03:34 homeassistant zigpy.serial[230] DEBUG Connection made: <serialx.platforms.serial_posix.PosixSerialTransport object at 0x7f87854710>
2026-04-26 01:03:34 homeassistant universal_silabs_flasher.spinel[230] DEBUG Sending frame SpinelFrame(header=SpinelHeader(transaction_id=0, network_link_id=0, flag=2), command_id=<CommandID.RESET: 1>, data=b'\x02')
2026-04-26 01:03:34 homeassistant universal_silabs_flasher.spinel[230] DEBUG Sending data b'~\x80\x01\x02\xea\xf0~'
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Immediately writing b'~\x80\x01\x02\xea\xf0~'
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Sent 7 of 7 bytes
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Event loop woke up reader
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Received b'~\x80\x06\x00p\xeet~'
2026-04-26 01:03:34 homeassistant universal_silabs_flasher.spinel[230] DEBUG Decoded HDLC frame: HDLCLiteFrame(data=b'\x80\x06\x00p')
2026-04-26 01:03:34 homeassistant universal_silabs_flasher.spinel[230] DEBUG Parsed frame SpinelFrame(header=SpinelHeader(transaction_id=0, network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_IS: 6>, data=b'\x00p')
2026-04-26 01:03:34 homeassistant universal_silabs_flasher.spinel[230] DEBUG Sending frame SpinelFrame(header=SpinelHeader(transaction_id=3, network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_GET: 2>, data=b'\x08')
2026-04-26 01:03:34 homeassistant universal_silabs_flasher.spinel[230] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Sent 7 of 7 bytes
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Event loop woke up reader
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Received b'~\x83\x06\x08\x04\xe3\xe5\xff\xfe\xd1[\xf4\xcc\x81~'
2026-04-26 01:03:34 homeassistant universal_silabs_flasher.spinel[230] DEBUG Decoded HDLC frame: HDLCLiteFrame(data=b'\x83\x06\x08\x04\xe3\xe5\xff\xfe\xd1[\xf4')
2026-04-26 01:03:34 homeassistant universal_silabs_flasher.spinel[230] DEBUG Parsed frame SpinelFrame(header=SpinelHeader(transaction_id=3, network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_IS: 6>, data=b'\x08\x04\xe3\xe5\xff\xfe\xd1[\xf4')
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Closing at the request of the application
2026-04-26 01:03:34 homeassistant zigpy.serial[230] DEBUG Waiting for serial port to close
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Closing connection: None
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Closing file descriptor 7
2026-04-26 01:03:34 homeassistant serialx.descriptor_transport[230] DEBUG Calling protocol `connection_lost` with exc=None
2026-04-26 01:03:34 homeassistant zigpy.serial[230] DEBUG Connection lost: None
Adapter settings file /data/thread/0_4e3e5fffed15bf4.data is the most recently used, skipping
[01:03:34] INFO: Starting otbr-agent...
[NOTE]-AGENT---: Running 0.3.0-624a7d98
[NOTE]-AGENT---: Thread version: 1.4.0
[NOTE]-AGENT---: Thread interface: wpan0
[NOTE]-AGENT---: Radio URL: spinel+hdlc+uart:///dev/serial/by-id/usb-Itead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_V2_8a14446a09f4ef11be82c41b6d9880ab-if00-port0?uart-baudrate=460800&uart-init-deassert
[NOTE]-AGENT---: Radio URL: trel://end0
[NOTE]-ILS-----: Infra link selected: end0
49d.17:03:40.567 [C] P-SpinelDrive-: Software reset co-processor successfully
00:00:00.070 [N] BorderRouting-: BR ULA prefix: fd66:b477:b9d9::/48 (loaded)
00:00:00.071 [N] BorderRouting-: Local on-link prefix: fd66:1086:7b8e:bae4::/64
[WARN]-UTILS---: /usr/src/ot-br-posix/src/rest/network_diag_handler.cpp:1300 lacking some attributes for deviceId 7ad1ab5bc27203ea
[WARN]-UTILS---: /usr/src/ot-br-posix/src/rest/network_diag_handler.cpp:1244 cannot get LeaderData while detached
[WARN]-UTILS---: /usr/src/ot-br-posix/src/rest/rest_devices_coll.cpp:232 - AddItem - 7ad1ab5bc27203ea
00:00:00.106 [N] Mle-----------: Role disabled -> detached
00:00:00.106 [N] P-Netif-------: Changing interface state to up.
00:00:00.122 [W] P-Netif-------: Failed to process request#2: No such process
00:00:00.123 [W] P-Netif-------: Failed to process request#6: No such process
Connection to :: 8081 port [tcp/tproxy] succeeded!
s6-rc: info: service otbr-agent successfully started
s6-rc: info: service otbr-agent-configure: starting
Done
[01:03:35] INFO: Enabling NAT64.
Done
00:00:00.481 [W] P-Netif-------: Failed to process request#7: No such process
Done
Done
s6-rc: info: service otbr-agent-configure successfully started
s6-rc: info: service otbr-agent-rest-discovery: starting
s6-rc: info: service otbr-web: starting
s6-rc: info: service otbr-web successfully started
[01:03:35] INFO: Starting otbr-web...
[INFO]-WEB-----: Running 0.3.0-624a7d98
[INFO]-WEB-----: Border router web started on wpan0
[01:03:35] INFO: Successfully sent discovery information to Home Assistant.
s6-rc: info: service otbr-agent-rest-discovery successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
00:00:27.524 [N] Mle-----------: RLOC16 4000 -> fffe
00:00:27.903 [N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset
00:00:34.403 [N] RouterTable---: Allocate router id 16
00:00:34.403 [N] Mle-----------: RLOC16 fffe -> 4000
00:00:34.406 [N] Mle-----------: Role detached -> leader
00:00:34.406 [N] Mle-----------: Partition ID 0x496c62a5
[NOTE]-BBA-----: BackboneAgent: Backbone Router becomes Primary!
00:05:36.150 [W] DnssdServer---: Upstream query transaction 0 closed: ResponseTimeout.
00:05:46.156 [W] DnssdServer---: Upstream query transaction 0 closed: ResponseTimeout.
And if I toggle Beta mode off on OTBR, this is the output that I see:
-----------------------------------------------------------
Add-on: OpenThread Border Router
OpenThread Border Router add-on
-----------------------------------------------------------
Add-on version: 2.16.7
You are running the latest version of this add-on.
System: Home Assistant OS 17.2 (aarch64 / raspberrypi4-64)
Home Assistant Core: 2026.4.4
Home Assistant Supervisor: 2026.04.0
-----------------------------------------------------------
Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
s6-rc: info: service banner successfully started
s6-rc: info: service otbr-agent: starting
[01:30:49] INFO: Migrating OTBR settings if needed...
2026-04-26 01:30:49 homeassistant asyncio[242] DEBUG Using selector: EpollSelector
2026-04-26 01:30:49 homeassistant zigpy.serial[242] DEBUG Opening a serial connection to '/dev/serial/by-id/usb-Itead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_V2_8a14446a09f4ef11be82c41b6d9880ab-if00-port0' (baudrate=460800, xonxoff=False, rtscts=False)
2026-04-26 01:30:49 homeassistant serialx.platforms.serial_posix[242] DEBUG Configuring serial port '/dev/serial/by-id/usb-Itead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_V2_8a14446a09f4ef11be82c41b6d9880ab-if00-port0'
2026-04-26 01:30:49 homeassistant serialx.platforms.serial_posix[242] DEBUG Configuring serial port: [0, 0, 3248, 0, 4100, 4100, [b'\x03', b'\x1c', b'\x7f', b'\x15', b'\x04', 0, 0, b'\x00', b'\x11', b'\x13', b'\x1a', b'\x00', b'\x12', b'\x0f', b'\x17', b'\x16', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00', b'\x00']]
2026-04-26 01:30:49 homeassistant serialx.platforms.serial_posix[242] DEBUG Setting low latency mode: True
2026-04-26 01:30:49 homeassistant serialx.platforms.serial_posix[242] DEBUG Setting modem pins: ModemPins[!dtr !rts]
2026-04-26 01:30:49 homeassistant serialx.platforms.serial_posix[242] DEBUG TIOCMBIC: 0x00000006
2026-04-26 01:30:49 homeassistant zigpy.serial[242] DEBUG Connection made: <serialx.platforms.serial_posix.PosixSerialTransport object at 0x7f88834710>
2026-04-26 01:30:49 homeassistant universal_silabs_flasher.spinel[242] DEBUG Sending frame SpinelFrame(header=SpinelHeader(transaction_id=0, network_link_id=0, flag=2), command_id=<CommandID.RESET: 1>, data=b'\x02')
2026-04-26 01:30:49 homeassistant universal_silabs_flasher.spinel[242] DEBUG Sending data b'~\x80\x01\x02\xea\xf0~'
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Immediately writing b'~\x80\x01\x02\xea\xf0~'
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Sent 7 of 7 bytes
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Event loop woke up reader
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Received b'~\x80\x06\x00p\xeet~'
2026-04-26 01:30:49 homeassistant universal_silabs_flasher.spinel[242] DEBUG Decoded HDLC frame: HDLCLiteFrame(data=b'\x80\x06\x00p')
2026-04-26 01:30:49 homeassistant universal_silabs_flasher.spinel[242] DEBUG Parsed frame SpinelFrame(header=SpinelHeader(transaction_id=0, network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_IS: 6>, data=b'\x00p')
2026-04-26 01:30:49 homeassistant universal_silabs_flasher.spinel[242] DEBUG Sending frame SpinelFrame(header=SpinelHeader(transaction_id=3, network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_GET: 2>, data=b'\x08')
2026-04-26 01:30:49 homeassistant universal_silabs_flasher.spinel[242] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Sent 7 of 7 bytes
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Event loop woke up reader
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Received b'~\x83\x06\x08\x04\xe3\xe5\xff\xfe\xd1[\xf4\xcc\x81~'
2026-04-26 01:30:49 homeassistant universal_silabs_flasher.spinel[242] DEBUG Decoded HDLC frame: HDLCLiteFrame(data=b'\x83\x06\x08\x04\xe3\xe5\xff\xfe\xd1[\xf4')
2026-04-26 01:30:49 homeassistant universal_silabs_flasher.spinel[242] DEBUG Parsed frame SpinelFrame(header=SpinelHeader(transaction_id=3, network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_IS: 6>, data=b'\x08\x04\xe3\xe5\xff\xfe\xd1[\xf4')
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Closing at the request of the application
2026-04-26 01:30:49 homeassistant zigpy.serial[242] DEBUG Waiting for serial port to close
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Closing connection: None
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Closing file descriptor 7
2026-04-26 01:30:49 homeassistant serialx.descriptor_transport[242] DEBUG Calling protocol `connection_lost` with exc=None
2026-04-26 01:30:49 homeassistant zigpy.serial[242] DEBUG Connection lost: None
Adapter settings file /data/thread/0_4e3e5fffed15bf4.data is the most recently used, skipping
[01:30:49] INFO: Starting otbr-agent...
[NOTE]-AGENT---: Running 0.3.0-b067e5ac-dirty
[NOTE]-AGENT---: Thread version: 1.3.0
[NOTE]-AGENT---: Thread interface: wpan0
[NOTE]-AGENT---: Radio URL: spinel+hdlc+uart:///dev/serial/by-id/usb-Itead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_V2_8a14446a09f4ef11be82c41b6d9880ab-if00-port0?uart-baudrate=460800&uart-init-deassert
[NOTE]-AGENT---: Radio URL: trel://end0
[NOTE]-ILS-----: Infra link selected: end0
49d.17:17:40.032 [C] P-SpinelDrive-: Software reset co-processor successfully
00:00:00.067 [N] RoutingManager: BR ULA prefix: fd66:b477:b9d9::/48 (loaded)
00:00:00.068 [N] RoutingManager: Local on-link prefix: fd66:1086:7b8e:bae4::/64
00:00:00.112 [N] Mle-----------: Role disabled -> detached
00:00:00.144 [N] P-Netif-------: Changing interface state to up.
Connection to :: 8081 port [tcp/tproxy] succeeded!
00:00:00.166 [W] P-Netif-------: Failed to process request#2: No such process
s6-rc: info: service otbr-agent successfully started
00:00:00.168 [W] P-Netif-------: Failed to process request#5: No such process
s6-rc: info: service otbr-agent-configure: starting
Done
00:00:00.236 [W] P-Daemon------: Daemon read: Connection reset by peer
[01:30:50] INFO: Enabling NAT64.
Done
00:00:00.270 [W] P-Netif-------: Failed to process request#6: No such process
Done
Done
s6-rc: info: service otbr-agent-configure successfully started
s6-rc: info: service otbr-agent-rest-discovery: starting
s6-rc: info: service otbr-web: starting
s6-rc: info: service otbr-web successfully started
[01:30:50] INFO: Starting otbr-web...
[INFO]-WEB-----: Running 0.3.0-b067e5ac-dirty
[INFO]-WEB-----: Border router web started on wpan0
[01:30:50] INFO: Successfully sent discovery information to Home Assistant.
s6-rc: info: service otbr-agent-rest-discovery successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
00:00:00.783 [N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset
00:00:07.284 [N] RouterTable---: Allocate router id 37
00:00:07.284 [N] Mle-----------: RLOC16 fffe -> 9400
00:00:07.287 [N] Mle-----------: Role detached -> leader
00:00:07.288 [N] Mle-----------: Partition ID 0x6d5a0554
[NOTE]-BBA-----: BackboneAgent: Backbone Router becomes Primary!
00:00:09.507 [W] DuaManager----: Failed to perform next registration: NotFound
00:00:10.950 [W] P-RadioSpinel-: Error processing result: NoAddress
00:00:10.950 [W] P-RadioSpinel-: Error waiting response: NoAddress
00:00:10.975 [N] MeshForwarder-: Dropping IPv6 None msg, len:40, chksum:0000, ecn:no, sec:yes, error:NoRoute, prio:normal, radio:all
00:00:10.976 [N] MeshForwarder-: src:[fde6:5bae:7c8c:595c:59ce:3e4e:9545:252d]
00:00:10.976 [N] MeshForwarder-: dst:[fde6:5bae:7c8c:595c:0:ff:fe00:4000]
and ping6 is not working but mainly because my internet provider is not yet fully supporting ipv6
This is essentially a internal address HA assigned for its IPv6 Docker network.
BTW, it seems to me that the core-ssh addon doesn’t really have visibility to the network addresses that are of interest here. If possible, see if you can get access to the console for these types of commands, or maybe try the advanced SSH & Web Terminal Addon
I don’t know what I did but I think I fixed it. My Nuki smartlock now is able to get online just fine. The last change I did was provide ipv6 DNS servers on to the ipv6 interface configuration.
I just don’t think this battery-powered device keeps probing for network configuration changes continuously, so I can’t be sure, but the last change I have done is precisely adding Google ipv6 DNS servers to Home Assistant interface, but it could very well be something else…
I’ll have to say that I’m scratching my head on this one.
I also noticed earlier you were using NAT64 and trying to ping to ipv4only.arpa, so digging some, am I correct in saying the Nuki Smartlocks require NAT64?
Yes, I think so. That’s what I read online. But OBTR can indeed do NAT64, right?
The ping you refer to was a mistake on my side. At some point I lost perspective. Pinging that address from the core container would have validated whether my Fortigate was doing NAT64 correctly, but what I really wanted was for OBTR to do NAT64 instead