Skip to content

Instantly share code, notes, and snippets.

@gtxaspec
Last active December 18, 2025 14:03
Show Gist options
  • Select an option

  • Save gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f to your computer and use it in GitHub Desktop.

Select an option

Save gtxaspec/d26198daadfb0a8b0a0edeae2d3fd58f to your computer and use it in GitHub Desktop.
ESP32-C6 RCP how to

ESP32-C6 as OpenThread RCP - Setup Guide

Here's how to flash your ESP32-C6 to work as an RCP (Radio Co-Processor) with Home Assistant's OpenThread Border Router add-on.

Step 1: Clone and Setup ESP-IDF

mkdir ~/esp-openthread && cd ~/esp-openthread
git clone -b v5.4.2 --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh esp32c6
. ./export.sh

To enable native USB flashing (so you don't need a separate serial adapter), apply the following patch to add USB_SERIAL_JTAG support:

git cherry-pick 51bcec7ac67efff9e915239fa07fb1909b002d80

Step 2: Build the RCP Firmware

cd examples/openthread/ot_rcp
idf.py set-target esp32c6
idf.py menuconfig  # Optional - defaults work fine
idf.py build

Step 3: Flash the ESP32-C6

# Find your device (usually /dev/ttyACM0 or /dev/ttyUSB0)
ls /dev/tty*

# Erase and flash (replace PORT with your device)
idf.py -p PORT erase-flash
idf.py -p PORT flash

Step 4: Configure Home Assistant

In your OTBR add-on settings:

  • Device: /dev/ttyACM0 (or whatever your device shows as)
  • Baudrate: 460800
  • Flow Control: false

Pro tip: Consider using two ESP32-C6 boards - one for development/flashing and another as your dedicated RCP positioned away from your server's USB ports, OR using a USB to Serial adapter hooked up to the RCP. The farther your Thread radio is from USB 3.0 ports and other electronics, the better your 2.4GHz performance will be.

Note: If you get permission errors, add your user to dialout group: sudo usermod -a -G dialout $USER then logout/login.

That's it! Your ESP32-C6 is now ready to use as a Thread RCP with Home Assistant.

@rayanamal
Copy link

rayanamal commented Dec 14, 2025

UPDATE: The steps here are not sufficient. Here's the complete guide: https://community.home-assistant.io/t/make-your-own-thread-border-router-for-just-5/962780/1

I'm filled with equal amounts of gratefulness and exasperation after one full day spent troubleshooting.

Dude, thank you so much for this gist, I wouldn't be able to get started without it. But it's not enough.

I'm pretty sure with the hardware setup you were using the steps here were sufficient, but in my case it simply wasn't. I'm using nothing but a single cheap ESP32-C6 SuperMini board connected to my Pi 5 running HA over the board's single USB-C port. No matter what I did the HA OTBR container wouldn't be able to receive packets from the ESP32-C6 board even though the serial link established fine.

I'll update this post once there is a complete guide.

@rayanamal
Copy link

rayanamal commented Dec 14, 2025

IT WORKS!!! Pardon my excitement. Right now I'm reading the internal temperature value of a dirt-cheap ESP32-H2 SuperMini board over Thread, with a Thread Border Router made with nothing but an even cheaper ESP32-C6 SuperMini board connected to HA with nothing but a USB cable. The damn things don't even have shielding or a U.FL antenna, they are barely half the size of my thumb.

I can read the logs wirelessly from ESPHome over Thread and let me check... I can OTA update it over Thread to make use of the onboard RGB led (took ~3 minutes).

@MrVolans
Copy link

I've been at this same thing for hours now. I've got the esp32c6 flashed with the USB-RCP option selected, but all I get when I plug it into my server are spinelFrame errors until it closes OTBR back down. T-T

--

Logs from OTBR in Homeassistant if anyone got a moment to check them out:

 [20:12:38] INFO: The otbr-web is disabled.
s6-rc: info: service mdns: starting
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service mdns successfully started
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
[20:12:39] INFO: Starting mDNS Responder...
Default: mDNSResponder (Engineering Build) (Dec 15 2025 09:14:53) starting
-----------------------------------------------------------
 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.1  (amd64 / generic-x86-64)
 Home Assistant Core: 2025.9.0
 Home Assistant Supervisor: 2025.12.3
-----------------------------------------------------------
 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
[20:12:41] INFO: Setup OTBR firewall...
[20:12:41] INFO: Migrating OTBR settings if needed...
2025-12-17 20:12:41 homeassistant asyncio[227] DEBUG Using selector: EpollSelector
2025-12-17 20:12:41 homeassistant zigpy.serial[227] DEBUG Opening a serial connection to '/dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_98:A3:16:8E:88:B4-if00' (baudrate=460800, xonxoff=False, rtscts=False)
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] DEBUG Configuring serial port '/dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_98:A3:16:8E:88:B4-if00'
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] 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']]
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] DEBUG Setting low latency mode: True
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] DEBUG Setting modem pins: ModemPins[!dtr !rts]
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] DEBUG TIOCMBIC: 0x00000006
2025-12-17 20:12:41 homeassistant zigpy.serial[227] DEBUG Connection made: <serialx.platforms.serial_posix.PosixSerialTransport object at 0x7f93f1e73990>
2025-12-17 20:12:41 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending frame SpinelFrame(header=SpinelHeader(transaction_id=0, network_link_id=0, flag=2), command_id=<CommandID.RESET: 1>, data=b'\x02')
2025-12-17 20:12:41 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending data b'~\x80\x01\x02\xea\xf0~'
2025-12-17 20:12:41 homeassistant serialx.descriptor_transport[227] DEBUG Immediately writing b'~\x80\x01\x02\xea\xf0~'
2025-12-17 20:12:41 homeassistant serialx.descriptor_transport[227] DEBUG Sent 7 of 7 bytes
2025-12-17 20:12:43 homeassistant universal_silabs_flasher.spinel[227] DEBUG Device did not respond to reset, continuing
2025-12-17 20:12:43 homeassistant universal_silabs_flasher.spinel[227] 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')
2025-12-17 20:12:43 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:43 homeassistant serialx.descriptor_transport[227] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:43 homeassistant serialx.descriptor_transport[227] DEBUG Sent 7 of 7 bytes
2025-12-17 20:12:45 homeassistant universal_silabs_flasher.spinel[227] 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)
2025-12-17 20:12:46 homeassistant universal_silabs_flasher.spinel[227] 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')
2025-12-17 20:12:46 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:46 homeassistant serialx.descriptor_transport[227] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:46 homeassistant serialx.descriptor_transport[227] DEBUG Sent 7 of 7 bytes
2025-12-17 20:12:48 homeassistant universal_silabs_flasher.spinel[227] 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)
2025-12-17 20:12:48 homeassistant universal_silabs_flasher.spinel[227] 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')
2025-12-17 20:12:48 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:48 homeassistant serialx.descriptor_transport[227] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:48 homeassistant serialx.descriptor_transport[227] DEBUG Sent 7 of 7 bytes
2025-12-17 20:12:50 homeassistant universal_silabs_flasher.spinel[227] 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)
2025-12-17 20:12:50 homeassistant serialx.descriptor_transport[227] DEBUG Closing at the request of the application
2025-12-17 20:12:50 homeassistant zigpy.serial[227] DEBUG Waiting for serial port to close
2025-12-17 20:12:50 homeassistant serialx.descriptor_transport[227] DEBUG Closing connection: None
2025-12-17 20:12:50 homeassistant serialx.descriptor_transport[227] DEBUG Closing file descriptor 7
2025-12-17 20:12:50 homeassistant serialx.descriptor_transport[227] DEBUG Calling protocol `connection_lost` with exc=None
2025-12-17 20:12:50 homeassistant zigpy.serial[227] 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
[20:12:50] WARNING: otbr-agent exited with code 1 (by signal 0).
Chain OTBR_FORWARD_INGRESS (0 references)

@RealMadEvil
Copy link

I've been at this same thing for hours now. I've got the esp32c6 flashed with the USB-RCP option selected, but all I get when I plug it into my server are spinelFrame errors until it closes OTBR back down. T-T

--

Logs from OTBR in Homeassistant if anyone got a moment to check them out:

 [20:12:38] INFO: The otbr-web is disabled.
s6-rc: info: service mdns: starting
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service mdns successfully started
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
[20:12:39] INFO: Starting mDNS Responder...
Default: mDNSResponder (Engineering Build) (Dec 15 2025 09:14:53) starting
-----------------------------------------------------------
 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.1  (amd64 / generic-x86-64)
 Home Assistant Core: 2025.9.0
 Home Assistant Supervisor: 2025.12.3
-----------------------------------------------------------
 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
[20:12:41] INFO: Setup OTBR firewall...
[20:12:41] INFO: Migrating OTBR settings if needed...
2025-12-17 20:12:41 homeassistant asyncio[227] DEBUG Using selector: EpollSelector
2025-12-17 20:12:41 homeassistant zigpy.serial[227] DEBUG Opening a serial connection to '/dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_98:A3:16:8E:88:B4-if00' (baudrate=460800, xonxoff=False, rtscts=False)
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] DEBUG Configuring serial port '/dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_98:A3:16:8E:88:B4-if00'
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] 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']]
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] DEBUG Setting low latency mode: True
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] DEBUG Setting modem pins: ModemPins[!dtr !rts]
2025-12-17 20:12:41 homeassistant serialx.platforms.serial_posix[227] DEBUG TIOCMBIC: 0x00000006
2025-12-17 20:12:41 homeassistant zigpy.serial[227] DEBUG Connection made: <serialx.platforms.serial_posix.PosixSerialTransport object at 0x7f93f1e73990>
2025-12-17 20:12:41 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending frame SpinelFrame(header=SpinelHeader(transaction_id=0, network_link_id=0, flag=2), command_id=<CommandID.RESET: 1>, data=b'\x02')
2025-12-17 20:12:41 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending data b'~\x80\x01\x02\xea\xf0~'
2025-12-17 20:12:41 homeassistant serialx.descriptor_transport[227] DEBUG Immediately writing b'~\x80\x01\x02\xea\xf0~'
2025-12-17 20:12:41 homeassistant serialx.descriptor_transport[227] DEBUG Sent 7 of 7 bytes
2025-12-17 20:12:43 homeassistant universal_silabs_flasher.spinel[227] DEBUG Device did not respond to reset, continuing
2025-12-17 20:12:43 homeassistant universal_silabs_flasher.spinel[227] 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')
2025-12-17 20:12:43 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:43 homeassistant serialx.descriptor_transport[227] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:43 homeassistant serialx.descriptor_transport[227] DEBUG Sent 7 of 7 bytes
2025-12-17 20:12:45 homeassistant universal_silabs_flasher.spinel[227] 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)
2025-12-17 20:12:46 homeassistant universal_silabs_flasher.spinel[227] 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')
2025-12-17 20:12:46 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:46 homeassistant serialx.descriptor_transport[227] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:46 homeassistant serialx.descriptor_transport[227] DEBUG Sent 7 of 7 bytes
2025-12-17 20:12:48 homeassistant universal_silabs_flasher.spinel[227] 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)
2025-12-17 20:12:48 homeassistant universal_silabs_flasher.spinel[227] 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')
2025-12-17 20:12:48 homeassistant universal_silabs_flasher.spinel[227] DEBUG Sending data b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:48 homeassistant serialx.descriptor_transport[227] DEBUG Immediately writing b'~\x83\x02\x08\xbc\x9a~'
2025-12-17 20:12:48 homeassistant serialx.descriptor_transport[227] DEBUG Sent 7 of 7 bytes
2025-12-17 20:12:50 homeassistant universal_silabs_flasher.spinel[227] 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)
2025-12-17 20:12:50 homeassistant serialx.descriptor_transport[227] DEBUG Closing at the request of the application
2025-12-17 20:12:50 homeassistant zigpy.serial[227] DEBUG Waiting for serial port to close
2025-12-17 20:12:50 homeassistant serialx.descriptor_transport[227] DEBUG Closing connection: None
2025-12-17 20:12:50 homeassistant serialx.descriptor_transport[227] DEBUG Closing file descriptor 7
2025-12-17 20:12:50 homeassistant serialx.descriptor_transport[227] DEBUG Calling protocol `connection_lost` with exc=None
2025-12-17 20:12:50 homeassistant zigpy.serial[227] 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
[20:12:50] WARNING: otbr-agent exited with code 1 (by signal 0).
Chain OTBR_FORWARD_INGRESS (0 references)

same for me

@RealMadEvil
Copy link

I'm filled with equal amounts of gratefulness and exasperation after one day spent troubleshooting.

Dude, thank you so much for this gist, I wouldn't be able to get started without it. But it's not enough.

I'm pretty sure with the hardware setup you were using the steps here were sufficient, but in my case it simply wasn't. I'm using nothing but a single cheap ESP32-C6 SuperMini board connected to my Pi 5 running HA over the board's single USB-C port. No matter what I did the HA OTBR container wouldn't be able to receive packets from the ESP32-C6 board even though the serial link established fine.

I'm planning a comprehensive writeup soon, but let me just drop here what I did for it to work:

* Apply the cherry pick you mentioned above, directly after cloning. For people who aren't proficient in git like me, you need to run `git cherry-pick --continue` right after the cherry pick command to complete the operation.

* You must use the `menuconfig` mentioned above, it's not optional. First run `export TERM=xterm` and then open it with `idf.py menuconfig`. Then go to `Component config → OpenThread → OpenThread → Thread Core Features → Thread Radio Co-Processor Feature → The RCP transport type` and select USB as the transport type.

* In the OTBR addon configuration settings you shouldn't select the port labeled as `/dev/ttyAMA..`. You should select the one labeled as `/dev/serial/by-id/USB_Espressif_USB_JTAG...`. Alternatively you can edit it as yaml to select the `/dev/ttyACM0` port but that doesn't show up in the UI.

I still didn't hook up a Thread sensor. I'll update this when I do to see whether it was ultimately successful.

thx m8, works for me as well

@rayanamal
Copy link

rayanamal commented Dec 18, 2025

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