Debug della smart home

1. Prima di iniziare

In qualità di sviluppatore IoT (Internet of Things), puoi creare azioni per la smart home 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

L'apprendimento degli strumenti di debug per le azioni per la smart home è un passaggio importante per creare un'integrazione della qualità di produzione con l'Assistente Google. Per semplificare monitoraggio e debug, sono disponibili le metriche di Google Cloud Platform (GCP), Logging e la Test Suite per la smart home utili per 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, che collegherai all'assistente, quindi eseguirai il debug dei difetti dell'Azione tramite Test Suite per la smart home, le metriche per la smart home, le metriche della piattaforma Google Cloud e il logging.

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 al fine di identificare problemi funzionali e relativi alle API

Che cosa ti serve

2. Esegui l'app difettosa

Ottieni il codice sorgente

Fai clic sul seguente link per scaricare l'esempio per questo codelab sulla tua macchina di sviluppo:

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

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

Informazioni sul progetto

L'app lavasciuga contiene le seguenti sottodirectory:

Connettersi a Firebase

Apri il terminale sulla macchina di sviluppo. Vai alla directory washer-faulty, quindi configura l'interfaccia a riga di comando di Firebase con il tuo progetto Actions integrato nel connettore dei 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 meno recenti. 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 lavasciuga difettosa.

$ 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 l'URL di hosting nel browser (https://<project-id>.firebaseapp.com) per visualizzare l'app web. Nell'interfaccia utente web, fai clic sul pulsante Aggiorna ae8d3b25777a5e30.png per aggiornare Home Graph tramite Richiedi sincronizzazione con i metadati del dispositivo più recenti dall'app della lavatrice difettosa:

6f2b1344179977cf.png

Apri l'app Google Home e verifica di vedere il dispositivo della lavatrice denominato Lavatrice difettosa.

e357de6a7faff925.png

3. Testare l'azione

Dopo aver implementato il progetto, verifica che l'Azione controlli la lavatrice.

Prova la lavatrice

Controlla la modifica del valore quando provi uno dei seguenti comandi vocali tramite il telefono:

"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 o riprendi la lavatrice, noterai che l'assistente risponde tramite comandi vocali quando c'è qualcosa che non va:

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

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

Dashboard di dati e analisi per la smart home

Un buon punto per esaminare gli errori è la dashboard di Smarthome Analytics, che aggrega grafici di metriche di utilizzo e salute per Cloud fulfillment:

  • Le metriche relative all'utilizzo riflettono la tendenza di utilizzo dell'azione per la smart home, inclusi il numero di utenti attivi giornalieri e il numero totale di richieste per l'evasione dell'ordine.
  • Le metriche relative a Salute ti consentono di monitorare un'anomalia nell'azione per la tua smart home, coprendo la latenza delle richieste, la percentuale di successo e l'analisi degli errori.

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

  1. Nella Console di Actions, vai alla pagina Progetti.
  2. Seleziona il progetto per la smart home.
  3. Scegli la scheda Analytics e fai clic su Vai a Google Cloud.

b1735bbe11a7aff8.png

  1. Verrà visualizzato un elenco di dashboard per il tuo progetto su Google Cloud. Seleziona la dashboard Analisi di Google Home - Integrazione con il cloud.

5edd3751323176dd.png

  1. Scorri verso il basso fino al grafico Errori di Cloud Fulfillment - Analisi 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 sulla causa principale. Quindi, recupera i log eventi in base al codice di errore per maggiori dettagli.

Accedere ai log eventi

Per ulteriori dettagli sull'errore, accedi ai log eventi per le azioni della tua 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 eseguita dall'utente è il "ripreso della 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, devi verificare perché l'app lavatrice non include il dispositivo corretto nella risposta EXECUTE.

Identifica 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 / ripresa sulla lavatrice. Troverai che la stringa da associare 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 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':
     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 vedrai che l'assistente risponde correttamente quando metti in pausa o riprendi la lavatrice.

"Hey Google, metti in pausa la lavatrice."

=>

"Certo, metto in pausa la lavatrice."

"Hey Google, riprendi la lavatrice."

=>

"Ok, riprendo la lavatrice."

Puoi anche verificare lo stato attuale della lavatrice ponendoti delle domande.

"Hey Google, la lavatrice è accesa?"

"Hey Google, la lavatrice è accesa?"

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

4. Testare l'azione con Test Suite

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

Eseguire Test Suite per la smart home

Segui queste istruzioni per testare l'Azione per la smart home con Test Suite:

  1. Nel browser web, apri la Suite di test per la smart home.
  2. Accedi a Google utilizzando il pulsante nell'angolo in alto a destra. In questo modo il 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. Fai clic su AVANTI per continuare.
  4. Nel passaggio Impostazioni di test, vedrai l'elenco del Test Suite relativo al tipo di dispositivo e alle caratteristiche della lavatrice.

78ed6a1ebdb581bf.png

  1. Disattiva l'opzione Richiesta di sincronizzazione di test poiché l'app della lavatrice di esempio non ha una UI per l'aggiunta, la rimozione o il ridenominazione della lavatrice. In un sistema di produzione, devi attivare Richiedi sincronizzazione ogni volta che l'utente aggiunge / rimuove / rinomina i 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. Vedrai due scenari di test non riusciti con il relativo messaggio di errore:

5838d10631c98ed2.png

Per eseguire il debug dell'Azione per la smart home, devi prima identificare la causa principale dell'errore analizzando il messaggio.

Analizza 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,

99e4e5d06965a8a7.png

il relativo messaggio di errore indica che il Test Suite prevede "isPause": true negli stati segnalati dall'azione per la smart home, mentre 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 dell'Azione per la smart home includono "isPause": true, che è diverso da "isPause": false negli stati segnalati dall'Azione per la smart home:

fdb5124102e3a37.png

In base a entrambi i messaggi di errore, dovresti verificare se nei tuoi report Azioni è indicato il valore isPaused con il valore corretto.

Identifica la causa principale dell'errore

Apri functions/index.js, che contiene la funzione reportstate che pubblica le modifiche di stato nel grafico Home tramite lo stato del report. Esaminando il payload dello stato del report, scoprirai che nel payload manca lo stato isPaused, che è esattamente quello che il Test Suite ha cercato 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 il Test Suite per la smart home: vedrai che tutti gli scenari di test sono stati superati.

148837f85d377dd6.png

5. Complimenti

17d485868a6771bc.png

Complimenti! Hai imparato a risolvere i problemi relativi alle azioni per la smart home con la Test Suite per la smart home, le metriche Google Cloud e Logging.

Scopri di più

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

Scopri di più su come testare e inviare un'Azione per la revisione, inclusa la procedura di certificazione per la pubblicazione dell'Azione per gli utenti.