কোনও কমান্ডের ক্ষেত্রে কোনও বৈশিষ্ট্য কাজ করে কিনা তা চেক করুন
এছাড়াও, কোনও ট্রেট কমান্ডের জন্য সাপোর্ট চেক করা যেতে পারে। এছাড়াও, কোনও নির্দিষ্ট ডিভাইসের জন্য কোনও কমান্ড কাজ করে কিনা তা চেক করতে, ট্রেট-লেভেল
supports ফাংশন ব্যবহার করুন।
যেমন, কোনও ডিভাইসে চালু/বন্ধ করার বৈশিষ্ট্য
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") }
ডিভাইসে কমান্ড পাঠানো
কমান্ড পাঠানো হল কোনও ট্রেট থেকে স্টেট অ্যাট্রিবিউট পড়ার মতো। ডিভাইস
চালু বা বন্ধ করতে, OnOff
টগল কমান্ডের বৈশিষ্ট্য ব্যবহার করুন, যা Google Home ইকোসিস্টেম ডেটা মডেলে toggle() হিসেবে
সংজ্ঞায়িত করা হয়েছে। এই পদ্ধতি onOff-কে false-এ পরিবর্তন করে যদি এটি true হয়, অথবা
true-এ পরিবর্তন করে যদি এটি false হয়:
// Calling a command on a trait. try { onOffTrait.toggle() } catch (e: HomeException) { // Code for handling the exception }
সব ট্রেট কমান্ড হল suspend ফাংশন এবং API-এর মাধ্যমে কোনও উত্তর
ফেরত পাঠানো হলে তবেই তা সম্পূর্ণ হয় (যেমন, ডিভাইসের স্ট্যাটাস পরিবর্তন হয়েছে কিনা তা কনফার্ম করা)।
এক্সিকিউশন ফ্লোতে কোনও সমস্যা শনাক্ত করা হলে, কমান্ডের ক্ষেত্রে ব্যতিক্রম দেখা যেতে পারে। ডেভেলপার হিসেবে, এইসব ব্যতিক্রম সঠিকভাবে ম্যানেজ করতে আপনার try-catch ব্লক ব্যবহার করা উচিত এবং
যেসব ক্ষেত্রে সমস্যার সমাধান করা সম্ভব, সেখানে ব্যবহারকারীদের বিস্তারিত তথ্য দেখানো উচিত। হ্যান্ডেল না করা ব্যতিক্রম অ্যাপ রানটাইম বন্ধ করে দেবে এবং
এর ফলে আপনার অ্যাপ ক্র্যাশ করতে পারে।
অন্যথায়, স্পষ্টভাবে স্ট্যাটাস সেট করতে off() বা on() কমান্ড ব্যবহার করুন:
onOffTrait.off() onOffTrait.on()
স্ট্যাটাস পরিবর্তন করার জন্য কমান্ড পাঠানোর পরে, এটি সম্পূর্ণ হলে, আপনার অ্যাপে এটি ম্যানেজ করার জন্য ডিভাইসের স্ট্যাটাস পড়ুন-এ যেভাবে বর্ণনা করা হয়েছে সেইভাবে আপনি স্ট্যাটাস পড়তে পারবেন। বিকল্প হিসেবে, স্ট্যাটাস পর্যবেক্ষণ করুন-এ যেভাবে বর্ণনা করা হয়েছে সেইভাবে ফ্লো ব্যবহার করুন, এটি হল পছন্দের পদ্ধতি।
প্যারামিটার সহ কমান্ড পাঠান
কিছু কমান্ড প্যারামিটার ব্যবহার করতে পারে, যেমন
OnOff বা
LevelControl
ট্রেটে থাকা প্যারামিটার:
offWithEffect
// Turn off the light using the DyingLight effect. onOffTrait.offWithEffect( effectIdentifier = OnOffTrait.EffectIdentifierEnum.DyingLight, effectVariant = 0u, )
moveToLevel
// 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-এর সব অ্যাট্রিবিউট
কাজ নাও করতে পারে। এই ধরনের কেস ম্যানেজ করতে,
নির্দিষ্ট ডিভাইসের জন্য অ্যাট্রিবিউট কাজ করে কিনা তা চেক করতে, trait-লেভেল supports ফাংশন এবং trait-এর Attribute enum ব্যবহার করুন।
যেমন, কোনও ডিভাইসে চালু/বন্ধ করার বৈশিষ্ট্য
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 স্কিমায় কিছু অ্যাট্রিবিউট নালেবেল। এইসব অ্যাট্রিবিউটের ক্ষেত্রে,
আপনি নির্ধারণ করতে পারবেন যে অ্যাট্রিবিউটের মাধ্যমে রিটার্ন করা null
ডিভাইস সেই ভ্যালু রিপোর্ট না করার কারণে হয়েছে নাকি অ্যাট্রিবিউটের ভ্যালু
আসলে null, supports-এর সাথে isNullable ব্যবহার করে:
// 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!") }
বৈশিষ্ট্যের অ্যাট্রিবিউট আপডেট করুন
আপনি যদি কোনও অ্যাট্রিবিউটের ভ্যালু পরিবর্তন করতে চান এবং কোনও ট্রেটের কমান্ড যদি তা না করে, তাহলে অ্যাট্রিবিউটটি তার ভ্যালু স্পষ্টভাবে সেট করার সুবিধা দিতে পারে।
কোনও অ্যাট্রিবিউটের ভ্যালু পরিবর্তন করা যাবে কিনা তা দুটি বিষয়ের উপর নির্ভর করে:
- অ্যাট্রিবিউট কি রাইট করা যাবে?
- Can the value of the attribute change as a side effect of sending a trait command?
বৈশিষ্ট্য ও তাদের অ্যাট্রিবিউটের জন্য রেফারেন্স ডকুমেন্টেশন এই তথ্য প্রদান করে।
তাই, কোনও অ্যাট্রিবিউটের ভ্যালু কীভাবে পরিবর্তন করা যেতে পারে তা নির্ধারণ করে এমন প্রপার্টির কম্বিনেশনগুলি হল:
শুধুমাত্র পড়া যায় এবং অন্যান্য কমান্ডের মাধ্যমে প্রভাবিত হয় না। এর অর্থ হল, অ্যাট্রিবিউটের মান পরিবর্তন হয় না। যেমন,
Switchবৈশিষ্ট্যেরcurrentPositionঅ্যাট্রিবিউট।রিড-অনলি এবং অন্যান্য কমান্ডের মাধ্যমে প্রভাবিত। এর অর্থ হল, অ্যাট্রিবিউটের ভ্যালু পরিবর্তন করার একমাত্র উপায় হল কমান্ড পাঠানো। যেমন,
currentLevelঅ্যাট্রিবিউটLevelControlMatter ট্রেইট শুধুমাত্র পড়া যায়, তবে এর ভ্যালুmoveToLevel-এর মতো কমান্ডের মাধ্যমে পরিবর্তন করা যেতে পারে।অন্যান্য কমান্ডের মাধ্যমে লেখা যায় এবং প্রভাবিত হয় না। এর অর্থ হল, আপনি বৈশিষ্ট্যের
updateফাংশন ব্যবহার করে সরাসরি অ্যাট্রিবিউটের ভ্যালু পরিবর্তন করতে পারবেন, তবে এমন কোনও কমান্ড নেই যা অ্যাট্রিবিউটের ভ্যালুকে প্রভাবিত করবে। যেমন,DoorLockবৈশিষ্ট্যেরWrongCodeEntryLimitঅ্যাট্রিবিউট।অন্যান্য কমান্ডের মাধ্যমে লেখা যায় এবং প্রভাবিত হয়। এর অর্থ হল, আপনি ট্রেইটের
updateফাংশন ব্যবহার করে সরাসরি অ্যাট্রিবিউটের মান পরিবর্তন করতে পারবেন এবং কমান্ড পাঠানোর ফলে অ্যাট্রিবিউটের মান পরিবর্তন হতে পারে। যেমন,FanControlTrait-এরspeedSettingঅ্যাট্রিবিউট সরাসরি লেখা যেতে পারে, তবেstepকমান্ড ব্যবহার করেও পরিবর্তন করা যেতে পারে।
কোনও অ্যাট্রিবিউটের ভ্যালু পরিবর্তন করার জন্য আপডেট ফাংশন ব্যবহার করার উদাহরণ
এই উদাহরণে দেখানো হয়েছে কীভাবে
DoorLockTrait.WrongCodeEntryLimit অ্যাট্রিবিউটের ভ্যালু স্পষ্টভাবে সেট করতে হয়।
অ্যাট্রিবিউট ভ্যালু সেট করতে, ট্রেইটের update ফাংশন কল করুন এবং এটিকে একটি মিউটেটর ফাংশন পাস করুন যা নতুন ভ্যালু সেট করে।
প্রথমে বৈশিষ্ট্যটি কোনও অ্যাট্রিবিউটকে সাপোর্ট করে কিনা তা যাচাই করা
একটি ভালো অভ্যাস।
যেমন:
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) } }
একসাথে একাধিক কমান্ড পাঠান
ব্যাচিং API কোনও ক্লায়েন্টকে একটি পেলোডে একাধিক Home API ডিভাইস কমান্ড পাঠানোর অনুমতি দেয়। কমান্ডগুলি একটি একক পেলোডে ব্যাচ করা হয় এবং সমান্তরালভাবে কার্যকর করা হয়, যেমন কেউ Home API অটোমেশন প্যারালাল নোড ব্যবহার করে তৈরি করতে পারে, যেমন সূর্যোদয়ের আগে ব্লাইন্ড খুলুন উদাহরণ। তবে, ব্যাচিং API, অটোমেশন API-এর চেয়ে আরও জটিল ও অত্যাধুনিক আচরণ করার অনুমতি দেয়, যেমন রানটাইমে যেকোনও মাপকাঠি অনুযায়ী ডায়নামিকভাবে ডিভাইস বেছে নেওয়ার ক্ষমতা।
একটি ব্যাচের কমান্ড একাধিক ডিভাইসের একাধিক বৈশিষ্ট্য, একাধিক রুম, একাধিক স্ট্রাকচারকে টার্গেট করতে পারে।
ব্যাচে কমান্ড পাঠালে ডিভাইসগুলি একই সাথে অ্যাকশন পারফর্ম করতে পারে, যা আলাদা আলাদা অনুরোধে ক্রমানুসারে কমান্ড পাঠানো হলে আসলে সম্ভব নয়। ব্যাচ করা কমান্ড ব্যবহার করে যে আচরণ পাওয়া যায় তা ডেভেলপারকে একটি পূর্বনির্ধারিত সামগ্রিক অবস্থার সাথে মিল রেখে ডিভাইসের একটি গ্রুপের অবস্থা সেট করার অনুমতি দেয়।
ব্যাচিং API ব্যবহার করুন
Batching API-এর মাধ্যমে কমান্ড ইনভোক করার তিনটি প্রাথমিক ধাপ আছে:
Home.sendBatchedCommands()মেথড ইনভোক করুন।sendBatchedCommands()ব্লকের বডিতে, ব্যাচে অন্তর্ভুক্ত করার জন্য কমান্ড নির্দিষ্ট করুন।- পাঠানো কমান্ডের ফলাফল চেক করে দেখুন যে সেগুলি সফল হয়েছে নাকি ব্যর্থ হয়েছে।
ব্যাচ করা কমান্ড পাঠান
Home.sendBatchedCommands()
মেথড কল করুন। পর্দার আড়ালে, এই পদ্ধতিটি একটি বিশেষ ব্যাচ প্রসঙ্গে একটি ল্যাম্বডা এক্সপ্রেশন সেট আপ করে।
home.sendBatchedCommands() {
ব্যাচ কমান্ড উল্লেখ করুন
sendBatchedCommands() ব্লকের বডিতে ব্যাচ করা যায় এমন কমান্ড
পপুলেট করুন। ব্যাচ করা যায় এমন কমান্ড হল আগে থেকে থাকা ডিভাইস API কমান্ডের "শ্যাডো" ভার্সন
যা ব্যাচ প্রসঙ্গে ব্যবহার করা যেতে পারে এবং এগুলির নাম 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()
ল্যাম্বডা স্কোপের বাইরে ফলাফল চেক করতে হবে।
উদাহরণ
ধরুন, আপনি এমন একটি অ্যাপ তৈরি করতে চান যা Batching API ব্যবহার করে 'শুভ রাত্রি' সিন সেট-আপ করে। এই সিনটি রাতের জন্য বাড়ির সব ডিভাইস কনফিগার করে, যখন সবাই ঘুমিয়ে থাকে। এই অ্যাপের মাধ্যমে আলো বন্ধ করা এবং সামনের ও পিছনের দরজা লক করা উচিত।
টাস্কটি করার একটি উপায় এখানে দেওয়া হল:
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()
}
ডিভাইস গ্রুপ নিয়ন্ত্রণ করা
মেম্বার ডিভাইসের মাধ্যমে
পুনরাবৃত্তি করে গ্রুপের প্রতিটি মেম্বারের উপর সূক্ষ্ম কন্ট্রোল ছাড়াও,
আপনি একটি
DeviceGroup-কে একটি এন্টিটি হিসেবে
কন্ট্রোল করতে পারবেন। DeviceGroup PartsProvider ইন্টারফেস
প্রয়োগ করে, যা গ্রুপের ডিভাইসে কাজ করে এমন
DeviceType অংশ দেখায়:
group.parts()গ্রুপে উপস্থিত সব ধরনের ডিভাইসেরFlow<Set<DeviceType>>রিটার্ন করে।group.part()এবংgroup.partOrNull()নির্দিষ্ট ডিভাইস টাইপের জন্য ফ্লো রিটার্ন করে, যেমনOnOffLightDeviceবাDimmableLightDevice।
আপনি DeviceGroup-এর অংশ হিসেবে কোনও ডিভাইস টাইপে ট্রেট কমান্ড ইনভোক করলে, SDK গ্রুপের সেইসব সংশ্লিষ্ট মেম্বার ডিভাইসে কমান্ড রিলে করে যেগুলি
সেই ক্ষমতাকে সাপোর্ট করে, তাদের অন্তর্নিহিত কানেক্টিভিটি বা
ট্রান্সপোর্ট (যেমন Matter বা Cloud-to-cloud) যাই হোক না কেন।
গ্রুপ পার্ট ট্রেট অ্যাট্রিবিউট ও সমস্যা সমাধান
গ্রুপের কোনও অংশকে টার্গেট করলে, সাধারণ ক্ষেত্রে কাজ সহজ হয়ে যায়। যেমন, আপনি কোনও গ্রুপে
আইডেমপোটেন্ট কমান্ড (যেমন, আলো জ্বালানো বা নেভানো অথবা উজ্জ্বলতার লেভেল সেট করা)
পাঠাতে চান। DeviceGroup
পার্টে ট্রেট ও কমান্ড নিয়ে কাজ করার সময়, নিম্নলিখিত আচরণগুলি মনে রাখবেন:
- ডায়নামিক স্টেট অ্যাট্রিবিউট (যেমন
OnOffট্রেটেরonOffঅ্যাট্রিবিউট বাLevelControlট্রেটেরcurrentLevelঅ্যাট্রিবিউট) সাধারণত গ্রুপের কোনও অংশের ট্রেটে পপুলেট করা হয় না কারণ গ্রুপের মেম্বার ডিভাইসগুলি বিভিন্ন স্টেটে থাকতে পারে যেগুলি একটিমাত্র ভ্যালুতে কম্বাইন করা যায় না। তবে, কাজ করে এমন কমান্ড (supports()-এর মাধ্যমে চেক করা, যেমনLevelControl.Command.MoveToLevelWithOnOffডিম করা যায় এমন লাইটে) এবং বেছে নেওয়া ক্ষমতার অ্যাট্রিবিউট (যেমনcolorTempPhysicalMinMiredsএবংcolorTempPhysicalMaxMiredsColorControl-এ রঙিন লাইটের জন্য) পপুলেট করা হয় যাতে আপনার অ্যাপ UI কন্ট্রোল সঠিকভাবে কনফিগার করতে পারে। - গ্রুপের মেম্বারদের বৈশিষ্ট্যের উপর সব কমান্ড গ্রুপের অংশে উপলভ্য নয়। বিশেষ করে, যেসব কমান্ড ভ্যালু রিটার্ন করে সেগুলি উপলভ্য নয়।
- গ্রুপের কোনও অংশে কমান্ড দিলে, তার মধ্যে থাকা প্রতিটি মেম্বার ডিভাইসের কমান্ডের জন্য আলাদা আলাদা ফলাফল পাওয়া যায় না। এক একটি কমান্ডের ফলাফল পরীক্ষা করতে বা ভ্যালু রিটার্ন করে এমন কমান্ড কল করতে, সরাসরি গ্রুপের মেম্বার ডিভাইসগুলির মাধ্যমে ইটারেট করুন।
DeviceGroup-এর কোনও অংশে পাঠানো কমান্ড তখনই সম্পূর্ণ হয় যখন মেম্বার ডিভাইস জুড়ে সম্পূর্ণ ফ্যানআউট শেষ হয় এবং সমস্ত অন্তর্নিহিত কমান্ডের সাফল্য বা ব্যর্থতা সংগ্রহ করা হয়। কোনও কমান্ড তখনই ব্যর্থ হয় (একটিHomeExceptionদেখায়) যদি কমান্ডটি প্রতিটি সংশ্লিষ্ট মেম্বার ডিভাইসের জন্য ব্যর্থ হয় বা যদি সমস্ত টার্গেট ডিভাইস অনুপলভ্য থাকে, যা সিঙ্গেল-কমান্ড কল সিনট্যাক্সের সাথে মিলে যাওয়া সিঙ্গেল কমান্ড ব্যর্থতা হিসেবে দেখা যায়। অন্তত একটি মেম্বার ডিভাইস কমান্ডটি কার্যকর করলে, গ্রুপ কমান্ডটি কোনও ব্যতিক্রম ছাড়াই সম্পূর্ণ হয়।
গ্রুপের কোনও অংশে কমান্ড পাঠান
ডিভাইস গ্রুপের সব OnOffLightDevice লাইট চালু করতে:
val lightPart = group.partOrNull(OnOffLightDevice).firstOrNull()
val onOffTrait = lightPart?.trait(OnOff)
if (onOffTrait?.supports(OnOff.Command.On) == true) {
onOffTrait.on()
}
এছাড়াও, আপনি group.parts() ব্যবহার করে কোনও গ্রুপে থাকা সব ধরনের ডিভাইস পরীক্ষা করতে পারেন
যাতে একাধিক সম্পর্কিত ডিভাইসের ধরন জুড়ে কোনও বৈশিষ্ট্য টার্গেট করা যায় (যেমন, গ্রুপে থাকা
OnOff সাপোর্ট করে এমন যেকোনও ধরনের লাইট ডিভাইস
বন্ধ করা):
val lightTypes = listOf(
OnOffLightDevice,
DimmableLightDevice,
ColorTemperatureLightDevice,
ExtendedColorLightDevice,
)
val parts = group.parts().first()
val onOffTrait = lightTypes.firstNotNullOfOrNull { type ->
parts.firstOrNull { it.factory == type }
}?.trait(OnOff)
onOffTrait?.off()
আপনি কমান্ড পাঠানোর আগে কমান্ড সাপোর্ট চেক করতে বা গ্রুপের কোনও অংশের রিডিং ক্যাপাবিলিটি বাউন্ড চেক করতে পারেন (যেমন, আলো কমানো যায় এমন লাইটের অংশে MoveToLevelWithOnOff চেক করা বা কালার টেম্পারেচার লাইটের অংশে colorTempPhysicalMinMireds ও colorTempPhysicalMaxMireds চেক করা):
val dimmableLight = group.partOrNull(DimmableLightDevice).firstOrNull()
val levelControl = dimmableLight?.trait(LevelControl)
if (
levelControl?.supports(
LevelControl.Command.MoveToLevelWithOnOff
) == true
) {
levelControl.moveToLevelWithOnOff(
level = 127u,
transitionTime = null,
optionsMask = LevelControlTrait.OptionsBitmap(),
optionsOverride = LevelControlTrait.OptionsBitmap(),
)
}
val colorLight = group.partOrNull(ColorTemperatureLightDevice).firstOrNull()
val colorControl = colorLight?.trait(ColorControl)
val minMireds = colorControl?.colorTempPhysicalMinMireds
val maxMireds = colorControl?.colorTempPhysicalMaxMireds
if (colorControl != null && minMireds != null && maxMireds != null) {
val midMireds = ((minMireds.toInt() + maxMireds.toInt()) / 2).toUShort()
colorControl.moveToColorTemperature(
colorTemperatureMireds = midMireds,
transitionTime = 0u,
optionsMask = ColorControlTrait.OptionsBitmap(),
optionsOverride = ColorControlTrait.OptionsBitmap(),
)
}