ตรวจสอบสถานะของอุปกรณ์

ใน Home API คุณสามารถสังเกตการเปลี่ยนแปลงสถานะในบ้านได้ผ่านการใช้โฟลว์ใน 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 ระบบจะใช้เหตุการณ์เพื่อตรวจหาการเปลี่ยนแปลงสถานะของอุปกรณ์

หากต้องการสมัครรับเหตุการณ์ในอุปกรณ์ที่ต้องการ ให้เรียกใช้ฟังก์ชันใดฟังก์ชันหนึ่งต่อไปนี้ HomeDeviceevents ฟังก์ชันแต่ละรายการจะแสดงผลFlow<Event>ดังนี้

  1. events(event: EventFactory<T>) จะแสดงผลลัพธ์สําหรับเหตุการณ์ประเภทที่เฉพาะเจาะจง ดังนี้

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>) แสดงผลลําดับเหตุการณ์ทั้งหมดที่ส่งโดยลักษณะ

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. 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
  }
}