Android için Home API'lerinde, evdeki durum değişikliklerini gözlemlemek için Kotlin'de akışlar kullanılır. Home API'lerdeki yapılar, odalar, cihaz meta verileri ve cihaz durumundaki 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 anlamak geliştiricinin sorumluluğundadır. Ev 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ıda yapılan 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 aşağıdaki değişiklikler yapıldığında bu koleksiyon tetiklenir:
- Bağlantı durumu
- Cihaz adı
- Oda üyeliği
- Desteklenen özellikler kümesi
- Desteklenen türler kümesi
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 özelliğin değişikliklerini izleme
Cihaz ve Home API'leri tarafından desteklenen tüm özellikleri kullanın. Tam liste için Trait
konusuna bakın.
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
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:
- Oluşturulan cihaz türü içindeki herhangi bir özellikte yapılan değişiklikler
Home API'leri tarafından desteklenen herhangi bir Matter cihaz türünü kullanın. Tam liste için DeviceType
başlıklı makaleyi inceleyin.
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 aşağıdaki değişiklikler yapıldığında bu koleksiyon tetiklenir:
Cihazların odaya eklenme veya odadan kaldırılma zamanı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
Ev API'lerinde, bir cihazın durumundaki değişiklikleri algılamak için etkinlikler kullanılır.
Belirli bir cihazdaki etkinliklere abone olmak için üç HomeDevice
numaradan birini arayın.events
işlevler. Bu işlevlerin her biri Flow<Event>
döndürür:
events(event: EventFactory<T>)
belirli bir etkinlik türü için akış döndürür:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
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)
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 öğe (ö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 HomeObjectsFlow<T>
tarafından üretilen 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 ele alabilirsiniz:
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 -> {} } }