去年刚接触智能家居中枢系统domoticz,为了学习学习,买了个博联RM PRO。后来改用HA了,使用现成的组件顺利完成了接入,控灯、控风扇都OK。想着以后每个房间都要布设一个红外控制设备来执行自动化控制,经过了解,空调伴侣是一个不错的选择,最主要是省地方,不用拉多一个USB电源供电,于是入手了两个Aqara空调伴侣。接入HA使用发现了一个问题:可以学到红外码,但发送红外码总是没效果(即使用博联RM也学习不到红外码)。
看了调试信息没发现什么异常,而且通过app学习、使用红外码就正常。孤寂了一段时间,意外在domoticz论坛一个帖子发现了抓包分析方法,于是继续分析,算是找到了原因和临时解决办法。
1.准备
- Ubuntu 18.04 + HA 0.69.0
- wiresharks
- 空调伴侣组件
2.过程
2.1.部署解析环境
- 安装nodejs和npm(参考教程)
- 安装miio应用
1
$ npm install -g miio
使用建议
可以整个ubuntu的虚拟机,不影响生产系统。
2.2.抓包
电脑装安卓模拟器登陆米家app,进入空调伴侣界面,随便选一个空调型号,然后断开外网环境,电脑启用wiresharks抓包
注意
如果不断网好像是直接米家APP下发指令,不是用局域网通信协议通信。
补充
具体过程不详述,不懂可百度。另外,如果交换机支持做个镜像端口,抓包的电脑连镜像端口,手机用APP,也是可以的。
进行学习自定义红外码,发送,重复2-3次。
使用建议
一次抓取过程不用抓太多操作,容易分析。
导出JSON文件(点击wireshare菜单栏->文件->导出分组解析结果->为JSON)。
使用建议
wireshare可以先设置过滤条件udp.dstport == 54321 or udp.srcport == 54321,减少不必要的数据包。
2.3.解析抓包
将2.2步骤的JSON文件传到解析服务器
执行命令
1
miio protocol json-dump {[file.json]} --token {[tokenAsHex]}
参数
{[file.json]}即JSON文件路径,{[tokenAsHex]}是空调伴侣的token。
在输出找到”method”:”send_ir_code”,后面”params”里面FE开头的字符串就是发送红外码。(抓包分析结果样例)
2.4.红外码使用
将2.3步骤获取的红外码字符前面36位(后续叫附加信息头)记录下来。以后Aqara空调伴侣学习到新的红外码,将红外码的附加信息头替换成之前记录的,然后就可以发送成功了。
1 | #附加信息头样例 |
3.小结
- APP学习到红外码,发送给空调伴侣前会进行一些处理,处理后前36位会发生改变,但无法得知具体算法。而HA直接将学习到的红外码发送给空调伴侣,空调伴侣无法识别导致失败。
- 附加信息头有2个规律:只要保证[22:24]和[34:36](十六进制)的差值一致,都可以用;[2:14]包含一些型号信息(对比通过get_model_and_state命令获取的信息)。
4.更新
后来在github反馈信息给了syssi大神,syssi大神拿出了信息附加头的处理算法,并更新了插件,有兴趣的朋友可以看代码里面的具体处理算法。