Report State est une fonctionnalité importante qui permet à l'action Google Home de signaler de manière proactive l'état le plus récent de l'appareil de l'utilisateur à Google Home Graph au lieu d'attendre un intent QUERY.
Report State indique à Google l'état des appareils des utilisateurs associés à l'agentUserId spécifié (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 Home Graph au lieu d'émettre un intent QUERY vers différents clouds tiers avant d'émettre l'intent EXECUTE.
Sans Report State, si un salon est équipé de lumières provenant de plusieurs fournisseurs, la commande Ok Google, augmente la luminosité de mon salon nécessite de résoudre plusieurs intents QUERY envoyés à plusieurs clouds, au lieu de simplement rechercher les valeurs de luminosité actuelles en fonction de ce qui a été précédemment signalé. Pour une expérience utilisateur optimale, Assistant doit disposer de l'état actuel d'un appareil, sans nécessiter d'aller-retour vers l'appareil.
Après la requête SYNC initiale pour un appareil, la plate-forme envoie un intent QUERY qui collecte l'état de l'appareil pour renseigner Home Graph.
Après cela, Home Graph ne stocke que l'état 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 trait par trait et écrase toutes les données de ce trait lorsqu'un appel Report State est effectué. Par exemple, si vous indiquez l'état du trait StartStop, la charge utile doit inclure des valeurs pour isRunning et isPaused.
Commencer
Pour implémenter Report State, procédez comme suit :
Activer l'API Google HomeGraph
-
Dans Google Cloud Console, accédez à la page de l'API HomeGraph.
Accéder à la page de l'API HomeGraph - Sélectionnez le projet qui correspond à votre ID de projet smart home.
- 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 de Google Cloud Console :
-
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".
Cliquez sur Créer un compte de service.
Dans le champ Nom du compte de service, saisissez un nom.
Dans le champ ID du compte de service, saisissez un ID.
Dans le champ Description du compte de service, saisissez une description.
Cliquez sur Créer et continuer.
Dans le menu déroulant Rôle, sélectionnez Comptes de service > Créateur de jetons d'identité OpenID Connect du compte de service.
Cliquez sur Continuer.
Cliquez sur OK.
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 menu Actions.
Sélectionnez Ajouter une clé > Créer une clé.
Pour Type de clé, sélectionnez l'option JSON.
Cliquez sur Créer. Un fichier JSON contenant votre clé est téléchargé sur votre ordinateur.
Appeler l'API
Sélectionnez une option dans les onglets ci-dessous :
HTTP
Home Graph fournit un point de terminaison HTTP.
- Utilisez le fichier JSON du compte de service téléchargé pour créer un jeton Web JSON (JWT). Pour en savoir plus, consultez S'authentifier à l'aide d'un compte de service.
- Obtenez un jeton d'accès OAuth 2.0 avec le champ d'application
https://www.googleapis.com/auth/homegraphà l'aide d'oauth2l : - Créez la requête JSON avec
agentUserId. Voici un exemple de requête JSON pour ReportStateAndNotification : - Combinez le JSON de l'état du rapport et de la notification, ainsi que le jeton, dans votre requête HTTP POST adressée au point de terminaison Google Home Graph. Voici un exemple de requête en ligne de commande à l'aide de
curl, à titre de test :
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
Home Graph fournit un point de terminaison gRPC.
- Obtenez la définition du service de tampons de protocole pour l'API Home Graph.
- Suivez la documentation pour les développeurs gRPC afin de générer des bouchons client pour l'un des langages compatibles.
- Appelez la méthode ReportStateAndNotification.
Node.js
Le client Node.js des API Google fournit des liaisons pour l'API Home Graph.
- Initialisez le service
google.homegraphà l'aide des identifiants par défaut de l'application. - Appelez la méthode
reportStateAndNotificationavec ReportStateAndNotificationRequest. Elle renvoie unPromiseavec 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.
- Initialisez
HomeGraphApiServiceà l'aide des identifiants par défaut de l'application. - Appelez la méthode
reportStateAndNotificationavecReportStateAndNotificationRequest. Elle renvoie 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).execute(); }
État du rapport de test
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 de visualisation Home Graph, qui est une application Web autonome ne nécessitant ni téléchargement, ni déploiement.
Le tableau de bord Report State est toujours disponible, mais il est obsolète et n'est plus pris en charge.
Tableau de bord Report State
Prérequis
Avant de pouvoir tester votre intégration Cloud-to-cloud, vous devez disposer de votre clé de compte de service et de votre agentUserId. Si vous disposez déjà de votre clé de compte de service et de agentUserId, consultez Déployer le tableau de bord Report State.
Déployer le tableau de bord ReportState
Une fois que vous disposez de la clé du 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 du tableau de bord Report State.
Une fois que vous avez téléchargé la dernière version, suivez les instructions du fichier README.MD inclus.
Une fois le tableau de bord Report State déployé, accédez-y à l'aide 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 :
- Sélectionner le fichier de clé de votre compte
- Ajouter votre agentUserId
Cliquez ensuite sur Liste.
Tous vos appareils sont listés. Une fois la liste renseignée, vous pouvez utiliser le bouton Actualiser pour mettre à jour l'état des appareils. Si l'état de l'appareil change, la ligne est mise en surbrillance en vert.
Signaler un écart d'état
La précision de l'état du rapport basé sur une requête 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 devrait ê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 d'état des rapports
| Nom du champ | Définition |
|---|---|
detailedAccuracyResult |
Un résumé de diagnostic expliquant l'écart spécifique entre la charge utile ReportState et la réponse à l'intent QUERY. |
queriedTime |
Code temporel précis auquel Google a reçu la réponse QUERY du fournisseur de traitement. |
reportedTime |
Code temporel précis de la réception de la notification ReportState par Google. |
agentId |
Identifiant unique de votre projet (généralement l'ID du projet dans Google Home Developer Console). |
requestId |
ID de corrélation unique associé à la réponse d'intent QUERY spécifique. |
queryReportStateDifferences |
Objet ou liste mettant en évidence les attributs d'état de l'appareil qui diffèrent entre la réponse QUERY et les données ReportState. |
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 erronée
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 fichier JSON incorrect 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 sera peut-être disponible ultérieurement.
En général, 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 agentUserId correspond à la valeur fournie dans votre réponse SYNC et que vous gérez correctement les intents DISCONNECT.
Lorsqu'un appel ReportState échoue avec une erreur 404 NOT_FOUND, cela indique une incohérence 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 :
- Vérifier l'état du compte utilisateur : appelez
devices.syncpour l'agentUserIdqui 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
SYNCrenvoie 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
SYNCrenvoie le code 200 OK, le compte utilisateur est toujours associé, ce qui signifie que l'erreur 404 est spécifique à l'appareil.
- Si
- Rapprocher la liste des appareils : si
SYNCrenvoie "200 OK", vous devez identifier les appareils qui ne sont plus connus de Google. Nous vous recommandons de comparer la liste des appareils dont Google dispose pour l'utilisateur avec 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, utilisezSYNCpour 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 cetagentUserId.
Rapports sur l'é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. À l'inverse, lorsqu'un appareil se reconnecte, 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'APIreportStateAndNotification.
Cet exemple montre qu'un type d'appareil light est en ligne et indique 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": {},
}
}
}