В Home API для Android наблюдение за изменениями состояния дома становится возможным благодаря использованию потоков в Kotlin. Наблюдение за изменениями в структурах, комнатах, метаданных устройства и состоянии устройства в 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>
:
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 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 -> {} } }