前言
使 Zigbee 设备通过 MQTT 协议接入任何平台
以 HomeaAssistant 为例
前提材料
ESP8266
CC2530
等 ZigBee
模块
- 服务端, 如树莓派
docker
和 docker-compose
使用基础
ZigBee 无线模块
全新的 ZigBee 模块需要烧录程序
配置固件烧录环境
sudo apt install -y dh-autoreconf libusb-1.0-0-dev libboost-all-dev
下载 Zigbee 模块固件
参考Zigbee2mqtt documentation
在 macOS 下
git clone https://hub.fastgit.org/dashesy/cc-tool.git
cd cc-tool
./bootstarp
./configuer
make
其他系统略
连接, 烧录固件
- 引出 CC-Debugger 的 GND、DC、DC、RESET、3.3V 引脚
sudo ./cc-tool -e -w CC2530ZNP-Prod.hex
ESP8266
ESP8266 程序可使用预编译直接烧录或按照下面方式进行编译安装
安装 ESPtool pip install esptool
自编译安装
获取 Tasmota 源码
git clone https://hub.fastgit.org/arendst/tasmota.git
VS Code 拓展直接安装
; 省略部分可不做修改
[common]
board = esp8266_1M
monitor_speed = 115200
monitor_port = /dev/cu.SLAB_USBtoUART
upload_speed = 115200
; 选择上传模块与上传端口
upload_resetmethod = nodemcu
upload_port = /dev/cu.SLAB_USBtoUART
; 以下省略
- MacOS:
upload_port
可通过 ls /dev/cu.*
获取
- Windows: 设备管理器
COM*
修改tasmota/user_config_override.h
#ifndef _USER_CONFIG_OVERRIDE_H_
#define _USER_CONFIG_OVERRIDE_H_
#define MY_LANGUAGE zh_CN // 中文
#define USE_TCP_BRIDGE // 使用 TCP_BRIDGE
// Wi-Fi设置
#undef STA_SSID1
#define STA_SSID1 "SSID"
#undef STA_PASS1
#define STA_PASS1 "password"
// 模板设置
#ifdef ESP8266
#define USER_TEMPLATE "{\"NAME\":\"tcp_bridge\",\"GPIO\":[32,1,0,1,0,0,0,0,0,5120,0,5088,1,0],\"FLAG\":0,\"BASE\":1}"
#endif
// Log 等级
#undef WEB_LOG_LEVEL
#define WEB_LOG_LEVEL LOG_LEVEL_DEBUG
// 关闭 MQTT 功能
#undef MQTT_USE
#define MQTT_USE false
// 设置时区
#undef APP_TIMEZONE
#define APP_TIMEZONE 8
// 设置项目, 设备名
#undef PROJECT
#define PROJECT "zigbee_gateway"
#undef FRIENDLY_NAME
#define FRIENDLY_NAME "zigbee_gateway"
// 时间服务器, 否则容易卡住不工作
#undef NTP_SERVER1
#define NTP_SERVER1 "CN.NTP.ORG.CN"
#endif // _USER_CONFIG_OVERRIDE_H_
编译上传
PIO 底部工具栏选择 Build
Upload
- 固件保存在
build_output/firmware/tasmota.bin
预编译或手动上传
- 清除 esp 闪存
esptool.py -p /dev/cu.SLAB_USBtoUART erase_flash
- 烧录
esptool.py -p /dev/cu.SLAB_USBtoUART write_flash 0x0 build_output/firmware/tasmota.bin
最后...
配置 ESP 为网关
- 通过各种方式找到 ESP 的内网 IP 地址, 并设为静态 IP. 其实前面写 user_config_override.h 的时候就可以设置了
- 进入网页
设置 -> 模块设置 -> 模块类型 -> tcp_bridge -> 保存
- 进入网页
控制台
输入Rule1 ON System#Boot do TCPStart 8880 endon; Rule1 1
连接 ESP8266 和 CC2530
- 在先前的
user_config_override.h
中预先定义了模板, 下面按照模板中进行连接
TXD = GPIO15
RXD = GPIO13
对应实体板接口自行查询
ESP8266 CC2530
3V3 - VCC
GND GND
TXD - P02
RXD - P03
启动你的MQTT服务器
docker-compose 参考 https://hub.docker.com/_/eclipse-mosquitto
services:
mqtt:
image: eclipse-mosquitto
container_name: mqtt
restart: always
ports:
- 1883:1883
volumes:
- /data/mqtt/config:/mosquitto/config
- /data/mqtt/data:/mosquitto/data
- /data/mqtt/log:/mosquitto/log
- /etc/localtime:/etc/localtime:ro
配置 Zigbee2mqtt
参考 Running Zigbee2MQTT 这里使用 docker-compose 部署
新建文件夹 mkdir z2m && cd z2m/
services:
zigbee2mqtt:
image: koenkk/zigbee2mqtt
container_name: z2m
restart: unless-stopped
volumes:
- ./:/app/data
network_mode: host
environment:
- TZ=Asia/Shanghai
首次运行 docker-compose up -d
后自动创建文件
然后修改 configuration.yaml
homeassistant: true
permit_join: true
mqtt:
base_topic: zigbee2mqtt
server: 'mqtt://localhost:1883'
user: mqtt
password: mqtt
serial:
port: 'tcp://192.168.0.73:8880'
查看 Zigbee2MQTT 的 Log 并配对设备!
docker logs -f --since 5m z2m
配对完成后记得到 Homeasstant 连接 MQTT 服务器
最后 把 permit_join: true
改为 permit_join: false
就大功告成了!