Gli eventi sono asincroni e vengono gestiti da Google Cloud Pub/Sub in un singolo argomento per Project. Gli eventi forniscono aggiornamenti per tutti i dispositivi e le strutture e la ricezione degli eventi è garantita finché il token di accesso non viene revocato dall'utente e i messaggi degli eventi non sono scaduti.
Attiva eventi
Gli eventi sono una funzionalità facoltativa dell'API SDM. Consulta Attivare gli eventi per scoprire come attivarli per il tuo Project.
Google Cloud Pub/Sub
Consulta la documentazione di Google Cloud Pub/Sub per scoprire di più sul funzionamento di Pub/Sub. In particolare:
- Scopri le nozioni di base di Pub/Sub con le guide pratiche.
- Scopri come funziona l'autenticazione.
- Scegli una libreria client fornita o scrivi la tua e utilizza le API REST/HTTP o gRPC.
Sottoscrizione agli eventi
Quando gli eventi sono attivati per il tuo Project, ti verrà fornito un argomento specifico per quell'ID Project , sotto forma di:
projects/sdm-prod/topics/enterprise-project-id
Per ricevere gli eventi, crea una sottoscrizione pull o push all'argomento, a seconda del caso d'uso. Sono supportate più iscrizioni all'argomento SDM. Per ulteriori informazioni, consulta la sezione Gestire gli abbonamenti.
Avvia eventi
Per avviare gli eventi per la prima volta dopo aver creato la sottoscrizione Pub/Sub, effettua una chiamata all'API
devices.list
come trigger una tantum. Gli eventi per tutte le strutture e i dispositivi verranno pubblicati dopo questa chiamata.
Per un esempio, consulta la pagina Autorizza nella Guida rapida.
Ordine degli eventi
Pub/Sub non garantisce la consegna ordinata degli eventi e l'ordine di ricezione degli eventi potrebbe non corrispondere all'ordine in cui si sono verificati. Utilizza il campo timestamp
per facilitare la riconciliazione dell'ordine degli eventi. Gli eventi possono anche arrivare singolarmente o combinati
in un unico messaggio di evento.
Per ulteriori informazioni, consulta la sezione Ordinare i messaggi.
ID utente
Se l'implementazione si basa sugli utenti (anziché sulla struttura o sul dispositivo), utilizza il campo userID
del payload dell'evento per correlare risorse ed eventi. Questo campo è un ID offuscato che rappresenta un utente specifico.
userID
è disponibile anche nell'intestazione della risposta HTTP di ogni chiamata API.
Eventi di relazione
Gli eventi di relazione rappresentano un aggiornamento relazionale per una risorsa. Ad esempio, quando un dispositivo viene aggiunto a una struttura o quando viene eliminato da una struttura.
Esistono tre tipi di eventi di relazione:
- CREATED
- ELIMINATO
- AGGIORNATA
Il payload di un evento di relazione è il seguente:
Payload
{ "eventId" : "fe7f839d-6fa6-45bb-894e-e30091b0bb06", "timestamp" : "2019-01-01T00:00:01Z", "relationUpdate" : { "type" : "CREATED", "subject" : "enterprises/project-id/structures/structure-id", "object" : "enterprises/project-id/devices/device-id" }, "userId": "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" }
In un evento di relazione, object
è la risorsa che ha attivato l'evento e subject
è la risorsa con cui object
ha ora una relazione. Nell'esempio precedente, un user ha concesso l'accesso a questo dispositivo specifico a un developere il dispositivo autorizzato del userè ora associato alla sua struttura autorizzata, che attiva l'evento.
Un subject
può essere solo una stanza o una struttura. Se a developer non ha
l'autorizzazione per visualizzare la struttura di user, subject
è sempre
vuoto.
Campi
Campo | Descrizione | Tipo di dati |
---|---|---|
eventId |
L'identificatore univoco dell'evento. | string Esempio: "d77dba23-91d4-4b2e-b44a-acffe1614a66" |
timestamp |
L'ora in cui si è verificato l'evento. | string Esempio: "2019-01-01T00:00:01Z" |
relationUpdate |
Un oggetto che fornisce informazioni dettagliate sull'aggiornamento della relazione. | object |
userId |
Un identificatore offuscato univoco che rappresenta l'utente. | string Esempio: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
Per ulteriori informazioni sui diversi tipi di eventi e sul loro funzionamento, consulta la sezione Eventi.
Esempi
I payload degli eventi sono diversi per ogni tipo di evento di relazione:
DATA/ORA CREAZIONE
Struttura creata
"relationUpdate" : { "type" : "CREATED", "subject" : "", "object" : "enterprises/project-id/structures/structure-id" }
Dispositivo creato
"relationUpdate" : { "type" : "CREATED", "subject" : "enterprises/project-id/structures/structure-id", "object" : "enterprises/project-id/devices/device-id" }
Dispositivo creato
"relationUpdate" : { "type" : "CREATED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
AGGIORNATA
Dispositivo spostato
"relationUpdate" : { "type" : "UPDATED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
ELIMINATO
Struttura eliminata
"relationUpdate" : { "type" : "DELETED", "subject" : "", "object" : "enterprises/project-id/structures/structure-id" }
Dispositivo eliminato
"relationUpdate" : { "type" : "DELETED", "subject" : "enterprises/project-id/structures/structure-id", "object" : "enterprises/project-id/devices/device-id" }
Dispositivo eliminato
"relationUpdate" : { "type" : "DELETED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
Gli eventi di relazione non vengono inviati quando:
- Una stanza viene eliminata
Eventi risorsa
Un evento della risorsa rappresenta un aggiornamento specifico per una risorsa. Può essere in risposta a una variazione del valore di un campo tratto, ad esempio la modifica della modalità di un termostato. Può anche rappresentare un'azione del dispositivo che non modifica un campo del tratto, ad esempio la pressione di un pulsante del dispositivo.
Un evento generato in risposta a una modifica del valore del campo del tratto contiene un oggetto traits
, simile a una chiamata GET del dispositivo:
Payload
{
"eventId" : "164cc0d5-2e47-4011-81be-d0f8e24e4dfa",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : {
"name" : "enterprises/project-id/devices/device-id",
"traits" : {
"sdm.devices.traits.ThermostatMode
" : {
"mode" : "COOL"
}
}
},
"userId": "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"resourceGroup" : [
"enterprises/project-id/devices/device-id"
]
}
Consulta la documentazione dei singoli tratti per comprendere il formato del payload per qualsiasi evento della risorsa di modifica del campo del tratto.
Un evento generato in risposta a un'azione del dispositivo che non modifica un campo del tratto ha anche un payload con un oggetto resourceUpdate
, ma con un oggetto events
anziché un oggetto traits
:
Payload
{ "eventId" : "283c3325-df63-4c77-a5cf-a432892c22d9",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion
" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "OaBUs9ajAiPhwrGCG5H-_Sb5ZX...", } } } "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"eventThreadId" : "d67cd3f7-86a7-425e-8bb3-462f92ec9f59",
"eventThreadState" : "STARTED",
"resourceGroup" : [ "enterprises/project-id/devices/device-id" ] }
Questi tipi di eventi delle risorse sono definiti in tratti specifici. Ad esempio, l'evento Movimento è definito nel tratto CameraMotion . Consulta la documentazione di ciascun tratto per comprendere il formato del payload per questi tipi di eventi della risorsa.
Campi
Campo | Descrizione | Tipo di dati |
---|---|---|
eventId |
L'identificatore univoco dell'evento. | string Esempio: "283c3325-df63-4c77-a5cf-a432892c22d9" |
timestamp |
L'ora in cui si è verificato l'evento. | string Esempio: "2019-01-01T00:00:01Z" |
resourceUpdate |
Un oggetto che fornisce informazioni dettagliate sull'aggiornamento della risorsa. | object |
userId |
Un identificatore offuscato univoco che rappresenta l'utente. | string Esempio: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
eventThreadId |
L'identificatore univoco del thread di eventi. | string Esempio: "d67cd3f7-86a7-425e-8bb3-462f92ec9f59" |
eventThreadState |
Lo stato del thread evento. | string Valori: "STARTED", "UPDATED", "ENDED" |
resourceGroup |
Un oggetto che indica le risorse che potrebbero avere aggiornamenti simili a questo evento. La risorsa dell'evento stesso (dall'oggetto resourceUpdate ) sarà sempre presente in questo oggetto. |
object |
Per ulteriori informazioni sui diversi tipi di eventi e sul loro funzionamento, consulta la sezione Eventi.
Notifiche aggiornabili
Le notifiche basate su eventi della risorsa possono essere implementate in un'app, ad esempio per Android o iOS. Per ridurre il numero di notifiche inviate, è possibile implementare una funzionalità chiamata notifiche aggiornabili, in cui le notifiche esistenti vengono aggiornate con nuove informazioni in base agli eventi successivi nello stesso thread di eventi.Alcuni eventi supportano le notifiche aggiornabili e sono contrassegnati come
Aggiornabile eventThreadId
nei relativi payload. Utilizza questo
campo per collegare singoli eventi al fine di aggiornare una notifica
esistente visualizzata per un utente.
Un thread di eventi non è uguale a una sessione di eventi. Il thread di eventi identifica uno stato aggiornato per un evento precedente nello stesso thread. La sessione di eventi identifica eventi distinti correlati tra loro e puoi avere più thread di eventi per una determinata sessione di eventi.
A scopo di notifica, i diversi tipi di eventi vengono raggruppati in thread diversi.
Questa logica di raggruppamento e temporizzazione dei thread è gestita da Google ed è soggetta a modifiche in qualsiasi momento. A developer dovrebbe aggiornare le notifiche in base ai thread e alle sessioni degli eventi forniti dall'API SDM.
Stato del thread
Gli eventi che supportano le notifiche aggiornabili hanno anche un campo eventThreadState
che indica lo stato del thread dell'evento in quel momento. Questo
campo ha i seguenti valori:
- INIZIATO: il primo evento in un thread di eventi.
- AGGIORNATO: un evento in un thread di eventi in corso. In un singolo thread possono essere presenti zero o più eventi con questo stato.
- ENDED: l'ultimo evento in un thread di eventi, che può essere un duplicato dell'ultimo evento UPDATED, a seconda del tipo di thread.
Questo campo può essere utilizzato per monitorare l'avanzamento di un thread di eventi e quando è terminato.
Filtro eventi
In alcuni casi, gli eventi rilevati da un dispositivo potrebbero essere esclusi dalla pubblicazione in un argomento Pub/Sub SDM. Questo comportamento è chiamato filtro degli eventi. Lo scopo del filtro degli eventi è evitare di pubblicare troppi messaggi di eventi simili in un breve periodo di tempo.
Ad esempio, un messaggio potrebbe essere pubblicato in un argomento SDM per un evento Motion iniziale. Gli altri messaggi per Motion successivi verranno esclusi dalla pubblicazione fino al termine di un determinato periodo di tempo. Una volta trascorso questo periodo di tempo, un messaggio di evento per quel tipo di evento potrebbe essere pubblicato di nuovo.
Nell'app Google Home (GHA), gli eventi sottoposti a filtrazione verranno comunque visualizzati nella cronologia eventi di user. Tuttavia, questi eventi non generano una notifica dell'app (anche se il tipo di notifica è attivo).
Ogni tipo di evento ha una propria logica di filtro degli eventi, definita da Google e soggetta a modifiche in qualsiasi momento. Questa logica di filtro degli eventi è indipendente dalla logica del thread e della sessione degli eventi.
Account di servizio
Gli account di servizio sono consigliati per gestire le iscrizioni e i messaggi di evento dell'API SDM. Un account di servizio viene utilizzato da un'applicazione o da una macchina virtuale, non da una persona, e ha una propria chiave account univoca.
L'autorizzazione tramite account di servizio per l'API Pub/Sub utilizza OAuth a due vie (2LO).
Nel flusso di autorizzazione 2LO:
- developer Richiedi un token di accesso utilizzando una chiave di servizio.
- developer utilizza il token di accesso con le chiamate all'API.
Per scoprire di più sulla verifica in due passaggi di Google e su come eseguire la configurazione, consulta Utilizzo di OAuth 2.0 per applicazioni da server a server.
Autorizzazione
L'account di servizio deve essere autorizzato per l'utilizzo con l'API Pub/Sub:
- Abilita l'API Cloud Pub/Sub in Google Cloud.
- Crea un account di servizio e una chiave dell'account di servizio come descritto in Creare un account di servizio. Ti consigliamo di assegnargli solo il ruolo Sottoscrittore Pub/Sub. Assicurati di scaricare la chiave dell'account di servizio sulla macchina che utilizzerà l'API Pub/Sub.
- Fornisci le tue credenziali di autenticazione (chiave dell'account di servizio) al codice dell'applicazione seguendo le istruzioni riportate nella pagina del passaggio precedente oppure ottieni un token di accesso manualmente utilizzando
oauth2l
, se vuoi testare rapidamente l'accesso all'API. - Utilizza le credenziali dell'account di servizio o il token di accesso con l'API
project.subscriptions
Pub/Sub per estrarre e confermare i messaggi.
oauth2l
Google oauth2l
è uno strumento a riga di comando per OAuth scritto in Go. Installalo per Mac o Linux utilizzando Go.
- Se non hai Go sul sistema, scaricalo e installalo prima.
- Una volta installato Go, installa
oauth2l
e aggiungine la posizione alla variabile di ambientePATH
:go install github.com/google/oauth2l@latest
export PATH=$PATH:~/go/bin
- Utilizza
oauth2l
per ottenere un token di accesso per l'API utilizzando gli ambiti OAuth appropriati: Ad esempio, se la chiave di servizio si trova inoauth2l fetch --credentials path-to-service-key.json --scope https://www.googleapis.com/auth/pubsub https://www.googleapis.com/auth/cloud-platform
~/myServiceKey-eb0a5f900ee3.json
:oauth2l fetch --credentials ~/myServiceKey-eb0a5f900ee3.json --scope https://www.googleapis.com/auth/pubsub https://www.googleapis.com/auth/cloud-platform
ya29.c.Elo4BmHXK5...
Per ulteriori informazioni sull'utilizzo, consulta il file README di oauth2l
.
Librerie client delle API di Google
Esistono diverse librerie client disponibili per le API di Google che utilizzano OAuth 2.0. Per ulteriori informazioni sul linguaggio scelto, consulta le librerie client delle API di Google.
Quando utilizzi queste librerie con Pub/Sub API, utilizza le seguenti stringhe di ambito:
https://www.googleapis.com/auth/pubsub https://www.googleapis.com/auth/cloud-platform
Errori
In relazione a questa guida, potrebbero essere restituiti i seguenti codici di errore:
Messaggio di errore | RPC | Risoluzione dei problemi |
---|---|---|
L'immagine della fotocamera non è più disponibile per il download. | DEADLINE_EXCEEDED |
Le immagini degli eventi scadono 30 secondi dopo la pubblicazione dell'evento. Assicurati di scaricare l'immagine prima della scadenza. |
L'ID evento non appartiene alla videocamera. | FAILED_PRECONDITION |
Utilizza il valore eventID corretto restituito dall'evento della videocamera. |
Consulta il riferimento ai codici di errore dell'API per un elenco completo dei codici di errore dell'API.