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¶
Step 2: Install Silicon Labs Tools¶
Follow the instructions in 1-Build-Environment to install slc-cli and ARM GCC toolchain:
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:
Option B: Run directly from the repo
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:
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):
Step 7: Start the Stack¶
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:
Verification¶
Check the rcp-stack logs:
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:
Cause: The baudrate in cpcd.conf doesn't match the RCP firmware.
Solution: Edit ~/.config/rcp-stack/cpcd.conf and set the correct baudrate:
Then restart:
cpcd fails with "Start request repeated too quickly"¶
Symptom: systemd stops retrying after multiple failures.
Solution: Check the actual error in the logs:
Then fix the underlying issue and restart:
Cannot connect to RCP endpoint¶
Symptom:
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:
zigbeed fails with token error¶
Symptom: Token version mismatch (v1 vs v2) when upgrading from EmberZNet 7.x to 8.x.
Solution:
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¶
-
Direct Ethernet connection: The CPC protocol is sensitive to latency. Avoid WiFi or congested networks.
-
Token migration: If upgrading from EmberZNet 7.x to 8.x, delete the old token:
-
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!