Android-এ মাল্টিপার্ট ডিভাইস

কিছু Matter ডিভাইস একই ধরনের ডিভাইস দিয়ে তৈরি একাধিক এন্ডপয়েন্ট দিয়ে তৈরি হয়। অন্যান্য Matter ডিভাইস হল হায়ারার্কিক্যাল, যেখানে এন্ডপয়েন্ট অন্য এন্ডপয়েন্টের মধ্যে নেস্ট করা থাকে। Home API-তে, দু'ধরনের ডিভাইসকেই মাল্টিপার্ট ডিভাইস বলা হয়।

ফ্ল্যাট রিপ্রেজেন্টেশন

Home API-এর 1.8 রিলিজের আগে, মাল্টিপার্ট ডিভাইসকে Home API-এর মাধ্যমে আলাদা, সম্পর্কহীন ডিভাইসের সেট হিসেবে দেখানো হয়। এটি ফ্ল্যাট উপস্থাপনা হিসেবে উল্লেখ করা হয়।

যেমন, চারটি সুইচ সহ একটি ওয়াল প্যানেল ডিভাইস Home API-তে চারটি আলাদা ও সম্পর্কহীন ডিভাইস হিসেবে দেখা যায়। এছাড়াও, রেফ্রিজারেটরের মতো Matter হায়ারার্কিক্যাল ডিভাইসকে Home API-তে একগুচ্ছ ডিভাইস হিসেবে দেখানো হতে পারে, যার প্রতিটি এন্ডপয়েন্টের সাথে সম্পর্কিত।

  • একাধিক সুইচ সহ ওয়াল প্যানেলের উদাহরণ যা নেটিভ Matter
          প্রতিনিধিত্ব এবং Home API-এর ফ্ল্যাট রেন্ডারিং দেখায়

    ৪-সুইচ ওয়াল প্যানেলের ফ্ল্যাট উপস্থাপনা।

  • রেফ্রিজারেটরের উদাহরণে নেটিভ Matter উপস্থাপনা এবং
          Home API-এর ফ্ল্যাট রেন্ডারিং দেখানো হয়েছে

    ফ্রিজের ফ্ল্যাট উপস্থাপনা

ছবি ১: ফ্ল্যাট রেন্ডারিং উদাহরণ

একাধিক অংশ সহ উপস্থাপনা

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 বিকল্প হোম API-তে মাল্টিপার্ট ডিভাইসের উপস্থাপনাকে প্রভাবিত করে:

  • একাধিক সুইচ সহ ওয়াল প্যানেলের উদাহরণ, যেখানে নেটিভ Matter
    প্রতিনিধিত্ব ও Home API-এর মাল্টিপার্ট রেন্ডারিং দেখানো হয়েছে

    ওয়াল প্যানেলের মাল্টিপার্ট উপস্থাপনা।

  • রেফ্রিজারেটরের উদাহরণে নেটিভ Matter উপস্থাপনা এবং Home
    API-এর মাল্টিপার্ট রেন্ডারিং দেখানো হয়েছে

    রেফ্রিজারেটরের মাল্টিপার্ট উপস্থাপনা।

ছবি ২: মাল্টিপার্ট রেন্ডারিংয়ের উদাহরণ

enableMultipartDevices প্যারামিটার বাদ দিয়ে অথবা এটিকে false হিসেবে সেট করে আপনি সবসময় ফ্ল্যাট রেপ্রেজেন্টেশন পাওয়ার বিকল্প পাবেন।

মাল্টিপার্ট ডিভাইসের মধ্যে, ডিভাইসের ধরনের প্রতিটি কম্পোনেন্ট ইনস্ট্যান্সকে পার্ট বলা হয়।

ডিভাইসের ধরন বা Matter সিম্যান্টিক ট্যাগ ব্যবহার করে, সরাসরি অভিভাবক ডিভাইস বা কোনও পার্ট হায়রার্কিক্যাল পদ্ধতিতে অ্যাক্সেস করা যেতে পারে। Home API-তে সেম্যান্টিক ট্যাগ প্রয়োগ করা হয় 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()