Informar estado

Report StateCloud-to-cloud

Report State es una función importante que permite que la Google Home Acción informe de forma proactiva el estado más reciente del dispositivo del usuario a Google Home Graph en lugar de esperar una QUERY intent.

Report State informa a Google los estados de los dispositivos del usuario con el agentUserId especificado asociado a ellos (que se envía en la solicitud original SYNC). Cuando Google Assistant quiere realizar una acción que requiere comprender el estado actual de un dispositivo, puede buscar la información de estado en el Home Graph en lugar de emitir una intent QUERY a varias nubes de terceros antes de emitir la intent EXECUTE.

Sin Report State, dadas las luces de varios proveedores en una sala de estar, el comando Hey Google, ilumina mi sala de estar requiere resolver varias intents QUERY enviadas a varias nubes, en lugar de simplemente buscar los valores de brillo actuales en función de lo que se informó anteriormente. Para obtener la mejor experiencia del usuario, Assistant debe tener el estado actual de un dispositivo, sin requerir un viaje de ida y vuelta al dispositivo.

Después de la SYNC inicial de un dispositivo, la plataforma envía una 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 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

  1. En 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 el ID de tu proyecto 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 Google Cloud Console:

Nota: Asegúrate de usar el proyecto de GCP correcto cuando realices estos pasos. Este es el proyecto que coincide con el ID de tu proyecto smart home.
  1. En 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 Función, selecciona Cuentas de servicio > Creador de tokens de identidad de OpenID Connect de cuentas de servicio.

  8. Haz clic en Continuar.

  9. Haz clic en Listo.

  10. Selecciona la cuenta de servicio que acabas de crear en la lista de cuentas de servicio y selecciona 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á a tu computadora un archivo JSON con la clave.

Para obtener instrucciones detalladas e 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

El Home Graph proporciona un extremo HTTP

  1. Usa el archivo JSON de la cuenta de servicio descargado para crear un token web JSON Token (JWT). Para obtener más información, consulta Autenticación con una cuenta de servicio.
  2. Obtén un token de acceso de OAuth 2.0 con el https://www.googleapis.com/auth/homegraph alcance mediante 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 y Notification:
  5. {
      "requestId": "123ABC",
      "agentUserId": "user-123",
      "payload": {
        "devices": {
          "states": {
            "light-123": {
              "on": true
            }
          }
        }
      }
    }
  6. Combina el JSON de Report State y Notification, y el token en tu solicitud HTTP POST request 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 compatibles.
  3. Llama al método ReportStateAndNotification.

Node.js

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

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

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

Prueba Report State

Herramientas recomendadas para esta tarea

Para preparar tu integración Cloud-to-cloud para la certificación, es importante probar 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 está obsoleto y ya no es compatible.

Panel de Report State

Requisitos previos

Antes de poder probar tu integración Cloud-to-cloud, necesitas la clave de cuenta de servicio y tu agentUserId. Si ya tienes tu clave de cuenta de servicio y agentUserId consulta Implementa el Report State panel.

Implementa el panel de Report State

Una vez que tengas la clave de cuenta de servicio y el ID de usuario del agente para tu proyecto, descarga e implementa la versión más reciente de Report State Dashboard. 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 a él 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 tu archivo de claves de cuenta.
  • Agrega tu agentUserId.

Luego, haz clic en List.

Se enumeran todos tus dispositivos. Una vez que se propaga 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.

Discrepancia de Report State

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 exactitud del estado del informe de tu proyecto, consulta Estado del dispositivo: Exactitud del estado. También puedes ver los detalles del registro de discrepancias de Report State desde 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 Report State

Nombre del campo Definición
detailedAccuracyResult Es un resumen de diagnóstico que explica la discrepancia específica entre la carga útil de Report State y la respuesta de la intent QUERY.
queriedTime Es la marca de tiempo precisa en la que Google recibió la respuesta QUERY del proveedor de cumplimiento.
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 específica de la intent QUERY.
queryReportStateDifferences Es un objeto o una lista que destaca los atributos específicos del estado del dispositivo que difieren entre la respuesta 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 enviada por el cliente debido a una sintaxis no válida. Las causas comunes incluyen JSON con formato incorrecto o el uso de null en lugar de "" para un valor de cadena.
  • 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 significar que la cuenta de usuario no está vinculada a Google o que recibimos un agentUserId no válido. Asegúrate de que el agentUserId coincida con el valor proporcionado en tu SYNC y de que estés controlando correctamente las intents 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 de 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 después del comportamiento del dispositivo. Cada vez que un dispositivo vuelve 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":>