ใน Home API สำหรับ Android การสังเกตการเปลี่ยนแปลงสถานะในบ้านจะทำได้
โดยใช้
Flow 
ใน 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
    val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
    trait?.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 จะใช้เหตุการณ์เพื่อตรวจหาการเปลี่ยนแปลงสถานะของ อุปกรณ์
หากต้องการติดตามเหตุการณ์ในอุปกรณ์ที่เฉพาะเจาะจง ให้เรียกใช้หนึ่งในสาม
HomeDeviceevents
ฟังก์ชัน ซึ่งแต่ละฟังก์ชันจะแสดงผล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 ที่เกี่ยวข้อง
| เอนทิตี | SDK โฆษณา B | วิธีการโฟลว์ | 
|---|---|---|
| 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 -> {} } }