『瀚思彼岸』» 智能家居技术论坛
标题: 德业除湿机接入以后获取全部状态 [打印本页]
作者: itispip 时间: 2021-7-2 13:21
标题: 德业除湿机接入以后获取全部状态
本帖最后由 itispip 于 2021-7-6 01:49 编辑
1. 首先,如何接入德业除湿机,请看大神的教程。教程看起来很麻烦,实际上只要按着它说的一步一步做,一定能接入
https://xiking.win/2020/11/12/3- ... d-to-homeassistant/
2. 教程只给了开关功能接入,那么之后如何解读获得的status message,从而得到所有的状态呢?
data = json.loads(payload)['data']
第1-4位: 设备型号代码
第5位: 8 - 风扇运行中,4-水满,0-风扇停止
第6位: 2 - 断电, 3 - 通电,B - 定时断电
第7位: 作用未知
第8位: 0 - 压缩机停止,8 - 压缩机工作 。各自+1 代表 负离子功能同时打开
第9位: 1,2,3 风量挡位
第10位: 0 - 普通模式,1 - 干衣模式,2 - 空气净化模式,3 - 自动模式
11-12位: 19 - 连续除湿,1E-目标30%,23-目标35%,28-目标40% .... (16进制往上加5类推)
13-14位: 定时关机设置的时长
17-20位: 定时关机倒计时
29-32位: 作用未知
第33位: 实际湿度的十位数 - 2,例如: 这里3 代表实际的50 ( 3+2, 再乘以10)
第34位: 实际湿度的个位数 + 2, 例如: 这里3 代表实际的1 ( 3-2)
35-36位: 温度
作者: dscao 时间: 2021-7-2 13:32
请问这种方式接入后,原有的本地mqtt设备如何不受影响?
作者: itispip 时间: 2021-7-2 13:57
本帖最后由 itispip 于 2021-7-2 13:59 编辑
HomeAssistant本身只支持一个MQTT服务器。但这是很容易解决的问题
方案一:你本地的MQTT服务器使用bridge模式,把所有你需要追踪的MQTT topic都集中过来。
方案二:使用NodeRed来接收和处理其它非HA默认的其它MQTT服务器的消息。
我个人使用的是方案一,集中了本地服务器,小米Gateway3的BLE消息,巴法云,还有德业的MQTT消息。
作者: fhxu 时间: 2021-7-2 21:10
大佬能不能出个教程,我也是德业除湿机,不知道怎么集合到同一个mqtt
还有你的这个代码用在哪里,怎么用,能具体一点吗?
谢谢
作者: itispip 时间: 2021-7-4 01:55
fhxu 发表于 2021-7-2 21:10
大佬能不能出个教程,我也是德业除湿机,不知道怎么集合到同一个mqtt
还有你的这个代码用在哪里,怎么用, ...
德业接入的完整教程在一楼已经给了啊,按那个做100%能成功。我不是大佬,那个教程的作者yongman才是大佬,我不过按他说的做完,把他懒得做的德业状态码都找出来而已。
作者: syzylj 时间: 2021-7-4 06:26
谢谢分享。。。。。。。。。。。。。。
作者: fhxu 时间: 2021-7-4 11:12
你的这个状态怎么用,我用他的已经接入了,只能开关
作者: dscao 时间: 2021-7-4 11:12
谢谢!之前看到过要修改mqtt组件,又担心影响原有mqtt设备,一直没弄。这两天折腾了几个晚上,先是用mqtt bridge方案,老是连接不上,后来尝试加参数,终于接入,再后来抓包找到控制码 能控制开关了但一直还是收不到消息。最后改用nodered连接mqtt服务器,互相将topic转发,终于成功。有时间再优化优化。
作者: fhxu 时间: 2021-7-4 18:14
我现在弄了两个hass,一个专门就是为了控制除湿机,这很傻,可是又不知道怎么用nodered来控制
作者: tzungtzu 时间: 2021-7-5 09:30
感谢,我的除湿机是DYD-E12A3,测试了一下,可以看到5、6、31-34的数据变化,可以做几个传感器,35-36我的数据是0。我记得抓包看到了彩云天气,猜想app上的温湿度可能是用的彩云天气的。
作者: fhxu 时间: 2021-7-5 09:48
方案一:你本地的MQTT服务器使用bridge模式,把所有你需要追踪的MQTT topic都集中过来。
这个怎么配置,望能指点一下,谢谢
作者: itispip 时间: 2021-7-6 00:40
本帖最后由 itispip 于 2021-7-6 01:12 编辑
1楼的教程里面,原作者已经更正过,不用修改mqtt主键,在YAML里面,按照以上的状态码,有正确的设置就可以了。例如:按以后的状态码,替换教程里的payload_on,就可以了。不需要再修改原版的mqtt组件。
作者: itispip 时间: 2021-7-6 00:54
本帖最后由 itispip 于 2021-7-6 01:36 编辑
switch:
- platform: mqtt
name: deye
unique_id: deye_switch
state_topic: xxxx/xxxx/xxx/status/hex
command_topic: xxx/xxxx/xxx/command/hex
value_template: "{{ value_json.data[5:6] }}" #(参考1楼的状态码,抓出第6位的值)
state_on: 3 #(参考1楼的状态吗,第6位的值为3代表通电)
state_off: 2 #(参考1楼的状态吗,第6位的值为2代表断电)
payload_on: "\x08\x02\x03\x20\x19\x00\x00\x00\x00\x00" #(参考1楼状态码,这个命令代表:启动压缩机-设置风力为2挡-通电-连续除湿模式-没有定时。你可以更改定义你自己的开机状态)
payload_off: "\x08\x02\x02\x20\x19\x00\x00\x00\x00\x00" #(参考1楼状态码,这个命令代表:断电,同时保存下次启动的缺省状态为启动压缩机,风力2档,连续除湿,没有定时)
更具你自己的需要,再添加几个Sensor/binary Sensor/cover之类的,例如增加温度和湿度感应sensor:
sensor: - platform: mqtt
name: 德业温度
unique_id: deye_temperature
state_topic: xxxx/xxxx/xxx/status/hex
value_template: "{{ (value_json.data[34:36]) }}" #(根据1楼的状态码,35-36位是温度)
unit_of_measurement: '°c'
- platform: mqtt
name: 德业湿度
unique_id: deye_humidity
state_topic: xxxx/xxxx/xxx/status/hex
value_template: "{{ (value_json.data[32:33]|int+2)*10 + (value_json.data[33:34]|int-2) }}" #(根据1楼的状态码,33-34位是湿度)
unit_of_measurement: '%'
同理你可以增加风扇挡位,水满感应之类的。把所有自定义的部件再group在一起。一个完整的德业除湿机控制卡就出现了。
Deye:
name: 德业 T22A3
entities:
- switch.deye_switch
- sensor.deye_temperature
- sensor.deye_humidity
作者: itispip 时间: 2021-7-6 01:04
本帖最后由 itispip 于 2021-7-6 02:01 编辑
MQTT服务器这部分不属于HomeAssistant,看你自己使用的MQTT服务器是哪个,由MQTT服务器自己决定。例如,我使用的是mosquitto,它的bridge设置如下。
# ==========
# Bridges
# ==========
connection Deye
address xxxxx.mqtt.iot.gz.baidubce.com:1883
topic xxx/xxx/xxx/status/hex in
topic xxx/xxx/xxx/command/hex out
remote_username xxx/xxx
remote_password xxx
local_clientid xxx
remote_clientid xxx
bridge_protocol_version mqttv311
try_private false
notifications false
bridge_outgoing_retain false
bridge_attempt_unsubscribe false
cleansession false
keepalive_interval 60
这里面的关键是,除了state topic和command topic,什么都不能发给德业服务器,否则就会被拒绝连接。所以try_private, notifications, retain, unsubscribe之类的一切会发送额外数据的东西都要设置为false。具体你的MQTT服务器怎么设置,你得自己看。
作者: itispip 时间: 2021-7-6 01:10
本帖最后由 itispip 于 2021-7-6 02:03 编辑
不同的机型配置的硬件传感其可能不一样。温度因为是没有加密的,你可以看看完整的status值里面,有没有哪个位置的值恰好等于温度的。如果没有,可能你的猜测就是对的,你的机型硬件就是没有温度传感的。如果有,参考13楼的example,相应的在yaml里面修改value_template抓取的位置就行了。这个方便的地方在于无需修改MQTT的原版组件,只需要从原始的status里面抓出不同的位就可以了,哪怕家里有几台不同型号的德业也可以同时接入。
作者: sl4pc 时间: 2021-7-6 08:43
厉害了,回家折腾一下
作者: tzungtzu 时间: 2021-7-6 12:03
嗯,我获取了温湿度信息,跟家里小米温湿传感器还是有差距,不知道哪个准确哈哈。另外想请教一下,我对mqtt还不是很熟悉,在添加这个mqtt配置之后,如果我有其他mqtt想要连接,应该怎么办,我的ha没有add-on,不知道应该怎么添加
作者: itispip 时间: 2021-7-6 13:40
mqtt的bridge想添加多少个就添加多少个,只要你机器受得了。
作者: flashpig 时间: 2021-7-7 08:17
已按此方法接入,非常强大!感谢楼主!
作者: fhxu 时间: 2021-10-19 16:48
1634633212: Bridge app_b5aaa12054ce11e sending CONNECT
1634633212: Client app_b5aaa12054ce11e disconnected: Broken pipe.
哥们
提示断开
local_clientid
remote_clientid
这两个值是不是写一样的,就是那个app_开头的?
作者: fhxu 时间: 2021-10-20 18:59
本帖最后由 fhxu 于 2021-10-20 19:08 编辑
已经桥接成功了,数据好像不刷新,这个能设置刷新频率吗?状态都不能自动更新
作者: itispip 时间: 2021-10-27 23:11
本帖最后由 itispip 于 2021-10-27 23:25 编辑
fhxu 发表于 2021-10-19 16:48
1634633212: Bridge app_b5aaa12054ce11e sending CONNECT
1634633212: Client app_b5aaa12054ce11e dis ...
是的。我用的broker是mosquitto,不知道你用的是什么。反正mosquitto我的bridge配置见14楼。
sending Connect之后立刻就disconnect,肯定是你的配置里面有什么东西写错了,一连接立刻就被踢了。配置要区分大小写。
作者: itispip 时间: 2021-10-27 23:21
状态是能自动更新的,只是更新间隔时间很长。
德业的官方App是每隔10秒刷新一次的。你可以用mqtt模拟这个刷新动作。
刷新的方法是每隔10秒,用mqtt.publish方法往服务器发一条command_topic
topic: 参见14楼的command_topic
payload: "\0\x01"
qos: 0
retain: false
作者: tadgtd 时间: 2022-1-26 15:04
大佬十六进制转十进制的代码貌似有问题,16进制数据带字母时报错
作者: GavinChan 时间: 2022-4-22 19:22
大佬,请问下,控制的十六进制代码和位置,跟1楼的是一样的吗
作者: GavinChan 时间: 2022-4-24 10:38
大佬,这个发过去不会有返回呀
作者: isunyb 时间: 2022-5-8 16:51
本帖最后由 isunyb 于 2022-5-8 18:40 编辑
......
1651998137: Config loaded from /etc/mosquitto/mosquitto.conf.
1651998137: Loading plugin: /usr/share/mosquitto/auth-plug.so
1651998137: ├── Username/password checking enabled.
1651998137: ├── TLS-PSK checking enabled.
1651998137: └── Extended authentication not enabled.
1651998137: Opening ipv4 listen socket on port 1883.
1651998137: Opening ipv6 listen socket on port 1883.
1651998137: Opening websockets listen socket on port 1884.
1651998137: Warning: Mosquitto should not be run as root/administrator.
1651998137: Connecting bridge Deye (ff7534ccae4******00e0f811e.mqtt.iot.gz.baidubce.com:1883)
1651998137: mosquitto version 1.6.12 running
1651998137: New connection from 127.0.0.1 on port 1883.
1651998137: Socket error on client <unknown>, disconnecting.
1651998239: New connection from 172.30.32.2 on port 1883.
1651998239: Socket error on client <unknown>, disconnecting.
1651998241: New connection from 172.30.32.1 on port 1883.
1651998241: New client connected from 172.30.32.1 as 1cMO2FTDueqAmUmHp (p2, c1, k60, u'homeassistant').
1651998359: New connection from 172.30.32.2 on port 1883.
1651998359: Socket error on client <unknown>, disconnecting.
1651998479: New connection from 172.30.32.2 on port 1883.
1651998479: Socket error on client <unknown>, disconnecting.
请教大佬,提示端口错误,不知道是啥原因?是不是需要把1883端口映射出去?
作者: isunyb 时间: 2022-5-8 18:43
是不是把本地的1883端口映射给对方?
作者: isunyb 时间: 2022-5-8 18:58
居然路由器里有一条先前可能为了测试外网连进来的1883端口映射,把这条删掉居然通了
作者: Clark 时间: 2022-5-8 20:38
谢谢楼主,也有德业除湿机需求
作者: isunyb 时间: 2022-5-9 10:28
1652050921: New connection from 172.30.32.2:40654 on port 1883.
1652050921: Client <unknown> closed its connection.
1652051041: New connection from 172.30.32.2:40724 on port 1883.
1652051041: Client <unknown> closed its connection.
1652051074: New connection from 123.160.221.20:56728 on port 1883.
error: received null username or password for unpwd check
1652051074: Client <unknown> disconnected, not authorised.
1652051084: New connection from 123.160.221.20:51324 on port 1883.
1652051084: Client <unknown> disconnected due to protocol error.
1652051094: New connection from 123.160.221.20:19364 on port 1883.
1652051094: Client <unknown> disconnected due to protocol error.
1652051104: New connection from 123.160.221.20:36144 on port 1883.
1652051104: Client <unknown> disconnected due to protocol error.
1652051114: New connection from 123.160.221.20:12220 on port 1883.
1652051114: Client <unknown> disconnected due to protocol error.
1652051124: New connection from 123.160.221.20:56342 on port 1883.
1652051124: Client <unknown> disconnected due to protocol error.
1652051127: New connection from 111.7.96.149:57752 on port 1883.
error: received null username or password for unpwd check
1652051127: Client <unknown> disconnected, not authorised.
1652051137: New connection from 111.7.96.149:57600 on port 1883.
1652051137: Client <unknown> disconnected due to protocol error.
1652051147: New connection from 111.7.96.149:35458 on port 1883.
1652051147: Client <unknown> disconnected due to protocol error.
1652051157: New connection from 111.7.96.149:13828 on port 1883.
1652051157: Client <unknown> disconnected due to protocol error.
1652051161: New connection from 172.30.32.2:40846 on port 1883.
1652051161: Client <unknown> closed its connection.
1652051167: New connection from 111.7.96.149:13802 on port 1883.
1652051167: Client <unknown> disconnected due to protocol error.
一直在不断连接-断开状态循环,不知道啥问题
作者: kiethrios 时间: 2022-6-17 10:41
我同样的配置,写在yongman大哥的mqtt里,就能开关了。
但是我想用mqtt.fx先试call一下其它,比如取个状态啥的,就1-3秒内就会把我resetting client。听闻是单用名登录我就把ha的mqtt关了,然后把手机上的app也退出了,但mqtt.fx也还是resetting client。
请问下大佬,是不是这个mqtt就是这样。在那踢之前,就要先发布指令,然后就会被踢?还是我mqtt.fx配得不对,但mqttx也如此,看了好多次,也没啥好配的啊。。。
求大佬指点
作者: kiethrios 时间: 2022-6-17 11:17
现在我把所有的都关了,然后只用mqtt.fx,给我更长时间,然后又把我踢了,大概给了10秒左右
作者: bg6cq 时间: 2022-6-17 11:18
感谢,参考这个我把型号是 DYD-G25A3 的德业除湿机接上了,很方便
switch:
platform: mqtt
name: deye
unique_id: deye_switch
state_topic: ff753**************/8d52bc*********21/be062***********09/status/hex
command_topic: ff75***********/8d52***********/b**********009/command/hex
state_on: "8" #开机
state_off: "0" #关机或待机
value_template: "{{ value_json.data[4:5] }}"
payload_on: "\x08\x02\x01\x30\x3c\x00\x00\x00\x00\x00" #(这是G25A3的控制码,开机,高风,湿度3C=60)
payload_off: "\x08\x02\x00\x30\x3c\x00\x00\x00\x00\x00" #(这是G25A3的控制码,关机)
sensor:
- platform: mqtt
name: deye_target_humidity
state_topic: 'ff7534c***************/8d52bc78f385*************/be062f9cb*********/status/hex'
device_class: humidity
unit_of_measurement: '%'
value_template: "{{value_json.data[10:12]|int(0,16)}}"
- platform: mqtt
name: deye_humidity
state_topic: 'ff7534c***************/8d52bc78f385*************/be062f9cb*********/status/hex' device_class: humidity
unit_of_measurement: '%'
value_template: "{{value_json.data[32:34]|int(0,16)}}"
- platform: mqtt
name: deye_temperature
state_topic: 'ff7534c***************/8d52bc78f385*************/be062f9cb*********/status/hex'
device_class: temperature
unit_of_measurement: °C
value_template: "{{value_json.data[30:32]|int(0,16) - 40 }}"
- platform: mqtt
name: deye_fan
state_topic: 'ff7534c***************/8d52bc78f385*************/be062f9cb*********/status/hex'
value_template: >-
{% if value_json.data[8:9] == '1'%}
低
{% else%}
高
{% endif %}
- platform: mqtt
name: deye_waterfull
state_topic: 'ff7534c***************/8d52bc78f385*************/be062f9cb*********/status/hex'
value_template: >-
{% if value_json.data[4:5] == '4'%}
水满
{% else%}
正常
{% endif %}
homeassistant:
customize:
switch.deye:
friendly_name: 除湿
sensor.deye_target_humidity:
friendly_name: 设置湿度
sensor.deye_humidity:
friendly_name: 湿度
sensor.deye_temperature:
friendly_name: 温度
sensor.deye_fan:
friendly_name: 风速
sensor.deye_waterfull:
friendly_name: 水满
作者: kiethrios 时间: 2022-6-22 10:44
后来我发现是Ha里的MQTT一直在连,所以其它客户端马上就被踢掉。
我把HA的MQTT关了,MQTTX就能连上去,大概10秒被踢。我去看HA的log,其实也是一直被踢的,看来是服务器行为。
作者: kiethrios 时间: 2022-6-22 16:56
但是payload值不知道要怎么传,看代码里的_init_.py,是用struct.pack,我输出了pack后的结果就是那种/00/0x/00之类的一串数字,用hex然后publish出去,没反应啊。topic是configuration.yaml里的那个topic,在ha的mqtt里可以,用mqttx客户端测试玩就不行。
因为想用mqtt先测出来,然后搞到nodered里。
作者: 隔壁的王叔叔 时间: 2022-9-7 15:04
本帖最后由 隔壁的王叔叔 于 2022-9-7 15:19 编辑
大佬,感谢,我用node-red连上 了
作者: 隔壁的王叔叔 时间: 2022-9-7 16:57
你好,请问你这些配置是写到哪个文件里的?
作者: 隔壁的王叔叔 时间: 2022-9-13 19:26
大佬,请问这一步怎么搞?同步太慢了,点了开关,也没有动静
作者: 隔壁的王叔叔 时间: 2022-9-14 10:47
你这个开关能控制吗?我的开关点不动,只能状态更新,我用23楼里的方法10秒钟发送一个,也没什么动静。并且这个设置不能控制,还是有优化的空间。
作者: lv5299 时间: 2022-9-14 10:51
我是欧井的除湿机,不知道方法能不能通用了
作者: itispip 时间: 2022-11-17 19:34
点不动的唯一可能行就是payload写错了。仔细检查一下。
作者: afkkk 时间: 2022-11-17 23:29
第33位: 实际湿度的十位数 - 2,例如: 这里3 代表实际的50 ( 3+2, 再乘以10)
第34位: 实际湿度的个位数 + 2, 例如: 这里3 代表实际的1 ( 3-2)
这里的例子是33,这个算法的结果是51。
但hex(33)不就等于dec(51)么?感觉是不是想复杂了?
作者: 隔壁的王叔叔 时间: 2022-11-18 09:08
感谢大佬,我用论坛里另外一个方法接入,现在没问题了。
作者: Lee4242 时间: 2022-12-29 02:42
请问是另外哪个方法,可否分享一下帖子链接?
作者: 隔壁的王叔叔 时间: 2022-12-31 22:47
https://bbs.hassbian.com/thread-17834-1-4.html这个
作者: jsq2627 时间: 2023-2-21 15:52
本帖最后由 jsq2627 于 2023-2-21 15:53 编辑
反编译 apk 挖出来了完整定义:
第1-4位:成功失败的标识位,不用理会
第5位:(转换为二进制)4个 bit 分别表示:Fan_switch / Watertank_state / Defrost_state / Poweron_flag
第6位:(转换为二进制)4个 bit 分别表示:Poweroff_flag / Lock_switch / Wind_switch / Sys_switch
第7位:(转换为二进制)4个 bit 分别表示:未定义 / 未定义 / 未定义/ Environment_degree
第8位:(转换为二进制)4个 bit 分别表示:Press_state / Electromagnetic_state / Pump_switch / Anion_switch
第9位:风速,范围 [0, 4] 共五档
第10位:模式。0 - 普通模式,1 - 干衣模式,2 - 空气净化模式,3 - 自动模式。4/5/6 定义未知
11-12位:19 - 连续除湿,1E-目标30%,23-目标35%,28-目标40% .... (16进制往上加5类推)
13-14位:定时关机的时间,小时位(16进制)
15-16位:定时关机的时间,分钟位(16进制)
17-18位:定时关机倒计时,小时位(16进制)
19-20位:定时关机倒计时,分钟位(16进制)
21-22位:定时开机的时间,小时位(16进制)
23-24位:定时开机的时间,分钟位(16进制)
25-26位:定时开机倒计时,小时位(16进制)
27-28位:定时开机倒计时,分钟位(16进制)
29-30位:蒸发器温度(16进制)
31-32位:环境温度(16进制)
33-34位:环境湿度(16进制)
35-36位:出风温度(16进制)
37-44位:目前都未使用
注意温湿度都是16进制表示,不要直接拿来用,要转换为10进制。
温度的十进制数值=实际温度+40,比如温度0表示实际温度 -40 度
作者: jsq2627 时间: 2023-2-21 16:16
本帖最后由 jsq2627 于 2023-2-21 16:23 编辑
还有 command 定义(16进制):
Byte 1-2:固定为 08 02
Byte 3:二进制8个bit分别表示:固定为0 / Anion_switch / Pump_switch / Poweron_flag / Poweroff_flag / Lock_switch / Wind_switch / Sys_switch
Byte 4:高位4bit表示风速,低位4bit表示模式
Byte 5:目标湿度
Byte 6:定时关闭时间,小时位
Byte 7:定时关闭时间,分钟位
Byte 8:定时开启时间,小时位
Byte 9:定时开启时间,分钟位
Byte 10:固定为 00
另外,单独发送 00 01 可以触发下发最新 state。可以定时发送 00 01 避免被踢(可以当成 keep alive 包)。
作者: hunterfox 时间: 2024-4-8 08:56
本帖最后由 hunterfox 于 2024-4-8 08:58 编辑
[attach]57716[/attach]德业 DYD-T22A3 接入 感谢
作者: rmyyzf 时间: 2024-6-21 11:16
好像接口出问题啦!!等待更新!!
欢迎光临 『瀚思彼岸』» 智能家居技术论坛 (https://bbs.hassbian.com/) |
Powered by Discuz! X3.5 |