В 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> :
events(event: EventFactory<T>)возвращает поток для определенного типа событий:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)events(trait: TraitFactory<T>)возвращает поток всех событий, отправленных трейтом:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)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 -> {} } }