你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
利用通用平台和本地控制打造截然不同的 Zigbee 家庭自动化系统。
家庭自动化技术近年来出现了飞跃式发展,现已实现商品化,许多公司都提供结合供暖、照明、通用电源设备等控制功能的系统。此外,还可通过云和移动应用程序实现远程控制,以及凭借自身和合作伙伴的 API 实现第三方集成。
但是,如果没有哪个系统能够满足您的所有需求,该怎么办?这样的话,您可以组合多个不同的供应商系统,前提是它们提供 API。然而这些系统通常基于云,也就是说,它们在远程服务器而不是本地设备上运行。当您将这些系统组装在一起时,故障风险会增加。此外,我们偶尔会听说因云平台下线而导致公司停业、设备失去作用或至少功能弱化的案例。
Zigbee2mqtt 的作用是控制和创建多合一控制系统。该系统中(正如我们将在示例中使用的系统)可能包含由一家供应商提供的房间占用、温度和光线感应器,以及来自另一家供应商的组合远程控制电源开关和电源传感器。顾名思义,这些设备需要使用无线 Zigbee,并且还需要在可支持的设备列表中 - 除非您预备添加支持。
这样可以打造一个公共平台,截至本文撰写时,该平台可默认支持来自 39 家不同供应商的 191 种 Zigbee 设备。不仅如此,该平台还可在本地设备上运行,不依赖云服务(除非决定集成云服务)。
一旦可以通过 MQTT pub/sub 通信访问设备,您就可以使用家庭自动化系统来进行实际控制,例如家庭助理或 openHAB。或者您可以根据需要使用 Node-RED 或使用 MQTT 支持的多种语言中的任意一种编写自己的应用程序。
硬件安装
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 适配器,如上图所示。
按照说明下载固件映像后,只需将它刷到 CC2531 中即可。现在我们已经有了 Zigbee 控制器,接下来我们将安装 Zigbee2mqtt 软件。
软件安装
下面我们将介绍 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 可能会列举更高的数字。
设备配对与测试
设备配对时,应将 permit_join 参数设置为 true。之后还可将该参数设置为 false,以防止新设备接入。文档中提供了不同设备配对步骤的详细信息,尽管在本例中,设备接通电源后就自动接入了!
如需查看 Zigbee2mqtt 桥接和设备配对的状态,只需输入:
$ mosquitto_sub -v -h localhost -t zigbee2mqtt/#
这里的“#”为通配符,这样我们订阅了已配置的 zigbee2mqtt 基本主题下的所有消息。指定的“-v”表示我们将可以看到消息发布的目标主题。在以下屏幕截图中,我们可以看到 Philips Hue 运动(空间占用、温度和光线)传感器接入,然后开始发布三个传感器读数和电池状态的消息。主题名称包括设备的网络地址。
我们不仅可以通过 Zigbee2mqtt 接收数据,还可以发送命令,接下来我们将了解如何使用 Salus SP600 智能插头进行此项操作。
一旦智能插头接通电源后接入,我们就可以看到通过对应插头地址的 MQTT 主题传入的报告。如果按下插头上的手动电源控制按钮,报告状态将在开启和关闭之间切换。
如需通过 MQTT 远程设置状态,只需使用:
$ mosquitto_pub -h localhost -t zigbee2mqtt/0x001e5e0902146174/set -m "ON"
这里,我们在收到报告的同一主题下发布了消息,尽管添加了配置后缀,并发布了一条包含理想状态的消息。
后续步骤
此时,我们可以安装一个支持 MQTT、配置 Node-RED 或者集成自定义应用程序的家庭自动化系统。如有需要,我们可以使用一个或多个云平台,但是未来可以自由切换至其它的云平台,或者将系统完全转为本地控制。
默认设置下,Mosquitto 代理不要求客户端在发布消息和订阅主题时进行身份验证。这在开发和测试过程中没有问题,但是即便是连接到自认为安全的家庭网络,也最好设置一些基本的身份验证流程。具体设置取决于您的总体要求。例如,您可能只让客户端在发布时进行身份验证,但开放匿名订阅。如果您认为您的 MQTT 主题中的数据为敏感数据,则只订阅时也需要进行身份验证。或者,您可以锁定某些主题和用户的发布/订阅权限。参阅文档了解详细信息。
最后,我们可以采取其它的措施来保护 Zigbee 网络安全,必要时还可以扩大范围。