自己动手做zigbee网关,小米网关之外的另一个选择

有关我做的这个网关的硬件信息, 我都更新到此贴. 感兴趣的玩家可以加入进来~



为什么要自己做zigbee网关

  1. 小米网关协议时不时的变化,导致设备接入时常不好用。
  2. 小米网关局域网接入使用UDP组播,并不是所有的wifi路由器都支持的。
  3. 小米网关版本更新,有些设备的数据就被网关吃掉,直接发云端,不转发局域网协议了。更有甚者,有一些zigbee设备直接无法支持局域网协议!!
  4. 如果家里有其他品牌zigbee设备,比如宜家,飞利浦的灯,涂鸦的传感器等,都需要专门的zigbee网关,管理复杂。
  5. TB上有大把的标准ZHA,ZLL协议的小厂家终端设备,无法接入。

支持设备列表

自己制作的zigbee网关支持近100种zigbee设备,包括我们常用的小米(aqare),飞利浦Hue,宜家等品牌。具体支持设备列表参考链接。

简述zigbee网络

zigbee网络拓扑
图片来源:https://baijiahao.baidu.com/s?id=1597593171433294352&wfr=spider&for=pc

设备角色

  • 协调器(Coordinator):网络中唯一的管理者。
  • 路由器(Router):可以转发数据的设备。设备本身可以有实际功能,也可以单纯的转发数据。
  • 终端设备(End-Device):具有具体功能的设备,不可以转发数据。

那小米的设备举例,小米网关就是协调器。一般情况,直接有220V供电的设备,比如86墙壁插座,窗帘充当的是路由器。电池供电设备,单火线供电设备是终端设备

网络类型

不想详细的讲网络类型,我也不专业。我只说一点和我们部署有关系的点:

  • source_routing: 协调器支持source routing的话,对网络节点数量多的用户很有帮助。但是!!实际测试小米设备对source routing的协议似乎支持不标准, 打开source_routing之后, 有大量错误信息, 很恼人. 所以最后我还是选择了normal mode.

硬件准备


这个是我开源项目最后的成品硬件. 有以下几个特点:

  • 使用E18-MS1PA1-IPX zigbee模组, 模组使用CC2592PA, 发射功率可以达到21dBm. 也可以使用E18-2G4Z27SI替换pin2pin兼容的E18-MS1PA1-IPX模组, 如何设置和实测信号发射功率请参考此链接.

  • 模块自带ESP8266模组. 可以通过WiFi转串口接入智能家居系统, 不再受到主机摆放位置的约束而导致信号覆盖差. 而且可以配合使用Zigbee to Tasmota项目, 完全不需要上位机, 自己本身就是一个zigbee-wifi网关.

  • ESP8266模组和E18模组的CC-DEBUG程序下载引脚连接, 可以通过CCLib项目, 直接给E18 zigbee模组下载固件, 不需要另外购买CC-DEBUG在线仿真器.

  • 可以通过拨码开关配置多种串口连接方式:

  • USB TTY <==> ESP 8266 TTY. 用于ESP模组和Zigbee模组下载固件.

  • USB TTY <==> E18 TTY. USB直连Zigbee模组, 上位机配置更加简单, 稳定性更强.

  • ESP 8266 TTY <==> E18 TTY. Connect though TTY. ESP模组和Zigbee模组对接, 可以刷WiFi串口固件, 实现WiFi接入上位机智能家居系统, 具体方法参考此链接. 或者直接配合Zigbee to Tasmota项目做独立的Zigbee网关.

  • USB TTY <==> ESP 8266 debug port. ESP 8266 TTY <==> E18 TTY. 和上一种连接方式一样, 多增加了一个debug串口.

  • 使用USB Type-C接口. 紧跟时代潮流.

  • 不管你怎么看, 我认为这个比USB dongle要好看几个数量级. 颜值即正义.

下载固件

开源项目地址:

  • 项目的firmware目录找到开源的固件源码和预编译好的bin文件.
  • 刷机工具也是一个开源的项目, 基于Python, 大家可以来github下载, 加星~

百度云打包下载:

针对国内的网络环境, 可以直接从我上传的百度云连接下载. 提取码: tdkm

刷机步骤:

  1. 根据上一步准备好刷机工具和固件之后, 打开刷机工具, 使用USB typeC 数据线(一定要是数据线, 千万别用充电线… 不会成功的)将硬件和PC连接.
  2. 选择串口, 对应固件, 填写自己的WiFi信息并点击All按钮.
    • 如果不填写WiFi信息, 硬件将进入WiFiManager模式, 也可以用手机连接设备创建的AP, web页面配置连接WiFi.

  1. 耐心等待20min… 可以利用这段时间部署以下ioBroker的插件.

  1. 刷机结束后, 点击View Log, 查看以下设备的log是否有输出. 如果没有说明刷机有问题, 请留言.
    • 同时, log里面会打印出来当前设备的IP和监听的端口号. 这个需要记录下来再配置ioBroker的时候需要.

z2mp刷机_viewIP.2019-12-16 15_42_00

部署步骤

  1. 在ioBroker插件商店, 打开开发者模式, 点击github安装, 输入下载地址: ioBroker/ioBroker.zigbee#herdsman

  2. 添加插件实例.

  3. 配置插件, 选择SETTING,在COM port name处,填写tcp://[你的设备IP]:[你配置的监听端口(默认8880)]

  4. 重启插件程序,等到程序状态为绿色。

  5. 再次进入程序配置页面,点击绿色图标按钮,开始添加自己的zigbee设备。这里注意,最右上角的绿色图标是指的添加直接连接协调器的子设备,而网络中,router属性的设备同样也有一个绿色的图标,可以由他发起设备接入。

  6. 添加完所有设备后,可以在NETWORK MAP页面查看网络情况。

  7. 在设备页面,可以看到已经添加的设备的属性,这里面可以发现,有很多小米子设备的数据,是比局域网协议更多的哦~

其他系统部署教程

外壳安装

如果你有3D打印机, 可以直接下载github上项目的3Dcover的文件, 直接打印. 外壳安装的视频在此

注意事项

  • 牵扯到硬件,请大家根据自己情况酌情选择方案。
  • router设备同样可以使用coordinator一样的硬件,只要刷不同的router固件即可。
  • 小米设备,并没有完全遵守zigbee协议的规范,所以会有一些地方需要注意:
    • 如果选择source_routing的协调器,小米的电池设备又会定期打印这样的错误logZigbee publish to '0x00158d00010b6cc9', genTime - readRsp - {"attrId":0,"status":0,"attrData":624267880,"dataType":226}] - 1 failed with error Error: AF data request fails, status code: 205.。完全不影响使用,忽略即可。
    • 小米设备的Available属性也完全不准,请不要忽略他的状态,不要依靠这个状态做任何自动化。
    • 尽可能选择基于herdsman的库的zigbee插件, 包括ioBroker的zigbee插件和zigbee2mqtt的程序(他们都是基于同一个zigbee库建立的).
    • 下面是这一条是如果没有选择herdsman的库才需要注意的.
    • 添加设备的时候,尤其是电池供电设备时,在长按链接按钮5s后,设备开始链接zigbee网关,灯长闪一次,代表已经接入网络。但是zigbee标准协议里面还需要子设备再上报设备的一些信息,可是小米的电池设备并没有上报,如果一直等待的话,会出现类似这样的错误Error: Cannot get the Node Descriptor of the Device: 0x00158d0000fd3145 (Error: Timed out after 10000 ms). undefined解决办法:再设备接入网络的长闪一次之后,继续按照1秒2次的频率短按设备配对按钮,直到程序配对输出页面上出现这样的日志为止 Interview state: step 1/1. progress: 13%。大约添加一个电池设备需要40s,如果失败请多尝试。

开源硬件

我已经在大佬的基础上着手改良硬件,并且已经开源出来了。
大家可以在Github中找到项目

1赞

给力!!感谢妖神的分享!!感谢Iob论坛带来的分享空间!!感谢伟大的祖国带来的强大的生产力!:lol

最后一句点题~

厉害,期待更好的方案

有什么建议? 我觉得下一步可以弄一个8266替代usb串口。。。

正打算装修,看看有没有好的方案,把家里的所有设备全部集成,期待你的作品,哈哈

也希望多一下8266的玩法

经过实验,通过8266+cc2530+cc2592的方案。
在群晖docker里面运行没有问题,也脱离了必须USB线连接的束缚。

但是发现数据延时严重,而且经常出现控制指令超时的情况。

还需要进一步debug看看是不是没有解决办法了

因为wifi透传串口涉及到多个地方的功能增加,今天有在树莓派上实验了一下:
cc2530+cc2592串口连接树莓派硬件串口。
树莓派运行ser2net
N1使用socat连接树莓派的ser2net
N1运行zigbee插件。

插件可以运行,可以添加设备。

下一步计划:
在群晖docker里面运行,而不是N1中

期待大佬方便我这样的伸手党。

最新进展, 群晖docker已经可以通过树莓派的ser2net+2530的模式工作了。

下一步切换8266,不用树莓派

妖神加油,小白为你鼓掌

8266+CC2530+CC2592也可以接入了, 而且是在群辉通过wifi接入。
可以画一个小板子来玩儿了

原理图已经完成。
兼容了串口直接连接和通过ESP连接的两种模式。

信号会比USB的强吗???

如果能够有USB接入的条件, USB有线接入肯定更稳定。

这个板子兼容了USB有线接入和wifi接入,可以通过拨码开关切换模式

PCB已经搞定,并且在生产了。
跟大家分享一下图片。

PCB.png


来之伸手党的仰望

坐等最终成品测试成功~~~~

等了一周,今天终于,PCB和原件都到齐了。
焊接完成,发上来先得瑟一下,回头再看看代码是否OK

TIM截图20191101151748.png