État du rapport

Report StateCloud-to-cloud

Report State est une fonctionnalité importante qui permet à l' Google Home Action de signaler de manière proactive le dernier état de l' appareil de l'utilisateur à Google Home Graph au lieu d'attendre une intention QUERY.

Report State signale à Google les états des appareils utilisateur avec le agentUserId spécifié qui leur est associé (envoyé dans la requête SYNC d'origine). Lorsque Google Assistant souhaite effectuer une action qui nécessite de comprendre l'état actuel d'un appareil, il peut simplement rechercher les informations d'état dans le Home Graph au lieu d'émettre une intention QUERY vers différents clouds tiers avant d'émettre l' intention EXECUTE.

Sans Report State, étant donné les lumières de plusieurs fournisseurs dans un salon, la commande Ok Google, éclaire mon salon nécessite de résoudre plusieurs intentions QUERY envoyées à plusieurs clouds, au lieu de simplement rechercher les valeurs de luminosité actuelles en fonction de ce qui a été signalé précédemment. Pour une expérience utilisateur optimale, Assistant doit connaître l'état actuel d'un appareil, sans avoir à effectuer un aller-retour vers l'appareil.

Après la SYNC initiale d'un appareil, la plate-forme envoie une intention QUERY qui collecte l'état de l'appareil pour remplir Home Graph. À partir de ce moment, Home Graph ne stocke que l'état qui est envoyé avec Report State.

Lorsque vous appelez Report State, veillez à fournir des données d'état complètes pour un trait donné. Home Graph met à jour les états par trait et remplace toutes les données de ce trait lorsqu'un appel Report State est effectué. Par exemple, si vous signalez l'état du trait StartStop, la charge utile doit inclure des valeurs pour isRunning et isPaused.

Premiers pas

Pour implémenter Report State, procédez comme suit :

Activer l'API Google HomeGraph

  1. Dans la Google Cloud Console, accédez à la page API HomeGraph.

    Accéder à la page de l'API HomeGraph
  2. Sélectionnez le projet qui correspond à l'ID de votre projet smart home.
  3. Cliquez sur ACTIVER.

Créer une clé de compte de service

Suivez ces instructions pour générer une clé de compte de service à partir du Google Cloud Console :

Remarque : Assurez-vous d'utiliser le bon projet GCP lorsque vous effectuez ces étapes. Il s'agit du projet qui correspond à l'ID de votre projet smart home.
  1. Dans la Google Cloud Console, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service".

    Vous devrez peut-être sélectionner un projet avant d'accéder à la page "Comptes de service".

  2. Cliquez sur Créer un compte de service.

  3. Dans le champ Nom du compte de service, saisissez un nom.

  4. Dans le champ ID du compte de service, saisissez un ID.

  5. Dans le champ Description du compte de service, saisissez une description.

  6. Cliquez sur Créer et continuer.

  7. Dans le menu déroulant Rôle, sélectionnez Comptes de service > Créateur de jetons d'identité OpenID Connect du compte de service.

  8. Cliquez sur Continuer.

  9. Cliquez sur OK.

  10. Sélectionnez le compte de service que vous venez de créer dans la liste des comptes de service, puis sélectionnez Gérer les clés dans le Actions menu.

  11. Sélectionnez Ajouter une clé > Créer une clé.

  12. Pour le Type de clé, sélectionnez l'option JSON.

  13. Cliquez sur Créer. Un fichier JSON contenant votre clé est téléchargé sur votre ordinateur.

Pour obtenir des instructions détaillées et des informations sur la création de clés de compte de service, consultez Créer et supprimer des clés de compte de service sur le site d'aide de la console Google Cloud.

Appeler l'API

Sélectionnez une option dans les onglets ci-dessous :

HTTP

Le Home Graph fournit un point de terminaison HTTP

  1. Utilisez le fichier JSON du compte de service téléchargé pour créer un jeton Web Token (JWT). Pour en savoir plus, consultez la section Authentification à l'aide d'un compte de service.
  2. Obtenez un jeton d'accès OAuth 2.0 avec le https://www.googleapis.com/auth/homegraph champ d'application à l'aide d' oauth2l :
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. Créez la requête JSON avec l'agentUserId. Voici un exemple de requête JSON pour Report State et Notification :
  5. {
      "requestId": "123ABC",
      "agentUserId": "user-123",
      "payload": {
        "devices": {
          "states": {
            "light-123": {
              "on": true
            }
          }
        }
      }
    }
  6. Combinez le JSON de Report State et Notification, ainsi que le jeton dans votre requête HTTP POST request au point de terminaison Google Home Graph. Voici un exemple d'exécution de la requête dans la ligne de commande à l'aide de curl, à titre de test :
  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

Le Home Graph fournit un point de terminaison gRPC.

  1. Obtenez la définition de service Protocol Buffers pour l'API Home Graph.
  2. Suivez la documentation pour les développeurs gRPC afin de générer des stubs clients pour l'un des langages compatibles.
  3. Appelez la méthode ReportStateAndNotification.

Node.js

Le client Node.js des API Google fournit des liaisons pour l'API Home Graph.

  1. Initialisez le google.homegraph service à l'aide des identifiants par défaut de l'application.
  2. Appelez la méthode reportStateAndNotification avec ReportStateAndNotificationRequest. Elle renvoie un Promise avec le 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 bibliothèque cliente de l'API HomeGraph pour Java fournit des liaisons pour l'API Home Graph.

  1. Initialisez HomeGraphApiService à l'aide des identifiants par défaut de l'application.
  2. Appelez la reportStateAndNotification méthode avec ReportStateAndNotificationRequest. Elle renvoie une 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();
}
    

Tester Report State

Outils recommandés pour cette tâche

Pour préparer votre intégration Cloud-to-cloud à la certification, il est important de tester Report State.

Pour ce faire, nous vous recommandons d'utiliser l'outil Viewer Home Graph, qui est une application Web autonome qui ne nécessite aucun téléchargement ni déploiement.

Le tableau de bord Report State est toujours disponible, mais il est obsolète et n'est plus compatible.

Tableau de bord Report State

Prérequis

Avant de pouvoir tester votre Cloud-to-cloud intégration, vous avez besoin de votre clé de compte de service et de votre agentUserId. Si vous disposez déjà de votre clé de compte de service et agentUserId consultez Déployer le Report State tableau de bord.

Déployer le tableau de bord Report State

Une fois que vous disposez de la clé de compte de service et de l'ID utilisateur de l'agent pour votre projet, téléchargez et déployez la dernière version à partir de Report State Dashboard. Une fois la dernière version téléchargée, suivez les instructions du fichier README.MD inclus.

Une fois le tableau de bord Report State déployé, accédez au tableau de bord à partir de l'URL suivante (remplacez your_project_id par l'ID de votre projet) :

http://<your-project-id>.appspot.com

Dans le tableau de bord, procédez comme suit :

  • Choisissez votre fichier de clé de compte.
  • Ajoutez votre agentUserId.

Cliquez ensuite sur List (Liste).

Tous vos appareils sont listés. Une fois la liste remplie, vous pouvez utiliser le bouton Refresh (Actualiser) pour mettre à jour l'état des appareils. Si l'état d'un appareil change, la ligne est mise en surbrillance en vert.

Écart de Report State

La précision de l'état du rapport basé sur les requêtes mesure la correspondance entre le dernier état du rapport d'un appareil et l'état de l'appareil lorsqu'un utilisateur l'interroge. Cette valeur doit être de 99,5%. Pour en savoir plus sur l'état actuel de la précision de l'état du rapport de votre projet, consultez État de l'appareil – Précision de l'état. Vous pouvez également consulter les détails du journal des écarts de Report State dans l' explorateur de journaux.

Voici un exemple de journal des écarts 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"
}

Définitions des champs du journal des écarts de Report State

Nom du champ Définition
detailedAccuracyResult Résumé de diagnostic expliquant l'écart spécifique entre la charge utile de Report State et la réponse de l'intention QUERY.
queriedTime Horodatage précis du moment où Google a reçu la réponse QUERY du fournisseur de traitement.
reportedTime Horodatage précis du moment où la notification Report State a été reçue par Google.
agentId Identifiant unique de votre projet (généralement l'ID du projet dans la Google Home Developer Console).
requestId ID de corrélation unique associé à la réponse de l'intention QUERY spécifique.
queryReportStateDifferences Objet ou liste mettant en évidence les attributs d'état de l'appareil spécifiques qui diffèrent entre la réponse QUERY et les données de Report State.

Réponses d'erreur

Vous pouvez recevoir l'une des réponses d'erreur suivantes lorsque vous appelez Report State. Ces réponses se présentent sous la forme de codes d'état HTTP.

400 Requête incorrecte

Le serveur n'a pas pu traiter la requête envoyée par le client en raison d'une syntaxe non valide. Les causes courantes incluent un JSON mal formé ou l'utilisation de null au lieu de "" pour une valeur de chaîne.

404 Not Found

La ressource demandée est introuvable, mais elle peut être disponible à l'avenir. En règle générale, cela signifie que nous ne trouvons pas l'appareil demandé. Cela peut également signifier que le compte utilisateur n'est pas associé à Google ou que nous avons reçu un agentUserId non valide. Assurez-vous que le agentUserId correspond à la valeur fournie dans votre SYNC réponse et que vous gérez correctement les DISCONNECT intentions.

Lorsqu'un appel ReportState échoue avec une erreur 404 NOT_FOUND, cela indique une incompatibilité de synchronisation entre votre cloud et Home Graph. Cela peut se produire si un appareil est supprimé de Home Graph ou si un utilisateur dissocie son compte.

Pour gérer les erreurs 404 de Report State, procédez comme suit :

  1. Vérifiez l'état du compte utilisateur : appelez devices.sync pour le agentUserId qui a renvoyé une erreur 404. Cela permet de déterminer si l'erreur concerne l'ensemble du compte utilisateur ou un appareil spécifique.
    • Si SYNC renvoie une erreur 404, le compte utilisateur n'est plus associé à Google. Arrêtez d'envoyer Report State et Request Sync pour les appareils de cet utilisateur.
    • Si SYNC renvoie 200 OK, le compte utilisateur est toujours associé, ce qui signifie que l'erreur 404 est spécifique à l'appareil.
  2. Réconciliez la liste des appareils : si SYNC renvoie 200 OK, vous devez identifier les appareils qui ne sont plus connus de Google. Nous vous recommandons de comparer la liste des appareils que Google possède pour l'utilisateur à votre base de données d'appareils, et d'identifier les appareils de votre système qui ne figurent pas dans la liste de Google. Si un appareil doit être synchronisé avec Google, mais qu'il n'est pas encore partagé avec Google, utilisez SYNC pour vous assurer que l'appareil est synchronisé avec Google. Si un appareil doit être dissocié de Google, arrêtez de signaler l'état de cet appareil spécifique et continuez à signaler l'état des autres appareils valides sous cet agentUserId.

Rapports d'état en ligne et hors connexion

Lorsqu'un appareil est hors connexion, vous devez signaler <code{"online": code="" dir="ltr" false}<="" translate="no"> à Report State dans les cinq minutes suivant le comportement de l'appareil. Inversement, lorsqu'un appareil revient à un état en ligne, vous devez signaler <code{"online": code="" dir="ltr" translate="no" true}<=""> à Report State dans les cinq minutes suivant le comportement de l'appareil. Chaque fois qu'un appareil se reconnecte, le partenaire doit signaler tous les états actuels de l'appareil à l'aide de l'API reportStateAndNotification. Cet exemple montre qu'un type d'appareil light est en ligne et signale tous les états actuels de l'appareil.
"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":>