কোন বৈশিষ্ট্য কোন কমান্ড সমর্থন করে কিনা তা পরীক্ষা করুন
 সাপোর্টের মাধ্যমেও একটি trait কমান্ড পরীক্ষা করা যেতে পারে। এছাড়াও, trait-level supports ফাংশন ব্যবহার করে একটি নির্দিষ্ট ডিভাইসের জন্য একটি কমান্ড সমর্থিত কিনা তা পরীক্ষা করুন।
 উদাহরণস্বরূপ, একটি ডিভাইসের On/Off বৈশিষ্ট্যের toggle কমান্ড সমর্থন করে কিনা তা পরীক্ষা করার জন্য:
// Check if the OnOff trait supports the toggle command. if (onOffTrait.supports(OnOff.Command.Toggle)) { println("onOffTrait supports toggle command") } else { println("onOffTrait does not support stateful toggle command") }
একটি ডিভাইসে একটি কমান্ড পাঠান
 কমান্ড পাঠানো একটি trait থেকে একটি state attribute পড়ার অনুরূপ। ডিভাইসটি চালু বা বন্ধ করতে, OnOff trait এর Toggle কমান্ড ব্যবহার করুন, যা Google Home ইকোসিস্টেম ডেটা মডেলে toggle() হিসাবে সংজ্ঞায়িত করা হয়েছে। এই পদ্ধতিটি onOff true হলে false এ পরিবর্তন করে, অথবা false হলে true এ পরিবর্তন করে:
// Calling a command on a trait. try { onOffTrait.toggle() } catch (e: HomeException) { // Code for handling the exception }
 সকল trait কমান্ড হল suspend functions এবং শুধুমাত্র API দ্বারা প্রতিক্রিয়া ফেরত পাঠানো হলে (যেমন ডিভাইসের অবস্থা পরিবর্তিত হয়েছে কিনা তা নিশ্চিত করা) সম্পূর্ণ হয়। এক্সিকিউশন ফ্লোতে কোনও সমস্যা ধরা পড়লে কমান্ডগুলি একটি ব্যতিক্রম ফেরত দিতে পারে। একজন ডেভেলপার হিসেবে, এই ব্যতিক্রমগুলি সঠিকভাবে পরিচালনা করার জন্য এবং ত্রুটিগুলি কার্যকর করার ক্ষেত্রে ব্যবহারকারীদের কাছে বিস্তারিত তথ্য প্রকাশ করার জন্য আপনার একটি try-catch ব্লক ব্যবহার করা উচিত। হ্যান্ডেল না করা ব্যতিক্রমগুলি অ্যাপের রানটাইম বন্ধ করে দেবে এবং এর ফলে আপনার অ্যাপ ক্র্যাশ হতে পারে।
 বিকল্পভাবে, স্পষ্টভাবে অবস্থা সেট করতে off() অথবা on() কমান্ড ব্যবহার করুন:
onOffTrait.off() onOffTrait.on()
অবস্থা পরিবর্তন করার জন্য একটি কমান্ড পাঠানোর পর, এটি সম্পূর্ণ হয়ে গেলে আপনি আপনার অ্যাপে এটি পরিচালনা করার জন্য Read a device state এ বর্ণিত অবস্থাটি পড়তে পারবেন। বিকল্পভাবে, Observe state এ বর্ণিত প্রবাহগুলি ব্যবহার করুন, যা পছন্দের পদ্ধতি।
প্যারামিটার সহ একটি কমান্ড পাঠান
 কিছু কমান্ড প্যারামিটার ব্যবহার করতে পারে, যেমন OnOff বা LevelControl বৈশিষ্ট্যের ক্ষেত্রে: 
অফউইথইফেক্ট
// Turn off the light using the DyingLight effect. onOffTrait.offWithEffect( effectIdentifier = OnOffTrait.EffectIdentifierEnum.DyingLight, effectVariant = 0u, )
মুভটুলেভেল
// Change the brightness of the light to 50% levelControlTrait.moveToLevel( level = 127u.toUByte(), transitionTime = null, optionsMask = LevelControlTrait.OptionsBitmap(), optionsOverride = LevelControlTrait.OptionsBitmap(), )
কিছু কমান্ডের ঐচ্ছিক আর্গুমেন্ট থাকে, যা প্রয়োজনীয় আর্গুমেন্টের পরে আসে।
 উদাহরণস্বরূপ, FanControl বৈশিষ্ট্যের জন্য step কমান্ডে দুটি ঐচ্ছিক আর্গুমেন্ট রয়েছে:
val fanControlTraitFlow: Flow<FanControl?> = device.type(FanDevice).map { it.standardTraits.fanControl }.distinctUntilChanged() val fanControl = fanControlTraitFlow.firstOrNull() // Calling a command with optional parameters not set. fanControl?.step(direction = FanControlTrait.StepDirectionEnum.Increase) // Calling a command with optional parameters. fanControl?.step(direction = FanControlTrait.StepDirectionEnum.Increase) { wrap = true }
একটি বৈশিষ্ট্য একটি বৈশিষ্ট্য সমর্থন করে কিনা তা পরীক্ষা করুন
 কিছু ডিভাইস Matter বৈশিষ্ট্য সমর্থন করতে পারে, কিন্তু নির্দিষ্ট বৈশিষ্ট্য নয়। উদাহরণস্বরূপ, Matter সাথে ম্যাপ করা একটি Cloud-to-cloud ডিভাইস প্রতিটি Matter বৈশিষ্ট্য সমর্থন নাও করতে পারে। এই ধরণের ক্ষেত্রে পরিচালনা করার জন্য, বৈশিষ্ট্য-স্তরের supports ফাংশন এবং বৈশিষ্ট্যের Attribute enum ব্যবহার করে পরীক্ষা করুন যে বৈশিষ্ট্যটি কোনও নির্দিষ্ট ডিভাইসের জন্য সমর্থিত কিনা।
 উদাহরণস্বরূপ, একটি ডিভাইসের On/Off বৈশিষ্ট্যের onOff বৈশিষ্ট্যের সমর্থন পরীক্ষা করার জন্য:
// Check if the OnOff trait supports the onOff attribute. if (onOffTrait.supports(OnOff.Attribute.onOff)) { println("onOffTrait supports onOff state") } else { println("onOffTrait is for a command only device!") }
 Matter স্পেসিফিকেশন অথবা Cloud-to-cloud smart home স্কিমায় কিছু অ্যাট্রিবিউট বাতিলযোগ্য। এই অ্যাট্রিবিউটের জন্য, আপনি supports ছাড়াও isNullable ব্যবহার করে নির্ধারণ করতে পারেন যে অ্যাট্রিবিউট দ্বারা ফেরত আসা null ডিভাইসটি সেই মানটি রিপোর্ট না করার কারণে হয়েছে কিনা, অথবা অ্যাট্রিবিউটের মান আসলে null কিনা:
// Check if a nullable attribute is set or is not supported. if (onOffTrait.supports(OnOff.Attribute.startUpOnOff)) { // The device supports startupOnOff, it is safe to expect this value in the trait. if (OnOff.Attribute.startUpOnOff.isNullable && onOffTrait.startUpOnOff == null) { // This value is nullable and set to null. Check the specification as to // what null in this case means println("onOffTrait supports startUpOnOff and it is null") } else { // This value is nullable and set to a value. println("onOffTrait supports startUpOnOff and it is set to ${onOffTrait.startUpOnOff}") } } else { println("onOffTrait does not support startUpOnOff!") }
বৈশিষ্ট্য বৈশিষ্ট্য আপডেট করুন
যদি আপনি কোন প্রদত্ত বৈশিষ্ট্যের মান পরিবর্তন করতে চান, এবং বৈশিষ্ট্যের কোন কমান্ড তা না করে, তাহলে বৈশিষ্ট্যটি তার মান স্পষ্টভাবে সেট করা সমর্থন করতে পারে।
কোনও বৈশিষ্ট্যের মান পরিবর্তন করা যাবে কিনা তা দুটি বিষয়ের উপর নির্ভর করে:
- বৈশিষ্ট্যটি কি লেখা যায়?
- একটি trait কমান্ড পাঠানোর পার্শ্ব প্রতিক্রিয়া হিসেবে কি অ্যাট্রিবিউটের মান পরিবর্তন হতে পারে?
বৈশিষ্ট্য এবং তাদের বৈশিষ্ট্যের জন্য রেফারেন্স ডকুমেন্টেশন এই তথ্য প্রদান করে।
অতএব, বৈশিষ্ট্যের সমন্বয় যা একটি বৈশিষ্ট্যের মান কীভাবে পরিবর্তন করা যেতে পারে তা নির্দেশ করে:
- শুধুমাত্র পঠনযোগ্য এবং অন্যান্য কমান্ড দ্বারা প্রভাবিত হয় না । এর অর্থ হল অ্যাট্রিবিউটের মান পরিবর্তন হয় না। উদাহরণস্বরূপ, - Switchবৈশিষ্ট্যের- currentPositionবৈশিষ্ট্য ।
- শুধুমাত্র পঠনযোগ্য এবং অন্যান্য কমান্ড দ্বারা প্রভাবিত । এর অর্থ হল, কেবলমাত্র কমান্ড পাঠানোর ফলেই অ্যাট্রিবিউটের মান পরিবর্তন হতে পারে। উদাহরণস্বরূপ, - LevelControlMatter বৈশিষ্ট্যের- currentLevelবৈশিষ্ট্যটি শুধুমাত্র পঠনযোগ্য, তবে এর মান- moveToLevelএর মতো কমান্ড দ্বারা পরিবর্তিত হতে পারে।
- লেখা যায় এবং অন্যান্য কমান্ড দ্বারা প্রভাবিত হয় না । এর মানে হল আপনি বৈশিষ্ট্যের - updateফাংশন ব্যবহার করে সরাসরি বৈশিষ্ট্যের মান পরিবর্তন করতে পারেন, কিন্তু এমন কোনও কমান্ড নেই যা বৈশিষ্ট্যের মানকে প্রভাবিত করবে। উদাহরণস্বরূপ,- DoorLockবৈশিষ্ট্যের- WrongCodeEntryLimitবৈশিষ্ট্য ।
- লেখা যায় এবং অন্যান্য কমান্ড দ্বারা প্রভাবিত হয় । এর মানে হল আপনি trait এর - updateফাংশন ব্যবহার করে সরাসরি অ্যাট্রিবিউটের মান পরিবর্তন করতে পারেন, এবং কমান্ড পাঠানোর ফলে অ্যাট্রিবিউটের মান পরিবর্তন হতে পারে। উদাহরণস্বরূপ,- FanControlTraitএর- speedSettingঅ্যাট্রিবিউট সরাসরি লেখা যেতে পারে, তবে- stepকমান্ড ব্যবহার করে পরিবর্তনযোগ্যও।
একটি বৈশিষ্ট্যের মান পরিবর্তন করতে আপডেট ফাংশন ব্যবহারের উদাহরণ
 এই উদাহরণে DoorLockTrait.WrongCodeEntryLimit অ্যাট্রিবিউটের মান কীভাবে স্পষ্টভাবে সেট করতে হয় তা দেখানো হয়েছে।
 একটি অ্যাট্রিবিউট মান সেট করতে, trait এর update ফাংশনটি কল করুন এবং এটিকে একটি mutator ফাংশন পাস করুন যা নতুন মান সেট করে। প্রথমে যাচাই করা একটি ভালো অভ্যাস যে trait একটি অ্যাট্রিবিউট সমর্থন করে ।
উদাহরণস্বরূপ:
val doorLockDevice = home.devices().list().first { device -> device.has(DoorLock) } val traitFlow: Flow<DoorLock?> = doorLockDevice.type(DoorLockDevice).map { it.standardTraits.doorLock }.distinctUntilChanged() val doorLockTrait: DoorLock = traitFlow.first()!! if (doorLockTrait.supports(DoorLock.Attribute.wrongCodeEntryLimit)) { val unused = doorLockTrait.update { setWrongCodeEntryLimit(3u) } }
একসাথে একাধিক কমান্ড পাঠান
ব্যাচিং এপিআই একটি ক্লায়েন্টকে একটি একক পেলোডে একাধিক হোম এপিআই ডিভাইস কমান্ড পাঠাতে দেয়। কমান্ডগুলি একটি একক পেলোডে ব্যাচ করা হয় এবং সমান্তরালভাবে কার্যকর করা হয়, যেমন প্যারালাল নোড ব্যবহার করে হোম এপিআই অটোমেশন তৈরি করা যেতে পারে, যেমন সূর্যোদয়ের আগে খোলা ব্লাইন্ডস উদাহরণ। তবে, ব্যাচিং এপিআই অটোমেশন এপিআইয়ের তুলনায় আরও জটিল এবং পরিশীলিত আচরণের অনুমতি দেয়, যেমন যেকোনো মানদণ্ড অনুসারে রানটাইমে ডিভাইসগুলি গতিশীলভাবে নির্বাচন করার ক্ষমতা।
এক ব্যাচের কমান্ডগুলি একাধিক ডিভাইসে, একাধিক কক্ষে, একাধিক কাঠামোতে একাধিক বৈশিষ্ট্যকে লক্ষ্য করতে পারে।
একটি ব্যাচে কমান্ড পাঠানোর মাধ্যমে ডিভাইসগুলি একই সাথে কাজ করতে পারে, যা আসলে সম্ভব নয় যখন কমান্ডগুলি পৃথক অনুরোধে ক্রমানুসারে পাঠানো হয়। ব্যাচড কমান্ড ব্যবহার করে অর্জিত আচরণ ডেভেলপারকে একটি পূর্বনির্ধারিত সমষ্টিগত অবস্থার সাথে মেলে ডিভাইসের একটি গ্রুপের অবস্থা সেট করতে দেয়।
ব্যাচিং এপিআই ব্যবহার করুন
ব্যাচিং এপিআই-এর মাধ্যমে কমান্ড আহ্বান করার ক্ষেত্রে তিনটি মৌলিক ধাপ জড়িত:
-  Home.sendBatchedCommands()পদ্ধতিটি ব্যবহার করুন।
-  sendBatchedCommands()ব্লকের বডির মধ্যে, ব্যাচে অন্তর্ভুক্ত করার জন্য কমান্ডগুলি নির্দিষ্ট করুন।
- প্রেরিত কমান্ডগুলির ফলাফল পরীক্ষা করে দেখুন যে সেগুলি সফল হয়েছে নাকি ব্যর্থ হয়েছে।
sendBatchedCommands() পদ্ধতিটি চালু করুন।
 Home.sendBatchedCommands() পদ্ধতিটি কল করুন। পর্দার আড়ালে, এই পদ্ধতিটি একটি বিশেষ ব্যাচ প্রসঙ্গে একটি ল্যাম্বডা এক্সপ্রেশন সেট আপ করে। 
home.sendBatchedCommands() {
ব্যাচ কমান্ড নির্দিষ্ট করুন
 sendBatchedCommands() ব্লকের বডির মধ্যে, batchable কমান্ডগুলি পূরণ করুন। Batchable কমান্ডগুলি বিদ্যমান Device API কমান্ডের "shadow" সংস্করণ যা একটি ব্যাচ প্রসঙ্গে ব্যবহার করা যেতে পারে এবং Batchable প্রত্যয় যুক্ত করে নামকরণ করা হয়। উদাহরণস্বরূপ, LevelControl বৈশিষ্ট্যের moveToLevel() কমান্ডের একটি প্রতিরূপ রয়েছে যার নাম moveToLevelBatchable() ।
উদাহরণ:
  val response1 = add(command1)
  val response2 = add(command2)
ব্যাচের প্রসঙ্গে সমস্ত কমান্ড যোগ করা হয়ে গেলে এবং এক্সিকিউশন প্রসঙ্গ ছেড়ে গেলে ব্যাচটি স্বয়ংক্রিয়ভাবে পাঠানো হয়।
 উত্তরগুলি DeferredResponse<T> অবজেক্টে ক্যাপচার করা হয়।
 DeferredResponse<T> ইনস্ট্যান্সগুলি যেকোনো ধরণের অবজেক্টে সংগ্রহ করা যেতে পারে, যেমন Collection , অথবা আপনার সংজ্ঞায়িত ডেটা ক্লাস। আপনি যে ধরণের অবজেক্টই রেসপন্স একত্রিত করতে চান না কেন, sendBatchedCommands() দ্বারা তা ফেরত পাঠানো হয়। উদাহরণস্বরূপ, ব্যাচ কনটেক্সট একটি Pair এ দুটি DeferredResponse ইনস্ট্যান্স ফেরত দিতে পারে: 
  val (response1, response2) = homeClient.sendBatchedComamnds {
    val response1 = add(someCommandBatched(...))
    val response2 = add(someOtherCommandBatched(...))
    Pair(response1, response2)
  }
অন্যথায়, ব্যাচ কনটেক্সট একটি কাস্টম ডেটা ক্লাসে DeferredResponse ইনস্ট্যান্সগুলি ফেরত দিতে পারে: 
  // Custom data class
  data class SpecialResponseHolder(
    val response1: DeferredResponse<String>,
    val response2: DeferredResponse<Int>,
    val other: OtherResponses
  )
  data class OtherResponses(...)
প্রতিটি প্রতিক্রিয়া পরীক্ষা করুন
 sendBatchedCommands() ব্লকের বাইরে, সংশ্লিষ্ট কমান্ডটি সফল হয়েছে নাকি ব্যর্থ হয়েছে তা নির্ধারণ করতে প্রতিক্রিয়াগুলি পরীক্ষা করুন। এটি DeferredResponse.getOrThrow() কল করে করা হয়, যা হয়: - কার্যকর করা কমান্ডের ফলাফল ফেরত দেয়, - অথবা, যদি ব্যাচ স্কোপটি সম্পূর্ণ না হয় বা কমান্ডটি ব্যর্থ হয়, তাহলে একটি ত্রুটি ছুঁড়ে দেয়।
 আপনার শুধুমাত্র sendBatchedCommands() ল্যাম্বডা স্কোপের বাইরে ফলাফল পরীক্ষা করা উচিত।
উদাহরণ
ধরুন আপনি এমন একটি অ্যাপ তৈরি করতে চান যা ব্যাচিং এপিআই ব্যবহার করে একটি 'শুভ রাত্রি' দৃশ্য সেট আপ করে যা বাড়ির সমস্ত ডিভাইসকে রাতের বেলার জন্য কনফিগার করে, যখন সবাই ঘুমিয়ে থাকে। এই অ্যাপটি লাইট নিভিয়ে দেবে এবং সামনের এবং পিছনের দরজা লক করবে।
কাজটি সম্পন্ন করার একটি উপায় এখানে দেওয়া হল:
val lightDevices: List<OnOffLightDevice>
val doorlockDevices: List<DoorLockDevice>
// Send all the commands
val responses: List<DeferredResponse<Unit>> = home.sendBatchedCommands {
  // For each light device, send a Batchable command to turn it on
  val lightResponses: List<DeferredResponse<Unit>> = lightDevices.map { lightDevice ->
    add(lightDevice.standardTraits.onOff.onBatchable())
  }
  // For each doorlock device, send a Batchable command to lock it
  val doorLockResponse: List<DeferredResponse<Unit>> = doorlockDevices.map { doorlockDevice ->
    add(doorlockDevice.standardTraits.doorLock.lockDoorBatchable())
  }
  lightResponses + doorLockResponses
}
// Check that all responses were successful
for (response in responses) {
  response.getOrThrow()
}