Files
service_zigbee/HOWTO.md
T
2026-08-20 17:50:59 +02:00

8.2 KiB

Reading a SONOFF SNZB-02P on a Raspberry Pi 5

The simplest setup is:

SONOFF sensor -> Zigbee USB dongle -> Zigbee2MQTT -> MQTT -> terminal/application

You do not need to open the sensor until Zigbee2MQTT is ready.

1. Connect and identify the dongle

Attach the dongle's antenna before powering it. Connect it to the Raspberry Pi, preferably through a short USB extension cable to reduce USB 3 radio interference.

Run:

lsusb
ls -l /dev/serial/by-id/

You should see a persistent device path similar to:

/dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_2281293efa9aef1190f1b69061ce3355-if00-port0 -> ../../ttyUSB0

Use this /dev/serial/by-id/... path instead of /dev/ttyUSB0 or /dev/ttyACM0, because those shorter names can change after a reboot.

Check the label on the dongle to determine its adapter type:

Dongle model Zigbee2MQTT adapter type
ZBDongle-P zstack

The two dongles have similar names but contain different radio chips.

References:

2. Install the Mosquitto MQTT broker

On Raspberry Pi OS, run:

sudo apt update
sudo apt install -y mosquitto mosquitto-clients
sudo systemctl enable --now mosquitto
systemctl status mosquitto --no-pager
sudo tee /etc/mosquitto/conf.d/zigbee2mqtt.conf >/dev/null <<'EOF'
listener 1883 192.168.178.56
allow_anonymous true
EOF

and restart the service

For an initial setup confined to the Pi and a trusted LAN, the local broker is sufficient. Configure authentication before exposing MQTT outside your trusted network.

Reference: Mosquitto downloads

3. Install Docker and Docker Compose

Identify the operating system and architecture first:

grep -E '^(ID|VERSION_CODENAME)=' /etc/os-release
dpkg --print-architecture

On a Raspberry Pi 5, the architecture should normally be arm64. Select the repository below that matches the reported ID. Do not combine an Ubuntu codename such as noble with the Debian repository.

Install the prerequisites:

sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings

Ubuntu (ID=ubuntu, including VERSION_CODENAME=noble)

If an earlier attempt installed the wrong Debian source, replace it with Docker's Ubuntu source:

sudo rm -f /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.sources
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
  sudo tee /etc/apt/sources.list.d/docker.list >/dev/null

sudo apt-get update

For Ubuntu 24.04, that correctly uses the Ubuntu repository and noble suite.

Raspberry Pi OS or Debian (ID=raspbian or ID=debian)

Add Docker's Debian source:

sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list >/dev/null

sudo apt-get update

Install Docker Engine and the Compose plugin:

sudo apt-get install -y \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  docker-buildx-plugin \
  docker-compose-plugin

Enable Docker at boot and verify the installation:

sudo systemctl enable --now docker
sudo docker run --rm hello-world
sudo docker version
sudo docker compose version

Docker Compose is now invoked as docker compose. The old docker-compose command is the legacy standalone version and is not needed.

Optional: run Docker without sudo

Add your current account to the docker group:

sudo usermod -aG docker "$USER"

Then log out and back in, or reboot:

sudo reboot

After reconnecting, verify that it works without sudo:

docker run --rm hello-world
docker compose version

Membership of the docker group effectively gives the account root-level control of the machine. Only add trusted users.

If dpkg --print-architecture reports armhf, you are using a 32-bit OS. A 64-bit Raspberry Pi OS or Ubuntu installation is recommended on the Pi 5.

References:

4. Run Zigbee2MQTT with Docker

Zigbee2MQTT recommends Docker because it avoids most Node.js and dependency setup problems. Its image supports the Raspberry Pi's ARM architecture.

If Docker and Docker Compose are already installed, create a working directory:

mkdir -p "$HOME/zigbee2mqtt/data"
cd "$HOME/zigbee2mqtt"

Create a file named compose.yaml containing:

services:
  zigbee2mqtt:
    container_name: zigbee2mqtt
    image: ghcr.io/koenkk/zigbee2mqtt:latest
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./data:/app/data
      - /run/udev:/run/udev:ro
    devices:
      - /dev/serial/by-id/REPLACE_WITH_YOUR_DONGLE:/dev/ttyACM0
    environment:
      - TZ=Europe/Amsterdam

Replace REPLACE_WITH_YOUR_DONGLE with the exact filename returned by:

ls /dev/serial/by-id/

Start Zigbee2MQTT and follow its logs:

docker compose up -d
docker compose logs -f zigbee2mqtt

From another computer, open:

http://RASPBERRY_PI_IP:8080

For example:

http://192.168.1.50:8080

The first-run onboarding page should appear. Configure these values:

MQTT server: mqtt://172.17.0.1
Serial port: /dev/ttyACM0

Adapter:
  ZBDongle-P -> zstack
  ZBDongle-E -> ember

If 172.17.0.1 does not reach Mosquitto, use the Raspberry Pi's LAN IP instead. Zigbee2MQTT may detect the adapter automatically.

vi "$HOME/zigbee2mqtt/data/configuration.yaml
frontend:
  enabled: true

restart the container:

sudo docker compose restart zigbee2mqtt
sudo docker compose logs -f zigbee2mqtt

References:

5. Pair the SNZB-02P sensor

In the Zigbee2MQTT web interface:

  1. Click Permit join.
  2. Open the SNZB-02P.
  3. Remove the battery insulation tab.
  4. Hold its button for about five seconds, until the LED flashes.
  5. Keep the sensor close to the dongle during pairing.
  6. Wait for Zigbee2MQTT to report that the device was successfully interviewed.
  7. Rename it to something simple, such as living_room_sensor.
  8. Turn Permit join off afterward.

The device page should now show temperature, humidity, and battery level. The SNZB-02P uses a CR2477 battery.

Reference: SNZB-02P device support

6. Read the temperature

Listen for sensor updates on the Raspberry Pi:

mosquitto_sub -h localhost \
  -t 'zigbee2mqtt/living_room_sensor' \
  -v

A message will look similar to:

{
  "battery": 100,
  "humidity": 48.2,
  "linkquality": 132,
  "temperature": 21.6
}

To print only the temperature, install jq if necessary:

sudo apt install -y jq

Then run:

mosquitto_sub -h localhost \
  -t 'zigbee2mqtt/living_room_sensor' |
jq --unbuffered '.temperature'

Battery-powered sensors normally report periodically or when their readings change, rather than continuously. The SNZB-02P publishes temperature in °C and humidity as a percentage.

Reference: Zigbee2MQTT MQTT topics