嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

利用 Zigbee2mqtt 整合 Zigbee 网络

Main32_03df5a5fb080768766b04fcd3921318e0364033a.jpg

利用通用平台和本地控制打造截然不同的 Zigbee 家庭自动化系统。

家庭自动化技术近年来出现了飞跃式发展,现已实现商品化,许多公司都提供结合供暖、照明、通用电源设备等控制功能的系统。此外,还可通过云和移动应用程序实现远程控制,以及凭借自身和合作伙伴的 API 实现第三方集成。

但是,如果没有哪个系统能够满足您的所有需求,该怎么办?这样的话,您可以组合多个不同的供应商系统,前提是它们提供 API。然而这些系统通常基于云,也就是说,它们在远程服务器而不是本地设备上运行。当您将这些系统组装在一起时,故障风险会增加。此外,我们偶尔会听说因云平台下线而导致公司停业、设备失去作用或至少功能弱化的案例。

Zigbee2mqtt 的作用是控制和创建多合一控制系统。该系统中(正如我们将在示例中使用的系统)可能包含由一家供应商提供的房间占用、温度和光线感应器,以及来自另一家供应商的组合远程控制电源开关和电源传感器。顾名思义,这些设备需要使用无线 Zigbee,并且还需要在可支持的设备列表中 - 除非您预备添加支持

这样可以打造一个公共平台,截至本文撰写时,该平台可默认支持来自 39 家不同供应商的 191 种 Zigbee 设备。不仅如此,该平台还可在本地设备上运行,不依赖云服务(除非决定集成云服务)。

一旦可以通过 MQTT pub/sub 通信访问设备,您就可以使用家庭自动化系统来进行实际控制,例如家庭助理 openHAB。或者您可以根据需要使用 Node-RED 或使用 MQTT 支持的多种语言中的任意一种编写自己的应用程序。

硬件安装

Programmer_c6ba7defe39d7c85986e137626eaa6d5369b2ebe.jpg

Raspberry Pi 3 B+ (137-3331) 是 Zigbee2mqtt 网关的理想运行平台,也可以轻松用于托管 MQTT 代理;此外如果我们愿意,还可以在此基础上运行真正的家庭自动化应用程序。Zigbee 射频由 CC2531 (798-3656) 的 TI USB 2.4GHz ZigBee 适配器提供。这需要通过网络控制器固件进行编程,为此我们使用了 RF 系统芯片的 TI 调试编程器 (709-4370)

Zigbee2mqtt 项目介绍了如何使用 TI 附赠的 Windows 软件以及 Linux/Mac OS X 上的开源 CC 工具软件刷新固件。我们选择使用后者。需要注意的一点是,Zigbee2mqtt 网站上显示的电缆适配器板与 TI 编程器随附的不同。为了解决这一问题,我们必须将连接器反向连接 CC2531 适配器,如上图所示。

RUUZZ_flash_6e9cf240fc1774d253533be26eb450b0b030d247.jpg

按照说明下载固件映像后,只需将它刷到 CC2531 中即可。现在我们已经有了 Zigbee 控制器,接下来我们将安装 Zigbee2mqtt 软件。

软件安装

RUUZZ_npm_start_760be6347bd190f5858d82887159bede3a7fdd44.jpg

下面我们将介绍 Zigbee2mqtt 和 Mosquitto MQTT 代理的组合安装步骤,此外还有用于测试的命令行客户端。另见官方资料

假设我们安装了新的 Raspbian(Lite 版本即可),并且已根据要求完成了所有基本配置(例如连接 WiFi),我们可以从安装包依赖项开始。

$ wget -qO - http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key | sudo apt-key add -

$ sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list -P /etc/apt/sources.list.d/

$ wget -qO - https://deb.nodesource.com/setup_10.x | sudo -E bash -

$ sudo apt-get install -y nodejs git make g++ gcc mosquitto mosquitto-clients

Mosquitto MQTT 代理和 Node.js 均可通过 Raspbian 存储库获得,然而我们只需为它们配置两个自定义存储库,即可获得更多的最新版本。

接下来,我们复制 Zigbee2mqtt GitHub 存储库并进行安装。

$ sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt

$ sudo chown -R pi:pi /opt/zigbee2mqtt

$ cd /opt/zigbee2mqtt

$ npm install

现在,我们可以使用以下命令来运行 Zigbee2mqtt:

$ npm start

如需在开机时自动启动,我们需要创建系统单元文件:

$ sudo vi /etc/systemd/system/zigbee2mqtt.service

内容如下:

[Unit]
Description=zigbee2mqtt
After=network.target

[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

 

如需在不重新开机的情况下启动,请输入:

$ sudo systemctl start zigbee2mqtt

配置

# Home Assistant integration (MQTT discovery)
homeassistant: false

# allow new devices to join
permit_join: true

# MQTT settings
mqtt:
  # MQTT base topic for zigbee2mqtt MQTT messages
  base_topic: zigbee2mqtt
  # MQTT server URL
  server: 'mqtt://localhost'
  # MQTT server authentication, uncomment if required:
  # user: my_user
  # password: my_password

# Serial settings
serial:
  # Location of CC2531 USB sniffer
  port: /dev/ttyACM0

以上为 Zigbee2mqtt 的初始配置,如需编辑请输入:

$ vi /opt/zigbee2mqtt/data/configuration.yaml

在这里您可以:更改使用的基本 MQTT 主题;当代理在其它计算机上运行时指定远程主机;如有需要,还可设置用户名和密码用于身份验证。

串行端口通常应为 /dev/ttyACM0,但是如果连接了同类型的其他设备,则 CC2531 可能会列举更高的数字。

设备配对与测试

Hue_517428c8ecbb85ecb030cb3bc0efffa75ac83721.jpg

设备配对时,应将 permit_join 参数设置为 true。之后还可将该参数设置为 false,以防止新设备接入。文档中提供了不同设备配对步骤的详细信息,尽管在本例中,设备接通电源后就自动接入了!

如需查看 Zigbee2mqtt 桥接和设备配对的状态,只需输入:

$ mosquitto_sub -v -h localhost -t zigbee2mqtt/#

这里的“#”为通配符,这样我们订阅了已配置的 zigbee2mqtt 基本主题下的所有消息。指定的“-v”表示我们将可以看到消息发布的目标主题。在以下屏幕截图中,我们可以看到 Philips Hue 运动(空间占用、温度和光线)传感器接入,然后开始发布三个传感器读数和电池状态的消息。主题名称包括设备的网络地址。

RUUZZ_hue_pairing_84f94afffe3c496915411117d71458c8058d396c.jpg

我们不仅可以通过 Zigbee2mqtt 接收数据,还可以发送命令,接下来我们将了解如何使用 Salus SP600 智能插头进行此项操作。

Salus_2e9dc865da2653e2901cb212757aee7c32fd05d0.jpg

一旦智能插头接通电源后接入,我们就可以看到通过对应插头地址的 MQTT 主题传入的报告。如果按下插头上的手动电源控制按钮,报告状态将在开启和关闭之间切换。

RUUZZ_salus_pairing1_466a6f07192e174e867d1a50d4cb921609184349.jpg

如需通过 MQTT 远程设置状态,只需使用:

$ mosquitto_pub -h localhost -t zigbee2mqtt/0x001e5e0902146174/set -m "ON"

这里,我们在收到报告的同一主题下发布了消息,尽管添加了配置后缀,并发布了一条包含理想状态的消息。

后续步骤

此时,我们可以安装一个支持 MQTT、配置 Node-RED 或者集成自定义应用程序的家庭自动化系统。如有需要,我们可以使用一个或多个云平台,但是未来可以自由切换至其它的云平台,或者将系统完全转为本地控制。

默认设置下,Mosquitto 代理不要求客户端在发布消息和订阅主题时进行身份验证。这在开发和测试过程中没有问题,但是即便是连接到自认为安全的家庭网络,也最好设置一些基本的身份验证流程。具体设置取决于您的总体要求。例如,您可能只让客户端在发布时进行身份验证,但开放匿名订阅。如果您认为您的 MQTT 主题中的数据为敏感数据,则只订阅时也需要进行身份验证。或者,您可以锁定某些主题和用户的发布/订阅权限。参阅文档了解详细信息。

最后,我们可以采取其它的措施来保护 Zigbee 网络安全,必要时还可以扩大范围

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.