Мониторинг состояния устройства

В домашних API наблюдение за изменениями состояния дома становится возможным благодаря использованию потоков в Котлине. Наблюдение за изменениями в структурах, комнатах, метаданных устройства и состоянии устройства в Home API можно выполнить с помощью любого API, унаследованного от интерфейса HomeObjectsFlow . Это делается путем сбора из потока. Дополнительную информацию о потоках см. в разделе Знакомство с потоками .

Когда какой-либо элемент в коллекции добавляется, удаляется или изменяется, возвращается последний снимок коллекции.

Разработчик должен определить конкретные изменения, сравнив этот снимок со старой копией. Для этой цели можно использовать поле id , предоставленное для каждого типа родительского объекта в Home API .

Как использовать потоки

Давайте рассмотрим несколько основных примеров сбора данных из потоков в Home API. В следующих примерах перед доступом к коллекциям в доме необходимо создать экземпляр Home :

val context = LocalContext.current
val homeManager = Home.getClient(context)

Отслеживание изменений в структуре

Следующие изменения в структуре запускают эту коллекцию:

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

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

Отслеживание изменений на конкретном устройстве

Следующие изменения в устройстве запускают эту коллекцию:

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" }!!

Отслеживайте изменения определенной характеристики на устройстве

Используйте любую особенность, поддерживаемую устройством и Home API. Полный список см. в разделе Trait .

device.trait(OnOff).collect {
  if (it != null) {
    println("Got new state update! ${it.onOff}")
  }
}

Отслеживание изменений определенного типа на устройстве

Следующие изменения типа устройства запускают эту коллекцию:

Используйте любой тип устройства Matter поддерживаемый Home API. Полный список см. в разделе DeviceType .

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

Отслеживание изменений в комнате в структуре

Следующие изменения в комнате запускают эту коллекцию:

Чтобы отслеживать, когда устройства добавляются или удаляются из комнаты, используйте поток devices() .

structure.rooms().collect {
  println("Got a new updated set of rooms!")

  for (room in it) {
    println("Got room $room")
  }
}

Подписаться на события

В Home API события используются для обнаружения изменений в состоянии устройства.

Чтобы подписаться на события на конкретном устройстве, вызовите один из трёх HomeDevice . функции events , каждая из которых возвращает Flow<Event> :

  1. events(event: EventFactory<T>) возвращает поток для события определенного типа:

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>) возвращает поток всех событий, отправленных признаком:

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. events() возвращает поток событий, доступных для объекта:

    val eventflow = homeDevice.type(DoorLockDevice).first().events()
    

Чтобы получать события из потока, используйте функцию flow.collect() :

eventflow.collect { event ->
  if (event != null) {
    logger.atInfo().log("Received event %s", event)
    // do something
  }
}