Eventi

Gli eventi sono asincroni e gestiti da Google Cloud Pub/Sub, in un unico argomento Project. Gli eventi forniscono aggiornamenti per tutti i dispositivi e le strutture; inoltre, la ricezione degli eventi è garantito purché il token di accesso non venga revocato dall'utente e i messaggi di evento non siano stati scaduto.

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

Per scoprire di più, consulta la documentazione di Google Cloud Pub/Sub di più su come funziona Pub/Sub. In particolare:

Iscrizione all'evento

Quando gli eventi sono abilitati per Project, ti verrà fornito un argomento specifico Project ID, che assume la connotazione di:

projects/sdm-prod/topics/enterprise-project-id

Per ricevere eventi, crea un comando pull o push dell'abbonamento in questione, a seconda del tuo caso d'uso. Sono supportate più sottoscrizioni all'argomento SDM. Consulta Gestione degli abbonamenti per ulteriori informazioni informazioni.

Avvia eventi

Per avviare eventi per la prima volta dopo la creazione della sottoscrizione Pub/Sub, crea una devices.list chiamata API come trigger una tantum. Gli eventi per tutte le strutture e i dispositivi verranno pubblicati dopo questa data chiama.

Per un esempio, vedi Pagina Autorizza nella Guida rapida Guida.

Ordine evento

Pub/Sub non garantisce la consegna ordinata degli eventi e l'ordine di ricezione degli eventi potrebbe non corrispondono all'ordine in cui gli eventi si sono effettivamente verificati. Usa timestamp per facilitare la riconciliazione dell'ordine degli eventi. Gli eventi possono arrivare anche singolarmente o in combinazione in un singolo messaggio di evento.

Per ulteriori informazioni, vedi Ordinare i messaggi.

ID utente

Se la tua implementazione si basa sugli utenti (piuttosto che sulla struttura o sul dispositivo), utilizza 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 di una risorsa. Ad esempio, quando un dispositivo viene aggiunte a una struttura o quando un dispositivo viene eliminato da una struttura.

Esistono tre tipi di eventi di relazione:

  • DATA/ORA CREAZIONE
  • ELIMINATO
  • AGGIORNATA

Il payload per un evento di relazione è il seguente:

Payload

{
  "eventId" : "f90aac0b-3637-4681-aac0-18f3be6f0892",
  "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 ora object ha una relazione. Nella esempio precedente, user ha concesso l'accesso a questo dispositivo specifico a un developere il dispositivo autorizzato di userora è correlato alla sua autorizzazione che attiva l'evento.

Un subject può essere solo una stanza o una struttura. Se a developer non presenta per visualizzare la struttura di user, subject è sempre vuoto.

Campi

Campo Descrizione Tipo di dati
eventId L'identificatore univoco dell'evento. string
Esempio: "ed4cd8c3-eb6c-41bb-81be-30379cc713a5"
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 offuscato che rappresenta l'utente. string
Esempio: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi"

Consulta la sezione Eventi per ulteriori informazioni sulle diverse tipi di eventi e come funzionano.

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 se:

  • Una stanza è stata eliminata

Eventi risorsa

Un evento di risorsa rappresenta un aggiornamento specifico di una risorsa. Può essere in risposta a un cambiamento nel valore di un campo trait, ad esempio la modifica della modalità di un termostato. Può anche rappresentare un'azione dei dispositivi che non modifica un campo trait, ad esempio premendo un pulsante di un dispositivo.

Un evento generato in risposta a una modifica nel valore del campo trait contiene un Oggetto traits, simile a una chiamata GET del dispositivo:

Payload

{
  "eventId" : "840d511c-bc6f-429f-8e81-36ec258ab0c0",
  "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 singoli trait per comprendere il formato del payload per qualsiasi risorsa di modifica dei campi dei trait. .

Un evento generato in risposta a un'azione del dispositivo che non modifica un campo trait ha anche un Payload con un oggetto resourceUpdate, ma con un oggetto events anziché un oggetto traits:

Payload

{
  "eventId" : "ed21b6b0-791f-46ab-bac1-868c78020b5f",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "SERtdqmTk0FDDDP_M9NE-H-bY9...", } } } "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 di movimento è definito nel CameraMotion trait. Visualizza la documentazione di ogni trait per comprendere il formato del payload per questi tipi di eventi delle risorse.

Campi

Campo Descrizione Tipo di dati
eventId L'identificatore univoco dell'evento. string
Esempio: "ed21b6b0-791f-46ab-bac1-868c78020b5f"
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 univoco offuscato 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 dell'evento. string
Valori: "STARTED", "UPDATED", "ENDED"
resourceGroup Un oggetto che indica 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 sulle diverse tipi di eventi e come funzionano.

Notifiche aggiornabili

Le notifiche basate sugli eventi relativi alle risorse possono essere implementate in un'app, ad esempio per Android o iOS. Per ridurre il numero di notifiche inviate, è stata attivata una funzione chiamata Potrebbero essere implementate notifiche aggiornabili, nel caso in cui le notifiche esistenti vengono aggiornati con nuove informazioni in base agli eventi successivi nello stesso evento .

Gli eventi selezionati supportano le notifiche aggiornabili e sono contrassegnati come Aggiornabile  nella documentazione. Questi eventi hanno un campo aggiuntivo chiamato eventThreadId nei loro payload. Usa questa per collegare i singoli eventi allo scopo di aggiornare uno esistente che viene mostrata a un utente.

Un thread di un evento non è uguale a una sessione di evento. Il thread dell'evento. identifica uno stato aggiornato per un evento precedente nello stesso thread. La sessione evento identifica eventi separati che sono correlati tra loro; e possono esserci più thread di eventi per una determinata sessione evento.

Ai fini delle notifiche, i diversi tipi di eventi vengono raggruppati in thread.

Questa logica di raggruppamento dei thread e di temporizzazione è gestita da Google ed è soggetta alle possono essere modificate in qualsiasi momento. developer deve aggiornare le notifiche in base sessioni e thread di eventi forniti dall'API SDM.

Stato del thread

Gli eventi che supportano le notifiche aggiornabili hanno anche un eventThreadState che indica lo stato del thread di eventi in quel momento. Questo ha i seguenti valori:

  • AVVIATO: il primo evento nel thread di un evento.
  • AGGIORNATO: un evento in un thread di eventi in corso. In un singolo thread possono esistere zero o più eventi con questo stato.
  • ENDED: l'ultimo evento in un thread di eventi, che potrebbe 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 degli 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 eventi è evitare Pubblicazione di troppi messaggi di evento simili in un breve periodo di tempo.

Ad esempio, un messaggio potrebbe essere pubblicato in un argomento SDM per un evento Movimento iniziale. Altro i messaggi per Motion, dopodiché saranno esclusi dalla pubblicazione finché non passa un determinato periodo di tempo. Una volta trascorso questo periodo, di tempo, un messaggio per quel tipo di evento potrebbe essere pubblicato di nuovo.

Nell'app Google Home (GHA), gli eventi che sono stati i filtri applicati continueranno a essere visualizzati nella panoramica eventi di user. Tuttavia, tali eventi non generano una notifica dell'app (anche se quel tipo di notifica è attivata).

Ogni tipo di evento ha una propria logica di filtro, definita Google e soggetti a modifiche in qualsiasi momento. Questa logica di filtro degli eventi indipendenti dal thread di eventi e dalla logica di sessione.

Account di servizio

Gli account di servizio sono consigliati per gestire l'API SDM sottoscrizioni e messaggi di evento. Un account di servizio è utilizzato da un'applicazione macchina virtuale, non una persona, e ha una propria chiave di account univoca.

Autorizzazione dell'account di servizio per gli utilizzi dell'API Pub/Sub 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 scoprire di più su Google 2LO e su come configurarlo, consulta Utilizzo di OAuth 2.0 per le versioni da server a server Applicazioni.

Autorizzazione

L'account di servizio deve essere autorizzato a essere utilizzato con API Pub/Sub:

  1. Abilita Cloud Pub/Sub API in Google Cloud.
  2. Crea un account di servizio e una chiave dell'account di servizio come descritto in Creazione di un account di servizio. Ti consigliamo di assegnargli solo il ruolo Sottoscrittore Pub/Sub. Assicurati di scarica la chiave dell'account di servizio nella macchina che utilizzerà l'API Pub/Sub.
  3. Fornisci le credenziali di autenticazione (chiave dell'account di servizio) al tuo seguire le istruzioni riportate nella pagina o ricevere un token di accesso manualmente utilizzando oauth2l, se vuoi testare rapidamente l'accesso all'API.
  4. Utilizza le credenziali dell'account di servizio o il token di accesso con Pub/Sub project.subscriptions API eseguire il pull e confermare i messaggi.

oauth2l

Google oauth2l è uno strumento a riga di comando per OAuth scritto in Go. Installa per Mac o Linux utilizzando Go.

  1. Se non disponi di Go sul sistema, scaricalo e installalo.
  2. Dopo aver installato Go, installa oauth2l e aggiungi la relativa posizione su PATH variabile di ambiente:
    go install github.com/google/oauth2l@latest
    export PATH=$PATH:~/go/bin
  3. Utilizza oauth2l per ottenere un token di accesso per l'API, utilizzando l'appropriata Ambiti OAuth:
    oauth2l fetch --credentials path-to-service-key.json --scope https://www.googleapis.com/auth/pubsub
    https://www.googleapis.com/auth/cloud-platform
    Ad esempio, se la chiave di servizio si trova in ~/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...

Consulta il oauth2l README per ulteriori informazioni sull'utilizzo informazioni.

Librerie client delle API di Google

Sono disponibili diverse librerie client per le API di Google che utilizzano OAuth 2,0. Consulta le librerie client delle API di Google per ulteriori informazioni sul nella lingua che preferisci.

Quando utilizzi queste librerie con Pub/Sub API, usa le seguenti stringhe di ambito:

https://www.googleapis.com/auth/pubsub
https://www.googleapis.com/auth/cloud-platform

Errori

Potrebbero essere restituiti i seguenti codici di errore in relazione a questa guida:

Messaggio di errore RPC Risoluzione dei problemi
L'immagine della fotocamera non è più disponibile per il download. DEADLINE_EXCEEDED Le immagini dell'evento 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 la documentazione sul codice di errore API per l'elenco completo dei codici di errore dell'API.