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

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

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

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

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 -> {}
  }
}