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

ใน 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 ระบบจะใช้เหตุการณ์เพื่อตรวจหาการเปลี่ยนแปลงสถานะของอุปกรณ์

หากต้องการสมัครรับข้อมูลเหตุการณ์ในอุปกรณ์ที่เฉพาะเจาะจง ให้เรียกใช้ HomeDevice รายการใดรายการหนึ่งจาก 3 รายการevents ฟังก์ชัน ซึ่งแต่ละฟังก์ชันจะแสดงผล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 ให้ใช้ฟังก์ชัน flow.collect() ดังนี้

eventflow.collect { event ->
  if (event != null) {
    logger.atInfo().log("Received event %s", event)
    // do something
  }
}

ติดตามเหตุการณ์ความสัมพันธ์ของเอนทิตี

คุณสามารถฟังเหตุการณ์ที่ส่งออกมาทุกครั้งที่มีการเพิ่ม นำออก หรืออัปเดตเอนทิตี (เช่น โครงสร้าง ห้อง อุปกรณ์ หรือการทำงานอัตโนมัติ) เหตุการณ์เหล่านี้เป็นอินสแตนซ์ของ HomeObjectChangeEvent และมีรหัสของเอนทิตีที่มีการเปลี่ยนแปลง

หากต้องการรับสตรีมที่สร้างเหตุการณ์ที่ต้องการ ให้เรียกใช้เมธอด stream() ใน HomeObjectsFlow<T> ที่สร้างโดยเมธอด Flow ที่เกี่ยวข้อง ดังนี้

ตาราง: สตรีมเหตุการณ์
เอนทิตี อินเทอร์เฟซ วิธีการไหล
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 -> {}
  }
}