В домашних 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>
:
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
}
}