1. Avant de commencer
En tant que développeur de solutions IoT (Internet des objets), vous pouvez créer des intégrations cloud à cloud qui permettent aux utilisateurs de contrôler leurs appareils à l'aide de commandes tactiles dans l'application Google Home et de commandes vocales via l'Assistant Google.
Apprendre à utiliser les outils de débogage pour les intégrations cloud à cloud est une étape importante pour créer une intégration de qualité de production avec l'Assistant Google. Pour faciliter la surveillance et le débogage, les métriques Google Cloud Platform (GCP), la journalisation 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 intégrations.
Prérequis
- Consultez le guide du développeur Créer une intégration cloud à cloud.
- Exécuter l'atelier de programmation Connecter des appareils connectés à l'Assistant Google
Objectifs de l'atelier
Dans cet atelier de programmation, vous allez déployer une intégration cloud à cloud avec deux défauts et la connecter à l'Assistant, puis déboguer les défauts de l'intégration via la suite de 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 et de la journalisation GCP
- Utiliser la suite de test pour la maison connectée afin d'identifier les problèmes fonctionnels et liés aux API
Prérequis
- Un navigateur Web, tel que Google Chrome
- Un appareil iOS ou Android sur lequel est installée l'application Google Home
- Node.js version 10.16 ou ultérieure
- un compte de facturation Google Cloud ;
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 de la machine à laver contient les sous-répertoires suivants:
public
: interface utilisateur permettant de contrôler et de surveiller facilement l'état du lave-linge connecté.functions
: service cloud entièrement implémenté qui gère le lave-linge connecté avec Cloud Functions for Firebase et Firebase Realtime Database.
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 d'intégration créé dans l'atelier de programmation Connecter des appareils connectés à l'Assistant Google:
$ cd washer-faulty $ firebase use <firebase-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û à certaines 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 la machine à laver défectueuse.
$ firebase deploy
La console doit afficher le résultat suivant :
... ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/<Firebase-project-id>/overview Hosting URL: https://<Firebase-project-id>.firebaseapp.com
Mettre à jour HomeGraph
Ouvrez l'URL d'hébergement dans votre navigateur (https://<firebase-project-id>.firebaseapp.com
) pour afficher l'application Web. Dans l'UI Web, cliquez sur le bouton Actualiser pour mettre à jour HomeGraph via la synchronisation des requêtes avec les dernières métadonnées de l'appareil de l'application de la machine à laver défectueuse:
Ouvrez l'application Google Home et vérifiez que le lave-linge nommé Lave-linge défectueux s'affiche.
3. Tester votre intégration
Après avoir déployé votre projet, vérifiez que votre intégration contrôle bien le lave-linge.
Tester le lave-linge
Vérifiez la valeur qui change lorsque vous énoncez l'une des commandes vocales suivantes à l'aide de votre téléphone:
"Hey Google, allume mon lave-linge."
"Hey Google, démarre mon lave-linge."
"Hey Google, mets mon lave-linge en pause."
"Hey Google, redémarre mon lave-linge."
"Hey Google, arrête mon lave-linge."
Vous remarquerez que l'Assistant vous indique par commande vocale qu'un problème est survenu lorsque vous mettez la machine en pause ou la reprenez:
"Désolé, je n'ai pas réussi à joindre <nom à afficher du projet>."
Pour déboguer ce problème, vous devez d'abord obtenir plus d'informations sur l'erreur afin de l'identifier et d'en déterminer l'origine.
Tableau de bord Smarthome Analytics
Le tableau de bord Smarthome Analytics est un bon endroit pour inspecter les erreurs. Il agrège des graphiques de métriques d'utilisation et d'état pour votre traitement dans le cloud:
- Les métriques Utilisation reflètent la tendance d'utilisation de votre intégration cloud à cloud, y compris le nombre d'utilisateurs actifs quotidiens et le nombre total de requêtes envoyées à votre système d'exécution.
- Les métriques État vous aident à surveiller l'occurrence d'anomalies dans votre intégration cloud à cloud, en couvrant la latence des requêtes, le pourcentage de réussite et la répartition des erreurs.
Pour identifier la cause de l'erreur, suivez la procédure ci-dessous pour accéder au tableau de bord du projet.
- Dans la console du développeur, accédez à la page "Projets".
- Sélectionnez votre projet de maison connectée.
- Cliquez sur l'onglet Données analytiques dans le menu de gauche.
- Vous accédez alors à la liste des tableaux de bord de votre projet sur Google Cloud. Sélectionnez le tableau de bord Google Home Analytics – Intégration dans le cloud.
- Faites défiler la page jusqu'au graphique Erreurs de traitement dans le cloud : répartition par état pour afficher les codes d'erreur correspondant à la période sélectionnée.
Le code d'erreur PARTNER_RESPONSE_MISSING_DEVICE
fournit une indication sur l'origine du problème. Ensuite, récupérez les journaux des événements en fonction du 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 des événements de votre intégration cloud à cloud via Cloud Logging.
Ouvrez le menu de navigation dans Google Cloud Platform, puis sous Opérations, sélectionnez Journalisation > 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 le champ de saisie Search all fields (Rechercher dans tous les champs), saisissez la requête PARTNER_RESPONSE_MISSING_DEVICE
, puis cliquez sur Run Query (Exécuter la requête). Les journaux correspondant à la requête sont affichés dans la section Résultats.
Le journal des erreurs affiche un événement de maison connectée avec des informations sur l'erreur indiquant:
- L'action de l'utilisateur est "reprendre le lave-linge" (
actionType:
"STARTSTOP_UNPAUSE
"), ce qui correspond à la commande vocale récente ayant échoué. - Le message de débogage associé est "
JSON response does not include device.
"
D'après le message de débogage, vous devez vérifier pourquoi l'application de la machine à laver n'inclut pas l'appareil approprié dans la réponse EXECUTE
.
Identifier l'origine 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 d'ID d'appareil 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)));
}
}
}
Vérifiez comment la fonction updateDevice
gère la mise en pause / la reprise sur le lave-linge. Vous constaterez que la chaîne à faire correspondre pour la commande de mise en 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é l'origine de l'erreur, vous pouvez corriger la chaîne de la commande de mise en pause / reprise:
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 les commandes vocales suivantes. Vous constaterez que l'Assistant répond correctement lorsque vous mettez la machine en pause ou la redémarrez.
"Hey Google, mets mon lave-linge en pause."
=>
"Bien sûr, je mets le lave-linge en pause."
"Hey Google, redémarre mon lave-linge."
=>
"OK, je relance le lave-linge."
Vous pouvez également poser des questions pour connaître l'état actuel de votre lave-linge.
"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 intégration avec la suite de test
En plus des tests manuels, vous pouvez utiliser l'ensemble de tests automatisé pour la maison connectée pour valider les cas d'utilisation en fonction des types d'appareils et des caractéristiques associés à votre intégration. La suite de tests exécute une série de tests pour détecter les problèmes de votre intégration et affiche des messages d'information pour les cas de test échoués afin d'accélérer le débogage avant de vous plonger dans les journaux des événements.
Exécuter la suite de tests pour la maison connectée
Suivez ces instructions pour tester votre intégration cloud à cloud à l'aide de la suite de tests:
- Dans votre navigateur Web, ouvrez la suite de test pour la maison connectée.
- Connectez-vous à Google à l'aide du bouton en haut à droite. Cela permet à la suite de tests d'envoyer les commandes directement à l'Assistant Google.
- Dans le champ ID du projet, saisissez l'ID de votre intégration cloud à cloud. Cliquez ensuite sur SUIVANT pour continuer.
- À l'étape Paramètres de test, la suite de tests indique le type d'appareil et les caractéristiques de la machine à laver.
- Désactivez l'option Test Request Sync (Tester la synchronisation des requêtes), car l'application exemple de la machine à laver ne dispose d'aucune interface utilisateur permettant d'ajouter, de supprimer ou de renommer la machine à laver. Dans un système de production, vous devez déclencher Request Sync chaque fois que l'utilisateur ajoute, supprime ou renomme des appareils.
- 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 deux cas de test échoués avec le message d'erreur correspondant:
Pour déboguer votre intégration cloud à cloud en cas d'échec, vous devez identifier la cause de l'erreur en analysant d'abord le message d'erreur.
Analyser le message d'erreur
Pour aider les développeurs à identifier l'origine du problème, la suite de tests affiche des messages d'erreur pour chaque cas de test ayant échoué, qui indiquent la raison de l'échec.
Pour le premier cas de test ayant échoué ci-dessus,
Son message d'erreur indique que la suite de tests s'attend à "isPause": true
dans les états signalés par votre intégration cloud à cloud, mais que les états réels n'incluent que "isPause": false
.
De plus, le message d'erreur du deuxième cas de test ayant échoué indique que les états de la réponse QUERY
de votre intégration cloud à cloud incluent "isPause": true
, qui diffère de "isPause": false
dans les états signalés par votre intégration cloud à cloud:
D'après les deux messages d'erreur, vous devez ensuite vérifier si vos rapports d'intégration indiquent isPaused
avec la valeur correcte.
Identifier l'origine de l'erreur
Ouvrez functions/index.js
, qui contient la fonction reportstate
qui publie les changements d'état dans Home Graph via la fonction Report State. Inspectez la charge utile d'état du rapport. Vous constaterez que l'état isPaused
est manquant, ce qui est exactement ce que la suite de tests a vérifié dans les cas 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é l'origine de l'erreur, révisez functions/index.js
en ajoutant l'état isPaused
à la charge utile d'état du rapport:
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.
5. Félicitations
Félicitations ! Vous avez appris à résoudre les problèmes d'intégration cloud à cloud via la suite de test pour la maison connectée et les métriques et journaux GCP.
En savoir plus
En complément de cet atelier de programmation, faites ces exercices et découvrez d'autres ressources :
- Ajoutez d'autres caractéristiques compatibles à votre appareil et testez-les avec la suite de tests.
- Créez des tableaux de bord, configurez des alertes et accédez aux données de métriques de manière programmatique pour obtenir des métriques d'utilisation utiles sur votre intégration.
- Découvrez le traitement en local pour la maison connectée.
- Consultez notre exemple GitHub pour en savoir plus.
Vous pouvez également en savoir plus sur le test et l'envoi d'une intégration pour examen, y compris le processus de certification permettant de publier votre intégration auprès des utilisateurs.