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 Kotlinie. Zmiany w strukturach, pomieszczeniach, metadanych urządzeń i stanie urządzeń w interfejsach Home API można obserwować za pomocą dowolnego 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 wydarzeń

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ń związanych z relacjami 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 radzić ze zmianami 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 -> {}
  }
}