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

Когда пользователи взаимодействуют с Google Assistant , чтобы узнать текущее состояние устройства, ваш механизм выполнения получает намерение action.devices.QUERY , содержащее список идентификаторов устройств (полученных в ответе SYNC ). Когда пользователи отправляют Assistant команды для управления вашим устройством, ваш механизм выполнения получает намерение action.devices.EXECUTE

Обработка намерений 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 см. разделы Обработка ошибок и исключений и Ошибки и исключения .