米家的智障设备

米家的智能设备只能定时、条件触发这两个最简单的操作,说白了就是一个定时自动开关,复杂一些的场景就无能为力了。
单靠米家这点功能,想要智能门都没有,只有自己控制设备,实现智能化。

按照这个思路开始折腾

方案1,ZigBee

我有一个最老款的米家ZigBee一代网关,以前写过ZigBee控制协议,Server端可以接收到网关下所有子设备的通讯数据(组播收),Client端可以模拟子设备发送数据,模拟心跳、 模拟传感器、模拟无线开关都没有问题,做联动触发也都正常(单播发),

ZigBee虽然能控制的设备有限,只要能控制网关下子设备的触发,再结合米家的场景,组合起来应该也将就够用了,跑了一下程序,发现Server可以运行,Client端无法运行了,只可以接收数据,不能发送数据了,搜索一下发现是一代网关插件升级之后不允许局域网通讯了,插件还无法降版,这条路断了,

PS:即使这条路没断这也不是一个好的方案,
1,一代网关太老了,缺乏新的支持,产品已经停产,新的网关更不支持局域网接入,
2,小米自家也在慢慢的淘汰ZigBee换用蓝牙

方案2,Home Assistant

自己写程序控制设备,Home Assistant应该是天选的,HA有原生的REST API,很灵活很方便,简单易用、坚固稳定。
其实HA应该是第一选择,但HA装系统、配置、导入设备,都比较麻烦,实在有点太折腾了。

ZigBee的路不通,没办法只能走HA这条路了,虚拟机装好HA,MIIot装好,设备绑定好,API调试好,问题又来了,HA对米家的设备支持不全,触发设备全都不能控制,支持的设备还有很多功能缺失,比如,浴霸只能开关灯,通风,排风,暖风这些功能全都缺失了,触发设备不支持,控制触发设备结合米家场景的方法也都行不通了,

两条大腿都断了,准备放弃这个事了。不死心,又盘了盘,Github看了看,发现有抓包模拟协议控制设备的,协议控制一般是我的首选,很久之前我就尝试过抓包,发现双向都是加密的,看了看也就放弃了,当时也没有硬需求,之后也就没多做研究,现在已经没有其他办法了,不死心,硬着头皮上,再抓包试试...

方案3,协议控制

协议控制的好处是可以一次性解决所有的问题,指令直接发送到小米云端和设备无关和系统无关,丢数据到api.io.mi.com,由小米云端下发设备控制,高效稳定,梳理协议是最复杂难度最高的,无法解密的概率是很高的,当然解密了收益是最大的,有两个关键问题,

1,RC4密匙的算法
sha256(ssecurity + _nonce)

2,请求签名加密方法
反正也不知道sign的具体格式到底是啥 各种调 各种尝试 结果如下:
uri . key _nonce . data

提交数据有两种方式
1,加密方式,RC4加密,以后可能都要RC4加密
2,明文,目前可用,可能是在兼容老设备?

构建请求JSON
构建请求JSON必须解密RC4,按照原数据结构再构建请求数据,数据结果详细说明可以通过https://home.miot-spec.com/查询,读两遍别人的代码,把代码删减一下,Python跑通,用更简单的PHP重新写一遍,方便网页控制10几行代码DEMO测试通过... 前前后后折腾了一个礼拜,备忘,

参考:
https://www.xiaoweigod.com/network/2235.html
https://kero.ink/posts/mihome-app-api.html
https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor/blob/master/token_extractor.py

发现问题:
稳定运行1个多月之后发现抓包获取到的授权过期了,原来这个授权是会过期的,生命周期并不很长!总不至于每个月抓一次吧授权吧。

解决方法:
跑脚本,模拟一遍登录流程,抓取登录后的cookie,保存到本地,定期获取一下,周期暂时先放到1个月试试。

标签: Home Assistant, 智能家居, 米家

添加新评论