ডিভাইস এবং ডিভাইস মেটাডেটা অ্যাক্সেস করুন

হোম API-এর মাধ্যমে ডিভাইস APIগুলি অ্যাক্সেস করা যেতে পারে। আপনার অ্যাপে এই প্যাকেজগুলি আমদানি করুন:

import com.google.home.Home
import com.google.home.HomeDevice
import com.google.home.Id

ডিভাইস API-এর সাথে নির্দিষ্ট ডিভাইসের ধরন বা বৈশিষ্ট্য ব্যবহার করতে, সেগুলি অবশ্যই পৃথকভাবে আমদানি করতে হবে।

উদাহরণস্বরূপ, Matter অন/অফ বৈশিষ্ট্য এবং অন/অফ প্লাগ-ইন ইউনিট ডিভাইস টাইপ ব্যবহার করতে, আপনার অ্যাপ্লিকেশনে নিম্নলিখিত প্যাকেজগুলি আমদানি করুন:

import com.google.home.matter.standard.OnOff
import com.google.home.matter.standard.OnOffPluginUnitDevice

আরও তথ্যের জন্য, ডেটা মডেল দেখুন।

ত্রুটি হ্যান্ডলিং

হোম এপিআই-এর যেকোন পদ্ধতি একটি HomeException নিক্ষেপ করতে পারে, তাই আমরা সুপারিশ করি যে আপনি সমস্ত কলে HomeException ধরতে একটি try-catch ব্লক ব্যবহার করুন।

HomeException পরিচালনা করার সময়, কী ভুল হয়েছে তা জানতে এর code এবং message ক্ষেত্রগুলি পরীক্ষা করুন৷

যেকোনও পরিচালনা না করা ব্যতিক্রমের ফলে আপনার অ্যাপ ক্র্যাশ হয়ে যাবে।

আরও তথ্যের জন্য, ত্রুটি পরিচালনা দেখুন।

একটি উদাহরণের জন্য একটি ডিভাইসে একটি কমান্ড পাঠান দেখুন।

নমুনা কল

ডিভাইসের একটি তালিকা পান

উপলব্ধ কাঠামোর সাথে, একটি devices() কল সেই কাঠামো থেকে আপনার কাছে অ্যাক্সেসযোগ্য ডিভাইসগুলির একটি প্রবাহ ফেরত দেয়:

// Get a flow of all devices accessible to the user
val allDevicesFlow: HomeObjectsFlow<HomeDevice> = home.devices()

// Calling list() on a HomeObjectsFlow returns the first Set of elements.
val allDevices: Set<HomeDevice> = allDevicesFlow.list()

সেখান থেকে, প্রতিটি ডিভাইসের জন্য রাজ্যগুলি অ্যাক্সেসযোগ্য, এবং সমর্থিত কমান্ডগুলি ডিভাইসে পাঠানো যেতে পারে।

একটি ডিভাইস অবস্থা পড়ুন

আসুন ডিভাইসের অন/অফ বৈশিষ্ট্য থেকে OnOff অ্যাট্রিবিউট চেক করার একটি উদাহরণ দেখি। Home APIs বৈশিষ্ট্য ডেটা মডেল ব্যবহার করে, যেখানে এই বৈশিষ্ট্যটিকে OnOff হিসাবে চিহ্নিত করা হয়, আপনি ডিভাইসের ধরনের standardTraits ক্লাসের মাধ্যমে বৈশিষ্ট্য ডেটা পুনরুদ্ধার করতে পারেন:

// Assuming we have a device.
val deviceFlow = home.devices().itemFlow(myDeviceId)

val device = deviceFlow.first()

// Get a flow of a standard trait on the type. distinctUntilChanged() is needed to only trigger
// on the specific trait changes and not the whole type.
val onOffTraitFlow: Flow<OnOff?> =
  device.type(DimmableLightDevice).map { it.standardTraits.onOff }.distinctUntilChanged()

val onOffTrait: OnOff = onOffTraitFlow.first()!!

Kotlin ফ্লো ফাংশন সম্পর্কে আরও জানতে distinctUntilChanged দেখুন।

একটি বৈশিষ্ট্য সদস্যতার মধ্যে রাষ্ট্র অবৈধ

TraitStateInvalidation ইন্টারফেস টার্গেট ডিভাইসে সাবস্ক্রিপশনের মাধ্যমে পুনরুদ্ধার করা একটি স্টেটকে অবৈধ করার ক্ষমতা প্রদান করে যেখানে স্টেট সঠিকভাবে রিপোর্ট করা হচ্ছে না। যখন স্টেট সঠিকভাবে রিপোর্ট করা যায় না তার উদাহরণগুলির মধ্যে "C" গুণমানের সাথে Matter বৈশিষ্ট্যের বৈশিষ্ট্যগুলি ব্যবহার করা বা অপ্রত্যাশিতভাবে সমস্যা সৃষ্টিকারী ডিভাইস বাস্তবায়নের কারণে অন্তর্ভুক্ত।

এই API বর্তমান বৈশিষ্ট্য অবস্থার একটি জোরপূর্বক পড়া ইস্যু করে এবং বিদ্যমান বৈশিষ্ট্য প্রবাহের মাধ্যমে ফলাফল প্রদান করে।

বৈশিষ্ট্য পান, তারপর বৈশিষ্ট্যের উপর একটি forceRead চালান:

val generalDiagnosticsTrait = device.trait(GeneralDiagnostics).first()
generalDiagnosticsTrait.forceRead()

ডিভাইস ধরনের বৈশিষ্ট্য একটি তালিকা পান

ডিভাইসের ধরনগুলিকে বৈশিষ্ট্যগুলি পড়ার জন্য একটি এন্ট্রি পয়েন্ট হিসাবে ব্যবহার করা উচিত, কারণ তারা একটি ডিভাইসকে তার কার্যকরী টুকরোগুলিতে পচিয়ে দেয় (যেমন Matter শেষ পয়েন্টগুলি)।

একটি ডিভাইসে দুটি ধরনের ডিভাইসের বৈশিষ্ট্য থাকা অবস্থায় তারা বৈশিষ্ট্য সংঘর্ষের জন্যও দায়ী, উভয়েরই একই বৈশিষ্ট্য থাকতে পারে। উদাহরণস্বরূপ, যদি একটি ডিভাইস একটি স্পিকার এবং ডিমেবল লাইট উভয়ই হয়, তবে এতে দুটি অন/অফ এবং দুটি স্তর নিয়ন্ত্রণ বৈশিষ্ট্য থাকবে।

Dimmable Light ডিভাইসের প্রকারের জন্য উপলব্ধ বৈশিষ্ট্যের তালিকা পেতে:

// Get all types available on this device. Requires the types to be part of the registry during
// SDK initialization.
val typesFlow: Flow<Set<DeviceType>> = device.types()

// Get a snapshot of all types.
val types: Set<DeviceType> = typesFlow.first()

// Get the DimmableLightDevice instance from the set of types.
val dimmableLightDevice = types.filterIsInstance<DimmableLightDevice>().firstOrNull()

// Get all traits in the type + traits registered
val allTraits: Set<Trait> = dimmableLightDevice!!.traits()

অন্য ধরনের বৈশিষ্ট্য সংঘর্ষ ঘটতে পারে যখন একটি ডিভাইসে একই নামের দুটি বৈশিষ্ট্য থাকে। উদাহরণস্বরূপ, onOff স্ট্যান্ডার্ড OnOff বৈশিষ্ট্যের একটি উদাহরণ উল্লেখ করতে পারে, বা এটি একটি প্রস্তুতকারক-সংজ্ঞায়িত OnOff বৈশিষ্ট্যের একটি উদাহরণ উল্লেখ করতে পারে। কোন বৈশিষ্ট্যের উদ্দেশ্যে কোন সম্ভাব্য অস্পষ্টতা দূর করতে, একটি ডিভাইসের মাধ্যমে উল্লেখ করা একটি Trait উদাহরণের আগে একটি যোগ্য নামস্থান থাকা উচিত। স্ট্যান্ডার্ড বৈশিষ্ট্যের জন্য, অর্থাৎ যেগুলি Matter স্ট্যান্ডার্ড ক্লাস্টারগুলির সাথে সাদৃশ্যপূর্ণ, তারা standardTraits ব্যবহার করে। Google বৈশিষ্ট্যের জন্য, googleTraits ব্যবহার করুন:

// Accessing standard traits on the type.
val onOffTrait: OnOff? = dimmableLightDevice.standardTraits.onOff
val levelControlTrait: LevelControl? = dimmableLightDevice.standardTraits.levelControl

একটি প্রস্তুতকারক-নির্দিষ্ট বৈশিষ্ট্য অ্যাক্সেস করতে, এটি সরাসরি উল্লেখ করুন:

// Accessing a custom trait on the type.
val customTrait = dimmableLightDevice.trait(MyCustomTrait)

একটি নির্দিষ্ট বৈশিষ্ট্য সহ ডিভাইসগুলির একটি তালিকা পান

কোটলিনের filter ফাংশনটি API কলগুলিকে আরও পরিমার্জিত করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, বাড়ির সমস্ত ডিভাইসের একটি তালিকা পেতে যা চালু/বন্ধ বৈশিষ্ট্য রয়েছে:

// Get all devices that support OnOff
val onOffDevices: Flow<List<HomeDevice>> =
  home.devices().map { devices -> devices.filter { it.has(OnOff) } }

হোম API-এ উপলব্ধ বৈশিষ্ট্যগুলির সম্পূর্ণ তালিকার জন্য Trait ইন্টারফেসটি দেখুন।

একই ধরনের ডিভাইসের সাথে ডিভাইসের একটি তালিকা পান

একটি বাড়ির সমস্ত আলোর প্রতিনিধিত্ব করে এমন ডিভাইসগুলির একটি তালিকা পেতে:

// Get a list of devices with similar device types (lights)
val lightDevices =
  home.devices().map { devices ->
    devices.filter {
      it.has(DimmableLightDevice) ||
        it.has(OnOffLightDevice) ||
        it.has(ColorTemperatureLightDevice) ||
        it.has(ExtendedColorLightDevice)
    }
  }

হোম API-এ একাধিক ডিভাইসের ধরন রয়েছে যা একটি মূল ডিভাইসের ধরণকে উপস্থাপন করতে পারে। উদাহরণস্বরূপ, কোন "হালকা" ডিভাইস প্রকার নেই। পরিবর্তে, চারটি ভিন্ন ধরনের ডিভাইস রয়েছে যা একটি আলোকে উপস্থাপন করতে পারে, যেমনটি পূর্ববর্তী উদাহরণে দেখানো হয়েছে। যেমন, একটি বাড়িতে উচ্চ-স্তরের ধরনের ডিভাইসের একটি বিস্তৃত দৃশ্য পেতে, ফিল্টার করা ফ্লোতে একাধিক ডিভাইসের ধরন অন্তর্ভুক্ত করতে হবে।

হোম API-এ উপলব্ধ ডিভাইস প্রকারের সম্পূর্ণ তালিকার জন্য DeviceType ইন্টারফেস দেখুন।

একটি ডিভাইসের জন্য ভেন্ডর আইডি বা পণ্য আইডি পান

BasicInformation বৈশিষ্ট্যে বিক্রেতা আইডি, পণ্যের আইডি, পণ্যের নাম এবং একটি ডিভাইসের সিরিয়াল নম্বরের মতো তথ্য অন্তর্ভুক্ত থাকে:

// Get device basic information. All general information traits are on the RootNodeDevice type.
val basicInformation = device.type(RootNodeDevice).first().standardTraits.basicInformation!!
println("vendorName ${basicInformation.vendorName}")
println("vendorId ${basicInformation.vendorId}")
println("productId ${basicInformation.productId}")

ক্লাউড-টু-ক্লাউড ডিভাইসগুলি সনাক্ত করুন

আপনি যদি একজন ডিভাইস নির্মাতা হন এবং Cloud-to-cloud ডিভাইস তৈরি করেন, তাহলে আপনার Cloud-to-cloud ডিভাইসগুলিকে BasicInformation বৈশিষ্ট্যের মাধ্যমে সনাক্ত করার জন্য, আপনি তাদের SYNC প্রতিক্রিয়াতে এই স্ট্রিং ক্ষেত্রগুলি অন্তর্ভুক্ত করতে পারেন:

  • কানেক্টিভিটি স্ট্যান্ডার্ডস অ্যালায়েন্স (CSA) জারি করা ভেন্ডর আইডি: "matterOriginalVendorId": "0xfff1",

  • একটি পণ্য শনাক্তকারী যা একটি বিক্রেতার একটি পণ্যকে অনন্যভাবে সনাক্ত করে: "matterOriginalProductId": "0x1234",

  • ডিভাইসের জন্য একটি অনন্য শনাক্তকারী, যা একটি প্রস্তুতকারক-নির্দিষ্ট পদ্ধতিতে তৈরি করা হয়: "matterUniqueId": "matter-device-id",

এই স্ট্রিং ক্ষেত্রগুলি প্রবেশ করার সময়, আপনার Matter ভেন্ডর এবং পণ্য আইডিগুলি ব্যবহার করুন যদি আপনার কাছে সেগুলি থাকে। আপনি যদি CSA সদস্য না হন এবং এই আইডিগুলি বরাদ্দ না করা হয় তবে আপনি matterOriginalVendorId এবং matterOriginalProductId ক্ষেত্রগুলি ফাঁকা রাখতে পারেন এবং শনাক্তকারী হিসাবে matterUniqueId প্রদান করতে পারেন৷

উদাহরণ SYNC প্রতিক্রিয়া এই ক্ষেত্রগুলির ব্যবহার দেখায়:

{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "agentUserId": "1836.15267389",
    "devices": [
      {
        "id": "456",
        "type": "action.devices.types.LIGHT",
        "traits": [
          "action.devices.traits.OnOff",
          "action.devices.traits.Brightness",
          "action.devices.traits.ColorSetting",
        ],
        "willReportState": true,
        "deviceInfo": { ... },
        "matterOriginalVendorId": "0xfff1",
        "matterOriginalProductId": "0x1234",
        "matterUniqueId": "matter-device-id",
        "otherDeviceIds": [
          {
            "deviceId": "local-device-id",
          }
        ]
      }
    ]
  }
}

আরও তথ্যের জন্য, Cloud-to-cloud SYNC ডকুমেন্টেশন দেখুন।

ডিভাইস এবং বৈশিষ্ট্য মেটাডেটা

হোম এপিআই-এর ডিভাইস এবং বৈশিষ্ট্যগুলির সাথে মেটাডেটা যুক্ত থাকে, যা একটি অ্যাপে ব্যবহারকারীর অভিজ্ঞতা পরিচালনা করতে সাহায্য করতে পারে।

হোম এপিআই-এর প্রতিটি বৈশিষ্ট্যে একটি sourceConnectivity বৈশিষ্ট্য রয়েছে, যেটিতে একটি বৈশিষ্ট্যের অনলাইন স্থিতি এবং স্থানীয়তা (স্থানীয় বা দূরবর্তী রাউটিং) সম্পর্কে তথ্য রয়েছে।

একটি ডিভাইসের প্রাথমিক ধরনের পান

কিছু ডিভাইস হোম API-এর মাধ্যমে একাধিক ডিভাইস প্রকার উপস্থাপন করতে পারে। ব্যবহারকারীরা তাদের ডিভাইসের জন্য একটি অ্যাপে উপযুক্ত বিকল্প (যেমন ডিভাইস নিয়ন্ত্রণ এবং প্রস্তাবিত অটোমেশন) দিয়ে উপস্থাপিত হয়েছে তা নিশ্চিত করতে, একটি ডিভাইসের জন্য প্রাথমিক ডিভাইসের ধরন কী তা পরীক্ষা করা কার্যকর।

প্রথমে, type() ব্যবহার করে ডিভাইসের প্রকার(গুলি) পান, তারপর প্রাথমিক প্রকারটি নির্ধারণ করুন:

val types = device.types().first()
val primaryType = types.first { it.metadata.isPrimaryType }

একটি বৈশিষ্ট্য অনলাইন আছে কিনা চেক করুন

একটি বৈশিষ্ট্যের সংযোগ পরীক্ষা করতে connectivityState() পদ্ধতি ব্যবহার করুন:

val onOffConnectivity = onOffTrait?.metadata?.sourceConnectivity?.connectivityState

ডিভাইসে ইন্টারনেট সংযোগ না থাকলে কিছু বৈশিষ্ট্য, সাধারণত Google smart home বৈশিষ্ট্য, অফলাইনে দেখাতে পারে। কারণ এই বৈশিষ্ট্যগুলি ক্লাউড-ভিত্তিক এবং স্থানীয় রাউটিং নেই৷

একটি ডিভাইসের জন্য সংযোগ পরীক্ষা করুন

একটি ডিভাইসের জন্য সংযোগ আসলে ডিভাইস প্রকার স্তরে চেক করা হয় কারণ কিছু ডিভাইস একাধিক ডিভাইস প্রকার সমর্থন করে। যে স্থিতি ফেরত দেওয়া হয়েছে সেটি হল সেই ডিভাইসের সমস্ত বৈশিষ্ট্যের জন্য সংযোগের অবস্থার সংমিশ্রণ।

val lightConnectivity = dimmableLightDevice.metadata.sourceConnectivity.connectivityState

কোনো ইন্টারনেট সংযোগ না থাকলে মিশ্র ডিভাইস প্রকারের ক্ষেত্রে PARTIALLY_ONLINE এর অবস্থা পরিলক্ষিত হতে পারে। স্থানীয় রাউটিংয়ের কারণে ম্যাটার স্ট্যান্ডার্ড বৈশিষ্ট্যগুলি এখনও অনলাইনে থাকতে পারে, তবে ক্লাউড-ভিত্তিক বৈশিষ্ট্যগুলি অফলাইন হবে৷

একটি বৈশিষ্ট্যের নেটওয়ার্ক রাউটিং পরীক্ষা করুন

হোম API-এ একটি বৈশিষ্ট্যের জন্য স্থানীয়তাও পাওয়া যায়। dataSourceLocality নির্দেশ করে যে বৈশিষ্ট্যটি দূরবর্তীভাবে (ক্লাউডের মাধ্যমে), স্থানীয়ভাবে (স্থানীয় হাবের মাধ্যমে), বা পিয়ার-টু-পিয়ার (সরাসরি ডিভাইস থেকে ডিভাইসে, হাব নয়)।

অজানা স্থানীয় মান UNSPECIFIED সম্ভব, উদাহরণস্বরূপ, যখন একটি অ্যাপ বুট হচ্ছে এবং ডিভাইস সংযোগের জন্য এখনও হাব বা সার্ভারে পৌঁছায়নি। এই ডিভাইসগুলি পৌঁছানো যায় না এবং কমান্ড বা ইভেন্ট থেকে মিথস্ক্রিয়া অনুরোধ ব্যর্থ হবে। এই জাতীয় ডিভাইসগুলি কীভাবে পরিচালনা করবেন তা নির্ধারণ করা ক্লায়েন্টের উপর নির্ভর করে।

val onOffLocality = onOffTrait?.metadata?.sourceConnectivity?.dataSourceLocality

একটি ডিভাইসের জন্য নেটওয়ার্ক রাউটিং পরীক্ষা করুন

সংযোগের মতো, স্থানীয়তা একটি ডিভাইসের প্রকার স্তরে পরীক্ষা করা হয়। ফিরে আসা রাজ্য হল সেই ডিভাইসের সমস্ত বৈশিষ্ট্যের জন্য স্থানীয়তার সংমিশ্রণ।

val lightLocality = dimmableLightDevice.metadata.sourceConnectivity.dataSourceLocality

PARTIALLY_ONLINE কানেক্টিভিটির মতো একই পরিস্থিতিতে MIXED এর অবস্থা পরিলক্ষিত হতে পারে: কিছু বৈশিষ্ট্য ক্লাউড-ভিত্তিক এবং অন্যগুলি স্থানীয়।

API তালিকা

একবার Home একটি উদাহরণ তৈরি হয়ে গেলে, নিম্নলিখিত ডিভাইস APIগুলি এটির মাধ্যমে অ্যাক্সেসযোগ্য:

API বর্ণনা
devices() Google অ্যাকাউন্টে সমস্ত কাঠামোর সমস্ত ডিভাইস পান৷ একটি HomeObjectsFlow ফেরত দেয় যা আরও পুনরুদ্ধার এবং ফিল্টারিং বিকল্প প্রদান করে।

একবার আপনার একটি HomeDevice হয়ে গেলে, নিম্নলিখিত APIগুলি এটির মাধ্যমে অ্যাক্সেসযোগ্য:

API বর্ণনা
allCandidates() ডিভাইস এবং এর বাচ্চাদের জন্য সমস্ত অটোমেশন প্রার্থী ফেরত দেয়।
candidates() ডিভাইসের জন্য সমস্ত অটোমেশন প্রার্থী ফেরত দেয়।
connectivityStateChanged সাম্প্রতিক সময়ে ডিভাইসের অবস্থা পরিবর্তিত হয়েছে।
events(event) একটি নির্দিষ্ট ইভেন্টের একটি প্রবাহ পায়।
events(trait) এই বৈশিষ্ট্য দ্বারা সমস্ত ইভেন্টের একটি প্রবাহ পায়।
events(traits) এই বৈশিষ্ট্যগুলি দ্বারা সমস্ত ইভেন্টের একটি প্রবাহ পায়৷
getSourceConnectivity(trait) একটি নির্দিষ্ট বৈশিষ্ট্যের জন্য মেটাডেটা পান। একটি SourceConnectivity প্রদান করে।
has(trait) বর্তমান অনুরোধকৃত বৈশিষ্ট্যটি ডিভাইস দ্বারা সমর্থিত কিনা তা পরীক্ষা করুন।
has(type) যদি ডিভাইসটি প্রদত্ত প্রকার সমর্থন করে।
id ডিভাইসের অনন্য সিস্টেম আইডি।
isInRoom যদি ডিভাইসটি একটি ঘরে থাকে।
isInStructure যদি ডিভাইসটি একটি কাঠামোর মধ্যে থাকে।
isMatterDevice যদি ডিভাইসটি Matter দ্বারা সমর্থিত হয়।
name ডিভাইসের ব্যবহারকারীর দেওয়া নাম।
room() ডিভাইসটি যে রুমে বরাদ্দ করা হয়েছে। একটি Room ফেরত দেয়।
roomId ডিভাইসটি যে রুমে বরাদ্দ করা হয়েছে তার আইডি। একটি Id ফেরত দেয়।
sourceConnectivity ডিভাইসের সোর্স কানেক্টিভিটি, ডিভাইসের বৈশিষ্ট্যের সমষ্টিগত কানেক্টিভিটি অবস্থা এবং নেটওয়ার্ক লোকেলিটি প্রতিনিধিত্ব করে।
structure() ডিভাইসটি যে কাঠামোতে বরাদ্দ করা হয়েছে। একটি Structure প্রদান করে।
structureId ডিভাইসটি যে কাঠামোর জন্য বরাদ্দ করা হয়েছে তার আইডি। একটি Id ফেরত দেয়।
type(type) প্রত্যক্ষ অ্যাক্সেসের জন্য জনবহুল বৈশিষ্ট্যের সাথে টাইপ সংজ্ঞা পান (যখন উপলব্ধ)। সর্বদা বৈশিষ্ট্যগুলির একটি আপ-টু-ডেট স্ন্যাপশট প্রদান করে।
types() ডিভাইসে উপলব্ধ সব ধরনের একটি তালিকা পান.