Android için 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
arayüzünden devralınan herhangi bir API kullanılabilir. Bu işlem, akıştan toplanarak yapılır.
Bir koleksiyona öğe eklendiğinde, koleksiyondan öğe silindiğinde veya koleksiyondaki bir öğe 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. Home API'lerindeki her üst nesne türü için sağlanan id
alanı bu amaç için kullanılabilir.
Akışları kullanma
Aşağıda, Home API'lerindeki akışlardan veri toplamayla 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 yapılan aşağıdaki değişiklikler bu koleksiyonu tetikler:
- 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 grubu
- Desteklenen türlerin 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 ö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}")
}
}
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ünde herhangi bir özellikte yapılan değişiklikler
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 üç yöntemden birini kullanınHomeDevice
.Her biri bir değer döndüren events
işlevleriFlow<Event>
:
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 ö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ıştan etkinlik tüketmek 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
Herhangi bir öğe (ör. yapı, oda, cihaz veya otomasyon) eklendiğinde, kaldırıldığında veya güncellendiğinde yayınlanan etkinlikleri dinleyebilirsiniz. Bu etkinlikler, HomeObjectChangeEvent
örneklerinin bir parçasıdır ve değişen öğenin 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 -> {} } }