Debug della smart home

1. Prima di iniziare

In qualità di sviluppatore di internet of things (IoT), puoi creare integrazioni cloud-to-cloud 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 utilizzare gli strumenti di debug per le integrazioni cloud-to-cloud è un passaggio importante per creare un'integrazione con l'Assistente Google di qualità di produzione. Per semplificare il monitoraggio e il debug, sono disponibili Metriche e Logging della piattaforma Google Cloud (GCP) e la Suite di test per la smart home per aiutarti a identificare e risolvere i problemi relativi alle integrazioni.

Prerequisiti

Cosa creerai

In questo codelab, eseguirai il deployment di un'integrazione cloud-to-cloud con due difetti e la collegherai all'assistente, quindi eseguirai il debug dei difetti dell'integrazione tramite la suite di test per le metriche e i log della smart home e della piattaforma Google Cloud (GCP).

Cosa imparerai a fare

  • Come utilizzare le metriche e la registrazione di Google Cloud per identificare e risolvere i problemi di produzione
  • Come utilizzare Test Suite per la smart home per identificare i problemi relativi a funzionalità e API

Che cosa ti serve

2. Esegui l'app con problemi

Ottieni il codice sorgente

Fai clic sul seguente link per scaricare il Sample per questo codelab sulla tua macchina di sviluppo:

In alternativa, puoi clonare il repository GitHub dalla riga di comando:

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

Informazioni sul progetto

L'app della lavatrice contiene le seguenti sottodirectory:

Connettersi a Firebase

Apri il terminale sulla tua macchina di sviluppo. Vai alla directory washer-faulty, quindi configura Firebase CLI con il progetto di integrazione creato nel codelab Collegare i 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 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 della lavatrice difettosa.

$ 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

Aggiornare 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 Aggiorna ae8d3b25777a5e30.png per aggiornare HomeGraph tramite Richiedi sincronizzazione con i metadati del dispositivo più recenti dell'app della lavatrice difettosa:

6f2b1344179977cf.png

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

e357de6a7faff925.png

3. Testa l'integrazione

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

Testa la lavatrice

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

"Hey Google, interrompi la lavatrice."

Quando metti in pausa / riprendi la lavatrice, l'assistente risponde che c'è un problema tramite comandi vocali:

"Mi dispiace, non è stato possibile contattare <nome visualizzato del progetto>."

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

Dashboard di Smarthome Analytics

Un buon posto per controllare gli errori è la dashboard di Smarthome Analytics, che aggrega i grafici delle metriche di utilizzo e integrità per l'implementazione sul cloud:

  • Le metriche Utilizzo riflettono la tendenza di utilizzo dell'integrazione cloud-to-cloud, incluso il numero di utenti attivi giornalieri e il numero totale di richieste al tuo sistema di evasione degli ordini.
  • Le metriche Integrità ti aiutano a monitorare l'occorrenza di anomalie nell'integrazione cloud-to-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. In Developer Console, vai alla pagina Progetti.
  2. Seleziona il tuo progetto per la 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 (Google Home Analytics - Integrazione cloud).

5edd3751323176dd.png

  1. Scorri verso il basso fino al grafico Errori di adempimento cloud - 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. Successivamente, recupera i log degli eventi in base al codice di errore per ulteriori dettagli.

Accedere ai log eventi

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

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

Nel campo di immissione 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 degli errori mostra un evento per la smart home con i dettagli dell'errore che indicano:

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

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

Identifica la causa principale dell'errore

In functions/index.js, trova l'handler 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 come la funzione updateDevice gestisce la messa in pausa / la ripresa sulla 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':
     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 / ripristino:

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

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

=>

"OK, riavvio la lavatrice."

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

"Hey Google, la mia lavatrice è accesa?"

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

"Hey Google, qual è il ciclo della mia lavatrice?"

4. Testa l'integrazione con Test Suite

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

Eseguire la suite di test per la smart home

Segui queste istruzioni per testare l'integrazione cloud-to-cloud tramite 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, la suite di test può inviare i comandi direttamente all'Assistente Google.
  3. Nel campo ID progetto, inserisci l'ID progetto dell'integrazione cloud-to-cloud. Poi fai clic su AVANTI per continuare.
  4. Nel passaggio Impostazioni test, vedrai che la suite di test elenca il tipo di dispositivo e le caratteristiche della lavatrice.

78ed6a1ebdb581bf.png

  1. Disattiva l'opzione Testa la sincronizzazione delle richieste poiché l'app della lavatrice di esempio non ha un'interfaccia utente per aggiungere / rimuovere / rinominare la 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 suite di test, visualizza i risultati dei casi di test. Noterai due casi 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, la suite di test mostra messaggi di errore per ogni test case non riuscito che indicano il motivo dell'errore.

Per il primo caso di test non riuscito riportato sopra,

99e4e5d06965a8a7.png

il messaggio di errore indica che Test Suite si aspetta "isPause": true negli stati segnalati dall'integrazione cloud-to-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 cloud-to-cloud includono "isPause": true, che è diverso da "isPause": false negli stati segnalati dall'integrazione cloud-to-cloud:

fdb5124102e3a37.png

In base a entrambi i messaggi di errore, devi verificare se i report di integrazione indicano isPaused con il valore corretto.

Identifica la causa principale dell'errore

Apri functions/index.js, che contiene la funzione reportstate che pubblica le modifiche dello stato nel grafo della casa tramite lo stato del report. Controlla il payload dello stato del report e vedrai che manca lo stato isPaused, che è esattamente ciò che la suite di test ha controllato nei casi 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,
              },
            },
          },
        },
      };
      ...
    });

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 tramite Test Suite per la smart home e le metriche e i log di Google Cloud.

Scopri di più

A partire da questo Codelab, prova i seguenti esercizi ed esplora risorse aggiuntive:

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