Debug della smart home

1. Prima di iniziare

In qualità di sviluppatore di internet of Things (IoT), puoi creare azioni per la smart home che offrono agli utenti la possibilità 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 conoscere gli strumenti di debug per le azioni della smart home è un passaggio importante per creare un'integrazione di qualità della produzione con l'Assistente Google. Per facilitare il monitoraggio e il debug, puoi utilizzare le metriche di Google Cloud Platform (Google Cloud), Logging e la Test Suite per la smart home per aiutarti a identificare e risolvere i problemi relativi alle tue azioni.

Prerequisiti

Cosa creerai

In questo codelab, eseguirai il deployment di un'azione per la smart home con due difetti e la collegherai all'assistente, quindi eseguirai il debug dei difetti dell'azione tramite Test Suite per la smart home e Metriche e logging di Google Cloud Platform (Google Cloud).

Cosa imparerai a fare

  • Come utilizzare le metriche e il logging di Google Cloud 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

Ottieni il codice sorgente

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

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

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

Informazioni sul progetto

L'app lavatrice contiene le seguenti sottodirectory:

Connettersi a Firebase

Apri il terminale sul computer di sviluppo. Vai alla directory washer-faulty, quindi configura l'interfaccia a riga di comando di Firebase con il progetto Actions integrato in Collegare i dispositivi per la smart home al codelab dell'Assistente Google:

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

Eseguire il deployment in Firebase

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

$ cd functions
$ npm install

Nota:se viene visualizzato il messaggio seguente, puoi ignorarlo e procedere. L'avviso è dovuto ad alcune dipendenze precedenti e puoi trovare ulteriori 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 lavatrice errata.

$ firebase deploy

Questo è l'output della console che dovresti vedere:

...

✔ Deploy complete!

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

Aggiorna Home Graph

Apri Hosting URL (URL di hosting) nel browser (https://<project-id>.firebaseapp.com) per visualizzare l'app web. Nella UI web, fai clic sul pulsante Aggiorna ae8d3b25777a5e30.png per aggiornare HomeGraph tramite Richiedi sincronizzazione con i metadati del dispositivo più recenti dall'app lavatrice difettosa:

6f2b1344179977cf.png

Apri l'app Google Home e verifica di vedere la lavatrice denominata Lavatrice malfunzionante.

e357de6a7faff925.png

3. Testa l'azione

Dopo aver distribuito il progetto, verifica che l'azione controlli la lavatrice.

Prova la lavatrice

Verifica 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 la lavatrice."

"Hey Google, interrompi la lavatrice."

Quando metti in pausa / riprendi la lavatrice noterai che l'assistente risponde che qualcosa non va tramite comandi vocali:

"Spiacenti, non ho potuto raggiungere <nome visualizzato del progetto>."

Per eseguire il debug di questo problema, hai prima bisogno di ulteriori informazioni sull'errore per restringere e identificare la causa principale.

Dashboard di analisi Smarthome

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

  • Le metriche Utilizzo riflettono la tendenza di utilizzo dell'azione per la smart home, inclusi il numero di utenti attivi giornalieri e il conteggio totale delle richieste per soddisfare la tua richiesta.
  • Le metriche relative alla Salute ti aiutano a monitorare la presenza di anomalie nell'azione per la smart home, 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 Actions, vai alla pagina Progetti.
  2. Seleziona il tuo progetto per la smart home.
  3. Scegli la scheda Analytics e fai clic su Vai alla piattaforma Google Cloud.

b1735bbe11a7aff8.png

  1. Verrà visualizzato un elenco di dashboard per il tuo progetto su Google Cloud. Seleziona la dashboard Analisi della home page di Google - Integrazione Cloud.

5edd3751323176dd.png

  1. Scorri verso il basso fino al grafico Errori Cloud Fulfillment - Ripartizione 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 suggerimento per la 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 eventi delle azioni della smart home tramite Cloud Logging.

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

Nella sezione Query, inserisci la query PARTNER_RESPONSE_MISSING_DEVICE e fai clic su Esegui query. I log corrispondenti alla query vengono visualizzati nella sezione Risultati delle query.

747cca0f1249a5a.png

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

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

In base al messaggio di debug, dovresti verificare perché l'app 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 in che modo la funzione updateDevice gestisce la pausa / riprendi sulla lavatrice e riscontrerai che la stringa corrispondente al comando Pausa / Riprendi non è corretta:

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);
};

Correggere l'errore

Ora che hai identificato la causa principale dell'errore, puoi correggere la stringa del comando pause / riprendi:

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);
};

Verifica la correzione

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

firebase deploy --only functions

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

"Hey Google, metti in pausa la lavatrice."

=&gt;

"Certo, metto in pausa la lavatrice."

"Hey Google, riprendi la lavatrice."

=&gt;

"Ok, riprendo la lavatrice."

Puoi anche testare lo stato attuale della lavatrice ponendo delle domande.

"Hey Google, la lavatrice è accesa?"

"Hey Google, la lavatrice funziona?"

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

4. Testa l'azione con Test Suite

Oltre ai test manuali, puoi utilizzare la Test Suite per la smart home automatica per convalidare i casi d'uso in base ai tipi di dispositivi e ai trait associati all'Azione. La Test Suite esegue una serie di test per rilevare i problemi dell'azione e mostra messaggi informativi per gli scenari di test non riusciti per accelerare il debug prima di analizzare i log eventi.

Esegui la Test Suite per la smart home

Segui queste istruzioni per testare l'Azione della tua smart home 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. In questo modo la Test Suite può inviare i comandi direttamente all'Assistente Google.
  3. Nel campo ID progetto, inserisci l'ID progetto dell'azione per la smart home. e fai clic su AVANTI per continuare.
  4. Nel passaggio Impostazioni di test, il Test Suite elenca il tipo di dispositivo e le caratteristiche della lavatrice.

78ed6a1ebdb581bf.png

  1. Disattiva l'opzione Test Request Sync (Richiesta di prova di sincronizzazione), poiché l'app di esempio per la lavatrice non ha UI per aggiungere, rimuovere o rinominare la lavatrice. In un sistema di produzione, devi attivare l'opzione Richiedi sincronizzazione ogni volta che l'utente aggiunge, rimuove o rinomina dispositivi.
  2. Fai clic su AVANTI per iniziare a eseguire il test.

Al termine dell'esecuzione della 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'azione per la smart home per individuare l'errore, devi prima identificare la causa principale analizzando 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 scenario di test non riuscito che indicano il motivo dell'errore.

Per il primo scenario di test non riuscito riportato sopra,

99e4e5d06965a8a7.png

il suo messaggio di errore indica Test Suite prevede che "isPause": true negli stati segnalati dall'azione per la smart home, ma gli stati effettivi includono solo "isPause": false.

Inoltre, il messaggio di errore del secondo scenario di test non riuscito indica che gli stati nella risposta QUERY all'azione per la smart home includono "isPause": true, che differisce da "isPause": false negli stati segnalati dall'azione per la smart home:

fdb5124102e3a37.png

In base a entrambi i messaggi di errore, devi verificare se i report sulle azioni mostrano lo stato isPaused con il valore corretto.

Identificare la causa principale dell'errore

Apri functions/index.js, che contiene la funzione reportstate che invia le modifiche di stato al Grafico domestico tramite lo stato del report. Esamina il payload dello stato del report e scoprirai che al payload manca lo stato isPaused, che è esattamente quello che la Test Suite ha verificato 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: 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,
      });
      ...
    });

Correggere l'errore

Ora che hai identificato la causa principale dell'errore, rivedi functions/index.js aggiungendo lo stato isPaused al payload dello stato del report:

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

Verifica 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 Test Suite per la smart home e tutti gli scenari di test sono stati superati.

148837f85d377dd6.png

5. Complimenti

17d485868a6771bc.png

Complimenti! Hai imparato a risolvere i problemi di azione per la smart home tramite la Test Suite per la smart home e Metriche Google Cloud e logging.

Scopri di più

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

Puoi anche scoprire di più su come testare e inviare un'azione per la revisione, inclusa la procedura di certificazione per pubblicare l'azione per gli utenti.