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, pomieszczeniach, metadanych urządzeń i ich stanie w interfejsach Home API jest możliwe w przypadku każdego interfejsu API dziedziczącego z HomeObjectsFlow
interfejsu. Odbywa się to przez zbieranie informacji w ramach procesu płatności.
Gdy dowolny element w kolekcji zostanie dodany, usunięty lub zmodyfikowany, zwracana jest najnowsza migawka kolekcji.
Deweloper musi sam określić konkretne zmiany, porównując ten migawkę ze starszą kopią. W tym celu możesz użyć pola id
udostępnionego dla każdego typu obiektu nadrzędnego w interfejsach Home API.
Jak korzystać z przepływów
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 strukturze
Ta kolekcja jest aktywowana przez te zmiany w strukturze:
- Nazwa struktury
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
Śledzenie zmian na określonym urządzeniu
Ta kolekcja jest wywoływana przez te zmiany na urządzeniu:
- Stan połączenia
- Nazwa urządzenia
- Subskrypcja Room
- 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 przypadku konkretnej cechy na urządzeniu
Używaj dowolnych cech obsługiwanych 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
Ta kolekcja jest wywoływana przez te zmiany typu urządzenia:
- Zmiany w dowolnej cesze w ramach wygenerowanego typu urządzenia
Używaj dowolnego Mattertypu urządzenia obsługiwanego przez interfejsy Home API. Pełną listę znajdziesz w 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:
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 zasubskrybować zdarzenia na konkretnym urządzeniu, wywołaj jedną z tych 3 funkcji:HomeDevice
events
funkcje, z których każda zwracaFlow<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 strumień wszystkich zdarzeń wysł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 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ń relacji między elementami
Możesz nasłuchiwać zdarzeń, które są emitowane za każdym razem, gdy podmiot (np. struktura, pomieszczenie, urządzenie lub automatyzacja) jest dodawany, usuwany lub aktualizowany. Te zdarzenia są instancjami HomeObjectChangeEvent
i zawierają identyfikator zmienionej jednostki.
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 przykład, jak możesz sobie poradzić ze zmianami na 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 -> {} } }