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

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

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

หากต้องการสมัครรับข้อมูลเหตุการณ์ในอุปกรณ์ที่เฉพาะเจาะจง ให้เรียกใช้ฟังก์ชัน `events` ของ `HomeDevice` 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 ที่เกี่ยวข้อง

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