Android için Home API'lerinde, evdeki durum değişikliklerini gözlemlemek Kotlin'deki akışlar kullanılarak mümkün olur. Home API'lerdeki yapılarda, odalarda, cihaz meta verilerinde ve cihaz durumunda yapılan değişiklikleri gözlemlemek için HomeObjectsFlow arayüzünden devralınan herhangi bir API kullanılabilir. Bu işlem, akıştan toplama yapılarak gerçekleştirilir.
Bir 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 çıkarmak geliştiriciye bağlıdır. Home API'lerindeki her üst nesne türü için sağlanan id alanı bu amaçla kullanılabilir.
Akışları kullanma
Aşağıda, Home API'lerindeki akışlardan veri toplama ile ilgili bazı temel örnekler verilmiştir.
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 aşağıdaki değişiklikler yapıldığında bu koleksiyon tetiklenir:
- Yapı adı
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:
- Bağlantı durumu
- Cihaz adı
- Oda üyeliği
- Desteklenen özellikler
- Desteklenen türler
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" }!!
Bir cihazdaki belirli bir özellikle ilgili değişiklikleri izleme
Cihaz ve Home API'leri tarafından desteklenen tüm özellikleri kullanın. Tam liste için Trait başlıklı makaleyi inceleyin.
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Bir cihazdaki belirli bir türdeki değişiklikleri izleme
Bir cihaz türünde yapılan aşağıdaki değişiklikler bu koleksiyonu tetikler:
- Oluşturulan cihaz türü içindeki herhangi bir özellikte yapılan değişiklikler
Home API'leri tarafından desteklenen tüm Matter cihaz türlerini kullanın. Tam listeyi görmek için DeviceType sayfasına bakın.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Bir yapıdaki odada yapılan değişiklikleri izleme
Bir odada 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ı takip etmek 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, bir cihazın durumundaki değişiklikleri algılamak için kullanılır.
Belirli bir cihazdaki etkinliklere abone olmak için üç HomeDevice yönteminden birini çağırın.events
işlevleri, her biri bir Flow<Event> döndürür:
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)events(trait: TraitFactory<T>), bir özelliğin gönderdiği tüm etkinliklerin akışını döndürür:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)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
}
}
Varlık ilişkisi etkinliklerine abone olma
Bir varlık (ör. yapı, oda, cihaz veya otomasyon) her eklendiğinde, kaldırıldığında ya da güncellendiğinde yayınlanan etkinlikleri dinleyebilirsiniz. Bu etkinlikler HomeObjectChangeEvent örnekleridir ve değişen varlığın kimliğini taşır.
İstediğiniz etkinlikleri üreten bir akış elde etmek için ilgili Flow yöntemi tarafından üretilen HomeObjectsFlow<T> üzerinde stream() yöntemini çağırın:
| Varlık | Arayüz | Akış Yöntemi |
|---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Örneğin, cihazlardaki değişiklikleri şu şekilde yönetebilirsiniz:
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 -> {} } }