Запросить и выполнить

Когда пользователи взаимодействуют с 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 см. в разделах Обработка ошибок и исключений и Ошибки и исключения .