Monitorowanie stanu urządzenia

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:

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:

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:

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>:

  1. events(event: EventFactory<T>) zwraca przepływ dla określonego rodzaju zdarzenia:

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>) zwraca ciąg wszystkich zdarzeń wysłanych przez daną cechę:

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. 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
  }
}