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

В API Home для Android отслеживание изменений состояния дома осуществляется с помощью потоков в Kotlin. Отслеживание изменений в структурах, комнатах, метаданных устройства и состоянии устройства в API Home может быть выполнено с помощью любого API, наследующего от интерфейса HomeObjectsFlow . Это делается путем сбора данных из потока.

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

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

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

Ниже приведены несколько базовых примеров сбора данных из потоков в API Home. Для следующих примеров необходимо создать экземпляр Home перед доступом к коллекциям в 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" }!!

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

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

    val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()

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

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

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

Используйте любой тип устройства Matter , поддерживаемый API Home. Полный список см. в 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")
  }
}

Подпишитесь на мероприятия

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

Чтобы подписаться на события на конкретном устройстве, вызовите одну из трех events HomeDevice , каждая из которых возвращает 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
  }
}

Подписаться на события, связанные с сущностями

Вы можете отслеживать события, которые генерируются каждый раз, когда объект (например, здание, комната, устройство или автоматизация) добавляется, удаляется или обновляется. Эти события представляют собой экземпляры класса HomeObjectChangeEvent и содержат идентификатор объекта, который изменился.

Чтобы получить поток, генерирующий нужные вам события, вызовите метод stream() объекта HomeObjectsFlow<T> , созданного соответствующим методом Flow:

Таблица: Потоки событий
Сущность Интерфейс Метод потока
Structure HasStructures structures()
Room HasRooms rooms()
HomeDevice HasHomeDevices devices()
Automation HasAutomations automations()

Например, вот как можно обрабатывать изменения в устройствах:

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