海尔空调接入到HASS
本帖最后由 keln 于 2022-10-31 11:43 编辑家里买了两台海尔空调,可以用海尔智家App控制,使用起来其实并不是很方便,这几天接触到了HASS,在论坛中搜索解决方案,终于在node-red板块搜到了解决方案,经过坛友提供的方法及摸索终于将这两台空调接入到了Hass中,看到原帖(海尔NodeRed节点发布【node-red-contrib-haier】 - 『Node-RED』综合讨论区 - 『瀚思彼岸』» 智能家居技术论坛 - Powered by Discuz! (hassbian.com))中还有不少坛友问如何接入,想到很多坛友也和我一样是hass和node-red的小白用户,正所谓取之于论坛,回馈于论坛,遂将研究结果和大家一起共享,大神略过。。。。思路参考风雨透大神的思路(海尔NodeRed节点发布【node-red-contrib-haier】 - 第10页 - 『Node-RED』综合讨论区 - 『瀚思彼岸』» 智能家居技术论坛 - Powered by Discuz! (hassbian.com)第98楼)
0x01、使用的工具:
本人使用的群晖里的docker进行部署以下均为群晖里设置,其他请网上查找对应方法。
HASS: 采用的是docker部署,部署方式参考(Home Assistant 智能家居系统搭建指南(米家+Siri) - 知乎 (zhihu.com)),这里就不赘述了,这里注意如果想使用homekit网络采用使用与docker host相同的网络,不然iPhone等设备无法连接。
MQTT:采用docker部署(查找emqx镜像)进行部署即可(登入用户:admin 、public),此处注意两个端口的映射
1、18083:管理界面端口
2、1883:服务的端口后面节点的配置里需要使用
其他很多端口我没有用到也没有研究,有兴趣的可以去研究下
NODE-RED:采用docker部署,此处网络我也是采用docker host相同的网络
0x02、安装:
HASS: 需要安装Node-RED Companion(可以通过hacs安装,部署参考里面有安装这个的方法)
NODE-RED: 需要node-red-contrib-haier(在节点管理->安装里查找管理,很方便)
0x03、配置:
node-red(地址:http://你的部署服务器地址:1880)
mqtt配置:
1、随意拖一个mqtt-in,双击该节点,在打开的窗口里单击服务器后面的那个笔的按钮
账号密码输不输不知道有没有影响,反正我是输了
node-red-contrib-haier(我们的主角,感谢ningcol的分享(海尔NodeRed节点发布【node-red-contrib-haier】 - 『Node-RED』综合讨论区 - 『瀚思彼岸』» 智能家居技术论坛 - Powered by Discuz! (hassbian.com))
随意拖一个海尔机器人到流程中,双击进行配置
安全性自己评估,没有研究,反正我是输了
hass配置:
node-red配置:参考论坛帖子,很多都有,只做集成如果不想再hass访问node-red的编辑页面视乎也可以不配置
0x04 海尔空调接入,其他设备需要自行研究此处只讲思路
1、hass添加mqtt的设备,需要修改configuration.yaml文件,参考附件里的内容,你可以自行修改
命令构成(仅配合我的流程):/{1}/{2}/{3}
{1}:在海尔智家中设置的设备名称,很重要,一定要设置,不然无法使用
{2}:cmd:设置命令,state:表示状态接收命令
{3}:实际命令
具体参考如下:
#设置风力的命令
fan_mode_command_topic: "/次卧空调/cmd/fan"
#接收空调风力状态的命令
fan_mode_state_topic: "/次卧空调/state/fan"
#接收可用状态状态的命令
availability_topic: '/次卧空调/state/state'
#设置温度的命令
temperature_command_topic: '/次卧空调/cmd/temperature'
#接收温度状态的命令
temperature_state_topic: '/次卧空调/state/temperature'
#接收当前温度状态的命令
current_temperature_topic: '/次卧空调/state/currtemp'
2、node-red流程,具体流程参考附件
如果是空调需要变动以下就可以使用,
1、海尔默认配置(海尔机器人)和nas(MQTT的配置)配置
2、mqtt接收命令
hass开机自动获取一次状态:
触发条件:home assistant 开机
动作:mqtt publish:
Topic:你要获取的设备的状态,比如我要获取我的次卧空调如下:
/次卧空调/cmd/state
payload:20
为了防止开机mqtt设备还没有初始化故意延时20s,可以自己定义
以上就是本次将海尔空调接入到hass的过程,本人也是刚接触Hass,有很多不足,请大家包涵
感谢楼主分享,虽然刚刚也才初步弄好,不过楼主这个帖子真的能帮助想我一样的小白! astang 发表于 2022-10-31 12:27
感谢楼主分享,虽然刚刚也才初步弄好,不过楼主这个帖子真的能帮助想我一样的小白! ...
我看到你的疑问,可以参考我的例子,我的里面是做设备不是做实体的 keln 发表于 2022-10-31 12:50
我看到你的疑问,可以参考我的例子,我的里面是做设备不是做实体的
我又按照你的设置了一遍,现在设备显示的不可用,不知道问题出到哪里了 astang 发表于 2022-10-31 15:17
我又按照你的设置了一遍,现在设备显示的不可用,不知道问题出到哪里了 ...
设备在哪里显示不可用,是配置里显示不可用还是在仪表台显示不可用,两个是不同意思,在配置里应该是你配置不对,在仪表台应该是状态不对,你可以把的你的配置发个出来一起研究研究 在配置-设备与集成-MQTT集成里可以看到空调设备(根据yaml生成的),但是进去设备界面显示不可用,添加到主页卡片也是不可用。我是用addon安装的nodered插件,不是hacs
yaml里的配置
mqtt:
button:
- unique_id: zwkt-zt
name: '主卧空调状态查看'
command_topic: '/主卧空调/cmd/state'
climate:
- device:
identifiers: zw-haier-kt
manufacturer: Haier
model: Haier
name: 主卧空调
sw_version: 1.1.3
fan_mode_command_topic: "/主卧空调/cmd/fan"
fan_mode_state_topic: "/主卧空调/state/fan"
fan_modes:
- auto
- low
- medium
- high
max_temp: 32.0
min_temp: 16.0
mode_command_topic: '/主卧空调/cmd/mode'
mode_state_topic: '/主卧空调/state/mode'
modes:
- auto
- 'off'
- cool
- heat
- dry
- fan_only
name: 主卧空调
availability_topic: '/主卧空调/state/state'
availability_mode: all
payload_off: 1
payload_on: 0
precision: 1
temp_step: 1
temperature_command_topic: '/主卧空调/cmd/temperature'
temperature_state_topic: '/主卧空调/state/temperature'
temperature_unit: C
unique_id: zw-haier-kt
current_temperature_topic: '/主卧空调/state/currtemp'
本帖最后由 keln 于 2022-10-31 16:11 编辑
astang 发表于 2022-10-31 15:48
在配置-设备与集成-MQTT集成里可以看到空调设备(根据yaml生成的),但是进去设备界面显示不可用,添加到主 ...
你可以试试一个调试方法:
添加一个inject,一个function, 一个debug放到我图里的位置
cmdFrom =你要查看的空调
function3里填写代码
let cmdFrom = '主卧空调';
msg.cmdFrom = cmdFrom;
if (msg.payload != undefined && msg.payload != null && msg.payload != '') {
msg.delay = msg.payload;
}
else {
msg.delay = 0;
}
if (cmdFrom != '') {
msg.payload = cmdFrom + "状态";
}
return msg;
然后部署,完成后,点击在看看结果
keln 发表于 2022-10-31 16:09
你可以试试一个调试方法:
添加一个inject,一个function, 一个debug放到我图里的位置
好像是空调名字的问题,我输入主卧空调会显示:{"/主卧空调/state/state":"offline","/主卧空调/state/mode":"","/主卧空调/state/fan":"","/主卧空调/state/temperature":"","/主卧空调/state/power":"","/主卧空调/state/currtemp":""}。
在智家的语音助手里会显示主卧没有找到空调。我要是把空调名字改成默认的“挂式空调XXXX”,语音助手就会显示空调状态,但是返回的信息是:TypeError: Cannot read properties of null (reading 'length') 本帖最后由 keln 于 2022-10-31 17:09 编辑
astang 发表于 2022-10-31 16:53
好像是空调名字的问题,我输入主卧空调会显示:{"/主卧空调/state/state":"offline","/主卧空调/state/mo ...
你可以在后面加一个debug看下原生输出的是什么,估计不同的空调输出不一样,处理语音结果的模块要修正才行
本帖最后由 astang 于 2022-10-31 19:15 编辑
keln 发表于 2022-10-31 17:01
你可以在后面加一个debug看下原生输出的是什么,估计不同的空调输出不一样
...
我把cmdFrom = '挂式空调XXXX'输出的是:{"data":{"nlpTime":{"query_device_table":0,"nlpTimecost":0,"device_execute":0},"termAction":"response","nlpResult":{"isContinuousDialogue":false,"sync_tts":"小优没有查到相关信息,请检查设备联网状态,稍后再试","appVersion":"7.0.4","retStatus":2,"userQuery":"挂式空调XXX状态","playtts":3,"parseStatus":true,"isDialog":false,"response":"小优没有查到相关信息,请检查设备联网状态,稍后再试","domain":"Dev.airConditioner","moreDevice":false,"nlpVersion":"dm.2.1.18_2-nlu.TPL","category":"command","quitContinuousDialogue":"yes","results":[{"dev":{"nickName":"挂式空调XXXX","wifiType":".....","name":"挂式空调XXXX","id":"......","type":"airConditioner"},"nlpParams":{},"params":{"domain":"Dev.airConditioner","nickname":"挂式空调XXXX","property":"all","name":"挂式空调XXXX","action":"statusEnquiry"}}],"isMultiDialogue":false}},"processorContextList":[],"response":"/ù空调现在的温度是26.00度","retCode":"00000","retInfo":"/ù小优没有查到相关信息,请检查设备联网状态,/ù稍后再试","sn":"......","triggerId":"","uSpanId":"","uTraceId":""}
改成智家里改过的设备名字“书房空调”会输出:{"data":{"nlpTime":{"query_device_table":0,"nlpTimecost":0,"device_execute":0},"termAction":"termDecide","nlpResult":{"isContinuousDialogue":false,"sync_tts":"书房没有找到空调呢","appVersion":"7.0.4","retStatus":2,"errorInfo":"没有找到当前设备","userQuery":"书房空调状态","playtts":3,"parseStatus":true,"isDialog":false,"response":"书房没有找到空调呢","domain":"Dev.airConditioner","moreDevice":false,"nlpVersion":"dm.2.1.18_2-nlu.TPL","category":"command","quitContinuousDialogue":"yes","results":[{"nlpParams":{},"params":{"domain":"Dev.airConditioner","property":"all","action":"statusEnquiry","errorCode":"0002","errorInfo":"没有找到当前设备","device":"空调","room":"书房"}}],"isMultiDialogue":false}},"processorContextList":[],"response":"/ù书房没有找到空调呢","retCode":"I00004-00011","retInfo":"/ù书房没有找到空调呢","sn":"......","triggerId":"","uSpanId":"","uTraceId":""}