Если вы хотите интегрировать свои умные домашние устройства с Google Assistant, вам нужно будет настроить веб-перехватчик, который обрабатывает четыре типа намерений: SYNC, QUERY, EXECUTE, DISCONNECT.

Когда пользователь впервые связывает свою учетную запись Google со службой, вы получаете намерение SYNC. Когда пользователь задает вопрос, например «Какая температура в доме?», Вы получаете запрос QUERY. Когда пользователь дает команду типа «Установить дом на 75», вы получаете намерение EXECUTE со значением thermostatTemperatureSetpoint, имеющим значение 75. Если пользователь отменит связь своей учетной записи с Google Assistant, вы получите намерение ОТКЛЮЧИТЬ.

Для относительных команд, таких как «Уменьшить температуру», Google Assistant должен знать текущую температуру вашего термостата, прежде чем он сможет изменить значение. Для этого он может отправить вашей службе намерение QUERY, уменьшить заданное значение и затем отправить второе намерение EXECUTE.

Это может привести к более длительным задержкам для пользователя, так как теперь имеется два вызова. Эта задержка может ухудшить взаимодействие с пользователем при подаче голосовых команд.

Теперь, когда интеллектуальные дисплеи доступны со встроенным Google Ассистентом, вы можете визуально просматривать состояния своих устройств и управлять ими с помощью графического пользовательского интерфейса. Важно иметь отзывчивый пользовательский интерфейс, а это означает, что задержки должны быть минимизированы. Ожидание запроса QUERY для получения текущей уставки приведет к заметной визуальной задержке.

Теперь разработчики могут использовать API отчета о состоянии, чтобы заранее сообщать о состоянии своих устройств на домашнюю диаграмму, что означает, что Google Assistant не будет запрашивать у устройства текущее состояние.

Настройка учетной записи службы

Чтобы безопасно установить соединение между вашим сервисом и домашним графом, вам сначала необходимо включить HomeGraph API для вашего проекта Google Cloud.

Далее создайте учетную запись службы с помощью Google Cloud Console. Выберите Создать учетные данные ›Ключ служебного аккаунта.

Создайте новую учетную запись службы с определенным именем и ролью Учетные записи служб ›Создатель токена учетной записи службы. Создайте и загрузите файл JSON на свой компьютер. Теперь вы готовы начать вызовы API к домашнему графу.

Выполнение вызовов API

Вы можете выполнять вызовы API с помощью gRPC или HTTP POST. Прототипы доступны на GitHub, если вы хотите их скомпилировать. Вы можете посетить домашнюю страницу gRPC, чтобы узнать об этом больше.

Ниже приведен пример аутентификации с помощью ключа учетной записи службы и последующей отправки запроса с полезной нагрузкой:

private HomeGraphApiServiceGrpc.HomeGraphApiServiceBlockingStub blockingStub;
public void reportStateWithGrpc(String agentUserId) {
  GoogleCredentials creds;
  try {
    FileInputStream stream = new FileInputStream("key.json");
    creds = GoogleCredentials.fromStream(stream);
    ManagedChannel channel = ManagedChannelBuilder.forTarget("homegraph.googleapis.com").build();
  
    blockingStub = HomeGraphApiServiceGrpc.newBlockingStub(channel)
      .withCallCredentials(MoreCallCredentials.from(creds));
    ReportStateAndNotificationRequest request =
      ReportStateAndNotificationRequest.newBuilder()
        .setRequestId(requestId)
        .setAgentUserId(agentUserId)
        .setPayload(getPayload())
        .build();
    blockingStub.reportStateAndNotification(request);
  } catch (IOException e) {
    e.printStackTrace();
  }
}

При выполнении запроса HTTP POST вы можете использовать ключ своей учетной записи службы для получения JSON Web Token (JWT), стандарта, позволяющего двум службам безопасно передавать данные, поскольку каждая полезная нагрузка подписывается отправителем.

Формат полезной нагрузки включает карту со состояниями для каждого устройства, о котором вы хотите сообщить:

{
  "requestId": "ff36a3cc-ec34–11e6-b1a0–64510650abcf",
  "agent_user_id": "1234",
  "payload": {
    "devices": {
      "states": {
        "1458765": {
          "on": true
        },
        "4578964": {
          "brightness": 50,
        }
      }
    }
  }
}

Исходный граф ожидает, что данные состояния будут включать в себя все значения для определенного признака, хотя он не требует всех данных состояния от устройства. Например, если вы сообщаете о состоянии устройства с помощью свойства StartStop, вы должны отправить значения как для isRunning, так и для isPaused.

Вот пример использования состояния отчета в Клиентской библиотеке Действия в Google для Node.js. Как показано, вы указываете ключ учетной записи службы в конструкторе smarthome, а затем метод reportState автоматически выполняет подписанные запросы:

const app = smarthome({
  jwt: require('./jwt.json');
});
const reportState = () => {
  app.reportState({
    requestId: '123ABC',
    agentUserId: 'user-123',
    payload: {
      devices: {
        states: {
          "light-123": {
            on: true
          }
        }
     }
    }
  })
  .then((res) => {
    // Report state was successful
  })
  .catch((res) => {
    // Report state failed
  })
};

Состояние отчета о тестировании

Теперь, когда вы знаете, как реализовать состояние отчета, вы захотите убедиться, что ваши вызовы API работают. Для этого вы можете настроить и развернуть Панель управления умным домом, которая позволит вам делать запросы к домашнему графу и считывать значения, которые вы отправили:

Вы можете найти все устройства конкретного пользователя и просмотреть текущие состояния каждого из них на домашнем графике. Когда вы сообщаете о новом состоянии, вы можете использовать этот инструмент, чтобы убедиться, что состояние изменилось должным образом.

Узнать больше

Если вы хотите узнать больше об интеграции состояния отчета со службой умного дома, вы можете посмотреть видео на YouTube выше или прочитать документацию по этой функции.

Чтобы испытать это на себе, вы можете начать работу с этой умной домашней лабораторией.