Report State est une fonctionnalité importante qui permet à l'action Google Home 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 indique à Google l'état des appareils utilisateur associés au 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 sur l'état dans 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é que les lumières de plusieurs fournisseurs se trouvent dans un salon, la commande Ok Google, augmente la luminosité du 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é signalé précédemment. Pour offrir la meilleure expérience utilisateur possible, Assistant doit connaître l'état actuel d'un appareil sans avoir à effectuer un aller-retour vers l'appareil.
Après le SYNC
initial pour un appareil, la plate-forme envoie un intent QUERY
qui collecte l'état de l'appareil pour remplir 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 signalez 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 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 Google Cloud Console, accédez à la page Comptes de service.
Accédez à la page "Comptes de service".Vous devrez peut-être sélectionner un projet avant d'être redirigé vers 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 le 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 l'état du rapport et la notification : - Combinez l'état du rapport et le JSON de notification avec le jeton dans votre requête HTTP POST au point de terminaison Google Home Graph. Voici un exemple de requête à effectuer dans la 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 de service Protocol Buffers pour l'API Home Graph.
- Suivez la documentation pour les développeurs gRPC afin de générer des stubs de 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
reportStateAndNotification
avec ReportStateAndNotificationRequest. Il renvoie unPromise
avec 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
reportStateAndNotification
avecReportStateAndNotificationRequest
. 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); }
État du rapport de test
Pour que votre intégration Cloud-to-cloud soit prête pour la certification, il est important de tester Report State.
Pour ce faire, nous vous recommandons d'utiliser l'outil Home Graph Viewer, 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 pris en charge.
Tableau de bord de l'état des rapports
Prérequis
Avant de pouvoir tester votre intégration Cloud-to-cloud, 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 de agentUserId
, consultez Déployer le tableau de bord Report State.
Déployer le tableau de bord "Report State"
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 à 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 :
- Choisir votre fichier de clé de compte
- Ajouter votre agentUserId
Cliquez ensuite sur Liste.
Tous vos appareils sont listés. Une fois la liste remplie, vous pouvez utiliser le bouton Actualiser pour mettre à jour l'état des appareils. Si l'état d'un appareil change, la ligne est mise en surbrillance en vert.
Signaler un écart d'état
La précision de l'état des rapports basés sur les requêtes mesure la correspondance entre le dernier état du rapport pour un appareil et l'état de l'appareil lorsqu'un utilisateur le demande. Cette valeur devrait être de 99,5 %.
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 Bad Request
: le serveur n'a pas pu traiter la requête envoyée par le client en raison d'une syntaxe incorrecte. Les causes courantes incluent un code JSON mal formé ou l'utilisation denull
au lieu de "" pour une valeur de chaîne.404 Not Found
: la ressource demandée est introuvable, mais elle pourrait être disponible à l'avenir. Cela signifie généralement 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 unagentUserId
non valide. Assurez-vous queagentUserId
correspond à la valeur fournie dans votre réponse SYNC et que vous gérez correctement les intents DISCONNECT.
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"> à Signaler l'état dans les cinq minutes suivant le comportement de l'appareil. À l'inverse, lorsqu'un appareil revient à un état en ligne, vous devez signaler <code{"online": code="" dir="ltr" translate="no" true}<=""> à Signaler l'état 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 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": {},
}
}
}