在 Android 版 Home API 中,通过使用 Kotlin 中的流,可以观察住宅中的状态变化。通过继承自 HomeObjectsFlow
接口的任何 API,都可以观察 Home API 中结构、房间、设备元数据和设备状态的变化。这是通过从数据流中收集来实现的。
当集合中的任何项被添加、删除或修改时,系统都会返回集合的最新快照。
开发者需要通过将此快照与旧副本进行比较来推断具体更改。为此,您可以使用Home API 中为每种父对象类型提供的 id
字段。
如何使用流程
以下是一些从 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
。
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
跟踪设备上特定类型的更改
对设备类型进行以下更改会触发此集合:
- 对生成的设备类型中的任何特征所做的更改
使用 Home API 支持的任何 Matter 设备类型。如需查看完整列表,请参阅 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
的实例,并携带发生更改的实体的 ID。
如需获取可生成所需事件的流,请对相应 Flow 方法生成的 HomeObjectsFlow<T>
调用 stream()
方法:
实体 | 接口 | 流方法 |
---|---|---|
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 -> {} } }