【踩坑系列】Home Assistant使用Aqara空调伴侣(升级版)红外码异常

去年刚接触智能家居中枢系统domoticz,为了学习学习,买了个博联RM PRO。后来改用HA了,使用现成的组件顺利完成了接入,控灯、控风扇都OK。想着以后每个房间都要布设一个红外控制设备来执行自动化控制,经过了解,空调伴侣是一个不错的选择,最主要是省地方,不用拉多一个USB电源供电,于是入手了两个Aqara空调伴侣。接入HA使用发现了一个问题:可以学到红外码,但发送红外码总是没效果(即使用博联RM也学习不到红外码)。

看了调试信息没发现什么异常,而且通过app学习、使用红外码就正常。孤寂了一段时间,意外在domoticz论坛一个帖子发现了抓包分析方法,于是继续分析,算是找到了原因和临时解决办法。


1.准备


2.过程

2.1.部署解析环境

  • 安装nodejs和npm(参考教程
  • 安装miio应用
    1
    $ npm install -g miio

DEBUG:可以整个ubuntu的虚拟机,不影响生产系统

2.2.抓包

电脑装安卓模拟器登陆米家app,进入空调伴侣界面,随便选一个空调型号,然后断开外网环境,电脑启用wiresharks抓包

WARN:不断网好像是直接米家APP下发指令,不是用局域网通信协议通信

DEBUG:具体过程不详述,不懂可百度。另外,如果交换机支持做个镜像端口,抓包的电脑连镜像端口,手机用APP,也是可以的。

进行学习自定义红外码,发送,重复2-3次。

DEBUG:一次抓取过程不用抓太多操作,容易分析。

导出JSON文件(点击wireshare菜单栏->文件->导出分组解析结果->为JSON)。

INFO:wireshare可以先设置过滤条件udp.dstport == 54321 or udp.srcport == 54321,减少不必要的数据包;

2.3.解析抓包

  • 将2.2步骤的JSON文件传到解析服务器
  • 执行命令

    1
    miio protocol json-dump {[file.json]} --token {[tokenAsHex]}

    DEBUG:{[file.json]}即JSON文件路径,{[tokenAsHex]}是空调伴侣的token

  • 在输出找到”method”:”send_ir_code”,后面”params”里面FE开头的字符串就是发送红外码。(抓包分析结果样例

2.4.红外码使用

将2.3步骤获取的红外码字符前面36位(后续叫附加信息头)记录下来。以后Aqara空调伴侣学习到新的红外码,将红外码的附加信息头替换成之前记录的,然后就可以发送成功了。

1
2
3
#附加信息头样例
学习:FE0000000000000000000000000600422268
发送:FE04870000714594701FFF7fFF060042274e


3.小结

  • APP学习到红外码,发送给空调伴侣前会进行一些处理,处理后前36位会发生改变,但无法得知具体算法。而HA直接将学习到的红外码发送给空调伴侣,空调伴侣无法识别导致失败。
  • 附加信息头有2个规律:只要保证[22:24]和[34:36](十六进制)的差值一致,都可以用;[2:14]包含一些型号信息(对比通过get_model_and_state命令获取的信息)。

4.更新

后来在github反馈信息给了syssi大神,syssi大神拿出了信息附加头的处理算法,并更新了插件,有兴趣的朋友可以看代码里面的具体处理算法。