Когда пользователи взаимодействуют с Google Assistant для запроса текущего состояния устройства, ваше выполнение получает намерение action.devices.QUERY
, содержащее список идентификаторов устройств (согласно вашему ответу SYNC
). Ваше выполнение получает намерение action.devices.EXECUTE
, когда пользователи отправляют команды Assistant для управления вашим устройством.
Обработка намерений QUERY
Ваш ответ QUERY
включает полный набор состояний для каждой характеристики, поддерживаемой запрошенными устройствами.
{ "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" } }] } }] }
JSON
{ "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 } } } } }
Node.js
const {smarthome} = require('actions-on-google'); const app = smarthome(); // ... app.onQuery((body, headers) => { // TODO Get device state return { requestId: body.requestId, payload: { devices: { 123: { on: true, online: true }, 456: { on: true, online: true, brightness: 80, color: { name: "cerulean", spectrumRGB: 31655 } } } } }; });
Джава
@NotNull @Override public QueryResponse onQuery(@NotNull QueryRequest queryRequest, @Nullable Map<?, ?> map) { QueryResponse.Payload payload = new QueryResponse.Payload(); payload.setDevices( new HashMap<String, Map<String, Object>>() { { put( "123", new HashMap<String, Object>() { { put("on", true); put("online", true); } }); put( "456", new HashMap<String, Object>() { { put("on", true); put("online", true); put("brightness", 80); put( "color", new HashMap<String, Object>() { { put("name", "cerulean"); put("spectrumRGB", 31655); } }); } }); } }); return new QueryResponse(queryRequest.getRequestId(), payload); }
Дополнительные сведения см. в справочной документации по намерению QUERY
.
Обработка намерений EXECUTE
Как и в случае с QUERY
, одно намерение может быть нацелено на несколько идентификаторов устройств. Одно намерение EXECUTE
также может содержать несколько отдельных команд, отдаваемых группе устройств. Например, сработавшее намерение может установить как яркость, так и цвет для группы источников света или установить для нескольких источников света разные цвета. Ваш ответ EXECUTE
должен возвращать новое состояние устройства после выполнения.
Используйте Report State при изменении состояния устройства пользователей. Например, из-за намерения EXECUTE
или изменения локального состояния (например, ручное переключение выключателя света). Это обеспечивает синхронизацию Google Home Graph с вашей облачной службой.
{ "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 } }] }] } }] }
JSON
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [ { "ids": [ "123" ], "status": "SUCCESS", "states": { "on": true, "online": true } }, { "ids": [ "456" ], "status": "ERROR", "errorCode": "deviceTurnedOff" } ] } }
Node.js
const {smarthome} = require('actions-on-google'); const app = smarthome(); // ... app.onExecute((body, headers) => { // TODO Send command to device return { requestId: body.requestId, payload: { commands: [{ ids: ["123"], status: "SUCCESS", states: { on: true, online: true } }, { ids: ["456"], status: "ERROR", errorCode: "deviceTurnedOff" }] } }; });
Джава
@NotNull @Override public ExecuteResponse onExecute( @NotNull ExecuteRequest executeRequest, @Nullable Map<?, ?> map) { ExecuteResponse.Payload payload = new ExecuteResponse.Payload(); payload.setCommands( new Commands[] { new Commands( new String[] {"123"}, "SUCCESS", new HashMap<String, Object>() { { put("on", true); put("online", true); } }, null, null), new Commands(new String[] {"456"}, "ERROR", null, "deviceTurnedOff", null) }); return new ExecuteResponse(executeRequest.getRequestId(), payload); }
Дополнительные сведения см. в справочной документации по намерениям EXECUTE
.
Статус ответов
Ваши ответы QUERY
и EXECUTE
включают поле status
для отчета о результате запроса. Каждый ответ о состоянии может предоставлять одно из следующих значений:
-
SUCCESS
: запрос выполнен успешно. -
OFFLINE
: целевое устройство находится в автономном режиме или недоступно по другим причинам. -
EXCEPTIONS
. С запросом связана проблема или предупреждение. -
ERROR
: запрос не выполнен с соответствующимerrorCode
.
Дополнительные сведения об ERROR
и EXCEPTIONS
см. в разделах Обработка ошибок и исключений и Ошибки и исключения .