W interfejsach Home API na Androida obserwowanie zmian stanu w domu jest możliwe dzięki użyciu przepływów w Kotlinie. Obserwowanie zmian w strukturach, pomieszczeniach, metadanych urządzeń i stanie urządzeń w interfejsach API Home jest możliwe za pomocą dowolnego interfejsu API dziedziczonego z HomeObjectsFlow
. Aby to zrobić, musisz zbierać dane z procesu.
Gdy dodasz, usuniesz lub zmodyfikujesz dowolny element kolekcji, zwrócony zostanie jej najnowszy snapshot.
Deweloper musi samodzielnie określić, jakie zmiany zostały wprowadzone, porównując ten snapshot ze starszą wersją. W tym celu można użyć pola id
, które jest dostępne 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 procesów w interfejsach API Home.
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 wywoływana 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 danych dotyczących konkretnej cechy na urządzeniu
Użyj dowolnej cechy obsługiwanej przez urządzenie i interfejsy API Home. Pełną listę znajdziesz w Trait
.
device.trait(OnOff).collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Śledzenie zmian określonego typu na urządzeniu
Ta kolekcja jest tworzona, gdy w typie urządzenia występują te zmiany:
- zmiany w dowolnej właściwości wygenerowanego typu urządzenia;
Użyj dowolnego typu urządzenia Matter obsługiwanego przez interfejsy API Home. 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
Te zmiany w pokoju powodują utworzenie kolekcji:
Aby śledzić, kiedy urządzenia są dodawane lub usuwane z pokoju, użyj przepływu devices()
.
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
Subskrypcja zdarzeń
W interfejsach API Home zdarzenia służą do wykrywania zmian stanu urządzenia.
Aby subskrybować zdarzenia na określonym urządzeniu, wywołaj jedną z 3 funkcji: HomeDevice
.events
funkcje, z których każda zwraca wartość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 strumień wszystkich zdarzeń wysłanych przez cechę:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
events()
zwraca sekwencję zdarzeń dostępnych dla obiektu:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Aby używać zdarzeń z przepływu, użyj funkcji flow.collect()
:
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
Subskrybuj zdarzenia dotyczące relacji między elementami
Możesz nasłuchiwać zdarzeń, które są emitowane za każdym razem, gdy element (np. struktura, pomieszczenie, urządzenie lub automatyzacja) zostanie dodany, usunięty lub zaktualizowany. Te zdarzenia to wystąpienia zdarzenia HomeObjectChangeEvent
i zawierają identyfikator zmienionej jednostki.
Aby uzyskać strumień, który generuje żądane zdarzenia, wywołaj metodę stream()
w HomeObjectsFlow<T>
wygenerowanym przez odpowiednią metodę przepływu:
Jednostka | Interfejs | Metoda przepływu |
---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Oto przykład sposobu obsługi 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 -> {} } }