如何通过Google Home来实现语音控制自己的智能家居?

智能家居是什么,相信大家都有了一定的概念,那么 Google 是如何做智能家居的呢?本篇文章会详细为你讲述如何使用 Google Home,在 Google 的平台上搭建一个智能家居的应用。Google Home 是 Google 提供的智能音箱兼语音助手,是 Google 生态下 Smart Home 的入口。

开篇

想象一个场景,开发者设计和实现了一个智能家居应用,通过该应用可以连接并控制不同类型的设备,然后用户通过 Google Assistant 或者其他智能助理,使用语音或者文字就可以通过该应用操控这些设备。
智能家居应用依赖 Home Graph,一个记录着家庭和设备,保存数据和提供对话上下文的数据库。例如 Home Graph 可以保存卧室的多种架构的不同类型设备,这些信息会传递给 Google Assistant,以便用来执行适当场景下的用户请求。
Google 智能家居提供如下三种类型的操作。
1. 设备同步
用户通过 Google Assistant 向开发者的服务发起认证,然后 Google Assistant 收到该服务返回的 token,初始化完成后,Google Assistant 通过开发者配置的 fulfillment,发起一个 action.devices.SYNC 的意图请求,然后拿到用户在该开发者的服务上配置的设备列表。
蓝色标识为 Google 提供的基础服务,黄色标识为开发者提供服务,具体流程如下图所示:
开发者同样也可以发送 action.intent.REQUEST_SYNC 的意图给 Google Assistant,然后 Google Assistant 会发送 action.devices.SYNC 意图到开发者提供的 fulfillment,同步设备列表和设备能力,流程如下图所示:
2. 执行命令
当用户询问助理后,智能助理会发送操作设备的命令,开发者的 fulfillment 会收到一个 action.devices.EXECUTE 的意图,同时在请求体携带有设备的具体操作命令,流程如下图所示:
3. 状态查询
当用户询问“What lights are on in the kitchen?”,或者处理一个相对命令如“Turn up my lights”时,智能助理会发起一个 action.devices.QUERY 的意图给开发者的 fulfillment,流程如下图所示:
Google 智能家居支持多种不同的设备,如果开发者有一个比较特殊的设备,就需要从支持的设备列表里面选择一个最合适的。针对于不同的设备类型,Google 智能助手会自动对语音或者文字做自然语言处理。Google 智能家居支持的设备列表如下:
摄像头
洗碗机
烘干机
各种照明设备
电源插座
冰箱
投影设备
开关
恒温器
吸尘器
洗涤器

构建一个智能家居应用

构建一个智能家居应用的流程不同于普通的智能助理应用,用户的请求如何生成一个 Action,并且设计该 Action 相关的对话机制,Google 都已经提供给开发者,开发者要做的就是搭建自己的服务,并处理相关的 Smart Home 的意图即可。
创建智能家居应用的步骤如下:
搭建一个专门为链接账户的 OAuth 2.0 的服务。
在 Google developer project 创建 Actions。
选择一个 Smart Home 应用。
提供用来处理意图的 fulfillment。
测试并发布 Smart Home 应用,等待审批。

1. 搭建 OAuth 2.0 的服务器

当用户的请求意图发送到开发者的 fulfillment 时,必须要在请求头里面带上 OAuth 2.0 服务器生成的访问令牌。智能助理需要发送 action.devices.SYNC 获取设备列表信息,而该请求需要先认证账号,所以当用户账户未链接前,智能助理是不会发送任何用户命令的。
关于如何整合 OAuth,请参考account linking overview
开发者的应用希望能支持多个 Google 用户连接到同一个代理用户 (例如,用户可授权给家庭的其他用户),假如开发者应用不支持多用户连接,就需要在用户账户管理时提示错误。
开发者需要首先确认有一个可认证用户和应用的 OAuth 2.0 服务器,参考OAuth 2.0 Authorization Code flow搭建 OAuth 2.0 服务器,服务搭建完毕后,参考instructions验证你的 OAuth 2.0 服务器。

2. 创建 Google developer project 的 Actions

按照以下步骤创建一个开发者项目:
点击 Add/import project
输入名称,然后点击 CREATE PROJECT

3. 选择 Smart Home 应用

在 Actions 控制台页面的详情页,点击 Smart Home 卡片上的 BUILD,该向导会自动创建一个 Smart Home 工程,这个工程提供了一个 Action,用来处理 action.devices 的意图。
actions.devices 是一个意图的命名空间,开发者需要提供 fulfillment 来处理以下意图:
action.devices.SYNC,提供一个用户已经连接并且可用的设备列表。
action.devices.QUERY,查询当前所有设备的状态。
action.devices.EXECUTE,提供一个智能设备的执行命令,开发者需要返回程序执行完毕后的设备状态,一个 EXECUTE 意图可一次处理多个设备、多个命令。

4. 提供 fulfillment

开发者提供的 fulfillment 需要处理智能家居意图,并且需要返回给 Assistant 定义好的结果,开发者可以使用任何开发语言处理这些请求和结果,不过需要最小化开发者的云端 API 和 Assistant 之间的延迟时间。
在 Smart Home 的向导上,开发者需要提供一个用户智能家居意图的链接,然后点击 DONE 结束。
接下来的章节我们将详细描述开发者应用与 Assistant 之间的请求和结果的格式。
需要注意的是,智能家居应用更关注设备的状态而不是用户的状态,因此主要有以下几点有别于普通的对话请求:
"device" 和 "conversation" 参数不提供,"device" 参数里面的值指的是调用的客户端的,而不是要操作的 IOT 设备。
"user" 参数也不提供,不过认证的令牌需要包含在请求头里面。
智能家居的意图里面包含一个单独的参数 "inputs",该结构体里面包含 "intent" 的值,还有请求内容包含在 "payload" 值里面。
智能家居返回结果包含在参数 "payload" 里面。
所有的请求都需要有 "requestId",该参数是唯一标识,可用来做 Google 和合作方应用之间确认和调试。
下面我们来看看这些请求和结果的具体格式。
action.devices.SYNC
当用户初始化或者用户通过应用重新连接,这个时候就需要重新同步设备及状态,此时该意图就应该被触发,智能助理就会发送一个请求到开发者配置的 fulfillment,如下信息需要被返回:
需要返回所有的设备,包括暂时不可用的也应该返回,否则离线的设备就不会再被识别。
返回每一个设备的所有属性。
请求参数示例如下:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"inputs": [{
"intent": "action.devices.SYNC"
}]
}
结果参数示例如下:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"agentUserId": "1836.15267389",
"devices": [{
"id": "123",
"type": "action.devices.types.OUTLET",
"traits": [
"action.devices.traits.OnOff"
],
"name": {
"defaultNames": ["My Outlet 1234"],
"name": "Night light",
"nicknames": ["wall plug"]
},
"willReportState": false,
"deviceInfo": {
"manufacturer": "lights-out-inc",
"model": "hs1234",
"hwVersion": "3.2",
"swVersion": "11.4"
},
"customData": {
"fooValue": 74,
"barValue": true,
"bazValue": "foo"
}
},{
"id": "456",
"type": "action.devices.types.LIGHT",
"traits": [
"action.devices.traits.OnOff", "action.devices.traits.Brightness",
"action.devices.traits.ColorTemperature",
"action.devices.traits.ColorSpectrum"
],
"name": {
"defaultNames": ["lights out inc. bulb A19 color hyperglow"],
"name": "lamp1",
"nicknames": ["reading lamp"]
},
"willReportState": false,
"attributes": {
"temperatureMinK": 2000,
"temperatureMaxK": 6500
},
"deviceInfo": {
"manufacturer": "lights out inc.",
"model": "hg11",
"hwVersion": "1.2",
"swVersion": "5.4"
},
"customData": {
"fooValue": 12,
"barValue": false,
"bazValue": "bar"
}
}]
}
}
Request Sync
当前请求时,会通知 Google 发送一个 Sync 信号给每一个关联到给定 agentUserId 的用户,这些用户收到该信号后,会发送一个 action.devices.SYNC
按照下面步骤,开发者可触发一个 Sync 操作,该操作会更新关联用户的设备信息。
打开云平台控制台,进入项目页面 (https://console.cloud.google.com/project) ,选择你要操作的智能家居项目 ID。
生成一个 API Key。
复制该 API Key,并确认你要输入的 agentUserId,然后构建一个请求,下面是一个 curl 命令示例:
curl -i -s -k -X POST -H "Content-Type: application/json" -d "{agent_user_id: \"agentUserId\"}" \<br>"https://homegraph.googleapis.com/v1/devices:requestSync?key=API_KEY"<br>
action.devices.QUERY
该意图会请求所有设备状态,可以拿到实时的状态信息 (如当前门锁的状态)。如果需要更新设备的属性、功能或者其他持久化的配置,就需要使用 action.devices.SYNC
请求参数示例如下:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"inputs": [{
"intent": "action.devices.QUERY",
"payload": {
"devices": [{
"id": "123",
"customData": {
"fooValue": 74,
"barValue": true,
"bazValue": "foo"
}
},{
"id": "456",
"customData": {
"fooValue": 12,
"barValue": false,
"bazValue": "bar"
}
}]
}
}]
}
结果参数示例如下:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"devices": {
"123": {
"on": true,
"online": true
},
"456": {
"on": true,
"online": true,
"brightness": 80,
"color": {
"name": "cerulean",
"spectrumRGB": 31655
}
}
}
}
}
action.devices.EXECUTE
当需要操作智能家居设备时,就需要发送该意图。操作成功后新的设备状态会返回,当前意图可同时使用多个命令操作多个设备。
请求参数示例如下:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"inputs": [{
"intent": "action.devices.EXECUTE",
"payload": {
"commands": [{
"devices": [{
"id": "123",
"customData": {
"fooValue": 74,
"barValue": true,
"bazValue": "sheepdip"
}
},{
"id": "456",
"customData": {
"fooValue": 36,
"barValue": false,
"bazValue": "moarsheep"
}
}],
"execution": [{
"command": "action.devices.commands.OnOff",
"params": {
"on": true
}
}]
}]
}
}]
}
结果参数示例如下:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"commands": [{
"ids": ["123"],
"status": "SUCCESS",
"states": {
"on": true,
"online": true
}
},{
"ids": ["456"],
"status": "ERROR",
"errorCode": "deviceTurnedOff"
}]
}
}

5. 测试并发布

应用测试
为了测试智能家居应用,开发者需要做如下事情:
前往Actions on Google Developer Console并且选择你的应用。
点击 App information 下的 EDIT 按钮,填充你的应用必需的信息后保存。
点击 Account linking 下的 ADD 按钮,用户会使用这个网址认证用户信息,并且链接用户账户到开发者的应用。
打开你的 Google Assistant,并且进入到 Smart Home 的设置,点击“+”添加你的设备,在服务列表里面选择你的应用,然后登陆到你的服务。
在 Actions 的控制台,点击 TEST DRAFT,在你的设备里面测试你的应用。
应用分享
开发者可以在应用发布之前,邀请别人测试你的助理应用,开发者的应用至少需要一个 Action 用来测试。
应用发布
在提交你的应用之前,需要编辑好你的应用信息,并且通过该链接提供的this set of QA test cases的测试用例,Google 也会有第三方的人员使用该测试用例校验你的应用,当所有的测试用例通过后,按照 submit your app 里面的步骤提交你的应用即可。
应用分析
当你的应用发布后,你可以在 Actions 的控制台查看如下的应用分析指标:
目录状态
用户的日活跃数
命令执行次数
错误数
应用延迟
目录状态
如下图所示,可看到不同类型指标图例:Usage 标签图例:
Health 标签图例:
Directory 标签图例:

参考

 写留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。