背景
近日通过小黄鱼购入了别人自制的zigbee2mqtt网关,踩了很多坑,学习了很多知识。写个笔记记录下来。
设备
zigbee2mqtt自制网关,购买连接不附,需要的可以自己搜索。购入价72含运费。自制网关芯片组为cc2530+esp12。运行系统为tasmota。
- cc2530负责zigbee网络
- esp12负责将zigbee数据转为wifi
工作模式主要有两种
- z2m模式,该模式直接将cc2530的串口指令通过网络tcp协议发送给zigbee2mqtt软件。实际上是zigbee2mqtt监听的。
- z2p模式,该模式将cc2530串口指令解析后通过mqtt发动到mqtt broker下,由订阅者处理。
自学的一些基本概念
zigbee2mqtt设备
自己学习了一下这个设备,发现网上大部分都是cc25xx芯片通过usb连接ha,其实原本设计就是usb dongle。后来比较著名的就是妖神设计的将esp8266和cc2530连起来,以wifi作为媒介转发,免去受usb必须插在宿主机上的限制。
芯片组上cc25xx差别主要体现在带机量上。目前没有比对过,不评价。
zigbee2mqtt.io 软件
这个是将zigbee设备识别,并转为mqtt协议的软件,支持千种以上设备,通用性较强,界面友好。网址
MQTT
这是一个通用消息软件,详细内容可以自行网上搜索。在homeassistant下作用就是可以通过mqtt discovery自动发现mqtt设备。通常需要一个MQTT broker作为服务器转发消息。基本概念上有消息发布者及订阅者。消息发布者根据topic(主题)发布消息,订阅者订阅该topic读取消息。
基本网络链路
zigbee设备与自制zigbee网关配对。
- zigbee设备 -zigbee> 自制zigbee网关(z2m) -wifi/tcp> Zigbee2mqtt软件 -网络> MQTT broker -> MQTT订阅者(Homeassistant)
- zigbee设备 -zigbee> 自制zigbee网关(z2p) -wifi/mqtt> MQTT broker -> MQTT订阅者(Homeassistant)
方案2优点就是无需zigbee2mqtt软件。缺点就是对于mqtt homeassistant需要通过configuration.yaml自己配置设备。
方案1有点就是zigbee2mqtt软件直接可在homeassistant中集成并识别。缺点就是zigbeemqtt无法识别的设备自己还是要手工设置。
我的当前方案
方案1
实施步骤
1. 自制zigbee设备
- 初始状态下,通过手机wifi连接自制zigbee设备,手机会根据网络连接检查自动跳出wifi设置界面,本设备如果没有跳出的话可以通过192.168.4.1设置。
- 设置完wifi后等待设备重启,手机连回同一wifi网络,检查路由器下设备,找到该设备ip并通过网页访问。
- 在设置,模块设置下选择z2m。
2. MQTT broker
- 在hass.io下,我用的是hassos(推荐,简单,不适合高手),supervisor加载项商店安装Mosquitto broker。
- 在配置里设置,自己设置(其实可以不设置)
logins:
- username: ***
password: ***
- 启动MQTT broker
3. MQTT集成
- 在homeassistant集成中,会自动出现MQTT等待配置,如果没有可以新增集成。只需保证enable discovery就行。其他会自行配置。实际上用的用户也不是我们设置的用户。
4. zigbee2mqtt.io
- 在hass.io下,supervisor加载项商店点击右上角三点,repositories,添加
https://github.com/zigbee2mqtt/hassio-zigbee2mqtt
- 在hass.io下,supervisor加载项商店安装zigbee2mqtt
- 对于本文情况及设备,在配置页面,我只修改了serial,改为自制zigbee网关的ip地址
serial:
port: 'tcp://***:8880'
- 启动zigbee2mqtt,如果配置正确,应该没有报错。我的是以下log
[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] socat.sh: executing...
[10:56:05] INFO: Socat not enabled, marking service as down
[cont-init.d] socat.sh: exited 0.
[cont-init.d] zigbee2mqtt.sh: executing...
[10:56:05] INFO: MQTT available, fetching server detail ...
[10:56:05] INFO: MQTT server settings not configured, trying to auto-discovering ...
[10:56:06] INFO: Configuring 'mqtt://core-mosquitto:1883' mqtt server
[10:56:06] INFO: MQTT credentials not configured, trying to auto-discovering ...
[10:56:06] INFO: Configuring'addons' mqtt user
[10:56:06] INFO: Previous config file found, checking backup
[10:56:06] INFO: Creating backup config in '/config/zigbee2mqtt/.configuration.yaml.bk'
[10:56:06] INFO: Adjusting Zigbee2mqtt core yaml config with add-on quirks ...
[cont-init.d] zigbee2mqtt.sh: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
[10:56:07] INFO: Handing over control to Zigbee2mqtt Core ...
> zigbee2mqtt@1.18.1 start /app
> node index.js
以上就配置完成
个人经验
- 这种配置下zigbee2mqtt比较慢,设备识别也会有错的情况,多取消及配对几次可以成功。
- 同理,Permit Join按钮可以允许设备配对,有时候也会失败,等一下在按就行。
- 本人使用场景就是将米家贴墙开关的按钮事件通过mqtt触发homeassistant自动化,并通过remote homeassistant连接另一台homeassistant上通过yeelight-bluetooth连接的yeelight 初代蓝牙床头灯来,达到控制灯的开关功能。(何必呢,呵呵呵)家庭智能都是从这货开始的!
- 后续购入米家6键场景开关来控制暖气片三通通断。
- 补充一点,mqtt里的action需要触发一次才能在ha里正常识别并可作为触发条件使用。
网友评论