Interfejsy API Home umożliwiają obserwowanie zmian stanu domu za pomocą 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 dziedziczącego z HomeObjectsFlow
. W tym celu zbiera dane z procesu. Więcej informacji o przepływach znajdziesz w artykule Wprowadzenie do przepływów.
Gdy dodasz, usuniesz lub zmodyfikujesz dowolny element kolekcji, zwrócony zostanie jej najnowszy snapshot.
Deweloper musi samodzielnie określić konkretne zmiany, porównując ten zrzut ekranu 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
Przyjrzyjmy się kilku podstawowym przykładom 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
Te zmiany w strukturze powodują tworzenie kolekcji:
- 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
Te zmiany w urządzeniu powodują gromadzenie danych:
- Stan połączenia
- Nazwa urządzenia
- Subskrypcja 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 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
Te zmiany w typie urządzenia powodują gromadzenie danych:
- zmiany dowolnej cechy w wygenerowanym typie 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")
}
}
Subskrybowanie 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 ciąg wszystkich zdarzeń wysłanych przez daną 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 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
}
}