W interfejsach Home API na Androida obserwowanie zmian stanu w domu jest możliwe
dzięki użyciu
przepływów
w języku Kotlin. Obserwowanie zmian w strukturach, pokojach, metadanych urządzeń i
stanie urządzeń w interfejsach Home API można przeprowadzić za pomocą dowolnego interfejsu API dziedziczącego po
HomeObjectsFlow
interfejsie. Odbywa się to przez zbieranie danych z przepływu.
Gdy dowolny element w kolekcji zostanie dodany, usunięty lub zmodyfikowany, zwracana jest najnowsza migawka kolekcji.
Deweloper musi samodzielnie określić konkretne zmiany, porównując tę migawkę ze starszą kopią. W tym celu można użyć pola id podanego dla każdego typu obiektu nadrzędnego
w interfejsach Home API.
Jak używać przepływów
Poniżej znajdziesz kilka podstawowych przykładów zbierania danych z przepływów w interfejsach Home API.
W przypadku tych przykładów przed uzyskaniem dostępu do kolekcji w domu należy utworzyć instancję Home:
val context = LocalContext.current
val homeManager = Home.getClient(context)
Śledzenie zmian w strukturze
Ta kolekcja jest wywoływana przez te zmiany w strukturze:
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
Śledzenie zmian w konkretnym urządzeniu
Ta kolekcja jest wywoływana przez te zmiany w urządzeniu:
- Stan połączenia
- Nazwa urządzenia
- Przynależność do pokoju
- Zestaw obsługiwanych cech
- Zestaw obsługiwanych typów
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" }!!
Śledzenie zmian w konkretnej cesze urządzenia
Użyj dowolnej cechy obsługiwanej przez urządzenie i interfejsy Home API. Pełną listę znajdziesz w sekcji
Trait.
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Śledzenie zmian w konkretnym typie urządzenia
Ta kolekcja jest wywoływana przez te zmiany w typie urządzenia:
- Zmiany w dowolnej cesze w wygenerowanym typie urządzenia
Użyj dowolnego typu urządzenia Matter obsługiwanego przez interfejsy Home API. Pełną listę znajdziesz w sekcji
DeviceType.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Śledzenie zmian w pokoju w strukturze
Ta kolekcja jest wywoływana przez te zmiany w pokoju:
- Nazwa pokoju
- Przynależność do struktury
Aby śledzić, kiedy urządzenia są dodawane do pokoju lub z niego usuwane, użyj devices()
przepływu.
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
Subskrybowanie zdarzeń
W interfejsach Home API zdarzenia służą do wykrywania zmian stanu urządzenia.
Aby subskrybować zdarzenia na konkretnym urządzeniu, wywołaj jedną z 3 funkcji
HomeDevice.events, z których każda zwraca Flow<Event>:
events(event: EventFactory<T>)zwraca przepływ dla określonego rodzaju zdarzenia:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)events(trait: TraitFactory<T>)zwraca przepływ wszystkich zdarzeń wysyłanych przez cechę:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)events()zwraca przepływ zdarzeń dostępnych dla obiektu:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Aby korzystać ze zdarzeń z przepływu, użyj funkcji flow.collect():
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
Subskrybowanie zdarzeń związanych z relacjami między jednostkami
Możesz nasłuchiwać zdarzeń, które są emitowane za każdym razem, gdy jednostka (np. struktura, pokój, urządzenie lub automatyzacja) zostanie dodana, usunięta lub zaktualizowana. Te
zdarzenia są instancjami
HomeObjectChangeEvent
i zawierają identyfikator jednostki, która uległa zmianie.
Aby uzyskać strumień, który generuje odpowiednie zdarzenia, wywołaj metodę
stream()
w HomeObjectsFlow<T>
wygenerowanym przez odpowiednią metodę Flow:
| Jednostka | Interfejs | Metoda Flow |
|---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Oto przykład obsługi zmian w urządzeniach:
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 -> {} } }