Informar estado

Report State es una función importante que permite que la Acción de Google Home informe de forma proactiva el estado más reciente 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 de los usuarios con el agentUserId especificado asociado a ellos (enviado en la solicitud SYNC original). Cuando Google Assistant quiere realizar una acción que requiere comprender el estado actual de un dispositivo, puede simplemente buscar la información de estado en Home Graph en lugar de emitir un intent QUERY a 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 Hey Google, aumenta el brillo de mi sala de estar requiere resolver varios intents QUERY enviados a varias nubes, en lugar de simplemente 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 realizar un viaje de ida y vuelta al dispositivo.

Después del SYNC inicial de un dispositivo, la plataforma envía un intent QUERY que recopila el estado del dispositivo para propagar 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 atributo determinado. Home Graph actualiza los estados por atributo y reemplaza todos los datos de ese atributo cuando se realiza una llamada Report State. Por ejemplo, si informas el estado de la característica 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

  1. En la Google Cloud Console, ve a la página de la API de HomeGraph.

    Ir a la página de la API de HomeGraph
  2. Selecciona el proyecto que coincida con tu ID del proyecto de smart home.
  3. Haz clic en HABILITAR.

Crea una clave de cuenta de servicio

Sigue estas instrucciones para generar una clave de cuenta de servicio desde la Google Cloud Console:

Nota: Asegúrate de usar el proyecto de GCP correcto cuando realices estos pasos. Este es el proyecto que coincide con tu ID del proyecto de smart home.
  1. En la Google Cloud Console, ve a la página Cuentas de servicio.

    Ir a la página Cuentas de servicio.

    Es posible que debas seleccionar un proyecto antes de que se te dirija a la página Cuentas de servicio.

  2. Haz clic en Crear cuenta de servicio.

  3. Escribe un nombre en el campo Nombre de cuenta de servicio.

  4. En el campo ID de cuenta de servicio, ingresa un ID.

  5. Opcional: en el campo Descripción de la cuenta de servicio, escribe una descripción.

  6. Haz clic en Crear y continuar.

  7. En el menú desplegable Rol, selecciona Cuentas de servicio > Creador de tokens de identidad de OpenID Connect para cuentas de servicio.

  8. Haz clic en Continuar.

  9. Haz clic en Listo.

  10. Selecciona la cuenta de servicio que acabas de crear de la lista de cuentas de servicio y elige Administrar claves en el menú Acciones.

  11. Selecciona Agregar clave > Crear clave nueva.

  12. En Tipo de clave, selecciona la opción JSON.

  13. Haz clic en Crear. Se descargará en tu computadora un archivo JSON que contiene tu clave.

Para obtener instrucciones detalladas y más información sobre cómo crear claves de cuentas de servicio, consulta Crea y borra claves de cuentas de servicio en el sitio de ayuda de la consola de Google Cloud.

Llama a la API

Selecciona una opción de las siguientes pestañas:

HTTP

Home Graph proporciona un extremo HTTP

  1. 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 Autentícate con una cuenta de servicio.
  2. Obtén un token de acceso de OAuth 2.0 con el permiso https://www.googleapis.com/auth/homegraph usando oauth2l:
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. Crea la solicitud JSON con el agentUserId. Este es un ejemplo de solicitud JSON para Report State and Notification:
  5. {
      "requestId": "123ABC",
      "agentUserId": "user-123",
      "payload": {
        "devices": {
          "states": {
            "light-123": {
              "on": true
            }
          }
        }
      }
    }
  6. Combina el JSON de estado del informe y de notificación, y el token en tu solicitud HTTP POST al extremo de Google Home Graph. Este es un ejemplo de cómo realizar la solicitud en la línea de comandos con curl, como prueba:
  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

El Home Graph proporciona un extremo de gRPC

  1. Obtén la definición del servicio de búferes de protocolo para la API de Home Graph.
  2. Sigue la documentación para desarrolladores de gRPC para generar stubs de cliente para uno de los lenguajes admitidos.
  3. Llama al método ReportStateAndNotification.

Node.js

El cliente de Node.js para las APIs de Google proporciona vinculaciones para la API de Home Graph.

  1. Inicializa el servicio google.homegraph con las credenciales predeterminadas de la aplicación.
  2. Llama al método reportStateAndNotification con ReportStateAndNotificationRequest. Devuelve un Promise 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 para la API de Home Graph.

  1. Inicializa HomeGraphApiService con las credenciales predeterminadas de la aplicación.
  2. Llama al método reportStateAndNotification con ReportStateAndNotificationRequest. Devuelve un 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).execute();
}
    

Estado del informe de prueba

Herramientas recomendadas para esta tarea

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 de visualización de Home Graph, 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 de informes

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 de Report State, accede al panel desde la siguiente URL (reemplaza your_project_id por el ID del 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 tus dispositivos. Una vez que se complete la lista, puedes usar el botón Refresh 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 de estado

La exactitud 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%. Para obtener más detalles sobre el estado actual de la precisión del estado del informe de tu proyecto, consulta Estado del dispositivo: Precisión del estado. También puedes ver los detalles del registro de discrepancias de Report State en el Explorador de registros.

Este es un ejemplo de un registro de discrepancias de Report State:

{
  "insertId": "abcdefgh",
  "jsonPayload": {
    "reportStateLog": {
      "result": "INACCURATE",
      "detailedAccuracyResult": "DETAILED_ACCURACY_RESULT_INACCURATE",
      "isOffline": false,
      "queriedTime": "2026-01-17T03:22:01.732938Z",
      "reportedTime": "2024-11-30T15:24:34.052751Z",
      "agentId": "google-smart-home-agent-id-example",
      "requestId": "84920571364829501736",
      "queryReportStateDifferences": {
        "queryState": "on_off \t {\n  on: true\n}\n",
        "reportState": "on_off \t {\n  on: false\n}\n"
      },
      "traitName": "TRAIT_ON_OFF",
      "snapshotTime": "2026-01-17T03:22:01.732938Z",
      "isMissingField": false,
      "deviceType": "action.devices.types.OUTLET",
      "stateName": "on",
      "deviceId": "sample-device-id",
      "accuracy": "INACCURATE"
    }
  },
  "resource": {
    "type": "assistant_action_project",
    "labels": {
      "project_id": "google-smart-home-agent-id-example"
    }
  },
  "timestamp": "2026-01-17T07:16:13.712708257Z",
  "severity": "ERROR",
  "logName": "projects/google-smart-home-agent-id-example/logs/assistant_smarthome%2Fassistant_smarthome_logs",
  "receiveTimestamp": "2026-01-17T07:16:13.712708257Z"
}

Definiciones de los campos del registro de discrepancias de estado del informe

Nombre del campo Definición
detailedAccuracyResult Un resumen de diagnóstico que explica la discrepancia específica entre la carga útil de Report State y la respuesta del intent QUERY
queriedTime Es la marca de tiempo precisa en la que Google recibió la respuesta QUERY del proveedor de entrega.
reportedTime Es la marca de tiempo precisa en la que Google recibió correctamente la notificación de Report State.
agentId Es el identificador único de tu proyecto (por lo general, el ID del proyecto en la Google Home Developer Console).
requestId Es el ID de correlación único asociado con la respuesta de intent de QUERY específica.
queryReportStateDifferences Es un objeto o una lista que destaca los atributos de estado específicos del dispositivo que difieren entre la respuesta de QUERY y los datos de Report State.

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 que envió el cliente debido a una sintaxis no válida. Entre las causas comunes, se incluyen un JSON con formato incorrecto o el uso de null en lugar de "" para un valor de cadena.

404 No encontrado

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 de usuario no está vinculada con Google o que recibimos un agentUserId no válido. Asegúrate de que el agentUserId coincida con el valor proporcionado en tu respuesta de SYNC y de que estés controlando correctamente los intents de DISCONNECT.

Cuando una llamada a ReportState falla con un error 404 NOT_FOUND, indica un desajuste de sincronización entre tu nube y Home Graph. Esto puede suceder si se quita un dispositivo de Home Graph o si un usuario desvincula su cuenta.

Para controlar los errores 404 de Report State, usa el siguiente procedimiento:

  1. Verifica el estado de la cuenta de usuario: Llama a devices.sync para el agentUserId que devolvió un error 404. Esto ayuda a determinar si el error es para toda la cuenta de usuario o para un dispositivo específico.
    • Si SYNC devuelve un error 404, la cuenta de usuario ya no está vinculada con Google. Deja de enviar Informar estado y Solicitar sincronización para los dispositivos de este usuario.
    • Si SYNC devuelve 200 OK, la cuenta de usuario aún está vinculada, lo que significa que el error 404 es específico del dispositivo.
  2. Concilia la lista de dispositivos: Si SYNC devuelve 200 OK, debes identificar qué dispositivos ya no son conocidos para Google. Te recomendamos que compares la lista de dispositivos que Google tiene para el usuario con tu base de datos de dispositivos y que identifiques los dispositivos de tu sistema que no están en la lista de Google. Si un dispositivo se debe sincronizar con Google, pero aún no se comparte con Google, usa SYNC para asegurarte de que el dispositivo esté sincronizado con Google. Si un dispositivo se debe desvincular de Google, deja de informar el estado de ese dispositivo específico y sigue informando el de otros dispositivos válidos en ese agentUserId.

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 desde el 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 desde el 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 de reportStateAndNotification. En este ejemplo, se muestra que un tipo de dispositivo light está en línea y se informan 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": {},
        }
      }
    }
</code{"online":></code{"online":>