SkyConnect - silabs multiprotocol and docker

The upcoming release of HA also activates the multi-pan feature again. I have a SkyConnect stick but my main HA installation is running in a docker container.
I have setup a small HA test system on a Raspberry with HA OS and there the silabs multiprotocol addon is available. So I activated it, the firmware was upgraded and voila - I have a thread enabled border router.
I would like to achieve the same on my main docker system but of course the addon is not available. But I have found a docker container from silabs which is even their recommended way to setup the whole stack. Is there any chance to use that from HA?
What I am primarily looking for is Thread (+Matter) as I am already running Zigbee via zigbee2mqtt which is integrated into HA as well.

7 Likes

I’m interested in this solution, should it be possible, myself. I want to clarify that I haven’t tried anything yet (just received my SkyConnect), and have been actively researching solutions and trying to determine the pros and cons.

I found the same Silabs docker container you referenced (https://hub.docker.com/r/siliconlabsinc/multiprotocol) with no documentation specific to the container itself, that I could find.

I also found the docker file that underpins the HA add-on you referenced (https://github.com/home-assistant/addons/tree/master/silabs-multiprotocol). This appears to be (at least conceptually) based on the official Silabs image (as far as the list of services that end up running), possibly with some changes made to make it play with HA a little better. I haven’t really delved into the details just yet.

From what I can gather, we have a couple of challenges here:

  1. Flashing the actual USB stick to the Multiprotocol firmware that underpins this whole concept. There appear to be a couple of ways to achieve this (Manually, or by “(mis)using” the HA container itself).
  2. Figuring out which container (or containers) to run to be able to take advantage of Zigbee and Thread. From what I can gather, the gist of these containers is to run the “cpcd” (Co-processor communication daemon). That daemon can then communicate with a Zigbee daemon, and an OpenThreadBorderRouter agent. From there, you can connect to Zigbeed with ZHA (and possibly with Zigbee2MQTT, if it supports a socket as its data source. I haven’t researched that). Similarly, there is an OTBR Web service that communicates with the OTBR Agent via a unix socket to provide a front-end. In the official Addon, access to this UI is just passed-through it seems. Reading through the Silabs documentation (here) shows the same overall idea, but it looks like they may be using different services for the zigbee daemon (although I’m not informed enough about these librarys/services to say that with any confidence).

What I don’t understand is how HA interfaces in any way with the OTBR portion of this stack.
Edit: If I understand correctly, thread is dependent on ipv6 which is going to present its own set of challenges since we’re running HA inside of a container. Docker technically has support, but there appear to be some trade-offs, so I’m still investigating this part.

Anyway, I apologize if any of this is misinformed, or rambling. I’m sure discussion will pick up sooner than later about this, as people get their SkyConnects and all that. As for me, I think I’m going to proceed with attempting to flash the multiprotocol firmware via my existing HA container, and then see if I can get the “official” docker container up and running on its own.

I hope more knowledgable people see this thread and continue to contribute and share their findings.

4 Likes

At this stage, the Multi-PAN module is software driven, using the same IEEE number on the radio.

What I would do, if you want a Thread radio, is wait for the dedicated Thread Firmware to be released and run Zigbee on a known good coordinator you already have and run dedicated Thread on the SkyConnect.
I have had issues with the SkyConnect and ZHA in Home Assistant, and there are some reports that in Multi-PAN mode it really doesn’t perform well, which I would expect as the radio will be time shared between Thread and Zigbee.

Honestly, there are not that many Thread devices at the moment and the ones out there can run via another borderrouter and be accessible in Home Assistant. I would just wait for the dedicated Thread firmware for the Sky Connect.

I have tried to run the Silabs docker container you referenced (https://hub.docker.com/r/siliconlabsinc/multiprotocol ) with the help of the run.sh script available here gecko_sdk/app/host/multiprotocol/zigbeed/multiprotocol-container at gsdk_4.2 · SiliconLabs/gecko_sdk · GitHub.

What I successfully do by now is :

  • Flash the Skyconnect dongle with python -m universal_silabs_flasher --device /dev/serial/by-id/usb-Nabu_Casa_SkyConnect_v1.0_d6f52411b414ed11824dbe8be054580b-if00-port0 flash --allow-cross-flashing --firmware silabs-firmware/RCPMultiPAN/beta/NabuCasa_SkyConnect_RCP_v4.2.1_rcp-uart-hw-802154_115200.gbl

  • Start the silabs container using ./run.sh -c cpcd.conf -X with the following cpcd.conf

# Instance Name
# Optional, defaults to "cpcd_0"
# This string uniquely identifies the running cpcd instance.
# An application must pass this value to cpc_init() to connect
# to this particular instance.
instance_name: cpcd_0

# Bus type selection
# Mandatory
# Allowed values : UART or SPI
bus_type: UART

# SPI device file
# Mandatory if spi chosen, ignored if uart chosen
spi_device_file: /dev/spidev0.0

# SPI CS gpio
# Chip select gpio selection
spi_cs_gpio: 8

# SPI RX IRQ gpio
# RX interrupt gpio selection
spi_rx_irq_gpio: 22

# SPI bitrate.
# Optional if spi chosen, ignored if uart chosen. Defaults to 1000000
spi_device_bitrate: 1000000

# SPI Mode.
# Optional if spi chosen, ignored if uart chosen. Defaults to SPI_MODE_0
spi_device_mode: SPI_MODE_0

# UART device file
# Mandatory if uart chosen, ignored if spi chosen
uart_device_file: /dev/ttyUSB0 
#/dev/serial/by-id/usb-Nabu_Casa_SkyConnect_v1.0_d6f52411b414ed11824dbe8be054580b-if00-port0

# UART baud rate.
# Optional if uart chosen, ignored if spi chosen. Defaults to 115200
# Allowed values : standard UART baud rates listed in 'termios.h'
uart_device_baud: 115200

# UART flow control.
# Optional if uart chosen, ignored if spi chosen. Defaults to 'true'
# Allowed values are 'true' or 'false'
uart_hardflow: true

# BOOTLOADER Recovery Pins Enabled
# Set to true to enter bootloader via wake and reset pins
# If true, SPI_WAKE_GPIO and SPI_RESET_GPIO must be configured
bootloader_recovery_pins_enabled: false

# BOOTLOADER WAKE gpio
# Wakeup gpio used by the bootloader
# Ensure BOOTLOADER_RECOVERY_PINS_ENABLED=true to use this pin
bootloader_wake_gpio: 24

# BOOTLOADER RESET gpio
# Reset pin
# Ensure BOOTLOADER_RECOVERY_PINS_ENABLED=true to use this pin
bootloader_reset_gpio: 23

# Prints tracing information to stdout
# Optional, defaults to 'false'
# Allowed values are 'true' or 'false'
stdout_trace: true

# Prints tracing information to a file located under traces_folder
# Optional, defaults to 'false'
# Allowed values are 'true' or 'false'
trace_to_file: false

# Traces folder
# Optional, defaults to '/dev/shm/cpcd-traces'
# Folder mounted on a tmpfs is preferred
traces_folder: /dev/shm/cpcd-traces

# Enable frame trace
# Optional, defaults to 'false'
# Allowed values are 'true' or 'false'
enable_frame_trace: true

# Number of open file descriptors.
# Optional, defaults to 2000
# If the error 'Too many open files' occurs, this is the value to increase.
rlimit_nofile: 2000

# Disable the encryption over CPC endpoints
# Optional, defaults false
disable_encryption: true

# Binding key file
# Mandatory when security is used
# Must have 32 alphanumeric characters as the first line, representing a 128 bit binding key
# If ECDH encryption is used, this file will be created during the binding process
#binding_key_file: /etc/binding-key.key
  • Check that cpcd starts correctly with docker exec -it multiprotocol journalctl -fexu cpcd
Mar 07 17:18:07 nervousbox systemd[1]: Started Cpcd service.
â–‘â–‘ Subject: A start job for unit cpcd.service has finished successfully
â–‘â–‘ Defined-By: systemd
â–‘â–‘ Support: http://www.ubuntu.com/support
â–‘â–‘ 
â–‘â–‘ A start job for unit cpcd.service has finished successfully.
â–‘â–‘ 
â–‘â–‘ The job identifier is 79.
Mar 07 17:18:07 nervousbox cpcd[74]: WARNING in function 'main' in file /opt/gsdk/cpc-github/cpc/daemon/main.c at line #188 : Running CPCd as 'root' is not recommended. Proceed at your own risk.
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:114941] Info : [CPCd v4.2.1.0] [Library API v3] [RCP Protocol v3]
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:115268] Info : Git commit: GITDIR-NOTFOUND / branch: GITDIR-NOTFOUND
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:115336] Info : Sources hash: b9230e12523e6d866ccc1a16a21396ed13320979c8a40c5d6fd834075e532aa7
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:115404] WARNING : In function 'main' in file /opt/gsdk/cpc-github/cpc/daemon/main.c at line #188 : Running CPCd as 'root' is not recommended. Proceed at your own risk.
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:119498] Info : Reading cli arguments
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:119617] Info : /usr/local/bin/cpcd
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125034] Info : Reading configuration
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125151] Info : file_path = /usr/local/etc/cpcd.conf
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125214] Info : instance_name = cpcd_0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125273] Info : socket_folder = /dev/shm
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125332] Info : operation_mode = MODE_NORMAL
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125391] Info : use_encryption = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125448] Info : binding_key_file = /root/.cpcd/binding.key
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125506] Info : binding_key_override = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125577] Info : binding_method =
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125635] Info : stdout_tracing = true
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125693] Info : file_tracing = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125749] Info : lttng_tracing = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125806] Info : enable_frame_trace = true
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125870] Info : traces_folder = /dev/shm/cpcd-traces
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125927] Info : bus = UART
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:125990] Info : uart_baudrate = 115200
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126048] Info : uart_hardflow = true
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126106] Info : uart_file = /dev/ttyUSB0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126162] Info : spi_file = /dev/spidev0.0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126219] Info : spi_bitrate = 1000000
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126276] Info : spi_mode = SPI_MODE_0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126331] Info : spi_bit_per_word = 8
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126388] Info : spi_cs_chip = gpiochip0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126456] Info : spi_cs_pin = 8
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126514] Info : spi_irq_chip = gpiochip0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126570] Info : spi_irq_pin = 22
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126626] Info : fu_reset_chip = gpiochip0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126682] Info : fu_spi_reset_pin = 23
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126738] Info : fu_wake_chip = gpiochip0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126794] Info : fu_spi_wake_pin = 24
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126850] Info : fu_recovery_enabled = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126906] Info : fu_connect_to_bootloader = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:126995] Info : fu_enter_bootloader = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127053] Info : fu_file =
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127122] Info : restart_cpcd = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127180] Info : board_controller_ip_addr =
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127238] Info : application_version_validation = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127294] Info : print_secondary_versions_and_exit = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127363] Info : use_noop_keep_alive = false
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127420] Info : reset_sequence = true
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127476] Info : uart_validation_test_option =
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127531] Info : stats_interval = 0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127587] Info : rlimit_nofile = 2000
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127645] Info : ENCRYPTION IS DISABLED 
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:127700] Info : Starting daemon in normal mode
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:142279] Driver : Opening uart file /dev/ttyUSB0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:142397] Driver : Init done
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:142743] Core : Changing ep#0 state from SL_CPC_STATE_CLOSED to SL_CPC_STATE_OPEN
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:142873] Core : open ep #0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:142994] Server : Creating socket folder /dev/shm/cpcd/cpcd_0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:145199] Driver : Receiver thread start
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:145752] Info : Connecting to Secondary...
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:146129] Core : Pushed frame to driver : 14:00:0E:00:C4:95:0F:03:00:08:00:02:02:00:00:00:00:00:00:91:A0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:146247] Core : txd transmit completed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:146321] Core : Endpoint #0: frame transmit submitted
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:146381] System : Submitted command_id #3 command_seq #0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:146535] System : property-set (id #3) sent with property #514
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:146600] Reset Sequence : Reboot mode sent
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:146954] Driver : Transmitter thread start
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:147410] Driver : 21 bytes left in the UART char driver
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:153852] Driver : re-sync : Will test 15 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:153988] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:154094] Driver : Frame delimiter : push delimited frame to core : 14:00:0E:00:C4:95:0F:06:00:08:00:02:02:00:00:00:00:00:00:30:AE
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:156041] Core : rxd frame : 14:00:0E:00:C4:95:0F:06:00:08:00:02:02:00:00:00:00:00:00:30:AE
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:156376] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:156456] System : Processing command seq#0 of type 3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:156643] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:156709] Core : rxd uframe with valid header checksum
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:156791] Core : Pushed frame to driver : 14:00:06:00:C4:34:A6:01:01:00:00:84:41
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:156927] Core : txd transmit completed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:156990] Core : Endpoint #0: frame transmit submitted
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:157049] System : Submitted command_id #1 command_seq #1
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:157219] System : reset (id #1) sent
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:157282] Reset Sequence : Reboot mode reply received, reset request sent
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:157775] Driver : 13 bytes left in the UART char driver
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:164112] Driver : re-sync : Will test 11 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:164359] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:164433] Driver : Frame delimiter : push delimited frame to core : 14:00:0A:00:C4:55:D3:01:01:04:00:00:00:00:00:13:F9
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:164707] Core : rxd frame : 14:00:0A:00:C4:55:D3:01:01:04:00:00:00:00:00:13:F9
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:164802] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:164878] System : Processing command seq#1 of type 3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:165037] System : on_final_reset()
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:165114] Reset Sequence : Reset request response received : 0
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:165177] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:165237] Core : rxd uframe with valid header checksum
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:165296] Reset Sequence : Reset request acknowledged
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:231767] Driver : re-sync : Will test 15 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:231896] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:231962] Driver : Frame delimiter : push delimited frame to core : 14:00:0E:00:C0:11:4F:06:00:08:00:00:00:00:00:77:00:00:00:2D:52
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232339] Core : rxd frame : 14:00:0E:00:C0:11:4F:06:00:08:00:00:00:00:00:77:00:00:00:2D:52
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232505] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232585] System : Unsolicited uframe received
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232647] Reset Sequence : Received reset reason : 119
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232713] Reset Sequence : Reset sequence: 3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232772] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232831] Core : rxd uframe with valid header checksum
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232891] Reset Sequence : Waiting for reset reason
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:232948] Reset Sequence : Reset reason received
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:233027] Core : Pushed frame to driver : 14:00:0A:00:C4:55:D3:02:02:04:00:20:00:00:00:AA:DE
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:233159] Core : txd transmit completed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:233236] Core : Endpoint #0: frame transmit submitted
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:233298] System : Submitted command_id #2 command_seq #2
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:233454] System : property-get (id #2) sent with property #32
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:233456] Driver : 17 bytes left in the UART char driver
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:239793] Driver : re-sync : Will test 13 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:239953] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:240021] Driver : Frame delimiter : push delimited frame to core : 14:00:0C:00:C4:F5:61:06:02:06:00:20:00:00:00:00:01:3A:10
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:240383] Core : rxd frame : 14:00:0C:00:C4:F5:61:06:02:06:00:20:00:00:00:00:01:3A:10
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:240521] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:240589] System : Processing command seq#2 of type 3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:240759] Reset Sequence : Received RX capability of 256 bytes
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:240825] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:240884] Core : rxd uframe with valid header checksum
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:240945] Reset Sequence : Obtained RX capability
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:241002] Info : Connected to Secondary
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:241087] Core : Pushed frame to driver : 14:00:0A:00:C4:55:D3:02:03:04:00:01:00:00:00:31:27
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:241243] Core : txd transmit completed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:241309] Core : Endpoint #0: frame transmit submitted
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:241370] System : Submitted command_id #2 command_seq #3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:241540] System : property-get (id #2) sent with property #1
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:241795] Driver : 17 bytes left in the UART char driver
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:249306] Driver : re-sync : Will test 12 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:249500] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:249568] Driver : Frame delimiter : push delimited frame to core : 14:00:0B:00:C4:65:E4:06:03:05:00:01:00:00:00:03:68:71
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:249880] Core : rxd frame : 14:00:0B:00:C4:65:E4:06:03:05:00:01:00:00:00:03:68:71
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:249978] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250044] System : Processing command seq#3 of type 3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250205] Info : Secondary Protocol v3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250270] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250381] Core : rxd uframe with valid header checksum
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250445] Reset Sequence : Obtained Protocol version
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250579] Core : Pushed frame to driver : 14:00:0A:00:C4:55:D3:02:04:04:00:02:00:00:00:A9:A5
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250696] Core : txd transmit completed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250777] Core : Endpoint #0: frame transmit submitted
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250838] System : Submitted command_id #2 command_seq #4
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:250987] System : property-get (id #2) sent with property #2
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:251028] Driver : 17 bytes left in the UART char driver
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:257166] Driver : re-sync : Will test 15 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:257287] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:257350] Driver : Frame delimiter : push delimited frame to core : 14:00:0E:00:C4:95:0F:06:04:08:00:02:00:00:00:08:00:00:00:57:1A
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:257628] Core : rxd frame : 14:00:0E:00:C4:95:0F:06:04:08:00:02:00:00:00:08:00:00:00:57:1A
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:257722] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:257791] System : Processing command seq#4 of type 3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:257960] Reset Sequence : Received capability : UART flow control
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258024] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258091] Core : rxd uframe with valid header checksum
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258151] Reset Sequence : Obtained Capabilites
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258236] Core : Pushed frame to driver : 14:00:0A:00:C4:55:D3:02:05:04:00:03:00:00:00:7C:6B
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258344] Core : txd transmit completed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258405] Core : Endpoint #0: frame transmit submitted
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258465] System : Submitted command_id #2 command_seq #5
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258626] System : property-get (id #2) sent with property #3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:258571] Driver : 17 bytes left in the UART char driver
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266047] Driver : re-sync : Will test 23 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266175] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266240] Driver : Frame delimiter : push delimited frame to core : 14:00:16:00:C4:57:E5:06:05:10:00:03:00:00:00:04:00:00:00:02:00:00:00:01:00:00:00:DE:C5
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266519] Core : rxd frame : 14:00:16:00:C4:57:E5:06:05:10:00:03:00:00:00:04:00:00:00:02:00:00:00:01:00:00:00:DE:C5
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266613] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266695] System : Processing command seq#5 of type 3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266858] Info : Secondary CPC v4.2.1
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266922] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:266990] Core : rxd uframe with valid header checksum
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:267051] Reset Sequence : Obtained Secondary CPC version
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:267137] Core : Pushed frame to driver : 14:00:0A:00:C4:55:D3:02:06:04:00:40:00:00:00:BE:46
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:267245] Core : txd transmit completed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:267307] Core : Endpoint #0: frame transmit submitted
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:267367] System : Submitted command_id #2 command_seq #6
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:267480] Driver : 17 bytes left in the UART char driver
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:267547] System : property-get (id #2) sent with property #64
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:273675] Driver : re-sync : Will test 15 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:273822] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:273886] Driver : Frame delimiter : push delimited frame to core : 14:00:0E:00:C4:95:0F:06:06:08:00:40:00:00:00:00:C2:01:00:F7:3D
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274167] Core : rxd frame : 14:00:0E:00:C4:95:0F:06:06:08:00:40:00:00:00:00:C2:01:00:F7:3D
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274271] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274338] System : Processing command seq#6 of type 3
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274490] Info : Secondary bus speed is 115200
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274608] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274673] Core : rxd uframe with valid header checksum
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274807] Core : Pushed frame to driver : 14:00:0A:00:C4:55:D3:02:07:04:00:04:00:00:00:B2:5A
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274917] Core : txd transmit completed
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:274979] Core : Endpoint #0: frame transmit submitted
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:275040] System : Submitted command_id #2 command_seq #7
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:275162] Driver : 17 bytes left in the UART char driver
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:275195] System : property-get (id #2) sent with property #4
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:282579] Driver : re-sync : Will test 21 header combination
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:282716] Driver : re-sync : The start of the buffer is aligned with a good header
Mar 07 17:18:07 nervousbox cpcd[74]: [17:18:07:282781] Driver : Frame delimiter : push delimited frame to core : 14:00:14:00:C4:37:8B:06:07:0E:00:04:00:00:00:55:4E:44:45:46:49:4E:45:44:00:03:AE
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:283082] Core : rxd frame : 14:00:14:00:C4:37:8B:06:07:0E:00:04:00:00:00:55:4E:44:45:46:49:4E:45:44:00:03:AE
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:283173] Core : Endpoint #0: rxd unnumbered frame
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:283243] System : Processing command seq#7 of type 3
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:283392] Info : Secondary APP vUNDEFINED
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:283509] Core : Endpoint #0: unnumbered frame processed
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:283571] Core : rxd uframe with valid header checksum
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:283682] Reset Sequence : Obtained Secondary APP version
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:284089] Security : Encryption is disabled
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:284199] Core : Security changed state: 0 -> 1
Mar 07 17:18:08 nervousbox cpcd[74]: [17:18:07:284326] Info : Daemon startup was successful. Waiting for client connections
  • Start zigbeed with ./run.sh -Z
Starting zigbeed...
Checking zigbeed status...
Mar 07 17:19:46 nervousbox zigbeed[135]: RCP version: SL-OPENTHREAD/2.2.1.0_GitHub-91fa1f455; EFR32; Feb  7 2023 21:37:09
Starting Z3Gateway...
Reset info: 11 (SOFTWARE)
ezsp ver 0x0A stack type 0x02 stack ver. [7.2.1 GA build 0]
Ezsp Config: set address table size to 0x0002:Success: set
Ezsp Config: set TC addr cache to 0x0002:Success: set
Ezsp Config: set MAC indirect TX timeout to 0x1E00:Success: set
Ezsp Config: set max hops to 0x001E:Success: set
Ezsp Config: set tx power mode to 0x8000:Success: set
Ezsp Config: set supported networks to 0x0001:Success: set
Ezsp Config: set stack profile to 0x0002:Success: set
Ezsp Config: set security level to 0x0005:Success: set
Ezsp Value : set end device keep alive support mode to 0x00000003:Success: set
Ezsp Policy: set binding modify to "allow for valid endpoints & clusters only":Success: set
Ezsp Policy: set message content in msgSent to "return":Success: set
Ezsp Value : set maximum incoming transfer size to 0x00000052:Success: set
Ezsp Value : set maximum outgoing transfer size to 0x00000052:Success: set
Ezsp Config: set binding table size to 0x0002:Success: set
Ezsp Config: set key table size to 0x0004:Success: set
Ezsp Config: set max end device children to 0x0006:Success: set
Ezsp Config: set aps unicast message count to 0x000A:Success: set
Ezsp Config: set broadcast table size to 0x000F:Success: set
Ezsp Config: set neighbor table size to 0x0010:Success: set
NCP supports maxing out packet buffers
Ezsp Config: set packet buffers to 255
Ezsp Config: set end device poll timeout to 0x0008:Success: set
Ezsp Config: set zll group addresses to 0x0000:Success: set
Ezsp Config: set zll rssi threshold to 0xFFD8:Success: set
Ezsp Config: set transient key timeout to 0x012C:Success: set
Ezsp Endpoint 1 added, profile 0x0104, in clusters: 8, out clusters 17
Ezsp Endpoint 242 added, profile 0xA1E0, in clusters: 0, out clusters 1
Starting identifying on endpoint 0x01, identify time is 0 sec
Stopping identifying on endpoint 0x01
No endpoints identifying; stopping identification feedback.
Found 0 files

Z3Gateway>

zigbeed-socat started too (but I think that the link must be done via tcp not device)

docker exec -it multiprotocol systemctl status zigbeed-socat.service
â—Ź zigbeed-socat.service - Zigbeed socat helper service
     Loaded: loaded (/etc/systemd/system/zigbeed-socat.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-03-07 17:19:43 UTC; 29s ago
   Main PID: 134 (socat)
      Tasks: 1 (limit: 116)
        CPU: 130ms
     CGroup: /system.slice/zigbeed-socat.service
             └─134 /usr/bin/socat -v pty,link=/dev/ttyZigbeeNCP pty,link=/tmp/ttyZigbeeNCP

Mar 07 17:19:53 nervousbox zigbeed-socat[134]: ...~fl!.r*..~< 2023/03/07 17:19:53.752683  length=17 from=541 to=557

  • Start otbr web and agent with ./run.sh -T
Cleaning up stale OTBR firewall rules. Ignore errors...
Starting OTBR...
Starting ot-ctl...
(If errors persist, run 'journalctl -fex' inside container for logs.)
Press ENTER for prompt...

> 

It appears to be correctly started

Mar 07 17:20:42 nervousbox systemd[1]: Starting LSB: thread border agent...
â–‘â–‘ Subject: A start job for unit otbr-agent.service has begun execution
â–‘â–‘ Defined-By: systemd
â–‘â–‘ Support: http://www.ubuntu.com/support
â–‘â–‘ 
â–‘â–‘ A start job for unit otbr-agent.service has begun execution.
â–‘â–‘ 
â–‘â–‘ The job identifier is 365.
Mar 07 17:20:43 nervousbox otbr-agent[279]:  * Starting thread border agent otbr-agent
Mar 07 17:20:43 nervousbox otbr-agent[279]:    ...done.
Mar 07 17:20:43 nervousbox systemd[1]: Started LSB: thread border agent.
â–‘â–‘ Subject: A start job for unit otbr-agent.service has finished successfully
â–‘â–‘ Defined-By: systemd
â–‘â–‘ Support: http://www.ubuntu.com/support
â–‘â–‘ 
â–‘â–‘ A start job for unit otbr-agent.service has finished successfully.
â–‘â–‘ 
â–‘â–‘ The job identifier is 365.
Mar 07 17:20:43 nervousbox otbr-agent[285]: [NOTE]-AGENT---: Backbone interface: eth0
Mar 07 17:20:43 nervousbox otbr-agent[285]: [NOTE]-AGENT---: Running 0.3.0
Mar 07 17:20:43 nervousbox otbr-agent[285]: [NOTE]-AGENT---: Thread version: 1.3.0
Mar 07 17:20:43 nervousbox otbr-agent[285]: [NOTE]-AGENT---: Thread interface: wpan0
Mar 07 17:20:43 nervousbox otbr-agent[285]: [NOTE]-AGENT---: Radio URL: spinel+cpc://cpcd_0?iid=2
Mar 07 17:20:43 nervousbox otbr-agent[285]: [NOTE]-ILS-----: Infra link selected: eth0
Mar 07 17:20:43 nervousbox otbr-agent[285]: [INFO]-NCP-----: OpenThread log level changed to 5
Mar 07 17:20:43 nervousbox otbr-agent[285]: 50d.01:23:20.326 [C] Platform------: mCpcBusSpeed = 115200
Mar 07 17:20:43 nervousbox otbr-agent[285]: 50d.01:23:20.328 [I] Platform------: RCP reset: RESET_SOFTWARE
Mar 07 17:20:43 nervousbox otbr-agent[285]: 50d.01:23:20.329 [D] Platform------: Wait response: tid=0 key=0
Mar 07 17:20:45 nervousbox otbr-agent[285]: 50d.01:23:22.354 [D] Platform------: Spinel send: cmd:PROP_VALUE_GET: prop:PROTOCOL_VERSION, iid:02, tid:01

I can access to the web ui and create a network.

  • After all I have these services running
             ├─cpcd.service 
             │ └─79 /usr/local/bin/cpcd
             ├─systemd-udevd.service 
             │ └─38 /lib/systemd/systemd-udevd
             ├─zigbeed-socat.service 
             │ └─132 /usr/bin/socat -v pty,link=/dev/ttyZigbeeNCP pty,link=/tmp/ttyZigbeeNCP
             ├─otbr-web.service 
             │ └─268 /usr/sbin/otbr-web -I wpan0 -d7 -p 80
             ├─networkd-dispatcher.service 
             │ └─89 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
             ├─systemd-journald.service 
             │ └─22 /lib/systemd/systemd-journald
             ├─rsyslog.service 
             │ └─91 /usr/sbin/rsyslogd -n -iNONE
             ├─zigbeed.service 
             │ └─133 /usr/local/bin/zigbeed
             ├─systemd-resolved.service 
             │ └─76 /lib/systemd/systemd-resolved
             ├─otbr-agent.service 
             │ └─278 /usr/sbin/otbr-agent -I wpan0 -B eth0 -d7 spinel+cpc://cpcd_0?iid=2
             ├─dbus.service 
             │ └─80 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
             ├─system-getty.slice 
             │ └─[email protected] 
             │   └─100 /sbin/agetty -o -p -- \u --noclear tty1 linux
             ├─mdns.service 
             │ └─92 /usr/sbin/mdnsd
             ├─avahi-daemon.service 
             │ ├─78 avahi-daemon: running [nervousbox.local]
             │ └─95 avahi-daemon: chroot helper
             └─systemd-logind.service 
               └─93 /lib/systemd/systemd-logind

All seems to be working but I can’t find out how to :

  • add zigbee device to zigbee2mqtt (socat not in tcp mode but in device mode and get permission denied when trying to access the ttyZigbeeNCP created)

  • add the otbr to thread or otbr integration

1 Like

EDIT: I manage to redirect ttyZigbeeNCP to tcp port with ser2net as described here Connect to a remote adapter | Zigbee2MQTT
When I run zigbee2mqtt I think it is blocked in an init loop and the tcp traffic is as follow

âžś  homeassistant sudo tcpflow -i any -C -J port 20108
reportfilename: ./report.xml
tcpflow: listening on any

{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":42046,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":42046,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"172.19.0.3","src_port":42046,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"172.19.0.3","src_port":42046,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":48082,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":48082,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"172.19.0.3","src_port":48082,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"172.19.0.3","src_port":48082,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":48086,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":48086,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"172.19.0.3","src_port":48086,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"172.19.0.3","src_port":48086,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":48090,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":48090,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"172.19.0.3","src_port":48090,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"172.19.0.3","src_port":48090,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":45972,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":45972,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"172.19.0.3","src_port":45972,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"172.19.0.3","src_port":45972,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":45978,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"192.168.1.83","src_port":20108,"dst_host":"172.19.0.3","dst_port":45978,"payload": [68,101,118,105,99,101,32,111,112,101,110,32,102,97,105,108,117,114,101,58,32,86,97,108,117,101,32,111,114,32,102,105,108,101,32,110,111,116,32,102,111,117,110,100,13,10]}
{"src_host":"172.19.0.3","src_port":45978,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}
{"src_host":"172.19.0.3","src_port":45978,"dst_host":"192.168.1.83","dst_port":20108,"payload": [26,192,56,188,126]}

EDIT2:

I have all working with the official HA addon image GitHub - home-assistant/addons: Docker add-ons for Home Assistant and this firmware addons/NabuCasa_SkyConnect_RCP_v4.2.1_rcp-uart-hw-802154_115200.gbl at a45c9f9e5e30ffe61948ae10c90dcd16cab5c45f · home-assistant/addons · GitHub.

# Start docker container
docker run -it --name=multipan --entrypoint /bin/bash --privileged --cap-add SYS_ADMIN --cap-add=SYS_ADMIN --cap-add=NET_ADMIN --net=host -v /home/pi/skyconnect/:/usr/local/etc/ homeassistant/aarch64-addon-silabs-multiprotocol:latest

And in the container :

apt-get update

apt-get install nano

# Change device port and some unfilled fields
nano /usr/local/share/cpcd.conf

/usr/local/bin/cpcd &

exec /usr/sbin/mdnsd -debug &

/usr/local/bin/zigbeed --radio-url "spinel+cpc://cpcd_0?iid=1"  --ezsp-listen ::   --ezsp-listen-port 20108 &


"/usr/sbin/otbr-agent" -I "wpan0"  -B "eth0" --rest-listen-address "0.0.0.0:8081" -d7 -v "spinel+cpc://cpcd_0?iid=2" &

exec /usr/sbin/otbr-web -I wpan0 -d6 -p "8086" &

I have adapted commands from run files in each directories here addons/silabs-multiprotocol/rootfs/etc/s6-overlay/s6-rc.d at master · home-assistant/addons · GitHub.

2 Likes

I also got it working on my raspberry, but am still facing some issues.
Did you get it working with the OTBR integration as well?
I’m still having trouble connecting to the REST API. When I navigate to port 8081 in the browser, I get a 404 error.

Yes I have the web ui for otbr, but it is not the 8081 port (which is the one of the boarder router to enter in HA integration).
The port of the web ui is set for me on 8086 as you can see in my last post :slight_smile:

I am doing a new image that will be able to run with docker-compose and environment variables file (with s6-overlay but without bashio).

Web-UI is also working for me on port 8086, but I am talking about connecting home assistant with the otbr via the integration for OTBR ( Open Thread Border Router - Home Assistant (home-assistant.io)).
Connecting to port 8081 (which should be hosting the REST-API), I receive following response:

{
	"ErrorCode":	404,
	"ErrorMessage":	"404 Not Found"
}

If I correctly read the otbr-agent-rest-discovery script, the integration should be setup with port 8081.

I figured it out now, i had to form a thread network via the web-ui and then could connect it via http://IP-ADDRESS:8081

1 Like

Finally got a clean way to set up all this mess haDOCKERaddons/silabs-multiprotocol/dockerCustom at master · nervousapps/haDOCKERaddons · GitHub :space_invader:

3 Likes

After a bit of struggle, I have successfully paired all my nanoleaf essentials bulbs on the thread network created via otbr.

What I needed to do is :

Now I can see the topology of my thread network via the otbr web ui

3 Likes

You should not use those environment variables any more. They were temporary, everything is turned on by default now.

1 Like

I’m getting

 The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
1 Like

@nervousapps @marcokreeft87

I was also having the same issue :

However, I edited the “DockerFile” file to call for :

FROM homeassistant/amd64-addon-silabs-multiprotocol:latest

and had also previously tried editing the docker-compose.yml:

image

I think that it is somewhat working…need to figure out from above posts the other important details.

My USB dongle is running firmware for MultiPan RCP on ZB-GW04 v1.2 @ 230400 Baud
from here: Silabs Firmware Flasher | Web based flasher for ZB-GW04 and ZBDongle-E. MultiPAN RCP firmware enables these devices to be used with Silabs Multiprotocol Addon in Home Assistant. Allow Zigbee and Thread to co-exist on the same dongle. Get ahead of the tech an experiment with Matter!
after reading this post: https://smarthomescene.com/guides/how-to-enable-thread-and-matter-support-on-sonoff-zbdongle-e/#zigbee2mqtt

I did edit the “.env” file to match like so:

# OCPD environment variables
DEVICE="/dev/ttyUSB0"
#MultiPAN RCP - Zigbee + Thread for Silabs Multiprotocol Addon - Baudrate 460800 (230400 for ZB-GW04)
#BAUDRATE="460800"
BAUDRATE="230400"

CPCD_TRACE="true"

#Easyiot ZB-GW04 Revision v1.2 - Hardware flow control
FLOW_CONTROL="true"
NETWORK_DEVICES=0 #"false"

# OTBR-AGENT environment variables
OTBR_ENABLE=1 #true
BACKBONE_IF="eth2"
OTBR_LOG_LEVEL="debug"
OTB_FIREWALL=1 #"true"
OTBR_REST_LISTEN_PORT="8081"

# OTBR-WEB environment variables
OTBR_WEB_PORT="8086"

# SOCAT environment variables
NETWORK_DEVICE=

# ZIGBEED environment variables
EZSP_LISTEN_PORT="20108"

# UNIVERSAL FLASHER variables
#AUTOFLASH_FIRMWARE=1 #"false"
AUTOFLASH FIRMWARE=0 #"false"
# Firmware needs to be in /root
#FIRMWARE="NabuCasa_SkyConnect_RCP_v4.2.3_rcp-uart-hw-802154_460800.gbl"
#FIRMWARE="rcp-uart-802154-v4.2.3-zb-gw04-1v2-230400.gbl"

Please help!
I have “exec /init: exec format error” in the log and it repeats endlessly and neither Zigbee nor Thread work. :sob: :sob: :sob:
I’m not a Docker wizard, so I’d appreciate a step-by-step guide. :roll_eyes: For example, I’m not sure what to do with the rootfs directory? Does it download by itself or do I have to download it and copy it somewhere? :worried:

exec /init: exec format error”

mean you run an arm64 image on another architecture, like amd64

as you can see here
https://registry.hub.docker.com/r/homeassistant/aarch64-addon-silabs-multiprotocol/tags
and here
Docker!

use the correct image for your architecture

I’ve already managed to get a little ahead. Now there is no longer one error message endlessly, but many different ones. :crazy_face:

s6-rc: info: service banner: starting
curl: (6) Could not resolve host: supervisor
[20:42:39] ERROR: Something went wrong contacting the API
s6-rc: info: service banner successfully started
s6-rc: info: service universal-silabs-flasher: starting
[20:42:39] INFO: The selected serial port is not a USB device.
[20:42:39] WARNING: No firmware found for the selected device, assuming firmware is installed.
s6-rc: info: service universal-silabs-flasher successfully started
s6-rc: info: service cpcd-config: starting
[20:42:39] FATAL: No serial port device set!

“The selected serial port is not a USB device.”
I don’t understand why this is. ls /dev/tty* shows my device as ttyACM0 and I can also see this device in the /dev/serial/by-id folder as “@usb-ITEAD_SONOFF_Zigbee_3.0_USB_Dongle_Plus_V2_2023…-if00”

Do you have a driver for your dongle? Because under DSM is not loaded by default and you need to load them “manually” on restart of OS. In your case I think it is “ch343.ko”.