Unable to add Matter devices over Thread

Hello together,

i have a problem adding Thread devices over Matter. I am using a Home Assistant ZBT-2 antenna confiugred as Thread Border Router via Open Thread Border Router installed as a App on Home Assistant. The Matter Server also runs directly on the Home Assistant instance. I have never configured Matter/Thread before and have never onboarded any Matter/Thread devices.

The Raspberry Pi with Home Assistant installed runs on a Subnet where the all devices are installed in (192.168.2.0/24, fd00:2::/64). The iPhone I use for comissioning is in the same subnet for onboarding of devices. There is no host isolation or IGMP snooping configured. mDNS is configured for the network on the unifi router.

When I try to add different Ikea devices (scanning via HomeAssistant App) the device is found but is hanging in “configuration”-state according to my iPhone. The keys could be sent from HA to the iPhone without any problem.

2026-04-05 13:52:51.715 (MainThread) DEBUG [matter_server.server.device_controller.mdns] Commissionable Matter node disappeared: AsyncServiceInfo(type='_matterc._udp.local.', name='8959DC1677A3058B._matterc._udp.local.', addresses=[], port=None, weight=0, priority=0, server=None, properties={}, interface_index=None)
2026-04-05 13:53:48.350 (MainThread) DEBUG [matter_server.server.device_controller.mdns] Discovered commissionable Matter node: AsyncServiceInfo(type='_matterc._udp.local.', name='8959DC1677A3058B._matterc._udp.local.', addresses=[], port=5540, weight=0, priority=0, server='B6E7724E46851A17.local.', properties={b'VP': b'4476+32769', b'SII': b'9500', b'SAI': b'2100', b'SAT': b'5000', b'ICD': b'0', b'D': b'1208', b'CM': b'2', b'RI': b'0200CCF05D2FA9002813B890B694341C2B17', b'PH': b'36', b'PI': None}, interface_index=None)
2026-04-05 13:54:49.208 (MainThread) DEBUG [matter_server.server.device_controller.mdns] Commissionable Matter node disappeared: AsyncServiceInfo(type='_matterc._udp.local.', name='8959DC1677A3058B._matterc._udp.local.', addresses=[], port=None, weight=0, priority=0, server=None, properties={}, interface_index=None)
2026-04-05 13:54:50.009 (MainThread) DEBUG [matter_server.server.device_controller.mdns] Discovered commissionable Matter node: AsyncServiceInfo(type='_matterc._udp.local.', name='8959DC1677A3058B._matterc._udp.local.', addresses=[], port=5540, weight=0, priority=0, server='B6E7724E46851A17.local.', properties={b'VP': b'4476+32769', b'SII': b'9500', b'SAI': b'2100', b'SAT': b'5000', b'ICD': b'0', b'D': b'165', b'CM': b'0', b'RI': b'0200CCF05D2FA9002813B890B694341C2B17', b'PH': b'36', b'PI': None}, interface_index=None)
2026-04-05 13:55:09.727 (MainThread) DEBUG [matter_server.server.device_controller.mdns] Commissionable Matter node disappeared: AsyncServiceInfo(type='_matterc._udp.local.', name='8959DC1677A3058B._matterc._udp.local.', addresses=[], port=None, weight=0, priority=0, server=None, properties={}, interface_index=None)

It seems like that the device cant get and iPv6 address but i cant find any indicators why. Everything was built like described in the manual of ZBT-2 for example (https://support.nabucasa.com/hc/en-us/articles/31347105826077-Forming-a-new-Thread-network-with-Home-Assistant-Connect-ZBT-2).
I tried to solve the problem myself but right now i tried like 8 hours in debugging, reinstalling and configuring but with no positive outcome. Both devices I try to add show the exact same error (hanging in configuration mode)

The OTBR Logs (error) from an onboarding attempt:

-----------------------------------------------------------
 Add-on: OpenThread Border Router
 OpenThread Border Router add-on
-----------------------------------------------------------
 Add-on version: 2.16.5
 You are running the latest version of this add-on.
 System: Home Assistant OS 17.1  (aarch64 / raspberrypi4-64)
 Home Assistant Core: 2026.4.1
 Home Assistant Supervisor: 2026.03.2
-----------------------------------------------------------
 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
[13:52:58] INFO: Setup OTBR firewall...
[13:52:58] INFO: Migrating OTBR settings if needed...
2026-04-05 13:53:00 homeassistant asyncio[237] DEBUG Using selector: EpollSelector
2026-04-05 13:53:00 homeassistant zigpy.serial[237] DEBUG Opening a serial connection to '/dev/serial/by-id/usb-Nabu_Casa_ZBT-2_E072A1DBDEDC-if00' (baudrate=460800, xonxoff=False, rtscts=True)
2026-04-05 13:53:00 homeassistant serialx.platforms.serial_posix[237] DEBUG Configuring serial port '/dev/serial/by-id/usb-Nabu_Casa_ZBT-2_E072A1DBDEDC-if00'
2026-04-05 13:53:00 homeassistant serialx.platforms.serial_posix[237] DEBUG Configuring serial port: [0, 0, 2147486896, 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-05 13:53:00 homeassistant serialx.platforms.serial_posix[237] DEBUG Setting low latency mode: True
2026-04-05 13:53:00 homeassistant serialx.platforms.serial_posix[237] DEBUG Setting modem pins: ModemPins[dtr rts]
2026-04-05 13:53:00 homeassistant serialx.platforms.serial_posix[237] DEBUG Setting TIOCMBIS: 0x00000006
2026-04-05 13:53:00 homeassistant zigpy.serial[237] DEBUG Connection made: <serialx.platforms.serial_posix.PosixSerialTransport object at 0x7f9c38c7d0>
2026-04-05 13:53:00 homeassistant universal_silabs_flasher.spinel[237] 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-05 13:53:00 homeassistant universal_silabs_flasher.spinel[237] DEBUG Sending data b'~\x80\x01\x02\xea\xf0~'
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Immediately writing b'~\x80\x01\x02\xea\xf0~'
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Sent 7 of 7 bytes
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Event loop woke up reader
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Received b'~\x80\x06\x00p\xeet~'
2026-04-05 13:53:00 homeassistant universal_silabs_flasher.spinel[237] DEBUG Decoded HDLC frame: HDLCLiteFrame(data=b'\x80\x06\x00p')
2026-04-05 13:53:00 homeassistant universal_silabs_flasher.spinel[237] 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-05 13:53:00 homeassistant universal_silabs_flasher.spinel[237] 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-05 13:53:00 homeassistant universal_silabs_flasher.spinel[237] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Sent 7 of 7 bytes
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Event loop woke up reader
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Received b'~\x83\x06\x08\xd8x\xf0\xff\xfe\x94\x9a:o\x9f~'
2026-04-05 13:53:00 homeassistant universal_silabs_flasher.spinel[237] DEBUG Decoded HDLC frame: HDLCLiteFrame(data=b'\x83\x06\x08\xd8x\xf0\xff\xfe\x94\x9a:')
2026-04-05 13:53:00 homeassistant universal_silabs_flasher.spinel[237] 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\xd8x\xf0\xff\xfe\x94\x9a:')
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Closing at the request of the application
2026-04-05 13:53:00 homeassistant zigpy.serial[237] DEBUG Waiting for serial port to close
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Closing connection: None
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Closing file descriptor 7
2026-04-05 13:53:00 homeassistant serialx.descriptor_transport[237] DEBUG Calling protocol `connection_lost` with exc=None
2026-04-05 13:53:00 homeassistant zigpy.serial[237] DEBUG Connection lost: None
Adapter settings file /data/thread/0_d878f0fffe949a3a.data is the most recently used, skipping
[13:53:00] INFO: Starting otbr-agent...
50d.15:43:46.757 [C] P-SpinelDrive-: Software reset co-processor successfully
50d.15:43:46.770 [C] P-RadioSpinel-: RCP => [C] Platform------: Reset info: 0x3 (EXT)
50d.15:43:46.770 [C] P-RadioSpinel-: RCP => [C] Platform------: Extended Reset info: 0x301 (PIN)
00:00:00.237 [W] P-Netif-------: Failed to process request#2: No such process
00:00:00.240 [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
00:00:00.590 [W] P-Daemon------: Failed to write CLI output: Broken pipe
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
[13:53:01] INFO: Starting otbr-web...
s6-rc: info: service otbr-web successfully started
[INFO]-WEB-----: Running 0.3.0-b067e5ac-dirty
[INFO]-WEB-----: Border router web started on wpan0
[13:53:02] 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:35.746 [W] DuaManager----: Failed to perform next registration: NotFound
00:00:35.950 [W] P-RadioSpinel-: Error processing result: NoAddress
00:00:35.950 [W] P-RadioSpinel-: Error waiting response: NoAddress
00:38:10.663 [W] P-RadioSpinel-: Error processing result: NoAddress
00:38:10.663 [W] P-RadioSpinel-: Error waiting response: NoAddress

As you can see in the following screenshot, the thread network is listed as preferred:


The Apple Thread Network has never been used.

I don’t know what to tell you regarding fixing this, but the OTBR is not happy along the way talking with the ZBT-2. It looks like the OTBR is writing a spinel frame to the ZBT-2 and expecting a particular response and not getting the correct response; so it shuts down, and probably the watchdog catches it and restarts the OTBR.

Looking at the Matter Logs, the OTBR must be staying up long enough for the Matter server to see the device and gets in the commissioning phase, but thinks the device disappears in the process (possibly because the OTBR is restarting). Anyway it looks more like an issue between the OTBR and ZBT-2. Not sure if its cabling, power, firmware version…

I had a similar issue: Home Assistant ZBT-2 antenna, Open Thread Border Router and Matter Server running on Home Assistant, trying to add Matter devices from Ikea using the Home Assistant app on a mobile device, and hanging during the process. I was also getting “NoAddress” errors in the OTBR logs during this process.

After many other debugging attempts, I tried adding the device on the Home Assistant app using “Settings > Matter > Options > Add manually” and typing in the 11 digit Matter code from the Ikea insert. Suddenly the device appeared!

I’m not sure where the typical configuration process is going wrong. (It looks like this alternative method appears not to go through the iOS system, so maybe something is off there?)

1 Like

This method is using the Matter Server directly for commissioning so yes, it is bypassing the mobile phone’s participation in commissioning (which is often the problem because it doesn’t have the correct credentials);

For the record, I had a similar (but oddly different experience). My Thread network uses a SkyConnect with a handful of IKEA TIMMERFLOTTE and BILRESA devices. I also have some Onvis S4 smart plugs.

IPv6 is enabled. Home Assistant is speaking IPv6 to many of the devices in my home. I double-checked IPv6 broadcasts by checking Settings>System>Network>Network discovery. All looks correct.

Today I bought a few IKEA GRILLPLATS smart plugs and tried pairing them via my iPad. I spent hours scanning codes, resetting plugs, and searching for useful logs messages. Pairing failed every time. I tried your suggestion of typing in the 11-digit Matter code; pairing failed with different and equally unhelpful error messages.

In desperation, I hauled out my ancient iPhone 8 with out-of-date iOS software. (Apple doesn’t issue updates for phones this old.) I connected to the same Wi-Fi net as the iPad. Same setup as before, except the old iOS device with old software. I tried your suggestion of typing in the 11-digit code, and the *&%^!@# device paired immediately.

I have no explanation for why this should work, but there you go. Unable to add IKEA Thread devices to your net? Try using an old iPhone 8.

Thanks, adding manually worked for me

Thanks for the context, all. My frustration continues: After successfully commissioning the one Ikea Matter device (Bilresa) using the “manual” method, my repeated attempts to commission any other Ikea Matter device have been unsuccessful. I have tried a recent iPhone, an iPad, and multiple computers using both the preferred mobile app method (making sure to add credentials) and the manual method.

On the Matter server, I’m getting error messages like so for the manual method:

2026-04-19 19:48:43.294 (MainThread) INFO [matter_server.server.device_controller] Starting Matter commissioning with code using Node ID 36.
2026-04-19 19:49:13.370 (Dummy-2) CHIP_ERROR [chip.native.CTL] Discovery timed out
2026-04-19 19:49:13.376 (Dummy-2) CHIP_ERROR [chip.native.ZCL] Secure Pairing Failed
2026-04-19 19:49:13.381 (Dummy-2) WARNING [chip.ChipDeviceCtrl] Failed to establish secure session to device: src/controller/python/ChipDeviceController-ScriptDevicePairingDelegate.cpp:96: CHIP Error 0x00000003: Incorrect state
2026-04-19 19:49:13.384 (MainThread) ERROR [matter_server.server.client_handler] [281473167647392] Error while handling: commission_with_code: Commission with code failed for node 36.

And errors like so for OTBR:

00:14:33.448 [N] MeshForwarder-: Failed to send IPv6 UDP msg, len:96, chksum:8e7b, ecn:no, to:6ee907539fdbaa39, sec:no, error:NoAck, prio:net, radio:15.4
00:14:33.448 [N] MeshForwarder-:     src:[fe80:0:0:0:e460:f568:e029:e30]:19788
00:14:33.448 [N] MeshForwarder-:     dst:[fe80:0:0:0:6ce9:753:9fdb:aa39]:19788
00:14:34.170 [N] MeshForwarder-: Failed to send IPv6 UDP msg, len:96, chksum:dedd, ecn:no, to:6ee907539fdbaa39, sec:no, error:NoAck, prio:net, radio:15.4
00:14:34.170 [N] MeshForwarder-:     src:[fe80:0:0:0:e460:f568:e029:e30]:19788
00:14:34.170 [N] MeshForwarder-:     dst:[fe80:0:0:0:6ce9:753:9fdb:aa39]:19788

At a loss for what to try next…

Be aware that if you are using the method where the Matter Server is doing the commissioning directly (without a phone), the Matter Server needs a dedicated bluetooth adapter and its id needs to be configured in the Matter Server. If you are sharing the bluetooth adapter with HA, then its possible the Matter Server is not able to provide the device with Thread credentials and maybe the reason its failing the Discovery.

Yes, a confusing part is that I do not have bluetooth set up with HA or the Matter Server. Still, the “add manually” method worked for me that one time. (I might speculate that part of the commisioning process did succeed via the mobile route, but was stalled until I used the “add manually” button? But this has not worked a second time.) Do you know if the “add manually” button uses bluetooth when run on a mobile device?

If you are using the HA companion app then whether scanning QR code or entering code manually, it is the mobile device that does the initial commissioning using the mobile device’s bluetooth

Did you already have an old version of Home Assistant installed on that iPhone 8? I have a first generation iPhone SE that is barely functional but when I tried to install Home Assistant on it, I couldn’t since I think that the OS was too old to be supported. Therefore I couldn’t try adding any GRILLPLATS plugs using it.

It’s not just GRILLPLATS that I couldn’t add though; I’m having the same issue with Eve Matter over Thread plugs.