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. Zmiany w domach, pomieszczeniach, metadanych urządzeń i ich stanie w interfejsach Home API można obserwować za pomocą dowolnego interfejsu API dziedziczącego z interfejsu HomeObjectsFlow. Można to zrobić, zbierając dane z przepływu.
Gdy dowolny element w kolekcji zostanie dodany, usunięty lub zmodyfikowany, zwracana jest najnowsza migawka kolekcji.
Deweloper musi wywnioskować, jakie zmiany zostały wprowadzone, porównując ten zrzut ze starszą kopią. Do tego celu można użyć pola id podanego dla każdego typu obiektu nadrzędnego w interfejsach Home API.
Jak korzystać z automatyzacji
Poniżej znajdziesz kilka podstawowych przykładów zbierania danych z przepływów w interfejsach Home API.
W przypadku poniższych 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 domu
Ta kolekcja jest aktywowana przez następujące zmiany w domu:
- Nazwa struktury
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
Śledzenie zmian na konkretnym urządzeniu
Te zmiany na urządzeniu powodują uruchomienie tej kolekcji:
- Stan połączenia
- Nazwa urządzenia
- Członkostwo w 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 konkretnej cechy na urządzeniu
Używaj dowolnej cechy obsługiwanej przez urządzenie i interfejsy Home API. Pełną listę znajdziesz w 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 określonego typu na urządzeniu
Te zmiany typu urządzenia powodują uruchomienie tej kolekcji:
- Zmiany dowolnej cechy w wygenerowanym typie urządzenia.
Używaj dowolnego typu urządzenia Matter obsługiwanego przez interfejsy Home API. Pełną listę znajdziesz w artykule DeviceType.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Śledzenie zmian w pomieszczeniu w domu
Te zmiany w pokoju powodują uruchomienie tej kolekcji:
Aby śledzić, kiedy urządzenia są dodawane do pomieszczenia lub z niego usuwane, użyj devices().
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 zasubskrybować zdarzenia na konkretnym urządzeniu, wywołaj jedną z 3 metod HomeDevice.events
funkcje, 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 strumień zdarzeń dostępnych dla obiektu:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Aby wykorzystać zdarzenia 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ń dotyczących relacji encji
Możesz nasłuchiwać zdarzeń, które są emitowane za każdym razem, gdy encja (np. struktura, pomieszczenie, 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() na obiekcie HomeObjectsFlow<T> wygenerowanym przez odpowiednią metodę Flow:
| Jednostka | Interfejs | Metoda przepływu |
|---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Oto jak możesz postępować w przypadku zmian dotyczących urządzeń:
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 -> {} } }