Monitorowanie stanu urządzenia na Androidzie

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

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:

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:

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:HomeDeviceevents funkcje, z których każda zwracaFlow<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 strumień wszystkich zdarzeń wysłanych przez cechę:

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

Tabela: strumienie zdarzeń
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 -> {}
  }
}