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