Solved: Matter over Thread commissioning stalled on Home Assistant VM (Ugreen NAS) — fix was enabling IPv6 for HAOS Docker

Hi all,

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::1234: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:

WLAN → Funknetz → “Die angezeigten WLAN-Geräte dürfen untereinander kommunizieren”

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:

  1. shut the VM down completely
  2. start it again
  3. 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
  • client/AP isolation is off for the normal WLAN
  • IPv6 reachability works with ping -6
2 Likes

As i already told you in the other thread !-)

I’m experiencing a similar issue on HAOS deployed on a Raspberry Pi. Even if I enable ipv6, routes are not being installed.

[core-ssh ~]$ ha docker info
enable_ipv6: true
logging: journald
mtu: null
registries: {}
storage: overlayfs
version: 29.3.1
[core-ssh ~]$ ip -6 route
fd0c:ac1e:2100::/48 dev eth0  metric 256 
fe80::/64 dev eth0  metric 256 
default via fd0c:ac1e:2100::1 dev eth0  metric 1024 
[core-ssh ~]$ ha network reload
Command completed successfully.
[core-ssh ~]$ 
[core-ssh ~]$ ip -6 route | grep fd66
[core-ssh ~]$ ip -6 neigh show

I ended up enabling Beta mode due to this: Thread credentials can't be sent to iPhone · Issue #167699 · home-assistant/core · GitHub

yet with our without beta mode, results are always the same :frowning:

@DocMarc73 do you know what else I could do?

was unfortunately not the only thing like seen in the post.
But it was the last thing to remove :smiley:
Thanks again!

1 Like

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. !-)

could you run

ip -6 addr show dev eth0

and

ip -6 route show

and

ip -6 maddr show dev eth0

in HAOS and post it here? seems routing is wrong/not working for you.

If you dont want to make it public send me DM

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. :+1: :clap:

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…

I suspect my network equipment may be interfering, yes :frowning:

try this:

ip maddr show dev eth0

instead of

ip -6 maddr show dev eth0

That should how something like:
ff02:…
→ thats the multicast check

afterwards:

ss -u -l -n | grep 5353

that checks if the mDNS socket is open

Hi there @fazkoenig !!

thanks a lot for your help.

This is the output that I see:

[core-ssh ~]$ ip -6 maddr show dev eth0
BusyBox v1.37.0 (2025-12-16 14:19:28 UTC) multi-call binary.

Usage: ip [OPTIONS] address|route|link|tunnel|neigh|rule [ARGS]

OPTIONS := -f[amily] inet|inet6|link | -o[neline]

ip addr add|del IFADDR dev IFACE | show|flush [dev IFACE] [to PREFIX]
ip route list|flush|add|del|change|append|replace|test ROUTE
ip link set IFACE [up|down] [arp on|off] [multicast on|off]
	[promisc on|off] [mtu NUM] [name NAME] [qlen NUM] [address MAC]
	[master IFACE | nomaster] [netns PID]
ip tunnel add|change|del|show [NAME]
	[mode ipip|gre|sit] [remote ADDR] [local ADDR] [ttl TTL]
ip neigh show|flush [to PREFIX] [dev DEV] [nud STATE]
ip rule [list] | add|del SELECTOR ACTION

This other cli command does not seem to work either:

[core-ssh ~]$ ss -u -l -n | grep 5353
-bash: ss: command not found

I run this but did not see port 5353 listening though:

[core-ssh ~]$ lsof -i :5353
1	/package/admin/s6-2.14.0.1/command/s6-svscan	0	/dev/null
1	/package/admin/s6-2.14.0.1/command/s6-svscan	1	pipe:[10843]
1	/package/admin/s6-2.14.0.1/command/s6-svscan	2	pipe:[10844]
1	/package/admin/s6-2.14.0.1/command/s6-svscan	3	/run/service/.s6-svscan/lock
1	/package/admin/s6-2.14.0.1/command/s6-svscan	5	/run/service/.s6-svscan/control
1	/package/admin/s6-2.14.0.1/command/s6-svscan	6	/run/service/.s6-svscan/control
1	/package/admin/s6-2.14.0.1/command/s6-svscan	7	anon_inode:[signalfd]
17	/package/admin/s6-2.14.0.1/command/s6-supervise	0	/dev/null
17	/package/admin/s6-2.14.0.1/command/s6-supervise	1	pipe:[10843]
17	/package/admin/s6-2.14.0.1/command/s6-supervise	2	pipe:[10844]
17	/package/admin/s6-2.14.0.1/command/s6-supervise	3	/run/service/s6-linux-init-shutdownd/supervise/lock
17	/package/admin/s6-2.14.0.1/command/s6-supervise	4	/run/service/s6-linux-init-shutdownd/supervise/control
17	/package/admin/s6-2.14.0.1/command/s6-supervise	5	/run/service/s6-linux-init-shutdownd/supervise/control
17	/package/admin/s6-2.14.0.1/command/s6-supervise	6	anon_inode:[signalfd]
20	/package/admin/s6-linux-init-1.2.0.0/command/s6-linux-init-shutdownd	0	/dev/null
20	/package/admin/s6-linux-init-1.2.0.0/command/s6-linux-init-shutdownd	1	pipe:[10843]
20	/package/admin/s6-linux-init-1.2.0.0/command/s6-linux-init-shutdownd	2	pipe:[10844]
20	/package/admin/s6-linux-init-1.2.0.0/command/s6-linux-init-shutdownd	4	/run/service/s6-linux-init-shutdownd/fifo
20	/package/admin/s6-linux-init-1.2.0.0/command/s6-linux-init-shutdownd	5	/run/service/s6-linux-init-shutdownd/fifo
29	/package/admin/s6-2.14.0.1/command/s6-supervise	0	/dev/null
29	/package/admin/s6-2.14.0.1/command/s6-supervise	1	pipe:[10843]
29	/package/admin/s6-2.14.0.1/command/s6-supervise	2	pipe:[10844]
29	/package/admin/s6-2.14.0.1/command/s6-supervise	3	/run/s6-rc:s6-rc-init:JFdeDA/servicedirs/s6rc-oneshot-runner/supervise/lock
29	/package/admin/s6-2.14.0.1/command/s6-supervise	4	/run/s6-rc:s6-rc-init:JFdeDA/servicedirs/s6rc-oneshot-runner/supervise/control
29	/package/admin/s6-2.14.0.1/command/s6-supervise	5	/run/s6-rc:s6-rc-init:JFdeDA/servicedirs/s6rc-oneshot-runner/supervise/control
29	/package/admin/s6-2.14.0.1/command/s6-supervise	6	anon_inode:[signalfd]
30	/package/admin/s6-2.14.0.1/command/s6-supervise	0	/dev/null
30	/package/admin/s6-2.14.0.1/command/s6-supervise	1	pipe:[10843]
30	/package/admin/s6-2.14.0.1/command/s6-supervise	2	pipe:[10844]
30	/package/admin/s6-2.14.0.1/command/s6-supervise	3	/run/s6-rc:s6-rc-init:JFdeDA/servicedirs/s6rc-fdholder/supervise/lock
30	/package/admin/s6-2.14.0.1/command/s6-supervise	4	/run/s6-rc:s6-rc-init:JFdeDA/servicedirs/s6rc-fdholder/supervise/control
30	/package/admin/s6-2.14.0.1/command/s6-supervise	5	/run/s6-rc:s6-rc-init:JFdeDA/servicedirs/s6rc-fdholder/supervise/control
30	/package/admin/s6-2.14.0.1/command/s6-supervise	6	anon_inode:[signalfd]
38	/package/admin/s6-2.14.0.1/command/s6-ipcserverd	0	socket:[12681]
38	/package/admin/s6-2.14.0.1/command/s6-ipcserverd	2	pipe:[10843]
38	/package/admin/s6-2.14.0.1/command/s6-ipcserverd	3	anon_inode:[signalfd]
158	/package/admin/s6-2.14.0.1/command/s6-supervise	0	/dev/null
158	/package/admin/s6-2.14.0.1/command/s6-supervise	1	pipe:[10843]
158	/package/admin/s6-2.14.0.1/command/s6-supervise	2	pipe:[10844]
158	/package/admin/s6-2.14.0.1/command/s6-supervise	3	/run/s6/legacy-services/ttyd/supervise/lock
158	/package/admin/s6-2.14.0.1/command/s6-supervise	4	/run/s6/legacy-services/ttyd/supervise/control
158	/package/admin/s6-2.14.0.1/command/s6-supervise	5	/run/s6/legacy-services/ttyd/supervise/control
158	/package/admin/s6-2.14.0.1/command/s6-supervise	6	anon_inode:[signalfd]
159	/package/admin/s6-2.14.0.1/command/s6-supervise	0	/dev/null
159	/package/admin/s6-2.14.0.1/command/s6-supervise	1	pipe:[10843]
159	/package/admin/s6-2.14.0.1/command/s6-supervise	2	pipe:[10844]
159	/package/admin/s6-2.14.0.1/command/s6-supervise	3	/run/s6/legacy-services/sshd/supervise/lock
159	/package/admin/s6-2.14.0.1/command/s6-supervise	4	/run/s6/legacy-services/sshd/supervise/control
159	/package/admin/s6-2.14.0.1/command/s6-supervise	5	/run/s6/legacy-services/sshd/supervise/control
159	/package/admin/s6-2.14.0.1/command/s6-supervise	6	anon_inode:[signalfd]
161	/usr/sbin/sshd	0	/dev/null
161	/usr/sbin/sshd	1	pipe:[10843]
161	/usr/sbin/sshd	2	pipe:[10844]
161	/usr/sbin/sshd	3	/dev/null
161	/usr/sbin/sshd	4	/dev/null
161	/usr/sbin/sshd	5	/dev/null
161	/usr/sbin/sshd	6	socket:[12074]
161	/usr/sbin/sshd	7	socket:[12075]
162	/usr/bin/ttyd	0	/dev/null
162	/usr/bin/ttyd	1	pipe:[10843]
162	/usr/bin/ttyd	2	pipe:[10844]
162	/usr/bin/ttyd	3	anon_inode:[eventpoll]
162	/usr/bin/ttyd	4	anon_inode:[io_uring]
162	/usr/bin/ttyd	5	pipe:[13651]
162	/usr/bin/ttyd	6	pipe:[13651]
162	/usr/bin/ttyd	7	pipe:[13652]
162	/usr/bin/ttyd	8	pipe:[13652]
162	/usr/bin/ttyd	9	anon_inode:[eventfd]
162	/usr/bin/ttyd	10	pipe:[10843]
162	/usr/bin/ttyd	11	/dev/urandom
162	/usr/bin/ttyd	12	anon_inode:[eventfd]
162	/usr/bin/ttyd	13	socket:[15943]
162	/usr/bin/ttyd	14	socket:[15944]
162	/usr/bin/ttyd	17	/dev/null
366	/usr/bin/tmux	0	/dev/null
366	/usr/bin/tmux	1	/dev/null
366	/usr/bin/tmux	2	/dev/null
366	/usr/bin/tmux	3	pipe:[446240]
366	/usr/bin/tmux	4	pipe:[446240]
366	/usr/bin/tmux	6	socket:[451778]
366	/usr/bin/tmux	8	/dev/ptmx
367	/bin/bash	0	/dev/pts/2
367	/bin/bash	1	/dev/pts/2
367	/bin/bash	2	/dev/pts/2
367	/bin/bash	255	/dev/pts/2
405	/usr/lib/ssh/sshd-session	0	/dev/null
405	/usr/lib/ssh/sshd-session	1	/dev/null
405	/usr/lib/ssh/sshd-session	2	pipe:[10844]
405	/usr/lib/ssh/sshd-session	3	/dev/null
405	/usr/lib/ssh/sshd-session	4	/dev/null
405	/usr/lib/ssh/sshd-session	5	/dev/null
405	/usr/lib/ssh/sshd-session	6	/dev/ptmx
405	/usr/lib/ssh/sshd-session	7	socket:[528087]
405	/usr/lib/ssh/sshd-session	8	socket:[529531]
405	/usr/lib/ssh/sshd-session	9	socket:[529527]
407	/usr/lib/ssh/sshd-session	0	/dev/null
407	/usr/lib/ssh/sshd-session	1	/dev/null
407	/usr/lib/ssh/sshd-session	2	pipe:[10844]
407	/usr/lib/ssh/sshd-session	3	/dev/null
407	/usr/lib/ssh/sshd-session	4	/dev/null
407	/usr/lib/ssh/sshd-session	5	/dev/null
407	/usr/lib/ssh/sshd-session	6	socket:[529530]
407	/usr/lib/ssh/sshd-session	7	socket:[528087]
407	/usr/lib/ssh/sshd-session	8	/dev/ptmx
407	/usr/lib/ssh/sshd-session	9	socket:[529527]
407	/usr/lib/ssh/sshd-session	11	/dev/ptmx
407	/usr/lib/ssh/sshd-session	12	/dev/ptmx
408	/bin/bash	0	/dev/pts/0
408	/bin/bash	1	/dev/pts/0
408	/bin/bash	2	/dev/pts/0
408	/bin/bash	255	/dev/pts/0

I also run this on a Mac OS connected to the same vlan, in case it provided an additional angle:

> dns-sd -B _services._dns-sd._udp .
Browsing for _services._dns-sd._udp
DATE: ---Sat 25 Apr 2026---
10:55:42.574  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
10:55:42.762  Add        3  15 .                    _tcp.local.          _smb
10:55:42.762  Add        3  15 .                    _tcp.local.          _http
10:55:42.762  Add        3  15 .                    _tcp.local.          _airplay
10:55:42.762  Add        3  15 .                    _tcp.local.          _raop
10:55:42.762  Add        3  15 .                    _tcp.local.          _companion-link
10:55:42.762  Add        3  15 .                    _tcp.local.          _matter
10:55:42.762  Add        3  15 .                    _sub.local.          _I16F539B1380ECA68
10:55:42.762  Add        3  15 .                    _tcp.local.          _workstation
10:55:42.762  Add        3  15 .                    _tcp.local.          _dacp
10:55:42.762  Add        3  15 .                    _tcp.local.          _mass
10:55:42.762  Add        3  15 .                    _udp.local.          _trel
10:55:42.762  Add        3  15 .                    _udp.local.          _meshcop
10:55:42.762  Add        3   1 .                    _tcp.local.          _smb
10:55:42.762  Add        3   1 .                    _tcp.local.          _http
10:55:42.762  Add        3   1 .                    _tcp.local.          _airplay
10:55:42.762  Add        3   1 .                    _tcp.local.          _raop
10:55:42.762  Add        2   1 .                    _tcp.local.          _companion-link
^C
~ >                            

This is what my environment looks like:

I get errors like this both with OTBR firewall on and off:

DnssdServer---: Upstream query transaction 0 closed: ResponseTimeout.

OTBR seems it cannot resolve mDNS queries upstream (toward the LAN). Does this not indicates a failure in: container → host → LAN multicast path??

From ha network info :

  • Host interface (end0 ) has IPv6 address in Thread prefix
  • OTBR advertises:
    • ULA prefix (fd66::/48)
    • On-link prefix (/64)

which I believe suggests: IPv6 routing between OTBR and host is partially working, right?

OTBR also shows multiple

Nat64---------: No mapping found for the IPv4 address

My gut feeling is that I have an issue in HAOS networking?

Other tests that I’ve run

[core-ssh ~]$ ping ff02::fb%end0
ping: bad address 'ff02::fb%end0'
[core-ssh ~]$ 
[core-ssh ~]$ ping6 ipv4only.arpa
ping6: bad address 'ipv4only.arpa'

and this is what my detailed network settings look like:

[core-ssh ~]$ ha network info
docker:
  address: 172.30.32.0/23
  dns: 172.30.32.3
  gateway: 172.30.32.1
  interface: hassio
host_internet: true
interfaces:
- connected: true
  enabled: true
  interface: end0
  ipv4:
    address:
    - 192.168.10.5/24
    gateway: 192.168.10.1
    method: auto
    nameservers:
    - 8.8.8.8
    - 8.8.4.4
    ready: true
    route_metric: null
  ipv6:
    addr_gen_mode: default
    address:
    - fd66:1086:7b8e:bae4:1a23:cc56:6f3a:28f8/64
    - fe80::bd0b:bcba:5a25:c4ea/64
    gateway: null
    ip6_privacy: default
    method: auto
    nameservers: []
    ready: true
    route_metric: null
  llmnr: default
  mac: D8:3A:DD:03:0C:2D
  mdns: default
  primary: true
  type: ethernet
  vlan: null
  wifi: null
- connected: false
  enabled: false
  interface: wlan0
  ipv4:
    address: []
    gateway: null
    method: disabled
    nameservers: []
    ready: false
    route_metric: null
  ipv6:
    addr_gen_mode: default
    address: []
    gateway: null
    ip6_privacy: default
    method: disabled
    nameservers: []
    ready: false
    route_metric: null
  llmnr: null
  mac: D8:3A:DD:03:0C:2E
  mdns: null
  primary: false
  type: wireless
  vlan: null
  wifi: null
supervisor_internet: true

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)

1 Like

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.

thanks for the diagnose! This ipv6 configuration is quite a thing!

this is my current OBTR configuration. I don’t recall enabling that option anywhere.

Will investigate how that needs to be done.

Sure. I’ll update this thread later tonight when I’ve done the required digging.

I think this looks better now, right?

and this is the output of the ha network info command:

[core-ssh ~]$ ha network info
docker:
  address: 172.30.32.0/23
  dns: 172.30.32.3
  gateway: 172.30.32.1
  interface: hassio
host_internet: true
interfaces:
- connected: true
  enabled: true
  interface: end0
  ipv4:
    address:
    - 192.168.10.5/24
    gateway: 192.168.10.1
    method: auto
    nameservers:
    - 8.8.8.8
    - 8.8.4.4
    ready: true
    route_metric: null
  ipv6:
    addr_gen_mode: default
    address:
    - fd20:1234:abcd:0:f562:e164:fc4c:f937/64
    - fd66:1086:7b8e:bae4:1a23:cc56:6f3a:28f8/64
    - fe80::bd0b:bcba:5a25:c4ea/64
    gateway: fe80::2ff:b1ff:feab:7e1b
    ip6_privacy: default
    method: auto
    nameservers: []
    ready: true
    route_metric: null
  llmnr: default
  mac: D8:3A:DD:03:0C:2D
  mdns: default
  primary: true
  type: ethernet
  vlan: null
  wifi: null
- connected: false
  enabled: false
  interface: wlan0
  ipv4:
    address: []
    gateway: null
    method: disabled
    nameservers: []
    ready: false
    route_metric: null
  ipv6:
    addr_gen_mode: default
    address: []
    gateway: null
    ip6_privacy: default
    method: disabled
    nameservers: []
    ready: false
    route_metric: null
  llmnr: null
  mac: D8:3A:DD:03:0C:2E
  mdns: null
  primary: false
  type: wireless
  vlan: null
  wifi: null
supervisor_internet: true

also a few additional outputs:

[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

[core-ssh ~]$ ping6 google.com
PING google.com (2a00:1450:4003:805::200e): 56 data bytes
^C
--- google.com ping statistics ---
6 packets transmitted, 0 packets received, 100% packet loss

any help would be most appreciated. I’m at a loss.

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

Hi @wmaker ! thanks for your continued support!

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…

Does this make any sense?

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