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. Zmiany w domach, pomieszczeniach, metadanych urządzeń i ich stanie w interfejsach Home API można obserwować za pomocą dowolnego interfejsu API dziedziczącego z interfejsu HomeObjectsFlow. Można to zrobić, zbierając dane z przepływu.

Gdy dowolny element w kolekcji zostanie dodany, usunięty lub zmodyfikowany, zwracana jest najnowsza migawka kolekcji.

Deweloper musi wywnioskować, jakie zmiany zostały wprowadzone, porównując ten zrzut ze starszą kopią. Do tego celu można użyć pola id podanego dla każdego typu obiektu nadrzędnego w interfejsach Home API.

Jak korzystać z automatyzacji

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 domu

Ta kolekcja jest aktywowana przez następujące zmiany w domu:

homeManager.structures().map { it.firstOrNull() }.collect {
  println("Structure ${it.id} updated to ${it}")
}

val structure =  homeManager.structures().list().firstOrNull()!!

Śledzenie zmian na konkretnym urządzeniu

Te zmiany na urządzeniu powodują uruchomienie tej kolekcji:

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 konkretnej cechy na urządzeniu

Używaj dowolnej cechy obsługiwanej 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

Te zmiany typu urządzenia powodują uruchomienie tej kolekcji:

Używaj dowolnego typu urządzenia Matter obsługiwanego przez interfejsy Home API. Pełną listę znajdziesz w artykule DeviceType.

device.type(DimmableLightDevice).collect { type ->
    println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}

Śledzenie zmian w pomieszczeniu w domu

Te zmiany w pokoju powodują uruchomienie tej kolekcji:

Aby śledzić, kiedy urządzenia są dodawane do pomieszczenia lub z niego usuwane, użyj devices().

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 3 metod HomeDevice.events funkcje, z których każda zwraca 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 przepływ wszystkich zdarzeń wysył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 wykorzystać zdarzenia 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ń dotyczących relacji encji

Możesz nasłuchiwać zdarzeń, które są emitowane za każdym razem, gdy encja (np. struktura, pomieszczenie, urządzenie lub automatyzacja) zostanie dodana, usunięta lub zaktualizowana. Te zdarzenia są instancjami HomeObjectChangeEvent i zawierają identyfikator jednostki, która uległa zmianie.

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 jak możesz postępować w przypadku 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 -> {}
  }
}