Di Home API, pengamatan perubahan status di rumah dapat dilakukan
melalui penggunaan alur
di Kotlin. Mengamati perubahan pada struktur, ruangan, metadata perangkat, dan
status perangkat di Home API dapat dilakukan dengan API apa pun yang mewarisi dari
antarmuka
HomeObjectsFlow
. Hal ini dilakukan dengan
mengumpulkan dari alur. Lihat Memperkenalkan Alur
untuk mengetahui informasi selengkapnya tentang alur.
Saat item dalam koleksi ditambahkan, dihapus, atau diubah, snapshot terbaru koleksi akan ditampilkan.
Developer dapat menyimpulkan perubahan tertentu dengan membandingkan
snapshot ini dengan salinan yang lebih lama. Kolom id
yang disediakan untuk setiap jenis objek
induk di Home API dapat digunakan untuk
tujuan ini.
Cara menggunakan alur
Mari kita lihat beberapa contoh dasar pengumpulan dari alur di Home API. Untuk
contoh berikut, instance Home
harus dibuat sebelum
mengakses koleksi di rumah:
val context = LocalContext.current
val homeManager = Home.getClient(context)
Melacak perubahan pada struktur
Perubahan berikut pada struktur memicu koleksi ini:
- Nama struktur
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
Melacak perubahan pada perangkat tertentu
Perubahan berikut pada perangkat memicu koleksi ini:
- Status konektivitas
- Nama perangkat
- Langganan Room
- Kumpulan karakteristik yang didukung
- Kumpulan jenis yang didukung
structure
.devices()
.map { devices -> device.filter { it.name == "Bedroom Lamp" }.single() }
.collect {
println("The bedroom lamp has changed!")
}
val device = structure.devices().list().firstOrNull { it.name == "Bedroom Lamp" }!!
Melacak perubahan pada karakteristik tertentu di perangkat
Gunakan karakteristik apa pun yang didukung oleh perangkat dan Home API. Untuk daftar lengkapnya, lihat
Trait
.
device.trait(OnOff).collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Melacak perubahan pada jenis tertentu di perangkat
Perubahan berikut pada jenis perangkat memicu pengumpulan ini:
- Perubahan pada setiap karakteristik dalam jenis perangkat yang dihasilkan
Gunakan jenis perangkat Matter apa pun yang didukung oleh Home API. Untuk
daftar lengkap, lihat DeviceType
.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Melacak perubahan pada ruang dalam struktur
Perubahan berikut pada ruang akan memicu koleksi ini:
Untuk melacak kapan perangkat ditambahkan atau dihapus dari ruangan, gunakan alur
devices()
.
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
Berlangganan peristiwa
Di Home API, peristiwa digunakan untuk mendeteksi perubahan status perangkat.
Untuk berlangganan peristiwa di perangkat tertentu, panggil salah satu dari tiga
HomeDevice
.Fungsi events
, yang masing-masing menampilkanFlow<Event>
:
events(event: EventFactory<T>)
menampilkan alur untuk jenis peristiwa tertentu:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
events(trait: TraitFactory<T>)
menampilkan alur semua peristiwa yang dikirim oleh suatu karakteristik:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
events()
menampilkan alur peristiwa yang tersedia untuk objek:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Untuk menggunakan peristiwa dari flow, gunakan fungsi flow.collect()
:
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}