# Zigbee2MQTT (reusable fragment).
# include = ["include/zigbee2mqtt.toml"]
#
# The hard part across machines is the USB Zigbee adapter: the kernel names it
# ttyUSB0 on some boxes and ttyACM0 on others, and the stable
# /dev/serial/by-id/ path is unique per dongle (different serial number). The
# fix is a udev rule that gives ANY Sonoff/ITead Zigbee dongle a stable
# /dev/zigbee symlink (matched on the USB product string, which both the V1 and
# V2 dongles share), so this one quadlet works everywhere via
# AddDevice=/dev/zigbee. Pairs with the `mosquitto` fragment (MQTT on :1883).
# --- stable device symlink -------------------------------------------------
# Any USB serial adapter whose product string contains "Zigbee" -> /dev/zigbee.
# (For a box with more than one dongle, match on ATTRS{serial} instead.)
[[files]]
path = "/etc/udev/rules.d/99-devendra-zigbee.rules"
mode = "0644"
content = """
SUBSYSTEM=="tty", ATTRS{product}=="*Zigbee*", SYMLINK+="zigbee", GROUP="dialout", MODE="0660"
"""
# A newly-written udev rule doesn't take effect until udev re-reads it. This
# one-shot reloads + re-triggers udev so /dev/zigbee appears without a reboot;
# devendra runs it before zigbee2mqtt (and re-runs it whenever a file changes,
# since its state is "restarted").
[[files]]
path = "/etc/systemd/system/devendra-udev-reload.service"
mode = "0644"
content = """
[Unit]
Description=Reload udev so the Zigbee /dev/zigbee symlink appears (devendra)
After=systemd-udevd.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/udevadm control --reload
ExecStart=/usr/bin/udevadm trigger --subsystem-match=tty --action=add
ExecStart=/usr/bin/udevadm settle --timeout=10
[Install]
WantedBy=multi-user.target
"""
[[directories]]
path = "/mnt/zigbee2mqtt"
mode = "0755"
[[files]]
path = "/etc/containers/systemd/zigbee2mqtt.container"
mode = "0644"
content = """
[Unit]
Description=Zigbee2MQTT
Wants=network-online.target devendra-udev-reload.service
After=network-online.target devendra-udev-reload.service
[Container]
Image=docker.io/koenkk/zigbee2mqtt:latest
Network=host
# :Z relabels the data dir for SELinux; z2m manages its own config/db here so we
# never install configuration.yaml (that would clobber device pairings).
Volume=/mnt/zigbee2mqtt:/app/data:Z
Volume=/run/udev:/run/udev:ro
GroupAdd=keep-groups
# Stable host symlink -> fixed name inside the container.
AddDevice=/dev/zigbee:/dev/ttyACM0
# Configure via env so devendra never fights z2m's writes to configuration.yaml.
# adapter=zstack is REQUIRED on z2m 2.x: it can't auto-discover the dongle type
# inside the container (no /dev/serial/by-id there), so name it explicitly. The
# Sonoff Zigbee 3.0 USB Dongle Plus (V1 and V2, TI CC2652) is a zstack adapter.
Environment=ZIGBEE2MQTT_CONFIG_SERIAL_PORT=/dev/ttyACM0
Environment=ZIGBEE2MQTT_CONFIG_SERIAL_ADAPTER=zstack
Environment=ZIGBEE2MQTT_CONFIG_MQTT_SERVER=mqtt://localhost:1883
Environment=ZIGBEE2MQTT_CONFIG_FRONTEND_PORT=8089
AutoUpdate=registry
[Service]
Restart=always
TimeoutStartSec=900
[Install]
WantedBy=multi-user.target default.target
"""
[[services]]
# Reload udev first so /dev/zigbee exists before the container starts.
name = "devendra-udev-reload.service"
enabled = true
state = "restarted"
[[services]]
name = "zigbee2mqtt.service"
enabled = true
# "restarted" so quadlet edits (env config, adapter, port) are applied on the
# next publish. A brief coordinator re-init on restart is expected.
state = "restarted"
neiam
/devendra
public · Issues · Pulls · Labels · Forks · Compare · Actions failure · Badges · Packages
⭐
Log in to mark this repository.
3.4 KiB · text
History
d69022d