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
В Google Cloud Console перейдите на страницу API HomeGraph .
Перейти на страницу API HomeGraph- Выберите проект, соответствующий идентификатору вашего проекта smart home .
- Нажмите ВКЛЮЧИТЬ .
Создайте ключ учетной записи службы
Следуйте этим инструкциям, чтобы сгенерировать ключ учетной записи службы из Google Cloud Console :
В Google Cloud Console перейдите на страницу «Учетные записи служб» .
Перейдите на страницу «Учетные записи служб» .Возможно, вам потребуется выбрать проект, прежде чем вы попадете на страницу учетных записей служб.
Нажмите «
Создать учетную запись службы .В поле Имя учетной записи службы введите имя.
В поле Идентификатор учетной записи службы введите идентификатор.
В поле Описание учетной записи службы введите описание.
Нажмите «Создать» и продолжите .
В раскрывающемся списке Роль выберите Учетные записи служб > Учетная запись службы OpenID Connect Создатель токена удостоверения .
Нажмите «Продолжить» .
Нажмите Готово .
Выберите учетную запись службы, которую вы только что создали, из списка учетных записей службы и выберите Управление ключами в меню Действия
.Выберите Добавить ключ > Создать новый ключ .
Для параметра «Тип ключа» выберите вариант JSON .
Нажмите «Создать» . JSON-файл, содержащий ваш ключ, загрузится на ваш компьютер.
Вызов API
Выберите вариант на вкладках ниже:
HTTP
Home Graph предоставляет конечную точку HTTP
- Используйте загруженный JSON-файл учётной записи сервиса для создания JSON-веб-токена (JWT). Подробнее см. в разделе «Аутентификация с использованием учётной записи сервиса» .
- Получите токен доступа OAuth 2.0 с областью действия
https://www.googleapis.com/auth/homegraph
используя oauth2l : - Создайте JSON-запрос с
agentUserId
. Вот пример JSON-запроса для отчета о состоянии и уведомлении: - Объедините JSON-файл состояния отчёта и уведомления, а также токен в HTTP-запросе POST к конечной точке Google Home Graph. Вот пример того, как выполнить запрос в командной строке с помощью
curl
в качестве теста:
oauth2l fetch --credentials service-account.json \ --scope https://www.googleapis.com/auth/homegraph
{ "requestId": "123ABC", "agentUserId": "user-123", "payload": { "devices": { "states": { "light-123": { "on": true } } } } }
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
- Получите определение службы буферов протокола для API Home Graph.
- Следуйте документации разработчика gRPC, чтобы создать клиентские заглушки для одного из поддерживаемых языков .
- Вызовите метод ReportStateAndNotification .
Node.js
Клиент Node.js API Google предоставляет привязки для API Home Graph .
- Инициализируйте службу
google.homegraph
, используя учетные данные приложения по умолчанию . - Вызовите метод
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.
- Инициализируйте
HomeGraphApiService
, используя учетные данные приложения по умолчанию . - Вызовите метод
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": {},
}
}
}