Debug della smart home

1. Prima di iniziare

In qualità di sviluppatore di Internet delle cose (IoT), puoi creare integrazioni da cloud a cloud che consentono agli utenti di controllare i propri dispositivi tramite i controlli touch nell'app Google Home e i comandi vocali con l'Assistente Google.

a4657871181b5ad2.gif

Imparare a utilizzare gli strumenti di debug per le integrazioni cloud-to-cloud è un passaggio importante per creare un'integrazione di qualità di produzione con l'assistente Google. Per facilitare il monitoraggio e il debug, sono disponibili le metriche di Google Cloud Platform (GCP), il logging e la suite di test per la smart home, che ti aiutano a identificare e risolvere i problemi relativi alle tue integrazioni.

Prerequisiti

Cosa creerai

In questo codelab, eseguirai il deployment di un'integrazione cloud-to-cloud con due difetti e la connetterai all'assistente, quindi eseguirai il debug dei difetti dell'integrazione utilizzando Test Suite per la smart home e le metriche e la registrazione di Google Cloud (GCP).

Obiettivi didattici

  • Come utilizzare le metriche e la registrazione di GCP per identificare e risolvere i problemi di produzione
  • Come utilizzare Test Suite per la smart home per identificare problemi funzionali e relativi alle API

Che cosa ti serve

2. Esegui l'app difettosa

Recupera il codice sorgente

Fai clic sul seguente link per scaricare l'esempio per questo codelab sul tuo computer di sviluppo:

...oppure puoi clonare il repository GitHub dalla riga di comando:

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

Informazioni sul progetto

L'app per la lavatrice contiene le seguenti sottodirectory:

Connessione a Firebase

Apri il terminale sulla macchina di sviluppo. Vai alla directory washer-faulty, quindi configura la CLI Firebase con il progetto di integrazione creato nel codelab Connettere dispositivi per la smart home all'Assistente Google:

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

Esegui il deployment in Firebase

Vai alla cartella functions e installa tutte le dipendenze necessarie utilizzando npm.

$ cd functions
$ npm install

Nota:se vedi il messaggio riportato di seguito, puoi ignorarlo e procedere. L'avviso è dovuto ad alcune dipendenze precedenti e puoi trovare maggiori dettagli qui.

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

Ora che hai installato le dipendenze e configurato il progetto, puoi eseguire il deployment dell'app per lavatrici difettose.

$ firebase deploy

Questo è l'output della console che dovresti vedere:

...

✔ Deploy complete!

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

Aggiorna HomeGraph

Apri l'URL di hosting nel browser (https://<firebase-project-id>.firebaseapp.com) per visualizzare l'app web. Nell'interfaccia utente web, fai clic sul pulsante Aggiornaae8d3b25777a5e30.png per aggiornare HomeGraph con i metadati più recenti del dispositivo dall'app della lavatrice difettosa utilizzando Richiedi sincronizzazione.

6f2b1344179977cf.png

Apri l'app Google Home e verifica di visualizzare la lavatrice denominata Lavatrice difettosa.

e357de6a7faff925.png

3. Testare l'integrazione

Dopo aver eseguito il deployment del progetto, verifica che l'integrazione controlli la lavatrice.

Testare la rondella

Controlla la variazione del valore quando provi uno dei seguenti comandi vocali tramite lo smartphone:

"Hey Google, accendi la lavatrice."

"Hey Google, avvia la lavatrice."

"Hey Google, metti in pausa la lavatrice."

"Hey Google, riprendi il lavaggio della lavatrice."

"Hey Google, ferma la lavatrice."

Quando metti in pausa / riprendi la lavatrice, noterai che l'assistente risponde a voce che qualcosa non va:

"Spiacente, non riesco a raggiungere <nome visualizzato del progetto>."

Per eseguire il debug di questo problema, devi innanzitutto disporre di maggiori informazioni sull'errore per restringere il campo e identificare la causa principale.

Dashboard di Smarthome Analytics

Un buon punto di partenza per esaminare gli errori è la dashboard di Smarthome Analytics, che aggrega i grafici delle metriche di utilizzo e integrità per il tuo fulfillment cloud:

  • Le metriche Utilizzo riflettono l'andamento dell'utilizzo dell'integrazione da cloud a cloud, incluso il numero di utenti attivi giornalieri e il conteggio totale delle richieste al tuo fulfillment.
  • Le metriche Integrità ti aiutano a monitorare il verificarsi di anomalie nell'integrazione da cloud a cloud, coprendo la latenza delle richieste, la percentuale di successo e la suddivisione degli errori.

Per restringere la causa dell'errore, segui i passaggi riportati di seguito per accedere alla dashboard del progetto.

  1. Nella console per gli sviluppatori, vai alla pagina Progetti.
  2. Seleziona il progetto di smart home.
  3. Fai clic sulla scheda Analytics nel menu a sinistra.

b1735bbe11a7aff8.png

  1. Verrà visualizzato un elenco di dashboard per il tuo progetto su Google Cloud. Seleziona la dashboard Google Home Analytics - Cloud Integration.

5edd3751323176dd.png

  1. Scorri verso il basso fino al grafico Errori di evasione cloud - Suddivisione dello stato per visualizzare i codici di errore per l'intervallo di tempo evidenziato.

c468743c20a11c15.png

Il codice di errore PARTNER_RESPONSE_MISSING_DEVICE fornisce un indizio sulla causa principale. Successivamente, recupera i log eventi in base al codice di errore per ulteriori dettagli.

Accedere ai log eventi

Per ottenere maggiori dettagli sull'errore, accedi ai log degli eventi per l'integrazione cloud-to-cloud utilizzando Cloud Logging.

Apri il menu di navigazione in Google Cloud Platform e, in Operazioni, seleziona Logging > Esplora log per accedere ai log eventi del tuo progetto. In alternativa, puoi cercare Esplora log nella casella di ricerca.

Nel campo di input Cerca in tutti i campi, inserisci la query PARTNER_RESPONSE_MISSING_DEVICE e fai clic su Esegui query. I log corrispondenti alla query vengono visualizzati nella sezione Risultati.

747cca0f1249a5a.png

Il log errori mostra un evento di smart home con dettagli dell'errore che indicano:

  • L'azione intrapresa dall'utente è "riavvio della lavatrice" (actionType: "STARTSTOP_UNPAUSE"), che corrisponde al recente comando vocale non riuscito.
  • Il messaggio di debug associato è "JSON response does not include device."

In base al messaggio di debug, devi controllare perché l'app per la lavatrice non include il dispositivo corretto nella risposta EXECUTE.

Identificare la causa principale dell'errore

In functions/index.js, trova il gestore EXECUTE (nell'array onExecute) che restituisce lo stato di ogni comando e il nuovo stato del dispositivo. L'inserimento degli ID dispositivo in una risposta EXECUTE dipende dalla risoluzione della funzione 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)));
     }
   }
 }

Controlla ulteriormente il modo in cui la funzione updateDevice gestisce la pausa / la ripresa della lavatrice e scoprirai che la stringa da abbinare al comando di pausa / ripresa non è corretta:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpausePause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, isPaused: params.pause};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
 }

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

Correggere l'errore

Ora che hai identificato la causa principale dell'errore, puoi correggere la stringa per il comando di pausa / ripresa:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, isPaused: params.pause};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
 }

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

Testare la correzione

Esegui il deployment del codice aggiornato utilizzando l'interfaccia a riga di comando di Firebase:

firebase deploy --only functions

Riprova i seguenti comandi vocali e vedrai che ora l'assistente risponde correttamente quando metti in pausa / riprendi la lavatrice.

"Hey Google, metti in pausa la lavatrice."

=>

"Certo, metto in pausa la lavatrice."

"Hey Google, riprendi il lavaggio della lavatrice."

=>

"Ok, riprendo il bucato."

Puoi anche testare lo stato attuale della lavatrice ponendo domande.

"Hey Google, la mia lavatrice è accesa?"

"Hey Google, la mia lavatrice è in funzione?"

"Hey Google, a che ciclo è la mia lavatrice?"

4. Testare l'integrazione con Test Suite

Oltre a eseguire i test manualmente, puoi utilizzare la suite di test per la smart home automatizzata per convalidare i casi d'uso in base ai tipi di dispositivi e alle caratteristiche associate alla tua integrazione. Test Suite esegue una serie di test per rilevare problemi nell'integrazione e mostra messaggi informativi per i casi di test non riusciti per velocizzare il debug prima di esaminare i log eventi.

Eseguire Test Suite per la smart home

Segui queste istruzioni per testare l'integrazione da cloud a cloud tramite Test Suite:

  1. Nel browser web, apri la Test Suite per la smart home.
  2. Accedi a Google utilizzando il pulsante nell'angolo in alto a destra. Ciò consente alla suite di test di inviare i comandi direttamente all'Assistente Google.
  3. Nel campo ID progetto, inserisci l'ID progetto dell'integrazione cloud-to-cloud. e poi fai clic su AVANTI per continuare.
  4. Nel passaggio Impostazioni test, Test Suite elenca il tipo di dispositivo e le caratteristiche della lavatrice.

78ed6a1ebdb581bf.png

  1. Disattiva l'opzione Sincronizzazione richiesta di test poiché l'app di esempio per la lavatrice non ha un'interfaccia utente per aggiungere, rimuovere o rinominare la lavatrice. In un sistema di produzione, devi attivare Richiedi sincronizzazione ogni volta che l'utente aggiunge, rimuove o rinomina i dispositivi.
  2. Fai clic su AVANTI per iniziare a eseguire il test.

Al termine dell'esecuzione di Test Suite, visualizza i risultati degli scenari di test. Noterai due scenari di test non riusciti rilevati con il rispettivo messaggio di errore:

5838d10631c98ed2.png

Per eseguire il debug dell'integrazione cloud-to-cloud per l'errore, devi identificare la causa principale dell'errore analizzando prima il messaggio di errore.

Analizzare il messaggio di errore

Per aiutare gli sviluppatori a identificare la causa principale, Test Suite mostra messaggi di errore per ogni test case non riuscito che indicano il motivo dell'errore.

Per il primo scenario di test non riuscito riportato sopra,

99e4e5d06965a8a7.png

il messaggio di errore indica che Test Suite prevede "isPause": true negli stati segnalati dall'integrazione da cloud a cloud, ma gli stati effettivi includono solo "isPause": false.

Inoltre, il messaggio di errore del secondo caso di test non riuscito indica che gli stati nella risposta QUERY dell'integrazione da cloud a cloud includono "isPause": true, che differisce da "isPause": false negli stati segnalati dall'integrazione da cloud a cloud:

fdb5124102e3a37.png

Secondo entrambi i messaggi di errore, dovresti quindi verificare se i report sull'integrazione indicano isPaused con il valore corretto.

Identificare la causa principale dell'errore

Apri functions/index.js, che contiene la funzione reportstate che pubblica le modifiche di stato in Home Graph utilizzando Report State. Ispeziona il payload Report State e vedrai che manca lo stato isPaused, ovvero ciò che Test Suite ha controllato negli scenari di test non riusciti.

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: snapshot.online,
                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,
      });
      ...
    });

Correggere l'errore

Ora che hai identificato la causa principale dell'errore, rivedi functions/index.js aggiungendo lo stato isPaused al payload 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: snapshot.online,
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

Testare la correzione

Esegui il deployment del codice aggiornato utilizzando l'interfaccia a riga di comando di Firebase:

$ firebase deploy --only functions

Esegui di nuovo la suite di test per la smart home e vedrai che tutti gli scenari di test sono stati superati.

148837f85d377dd6.png

5. Complimenti

17d485868a6771bc.png

Complimenti! Hai imparato a risolvere i problemi di integrazione cloud-to-cloud utilizzando Test Suite per la smart home e le metriche e la registrazione di Google Cloud.

Scopri di più

Partendo da questo codelab, prova i seguenti esercizi ed esplora le risorse aggiuntive:

Puoi anche scoprire di più su come testare e inviare un'integrazione per la revisione, incluso il processo di certificazione per pubblicarla per gli utenti.