Report State es una función importante que permite que la acción Home informe proactivamente el último estado del dispositivo del usuario a Google Home Graph, en lugar de esperar un intent QUERY
.
Report State informa a Google los estados de los dispositivos del usuario con los agentUserId
especificados asociados (enviados 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 un intent QUERY
para varias nubes de terceros antes de emitir el intent 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 múltiples intents QUERY
enviados a múltiples nubes, en lugar de solo buscar los valores de brillo actuales según lo que se informó anteriormente. Para obtener la mejor experiencia del usuario, Assistant debe tener el estado actual de un dispositivo, sin necesidad de un recorrido de ida y vuelta.
Después de la SYNC
inicial de un dispositivo, la plataforma envía un intent QUERY
que reúne el estado del dispositivo para propagar Home Graph.
Después de ese punto, Home Graph solo almacena el estado que se envía a través de Report State.
Cuando llames a Report State, asegúrate de proporcionar datos de estado completos para una característica determinada. Home Graph actualiza los estados por característica y reemplaza todos los datos de ese rasgo cuando se realiza una llamada a Report State. Por ejemplo, si informas el estado de la característica StartStop, la carga útil debe incluir valores para isRunning
y isPaused
.
Primeros pasos
Para implementar Report State, sigue estos pasos:
Habilita la API de Google HomeGraph
-
En Google Cloud Console, ve a la página API de HomeGraph.
Ir a la página de la API de HomeGraph - Selecciona el proyecto que coincida con tu ID del proyecto de 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 el Google Cloud Console:
-
En Google Cloud Console, ve a la página Crear clave de la cuenta de servicio.
Ir a la página Crear clave de la cuenta de servicio - En la lista Cuenta de servicio, selecciona Cuenta de servicio nueva.
- Ingresa un nombre en el campo Nombre de cuenta de servicio.
- En el campo ID de la cuenta de servicio, ingresa un ID.
En la lista Función, selecciona Cuentas de servicio > Creador de tokens de cuentas de servicio.
En Tipo de clave, selecciona la opción JSON.
- Haz clic en Crear. Se descargará a tu computadora un archivo JSON con la clave.
Llamar a la API
Selecciona una opción de las siguientes pestañas:
HTTP
El Home Graph proporciona un extremo HTTP.
- Usa el archivo JSON descargado de la cuenta de servicio para crear un token web JSON (JWT). Para obtener más información, consulta Cómo autenticar con una cuenta de servicio.
- Obtén un token de acceso de OAuth 2.0 con el permiso
https://www.googleapis.com/auth/homegraph
mediante oauth2l: - Crea la solicitud JSON con el
agentUserId
. Esta es una solicitud JSON de muestra para el estado del informe y la notificación: - Combina el JSON del informe y el JSON de la notificación con el token de tu solicitud HTTP POST al extremo del gráfico de Google Home. A continuación, se muestra un ejemplo de cómo realizar 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 extremo de gRPC.
- Obtén la definición del servicio de los búferes de protocolo para la API de Home Graph.
- Sigue la documentación para desarrolladores de gRPC a fin de generar stubs de cliente para uno de los idiomas compatibles.
- Llama al método ReportStateAndNotification.
Node.js
El cliente Node.js de las API de Google 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. Muestra unPromise
con 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 con la API de Home Graph.
- Inicializa el elemento
HomeGraphApiService
con Credenciales predeterminadas de la aplicación. - Llama al método
reportStateAndNotification
conReportStateAndNotificationRequest
. Muestra 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
A fin de que tu acción esté lista para la certificación, es importante que pruebes Report State.
Para hacerlo, te recomendamos usar la herramienta Visualizador Home Graph, que es una aplicación web independiente que no requiere descarga ni implementación.
El panel Report State sigue disponible, pero dejó de estar disponible y ya no es compatible.
Denunciar panel de estado
Requisitos previos
Para poder probar tu acción, necesitas la clave de tu cuenta de servicio y tu agentUserId
. Si ya tienes la clave de tu cuenta de servicio y agentUserId
consulta Cómo implementar el panel Report State.
Implementa el panel de estado del informe
Una vez que tengas la clave de la cuenta de servicio y el ID de usuario del agente de 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 al panel desde la siguiente URL (reemplaza your_project_id por el ID de tu proyecto):
http://<your-project-id>.appspot.com
En el panel, haz lo siguiente:
- Elige el archivo de claves de tu cuenta
- Agrega tu agentUserId
Luego, haz clic en Lista.
Se mostrarán todos los dispositivos. Una vez que se propague la lista, puedes usar el botón Actualizar para actualizar los estados del dispositivo. Si hay un cambio de estado del dispositivo, la fila se destaca en verde.
Respuestas de error
Es posible que recibas una de las siguientes respuestas de error cuando llames a Report State. Estas respuestas vienen en forma de códigos de estado HTTP.
400 Bad Request
: El servidor no pudo procesar la solicitud que envió el cliente debido a una sintaxis no válida. Las causas comunes incluyen JSON con formato incorrecto o el uso denull
en lugar de "" para un valor de string.404 Not Found
: No se pudo encontrar 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 indicar que la cuenta de usuario no está vinculada con Google o recibimos unagentUserId
no válido. Asegúrate de que elagentUserId
coincida con el valor proporcionado en tu respuesta de SYNC y de que manejes correctamente DISCONNECT.