德业除湿机接入Homeassistant


之前已经有人对德业除湿机做过反编译,找到了其背后的实现原理,并通过修改homeassistant相关组件远吗接入homeassistant,https://xiking.win/2020/11/12/3-deye-dehumidifer-add-to-homeassistant/ ,也有将其做成Homekit插件的https://github.com/IcesandSora/homebridge-deye 。我是想将其接入Homeassistant,但是并不想修改Homeassistant源码,所以方案就是通过Node-RED进行德业MQTT消息的桥接转发,然后再接入Homeassistant。

协议

HTTP API

我们可以通过手机上的“德业智能”App抓包来研究德业服务相关的协议,通过登录过程的抓包我们可以发现登录成功后,会得到一个token,这个token是德业其余需要权限验证的API请求时必要的条件,也就是请求头中需要一个名为“Authorization”的参数,value为”JWT “+token。后继我们就可以通过相关API就可以获取德业MQTT服务的配置信息,以及设备列表。 需要了解整个请求的过程可以参见我写的这个python脚本 https://github.com/kejinlu/deyeinfo/blob/main/deyeinfo.py

MQTT 设备状态和命令

MQTT的抓包这边建议使用iOS的App来抓,iOS App的MQTT目前是没有走TLS协议的,可以iOS设备连PC分享出来的Wi-Fi,然后PC上使用Wireshark来抓包分析,找到MQTT协议的数据包。

刷新码

首先我们发现进入App之后即使我们不操作,客户端也是不断地发送MQTT消息,每次发送完就可以接收到,服务器端发过来的MQTT消息。其实这个定时不断发送的就是刷新命令,大概是3秒发送一次,德业这边是通过不停的轮询发送MQTT消息的方式来及时刷新设备的状态信息的。

所以我们就知道刷新命令了,后面我们也会用到。

从刷新命令的详细内容可以看到,MQTT消息内容为0001,而且消息内容的格式并不是字符串而是内存数据,这边还有个注意点就是QoS,这边需要设置为0,德业的服务器端貌似对QoS做了校验,反正我测试的时候如果不是0,则发过去没有作用。

设备状态码

接下来研究下返回的设备状态值,

下发设备状态的MQTT消息体解析之后是一个json格式的数据,里面data的内容是一个字符串,这个字符串就是设备的状态码。 14118108101900000000000000000041450000000000 通过设备不同的状态值的比对,我们可以弄清楚哪些数据对应什么内容,这个是需要慢慢设置,然后抓包看数据,进行比照,比较费时间。 需要额外注意的是,不同的设备某些状态值可能并不相同,比如开关机的状态,这些最好自己MQTT抓包确实下。这里的数值都是以DYD-D50B3型号为准。

数据片段 含义
1411  
8 风扇水箱状态(0风扇停转,8风扇打开,4水箱满)
1 开关机状态(0关机,1开机,B开机并设置了定时关机,6关机并开启了童锁,7开机并开启了童锁)
0  
8 压缩机状态(0待机,8运行)
1 风速(0停转,1低风,2中风,3高风)
0 设备模式(0手动,1干衣)
19 设定湿度(16进制格式)
000000000000000000  
41 环境温度(16进制格式,可能是为了表示零下温度,所以转为10进制再减去40才是真实的温度,比如41hex = 65oct 65-40=25,所以25是当前环境温度)
45 环境湿度(16进制格式)
0000000000  

设备设置码

通过在App上对除湿机进行各种设置,我们可以抓到对应设置的编码。

这里可以看到,和刷新码一样,都是二进制格式(图里面是转成了16进制),并不是字符串。 通过各种App的操作设置我们也可以知道他们的各位的含义。

数据片段 含义
08 02 0  
1 设备开关
1 风速(1低风,2中风,3高风)
0 模式(0手动,1干衣)
4b 设置湿度(16进制)
00 00 00  

Node-RED Flows

然后我们将flows.json导入Node-RED

  • “德业除湿机状态接受” 设置德业官方MQTT服务的配置以及状态的topic
  • “状态转发”节点中设置好本地MQTT服务的配置。
  • “自动刷新”节点可以设置主动刷新状态的时间间隔,德业这方便设计的不是特别好,状态的及时更新依赖于本地的轮询刷新命令
  • 三个“设置”节点们需要配置好本地mqtt服务
  • “德业除湿机命令发送”节点设置好德业官方MQTT命令topic
  • “解析状态”和“设置命令”节点中,需要根据自己设备的MQTT协议抓包结果来做相关的修改适配,因为不同设备一些状态码,或者命令码有细微的差别。

Homeassistant配置及使用

根据configuration.yaml中的示范配置,将除湿机和相关的传感器配置到自己的Homeassistant的配置中。

卢克 /
Published under (CC) BY-NC-SA in categories Homelab  tagged with IoT  homeassistant