Cihaz durumunu izleme

Home API'lerinde, evdeki durumdaki değişiklikleri gözlemlemek için Kotlin'de akışlar kullanılır. Home API'lerindeki yapılarda, odalarda, cihaz meta verilerinde ve cihaz durumundaki değişiklikleri gözlemlemek için HomeObjectsFlow arabirimini devralan herhangi bir API kullanılabilir. Bu işlem, akıştan toplanarak yapılır. Akışlar hakkında daha fazla bilgi için Akışlar ile tanışın başlıklı makaleyi inceleyin.

Koleksiyondaki herhangi bir öğe eklendiğinde, silindiğinde veya değiştirildiğinde koleksiyonun en son anlık görüntüsü döndürülür.

Bu anlık görüntüyü eski bir kopyayla karşılaştırarak belirli değişiklikleri belirlemek geliştiricinin sorumluluğundadır. Ana Sayfa API'lerindeki her üst öğe türü için sağlanan id alanı bu amaç için kullanılabilir.

Akışları kullanma

Home API'lerindeki akışlardan veri toplamayla ilgili bazı temel örneklere göz atalım. Aşağıdaki örneklerde, evdeki koleksiyonlara erişmeden önce Home örneği oluşturulmalıdır:

val context = LocalContext.current
val homeManager = Home.getClient(context)

Bir yapıdaki değişiklikleri izleme

Bir yapıda yapılan aşağıdaki değişiklikler bu koleksiyonu tetikler:

homeManager.structures().map { it.firstOrNull() }.collect {
  println("Structure ${it.id} updated to ${it}")
}

val structure =  homeManager.structures().list().firstOrNull()!!

Belirli bir cihazdaki değişiklikleri izleme

Bir cihazda yapılan aşağıdaki değişiklikler bu koleksiyonu tetikler:

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" }!!

Cihazdaki belirli bir özellikte yapılan değişiklikleri izleme

Cihaz ve Home API'leri tarafından desteklenen tüm özellikleri kullanın. Tam liste için Trait bölümüne bakın.

device.trait(OnOff).collect {
  if (it != null) {
    println("Got new state update! ${it.onOff}")
  }
}

Bir cihazdaki belirli bir türde yapılan değişiklikleri izleme

Bir cihaz türünde yapılan aşağıdaki değişiklikler bu koleksiyonu tetikler:

Home API'ler tarafından desteklenen tüm Matter cihaz türlerini kullanabilirsiniz. Tam listeyi DeviceType sayfasında bulabilirsiniz.

device.type(DimmableLightDevice).collect { type ->
    println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}

Bir yapıdaki odada yapılan değişiklikleri izleme

Odalarda yapılan aşağıdaki değişiklikler bu koleksiyonu tetikler:

Cihazların bir odaya ne zaman eklendiğini veya odadan ne zaman kaldırıldığını izlemek için devices() akışını kullanın.

structure.rooms().collect {
  println("Got a new updated set of rooms!")

  for (room in it) {
    println("Got room $room")
  }
}

Etkinliklere abone olma

Home API'lerinde etkinlikler, cihazın durumundaki değişiklikleri algılamak için kullanılır.

Belirli bir cihazdaki etkinliklere abone olmak için aşağıdaki üç seçenekten birini arayınHomeDevice.Her biri bir değer döndüren events işlevleriFlow<Event>:

  1. events(event: EventFactory<T>), belirli bir etkinlik türü için bir akış döndürür:

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>), bir özellik tarafından gönderilen tüm etkinliklerin akışını döndürür:

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. events(), nesne için kullanılabilen bir etkinlik akışı döndürür:

    val eventflow = homeDevice.type(DoorLockDevice).first().events()
    

Bir akıştaki etkinlikleri kullanmak için flow.collect() işlevini kullanın:

eventflow.collect { event ->
  if (event != null) {
    logger.atInfo().log("Received event %s", event)
    // do something
  }
}