Report State es una función importante que permite que la acción Google Home informe de forma proactiva el estado más reciente del dispositivo del usuario a Google Home Graph en lugar de esperar una intención QUERY
.
Report State informa a Google los estados de los dispositivos del usuario con el agentUserId
especificado asociado a ellos (se envía en la solicitud SYNC
original). Cuando Google Assistant quiere realizar una acción que requiere comprender el estado actual de un dispositivo, simplemente puede buscar la información de estado en Home Graph en lugar de emitir una intención QUERY
a varias nubes de terceros antes de emitir la intención EXECUTE
.
Sin Report State, dadas las luces de varios proveedores en una sala de estar, el comando Ok Google, ilumina mi sala de estar requiere resolver varias intenciones de QUERY
enviadas a varias nubes, en lugar de simplemente buscar los valores de brillo actuales según lo que se informó anteriormente. Para brindar la mejor experiencia del usuario, Assistant debe conocer el estado actual de un dispositivo sin necesidad de realizar un viaje de ida y vuelta.
Después del SYNC
inicial para un dispositivo, la plataforma envía una intención QUERY
que recopila el estado del dispositivo para completar Home Graph.
Después de ese punto, Home Graph solo almacena el estado que se envía con Report State.
Cuando llames a Report State, asegúrate de proporcionar datos de estado completos para un rasgo determinado. Home Graph actualiza los estados por rasgo y reemplaza todos los datos de ese rasgo cuando se realiza una llamada a Report State. Por ejemplo, si informas el estado del rasgo StartStop, la carga útil debe incluir valores para isRunning
y isPaused
.
Comenzar
Para implementar Report State, sigue estos pasos:
Habilita la API de Google HomeGraph
-
En Google Cloud Console, ve a la página de la API de HomeGraph.
Ir a la página de la API de HomeGraph - Selecciona el proyecto que coincida con tu ID del proyecto smart home.
- Haz clic en HABILITAR.
Crea una clave de cuenta de servicio
Sigue estas instrucciones para generar una clave de cuenta de servicio desde Google Cloud Console:
-
En la Google Cloud Console, ve a la página Cuentas de servicio.
Ir a la página Cuentas de servicioEs posible que debas seleccionar un proyecto antes de que se te redireccione a la página Cuentas de servicio.
Haz clic en
Crear cuenta de servicio.Escribe un nombre en el campo Nombre de cuenta de servicio.
En el campo ID de cuenta de servicio, ingresa un ID.
Opcional: en el campo Descripción de la cuenta de servicio, escribe una descripción.
Haz clic en Crear y continuar.
En el menú desplegable Rol, selecciona Cuentas de servicio > Creador de tokens de identidad de OpenID Connect para cuentas de servicio.
Haz clic en Continuar.
Haz clic en Listo.
Selecciona la cuenta de servicio que acabas de crear en la lista de cuentas de servicio y, luego, selecciona Administrar claves en el menú
Acciones.Selecciona Agregar clave > Crear clave nueva.
En Tipo de clave, selecciona la opción JSON.
Haz clic en Crear. Se descargará a tu computadora un archivo JSON con la clave.
Llama a la API
Selecciona una opción en las siguientes pestañas:
HTTP
Home Graph proporciona un extremo HTTP
- Usa el archivo JSON de la cuenta de servicio que descargaste para crear un token web JSON (JWT). Para obtener más información, consulta Cómo autenticarse con una cuenta de servicio.
- Obtén un token de acceso de OAuth 2.0 con el permiso
https://www.googleapis.com/auth/homegraph
usando oauth2l: - Crea la solicitud JSON con el objeto
agentUserId
. Esta es una solicitud JSON de muestra para Report State and Notification: - Combina el estado del informe y la notificación JSON, y el token en tu solicitud HTTP POST al extremo de Google Home Graph. Aquí tienes un ejemplo de cómo hacer la solicitud en la línea de comandos con
curl
, como prueba:
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
El Home Graph proporciona un endpoint de gRPC.
- Obtén la definición del servicio de búferes de protocolo para la API de Home Graph.
- Sigue la documentación para desarrolladores de gRPC para generar stubs de cliente para uno de los lenguajes compatibles.
- Llama al método ReportStateAndNotification.
Node.js
El cliente de las APIs de Google para Node.js proporciona vinculaciones para la API de Home Graph.
- Inicializa el servicio
google.homegraph
con las credenciales predeterminadas de la aplicación. - Llama al método
reportStateAndNotification
con ReportStateAndNotificationRequest. Devuelve unPromise
con el 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 } } } } } });
Java
La biblioteca cliente de la API de HomeGraph para Java proporciona vinculaciones para la API de Home Graph.
- Inicializa
HomeGraphApiService
con las credenciales predeterminadas de la aplicación. - Llama al método
reportStateAndNotification
con elReportStateAndNotificationRequest
. Devuelve unReportStateAndNotificationResponse
.
// 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); }
Estado del informe de prueba
Para preparar tu integración de Cloud-to-cloud para la certificación, es importante que pruebes Report State.
Para ello, te recomendamos que uses la herramienta Home Graph Viewer, que es una app web independiente que no requiere descarga ni implementación.
El panel de Report State aún está disponible, pero dejó de estar disponible y ya no es compatible.
Panel de estado del informe
Requisitos previos
Antes de poder probar tu integración de Cloud-to-cloud, necesitas tu clave de cuenta de servicio y tu agentUserId
. Si ya tienes tu clave de cuenta de servicio y agentUserId
, consulta Implementa el panel de Report State.
Implementa el panel de Report State
Una vez que tengas la clave de la cuenta de servicio y el ID de usuario del agente para tu proyecto, descarga e implementa la versión más reciente desde el panel de Report State.
Una vez que hayas descargado la versión más reciente, sigue las instrucciones del archivo README.MD
incluido.
Después de implementar el panel Report State, accede a él desde la siguiente URL (reemplaza your_project_id por tu ID del proyecto):
http://<your-project-id>.appspot.com
En el panel, haz lo siguiente:
- Elige tu archivo de clave de la cuenta
- Agrega tu agentUserId
Luego, haz clic en Lista.
Se mostrarán todos tus dispositivos. Una vez que se complete la lista, puedes usar el botón Actualizar para actualizar los estados de los dispositivos. Si hay un cambio en el estado del dispositivo, la fila se destaca en verde.
Informa una discrepancia en el estado
La precisión del estado del informe basado en consultas mide qué tan bien coincide el estado del informe más reciente de un dispositivo con el estado del dispositivo cuando un usuario lo consulta. Se espera que este valor sea del 99.5%.
Respuestas de error
Es posible que recibas una de las siguientes respuestas de error cuando llames a Report State. Estas respuestas se presentan en forma de códigos de estado HTTP.
400 Bad Request
: El servidor no pudo procesar la solicitud enviada por el cliente debido a una sintaxis no válida. Entre las causas comunes, se incluyen el uso de JSON con formato incorrecto o el uso denull
en lugar de "" para un valor de cadena.404 Not Found
: No se encontró el recurso solicitado, pero es posible que esté disponible en el futuro. Por lo general, esto significa que no podemos encontrar el dispositivo solicitado. También puede significar que la cuenta del usuario no está vinculada con Google o que recibimos unagentUserId
no válido. Asegúrate de queagentUserId
coincida con el valor proporcionado en tu respuesta de SYNC y de que controlas correctamente las intents de DISCONNECT.
Informes de estado en línea y sin conexión
Cuando un dispositivo está sin conexión, debes informar <code{"online": code="" dir="ltr" false}<="" translate="no"> a Report State en un plazo de cinco minutos después del comportamiento del dispositivo. Por el contrario, cuando un dispositivo vuelve a estar en línea, debes informar <code{"online": code="" dir="ltr" translate="no" true}<=""> a Report State en un plazo de cinco minutos después del comportamiento del dispositivo. Cada vez que un dispositivo vuelva a estar en línea, el socio debe informar todos los estados actuales del dispositivo con la API dereportStateAndNotification
.
En este ejemplo, se muestra que un tipo de dispositivo light
está en línea y registra todos los estados actuales del dispositivo.
"requestId": "test-request-id",
"agentUserId": "agent-user-1",
"payload":{
"devices": {
"states": {
"device-id-1": {
"brightness": 65,
"on": true,
"online": true
}
"notifications": {},
}
}
}