OTBR setup not working LMG21

HI all,

Today i receive my Sonoff lmg21 dongle.
I flashed it with sonoff dongle flasher:

I configured OTBR with this:

device: >-
  /dev/serial/by-id/usb-SONOFF_SONOFF_Dongle_Lite_MG21_e631d94d89a0ef11ba889da361ce3355-if00-port0
baudrate: "460800"
flow_control: true
otbr_log_level: notice
firewall: true
nat64: false

But it still gives me errors when i start OTBR:

-----------------------------------------------------------
 Add-on: OpenThread Border Router
 OpenThread Border Router add-on
-----------------------------------------------------------
 Add-on version: 2.15.3
 You are running the latest version of this add-on.
 System: Home Assistant OS 16.3  (amd64 / generic-x86-64)
 Home Assistant Core: 2025.12.5
 Home Assistant Supervisor: 2026.01.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
[21:17:38] INFO: Setup OTBR firewall...
[21:17:38] INFO: Migrating OTBR settings if needed...
2026-01-12 21:17:39 homeassistant asyncio[226] DEBUG Using selector: EpollSelector
2026-01-12 21:17:39 homeassistant zigpy.serial[226] DEBUG Opening a serial connection to '/dev/serial/by-id/usb-SONOFF_SONOFF_Dongle_Lite_MG21_e631d94d89a0ef11ba889da361ce3355-if00-port0' (baudrate=460800, xonxoff=False, rtscts=True)
2026-01-12 21:17:39 homeassistant serialx.platforms.serial_posix[226] DEBUG Configuring serial port '/dev/serial/by-id/usb-SONOFF_SONOFF_Dongle_Lite_MG21_e631d94d89a0ef11ba889da361ce3355-if00-port0'
2026-01-12 21:17:39 homeassistant serialx.platforms.serial_posix[226] 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-01-12 21:17:39 homeassistant serialx.platforms.serial_posix[226] DEBUG Setting low latency mode: True
2026-01-12 21:17:39 homeassistant serialx.platforms.serial_posix[226] DEBUG Setting modem pins: ModemPins[dtr rts]
2026-01-12 21:17:39 homeassistant serialx.platforms.serial_posix[226] DEBUG Setting TIOCMBIS: 0x00000006
2026-01-12 21:17:39 homeassistant zigpy.serial[226] DEBUG Connection made: <serialx.platforms.serial_posix.PosixSerialTransport object at 0x7f151603f8d0>
2026-01-12 21:17:39 homeassistant universal_silabs_flasher.spinel[226] DEBUG Sending frame SpinelFrame(header=SpinelHeader(transaction_id=0, network_link_id=0, flag=2), command_id=<CommandID.RESET: 1>, data=b'\x02')
2026-01-12 21:17:39 homeassistant universal_silabs_flasher.spinel[226] DEBUG Sending data b'~\x80\x01\x02\xea\xf0~'
2026-01-12 21:17:39 homeassistant serialx.descriptor_transport[226] DEBUG Immediately writing b'~\x80\x01\x02\xea\xf0~'
2026-01-12 21:17:39 homeassistant serialx.descriptor_transport[226] DEBUG Sent 7 of 7 bytes
2026-01-12 21:17:41 homeassistant universal_silabs_flasher.spinel[226] DEBUG Device did not respond to reset, continuing
2026-01-12 21:17:41 homeassistant universal_silabs_flasher.spinel[226] 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-01-12 21:17:41 homeassistant universal_silabs_flasher.spinel[226] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2026-01-12 21:17:41 homeassistant serialx.descriptor_transport[226] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2026-01-12 21:17:41 homeassistant serialx.descriptor_transport[226] DEBUG Sent 7 of 7 bytes
2026-01-12 21:17:43 homeassistant universal_silabs_flasher.spinel[226] DEBUG Failed to send SpinelFrame(header=SpinelHeader(network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_GET: 2>, data=b'\x08'), trying again in 0.10s (attempt 1 of 3)
2026-01-12 21:17:43 homeassistant universal_silabs_flasher.spinel[226] 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-01-12 21:17:43 homeassistant universal_silabs_flasher.spinel[226] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2026-01-12 21:17:43 homeassistant serialx.descriptor_transport[226] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2026-01-12 21:17:43 homeassistant serialx.descriptor_transport[226] DEBUG Sent 7 of 7 bytes
2026-01-12 21:17:45 homeassistant universal_silabs_flasher.spinel[226] DEBUG Failed to send SpinelFrame(header=SpinelHeader(network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_GET: 2>, data=b'\x08'), trying again in 0.10s (attempt 2 of 3)
2026-01-12 21:17:45 homeassistant universal_silabs_flasher.spinel[226] 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-01-12 21:17:45 homeassistant universal_silabs_flasher.spinel[226] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2026-01-12 21:17:45 homeassistant serialx.descriptor_transport[226] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2026-01-12 21:17:45 homeassistant serialx.descriptor_transport[226] DEBUG Sent 7 of 7 bytes
2026-01-12 21:17:47 homeassistant universal_silabs_flasher.spinel[226] DEBUG Failed to send SpinelFrame(header=SpinelHeader(network_link_id=0, flag=2), command_id=<CommandID.PROP_VALUE_GET: 2>, data=b'\x08'), trying again in 0.10s (attempt 3 of 3)
2026-01-12 21:17:47 homeassistant serialx.descriptor_transport[226] DEBUG Closing at the request of the application
2026-01-12 21:17:47 homeassistant zigpy.serial[226] DEBUG Waiting for serial port to close
2026-01-12 21:17:47 homeassistant serialx.descriptor_transport[226] DEBUG Closing connection: None
2026-01-12 21:17:47 homeassistant serialx.descriptor_transport[226] DEBUG Closing file descriptor 7
2026-01-12 21:18:17 homeassistant serialx.descriptor_transport[226] DEBUG Calling protocol `connection_lost` with exc=None
2026-01-12 21:18:17 homeassistant zigpy.serial[226] DEBUG Connection lost: None
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/dist-packages/universal_silabs_flasher/spinel.py", line 260, in send_frame
    return await asyncio.shield(future)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
asyncio.exceptions.CancelledError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/usr/local/bin/migrate_otbr_settings.py", line 223, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.11/asyncio/runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/usr/local/bin/migrate_otbr_settings.py", line 154, in main
    hwaddr = await get_adapter_hardware_addr(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/bin/migrate_otbr_settings.py", line 101, in get_adapter_hardware_addr
    rsp = await protocol.send_command(
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/universal_silabs_flasher/spinel.py", line 292, in send_command
    return await self.send_frame(frame, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/universal_silabs_flasher/spinel.py", line 259, in send_frame
    async with asyncio_timeout(timeout):
  File "/usr/lib/python3.11/asyncio/timeouts.py", line 98, in __aexit__
    raise TimeoutError
TimeoutError
[21:18:17] WARNING: otbr-agent exited with code 1 (by signal 0).
Chain OTBR_FORWARD_INGRESS (0 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere             PKTTYPE = unicast
DROP       all  --  anywhere             anywhere             match-set otbr-ingress-deny-src src
ACCEPT     all  --  anywhere             anywhere             match-set otbr-ingress-allow-dst dst
DROP       all  --  anywhere             anywhere             PKTTYPE = unicast
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            
[21:18:17] INFO: OTBR firewall teardown completed.
s6-svlisten1: fatal: /run/s6-rc/servicedirs/otbr-agent failed permanently or its supervisor died
s6-rc: warning: unable to start service otbr-agent: command exited 1
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service banner: stopping
s6-rc: info: service mdns: stopping
/run/s6/basedir/scripts/rc.init: warning: s6-rc failed to properly bring all the services up! Check your logs (in /run/uncaught-logs/current if you have in-container logging) for more information.
/run/s6/basedir/scripts/rc.init: fatal: stopping the container.
Default: mDNSResponder (Engineering Build) (Dec 15 2025 09:14:53) 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: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
[21:18:17] INFO: mDNS ended with exit code 4 (signal 0)...
s6-rc: info: service mdns successfully stopped

I already asked chatgpt and it says " **OTBR tries to talk to the RCP but doenst get a response, This confirms **the dongle is not speaking the Spinel RCP protocol

Your Sonoff Dongle Lite MG21 is not running an RCP firmware. The version you flashed (OpenThread 2.4.4) is NCP-style firmware, not RCP.

But i only have this option in the flashing tool, i am not able to choose NCP or RCP:

Does anyone know how i can fix this?

The sonoff site says it supports rcp, am i beter of to choose the sonoff zbdongle-e over the lmg 21 for rcp thread

Have you find anything? I got the exact same issue with the exact same device and no luck fixing it for days now :frowning:

Make sure you’ve disabled Hardware Flow control, it needs to be off for Sonoff devices.

1 Like

Make sure you’ve disabled Hardware Flow control, it needs to be off for Sonoff devices.

I had the same problem, and this was the perfect solution.
Now it works like a charm :slight_smile:

I have the LMG21 Lite dongle and can confirm it does work as a thread border router, as john.vesalius said you need to make sure flow control is off otherwise you get those type of errors. FYI make sure the channel you pick is very different from your wifi or zigbee channels, I went through a whole load of pain with an Aqara M3 hub, because I could not get HA OTBR working at first.
Long story short, I had no other option but to wipe my google play services data to get the phone to connect to HA OTBR again and not the M3 hub. This essentially bricked my phone, probably my lack of experiance but still it was a nightmare!!!

Oh and make sure your network supports IPv6 and it is enabled, otherwise your matter devices will not connect over thread.