Skip to content

Running EmberZNet 8.x on the Lidl Silvercrest Gateway

Background: The Series 1 Deprecation Problem

The Lidl Silvercrest Gateway uses a Silicon Labs EFR32MG1B chip, which is a Series 1 device.

In 2024, Silicon Labs discontinued support for Series 1 chips in newer versions of their Zigbee stack:

SDK EmberZNet Series 1 Support
Gecko SDK 4.x 7.5.x ✅ Last supported
Simplicity SDK 2025.x 8.x ❌ Series 2 only

This means users of Series 1 devices (including the Lidl gateway) are stuck on EmberZNet 7.5.x if running the Zigbee stack directly on the chip using the traditional NCP (Network Co-Processor) architecture.

The Solution: RCP Architecture

We found a workaround using the RCP (Radio Co-Processor) architecture:

Traditional NCP:  Zigbee Stack runs ON the EFR32 chip
RCP Architecture: Zigbee Stack runs ON a Linux host (x86 PC, Raspberry Pi, etc.)

In RCP mode, the EFR32 chip only handles the 802.15.4 radio PHY/MAC layer. The EmberZNet stack runs on a separate Linux host via zigbeed, communicating with the RCP through cpcd (Co-Processor Communication daemon).

Key insight: The RCP firmware for Series 1 (built from Gecko SDK 4.5.0) is compatible with zigbeed from Simplicity SDK 2025.x running EmberZNet 8.x!

+-------------------+    UART    +-------------------+   Ethernet   +---------------------+
|  EFR32MG1B (RCP)  |   115200   |  Lidl Gateway     |    TCP/IP    |  Host (x86/ARM)     |
|                   |   baud     |  (RTL8196E)       |              |                     |
|  802.15.4 PHY/MAC |<---------->|                   |<------------>|  cpcd               |
|  + CPC Protocol   |   ttyS0    |  serialgateway    |   port 8888  |    |                |
|                   |            |  (serial->TCP)    |              |    v                |
|  Gecko SDK 4.5.0  |            |                   |              |  zigbeed 8.2.2      |
|                   |            |                   |              |  (EmberZNet 8.x)    |
+-------------------+            +-------------------+              |    |                |
                                                                    |    v                |
                                                                    |  Zigbee2MQTT        |
                                                                    +---------------------+

Installation Guide

Prerequisites

  • Host machine: x86_64 PC, Raspberry Pi 4/5, or any Linux host
  • Lidl gateway: Already flashed with RCP firmware and running serialgateway
  • Network: Direct Ethernet cable between host and gateway (strongly recommended)

Step 1: Install Build Dependencies

sudo apt install cmake build-essential socat git

Step 2: Install Silicon Labs Tools

Follow the instructions in 1-Build-Environment to install slc-cli and ARM GCC toolchain:

cd 1-Build-Environment
sudo ./install_deps.sh

Step 3: Build and Install cpcd

cd 2-Zigbee-Radio-Silabs-EFR32/25-RCP-UART-HW/cpcd
./build_cpcd.sh         # Clone, build, install to /usr/local

Step 4: Build and Install zigbeed 8.2.2

cd 2-Zigbee-Radio-Silabs-EFR32/25-RCP-UART-HW/zigbeed-8.2.2
./build_zigbeed.sh      # Downloads SDK automatically, build, install

Note: On first run, the script automatically downloads Simplicity SDK 2025.6.2 from GitHub (~1.5 GB).

Step 5: Setup rcp-stack Manager

The rcp-stack script needs its companion files (scripts/, systemd/, examples/), so it must be run from the cloned repository.

Option A: Create an alias (recommended)

Add to your ~/.bashrc:

alias rcp-stack='/path/to/hacking-lidl-silvercrest-gateway/2-Zigbee-Radio-Silabs-EFR32/25-RCP-UART-HW/rcp-stack/bin/rcp-stack'

Then reload:

source ~/.bashrc

Option B: Run directly from the repo

./2-Zigbee-Radio-Silabs-EFR32/25-RCP-UART-HW/rcp-stack/bin/rcp-stack up

Step 6: Configure

First run creates the config file:

rcp-stack up
# -> Creates ~/.config/rcp-stack/rcp-stack.env
# -> Copies helper scripts to ~/.config/rcp-stack/bin/
# -> Links systemd units to ~/.config/systemd/user/
# -> Will fail, prompting you to edit the config

Edit the configuration:

nano ~/.config/rcp-stack/rcp-stack.env

Set your gateway IP and commands:

RCP_ENDPOINT=tcp://192.168.1.88:8888
CPCD_COMMAND='cpcd -c "$HOME/.config/rcp-stack/cpcd.conf"'
ZIGBEED_COMMAND='zigbeed -r "spinel+cpc://$CPC_INSTANCE_NAME?iid=1&iid-list=0" -p "$ZIGBEED_PTY" -d 1 -v 0'

Copy the cpcd config:

cp /path/to/hacking-lidl-silvercrest-gateway/2-Zigbee-Radio-Silabs-EFR32/25-RCP-UART-HW/rcp-stack/examples/cpcd.conf.example ~/.config/rcp-stack/cpcd.conf

Important: Edit cpcd.conf and set the correct baudrate (must match RCP firmware):

uart_device_baud: 115200

Step 7: Start the Stack

rcp-stack up

This starts the complete chain: 1. socat-cpc-rcp — TCP to PTY bridge 2. cpcd — CPC daemon 3. zigbeed — EmberZNet 8.2.2 stack 4. Zigbee2MQTT (if configured)

Step 8: Configure Zigbee2MQTT

In configuration.yaml:

serial:
  port: /tmp/ttyZ2M
  adapter: ember

Verification

Check the rcp-stack logs:

journalctl --user -u zigbeed.service -f

Then start Zigbee2MQTT. You should see EmberZNet 8.2.2 (EZSP 18):

$ pnpm start

> zigbee2mqtt@2.7.2 start /opt/zigbee2mqtt
> node index.js

Starting Zigbee2MQTT without watchdog.
[2026-01-22 16:49:34] info:     z2m: Logging to console, file (filename: log.log)
[2026-01-22 16:49:35] info:     z2m: Starting Zigbee2MQTT version 2.7.2 (commit #3a49c957)
[2026-01-22 16:49:35] info:     z2m: Starting zigbee-herdsman (8.0.1)
[2026-01-22 16:49:35] info:     zh:ember: Using default stack config.
[2026-01-22 16:49:35] info:     zh:ember: ======== Ember Adapter Starting ========
[2026-01-22 16:49:35] info:     zh:ember:ezsp: ======== EZSP starting ========
[2026-01-22 16:49:35] info:     zh:ember:uart:ash: ======== ASH Adapter reset ========
[2026-01-22 16:49:35] info:     zh:ember:uart:ash: RTS/CTS config is off, enabling software flow control.
[2026-01-22 16:49:35] info:     zh:ember:uart:ash: Serial port opened
[2026-01-22 16:49:35] info:     zh:ember:uart:ash: ======== ASH starting ========
[2026-01-22 16:49:40] info:     zh:ember:uart:ash: ======== ASH Adapter reset ========
[2026-01-22 16:49:40] info:     zh:ember:uart:ash: ======== ASH starting ========
[2026-01-22 16:49:45] info:     zh:ember:uart:ash: ======== ASH Adapter reset ========
[2026-01-22 16:49:45] info:     zh:ember:uart:ash: ======== ASH starting ========
[2026-01-22 16:49:47] info:     zh:ember:uart:ash: ======== ASH connected ========
[2026-01-22 16:49:47] info:     zh:ember:uart:ash: ======== ASH started ========
[2026-01-22 16:49:47] info:     zh:ember:ezsp: ======== EZSP started ========
[2026-01-22 16:49:47] info:     zh:ember: Adapter version info: {"ezsp":18,"revision":"8.2.2 [GA]","build":436,"major":8,"minor":2,"patch":2,"special":0,"type":170}
[2026-01-22 16:49:47] info:     zh:ember: [STACK STATUS] Network up.
[2026-01-22 16:49:47] info:     zh:ember: [INIT TC] Adapter network matches config.
[2026-01-22 16:49:47] info:     zh:ember: [CONCENTRATOR] Started source route discovery.
[2026-01-22 16:49:47] info:     z2m: zigbee-herdsman started (resumed)
[2026-01-22 16:49:47] info:     z2m: Coordinator firmware version: '{"meta":{"build":436,"ezsp":18,"major":8,"minor":2,"patch":2,"revision":"8.2.2 [GA]","special":0,"type":170},"type":"EmberZNet"}'

Key indicators of success: - EZSP started with protocol version 18 - Adapter version info showing 8.2.2 [GA] - [STACK STATUS] Network up. - Coordinator firmware version confirming EmberZNet 8.2.2

Quick Reference

Command Description
rcp-stack up Start the complete chain
rcp-stack down Stop cleanly
rcp-stack status Show service status
rcp-stack doctor Full diagnostics

Troubleshooting

Diagnostic Commands

# Quick status of all services
rcp-stack status

# Full diagnostics (services, sockets, PTYs, config files)
rcp-stack doctor

# Detailed logs for a specific service
journalctl --user -u cpcd-bringup.service -n 50 --no-pager
journalctl --user -u zigbeed.service -n 50 --no-pager

# Follow logs in real-time
journalctl --user -u cpcd-bringup.service -f

cpcd fails with "Baudrate mismatch"

Symptom:

FATAL: Baudrate mismatch (230400) on the daemon versus (115200) on the secondary

Cause: The baudrate in cpcd.conf doesn't match the RCP firmware.

Solution: Edit ~/.config/rcp-stack/cpcd.conf and set the correct baudrate:

uart_device_baud: 115200

Then restart:

rcp-stack down
rcp-stack up

cpcd fails with "Start request repeated too quickly"

Symptom: systemd stops retrying after multiple failures.

Solution: Check the actual error in the logs:

journalctl --user -u cpcd-bringup.service -n 50 --no-pager

Then fix the underlying issue and restart:

rcp-stack down
rcp-stack up

Cannot connect to RCP endpoint

Symptom:

Cannot connect to RCP endpoint 192.168.1.88:8888

Checks: 1. Gateway is powered on 2. serialgateway is running on the gateway 3. Network connectivity: nc -zv 192.168.1.88 8888 4. Correct IP in ~/.config/rcp-stack/rcp-stack.env

CPC sockets not created

Solution: Clean up and restart:

rcp-stack down
rm -rf /dev/shm/cpcd/cpcd_bringup
rcp-stack up

zigbeed fails with token error

Symptom: Token version mismatch (v1 vs v2) when upgrading from EmberZNet 7.x to 8.x.

Solution:

rm ~/.local/state/rcp-stack/zigbeed/host_token.nvm
rcp-stack down
rcp-stack up

Checking service health

A healthy stack looks like this:

● socat-cpc-rcp.service      active (running)
● cpcd-bringup.service       active (running)
● zigbeed.service            active (running)
● socat-zigbeed-pty.service  active (running)

And the logs should show:

Zigbeed started
RCP version: SL-OPENTHREAD/2.4.7.0_GitHub-...; EFR32; ...
Zigbeed Version: GSDK 8.2.2 - ...

Important Notes

  1. Direct Ethernet connection: The CPC protocol is sensitive to latency. Avoid WiFi or congested networks.

  2. Token migration: If upgrading from EmberZNet 7.x to 8.x, delete the old token:

    rm ~/.local/state/rcp-stack/zigbeed/host_token.nvm
    

  3. Baud rate: 115200 baud is recommended. Higher rates may cause UART overruns on the RTL8196E.


This workaround allows you to run the latest EmberZNet 8.x stack on your Lidl gateway despite Silicon Labs' Series 1 deprecation!