Attiva fulfillment locale per azioni per la smart home

1. Prima di iniziare

Le integrazioni della 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 per il cloud in grado di gestire gli intent per la smart home. Ad esempio, quando un utente dice "Hey Google, accendi le luci", l'assistente invia il comando a Cloud fulfillment per aggiornare lo stato del dispositivo.

L'SDK della casa locale migliora l'integrazione della tua smart home aggiungendo un percorso locale per indirizzare gli intent per la smart home direttamente a un dispositivo Google Home. Questa funzionalità aumenta l'affidabilità e riduce la latenza nell'elaborazione dei comandi degli utenti. Consente di scrivere e implementare un'app di distribuzione locale in TypeScript o JavaScript che identifica i dispositivi ed esegue comandi su qualsiasi smart speaker Google Home o smart display Google Nest. L'app comunica quindi direttamente con gli smart device esistenti degli utenti sulla local area network utilizzando i protocolli standard esistenti per eseguire i comandi.

72ffb320986092c.png

Prerequisiti

Cosa creerai

In questo codelab, eseguirai il deployment di un'integrazione della smart home creata in precedenza con Firebase, quindi applicherai una configurazione di scansione nella console Actions e creerai un'app locale utilizzando TypeScript per inviare comandi scritti in Node.js a una lavatrice virtuale.

Cosa imparerai a fare

  • Come abilitare e configurare il fulfillment locale nella console di Actions.
  • Come utilizzare l'SDK Local Home per scrivere un'app di distribuzione locale.
  • Come eseguire il debug dell'app di distribuzione locale caricata sullo speaker Google Home o sullo smart display Google Nest.

Che cosa ti serve

2. Per iniziare

Attivare la Gestione attività

Per utilizzare l'Assistente Google, devi condividere con Google determinati dati relativi alle attività. L'Assistente Google ha bisogno di questi dati per funzionare correttamente; tuttavia, il requisito di condivisione dei dati non è specifico dell'SDK. Per condividere questi dati, crea un Account Google se non ne hai già uno. Puoi utilizzare qualsiasi Account Google, non è necessario che sia il tuo account sviluppatore.

Apri la pagina Gestione attività relativa all'Account Google che vuoi usare con l'assistente.

Assicurati che le seguenti opzioni di attivazione/disattivazione siano abilitate:

  • Attività web e app: assicurati di selezionare la casella di controllo Includi la cronologia di Chrome e le attività svolte su siti, app e dispositivi che usano i servizi Google.
  • Informazioni del dispositivo
  • Attività vocale e audio

Creare un progetto Actions

  1. Vai alla Play Console per gli sviluppatori di Actions on Google.
  2. Fai clic su Nuovo progetto, inserisci un nome per il progetto e fai clic su CREA PROGETTO.

AWXw5E1m9zVgvVeyeL3uxwCX6DtWOCK6LRSLmOATFzjMbmE5cSWBdSVhJZDFpEFH2azZTK2eMs6OYYdMJYiGb5bKqFEzxaLyRUYuwVGBl8ZRwETC

Seleziona l'app Smart home

Nella schermata Panoramica della console Actions, seleziona Smart home.

36RsBUWBgbgsa5xZ7MJVMm1sIg07nXbfjv0mWCxXViaC5SlbL2gMigw9hgXsZQhNMHLLFOfiKdZsSTNXONFB1i47gksw3SBNpkVYl492WeryOlgxKjpVrLAvg-5cZqu1DI-s5kxM3g

Scegli la scheda dell'esperienza Smart home e si aprirà la console del tuo progetto.

pzgHPsmc2LvLoeUvJfkjKQqD_BvO4v8JOPlcrxsmyptFkkjL4PP6LqrM9r5tNvEIfT9HmK-UKw3GWFPXTjqo4nUrhD2o5shUKHBE31OT8iIA69JZCev7_0_nh-lnL2oJHoxGfqqZ4w

Installa l'interfaccia a riga di comando di Firebase

L'interfaccia a riga di comando (CLI) di Firebase ti consente di pubblicare le tue app web localmente ed eseguire il deployment dell'app web su Firebase Host.

Per installare l'interfaccia a riga di comando, esegui questo comando npm dal terminale:

npm install -g firebase-tools

Per verificare che l'interfaccia a riga di comando sia stata installata correttamente, esegui:

firebase --version

Autorizza l'interfaccia a riga di comando di Firebase con il tuo Account Google eseguendo:

firebase login

Abilita l'API HomeGraph

L'API HomeGraph consente l'archiviazione e l'esecuzione di query sui dispositivi e sui loro stati all'interno di Home Graph di un utente. Per utilizzare questa API, devi prima aprire la console Google Cloud e abilitare l'API HomeGraph.

Nella console Google Cloud, assicurati di selezionare il progetto che corrisponde alle tue azioni <project-id>.. Quindi, nella schermata della libreria API per l'API HomeGraph, fai clic su Abilita.

5SVCzM8IZLi_9DV8M0nEklv16NXkpvM0bIzQK2hSyKyvnFHBxPOz90rbr72ayxzmxd5aNROOqC_Cp4outbdlwJdObDs0DIE_8vYzw6dovoVrP9IZWlWsZxDS7UHOi1jiRbDMG8MqUA

3. Esegui l'app di base

Ora che hai configurato l'ambiente di sviluppo, puoi eseguire il deployment del progetto iniziale per verificare che tutto sia configurato correttamente.

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

Informazioni sul progetto

Il progetto iniziale contiene le seguenti sottodirectory:

  • public: UI web frontend per controllare e monitorare la lavatrice smart
  • functions: Cloud Functions che implementa il fulfillment cloud per l'azione per la smart home
  • local: progetto di app di fulfillment locale Skeleton con gestori di intent simulati in index.ts

Il fulfillment Cloud fornito include le seguenti funzioni in index.js:

  • fakeauth: endpoint di autorizzazione per il collegamento dell'account
  • faketoken: endpoint del token per il collegamento dell'account
  • smarthome: endpoint di fulfillment dell'intent per la smart home
  • reportstate: richiama l'API HomeGraph in caso di modifiche dello stato del dispositivo
  • updateDevice: endpoint utilizzato dal dispositivo virtuale per attivare lo stato del report

Connettersi a Firebase

Vai alla directory app-start, quindi configura l'interfaccia a riga di comando di Firebase con il tuo progetto Actions:

cd app-start
firebase use <project-id>

Configura progetto Firebase

Inizializzare un progetto Firebase.

firebase init

Seleziona le funzionalità dell'interfaccia a riga di comando, Realtime Database, Funzioni e la funzionalità Hosting che include Firebase Hosting.

? Which Firebase CLI features do you want to set up for this directory? Press Space to select features, then
 Enter to confirm your choices.
❯◉ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance
 ◯ Firestore: Configure security rules and indexes files for Firestore
 ◉ Functions: Configure a Cloud Functions directory and its files
 ◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ◯ Hosting: Set up GitHub Action deploys
 ◯ Storage: Configure a security rules file for Cloud Storage
 ◯ Emulators: Set up local emulators for Firebase products
 ◯ Remote Config: Configure a template file for Remote Config
 ◯ Extensions: Set up an empty Extensions manifest

Questa operazione inizializza le API e le funzionalità necessarie per il tuo progetto.

Quando richiesto, inizializza Realtime Database. Puoi utilizzare la località predefinita per l'istanza di database.

? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up?
Yes

? Please choose the location for your default Realtime Database instance:
us-central1

Poiché utilizzi il codice del progetto iniziale, scegli il file predefinito per le regole di sicurezza e assicurati di non sovrascrivere il file delle regole del database esistente.

? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console?
No

Se stai reinizializzando il progetto, seleziona Sovrascrivi quando ti viene chiesto se vuoi inizializzare o sovrascrivere un codebase.

? Would you like to initialize a new codebase, or overwrite an existing one?
Overwrite

Quando configuri le funzioni, devi utilizzare i file predefiniti e assicurarti di non sovrascrivere i file index.js e package.json esistenti nell'esempio del progetto.

? What language would you like to use to write Cloud Functions?
JavaScript

? Do you want to use ESLint to catch probable bugs and enforce style?
No

? File functions/package.json already exists. Overwrite?
No

? File functions/index.js already exists. Overwrite?
No

Se stai reinizializzando il progetto, seleziona No quando ti viene chiesto se vuoi inizializzare o sovrascrivere Functions/.gitignore.

? File functions/.gitignore already exists. Overwrite?
No
? Do you want to install dependencies with npm now?
Yes

Infine, configura la configurazione di Hosting in modo che utilizzi la directory public nel codice del progetto e il file index.html esistente. Seleziona No quando ti viene chiesto di utilizzare ESLint.

? What do you want to use as your public directory?
public

? Configure as a single-page app (rewrite all urls to /index.html)?
Yes

? Set up automatic builds and deploys with GitHub?
No

? File public/index.html already exists. Overwrite?
 No

Se ESLint è stato attivato per errore, esistono due metodi per disabilitarlo:

  1. Utilizzando la GUI, vai alla cartella ../functions del progetto, seleziona il file nascosto .eslintrc.js ed eliminalo. Non scambiarlo con il nome simile .eslintrc.json.
  2. Utilizzo della riga di comando:
    cd functions
    rm .eslintrc.js
    

Per assicurarti di avere una configurazione Firebase corretta e completa, copia il file firebase.json dalla directory washer-done alla directory washer-start, sovrascrivendo quello in washer-start.

Nella directory washer-start:

cp -vp ../washer-done/firebase.json .

Eseguire il deployment in Firebase

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

Questo comando esegue il deployment di un'app web e di diverse Cloud Functions for Firebase.

Apri l'URL di hosting nel tuo browser (https://<project-id>.web.app) per visualizzare l'app web. Vedrai l'interfaccia seguente:

L60eA7MOnPmbBMl2XMipT9MdnP-RaVjyjf0Y93Y1b7mEyIsqZrrwczE7D3RQISRs-iusL1g4XbNmGhuA6-5sLcWefnczwNJEPfNLtwBsO4Tb9YvcAZBI6_rX19z8rxbik9Vq8F2fwg

Questa UI web rappresenta una piattaforma di terze parti per visualizzare o modificare gli stati dei dispositivi. Per iniziare a completare il database con le informazioni del dispositivo, fai clic su AGGIORNA. Non vedrai alcuna modifica sulla pagina, ma lo stato attuale della lavatrice verrà memorizzato nel database.

Ora è il momento di connettere il servizio cloud di cui hai eseguito il deployment all'Assistente Google utilizzando la console di Actions.

Configura il progetto della console Actions

In Panoramica > Crea la tua azione, seleziona Aggiungi azioni. Inserisci l'URL della funzione Cloud Functions che fornisce il fulfillment per gli intent della smart home e fai clic su Salva.

https://us-central1-<project-id>.cloudfunctions.net/smarthome

Uso-o00XQXBHvOR9vQq9tmpYDYQJKsFEstsgRFnxPAJf7zJ2FxwhISiodo3dB1Tz49Okd6ivi66fjpo7rarS_GZelglGWCT1r9FzDGUl1r67ddIcIbQrxqN8jG9F9GAKOpk0Ckc-eA

Nella scheda Sviluppa > Chiamata, aggiungi un Nome visualizzato per l'azione e fai clic su Salva. Questo nome verrà visualizzato nell'app Google Home.

gvC-TvmKDy-D-xjwkeCjNt__9ErA7DL8hZWa1oH1yPJ9SpYOepDYjxx6WnJ56IG-t37fJ65kmHISQdh72Ot2G-0tu6Flxf4gom5kvx_3hlvFeMqYuFgXr_85pfWWn7VLFHtS55p1zw

s4yc1kOW4XtKUQN1EYegiDLU5oTqmxQ2PNbeaujm26OQmYKKpjug7j5FYmutLSAZ1zBd-ZkcZlL7zyTZqw4bge3_oOeWvJTsqJ-A08vfZwImYQrKiquLskLuTpmMqXEZD1xchhCWGQ

Per attivare il collegamento degli account, seleziona l'opzione Sviluppo > Collegamento dell'account nel pannello di navigazione a sinistra. Utilizza queste impostazioni di collegamento dell'account:

ID client

ABC123

Client secret

DEF456

URL autorizzazione

https://us-central1-<project-id>.cloudfunctions.net/fakeauth

URL token

https://us-central1-<project-id>.cloudfunctions.net/faketoken

rRyZTiBSTuPk3YtJtXjDK1pPftUxsaEhs9jzpvFtbHTD6bEwYxM8jV4MWxiljKA1bKVZrIRoO9O3jtBefLKf_OyMpukPjwIj8zGvyU3UwASzMrnRskl-hVAfAmQVi4sC_zAwgYwRXw

Fai clic su Salva per salvare la configurazione del collegamento dell'account e poi su Test per attivare i test sul progetto.

OgUvpQfXioygkRwPcaJpzjyNQDZy6enidUC8YMPaCOrZi0YeWCFsCJV9Gqg-_UfsqTnn4KEg--uE3Ymr0QuamDonF4RyYHtRKcULXABDuaEnj2hq8i20LYj1SrGP_1lQ_UsUB90pGw

Verrà eseguito il reindirizzamento al Simulatore. Verifica che i test siano stati abilitati per il tuo progetto spostando il mouse sull'icona Test sul dispositivo ( soCeBB1CkSIEqsBmDc8Cth6EjgcXUnrOHeOpLNlvMiiXM73Rmh8iBK1ZFLFd47kycYqIMq3Fm49ryAGUt79BXVPDyEB1IU3W0fgiL49iqTAVrpRznewAVTX).

2zbfeYpG-wEd2SFP07Wc4mJzHakLX7YvrNw3IV0_0Kd-TonfsKIvvjKWlwvrmTm5jLj3XPWqCtcDd5J2z6gwn9fnchpYVraw1j_mE4M0LVppAl5WY5cK7g0uZyhZ3VFFS25yPmyksg

Per testare l'Azione per la smart home, devi collegare il tuo progetto a un Account Google. In questo modo è possibile eseguire test tramite le piattaforme dell'Assistente Google e l'app Google Home su cui è stato eseguito l'accesso allo stesso account.

  1. Sullo smartphone, apri le impostazioni dell'Assistente Google. Tieni presente che devi aver eseguito l'accesso con lo stesso account utilizzato nella console.
  2. Vai a Assistente Google > Impostazioni > Controllo della casa (sotto Assistente).
  3. Fai clic sull'icona di ricerca in alto a destra.
  4. Cerca l'app di test utilizzando il prefisso [test] per trovare l'app di test specifica.
  5. Seleziona l'elemento. L'Assistente Google eseguirà quindi l'autenticazione con il tuo servizio e invierà una richiesta SYNC, chiedendo al servizio di fornire un elenco di dispositivi per l'utente.

Apri l'app Google Home e verifica che sia visibile il dispositivo della lavatrice.

XcWmBVamBZtPfOFqtsr5I38stPWTqDcMfQwbBjetBgxt0FCjEs285pa9K3QXSASptw0KYN2G8yfkT0-xg664V4PjqMreDDs-HPegHjOc4EVtReYPu-WKZyygq9Xmkf8X8z9177nBjQ

Verifica di poter controllare la lavatrice utilizzando i comandi vocali nell'app Google Home. Dovresti anche vedere lo stato del dispositivo cambiare nell'interfaccia utente web di frontend del tuo Cloud fulfillment.

Ora puoi iniziare ad aggiungere il fulfillment locale all'Azione.

4. Aggiorna fulfillment Cloud

Per supportare il completamento locale, devi aggiungere un nuovo campo per dispositivo denominato otherDeviceIds alla risposta di Cloud SYNC contenente un identificatore locale univoco per il dispositivo. Questo campo indica anche la possibilità di controllare localmente il dispositivo.

Aggiungi il campo otherDeviceIds alla risposta SYNC come mostrato nel seguente snippet di codice:

functions/index.js

app.onSync((body) => {
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: '123',
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [ ... ],
        name: { ... },
        deviceInfo: { ... },
        willReportState: true,
        attributes: {
          pausable: true,
        },
        otherDeviceIds: [{
          deviceId: 'deviceid123',
        }],
      }],
    },
  };
});

Esegui il deployment del progetto aggiornato su Firebase:

firebase deploy --only functions

Al termine del deployment, vai all'interfaccia utente web e fai clic sul pulsante Aggiorna ae8d3b25777a5e30.png nella barra degli strumenti. Questo attiva un'operazione di sincronizzazione delle richieste in modo che l'assistente riceva i dati aggiornati della risposta di SYNC.

bf4f6a866160a982.png

5. Configura fulfillment locale

In questa sezione, aggiungerai le opzioni di configurazione necessarie per l'evasione degli ordini locale all'Azione per la smart home. Durante lo sviluppo, pubblicherai l'app di distribuzione locale su Firebase Hosting, dove il dispositivo Google Home potrà accedervi e scaricarla.

Nella console Actions, seleziona Sviluppa > Azioni e trova la sezione Configura SDK per la casa locale. Inserisci il seguente URL nel campo dell'URL di test, inserisci l'ID progetto e fai clic su Salva:

https://<project-id>.web.app/local-home/index.html

7d59b31f8d2a988.png

Dopodiché dobbiamo definire in che modo il dispositivo Google Home deve scoprire gli smart device locali. La piattaforma Local Home supporta diversi protocolli per il rilevamento dei dispositivi, tra cui la trasmissione mDNS, UPnP e UDP. Userai la trasmissione UDP per scoprire la lavaggio smart.

Fai clic su Nuova configurazione di scansione in Configurazione scansione dispositivo per aggiungere una nuova configurazione di scansione. Seleziona UDP come protocollo e inserisci i seguenti attributi:

Campo

Descrizione

Valore suggerito

Indirizzo di trasmissione

Indirizzo di trasmissione UDP

255.255.255.255

Porta per la trasmissione

Porta a cui Google Home invia la trasmissione UDP

3311

Porta di ascolto

Porta su cui Google Home ascolta una risposta

3312

Pacchetto di rilevamento

Payload dati broadcast UDP

48656c6c6f4c6f63616c486f6d6553444b

4777bf63c53b6858.png

Infine, fai clic su Salva nella parte superiore della finestra per pubblicare le modifiche.

6. Implementa il fulfillment locale

Svilupperai l'app di distribuzione locale in TypeScript utilizzando il pacchetto di digitazione dell'SDK Local Home. Osserva lo scheletro fornito nel progetto di partenza:

local/index.ts

/// <reference types="@google/local-home-sdk" />

import App = smarthome.App;
import Constants = smarthome.Constants;
import DataFlow = smarthome.DataFlow;
import Execute = smarthome.Execute;
import Intents = smarthome.Intents;
import IntentFlow = smarthome.IntentFlow;

...

class LocalExecutionApp {

  constructor(private readonly app: App) { }

  identifyHandler(request: IntentFlow.IdentifyRequest):
      Promise<IntentFlow.IdentifyResponse> {
    // TODO: Implement device identification
  }

  executeHandler(request: IntentFlow.ExecuteRequest):
      Promise<IntentFlow.ExecuteResponse> {
    // TODO: Implement local fulfillment
  }

  ...
}

const localHomeSdk = new App('1.0.0');
const localApp = new LocalExecutionApp(localHomeSdk);
localHomeSdk
  .onIdentify(localApp.identifyHandler.bind(localApp))
  .onExecute(localApp.executeHandler.bind(localApp))
  .listen()
  .then(() => console.log('Ready'))
  .catch((e: Error) => console.error(e));

Il componente principale della distribuzione locale è la classe smarthome.App. Il progetto iniziale collega i gestori per gli intent IDENTIFY e EXECUTE, quindi chiama il metodo listen() per comunicare all'SDK Local Home che l'app è pronta.

Aggiungi il gestore IDENTIFY

L'SDK Local Home attiva il gestore IDENTIFY quando il dispositivo Google Home rileva dispositivi non verificati sulla rete locale in base alla configurazione della scansione fornita nella console Actions.

Nel frattempo, la piattaforma richiama identifyHandler con i dati di scansione risultanti quando Google rileva un dispositivo corrispondente. Nella tua app, la scansione avviene utilizzando una trasmissione UDP e i dati di scansione forniti al gestore IDENTIFY includono il payload di risposta inviato dal dispositivo locale.

Il gestore restituisce un'istanza IdentifyResponse contenente un identificatore univoco per il dispositivo locale. Aggiungi il seguente codice al tuo metodo identifyHandler per elaborare la risposta UDP proveniente dal dispositivo locale e determinare l'ID dispositivo locale appropriato:

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

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

Tieni presente che il campo verificationId deve corrispondere a uno dei valori otherDeviceIds nella risposta SYNC, in modo che il dispositivo venga contrassegnato come disponibile per l'evasione degli ordini locale nel Home Graph dell'utente. Dopo che Google trova una corrispondenza, il dispositivo viene considerato verificato e pronto per l'evasione degli ordini locale.

Aggiungi il gestore EXECUTE

L'SDK Local Home attiva il gestore EXECUTE quando un dispositivo che supporta il completamento locale riceve un comando. Il contenuto dell'intent locale equivale all'intent EXECUTE inviato al tuo fulfillment cloud, quindi la logica per l'elaborazione locale dell'intent assomiglia a come lo gestisci nel cloud.

L'app può utilizzare socket TCP/UDP o richieste HTTP(S) per comunicare con i dispositivi locali. In questo codelab, HTTP funge da protocollo utilizzato per controllare il dispositivo virtuale. Il numero di porta è definito in index.ts come variabile SERVER_PORT.

Aggiungi il seguente codice al metodo executeHandler per elaborare i comandi in entrata e inviarli al dispositivo locale tramite HTTP:

local/index.ts

executeHandler(request: IntentFlow.ExecuteRequest):
    Promise<IntentFlow.ExecuteResponse> {
  console.log("EXECUTE intent: " + JSON.stringify(request, null, 2));

  const command = request.inputs[0].payload.commands[0];
  const execution = command.execution[0];
  const response = new Execute.Response.Builder()
    .setRequestId(request.requestId);

  const promises: Array<Promise<void>> = command.devices.map((device) => {
    console.log("Handling EXECUTE intent for device: " + JSON.stringify(device));

    // Convert execution params to a string for the local device
    const params = execution.params as IWasherParams;
    const payload = this.getDataForCommand(execution.command, params);

    // Create a command to send over the local network
    const radioCommand = new DataFlow.HttpRequestData();
    radioCommand.requestId = request.requestId;
    radioCommand.deviceId = device.id;
    radioCommand.data = JSON.stringify(payload);
    radioCommand.dataType = 'application/json';
    radioCommand.port = SERVER_PORT;
    radioCommand.method = Constants.HttpOperation.POST;
    radioCommand.isSecure = false;

    console.log("Sending request to the smart home device:", payload);

    return this.app.getDeviceManager()
      .send(radioCommand)
      .then(() => {
        const state = {online: true};
        response.setSuccessState(device.id, Object.assign(state, params));
        console.log(`Command successfully sent to ${device.id}`);
      })
      .catch((e: IntentFlow.HandlerError) => {
        e.errorCode = e.errorCode || 'invalid_request';
        response.setErrorState(device.id, e.errorCode);
        console.error('An error occurred sending the command', e.errorCode);
      });
  });

  return Promise.all(promises)
    .then(() => {
      return response.build();
    })
    .catch((e) => {
      const err = new IntentFlow.HandlerError(request.requestId,
          'invalid_request', e.message);
      return Promise.reject(err);
    });
}

Compila l'app TypeScript

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

cd local
npm install
npm run build

Questo comando compila l'origine index.ts (TypeScript) e inserisce i seguenti contenuti nella directory public/local-home/:

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

Esegui il deployment del progetto di test

Esegui il deployment dei file di progetto aggiornati su Firebase Hosting in modo da potervi accedere dal dispositivo Google Home.

firebase deploy --only hosting

7. Avviare la lavatrice smart

È il momento di testare la comunicazione tra l'app di distribuzione locale e la lavaggio smart. Il progetto di avvio del codelab include una lavatrice smart v, scritta in Node.js, che simula una lavatrice smart che gli utenti possono controllare localmente.

Configurare il dispositivo

Devi configurare il dispositivo virtuale in modo che utilizzi gli stessi parametri UDP che hai applicato alla configurazione della scansione per il rilevamento dei dispositivi nella console Actions. Inoltre, devi indicare al dispositivo virtuale l'ID dispositivo locale da segnalare e l'ID progetto di azioni da utilizzare per gli eventi di stato del report quando lo stato del dispositivo cambia.

Parametro

Valore suggerito

deviceId

deviceid123

discoveryPortOut

3311

discoveryPacket

HelloLocalHomeSDK

projectId

ID progetto Actions

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

8. Esegui il debug dell'app TypeScript

Nella sezione che segue verificherai che il dispositivo Google Home sia in grado di scansionare, identificare e inviare correttamente comandi allo smartwash virtuale sulla rete locale. Puoi utilizzare gli Strumenti per sviluppatori di Google Chrome per collegarti al dispositivo Google Home, visualizzare i log della console ed eseguire il debug dell'app TypeScript.

Collega gli Strumenti per sviluppatori di Chrome

Per connettere il debugger all'app di fulfillment locale, procedi nel seguente modo:

  1. Assicurati di aver collegato il tuo dispositivo Google Home a un utente con l'autorizzazione ad accedere al progetto della console di Actions.
  2. Riavvia il dispositivo Google Home; in questo modo potrai recuperare l'URL del codice HTML e la configurazione della scansione inserita nella console di Actions.
  3. Avvia Chrome sul tuo computer di sviluppo.
  4. Apri una nuova scheda di Chrome e inserisci chrome://inspect nel campo dell'indirizzo per avviare lo strumento di controllo.

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

567f97789a7d8846.png

Avvia lo strumento di 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 visualizzare i contenuti dell'intent IDENTIFY stampati dall'app TypeScript.

6b67ded470a4c8be.png

Questo output indica che l'app di distribuzione locale ha rilevato e identificato correttamente il dispositivo virtuale.

Testa il fulfillment locale

Invia comandi al tuo dispositivo utilizzando i controlli touch nell'app Google Home o tramite i comandi vocali al dispositivo Google Home, ad esempio:

"Hey Google, accendi la lavatrice."

"Hey Google, avvia la lavatrice."

"Hey Google, interrompi la lavatrice."

Questo dovrebbe attivare la piattaforma per inviare un intent EXECUTE alla tua app TypeScript.

bc030517dacc3ac9.png

Verifica di poter vedere lo stato della lavatrice smart locale cambiare con ogni comando.

...
***** The washer is RUNNING *****
...
***** The washer is STOPPED *****

9. Complimenti

764dbc83b95782a.png

Complimenti! Hai utilizzato l'SDK Local Home per integrare l'evasione degli ordini locale in un'azione per la smart home.

Scopri di più

Ecco alcune altre cose che puoi provare a fare:

  • Modifica la configurazione della scansione e falla funzionare. Ad esempio, prova a utilizzare un'altra porta UDP o un pacchetto di rilevamento.
  • Modifica il codebase virtuale dello smart device in modo che venga eseguito su un dispositivo incorporato, ad esempio un Raspber Pi, e utilizza i LED o un display per visualizzare lo stato attuale.