Một số Matter thiết bị được tạo thành từ nhiều điểm cuối có cùng loại thiết bị. Các thiết bị Matter khác được phân cấp, với các điểm cuối được lồng trong các điểm cuối khác. Trong Home API, cả hai loại thiết bị đều được gọi là thiết bị nhiều phần.
Biểu diễn phẳng
Trước phiên bản 1.8 của Home API, các thiết bị nhiều phần được Home API biểu diễn dưới dạng một tập hợp các thiết bị riêng biệt, không liên quan. Đây được gọi là biểu diễn phẳng.
Ví dụ: một thiết bị bảng điều khiển gắn tường có 4 công tắc xuất hiện trong Home API dưới dạng 4 thiết bị riêng biệt và không liên quan. Và một thiết bị phân cấp Matter như tủ lạnh có thể được biểu diễn trong Home API dưới dạng một tập hợp các thiết bị, mỗi thiết bị tương ứng với một trong các điểm cuối.
Biểu diễn phẳng của bảng điều khiển gắn tường có 4 công tắc.
Biểu diễn phẳng của tủ lạnh
Biểu diễn nhiều phần
Kể từ phiên bản 1.8 của Home API, một thiết bị nhiều phần có thể được biểu diễn trong API dưới dạng một thiết bị. Để bật hành vi này, hãy gọi phương thức devices() trên Structure, Room hoặc HomeManager và đặt tham số enableMultipartDevices thành true:
let devices = try await self.home.devices(enableMultipartDevices: true).list() let device = try XCTUnwrap(devices.first { $0.id == powerstripID }) let outlets = try await device.types.getAll(of: OnOffPluginUnitDeviceType.self)
Các sơ đồ sau đây minh hoạ cách tuỳ chọn enableMultipartDevices ảnh hưởng đến việc biểu diễn một thiết bị nhiều phần trong Home API:
Biểu diễn nhiều phần của bảng điều khiển gắn tường.
Biểu diễn nhiều phần của tủ lạnh.
Bạn luôn có thể chọn nhận biểu diễn phẳng bằng cách bỏ qua tham số enableMultipartDevices hoặc đặt tham số này thành false.
Điều hướng thiết bị nhiều phần
Trong một thiết bị nhiều phần, mỗi thực thể thành phần của một loại thiết bị được gọi là một phần.
Bạn có thể truy cập trực tiếp vào các phần trên thiết bị mẹ hoặc một phần theo cách phân cấp, bằng cách sử dụng các loại thiết bị hoặc thẻ ngữ nghĩa MatterMatter. Thẻ ngữ nghĩa được triển khai trong Home API bằng
DescriptorTrait.SemanticTagStruct.
Lớp trừu tượng DeviceType triển khai giao diện HasParts, cho phép nhà phát triển điều hướng cây thiết bị thông qua thuộc tính parts và phương thức part(). Mỗi thực thể phần cũng triển khai giao diện HasParts, để việc gọi parts() trên một phần sẽ tạo ra danh sách gồm 0 hoặc nhiều phần phụ.
Ví dụ sau đây cho thấy cách truy cập vào các phần của thiết bị nhiều công tắc:
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()
Ví dụ tiếp theo cho thấy cách truy cập vào các phần của thiết bị tủ lạnh:
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()