『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
楼主: keln

[教程系列] 海尔空调接入到HASS

[复制链接]

1

主题

28

帖子

169

积分

论坛分享达人

积分
169
金钱
141
HASS币
0
 楼主| 发表于 2022-10-31 17:23:01 | 显示全部楼层
astang 发表于 2022-10-31 17:10
我把cmdFrom = '挂式空调C3CE'输出的是:{"data":{"nlpTime":{"query_device_table":0,"nlpTimecost":0," ...

你这个是有问题:"retInfo": "/ù小优没有查到相关信息,请检查设备联网状态,/ù稍后再试",
有设备不是返回这个:
{"data":{"nlpTime":{"query_device_table":0,"nlpTimecost":0,"device_execute":0},"termAction":"response","nlpResult":{"isContinuousDialogue":false,"sync_tts":"小优为你查到,当前空调为关机状态,风速为高风,设置温度为20度,已开启制热,","appVersion":"7.0.4","retStatus":2,"userQuery":"次卧空调状态","playtts":3,"parseStatus":true,"isDialog":false,"response":"小优为你查到,当前空调为关机状态,风速为高风,设置温度为20度,已开启制热,","domain":"Dev.airConditioner","moreDevice":false,"nlpVersion":"dm.2.1.18_2-nlu.TPL","category":"command","quitContinuousDialogue":"yes","results":[{"dev":{"nickName":"次卧空调","wifiType":"00000000000000008080000000041410","name":"次卧空调","id":"04FA83851160","type":"airConditioner","room":"次卧"},"nlpParams":{},"params":{"save":"","consumption":"","currenttemperature":"20","powerstate":"关机","mode":"制热模式","domain":"Dev.airConditioner","nickname":"次卧空调","property":"all","name":"次卧空调","action":"statusEnquiry","windspeed":"高风","device":"空调","direction":""}}],"isMultiDialogue":false}},"processorContextList":[],"response":"/ù小优为你查到,当前空调为关机状态,/ù风速为高风,设置温度为20度,已开启制热","retCode":"00000","retInfo":"/ù小优为你查到,当前空调为关机状态,/ù风速为高风,设置温度为20度,已开启制热","sn":"20221031172206726000714840","triggerId":"","uSpanId":"","uTraceId":""}
你可以用你的海尔智家里用小优问相同的问题看他返回什么
回复

使用道具 举报

9

主题

178

帖子

1363

积分

金牌会员

Rank: 6Rank: 6

积分
1363
金钱
1185
HASS币
0
发表于 2022-10-31 17:28:34 | 显示全部楼层
keln 发表于 2022-10-31 17:23
你这个是有问题:"retInfo": "/ù小优没有查到相关信息,请检查设备联网状态,/ù稍后再试",
有设备不是 ...

我在小优里问:挂式空调XXXX状态,他会回复现在空调是26.00度,希望是你喜欢的温度
回复

使用道具 举报

1

主题

28

帖子

169

积分

论坛分享达人

积分
169
金钱
141
HASS币
0
 楼主| 发表于 2022-10-31 17:34:12 | 显示全部楼层
astang 发表于 2022-10-31 17:28
我在小优里问:挂式空调XXXX状态,他会回复现在空调是26.00度,希望是你喜欢的温度 ...

那你用语音开机,然后再查下信息
从语音回执来看是没有找到设备的。
回复

使用道具 举报

9

主题

178

帖子

1363

积分

金牌会员

Rank: 6Rank: 6

积分
1363
金钱
1185
HASS币
0
发表于 2022-10-31 17:42:26 | 显示全部楼层
keln 发表于 2022-10-31 17:34
那你用语音开机,然后再查下信息
从语音回执来看是没有找到设备的。

app用语音开关空调都是正常的,返回的信息“书房空调已打开”“下午好,没问题,正在关闭空调”。app是这样的,查看对话记录显示每一个反馈命令下面都跟着一个详情页。
图片_20221031174152.jpg
回复

使用道具 举报

1

主题

28

帖子

169

积分

论坛分享达人

积分
169
金钱
141
HASS币
0
 楼主| 发表于 2022-10-31 18:00:05 来自手机 | 显示全部楼层
应该小优不同空调反应的内容不太一样,要针对性的进行解析响应信息
回复

使用道具 举报

9

主题

178

帖子

1363

积分

金牌会员

Rank: 6Rank: 6

积分
1363
金钱
1185
HASS币
0
发表于 2022-10-31 18:15:04 | 显示全部楼层
keln 发表于 2022-10-31 18:00
应该小优不同空调反应的内容不太一样,要针对性的进行解析响应信息

能不能劳驾帮忙看看怎么解决,没学过编程实在是看不明白代码都是什么意思
回复

使用道具 举报

1

主题

28

帖子

169

积分

论坛分享达人

积分
169
金钱
141
HASS币
0
 楼主| 发表于 2022-10-31 19:15:02 | 显示全部楼层
本帖最后由 keln 于 2022-10-31 19:23 编辑
astang 发表于 2022-10-31 18:15
能不能劳驾帮忙看看怎么解决,没学过编程实在是看不明白代码都是什么意思 ...

给你一个
let result = {
    state: 'offline',
    mode: '',
    fan: '',
    temperature: '',
    currtemp: '',
    power: ''
}
let topic = "/" + msg.cmdFrom + "/state";
if (msg.payload && msg.payload.retCode) {
    let retcode = msg.payload.retCode;
    if (retcode == '00000') {
        result.state = 'online'
        let retParams = msg.payload.data.nlpResult.results;
        let retParam = undefined;
        if (retParams.length > 0) {
            retParam = retParams[0]
        }
        if (retParam != undefined && retParam.params != undefined) {
            if (retParam.params.powerstate != undefined) {
                if (retParam.params.powerstate != '关机') {
                    result.power = 0;
                }
                else {
                    result.power = '1';
                    result.mode = "off";
                    result.currtemp = '0';
                }
            }
            if (retParam.params.mode != undefined) {
                let mode = retParam.params.mode.replace('模式', '')
                switch (mode) {
                    case '制冷':
                        result.mode = 'cool'
                        break;
                    case '制热':
                        result.mode = 'heat'
                        break;
                    case '除湿':
                        result.mode = 'dry'
                        break;
                    case '送风':
                        result.mode = 'fan_only'
                        break;
                    case '智能':
                        result.mode = 'auto'
                        break;
                    default:
                        result.mode = 'off'
                        break;
                }
            }
            if (retParam.params.windspeed != undefined) {
                let fan = retParam.params.windspeed;
                switch (fan) {
                    case '低风':
                        result.fan = 'low'
                        break;
                    case '中风':
                        result.fan = 'medium'
                        break;
                    case '高风':
                        result.fan = 'high'
                        break;
                    case '自动风':
                        result.fan = 'auto'
                        break;
                    default:
                        result.fan = ''
                        break;
                }
            }
            if (retParam.params.currenttemperature != undefined) {
                let temperature = retParam.params.currenttemperature;
                if (temperature == '') {
                    result.temperature = 0;
                }
                else {
                    result.temperature = temperature;
                }
                if (result.power == '0') {
                    result.currtemp = result.temperature;
                }
            }
        }
    }
}
msg.payload = {};
msg.payload[topic + "/state"] = result.state;
msg.payload[topic + "/mode"] = result.mode;
msg.payload[topic + "/fan"] = result.fan;
msg.payload[topic + "/temperature"] = result.temperature;
msg.payload[topic + "/power"] = result.power;
msg.payload[topic + "/currtemp"] = result.currtemp;
return msg;
替换处理语音结果的那个节点里试试,这个只能让你的状态正常

回复

使用道具 举报

1

主题

28

帖子

169

积分

论坛分享达人

积分
169
金钱
141
HASS币
0
 楼主| 发表于 2022-10-31 19:16:53 | 显示全部楼层
keln 发表于 2022-10-31 19:15
给你一个
let result = {
    state: 'offline',

如果开机后状态显示还是不正常,那就要对你所有的回执都要重新解析,那就很麻烦了,我这边也没有你那的环境也无法知道怎么解析,你可以试试之前那位大神的
回复

使用道具 举报

9

主题

178

帖子

1363

积分

金牌会员

Rank: 6Rank: 6

积分
1363
金钱
1185
HASS币
0
发表于 2022-10-31 19:26:24 | 显示全部楼层
keln 发表于 2022-10-31 19:16
如果开机后状态显示还是不正常,那就要对你所有的回执都要重新解析,那就很麻烦了,我这边也没有你那的环 ...

好吧,我再试试,谢谢了
回复

使用道具 举报

1

主题

28

帖子

169

积分

论坛分享达人

积分
169
金钱
141
HASS币
0
 楼主| 发表于 2022-10-31 19:37:58 | 显示全部楼层
本帖最后由 keln 于 2022-10-31 19:39 编辑
astang 发表于 2022-10-31 19:26
好吧,我再试试,谢谢了

let result = {
    state: 'offline',
    mode: '',
    fan: '',
    temperature: '',
    currtemp: '',
    power: ''
}
let topic = "/" + msg.cmdFrom + "/state";
if (msg.payload && msg.payload.retCode) {
    let retcode = msg.payload.retCode;
    if (retcode == '00000') {
        result.state = 'online'
        let retParams = msg.payload.data.nlpResult.results;
        let retParam = undefined;
        if (retParams.length > 0) {
            retParam = retParams[0]
        }
        if (retParam != undefined && retParam.params != undefined) {
           
            if (retParam.params.mode != undefined) {
                let mode = retParam.params.mode.replace('模式', '')
                switch (mode) {
                    case '制冷':
                        result.mode = 'cool'
                        break;
                    case '制热':
                        result.mode = 'heat'
                        break;
                    case '除湿':
                        result.mode = 'dry'
                        break;
                    case '送风':
                        result.mode = 'fan_only'
                        break;
                    case '智能':
                        result.mode = 'auto'
                        break;
                    default:
                        result.mode = 'off'
                        break;
                }
            }
            if (retParam.params.windspeed != undefined) {
                let fan = retParam.params.windspeed;
                switch (fan) {
                    case '低风':
                        result.fan = 'low'
                        break;
                    case '中风':
                        result.fan = 'medium'
                        break;
                    case '高风':
                        result.fan = 'high'
                        break;
                    case '自动风':
                        result.fan = 'auto'
                        break;
                    default:
                        result.fan = ''
                        break;
                }
            }

            if (retParam.params.powerstate != undefined) {
                if (retParam.params.powerstate != '关机') {
                    result.power = '0';
                }
                else {
                    result.power = '1';
                    result.mode = "off";
                    result.currtemp = '0';
                }
            }            if (retParam.params.currenttemperature != undefined) {
                let temperature = retParam.params.currenttemperature;
                if (temperature == '') {
                    result.temperature = 0;
                }
                else {
                    result.temperature = temperature;
                }
                if (result.power == '0') {
                    result.currtemp = result.temperature;
                }
            }
        }
    }
}
msg.payload = {};
msg.payload[topic + "/state"] = result.state;
msg.payload[topic + "/mode"] = result.mode;
msg.payload[topic + "/fan"] = result.fan;
msg.payload[topic + "/temperature"] = result.temperature;
msg.payload[topic + "/power"] = result.power;
msg.payload[topic + "/currtemp"] = result.currtemp;
return msg;

刚刚里面有个错误,重新替换下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-26 05:29 , Processed in 3.278149 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表