Когда пользователи взаимодействуют с 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, "status": "SUCCESS" }, "456": { "on": true, "online": true, "status": "SUCCESS", "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, status: "SUCCESS" }, 456: { on: true, online: true, status: "SUCCESS", brightness: 80, color: { name: "cerulean", spectrumRGB: 31655 } } } } }; });
Java
@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("status", "SUCCESS"); } }); put( "456", new HashMap<String, Object>() { { put("on", true); put("online", true); put("status", "SUCCESS"); 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" }] } }; });
Java
@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 рассказывается в статьях Как обрабатывать ошибки и исключения и Ошибки и исключения.