Memantau status perangkat di Android

Di Home API untuk Android, pengamatan perubahan status di rumah dapat dilakukan melalui penggunaan aliran di Kotlin. Pengamatan perubahan dalam struktur, ruangan, metadata perangkat, dan status perangkat di Home API dapat dilakukan dengan API apa pun yang mewarisi dari HomeObjectsFlow antarmuka. Hal ini dilakukan dengan mengumpulkan dari aliran.

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 aliran

Berikut adalah beberapa contoh dasar pengumpulan dari aliran 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:

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 trait tertentu di perangkat

Gunakan trait apa pun yang didukung oleh perangkat dan Home API. Untuk daftar lengkap, 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 koleksi ini:

  • Perubahan pada trait 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 ruangan dalam struktur

Perubahan berikut pada ruangan memicu koleksi ini:

Untuk melacak kapan perangkat ditambahkan atau dihapus dari ruangan, gunakan devices() aliran.

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

  1. events(event: EventFactory<T>) menampilkan aliran untuk jenis peristiwa tertentu:

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>) menampilkan aliran semua peristiwa yang dikirim oleh trait:

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. 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 entity

Anda dapat mendengarkan peristiwa yang dipancarkan setiap kali entity (seperti struktur, ruangan, perangkat, atau otomatisasi) ditambahkan, dihapus, atau diperbarui. Peristiwa ini adalah instance HomeObjectChangeEvent dan membawa ID entity yang berubah.

Untuk mendapatkan aliran yang menghasilkan peristiwa yang Anda inginkan, panggil metode stream() method on the HomeObjectsFlow<T> yang dihasilkan oleh metode Aliran yang sesuai:

Tabel: Aliran peristiwa
Entity Antarmuka Metode Aliran
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 -> {}
  }
}