Отчет о состоянии

Report State — важная функция, которая позволяет действию Google Home Action заблаговременно сообщать о последнем статусе устройства пользователя в Google Home Graph не дожидаясь намерения QUERY .

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

Без Report State , учитывая, что освещение в гостиной обеспечивается несколькими источниками, команда «Ok Google, освети мою гостиную» требует обработки нескольких запросов QUERY , отправленных в несколько облаков, вместо того, чтобы просто искать текущие значения яркости на основе ранее предоставленных данных. Для оптимального пользовательского опыта Assistant необходимо знать текущее состояние устройства, не требуя обращения к нему.

После первоначальной SYNC устройства платформа отправляет намерение QUERY , которое собирает данные о состоянии устройства для заполнения Home Graph . После этого Home Graph сохраняет только данные о состоянии, отправленные с помощью Report State .

При вызове Report State обязательно укажите полные данные о состоянии для заданного признака. Home Graph обновляет состояния для каждого признака и перезаписывает все данные для этого признака при вызове Report State . Например, если вы сообщаете состояние для признака StartStop , полезная нагрузка должна включать значения isRunning и isPaused .

Начать

Чтобы реализовать Report State , выполните следующие действия:

Включить API Google HomeGraph

  1. В Google Cloud Console перейдите на страницу API HomeGraph .

    Перейти на страницу API HomeGraph
  2. Выберите проект, соответствующий идентификатору вашего проекта smart home .
  3. Нажмите ВКЛЮЧИТЬ .

Создайте ключ учетной записи службы

Следуйте этим инструкциям, чтобы сгенерировать ключ учетной записи службы из Google Cloud Console :

Примечание : Убедитесь, что вы используете правильный проект GCP при выполнении этих шагов. Это проект, соответствующий идентификатору вашего проекта smart home .
  1. В Google Cloud Console перейдите на страницу «Учетные записи служб» .

    Перейдите на страницу «Учетные записи служб» .

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

  2. Нажмите « Создать учетную запись службы .

  3. В поле Имя учетной записи службы введите имя.

  4. В поле Идентификатор учетной записи службы введите идентификатор.

  5. В поле Описание учетной записи службы введите описание.

  6. Нажмите «Создать» и продолжите .

  7. В раскрывающемся списке Роль выберите Учетные записи служб > Учетная запись службы OpenID Connect Создатель токена удостоверения .

  8. Нажмите «Продолжить» .

  9. Нажмите Готово .

  10. Выберите учетную запись службы, которую вы только что создали, из списка учетных записей службы и выберите Управление ключами в меню Действия .

  11. Выберите Добавить ключ > Создать новый ключ .

  12. Для параметра «Тип ключа» выберите вариант JSON .

  13. Нажмите «Создать» . JSON-файл, содержащий ваш ключ, загрузится на ваш компьютер.

Подробные инструкции и информацию о создании ключей учетных записей служб см. в разделе Создание и удаление ключей учетных записей служб на сайте справки Google Cloud Console.

Вызов API

Выберите вариант на вкладках ниже:

HTTP

Home Graph предоставляет конечную точку HTTP

  1. Используйте загруженный JSON-файл учётной записи сервиса для создания JSON-веб-токена (JWT). Подробнее см. в разделе «Аутентификация с использованием учётной записи сервиса» .
  2. Получите токен доступа OAuth 2.0 с областью действия https://www.googleapis.com/auth/homegraph используя oauth2l :
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. Создайте JSON-запрос с agentUserId . Вот пример JSON-запроса для отчета о состоянии и уведомлении:
  5. {
      "requestId": "123ABC",
      "agentUserId": "user-123",
      "payload": {
        "devices": {
          "states": {
            "light-123": {
              "on": true
            }
          }
        }
      }
    }
  6. Объедините JSON-файл состояния отчёта и уведомления, а также токен в HTTP-запросе POST к конечной точке Google Home Graph. Вот пример того, как выполнить запрос в командной строке с помощью curl в качестве теста:
  7. curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" \
      -H "Content-Type: application/json" \
      -d @request-body.json \
      "https://homegraph.googleapis.com/v1/devices:reportStateAndNotification"
    

gRPC

Home Graph предоставляет конечную точку gRPC

  1. Получите определение службы буферов протокола для API Home Graph.
  2. Следуйте документации разработчика gRPC, чтобы создать клиентские заглушки для одного из поддерживаемых языков .
  3. Вызовите метод ReportStateAndNotification .

Node.js

Клиент Node.js API Google предоставляет привязки для API Home Graph .

  1. Инициализируйте службу google.homegraph , используя учетные данные приложения по умолчанию .
  2. Вызовите метод reportStateAndNotification с ReportStateAndNotificationRequest . Он возвращает Promise с ReportStateAndNotificationResponse .
const homegraphClient = homegraph({
  version: 'v1',
  auth: new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/homegraph'
  })
});

const res = await homegraphClient.devices.reportStateAndNotification({
  requestBody: {
    agentUserId: 'PLACEHOLDER-USER-ID',
    requestId: 'PLACEHOLDER-REQUEST-ID',
    payload: {
      devices: {
        states: {
          "PLACEHOLDER-DEVICE-ID": {
            on: true
          }
        }
      }
    }
  }
});
    

Ява

Клиентская библиотека HomeGraph API для Java предоставляет привязки для Home Graph API.

  1. Инициализируйте HomeGraphApiService , используя учетные данные приложения по умолчанию .
  2. Вызовите метод reportStateAndNotification с помощью ReportStateAndNotificationRequest . Он возвращает ReportStateAndNotificationResponse .
  // Get Application Default credentials.
  GoogleCredentials credentials =
      GoogleCredentials.getApplicationDefault()
          .createScoped(List.of("https://www.googleapis.com/auth/homegraph"));

  // Create Home Graph service client.
  HomeGraphService homegraphService =
      new HomeGraphService.Builder(
              GoogleNetHttpTransport.newTrustedTransport(),
              GsonFactory.getDefaultInstance(),
              new HttpCredentialsAdapter(credentials))
          .setApplicationName("HomeGraphExample/1.0")
          .build();

  // Build device state payload.
  Map<?, ?> states = Map.of("on", true);

  // Report device state.
  ReportStateAndNotificationRequest request =
      new ReportStateAndNotificationRequest()
          .setRequestId("PLACEHOLDER-REQUEST-ID")
          .setAgentUserId("PLACEHOLDER-USER-ID")
          .setPayload(
              new StateAndNotificationPayload()
                  .setDevices(
                      new ReportStateAndNotificationDevice()
                          .setStates(Map.of("PLACEHOLDER-DEVICE-ID", states))));
  homegraphService.devices().reportStateAndNotification(request);
}
    

Состояние отчета об испытаниях

Рекомендуемые инструменты для этой задачи

Чтобы подготовить интеграцию Cloud-to-cloud к сертификации, важно протестировать Report State .

Для этого мы рекомендуем использовать инструмент Home Graph Viewer, представляющий собой автономное веб-приложение, не требующее загрузки или развертывания.

Панель мониторинга Report State по-прежнему доступна, но устарела и больше не поддерживается.

Отчет о состоянии панели мониторинга

Предпосылки

Для тестирования интеграции Cloud-to-cloud вам понадобятся ключ учётной записи службы и идентификатор пользователя agentUserId . Если у вас уже есть ключ учётной записи службы и идентификатор agentUserId , см. раздел «Развёртывание панели мониторинга Report State .

Разверните панель мониторинга состояния отчета

Получив ключ учётной записи службы и идентификатор пользователя агента для вашего проекта, загрузите и разверните последнюю версию с панели мониторинга Report State . После загрузки последней версии следуйте инструкциям из прилагаемого файла README.MD .

После развертывания панели мониторинга Report State откройте ее по следующему URL-адресу (замените your_project_id на идентификатор вашего проекта):

http://<your-project-id>.appspot.com

На панели управления выполните следующие действия:

  • Выберите файл ключа вашей учетной записи
  • Добавьте свой идентификатор пользователя агента

Затем нажмите «Список» .

В списке представлены все ваши устройства. После заполнения списка вы можете обновить состояние устройств, нажав кнопку «Обновить» . Если состояние устройства изменилось, строка подсвечивается зелёным цветом.

Сообщить о несоответствии состояния

Точность отчёта о состоянии на основе запроса измеряет, насколько точно последний отчёт о состоянии устройства соответствует его статусу, полученному пользователем. Ожидается, что это значение составит 99,5%.

Ответы об ошибках

При вызове Report State вы можете получить один из следующих ответов об ошибке. Эти ответы представлены в виде кодов состояния HTTP.

  • 400 Bad Request — серверу не удалось обработать запрос, отправленный клиентом, из-за недопустимого синтаксиса . К распространенным причинам относятся некорректный формат JSON или использование null вместо "" для строкового значения.
  • 404 Not Found — Запрошенный ресурс не найден, но может быть доступен в будущем. Обычно это означает, что мы не можем найти запрошенное устройство. Это также может означать, что учётная запись пользователя не связана с Google или получен недопустимый agentUserId . Убедитесь, что agentUserId соответствует значению, указанному в вашем ответе SYNC , и что вы правильно обрабатываете намерения DISCONNECT .

Онлайн и офлайн отчетность о состоянии

Если устройство находится в автономном режиме, вы должны сообщить об этом. Сообщите о состоянии устройства в течение пяти минут после его работы. И наоборот, когда устройство возвращается в состояние онлайн, вам следует сообщить для отправки отчета о состоянии в течение пяти минут после изучения поведения устройства. При каждом возвращении устройства в сеть партнёр должен сообщать обо всех текущих состояниях устройства с помощью API reportStateAndNotification . В этом примере показано, что устройство типа light подключено к сети и сообщает обо всех текущих состояниях.
"requestId": "test-request-id",
  "agentUserId": "agent-user-1",
    "payload":{
      "devices": {
        "states": {
          "device-id-1": {
            "brightness": 65,
            "on": true,
            "online": true
          }
          "notifications": {},
        }
      }
    }