Déboguer la maison connectée

1. Avant de commencer

En tant que développeur de l'Internet des objets (IoT), vous pouvez créer des actions pour la maison connectée qui permettent à vos utilisateurs de contrôler leurs appareils à l'aide de commandes tactiles dans l'application Google Home et de commandes vocales avec l'Assistant Google.

a4657871181b5ad2.gif

Apprendre à utiliser les outils de débogage des actions pour la maison connectée est une étape importante pour créer une intégration de qualité en production avec l'Assistant Google. Pour faciliter la surveillance et le débogage, les métriques Google Cloud Platform (GCP), Logging et la suite de test pour la maison connectée sont disponibles pour vous aider à identifier et à résoudre les problèmes liés à vos actions.

Conditions préalables

Objectifs de l'atelier

Dans cet atelier de programmation, vous allez déployer une action pour la maison connectée présentant deux défauts et la connecter à l'Assistant, puis déboguer les défauts de l'action à l'aide de la suite Test pour les métriques et la journalisation de la maison connectée et de Google Cloud Platform (GCP).

Points abordés

  • Identifier et résoudre les problèmes de production à l'aide des métriques GCP et Logging
  • Identifier les problèmes fonctionnels et liés aux API à l'aide de la suite Test pour la maison connectée

Ce dont vous aurez besoin

2. Exécuter l'application défectueuse

Obtenir le code source

Cliquez sur le lien suivant pour télécharger l'exemple utilisé dans cet atelier de programmation sur votre ordinateur de développement :

Vous pouvez également cloner le dépôt GitHub à partir de la ligne de commande :

$ git clone https://github.com/google-home/smarthome-debug.git

À propos du projet

L'application lave-linge contient les sous-répertoires suivants:

Se connecter à Firebase

Ouvrez le terminal sur votre ordinateur de développement. Accédez au répertoire washer-faulty, puis configurez la CLI Firebase avec votre projet Actions créé dans l'atelier de programmation Connecter des appareils connectés à l'Assistant Google:

$ cd washer-faulty
$ firebase use <project-id>

Déployer sur Firebase

Accédez au dossier functions et installez toutes les dépendances nécessaires à l'aide de npm..

$ cd functions
$ npm install

Remarque:Si le message ci-dessous s'affiche, vous pouvez l'ignorer et continuer. Cet avertissement est dû à des dépendances plus anciennes. Pour en savoir plus, cliquez ici.

found 5 high severity vulnerabilities
  run `npm audit fix` to fix them, or `npm audit` for details

Maintenant que vous avez installé les dépendances et configuré votre projet, vous êtes prêt à déployer l'application de lave-linge défectueuse.

$ firebase deploy

La console doit afficher le résultat suivant :

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<project-id>/overview
Hosting URL: https://<project-id>.firebaseapp.com

Mettre à jour HomeGraph

Ouvrez l'URL d'hébergement dans votre navigateur (https://<project-id>.firebaseapp.com) pour afficher l'application Web. Sur l'UI Web, cliquez sur le bouton Actualiserae8d3b25777a5e30.png pour mettre à jour HomeGraph via Request Sync (Demander la synchronisation) avec les dernières métadonnées de l'appareil provenant de l'application de lave-linge défectueuse:

6f2b1344179977cf-fr.png

Ouvrez l'application Google Home et vérifiez que vous pouvez voir le lave-linge nommé Lave-linge défectueux.

e357de6a7faff925.png

3. Tester votre Action

Après avoir déployé votre projet, vérifiez que votre action contrôle le lave-linge.

Tester le lave-linge

Vérifiez que la valeur change lorsque vous essayez l'une des commandes vocales suivantes sur votre téléphone:

"Hey Google, allume mon lave-linge."

"Hey Google, démarre mon lave-linge."

"Hey Google, mets en pause mon lave-linge."

"Hey Google, redémarre mon lave-linge."

"Hey Google, arrête mon lave-linge."

Vous remarquerez que l'Assistant répond par commande vocale lorsque vous mettez en pause ou reprenez le lave-linge:

"Désolé, je n'ai pas pu accéder à <nom à afficher du projet>."

Pour déboguer ce problème, vous devez d'abord avoir plus d'informations sur l'erreur afin de déterminer la cause du problème.

Tableau de bord Analytics pour la maison connectée

Le tableau de bord d'analyse de la maison connectée est un bon endroit pour inspecter les erreurs. Il regroupe des graphiques de métriques d'utilisation et de santé pour votre traitement cloud:

  • Les métriques d'utilisation reflètent l'évolution d'utilisation de votre action pour la maison connectée, y compris le nombre d'utilisateurs actifs par jour et le nombre total de requêtes envoyées à votre traitement.
  • Les métriques d'état vous permettent de surveiller les occurrences d'anomalies dans votre action pour la maison connectée. Elles couvrent la latence des requêtes, le pourcentage de réussite et la répartition des erreurs.

Pour identifier la cause de l'erreur, suivez les étapes ci-dessous afin d'accéder au tableau de bord du projet.

  1. Dans la console Actions, accédez à la page "Projets".
  2. Sélectionnez votre projet de maison connectée.
  3. Choisissez l'onglet Analyse, puis cliquez sur Accéder à Google Cloud Platform.

b1735bbe11a7aff8.png

  1. Vous accédez à une liste de tableaux de bord pour votre projet sur Google Cloud. Sélectionnez le tableau de bord Google Home Analytics - Cloud Integration (Analyse Google Home - Intégration au cloud).

5edd3751323176dd.png

  1. Faites défiler la page vers le bas jusqu'au graphique Cloud Fulfillment errors - Status Répartition pour afficher les codes d'erreur pour la période en surbrillance.

c468743c20a11c15.png

Le code d'erreur PARTNER_RESPONSE_MISSING_DEVICE fournit une indication sur la cause racine. Ensuite, récupérez les journaux des événements basés sur le code d'erreur pour en savoir plus.

Accéder aux journaux des événements

Pour en savoir plus sur l'erreur, accédez aux journaux d'événements associés aux actions de votre maison connectée via Cloud Logging.

Ouvrez le menu de navigation de Google Cloud Platform. Sous Opérations, sélectionnez Logging > Explorateur de journaux pour accéder aux journaux des événements de votre projet. Vous pouvez également rechercher Explorateur de journaux dans le champ de recherche.

Dans la section Requête, saisissez la requête PARTNER_RESPONSE_MISSING_DEVICE, puis cliquez sur Exécuter la requête. Les journaux correspondant à la requête sont affichés dans la section Résultats de la requête.

747cca0f1249a5a.png

Le journal d'erreurs affiche un événement de maison connectée avec les détails de l'erreur suivants:

  • L'action effectuée par l'utilisateur est "Redémarrage du lave-linge" (actionType: "STARTSTOP_UNPAUSE"), correspondant à la commande vocale qui a récemment échoué.
  • Le message de débogage associé est "JSON response does not include device."

En fonction du message de débogage, vérifiez pourquoi l'application du lave-linge n'inclut pas le bon appareil dans la réponse EXECUTE.

Identifier la cause racine de l'erreur

Dans functions/index.js, recherchez le gestionnaire EXECUTE (dans le tableau onExecute) qui renvoie l'état de chaque commande et le nouvel état de l'appareil. L'insertion des ID d'appareils dans une réponse EXECUTE dépend de la résolution de la fonction updateDevice:

index.js

app.onExecute(async (body) => {
 ...

 for (const command of intent.payload.commands) {
   for (const device of command.devices) {
     for (const execution of command.execution) {
       executePromises.push(
           updateDevice(execution, device.id)
               .then((data) => {
                 result.ids.push(device.id);
                 Object.assign(result.states, data);
               })
               .catch((e) =>
                 functions.logger.error('EXECUTE',
                     device.id, e.message)));
     }
   }
 }

Examinez plus en détail la manière dont la fonction updateDevice gère la mise en pause / reprise sur le lave-linge. Vous constaterez que la chaîne à mettre en correspondance avec la commande pause / reprise est incorrecte:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpausePause':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

 return ref.update(state)
     .then(() => state);
};

Corriger l'erreur

Maintenant que vous avez identifié la cause racine de l'erreur, vous pouvez corriger la chaîne de la commande "pause / reprendre" :

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpause':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

 return ref.update(state)
     .then(() => state);
};

Tester votre correction

Déployez le code mis à jour à l'aide de la CLI Firebase :

firebase deploy --only functions

Essayez à nouveau d'utiliser les commandes vocales suivantes. L'Assistant réagit alors correctement lorsque vous mettez en pause ou redémarrez le lave-linge.

"Hey Google, mets mon lave-linge en pause."

=>

"D'accord, je mets le lave-linge en pause."

"Hey Google, redémarre mon lave-linge."

=>

"D'accord, je redémarre le lave-linge."

Vous pouvez également tester l'état actuel de votre lave-linge en posant des questions.

"Hey Google, est-ce que mon lave-linge est allumé ?"

"Hey Google, est-ce que mon lave-linge est en marche ?"

"Hey Google, quel est le cycle défini sur mon lave-linge ?"

4. Tester votre action avec Test Suite

En plus des tests manuels, vous pouvez utiliser la Suite de tests automatisée pour la maison connectée afin de valider des cas d'utilisation en fonction des types d'appareils et des caractéristiques associés à votre action. La suite de tests exécute une série de tests pour détecter les problèmes dans votre action et affiche des messages d'information en cas d'échec des scénarios de test afin d'accélérer le débogage avant de plonger dans les journaux d'événements.

Exécuter la suite Test pour la maison connectée

Suivez ces instructions pour tester votre action de maison connectée par Test Suite:

  1. Dans votre navigateur Web, ouvrez la suite de tests pour la maison connectée.
  2. Connectez-vous à Google à l'aide du bouton situé dans l'angle supérieur droit. Cela permet à la suite Test d'envoyer les commandes directement à l'Assistant Google.
  3. Dans le champ ID du projet, saisissez l'ID de projet de votre action de maison connectée. Cliquez ensuite sur SUIVANT pour continuer.
  4. À l'étape Test Settings (Paramètres de test), la suite Test Suite liste le type d'appareil et les caractéristiques du lave-linge.

78ed6a1ebdb581bf.png

  1. Désactivez l'option Test Request Sync (Tester la synchronisation des demandes), car l'application exemple de lave-linge ne dispose pas d'interface utilisateur permettant d'ajouter, de supprimer ou de renommer le lave-linge. Dans un système de production, vous devez déclencher Request Sync chaque fois que l'utilisateur ajoute, supprime ou renomme des appareils.
  2. Cliquez sur SUIVANT pour lancer le test.

Une fois l'exécution de la suite de tests terminée, affichez les résultats des scénarios de test. Vous remarquerez que deux scénarios de test ayant échoué ont été détectés avec le message d'erreur correspondant:

5838d10631c98ed2.png

Pour déboguer votre action de maison connectée et l'échec, vous devez d'abord identifier la cause de l'erreur en analysant d'abord le message d'erreur.

Analyser le message d'erreur

Afin d'aider les développeurs à identifier l'origine de l'échec, la suite Test Suite affiche des messages d'erreur indiquant l'origine de l'échec pour chaque scénario de test ayant échoué.

Pour le premier scénario ayant échoué ci-dessus,

99e4e5d06965a8a7.png

son message d'erreur indique que Test Suite attend "isPause": true dans les états signalés par votre action pour la maison connectée, mais les états réels n'incluent que "isPause": false.

De plus, le message d'erreur du deuxième scénario ayant échoué indique les états de la réponse QUERY de votre action pour la maison connectée incluent "isPause": true, qui diffère de "isPause": false pour les états signalés par votre action pour la maison connectée:

fdb5124102e3a37.png

En fonction des deux messages d'erreur, vous devez ensuite vérifier si vos rapports d'action indiquent isPaused avec la valeur correcte.

Identifier la cause racine de l'erreur

Ouvrez functions/index.js, qui contient la fonction reportstate qui publie les changements d'état sur le graphique de la page d'accueil via l'état du rapport. En inspectant la charge utile de l'état du rapport, vous constaterez que l'état isPaused est absent de la charge utile, ce qui correspond exactement à ce que la suite de tests a recherché dans les scénarios de test ayant échoué.

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      ...

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
             [context.params.deviceId]: {
                online: true,
                on: snapshot.OnOff.on,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };

      const res = await homegraph.devices.reportStateAndNotification({
        requestBody,
      });
      ...
    });

Corriger l'erreur

Maintenant que vous avez identifié la cause racine de l'erreur, modifiez functions/index.js en ajoutant l'état isPaused à la charge utile Report State:

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      ...

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
             [context.params.deviceId]: {
                online: true,
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

Tester votre correction

Déployez le code mis à jour à l'aide de la CLI Firebase :

$ firebase deploy --only functions

Exécutez à nouveau la suite de tests pour la maison connectée. Vous constaterez que tous les scénarios de test ont réussi.

148837f85d377dd6.png

5. Félicitations

17d485868a6771bc.png

Félicitations ! Vous avez appris à résoudre les problèmes liés aux actions pour la maison connectée grâce à la suite Test Suite pour la maison connectée, les métriques et la journalisation GCP.

En savoir plus

En complément de cet atelier de programmation, faites ces exercices et découvrez d'autres ressources :

Découvrez comment tester et envoyer une action pour examen, y compris le processus de certification permettant de la publier auprès des utilisateurs.