Di Home API untuk Android, pengamatan perubahan status di rumah dapat dilakukan
melalui penggunaan
flow
di Kotlin. Mengamati perubahan pada struktur, ruangan, metadata perangkat, dan status perangkat di Home API dapat dilakukan dengan API apa pun yang diwarisi dari antarmuka HomeObjectsFlow
. Hal ini dilakukan dengan
mengumpulkan dari flow.
Saat item apa pun dalam koleksi ditambahkan, dihapus, atau diubah, snapshot terbaru koleksi akan ditampilkan.
Developer harus 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
Berikut adalah beberapa contoh dasar pengumpulan dari alur di Home API.
Untuk contoh berikut, instance Home
harus dibuat sebelum
mengakses koleksi di beranda:
val context = LocalContext.current
val homeManager = Home.getClient(context)
Melacak perubahan pada struktur
Perubahan berikut pada struktur memicu pengumpulan 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 pengumpulan ini:
- Status konektivitas
- Nama perangkat
- Keanggotaan Room
- Kumpulan trait 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 trait apa pun yang didukung oleh perangkat dan Home API. Untuk daftar lengkapnya, lihat
Trait
.
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.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 sifat apa pun 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 memicu pengumpulan 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
.events
fungsi, 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 aliran semua peristiwa yang dikirim oleh trait:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
events()
menampilkan aliran peristiwa yang tersedia untuk objek:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Untuk menggunakan peristiwa dari aliran, gunakan fungsi flow.collect()
:
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
Berlangganan peristiwa relasi entitas
Anda dapat memproses peristiwa yang dipancarkan setiap kali entitas (seperti
struktur, ruangan, perangkat, atau otomatisasi) ditambahkan, dihapus, atau diperbarui. Peristiwa ini adalah instance HomeObjectChangeEvent
dan membawa ID entitas yang berubah.
Untuk mendapatkan aliran yang menghasilkan peristiwa yang Anda inginkan, panggil metode
stream()
pada HomeObjectsFlow<T>
yang dihasilkan oleh metode Flow yang sesuai:
Entitas | Antarmuka | Metode Alur |
---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Misalnya, berikut cara menangani perubahan pada perangkat:
val devicesStream = home.devices().stream() // Collect and react to device changes. devicesStream.collect { deviceEvent -> when (deviceEvent) { is HomeObjectAddedEvent -> println("New device now available with id: ${deviceEvent.id}") is HomeObjectUpdatedEvent -> println("Device ${deviceEvent.id} has been updated") is HomeObjectRemovedEvent -> println("Device is removed from your account") else -> {} } }