0%

树莓派制作空调遥控器3: 天猫精灵控制空调

一个更加方便控制空调的方式,就是让树莓派接入天猫精灵,只需动动嘴就能开关空调,再也不用满屋子找空调遥控器和手机了。放心,只有你的天猫精灵能够控制你的空调,别人的天猫精灵控制不了。一起来看看吧~

空调遥控器系列教程

一、树莓派制作空调遥控器1:使用红外发射管制作空调遥控器
二、树莓派制作空调遥控器2: 在网页中控制空调
三、树莓派制作空调遥控器3: 天猫精灵控制空调

准备工作

  1. 能够在树莓派上使用命令行控制空调,如果没有完成,请转到《树莓派制作空调遥控器1:使用红外发射管制作空调遥控器》。
  2. 能够在外网访问树莓派,本教程使用一台云服务器做中转,给树莓派提供内网穿透。
  3. 有一台天猫精灵(方糖、方糖R、天猫精灵、天猫精灵CC都可以)。
  4. 安装天猫精灵APP。

注意:树莓派必须能在外网访问,否则天猫精灵服务器无法调用树莓派。

调用步骤

为方便大家理解,简单说一下调用步骤:

  1. 用户说出“天猫精灵,打开空调”。
  2. 天猫精灵语音识别后,找到对应的技能并调用,然后,天猫精灵的服务器会发送识别结果给树莓派。
  3. 树莓派收到天猫精灵服务器的调用后,执行打开空调的命令,并且返回文字“好的,空调已经开启”。
  4. 天猫精灵播放“好的,空调已经开启”。

搭建Web服务

  1. 在树莓派上搭建PHP + Nginx环境,数据库可有可无。参考在树莓派3B上安装PHP 7.3 + Nginx + Mariadb

  2. 安装完成后,进入网站根目录/usr/local/nginx/html

  3. 创建一个文件夹ac,在ac文件夹中新建一个bot.php稍后用于处理天猫精灵的请求,文件内容暂时写个Helloworld:

    1
    2
    <?php
    echo "Hello, Pi!";
  4. 保存文件后,在浏览器中打开:

    http://你的树莓派IP/ac/bot.php

    正常情况下能够看到“Hello, Pi!”,如果没有,请检查树莓派IP是否正确、Nginx是否已经开启、网站根目录是否正确等等。

内网穿透

必须要在公网中,天猫精灵服务器才能访问到树莓派。在这里使用一台有公网IP的云服务器做中转,在树莓派上执行如下命令:

1
ssh -NT -R :2009:127.0.0.1:80 root@111.111.111.111

其中2009是云服务器端口号,自己随便选一个;root111.111.111.111改成你的云服务器的用户名和IP地址,命令执行后需要输入云服务器密码。接下来在浏览器打开:

http://你的服务器IP:2009/ac/bot.php

正常情况下能够看到“Hello, Pi!”,说明已经可以在公网中访问树莓派。

注意!!! 可能需要到云服务器控制台,找到这台服务器的防火墙,允许通过2009端口。

接入天猫精灵开放平台

第一步:登录天猫精灵开放平台

进入天猫精灵开发者平台,使用淘宝帐号登录、完成基本信息填写,不再赘述。

第二步:添加新技能

登录后,进入控制台,点击“添加新技能”。
添加技能

填写说明:

技能名称:随便写
技能类型:自定义(为什么不选智能家居?智能家居需要实现OAuth、设备发现协议等,较为麻烦。简单起见,选自定义)
调用词: 让天猫精灵调用“打开空调”技能要用到的词语,例如填写了“遥控器”,就要说“天猫精灵,用遥控器打开空调”;如果你填写的是“管家”,那你就要说“让管家打开空调”。注意不要用生僻词语,例如“树莓派”,不然天猫精灵语音识别不准确。
技能描述: 随便写

第三步:创建实体

依次点击“实体”、“创建实体”。
创建实体

填写说明:

实体名称:实体,可以理解为参数、变量。例如“打开空调”、“关闭空调”,这里的打开关闭就是变量;“把空调调到26度”,这里的26就是变量。简单起见,创建一个action实体,这个实体的值可以是“打开”或“关闭”。
描述 : 随便填写。

第四步:新增实体内容

新增两个action实体内容:“打开”和关闭,新增后如下图所示:
新增实体内容

第五步:创建意图

依次点击“意图”、“创建意图”。意图名称随便填写, 不影响功能。
创建意图

第六步:配置意图

  1. 创建完意图之后,点击“编辑”,进入意图配置页面,然后添加普通语料:
    添加普通语料

    输入语料内容“打开空调”,选中输入框中的文字打开,页面上会弹出实体列表,选择刚刚创建的实体action。其它语料用同样的方法操作。

  2. 设置action参数为必选,如下图:
    参数必选

  3. 回复配置

    终于来到重点部分,这里的Web Hook URL就是天猫精灵调用树莓派的地址。当你对天猫精灵说出“开启空调”的时候,天猫精灵的服务器将会发送天猫精灵设备ID、调用的技能、实体等信息发送到这个地址(也就是树莓派),树莓派就能调用红外发射管,打开空调。
    天猫精灵Web Hook URL

    首先需要下载认证文件,并且存放到网站根目录的/aligenie/目录中。存放位置如下:
    /usr/local/nginx/html/aligenie/a8f75c54c3.....4ca.txt

    每个人的认证文件名称不一样,务必按照下载到的文件名,不能修改。

    确认能够在浏览器中访问:

    http://云服务器IP:2009/aligenie/a8f75c54c3…..4ca.txt

    返回到天猫精灵开发者网页中,填写Web Hook URL为:

    http://云服务器IP:2009/ac/bot.php

    然后提交,如下图:
    天猫精灵保存Web Hook URL

树莓派响应天猫精灵

向天猫精灵发出“开启空调”口令后,http://云服务器IP:2009/ac/bot.php就会被调用。
bot.php这个文件中,我们需要处理:

  1. 判断要执行的动作:打开空调还是关闭空调?
  2. 调用“打开空调”或“关闭空调”的命令。
  3. 返回消息“好的,空调已经开启”给天猫精灵。

详细的接口文档参考:天猫精灵官方文档-业务逻辑配置

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
// 获取天猫精灵服务器传过来的技能调用信息,是一个json字符串
$input = file_get_contents("php://input");

// 解析技能调用信息
$req = json_decode($input);

// 获取操作:打开、关闭
$action = ($req->slotEntities[0]->standardValue ?? '');

// 执行打开、关闭空调的命令
if($action == '打开'){
system('irsend SEND_ONCE aircon on');
}else if($action == '关闭'){
system('irsend SEND_ONCE aircon off');
}

// 返回天猫精灵的播报语句
$result = [
'returnCode' => 0,
'returnErrorSolution' => '',
'returnMessage' => 'return message desc',
'returnValue' => [
'reply' => "好的,空调已经{$action}",
'resultType' => 'RESULT'
]

];
echo json_encode($result);

保存bot.php后,就可以开始测试啦。

功能测试

在线测试

在天猫精灵开发者平台,点击“测试验证”,输入“调用词+语料”,例如“遥控器打开空调”:

天猫精灵测试验证

点击“测试”后,调用请求会被发送到树莓派,空调会被打开。

真机测试

首先打开真机测试:

天猫精灵开启真机测试

开启真机测试后,就可以对天猫精灵说出以下口令控制空调啦:

  1. 遥控器打开空调
  2. 遥控器关闭空调
  3. 遥控器关空调
  4. 遥控器开空调

等等…我不想说这么多字怎么办,每次都说“遥控器遥控器”傻傻的…能不能只说“开空调”三个字?

当然可以! 只需到天猫精灵APP,打开“我家”、“组合指令”,点击添加图标。设置说出“开空调”的时候,让天猫精灵执行“遥控器打开空调”,如下图:

天猫精灵组合指令

常见问题

天猫精灵调用技能失败

技能调用失败通常有以下几种情况:

  1. 语音没有正确识别。
    调用词不能使用生僻词语,尽量不使用多音词语。比如使用“树莓派”做为调用词,天猫精灵是听不懂的。在天猫精灵APP中可以看到对话记录,看看语音转文字是否正确。
  1. 在线测试也通过,语音识别也是正确的,但是真机测试播报“呜呜呜,没有找到你要操作的设备”?
    这种情况一般是口令没有识别正确,调用口令是“调用词+语料”。例如“遥控器 打开空调”。如果直接说“打开空调”可能不能准确对应到我们添加的技能。

  2. 在线测试通过,但是真机测试时调用了其它技能?
    检查调用词是否冲突,在天猫精灵APP中搜索调用词,看看别人是否以及使用。

  3. 天猫精灵播报“一不留神,连您的吩咐都听岔了,请再说一次呗”
    说明天猫精灵调用树莓派的时候网络连接失败了,在浏览器中打开http://云服务器IP:2009/ac/bot.php,检查能否打开,是否报错。

  4. 在线测试的时候提示“服务查询开小差了,正在紧急修复”
    原因、解决方法参考上一条。