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

หากต้องการติดตามเหตุการณ์ในอุปกรณ์ที่เฉพาะเจาะจง ให้เรียกใช้หนึ่งในสาม 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
  }
}

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

คุณสามารถฟังเหตุการณ์ที่ปล่อยออกมาทุกครั้งที่มีการเพิ่ม นำออก หรืออัปเดตเอนทิตี (เช่น โครงสร้าง ห้อง อุปกรณ์ หรือการทำงานอัตโนมัติ) เหตุการณ์เหล่านี้ เป็นอินสแตนซ์ของ 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 -> {}
  }
}