Eseguire il debug della home page locale

1. Prima di iniziare

Le integrazioni per la smart home consentono all'Assistente Google di controllare i dispositivi connessi nelle case degli utenti. Per creare un'azione per la smart home, devi fornire un endpoint webhook cloud in grado di gestire gli intent della smart home. Ad esempio, quando un utente dice "Hey Google, accendi le luci", l'assistente invia il comando al tuo servizio di evasione cloud per aggiornare lo stato del dispositivo.

L'SDK Local Home migliora l'integrazione della tua smart home aggiungendo un percorso locale per instradare gli intent della smart home direttamente a un dispositivo Google Home, il che migliora l'affidabilità e riduce la latenza nell'elaborazione dei comandi degli utenti. Ti consente di scrivere e implementare un'app di distribuzione locale in TypeScript o JavaScript che identifichi i dispositivi ed esegua i comandi su qualsiasi smart speaker Google Home o smart display Google Nest. L'app comunica quindi direttamente con gli smart device esistenti degli utenti tramite la rete locale utilizzando i protocolli standard esistenti per eseguire i comandi.

72ffb320986092c.png

Il debug delle azioni per la smart home è un passaggio fondamentale per creare azioni con qualità di produzione, ma è impegnativo e richiede tempo se non si dispone di strumenti di risoluzione dei problemi e di test informativi e facili da usare. Per semplificare il debug delle azioni per la smart home, 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 delle tue azioni.

Prerequisiti

Cosa creerai

In questo codelab, creerai un completamento locale per le azioni per la smart home e lo collegherai all'assistente, quindi eseguirai il debug dell'app Casa locale tramite la suite di test per la smart home e le metriche e i log della piattaforma Google Cloud (GCP).

Obiettivi didattici

  • Come utilizzare le metriche e il logging di Google Cloud per identificare e risolvere i problemi di produzione.
  • Come utilizzare la Test Suite per identificare i problemi relativi alle API e al funzionamento.
  • Come utilizzare gli Strumenti per sviluppatori di Chrome durante lo sviluppo dell'app Home locale.

Che cosa ti serve

2. Esegui l'app della lavatrice

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-local.git

Informazioni sul progetto

L'app di avvio contiene sottodirectory e funzioni cloud simili a quelle del codelab Attivare il completamento locale per le azioni per la smart home. Ma qui, invece di app-start, abbiamo app-faulty. Inizieremo con un'app Home locale che funziona, ma non molto bene.

Connettersi a Firebase

Utilizzeremo lo stesso progetto che hai creato nel codelab Attivare l'evasione locale per le azioni per la smart home, ma implementeremo i file scaricati in questo codelab.

Vai alla directory app-faulty, quindi configura l'interfaccia a riga di comando di Firebase con il progetto Actions creato nel codelab Attivare il completamento locale per le azioni per la smart home:

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

Esegui il deployment in Firebase

Vai alla cartella app-faulty/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

Passa alla directory app-faulty/local/ ed esegui questi comandi per scaricare il compilatore TypeScript e compilare l'app:

$ cd ../local
$ npm install
$ npm run build

Verrà compilato il codice sorgente index.ts (TypeScript) e i seguenti contenuti verranno inseriti nella directory app-faulty/public/local-home/:

  • bundle.js: output JavaScript compilato contenente l'app locale e le dipendenze.
  • index.html: pagina di hosting locale utilizzata per pubblicare l'app per i test sul dispositivo.

Ora che hai installato le dipendenze e configurato il progetto, puoi eseguire l'app per la prima volta.

$ 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://<projectcd -id>.web.app

Questo comando esegue il deployment di un'app web e di diverse funzioni Cloud per Firebase.

Aggiorna Home Graph

Apri l'URL di hosting nel browser (https://<project-id>.web.app) 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:

fa3c47f293cfe0b7.png

Apri l'app Google Home e verifica di vedere la lavatrice con il nuovo nome "Lavatrice malfunzionante". Ricordati di assegnare il dispositivo a una stanza in cui è presente un dispositivo Nest.

2a082ee11d47ad1a.png

3. Avvia la lavatrice smart

Se hai eseguito il codelab Attivare il completamento locale per le azioni per la smart home, dovresti aver già avviato la lavatrice smart virtuale. Se è stato interrotto, ricordati di riavviare il dispositivo virtuale.

Avvia il dispositivo

Vai alla directory virtual-device/ ed esegui lo script del dispositivo, passando i parametri di configurazione come argomenti:

$ cd ../../virtual-device
$ npm install
$ npm start -- \
  --deviceId=deviceid123 --projectId=<project-id> \
  --discoveryPortOut=3311 --discoveryPacket=HelloLocalHomeSDK

Verifica che lo script del dispositivo venga eseguito con i parametri previsti:

(...): UDP Server listening on 3311
(...): Device listening on port 3388
(...): Report State successful

4. Testare l'app Home locale

Invia comandi vocali al tuo dispositivo Google Home tramite comandi vocali, ad esempio:

"Hey Google, accendi la lavatrice."

"Hey Google, avvia la lavatrice."

"Hey Google, forza locale."

"Hey Google, interrompi la lavatrice."

Quando provi a controllare la lavatrice dopo "force local", l'Assistente Google risponderà con "Mi dispiace, sembra che la lavatrice con problemi non sia disponibile al momento".

Ciò significa che il dispositivo non è raggiungibile tramite un percorso locale. Funzionava prima di emettere "Hey Google, forza locale" perché torneremo a utilizzare il percorso sul cloud quando il dispositivo non è raggiungibile tramite un percorso locale. Tuttavia, dopo "force local", l'opzione di ripristino del percorso cloud è disattivata.

Per scoprire qual è il problema, utilizziamo gli strumenti a nostra disposizione: Metriche della piattaforma Google Cloud (Google Cloud), Logging e Strumenti per sviluppatori di Chrome.

5. Eseguire il debug dell'app Home locale

Nella sezione seguente, utilizzerai gli strumenti forniti da Google per scoprire perché il dispositivo non è raggiungibile tramite il percorso locale. Puoi utilizzare gli strumenti per sviluppatori di Google Chrome per connetterti al dispositivo Google Home, visualizzare i log della console ed eseguire il debug dell'app Home locale. Puoi anche inviare log personalizzati a Cloud Logging per essere a conoscenza degli errori principali rilevati dagli utenti nell'app Home locale.

Collegare gli Strumenti per sviluppatori di Chrome

Per collegare il debugger all'app di evasione degli ordini locale:

  1. Assicurati di aver collegato il tuo dispositivo Google Home a un utente con l'autorizzazione ad accedere al progetto Console di azioni.
  2. Riavvia il dispositivo Google Home, in modo che possa recuperare l'URL del codice HTML e la configurazione della scansione inserita nella console di Actions.
  3. Avvia Chrome sulla tua macchina di sviluppo.
  4. Apri una nuova scheda di Chrome e inserisci chrome://inspect nel campo dell'indirizzo per avviare l'ispezione.

Nella pagina dovresti vedere un elenco di dispositivi e l'URL dell'app dovrebbe apparire sotto il nome del tuo dispositivo Google Home.

567f97789a7d8846.png

Avvia controllo

Fai clic su Ispeziona sotto l'URL dell'app per avviare gli Strumenti per sviluppatori di Chrome. Seleziona la scheda Console e verifica di poter vedere i contenuti dell'intent IDENTIFY stampati dall'app TypeScript.

774c460c59f9f84a.png

Questo output indica che il gestore IDENTIFY è stato attivato correttamente, ma il valore verificationId restituito in IdentifyResponse non corrisponde a nessuno dei dispositivi in Home Graph. Aggiungiamo alcuni log personalizzati per scoprire il motivo.

Aggiungere log personalizzati

Sebbene l'SDK Local Home stampi un errore DEVICE_VERIFICATION_FAILED, questo non aiuta molto a trovare la causa principale. Aggiungiamo alcuni log personalizzati per assicurarci di leggere ed elaborare correttamente i dati della scansione e tieni presente che, se rifiutiamo la promessa con un errore, il messaggio di errore viene inviato anche a Cloud Logging.

local/index.ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device id.
  // Is there something wrong here?
  const localDeviceId = Buffer.from(scanData.data);
  console.log(`IDENTIFY handler: received local device id
      ${localDeviceId}`);

  // Add custom logs
  if (!localDeviceId.toString().match(/^deviceid[0-9]{3}$/gi)) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_device', 'Invalid device id from scan data ' +
        localDeviceId);
    return Promise.reject(err);
  }

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

Inoltre, modifica la versione locale dell'app Home in modo che possiamo identificare se stiamo utilizzando la versione corretta.

local/index.ts

const localHomeSdk = new App('1.0.1');

Dopo aver aggiunto i log personalizzati, devi compilare di nuovo l'app e re-eseguirne il deployment in Firebase.

$ cd ../app-faulty/local
$ npm run build
$ firebase deploy --only hosting

Ora riavvia il dispositivo Google Home in modo che possa caricare l'app Home locale aggiornata. Puoi vedere se il dispositivo Google Home utilizza la versione prevista controllando i log della console in Strumenti per sviluppatori di Chrome.

ecc56508ebcf9ab.png

Accedi a Cloud Logging

Vediamo come utilizzare Cloud Logging per trovare gli errori. Per accedere a Cloud Logging per il tuo progetto:

  1. Nella console di Cloud Platform, vai alla pagina Progetti.
  2. Seleziona il tuo progetto per la smart home.
  3. In Operazioni, seleziona Logging > Esplora log.

L'accesso ai dati di logging è gestito tramite Identity and Access Management (IAM) per gli utenti del progetto Actions. Per ulteriori dettagli su ruoli e autorizzazioni per la registrazione dei dati, consulta il controllo dell'accesso di Cloud Logging.

Utilizzare i filtri avanzati

Sappiamo che si verificano errori nell'intent IDENTIFY, in quanto il percorso locale non funziona perché non è possibile identificare il dispositivo locale. Tuttavia, vogliamo sapere esattamente qual è il problema, quindi eliminiamo prima gli errori che si verificano nell'handler IDENTIFY.

Fai clic sul pulsante di attivazione/disattivazione Mostra query, che dovrebbe trasformarsi in una casella Query Builder. Inserisci jsonPayload.intent="IDENTIFY" nella casella Query Builder e fai clic sul pulsante Esegui query.

4c0b9d2828ee2447.png

Di conseguenza, vengono visualizzati tutti i log degli errori generati nell'handler IDENTIFY. Poi, espandi l'ultimo errore. Nel gestore IDENTIFY troverai gli elementi errorCode e debugString che hai appena impostato quando rifiuti la promessa.

71f2f156c6887496.png

Da debugString, possiamo dire che l'ID dispositivo locale non è nel formato previsto. L'app Home locale si aspetta di ricevere l'ID dispositivo locale come stringa che inizia con deviceid seguita da 3 cifre, ma l'ID dispositivo locale qui è una stringa esadecimale.

Correggere l'errore

Tornando al codice sorgente in cui analizziamo l'ID dispositivo locale dai dati di scansione, notiamo che non abbiamo fornito la codifica durante la conversione della stringa in byte. I dati della scansione vengono ricevuti come stringa esadecimale, quindi passa hex come codifica dei caratteri quando chiami Buffer.from().

local/index.ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device id.
  const localDeviceId = Buffer.from(scanData.data, 'hex');
  console.log(`IDENTIFY handler: received local device id
      ${localDeviceId}`);

  if (!localDeviceId.toString().match(/^deviceid[0-9]{3}$/gi)) {
    const err = new IntentFlow.HandlerError(request.requestId,
      'invalid_device', 'Invalid device id from scan data ' +
      localDeviceId);
    return Promise.reject(err);
  }

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

Inoltre, modifica la versione locale dell'app Home in modo che possiamo identificare se stiamo utilizzando la versione corretta.

local/index.ts

const localHomeSdk = new App('1.0.2');

Dopo aver corretto l'errore, compila l'app e esegui nuovamente il deployment in Firebase. In app-faulty/local, esegui:

$ npm run build
$ firebase deploy --only hosting

Testa la correzione

Dopo l'implementazione, riavvia il tuo dispositivo Google Home affinché possa caricare l'app Home locale aggiornata. Assicurati che la versione dell'app Home locale sia 1.0.2 e questa volta non dovresti vedere errori nella console Strumenti per sviluppatori di Chrome.

c8456f7b5f77f894.png

Ora puoi provare a inviare di nuovo i comandi al dispositivo.

"Hey Google, forza locale."

"Hey Google, ferma la lavatrice."

"Hey Google, accendi la lavatrice."

"Hey Google, forza il valore predefinito."

6. Esegui la Test Suite per la smart home

Dopo aver verificato il dispositivo utilizzando i controlli touch nell'app Google Home o tramite i comandi vocali, puoi utilizzare la suite di test automatica per la smart home per convalidare i casi d'uso in base ai tipi di dispositivi e alle caratteristiche associate alla tua 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 suite di test per la smart home

Segui queste istruzioni per testare l'Azione della tua smart home 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 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. Poi fai clic su AVANTI per continuare.
  4. Nel passaggio Test Settings (Impostazioni test), dovresti vedere la lavatrice difettosa nella sezione Devices and Trais (Dispositivi e tratti).
  5. 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 l'opzione Richiedi sincronizzazione ogni volta che l'utente aggiunge, rimuove o rinomina dispositivi.
  6. Lascia abilitata l'opzione Local Home SDK, dato che eseguiremo il test dei percorsi locali e cloud.
  7. Fai clic su Avanti: ambiente di test per iniziare a eseguire il test.

67433d9190fa770e.png

Una volta completati i test, noterai che i test Metti in pausa/Riprendi nel percorso locale hanno esito negativo mentre i test Metti in pausa/Riprendi nel percorso cloud hanno esito positivo.

d1ebd5cfae2a2a47.png

Analizzare il messaggio di errore

Esamina più da vicino i messaggi di errore nei casi di test non riusciti. Ti indicano lo stato previsto per il test e lo stato effettivo. In questo caso, per "Metti in pausa la lavatrice", lo stato previsto è isPaused: true, ma lo stato effettivo è isPaused: false. Analogamente, per "Metti in pausa la lavatrice", lo stato previsto è isPaused: true, ma nello stato effettivo abbiamo isPaused: false.

6bfd3acef9c16b84.png

Dai messaggi di errore, sembra che, nel percorso locale, stia impostando lo stato isPaused invertito.

Identifica e correggi l'errore

Troviamo il codice sorgente in cui l'app Home locale invia il comando di esecuzione al dispositivo. getDataCommand() è la funzione chiamata da executeHandler() per impostare payload nel comando di esecuzione inviato al dispositivo.

local/index.ts

getDataForCommand(command: string, params: IWasherParams): unknown {
    switch (command) {
        case 'action.devices.commands.OnOff':
            return {
                on: params.on ? true : false
            };
        case 'action.devices.commands.StartStop':
            return {
                isRunning: params.start ? true : false
            };
        case 'action.devices.commands.PauseUnpause':
            return {
                // Is there something wrong here?
                isPaused: params.pause ? false : true
            };
        default:
            console.error('Unknown command', command);
            return {};
    }
}

Stiamo impostando isPause nello stato inverso. Dovrebbe essere impostato su true quando params.pause è true e in caso contrario su false. Risolviamo il problema.

local/index.ts

getDataForCommand(command: string, params: IWasherParams): unknown {
    switch (command) {
        case 'action.devices.commands.OnOff':
            return {
                on: params.on ? true : false
            };
        case 'action.devices.commands.StartStop':
            return {
                isRunning: params.start ? true : false
            };
        case 'action.devices.commands.PauseUnpause':
            return {
                isPaused: params.pause ? true : false
            };
        default:
            console.error('Unknown command', command);
            return {};
    }
}

Cambia la versione dell'app Home locale per consentirci di stabilire se stiamo usando la versione corretta.

local/index.ts

const localHomeSdk = new App('1.0.3');

Ricorda di compilare di nuovo l'app e di eseguirne il nuovo deployment su Firebase. In app-faulty/local, esegui:

$ npm run build
$ firebase deploy --only hosting

Ora riavvia il dispositivo Google Home in modo che possa caricare l'app Home locale aggiornata. Assicurati che la versione dell'app Home locale sia 1.0.3.

Verifica la correzione

Ora esegui di nuovo la suite di test per la smart home con le stesse configurazioni e vedrai che tutti i casi di test sono stati superati.

b7fc8c5d3c727d8d.png

7. Complimenti

764dbc83b95782a.png

Complimenti! Hai imparato a risolvere i problemi di un'app Home locale tramite la suite di test per la smart home e Cloud Logging.

Scopri di più

Ecco alcune altre cose che puoi provare a fare:

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