本帖最后由 mch1992 于 2020-4-20 16:16 编辑
背景:
2017年接触的hass,搭建完后就没有再管过,直到2020年疫情原因闲在家开始倒腾。
一直想用小爱同学控制家里DIY的设备,比如esphome接入的,espeasy接入的设备,最开始看到的是利用大神破解的方法截获黑版小爱的ssh,无奈手里没有,只有绿板,后来看到有人分享了用小爱的开放平台,可以自定义技能,感觉是我想要实现的方式,然后开始研究,发现坛子里的技术达人syjjx发表了一个教学贴,链接https://bbs.hassbian.com/thread-2404-1-1.html,以下所有内容都是我在此基础上调试的,所以是站在巨人的肩膀上。
分割线···················································
syjjx达人发布的方法是基于小爱开发平台改版前,目前的新平台的response和request报文内容有所更改,但大体思路不变,我在此基础上根据目前的开发平台重新梳理以下流程。
第一步:使用自己的小米手机或小爱音箱登录账号申请成为小爱开放平台的开发者
链接https://xiaoai.mi.com
目前申请需要提供本人的个人信息,包括身份证照片等,一般工作日工作时间一个小时就能过审
第二步:申请域名,获取ssl证书,在syjjx的帖子里讲到了,这里不赘述
第三步:在小爱开放平台添加技能
进入控制台,选择技能开发平台→创建新技能→自定义技能
给自己的技能取一个名字,我用的小青,这里最好是用顺口,简单的名字,不然使用的时候会很别扭
1
2
此处划重点,当前的小爱开放平台提供了意图唤醒,用“让小青打开主卧灯”灯这类词可以直接唤醒小爱同学并执行相关指令,在意图唤醒选框打勾,然后如下设置
3
其中(text)内容小爱开放平台称之为槽,用于命中当前技能后发送给我们自己服务器的具体内容
然后接着设置以下内容
4
在小爱的交互逻辑中,你说的话被小爱直接识别为这个自定义技能称之为命中意图,命中意图后你希望将什么语料传送给自己的服务器,就是在这里设置,我的思路是只要是包含“让小青XXXXXXX”的话全部识别为一个意图,统一传送给服务器,后面的语义识别我们自己用python完成,所以进行了如上设置,如果希望在这个平台里自己设置,可以参考官方文档,还是比较详细的。
这里设置好了之后就要设置服务端口
5
我们一般用到测试环境就行,自己的小技能很难过审发布。
https://yourhost:port/value
yourhost替换成你自己申请号ssl证书的域名,port也可以自己设置,匹配python服务端程序就行,value同理
完成以后就可以点击进入测试环境,小爱音箱端和手机端都可以使用,但是要分别建立技能,这个很简单。
第四步:自己在ssl域名指向的服务器中运行该python脚本
整体代码见附件,
main.zip
(2.28 KB, 下载次数: 237)
代码逻辑整体上是参照了syjjx达人的思路,然后根据现在的实际情况有所调整,我把需要值得说明的地方重点描述
### home-assistant服务器的配置信息
host = "XXXXXXXXX"
port = 8123
password = "Bearer ABCD"
headers = {
"Authorization": password,
"Content-Type": "application/json"
}
这里需要划重点,也是我在调试syjjx的代码的时候发现的问题,hass的rest api的认证方式已经发生了变化,syjjx之前的已经不适用,需要换成上面的方法,ABCD换成你的hass申请的永久访问令牌token,xxxxx为你自己的hass服务器ip。
app = Flask(__name__)
@app.route('/value', methods=['POST'])
def index():
open_mic = True
is_session_end = False
tts_word = ""
### 等待小爱同学收到语料后发来报文
data_x = request.get_json()
app.logger.warn(data_x)
### 采用打开小兰命令进入技能
if data_x["request"]["slot_info"]["intent_name"] == "Mi_Welcome":
open_mic = True
is_session_end = False
tts_word="您好主人,我能为你做什么呢?"
### 主动退出技能
elif data_x["request"]["type"] == 2:
open_mic=False
is_session_end=True
tts_word="再见主人,我在这里等你哦!"
### 意图唤醒
elif data_x["request"]["slot_info"]["intent_name"] == "command":
这里是另外一个重点,syjjx原代码用的是判别type的值和‘is_direct_wakeup’字段判别,但是新版小爱取消了这个返回字段,所以我是通过具体intent的字段来判识,实测效果较好。
目前已经实现了在新版小爱开放平台与hass的完全互联,至于怎么玩出花来那就是优化完善python代码的事情了,如果对代码有不理解的地方,可以留言,我会回复,如果对小爱的交互逻辑不理解,可以先看官网的说明文档,不清楚的也可以留言。
第一次发帖,请多指教。
后续我准备把家里60+个自制设备接入homeassistant的过程陆续分享出来。
|