Come integrare nei tuoi dispositivi
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.
Ovvero, cose serve fare per accendere la lampadina
💡
Google Home è una piattaforma di automazione domestica che consente il controllo e la gestione di vari dispositivi intelligenti all'interno della casa utilizzando comandi vocali o l'app Google Home.
Funziona in combinazione con l'Assistente Google, un assistente virtuale basato sull'intelligenza artificiale che risponde ai comandi vocali degli utenti.
Supporta una vasta gamma di dispositivi intelligenti, tra cui luci, termostati, telecamere di sicurezza, altoparlanti intelligenti....
informatico (ed un po anche elettronico) per passione
Attualmente lavoro presso Kalpa, un'azienda specializzata in soluzioni IoT e automazione industriale, ma non solo.
Negli ultimi 10 anni mi sono occupato di progettazione e sviluppo di sistemi IoT (principalmente domotica).
In passato ho lavorato in ambito Web (Corriere della Sera), Telco (Italtel), GDO (Carrefour).
Ovviamente serve avere già una piattaforma IoT e dei dispositivi "connessi".
Serve poter fare autenticazione con OAuth 2.0. Google Home, infatti, attraverso l'uso dell'Identity Provider, otterrà un token di accesso relativo all'utente per inviare i comandi.
Il flusso di autenticazione con Google Home (Account linking):
Il flusso di autenticazione con Google Home (Account linking):
Il flusso di autenticazione con Google Home:
Il flusso di autenticazione con Google Home:
Nella demo useremo Keycloak (ma è possibile anche usare Google Identity Platform, ma solo con la registrazione del dominio)
Oppure potete creare il vostro server IdP sequendo queste istruzioni (non consigliato...).
Nelle immagini che seguono vediamo come configurare Keycloak per l'integrazione con Google Home.
Ma, indipendentemente dal server IdP che usate, serve ottenere questi 5 parametri:
Progetto Google Home e Google Cloud sono la stessa cosa
1. Creare un progetto su Google Home Console
2. Configurare le credenziali OAuth 2.0 (URL OAuth2, Client ID, Client Secret, Scopes)
3. Creare credenziali di servizio per chiamare verso Home Graph
Creazione e configurazione progetto su Google Home
Creazione e configurazione progetto su Google Home
Creazione e configurazione progetto su Google Home
Creazione e configurazione progetto su Google Home
Creazione e configurazione progetto su Google Home
Creazione e configurazione progetto su Google Home
Creazione e configurazione progetto su Google Home
Creazione e configurazione progetto su Google Home
Per poter informare Google Home circa il cambio di stato dei nostri dispositivi, è necessario utilizzare le credenziali di servizio per richiamare HomeGraph API.
Abilitata l'API è possibile creare il service account e scaricare il file con le credenziali
Abilitata l'API è possibile creare il service account e scaricare il file con le credenziali
Abilitata l'API è possibile creare il service account e scaricare il file con le credenziali
Abilitata l'API è possibile creare il service account e scaricare il file con le credenziali
Abilitata l'API è possibile creare il service account e scaricare il file con le credenziali
Abilitata l'API è possibile creare il service account e scaricare il file con le credenziali
Abbiato tutto l'occorrente per implementare il nostro backend
Già adesso possiamo vedere il nostro progetto su "Funziona con google"
Attenzione l'account utilizzato sullo smartphone deve essere lo stesso utilizzato per la configurazione del progetto Google Home
Google Home mantiene l'elenco dei dispositivi, le loro caratteristiche ed il loro stato.
Esegue chiamate ReST verso l'endpoint della piattaforma per scoprire quali sono i dispositivi dell'utente ed il loro stato.
Mentre la nostra piattaforma fa chiamate ReST verso Google Home (HomeGraph) per aggiornare i dati in cloud sul cambio dello stato dei dispositivi o aggiunta/rimozioni dei dispositivi stessi.
| Da Google | Verso Google |
|---|---|
| SYNC QUERY EXECUTE DISCONNECT |
RequestSync ReportStateAndNotifications query sync delete |
1. Richiesta di SYNC
1. Richiesta di SYNC: Esempio di richiesta
{
"requestId": "9317802151529365959"
"inputs": [
{
"intent": "action.devices.SYNC"
}
],
}
1. Richiesta di SYNC: Esempio di risposta
{
"requestId": "13274642849947722297",
"payload": {
"agentUserId": "82f453bd-86f4-45f3-a0fa-0daf4af3e655",
"devices": [{
"id": "82f453l3d",
"type": "action.devices.types.SENSOR",
"traits": [
"action.devices.traits.SensorState"
],
"attributes": {
"sensorStatesSupported": [
{
"name": "CarbonMonoxideLevel",
"availableStates": [
"high",
"carbon monoxide detected",
"no carbon monoxide detected",
"unknown"
],
"numericCapabilities": {
"rawValueUnit": "PARTS_PER_MILLION"
}
}
]
},
"name": {
"defaultNames": [],
"name": "Sensori",
"nicknames": []
},
"willReportState": true,
"notificationSupportedByAgent": true,
"customData": {}
},{
"id": "82f453l3",
"type": "action.devices.types.LIGHT",
"traits": [
"action.devices.traits.Brightness",
"action.devices.traits.Modes",
"action.devices.traits.OnOff",
"action.devices.traits.ColorSetting"
],
"attributes": {
"commandOnlyBrightness": false,
"commandOnlyModes": false,
"queryOnlyModes": false,
"availableModes": [
{
"name": "mode",
"ordered": false,
"name_values": [
{
"lang": "it",
"name_synonym": [
"Modalità"
]
},
{
"lang": "en",
"name_synonym": [
"Mode"
]
}
],
"settings": [
{
"setting_name": "fix",
"setting_values": [
{
"lang": "it",
"setting_synonym": [
"Fisso"
]
},
{
"lang": "en",
"setting_synonym": [
"Fix",
"Fixed"
]
}
]
},
{
"setting_name": "snake",
"setting_values": [
{
"lang": "it",
"setting_synonym": [
"Serpente"
]
},
{
"lang": "en",
"setting_synonym": [
"Snake"
]
}
]
},
{
"setting_name": "arlecchino",
"setting_values": [
{
"lang": "it",
"setting_synonym": [
"Arlecchino"
]
},
{
"lang": "en",
"setting_synonym": [
"Arlecchino"
]
}
]
},
{
"setting_name": "rainbow",
"setting_values": [
{
"lang": "it",
"setting_synonym": [
"Arcobaleno"
]
},
{
"lang": "en",
"setting_synonym": [
"Rainbow"
]
}
]
}
]
}
],
"commandOnlyOnOff": false,
"queryOnlyOnOff": false,
"commandOnlyColorSetting": false,
"colorModel": "rgb",
"colorTemperatureRange": {
"temperatureMinK": 3000,
"temperatureMaxK": 9000
}
},
"name": {
"defaultNames": [],
"name": "Lampada",
"nicknames": []
},
"willReportState": true,
"customData": {}
},
{
"id": "82f453l3b",
"type": "action.devices.types.GARAGE",
"traits": [
"action.devices.traits.OpenClose"
],
"attributes": {
"discreteOnlyOpenClose": true,
"commandOnlyOpenClose": false,
"queryOnlyOpenClose": false,
"openDirection": []
},
"name": {
"defaultNames": [],
"name": "Garage",
"nicknames": []
},
"willReportState": true,
"customData": {}
}
]
}
}
Come viene descritto un dispositivo:
Google fornisce un tool per validare la risposta alla SYNC, disponibile all'indirizzo https://developers.home.google.com/cloud-to-cloud/tools/sync-data-validator.
Con la SYNC viene sincronizzato l'elenco dei dispositivi e le loro caratteristiche, per mandetere aggiornato lo stato vengono utilizzate due chiamate HTTP:
1. Richiesta di QUERY
2. Richiesta di QUERY: Esempio di richiesta
{
"requestId": "22666971838881680",
"inputs": [
{
"intent": "action.devices.QUERY",
"payload": {
"devices": [
{
"customData": {},
"id": "82f453l3d"
},
{
"customData": {},
"id": "82f453l3"
},
{
"customData": {},
"id": "82f453l3b"
}
]
}
}
]
}
2. Richiesta di QUERY: Esempio di risposta
{
"requestId": "22666971838881680",
"payload": {
"devices": {
"82f453l3": {
"online": true,
"status": "SUCCESS",
"currentModeSettings": {"mode":"rainbow"},
"color": { "spectrumRgb": 65280 },
"on": false,
"brightness": 10
},
"82f453l3d": {
"online": true,
"status": "SUCCESS",
"currentSensorStateData": [
{
"alarmState": "IDLE",
"alarmSilenceState": "ALLOWED",
"rawValue": 0,
"name": "CarbonMonoxideLevel",
"currentSensorState": "no carbon monoxide detected"
}
]
},
"82f453l3b": {
"online": true,
"status": "SUCCESS",
"openPercent": 0
}
}
}
}
2. Risposta a QUERY
Stato del dispositivo:
Stato del dispositivo (relativi ad i trait implementati):
Richiesta di reportStateAndNotification
Richiesta di reportStateAndNotification: Esempio di richiesta con aggiornamento di Stato
{
"agentUserId": "82f453bd-86f4-45f3-a0fa-0daf4af3e655",
"requestId": "93348d98-3ca5-4eb5-b61b-4f76b8796e0c",
"payload": {
"devices": {
"states": {
"82f453l3": {
"currentModeSettings": {"mode": "rainbow"},
"online": true
}
}
}
}
}
3. Richiesta di EXECUTE
3. Richiesta di EXECUTE: Esempio di richiesta
{
"requestId": "10035348206248233836",
"inputs": [ {
"context": {
"locale_country": "US",
"locale_language": "en"
},
"intent": "action.devices.EXECUTE",
"payload": {
"commands": [ {
"devices": [ {
"customData": {},
"id": "82f453l3"
} ],
"execution": [ {
"command": "action.devices.commands.OnOff",
"params": { "on": true }
}]
}
]
}
}
]
}
3. Richiesta di EXECUTE: Esempio di risposta
{
"requestId": "10035348206248233836",
"payload": {
"commands": [ {
"ids": [ "82f453l3"],
"status": "SUCCESS",
"states": {
"online": true,
"on": false
}
} ]
}
}
3. Richiesta di EXECUTE: Esempio di risposta con EXCEPTIONS
{
"requestId": "18414852243113253962",
"payload": {
"commands": [ {
"ids": [ "82f453l3" ],
"status": "SUCCESS",
"states": {
"online": true,
"exceptionCode": "lowBattery",
"status": "EXCEPTIONS",
"brightness": 50,
"on": true
}
}
]
}
}
Richiesta di reportStateAndNotification: Proactive notifications
Per alcuni trait è possibile inviare una notifica a Google Home che che viene inoltrata ai dispositivi Google (solo da dispositivi Smart Speaker e Smart Display no sullo smartphone):
Richiesta di reportStateAndNotification: Esempio di richiesta con Proactive notifications
{
"agentUserId": "82f453bd-86f4-45f3-a0fa-0daf4af3e655",
"requestId": "6a80313d-738b-47ae-b856-b49dc3e410bd",
"eventId": "88d629eb-60d8-41c9-9699-53b1fd25c846",
"payload": {
"devices": {
"notifications": {
"82f453l3d": {
"SensorState": {
"name": "CarbonMonoxideLevel",
"currentSensorState": "high",
"priority": 0
}
}
},
"states": {
"82f453l3d": {
"online": true,
"currentSensorStateData": [ {
"alarmState": "ALARM",
"alarmSilenceState": "ALLOWED",
"rawValue": 1234.0,
"name": "CarbonMonoxideLevel",
"currentSensorState": "high" } ]
}
}
}
}
}
Richiesta di reportStateAndNotification: follow-up responses
Per alcuni trait è possibile inviare avanzamenti di stato a Google Home nel momento in cui si eseguono dei comandi:
4. Richiesta di DISCONNECT
Tipicamente i dispositivi in casa sono collegati ad un gateway, se questo gateway risulta offline oppure è in aggiornamento è possibile rispondere con un errore globale:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"errorCode": "deviceOffline",
"status" : "ERROR"
}
}
Come invitare utenti a provare il tuo dispositivo su Google Home.
Dall'account dell'inviato andare su Console Google Home, aprire il processo e proseguire accettando il test
La documentazione non è sempre esatta e completa.
Provare, provare, provare, provare, provare,
Home Graph Viewer è uno strumento fornito da Google per gli sviluppatori che consente di visualizzare e analizzare lo stato dei dispositivi collegati a Google Home attraverso l'API Home Graph. Questo strumento è particolarmente utile per il debug e la risoluzione dei problemi durante lo sviluppo di integrazioni con Google Home.
Il Smart Home SYNC Data Validator è uno strumento fornito da Google per gli sviluppatori che consente di convalidare i dati di sincronizzazione (SYNC) inviati al cloud di Google Home. Questo strumento aiuta gli sviluppatori a garantire che i dati dei dispositivi siano formattati correttamente e conformi alle specifiche richieste da Google Home.
Utilizzando il SYNC Data Validator, gli sviluppatori possono identificare e correggere eventuali errori nei dati di sincronizzazione prima di inviarli al cloud, migliorando così l'affidabilità e la compatibilità delle loro integrazioni con Google Home.
Google Home Playground è uno strumento interattivo fornito da Google per gli sviluppatori che consente di testare e sperimentare le funzionalità di Google Home e dell'Assistente Google in un ambiente simulato. Questo strumento è particolarmente utile per il debug e la risoluzione dei problemi durante lo sviluppo di integrazioni con Google Home.
Utilizzando Google Home Playground, gli sviluppatori possono simulare comandi vocali, interazioni con dispositivi intelligenti e scenari di utilizzo comuni per verificare il corretto funzionamento delle loro applicazioni e servizi prima di rilasciarli agli utenti finali.
La Google Home Extension for VS Code è un'estensione per l'editor di codice Visual Studio Code che fornisce agli sviluppatori strumenti e funzionalità specifiche per lo sviluppo di integrazioni con Google Home e l'Assistente Google. Questa estensione semplifica il processo di sviluppo, test e debug delle applicazioni e dei servizi destinati alla piattaforma Google Home.
Utilizzando la Google Home Extension for VS Code, gli sviluppatori possono accedere rapidamente alla documentazione, eseguire test automatizzati e gestire le configurazioni del progetto direttamente all'interno dell'editor, migliorando così l'efficienza e la produttività durante lo sviluppo.
La Google Home Test Suite (GHTS) è un insieme di strumenti e risorse forniti da Google per aiutare gli sviluppatori a testare e convalidare le loro integrazioni con Google Home e l'Assistente Google. La GHTS consente agli sviluppatori di eseguire test automatizzati e manuali per garantire che le loro applicazioni funzionino correttamente con la piattaforma Google Home.
La GHTS include una serie di test predefiniti che coprono vari aspetti dell'integrazione, come la gestione dei comandi vocali, la risposta dell'Assistente Google e l'interazione con i dispositivi intelligenti. Gli sviluppatori possono utilizzare questi test per identificare e risolvere eventuali problemi prima di rilasciare le loro applicazioni agli utenti finali.
La certificazione WWGH (Work With Google Home) è un programma di certificazione offerto da Google per gli sviluppatori e i produttori di dispositivi intelligenti che desiderano garantire la compatibilità e l'integrazione con la piattaforma Google Home. Ottenere la certificazione WWGH dimostra che un dispositivo o un'applicazione soddisfa gli standard di qualità e prestazioni stabiliti da Google per garantire un'esperienza utente ottimale.
Per ottenere la certificazione WWGH, gli sviluppatori devono sottoporre i loro dispositivi o applicazioni a una serie di test e valutazioni condotti da Google. Questi test coprono vari aspetti dell'integrazione, come la gestione dei comandi vocali, la risposta dell'Assistente Google e l'interazione con i dispositivi intelligenti.
L'App Flip è una funzionalità che consente agli utenti di fare l'account linking in maniera semplice e veloce, richiamando l'applicazione del vendor piuttosto che aprire una web view e chiedere l'autenticazione all'utente.
La verifica secondaria dell'utente è una funzionalità che consente a Google Home di riconoscere e autenticare più utenti all'interno della stessa abitazione. Questo è particolarmente utile in contesti familiari, dove diversi membri possono avere esigenze e preferenze diverse.
Questa funzionalità si basa sull'uso di tecnologie di riconoscimento vocale e di machine learning per identificare gli utenti in base alla loro voce e alle loro interazioni con il dispositivo. Le informazioni vocali vengono elaborate localmente e nel cloud per migliorare l'accuratezza del riconoscimento e garantire un'esperienza personalizzata per ogni utente.
Questa funzionalità è particolarmente utile in contesti familiari, dove diversi membri possono avere esigenze e preferenze diverse.
I Deep Link sono URL speciali che consentono agli utenti di accedere direttamente a specifiche funzionalità o contenuti all'interno di un'applicazione mobile o di un sito web. Nel contesto di Google Home, i Deep Link possono essere utilizzati per collegare rapidamente gli utenti a determinate azioni o impostazioni all'interno dell'app Google Home o di altre app compatibili.
Questa funzionalità migliora l'esperienza utente, consentendo agli utenti di accedere rapidamente alle funzionalità desiderate senza dover navigare manualmente attraverso l'app o il sito web.
Il Local Home SDK è un kit di sviluppo software fornito da Google che consente agli sviluppatori di creare applicazioni e servizi che possono interagire con i dispositivi intelligenti all'interno della rete locale dell'utente. Questo SDK consente agli sviluppatori di sfruttare le funzionalità dei dispositivi intelligenti senza dover fare affidamento esclusivamente sulla connessione cloud.
Utilizzando il Local Home SDK, gli sviluppatori possono creare esperienze più reattive e affidabili per gli utenti di Google Home, migliorando la velocità di risposta e riducendo la dipendenza dalla connettività Internet.
Questa funzionalità è particolarmente utile in contesti in cui la latenza della rete può influire negativamente sull'esperienza utente, come nel caso di comandi vocali o automazioni domestiche che richiedono una risposta immediata.
Analisi del backend di esempio disponibile qui.
Documentazione ufficiale Google Home: qui
Esempio di backend di integrazione: qui
Queste slide sono disponibili qui: