อุปกรณ์แบบหลายพาร์ติชันใน Android

อุปกรณ์ Matter บางเครื่องประกอบด้วยปลายทางหลายรายการที่มีประเภทอุปกรณ์เดียวกัน อุปกรณ์ Matter อื่นๆ จะเป็นแบบลำดับชั้น โดยมีอุปกรณ์ปลายทางซ้อนอยู่ภายในอุปกรณ์ปลายทางอื่นๆ ใน Home API อุปกรณ์ทั้ง 2 ประเภทจะเรียกว่าอุปกรณ์แบบหลายส่วน

การนำเสนอแบบแบนราบ

ก่อน Home API เวอร์ชัน 1.8 อุปกรณ์แบบหลายส่วนจะแสดงโดย Home API เป็นชุดอุปกรณ์ที่แยกกันและไม่เกี่ยวข้องกัน ซึ่งเรียกว่าการแสดงผลแบบแบนราบ

ตัวอย่างเช่น อุปกรณ์แผงติดผนัง 1 เครื่องที่มีสวิตช์ 4 ตัวจะปรากฏใน Home API เป็นอุปกรณ์ 4 เครื่องที่แยกกันและไม่เกี่ยวข้องกัน และอุปกรณ์ Matter ที่มีลำดับชั้น เช่น ตู้เย็น อาจแสดงใน Home API เป็นชุดอุปกรณ์ ซึ่งแต่ละอุปกรณ์จะสอดคล้องกับปลายทางหนึ่งๆ

  • ตัวอย่างแผงติดผนังที่มีสวิตช์หลายตัวซึ่งแสดงการแสดงผล Matter แบบเนทีฟและการแสดงผลแบบแบนของ Home API

    ภาพแสดงแผงสวิตช์บนผนังแบบ 4 สวิตช์

  • ตัวอย่างตู้เย็นที่แสดงการแสดงผล Matter แบบเนทีฟและการแสดงผลแบบแฟลตของ Home API

    ภาพตู้เย็นแบบ 2 มิติ

รูปที่ 1: ตัวอย่างการแสดงผลแบบแบน

การนำเสนอแบบหลายส่วน

ตั้งแต่ Home API เวอร์ชัน 1.8 เป็นต้นไป อุปกรณ์แบบหลายส่วนจะแสดงใน API เป็นอุปกรณ์เดียวได้ หากต้องการเปิดใช้ลักษณะการทำงานนี้ ให้เรียกใช้เมธอด devices() ใน Structure, Room หรือ HomeManager และตั้งค่าพารามิเตอร์ enableMultipartDevices เป็น true ดังนี้

var multipartDevice = structure.devices(enableMultipartDevices = multipartEnabled)
var multipartDevice = multipartDevices.list().filter{ device ->  device.has(PowerStrip)}

แผนภาพต่อไปนี้แสดงให้เห็นว่าตัวเลือก enableMultipartDevices ส่งผลต่อการแสดงอุปกรณ์แบบหลายส่วนใน Home API อย่างไร

  • ตัวอย่างแผงติดผนังที่มีสวิตช์หลายตัวซึ่งแสดงการแสดงผล Matter แบบเนทีฟและการแสดงผลแบบหลายส่วนของ Home API

    การแสดงภาพแบบหลายส่วนของแผงผนัง

  • ตัวอย่างตู้เย็นที่แสดงการแสดงผล Matter แบบเนทีฟและการแสดงผลแบบหลายส่วนของ Home API

    การแสดงภาพตู้เย็นแบบหลายส่วน

รูปที่ 2: ตัวอย่างการแสดงผลแบบหลายส่วน

คุณมีตัวเลือกในการรับการแสดงผลแบบแบนเสมอโดยละเว้นพารามิเตอร์ enableMultipartDevices หรือตั้งค่าเป็น false

ภายในอุปกรณ์แบบหลายส่วน อินสแตนซ์คอมโพเนนต์แต่ละรายการของประเภทอุปกรณ์จะเรียกว่าส่วน

คุณสามารถเข้าถึงส่วนต่างๆ ได้โดยตรงจากอุปกรณ์หลักหรือส่วนต่างๆ ในลักษณะตามลำดับชั้น โดยใช้ประเภทอุปกรณ์หรือแท็กความหมาย Matter แท็กความหมายจะใช้ใน Home API ด้วย DescriptorTrait.SemanticTagStruct

คลาสแอบสแตรกต์ DeviceType จะใช้อินเทอร์เฟซ HasParts ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์ไปยังส่วนต่างๆ ของแผนผังอุปกรณ์ได้ผ่านพร็อพเพอร์ตี้ parts และเมธอด part() อินสแตนซ์ของส่วนแต่ละรายการยังใช้อินเทอร์เฟซ HasParts ด้วย ดังนั้นการเรียกใช้ parts() ในส่วนหนึ่งๆ จะสร้างรายการของส่วนย่อยอย่างน้อย 0 รายการ

ตัวอย่างต่อไปนี้แสดงวิธีเข้าถึงส่วนต่างๆ ของอุปกรณ์แบบหลายสวิตช์

val device =
      homeManager
        .devices(enableMultipartDevices = true)
        .itemFlow(Id(MULTI_SWITCH_DEVICE))
        .first()

// Here at top-level, we are using the homeDevice.parts() API to access flow of
// all the switches. Then we get the part ids.
val partIds =
      device
        .parts()
        .map { parts ->
          parts.filter { it.has(Switch) }.mapNotNull { it.metadata.partId }
        }
        .first()
        .toSet()

ตัวอย่างถัดไปแสดงวิธีเข้าถึงส่วนต่างๆ ของอุปกรณ์ตู้เย็น

val rootDevice = homeManager.devices(true).itemFlow(Id("device@uuid1"))

// On the top level, HomeDevice provides both plural (parts)
// and singular (part) APIs.
// The parts() API returns all the parts accessible from the top level,
// including Endpoint 0 and its children.
val childParts = rootDevice.parts().first()
// childParts contain (EP0 as RootNode, EP1 as Refrigerator)

// The singular part() API accepts DeviceType and tags (optional).
val refrigerator = rootDevice.part(Refrigerator).first()

// Get the refrigerator device which in this case is just device@uuid1
val refrigeratorDevice = homeManager.devices(false).itemFlow(refrigerator.metadata.partId.deviceId)

// DeviceType uses a synchronous API for providing access to parts
val cabinets = refrigerator.parts  // [EP2, EP3]

// Get the HomeDevice for these cabinets (device@uuid2 and device@uuid3)
val cabinetDeviceIds = cabinets.map { it.metadata.partId }

// Now use the devices API with enableMultipartDevices = false.
val cabinetDevices = homeManager.devices(false)
    .map { devices ->
devices.filter { it.id in cabinetDeviceIds }
}.first()