دستگاه‌های چندبخشی در اندروید

برخی از دستگاه‌های Matter از چندین نقطه پایانی با نوع دستگاه یکسان تشکیل شده‌اند. سایر دستگاه‌های Matter سلسله مراتبی هستند و نقاط پایانی درون نقاط پایانی دیگر قرار گرفته‌اند. در APIهای Home، به هر دو نوع دستگاه ، دستگاه‌های چندبخشی گفته می‌شود.

نمایش مسطح

قبل از انتشار نسخه ۱.۸ رابط‌های برنامه‌نویسی کاربردی خانگی (Home APIs)، دستگاه‌های چندبخشی توسط رابط‌های برنامه‌نویسی کاربردی خانگی (Home APIs) به صورت مجموعه‌ای از دستگاه‌های جداگانه و نامرتبط نمایش داده می‌شدند. به این حالت، نمایش مسطح (flat representation) گفته می‌شود.

برای مثال، یک دستگاه پنل دیواری تکی با چهار کلید در APIهای Home به صورت چهار دستگاه مجزا و نامرتبط ظاهر می‌شود. و یک دستگاه Matter سلسله مراتبی مانند یخچال ممکن است در APIهای Home به صورت مجموعه‌ای از دستگاه‌ها نمایش داده شود که هر کدام مربوط به یکی از نقاط انتهایی هستند.

  • مثالی از پنل دیواری با چندین کلید که نمایش بومی Matter و رندرینگ مسطح Home API را نشان می‌دهد

    نمایش مسطح یک پنل دیواری ۴ سوئیچه.

  • مثال یخچال که نمایش بومی Matter و رندر مسطح API خانگی را نشان می‌دهد

    نمایش مسطح یخچال

شکل ۱ : نمونه‌های رندرینگ تخت

نمایش چندبخشی

با شروع انتشار ۱.۸ از APIهای Home، یک دستگاه چندبخشی می‌تواند در API به عنوان یک دستگاه واحد نمایش داده شود. برای فعال کردن این رفتار، متد devices() را در Structure ، Room یا HomeManager فراخوانی کنید و پارامتر 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 بر نمایش یک دستگاه چندبخشی در APIهای Home تأثیر می‌گذارد:

  • مثالی از پنل دیواری با چندین کلید که نمایش بومی Matter و رندر چندبخشی Home API را نشان می‌دهد

    نمایش چند قسمتی از یک پنل دیواری.

  • مثال یخچال که نمایش بومی Matter و رندر چندبخشی Home API را نشان می‌دهد

    نمایش چند قسمتی از یک یخچال.

شکل ۲ : نمونه‌های رندر چندبخشی

شما همیشه می‌توانید با حذف پارامتر enableMultipartDevices یا با تنظیم آن روی false ، نمایش مسطح را دریافت کنید.

در یک دستگاه چندبخشی، هر نمونه از یک نوع دستگاه، یک بخش (part) نامیده می‌شود.

قطعات ممکن است مستقیماً در دستگاه والد یا به صورت سلسله مراتبی، با استفاده از انواع دستگاه یا برچسب‌های معنایی Matter قابل دسترسی باشند. برچسب‌های معنایی در APIهای Home با DescriptorTrait.SemanticTagStruct پیاده‌سازی می‌شوند.

کلاس انتزاعی DeviceType رابط HasParts را پیاده‌سازی می‌کند و به توسعه‌دهندگان اجازه می‌دهد تا از طریق ویژگی parts و متد part() در درخت دستگاه پیمایش کنند. هر نمونه از قطعه نیز رابط 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()