Peristiwa bersifat asinkron dan dikelola oleh Google Cloud Pub/Sub, dalam satu topik per Project. Peristiwa memberikan info terbaru untuk semua perangkat dan struktur, serta penerimaan peristiwa dijamin selama token akses tidak dicabut oleh pengguna dan pesan peristiwa belum berakhir.
Aktifkan acara
Peristiwa adalah fitur opsional dari SDM API. Lihat Mengaktifkan peristiwa untuk mempelajari cara mengaktifkannya untuk Project.
Google Cloud Pub/Sub
Lihat dokumentasi Google Cloud Pub/Sub untuk mempelajari lebih lanjut cara kerja Pub/Sub. Khususnya:
- Pelajari dasar-dasar Pub/Sub dengan Panduan cara kerja.
- Pahami cara kerja Autentikasi.
- Pilih Library Klien yang disediakan atau tulis library Anda sendiri dan gunakan REST/HTTP atau gRPC API.
Langganan acara
Sebelum Januari 2025, jika peristiwa diaktifkan untuk Project, Anda akan diberi topik khusus untuk ID Project tersebut, dalam bentuk:
projects/gcp-project-name/subscriptions/topic-id
Untuk menerima peristiwa, buat langganan pull atau push ke topik tersebut, bergantung pada kasus penggunaan Anda. Beberapa langganan ke topik SDM didukung. Lihat Mengelola langganan untuk mengetahui informasi selengkapnya.
Memulai peristiwa
Untuk memulai peristiwa untuk pertama kalinya setelah langganan Pub/Sub dibuat, lakukan
panggilan API
devices.list
sebagai pemicu satu kali. Peristiwa untuk semua struktur dan perangkat akan dipublikasikan setelah panggilan ini.
Untuk mengetahui contohnya, lihat halaman Authorize di Panduan Memulai Cepat.
Urutan peristiwa
Pub/Sub tidak menjamin pengiriman peristiwa yang berurutan, dan urutan penerimaan peristiwa mungkin tidak sesuai dengan urutan terjadinya peristiwa yang sebenarnya. Gunakan kolom timestamp
untuk membantu rekonsiliasi urutan peristiwa. Peristiwa juga dapat tiba satu per satu atau digabungkan
ke dalam satu pesan peristiwa.
Untuk mengetahui informasi selengkapnya, lihat Mengurutkan pesan.
ID pengguna
Jika penerapan Anda didasarkan pada pengguna (bukan struktur atau perangkat), gunakan kolom
userID
dari payload peristiwa untuk mengorelasikan resource dan peristiwa. Kolom ini adalah
ID yang di-obfuscate yang mewakili pengguna tertentu.
userID
juga tersedia di header respons HTTP setiap panggilan API.
Peristiwa relasi
Peristiwa relasi mewakili pembaruan relasional untuk resource. Misalnya, saat perangkat ditambahkan ke struktur, atau saat perangkat dihapus dari struktur.
Ada tiga jenis peristiwa hubungan:
- DIBUAT
- DIHAPUS
- DIPERBARUI
Payload untuk peristiwa hubungan adalah sebagai berikut:
Payload
{ "eventId" : "81688b62-4f69-432f-bbe0-5270032f5466", "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" }
Dalam peristiwa relasi, object
adalah resource yang memicu peristiwa dan
subject
adalah resource yang kini memiliki relasi dengan object
. Dalam
contoh di atas, user telah memberikan akses ke perangkat spesifik ini kepada
developer, dan perangkat resmi userkini terkait dengan struktur resminya, yang memicu peristiwa.
subject
hanya dapat berupa ruang atau struktur. Jika a developer tidak memiliki
izin untuk melihat struktur user, subject
akan selalu
kosong.
Kolom
Kolom | Deskripsi | Jenis Data |
---|---|---|
eventId |
ID unik untuk peristiwa. | string Contoh: "4ec221c5-4cbc-4fd5-ae2e-6eebd1311876" |
timestamp |
Waktu saat peristiwa terjadi. | string Contoh: "2019-01-01T00:00:01Z" |
relationUpdate |
Objek yang menjelaskan informasi tentang pembaruan relasi. | object |
userId |
ID unik yang di-obfuscate yang mewakili pengguna. | string Contoh: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
Lihat Peristiwa untuk mengetahui informasi selengkapnya tentang berbagai jenis peristiwa dan cara kerjanya.
Contoh
Payload peristiwa berbeda untuk setiap jenis peristiwa relasi:
DIBUAT
Struktur dibuat
"relationUpdate" : { "type" : "CREATED", "subject" : "", "object" : "enterprises/project-id/structures/structure-id" }
Perangkat dibuat
"relationUpdate" : { "type" : "CREATED", "subject" : "enterprises/project-id/structures/structure-id", "object" : "enterprises/project-id/devices/device-id" }
Perangkat dibuat
"relationUpdate" : { "type" : "CREATED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
DIPERBARUI
Perangkat dipindahkan
"relationUpdate" : { "type" : "UPDATED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
DIHAPUS
Struktur dihapus
"relationUpdate" : { "type" : "DELETED", "subject" : "", "object" : "enterprises/project-id/structures/structure-id" }
Perangkat dihapus
"relationUpdate" : { "type" : "DELETED", "subject" : "enterprises/project-id/structures/structure-id", "object" : "enterprises/project-id/devices/device-id" }
Perangkat dihapus
"relationUpdate" : { "type" : "DELETED", "subject" : "enterprises/project-id/structures/structure-id/rooms/room-id", "object" : "enterprises/project-id/devices/device-id" }
Peristiwa hubungan tidak dikirim saat:
- Ruang dihapus
Peristiwa resource
Peristiwa resource mewakili pembaruan khusus untuk resource. Hal ini dapat dilakukan sebagai respons terhadap perubahan nilai kolom karakteristik, seperti mengubah mode termostat. Tindakan ini juga dapat merepresentasikan tindakan perangkat yang tidak mengubah kolom karakteristik seperti menekan tombol perangkat.
Peristiwa yang dihasilkan sebagai respons terhadap perubahan nilai kolom trait berisi objek
traits
, mirip dengan panggilan GET perangkat:
Payload
{
"eventId" : "b5a3cb32-3ca8-4b0b-9510-c6a9e70f00f4",
"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"
]
}
Gunakan dokumentasi trait individual untuk memahami format payload untuk peristiwa perubahan kolom trait individual.
Peristiwa yang dihasilkan sebagai respons terhadap tindakan perangkat yang tidak mengubah kolom karakteristik juga memiliki
payload dengan objek resourceUpdate
, tetapi dengan objek events
bukan objek traits
:
Payload
{ "eventId" : "803821e5-2626-41d5-8ea2-04b6fdb88f8c",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion
" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "HEQiFiTuneH7NJVZ-kHxnbZyU9...", } } } "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"eventThreadId" : "d67cd3f7-86a7-425e-8bb3-462f92ec9f59",
"eventThreadState" : "STARTED",
"resourceGroup" : [ "enterprises/project-id/devices/device-id" ] }
Jenis peristiwa resource ini ditentukan dalam trait tertentu. Misalnya, Peristiwa gerakan ditentukan dalam trait CameraMotion . Lihat dokumentasi setiap trait untuk memahami format payload untuk jenis peristiwa resource ini.
Kolom
Kolom | Deskripsi | Jenis Data |
---|---|---|
eventId |
ID unik untuk peristiwa. | string Contoh: "803821e5-2626-41d5-8ea2-04b6fdb88f8c" |
timestamp |
Waktu saat peristiwa terjadi. | string Contoh: "2019-01-01T00:00:01Z" |
resourceUpdate |
Objek yang menjelaskan informasi tentang pembaruan resource. | object |
userId |
ID unik yang di-obfuscate yang mewakili pengguna. | string Contoh: "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi" |
eventThreadId |
ID unik untuk rangkaian pesan acara. | string Contoh: "d67cd3f7-86a7-425e-8bb3-462f92ec9f59" |
eventThreadState |
Status rangkaian pesan acara. | string Nilai: "DIMULAI", "DIPERBARUI", "BERAKHIR" |
resourceGroup |
Objek yang menunjukkan resource yang mungkin memiliki pembaruan serupa dengan peristiwa ini. Resource peristiwa itu sendiri (dari objek resourceUpdate ) akan selalu ada dalam objek ini. |
object |
Lihat Peristiwa untuk mengetahui informasi selengkapnya tentang berbagai jenis peristiwa dan cara kerjanya.
Notifikasi yang dapat diupdate
Notifikasi berdasarkan peristiwa resource dapat diterapkan di aplikasi, seperti untuk Android atau iOS. Untuk mengurangi jumlah notifikasi yang dikirim, fitur yang disebut notifikasi yang dapat diupdate dapat diterapkan, dengan notifikasi yang ada diperbarui dengan informasi baru berdasarkan peristiwa berikutnya dalam rangkaian peristiwa yang sama.Fitur acara yang mendukung notifikasi yang dapat diperbarui dan diberi tag sebagai
Dapat Diperbarui eventThreadId
di payload-nya. Gunakan kolom ini untuk menautkan setiap peristiwa bersama-sama untuk tujuan memperbarui notifikasi yang ada yang telah ditampilkan kepada pengguna.
Thread acara tidak sama dengan sesi acara. Thread peristiwa mengidentifikasi status yang diperbarui untuk peristiwa sebelumnya dalam thread yang sama. Sesi peristiwa mengidentifikasi peristiwa terpisah yang saling terkait, dan dapat ada beberapa rangkaian peristiwa untuk sesi peristiwa tertentu.
Untuk tujuan notifikasi, berbagai jenis peristiwa dikelompokkan ke dalam berbagai rangkaian pesan.
Logika pengelompokan dan pengaturan waktu ini ditangani oleh Google dan dapat berubah kapan saja. A developer harus memperbarui notifikasi berdasarkan thread dan sesi peristiwa yang disediakan oleh SDM API.
Status thread
Peristiwa yang mendukung notifikasi yang dapat diupdate juga memiliki kolom eventThreadState
yang menunjukkan status thread peristiwa pada saat itu. Kolom
ini memiliki nilai berikut:
- DIMULAI — Peristiwa pertama dalam rangkaian peristiwa.
- DIPERBARUI — Acara dalam rangkaian acara berkelanjutan. Dalam satu thread, dapat ada nol atau lebih peristiwa dengan status ini.
- BERAKHIR — Peristiwa terakhir dalam rangkaian peristiwa, yang mungkin merupakan duplikat dari peristiwa TERBARU terakhir, bergantung pada jenis rangkaian.
Kolom ini dapat digunakan untuk melacak progres thread peristiwa dan kapan thread tersebut berakhir.
Pemfilteran peristiwa
Dalam beberapa kasus, peristiwa yang terdeteksi oleh perangkat dapat difilter agar tidak dipublikasikan ke topik Pub/Sub SDM. Perilaku ini disebut pemfilteran peristiwa. Tujuan pemfilteran peristiwa adalah untuk menghindari memublikasikan terlalu banyak pesan peristiwa serupa dalam waktu singkat.
Misalnya, pesan dapat dipublikasikan ke topik SDM untuk peristiwa Gerakan awal. Pesan lain untuk Motion setelah itu akan difilter agar tidak dipublikasikan hingga jangka waktu tertentu berlalu. Setelah jangka waktu tersebut berlalu, pesan peristiwa untuk jenis peristiwa tersebut dapat dipublikasikan lagi.
Di Aplikasi Google Home (GHA), peristiwa yang difilter akan tetap ditampilkan di histori peristiwa user. Namun, peristiwa tersebut tidak menghasilkan notifikasi aplikasi (meskipun jenis notifikasi tersebut diaktifkan).
Setiap jenis peristiwa memiliki logika pemfilteran peristiwanya sendiri, yang ditentukan oleh Google dan dapat berubah kapan saja. Logika pemfilteran peristiwa ini tidak bergantung pada logika sesi dan thread peristiwa.
Akun layanan
Akun layanan direkomendasikan untuk mengelola langganan SDM API dan pesan peristiwa. Akun layanan digunakan oleh aplikasi atau virtual machine, bukan orang, dan memiliki kunci akun uniknya sendiri.
Otorisasi akun layanan untuk Pub/Sub API menggunakan OAuth Dua Kaki (2LO).
Dalam alur otorisasi 2LO:
- developer meminta token akses menggunakan kunci layanan.
- developer menggunakan token akses dengan panggilan ke API.
Untuk mempelajari lebih lanjut 2LO Google dan cara penyiapannya, lihat Menggunakan OAuth 2.0 untuk Aplikasi Server ke Server.
Otorisasi
Akun layanan harus diberi otorisasi untuk digunakan dengan Pub/Sub API:
- Aktifkan Cloud Pub/Sub API di Google Cloud.
- Buat akun layanan dan kunci akun layanan seperti yang dijelaskan dalam Membuat akun layanan. Sebaiknya berikan hanya peran Pub/Sub Subscriber. Pastikan untuk mendownload kunci akun layanan ke komputer yang akan menggunakan Pub/Sub API.
- Berikan kredensial autentikasi Anda (kunci akun layanan) ke kode aplikasi Anda dengan mengikuti petunjuk di halaman pada langkah sebelumnya, atau dapatkan token akses secara manual menggunakan
oauth2l
, jika Anda ingin menguji akses API dengan cepat. - Gunakan kredensial akun layanan atau token akses dengan
Pub/Sub
project.subscriptions
API untuk menarik dan mengonfirmasi pesan.
oauth2l
Google oauth2l
adalah alat command line untuk OAuth yang ditulis dalam Go. Instal untuk Mac atau Linux menggunakan Go.
- Jika Anda belum memiliki Go di sistem Anda, download dan instal terlebih dahulu.
- Setelah Go diinstal, instal
oauth2l
dan tambahkan lokasinya ke variabel lingkunganPATH
Anda:go install github.com/google/oauth2l@latest
export PATH=$PATH:~/go/bin
- Gunakan
oauth2l
untuk mendapatkan token akses untuk API, menggunakan cakupan OAuth yang sesuai: Misalnya, jika kunci layanan Anda berada dioauth2l 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...
Lihat README oauth2l
untuk mengetahui informasi penggunaan selengkapnya.
Library Klien Google API
Ada beberapa library klien yang tersedia untuk Google API yang menggunakan OAuth 2.0. Lihat Library Klien Google API untuk mengetahui informasi selengkapnya tentang bahasa pilihan Anda.
Saat menggunakan library ini dengan Pub/Sub API, gunakan string cakupan berikut:
https://www.googleapis.com/auth/pubsub https://www.googleapis.com/auth/cloud-platform
Error
Kode error berikut dapat ditampilkan terkait dengan panduan ini:
Pesan Error | PPK | Pemecahan masalah |
---|---|---|
Gambar kamera tidak lagi tersedia untuk didownload. | DEADLINE_EXCEEDED |
Gambar acara akan berakhir 30 detik setelah acara dipublikasikan. Pastikan untuk mendownload gambar sebelum masa berlakunya berakhir. |
ID acara bukan milik kamera. | FAILED_PRECONDITION |
Gunakan eventID yang benar yang ditampilkan oleh peristiwa kamera. |
Lihat Referensi Kode Error API untuk mengetahui daftar lengkap kode error API.