कुछ Matter डिवाइस, एक ही तरह के डिवाइस टाइप वाले कई एंडपॉइंट से बने होते हैं. अन्य Matter डिवाइसों में, एक क्रम होता है. इनमें एंडपॉइंट, दूसरे एंडपॉइंट में नेस्ट किए जाते हैं. Home API में, दोनों तरह के डिवाइसों को मल्टीपार्ट डिवाइस कहा जाता है.
फ़्लैट प्रतिनिधित्व
Home API के 1.8 वर्शन से पहले, मल्टीपार्ट डिवाइसों को Home API, अलग-अलग और एक-दूसरे से जुड़े न होने वाले डिवाइसों के सेट के तौर पर दिखाता है. इसे फ़्लैट प्रतिनिधित्व कहा जाता है.
उदाहरण के लिए, चार स्विच वाला एक वॉल पैनल डिवाइस, Home API में चार अलग-अलग और असंबंधित डिवाइसों के तौर पर दिखता है. इसके अलावा, फ़्रिज जैसे Matter डिवाइस को Home API में डिवाइसों के सेट के तौर पर दिखाया जा सकता है. इनमें से हर डिवाइस, एक एंडपॉइंट से जुड़ा होता है.
चार स्विच वाले वॉल पैनल की फ़्लैट इमेज.
रेफ़्रिजरेटर की फ़्लैट इमेज
एक से ज़्यादा पार्ट वाला प्रज़ेंटेशन
Home API के 1.8 वर्शन से, एक से ज़्यादा हिस्सों वाले डिवाइस को एपीआई में एक ही डिवाइस के तौर पर दिखाया जा सकता है. इस सुविधा को चालू करने के लिए, Structure, Room या HomeManager पर devices() तरीके को कॉल करें और enableMultipartDevices पैरामीटर को 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)
यहां दिए गए डायग्राम में बताया गया है कि enableMultipartDevices विकल्प चुनने पर, Home API में कई हिस्सों वाले डिवाइस को कैसे दिखाया जाता है:
वॉल पैनल को कई हिस्सों में दिखाया गया है.
रेफ़्रिजरेटर की अलग-अलग हिस्सों वाली इमेज.
आपके पास हमेशा फ़्लैट डेटा पाने का विकल्प होता है. इसके लिए, enableMultipartDevices पैरामीटर को हटा दें या इसे false पर सेट करें.
कई हिस्सों वाले डिवाइस पर नेविगेट करना
कई हिस्सों वाले डिवाइस में, डिवाइस टाइप के हर कॉम्पोनेंट इंस्टेंस को पार्ट कहा जाता है.
डिवाइस के टाइप या Matter सिमैंटिक टैग का इस्तेमाल करके, सीधे तौर पर पैरंट डिवाइस या किसी हिस्से को ऐक्सेस किया जा सकता है. सिमैंटिक टैग, Home APIs में DescriptorTrait.SemanticTagStruct के साथ लागू किए जाते हैं.
DeviceType ऐब्स्ट्रैक्ट क्लास, HasParts इंटरफ़ेस को लागू करती है. इससे डेवलपर, parts प्रॉपर्टी और part() मेथड की मदद से डिवाइस ट्री पर नेविगेट कर पाते हैं. हर पार्ट इंस्टेंस, HasParts इंटरफ़ेस को भी लागू करता है, ताकि किसी पार्ट पर HasParts को कॉल करने से, शून्य या उससे ज़्यादा सब-पार्ट की सूची तैयार हो सके.parts()
यहां दिए गए उदाहरण में, मल्टी-स्विच डिवाइस के हिस्सों को ऐक्सेस करने का तरीका बताया गया है:
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()