Gli eventi sono asincroni e vengono gestiti da Google Cloud Pub/Sub in un unico 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 illustrative.
- Scopri come funziona l'autenticazione.
- Scegli una libreria client fornita o scrivi la tua e utilizza le superfici API REST/HTTP o gRPC.
Sottoscrizione agli eventi
Prima di gennaio 2025, se gli eventi erano attivati per il tuo Project, ti sarebbe stato fornito un argomento specifico per l'ID Project , nel formato:
projects/gcp-project-name/subscriptions/topic-id
Per ricevere gli eventi, crea una sottoscrizione pull o push all'argomento, a seconda del tuo caso d'uso. Sono supportate più sottoscrizioni all'argomento SDM. Per ulteriori informazioni, consulta la sezione Gestione degli abbonamenti.
Eventi di avvio
Per avviare gli eventi per la prima volta dopo la creazione della sottoscrizione Pub/Sub, effettua una chiamata API
devices.list
come trigger una tantum. Gli eventi per tutte le strutture e tutti i dispositivi verranno pubblicati dopo questa
chiamata.
Per un esempio, consulta la pagina Autorizza della guida rapida.
Ordine dell'evento
Pub/Sub non garantisce la distribuzione ordinata degli eventi e l'ordine di ricezione degli eventi potrebbe non corrispondere all'ordine in cui si sono verificati effettivamente. Utilizza il campo timestamp
per facilitare la riconciliazione dell'ordine degli eventi. Gli eventi possono arrivare anche singolarmente o combinati
in un unico messaggio di evento.
Per ulteriori informazioni, consulta la sezione Ordinamento dei messaggi.
ID utente
Se la tua 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 casa o quando viene eliminato da una casa.
Esistono tre tipi di eventi di relazione:
- CREATO
- ELIMINATO
- AGGIORNATA
Il payload per un evento di relazione è il seguente:
Payload
{ "eventId" : "16245c56-b797-4366-a1d3-296567ff2ce9", "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 correlato alla sua struttura autorizzata, il che attiva l'evento.
Un subject
può essere solo una stanza o una struttura. Se a developer non dispone
dell'autorizzazione per visualizzare la struttura di user, subject
è sempre
vuoto.
Campi
Campo | Descrizione | Tipo di dati |
---|---|---|
eventId |
L'identificatore univoco dell'evento. | string Esempio: "1d016894-4c19-4e2e-909c-b57e565cdfa0" |
timestamp |
L'ora in cui si è verificato l'evento. | string Esempio: "2019-01-01T00:00:01Z" |
relationUpdate |
Un oggetto che descrive in dettaglio le informazioni sull'aggiornamento della relazione. | object |
userId |
Un identificatore univoco e offuscato che rappresenta l'utente. | string Esempio: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
Consulta la sezione Eventi per ulteriori informazioni sui diversi tipi di eventi e sul loro funzionamento.
Esempi
I payload degli eventi variano in base al 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:
- Eliminazione di una stanza
Eventi risorsa
Un evento di risorsa rappresenta un aggiornamento specifico per una risorsa. Può essere in risposta a una modifica del valore di un campo caratteristica, ad esempio la modifica della modalità di un termostato. Può anche rappresentare un'azione del dispositivo che non modifica un campo caratteristica, ad esempio la pressione di un pulsante del dispositivo.
Un evento generato in risposta a una modifica del valore del campo caratteristica contiene un
oggetto traits
, simile a una chiamata GET del dispositivo:
Payload
{
"eventId" : "31ca9e5f-55da-4b64-8bc6-d897f2e40eec",
"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"
]
}
Utilizza la documentazione sui singoli tratti per comprendere il formato del payload per qualsiasi evento di risorsa di modifica del campo del tratto.
Un evento generato in risposta a un'azione del dispositivo che non modifica un campo caratteristica ha anche un
payload con un oggetto resourceUpdate
, ma con un oggetto events
anziché un oggetto traits
:
Payload
{ "eventId" : "c3433840-6c60-42be-a91e-29ad60fccbc8",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion
" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "63701AeRl44gcCbvqKswOubVn6...", } } } "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"eventThreadId" : "d67cd3f7-86a7-425e-8bb3-462f92ec9f59",
"eventThreadState" : "STARTED",
"resourceGroup" : [ "enterprises/project-id/devices/device-id" ] }
Questi tipi di eventi di risorse sono definiti in tratti specifici. Ad esempio, l'evento Movimento è definito nel tratto CameraMotion . Consulta la documentazione di ogni caratteristica per comprendere il formato del payload per questi tipi di eventi risorsa.
Campi
Campo | Descrizione | Tipo di dati |
---|---|---|
eventId |
L'identificatore univoco dell'evento. | string Esempio: "c3433840-6c60-42be-a91e-29ad60fccbc8" |
timestamp |
L'ora in cui si è verificato l'evento. | string Esempio: "2019-01-01T00:00:01Z" |
resourceUpdate |
Un oggetto che descrive in dettaglio le informazioni sull'aggiornamento della risorsa. | object |
userId |
Un identificatore univoco e offuscato che rappresenta l'utente. | string Esempio: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
eventThreadId |
L'identificatore univoco del thread dell'evento. | string Esempio: "d67cd3f7-86a7-425e-8bb3-462f92ec9f59" |
eventThreadState |
Lo stato del thread dell'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 |
Consulta la sezione Eventi per ulteriori informazioni sui diversi tipi di eventi e sul loro funzionamento.
Notifiche aggiornabili
Le notifiche basate sugli eventi delle risorse possono essere implementate in un'app, ad esempio per Android o iOS. Per ridurre il numero di notifiche inviate, potrebbe essere implementata 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.Seleziona il supporto della funzionalità degli eventi per le notifiche aggiornabili e contrassegnate come
Aggiornabile eventThreadId
nei payload. Utilizza questo
campo per collegare i singoli eventi allo scopo di aggiornare una notifica
esistente visualizzata per un utente.
Un thread di eventi non è la stessa cosa di una sessione di eventi. Il thread di eventi identifica uno stato aggiornato per un evento precedente nello stesso thread. La sessione evento identifica eventi separati correlati tra loro e possono esistere più thread di eventi per una determinata sessione evento.
Ai fini delle notifiche, 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 deve 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 di un thread di eventi.
- AGGIORNATO: un evento in un thread di eventi in corso. In un singolo thread possono esserci zero o più eventi con questo stato.
- ENDED (TERMINATO): l'ultimo evento in un thread di eventi, che potrebbe essere un duplicato dell'ultimo evento UPDATED (AGGIORNATO), 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 filtrati 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 può essere pubblicato in un argomento SDM per un evento di movimento iniziale. Gli altri messaggi per Motion verranno filtrati dalla pubblicazione fino al termine di un periodo di tempo prestabilito. Trascorso questo periodo di tempo, è possibile pubblicare nuovamente un messaggio di evento per quel tipo di evento.
Nell'app Google Home, gli eventi filtrati verranno comunque visualizzati nella cronologia eventi di user. Tuttavia, questi eventi non generano una notifica dell'app (anche se questo tipo di notifica è abilitato).
Ogni tipo di evento ha una propria logica di filtraggio, definita da Google e soggetta a modifiche in qualsiasi momento. Questa logica di filtraggio degli eventi è indipendente dalla logica dei thread e delle sessioni degli eventi.
Account di servizio
I service account sono consigliati per la gestione degli abbonamenti all'API SDM e dei messaggi di eventi. Un service account viene utilizzato da un'applicazione o da una macchina virtuale, non da una persona, e ha una propria chiave dell'account univoca.
L'autorizzazione tramite service account per l'API Pub/Sub utilizza OAuth a due vie (2LO).
Nel flusso di autorizzazione 2LO:
- developer richiede un token di accesso utilizzando una chiave di servizio.
- developer utilizza il token di accesso con le chiamate all'API.
Per saperne di più su Google 2LO e su come configurarlo, consulta l'articolo Utilizzo di OAuth 2.0 per applicazioni da server a server.
Autorizzazione
Il service account deve essere autorizzato per l'utilizzo con l'API Pub/Sub:
- Abilita l'API Cloud Pub/Sub in Google Cloud.
- Crea un service account e una chiave del service account come descritto in Creazione di un service account. Ti consigliamo di assegnare solo il ruolo Sottoscrittore Pub/Sub. Assicurati di scaricare la chiave del service account sulla macchina che utilizzerà l'API Pub/Sub.
- Fornisci le credenziali di autenticazione (chiave del service account) 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 del service account o il token di accesso con l'API
Pub/Sub
project.subscriptions
per eseguire il pull 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 aggiungi la sua 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
Sono disponibili diverse librerie client per le API di Google che utilizzano OAuth 2.0. Per saperne di più sulla lingua che preferisci, consulta 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 videocamera 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 eventID corretto restituito dall'evento della videocamera. |
Consulta i riferimenti ai codici di errore dell'API per l'elenco completo dei codici di errore dell'API.