今天我也来标题党一回,本文说的实现方法其实不是小艺直接控制HA设备,因为华为智慧生活不支持HA平台,只是操作看起来像而已,小艺只是起到调用的作用。本文的方法通过手机自带语音助手、fv悬浮球、Home Assistant平台相互配合,让大部分主流品牌手机都可以语音操控各种品牌的智能设备,总体实现思路如下:
语音唤醒手机语音助手——语音调用自定义指令生成通知——fv悬浮球获取通知调用自身语音识别模块——说出指令——转换语音为文本——fv悬浮球将指令文本发送到HA webhook api——HA node-red调用conversation服务控制设备
不熟悉的朋友可能看的一头雾水,没关系,有兴趣的就往下看。
一、Home Assistant
首先需要确保HA可以用平台自带的语音助手用文本进行操控设备,然后在HA node-red新建一个流程,流程用到三个节点:webhook、change、call service,将这三个节点添加到流程中并按顺序连接起来,每个节点的设置参数请看下面例图:

点击右上角三个图标中间那个语音助手,弹出如图对话框,输入文本指令测试是否可以控制设备,比如:打开客厅的灯

整个流程效果如上图,三个debug节点可以不用,只是为了方便调试

webhook节点设置参数,ID通过点击该栏目后面的刷新按钮自动生成,属于安全验证,不要泄露了,记住ID,后面http请求填写URL地址需要用到

change节点设置参数,两项替换值可以不用,只要设定值部分,我是为了兼容其他软件生成的文本指令而增加的,用于去除一些无关文本

call service节点设置参数,照图填写即可
以上流程创建完点击右上角的部署按钮进行部署,至此完成HA部分的设置。
二、智慧生活
打开智慧生活创建一个场景,名称为叫管家,执行任务发送消息通知,内容为叫管家,这里可以自己按需修改,后面fv悬浮球检测通知内容的脚本记得做相应修改即可。

至此智慧生活设置已完成。这个场景的作用就是你跟小艺说叫管家,她会生成一条内容为叫管家的通知。
三、fv悬浮球
在fv悬浮球我创建了三个任务,分别是http post请求、语音控制智能家居、小艺控制智能家居,没有通过一个任务直接完成所有功能,是为了复用减少操作步骤。这里http post请求没有使用软件自带的http请求功能是因为请求数据中的中文会被强制url编码,提高复杂度,所以我用了软件运行JavaScript功能,用JavaScript脚本实现http post请求,为了以后可以给其他任务调用就独立一个任务。

http post请求任务,参数1是请求的url地址,参数2是文本指令,对应JavaScript代码里的arg1和arg2,其中JavaScript脚本内容如下:
var httpRequest = new XMLHttpRequest();
httpRequest.open(&39;POST&39;, arg1, true);
httpRequest.setRequestHeader(&34;Content-type&34;,&34;application/json&34;);
var obj = arg2;
httpRequest.send(JSON.stringify(obj));

将语音控制智能家居独立一个任务是为了方便更多的使用方式,比如通过fv悬浮球的手势启动语音控制,或长按音量键启动等。参数1的url地址是HA的webhook api地址,组成内容为:http://ip:port/api/webhook/id,ip为home assistant服务器ip地址,port为home assistant服务器端口,id就是前面记下的ID字符串。
fv悬浮球自带三个语音模块,分别是本地、百度、谷歌,本地在我的华为nova11无法正常使用,谷歌需要fan强,所以我用的百度,可以在软件设置里进行选择。

小艺控制智能家居任务是配合智慧管家生成的通知来启动语音控制智能家居,实现小艺语音启动语音控制的使用方式。

触发条件选通知——选择应用——智慧生活,一旦有智慧生活的通知就会触发,任务里再对通知内容进行判断要不要启动语音控制智能家居任务。
所有操作已完成,现在可以开始使用小艺进行语音控制智能家居了,语音操作流程就是:“小艺小艺”——手机语音助手弹出——“叫管家”——手机说“好的请说”——“打开客厅的灯”
希望本文可以给有兴趣的朋友一些灵感,举一反三,可以根据自身需求进行定制。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~