১. শুরু করার আগে
এটি গুগল হোম এপিআই ব্যবহার করে অ্যান্ড্রয়েড অ্যাপ তৈরির সিরিজের দ্বিতীয় কোডল্যাব। এই কোডল্যাবে আমরা হোম অটোমেশন কীভাবে তৈরি করতে হয় তা নিয়ে আলোচনা করব এবং এপিআই ব্যবহার করে সেরা অনুশীলন সম্পর্কে কিছু টিপস দেব। যদি আপনি এখনও প্রথম কোডল্যাব, অ্যান্ড্রয়েডে হোম এপিআই ব্যবহার করে একটি মোবাইল অ্যাপ তৈরি করুন , তাহলে আমরা আপনাকে এই কোডল্যাব শুরু করার আগে এটি সম্পূর্ণ করার পরামর্শ দিচ্ছি।
গুগল হোম এপিআইগুলি অ্যান্ড্রয়েড ডেভেলপারদের জন্য গুগল হোম ইকোসিস্টেমের মধ্যে স্মার্ট হোম ডিভাইসগুলি নিয়ন্ত্রণ করার জন্য লাইব্রেরির একটি সেট সরবরাহ করে। এই নতুন এপিআইগুলির সাহায্যে, ডেভেলপাররা একটি স্মার্ট হোমের জন্য অটোমেশন সেট করতে সক্ষম হবেন যা পূর্বনির্ধারিত অবস্থার উপর ভিত্তি করে ডিভাইসের ক্ষমতা নিয়ন্ত্রণ করতে পারে। গুগল একটি ডিসকভারি এপিআইও সরবরাহ করে যা আপনাকে ডিভাইসগুলি কোন বৈশিষ্ট্য এবং কমান্ডগুলি সমর্থন করে তা খুঁজে বের করতে জিজ্ঞাসা করতে দেয়।
এই ভিডিওটিতে আপনি যে অটোমেশনগুলি তৈরি করবেন তার একটি সংক্ষিপ্ত ওয়াকথ্রু প্রদান করা হয়েছে, তাই কোডল্যাবটি করার সময় ভিডিওটি অনুসরণ করুন।
পূর্বশর্ত
- অ্যান্ড্রয়েড কোডল্যাবে হোম এপিআই ব্যবহার করে একটি মোবাইল অ্যাপ তৈরি করুন সম্পূর্ণ করুন।
- গুগল হোম ইকোসিস্টেম সম্পর্কে জ্ঞান ( ক্লাউড-টু-ক্লাউড এবং ম্যাটার )।
- অ্যান্ড্রয়েড স্টুডিও (২০২৪.৩.১ লেডিবাগ বা তার পরবর্তী) ইনস্টল করা একটি ওয়ার্কস্টেশন।
- একটি অ্যান্ড্রয়েড ফোন যা হোম এপিআই-এর প্রয়োজনীয়তা পূরণ করে ( পূর্বশর্ত দেখুন), গুগল প্লে পরিষেবা এবং গুগল হোম অ্যাপ ইনস্টল করা আছে। একটি এমুলেটর কাজ করবে না , নমুনা অ্যাপের জন্য শুধুমাত্র ফিজিক্যাল অ্যান্ড্রয়েড ফোনগুলি সমর্থিত।
- একটি সামঞ্জস্যপূর্ণ গুগল হোম হাব যা গুগল হোম এপিআই সমর্থন করে।
- ঐচ্ছিক - গুগল হোম এপিআই-এর সাথে সামঞ্জস্যপূর্ণ একটি স্মার্ট হোম ডিভাইস।
তুমি কি শিখবে
- হোম এপিআই ব্যবহার করে স্মার্ট হোম ডিভাইসের জন্য অটোমেশন কীভাবে তৈরি করবেন।
- সমর্থিত ডিভাইসের ক্ষমতাগুলি অন্বেষণ করতে ডিসকভারি API গুলি কীভাবে ব্যবহার করবেন।
- হোম এপিআই ব্যবহার করে অ্যাপ তৈরি করার সময় কীভাবে সেরা অনুশীলনগুলি ব্যবহার করবেন।
2. আপনার প্রকল্প সেট আপ করা
নিম্নলিখিত চিত্রটি একটি হোম এপিআই অ্যাপের আর্কিটেকচার চিত্রিত করে:

- অ্যাপ কোড: অ্যাপের ইউজার ইন্টারফেস এবং হোম এপিআই SDK এর সাথে ইন্টারঅ্যাক্ট করার জন্য যুক্তি তৈরি করতে ডেভেলপাররা যে মূল কোডের উপর কাজ করে।
- হোম এপিআই এসডিকে: গুগল কর্তৃক প্রদত্ত হোম এপিআই এসডিকে স্মার্ট হোম ডিভাইসগুলি নিয়ন্ত্রণ করার জন্য জিএমএসকোরে হোম এপিআই পরিষেবার সাথে কাজ করে। ডেভেলপাররা হোম এপিআই এসডিকে বান্ডেল করে হোম এপিআইগুলির সাথে কাজ করে এমন অ্যাপ তৈরি করে।
- অ্যান্ড্রয়েডে GMScore: GMScore, যা গুগল প্লে সার্ভিসেস নামেও পরিচিত, একটি গুগল প্ল্যাটফর্ম যা মূল সিস্টেম পরিষেবা প্রদান করে, যা সমস্ত সার্টিফাইড অ্যান্ড্রয়েড ডিভাইসে মূল কার্যকারিতা সক্ষম করে। গুগল প্লে সার্ভিসেসের হোম মডিউলে এমন পরিষেবা রয়েছে যা হোম API গুলির সাথে ইন্টারঅ্যাক্ট করে।
এই কোডল্যাবে আমরা "Android-এ Home API ব্যবহার করে একটি মোবাইল অ্যাপ তৈরি করুন" বিভাগে যা আলোচনা করেছি তার উপর ভিত্তি করে তৈরি করব।
নিশ্চিত করুন যে আপনার অ্যাকাউন্টে কমপক্ষে দুটি সমর্থিত ডিভাইস সেট আপ করা এবং কাজ করার জন্য একটি কাঠামো আছে। যেহেতু আমরা এই কোডল্যাবে অটোমেশন সেট আপ করতে যাচ্ছি (একটি ডিভাইসের অবস্থার পরিবর্তন অন্যটিতে একটি ক্রিয়া শুরু করে), ফলাফল দেখতে আপনার দুটি ডিভাইসের প্রয়োজন হবে।
নমুনা অ্যাপটি পান
স্যাম্পল অ্যাপের সোর্স কোডটি GitHub-এ google-home/google-home-api-sample-app-android রিপোজিটরিতে পাওয়া যাবে।
এই কোডল্যাবটি স্যাম্পল অ্যাপের codelab-branch-2 শাখার উদাহরণগুলি ব্যবহার করে।
আপনি যেখানে প্রকল্পটি সংরক্ষণ করতে চান সেখানে নেভিগেট করুন এবং codelab-branch-2 শাখাটি ক্লোন করুন:
$ git clone -b codelab-branch-2 https://github.com/google-home/google-home-api-sample-app-android.git
মনে রাখবেন যে এটি অ্যান্ড্রয়েডে হোম এপিআই ব্যবহার করে একটি মোবাইল অ্যাপ তৈরিতে ব্যবহৃত শাখার থেকে আলাদা একটি শাখা। কোডবেসের এই শাখাটি প্রথম কোডল্যাব যেখানে শেষ হয়েছিল তার উপর ভিত্তি করে তৈরি। এবার, উদাহরণগুলি আপনাকে অটোমেশন তৈরি করার পদ্ধতি সম্পর্কে জানাবে। যদি আপনি পূর্ববর্তী কোডল্যাবটি সম্পন্ন করে থাকেন এবং সমস্ত কার্যকারিতা কাজ করতে সক্ষম হন, তাহলে আপনি codelab-branch-2 ব্যবহার না করে এই কোডল্যাবটি সম্পূর্ণ করার জন্য একই অ্যান্ড্রয়েড স্টুডিও প্রকল্পটি ব্যবহার করতে পারেন।
একবার আপনার সোর্স কোডটি কম্পাইল হয়ে গেলে এবং আপনার মোবাইল ডিভাইসে চালানোর জন্য প্রস্তুত হয়ে গেলে, পরবর্তী বিভাগটি চালিয়ে যান।
৩. অটোমেশন সম্পর্কে জানুন
অটোমেশন হলো "যদি এটা হয়, তাহলে ওটা" স্টেটমেন্টের একটি সেট যা নির্বাচিত বিষয়গুলির উপর ভিত্তি করে স্বয়ংক্রিয় পদ্ধতিতে ডিভাইসের অবস্থা নিয়ন্ত্রণ করতে পারে। ডেভেলপাররা তাদের API গুলিতে উন্নত ইন্টারেক্টিভ বৈশিষ্ট্য তৈরি করতে অটোমেশন ব্যবহার করতে পারেন।
অটোমেশনগুলি তিনটি ভিন্ন ধরণের উপাদান দিয়ে তৈরি যা নোড নামে পরিচিত: স্টার্টার্স, অ্যাকশন এবং কন্ডিশন। এই নোডগুলি স্মার্ট হোম ডিভাইস ব্যবহার করে আচরণ স্বয়ংক্রিয় করার জন্য একসাথে কাজ করে। সাধারণত, এগুলি নিম্নলিখিত ক্রমে মূল্যায়ন করা হয়:
- স্টার্টার — অটোমেশন সক্রিয় করার প্রাথমিক শর্তগুলি সংজ্ঞায়িত করে, যেমন একটি বৈশিষ্ট্য মানের পরিবর্তন। একটি অটোমেশনের অবশ্যই একটি স্টার্টার থাকতে হবে।
- শর্ত — অটোমেশন চালু হওয়ার পরে মূল্যায়নের জন্য যে কোনও অতিরিক্ত সীমাবদ্ধতা। একটি অটোমেশনের ক্রিয়া সম্পাদনের জন্য শর্তের এক্সপ্রেশনটিকে সত্য হিসাবে মূল্যায়ন করতে হবে।
- অ্যাকশন — সমস্ত শর্ত পূরণ হলে সম্পাদিত কমান্ড বা স্টেট আপডেট।
উদাহরণস্বরূপ, আপনি এমন একটি অটোমেশন ব্যবহার করতে পারেন যা একটি ঘরের আলো কমিয়ে দেয় যখন একটি সুইচ টগল করা হয়, যখন সেই ঘরের টিভি চালু থাকে। এই উদাহরণে:
- স্টার্টার — ঘরের সুইচটি টগল করা আছে।
- অবস্থা — টিভি অনঅফ অবস্থাটি অন হিসেবে মূল্যায়ন করা হয়েছে।
- অ্যাকশন — সুইচের মতো একই ঘরে আলোগুলো নিভে গেছে।
এই নোডগুলি, অটোমেশন ইঞ্জিন দ্বারা সিরিয়াল বা সমান্তরাল পদ্ধতিতে মূল্যায়ন করা হয়।

একটি সিকোয়েন্সিয়াল ফ্লোতে এমন নোড থাকে যা ক্রমানুসারে কার্যকর হয়। সাধারণত, এগুলি হবে স্টার্টার, কন্ডিশন এবং অ্যাকশন।

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

ডেভেলপাররা গুগল হোম অটোমেশনের জন্য বিশেষভাবে তৈরি একটি ডোমেন-নির্দিষ্ট ভাষা (DSL) ব্যবহার করে অটোমেশন ইঞ্জিনে এই নোডগুলি সরবরাহ করে।
অটোমেশন ডিএসএল অন্বেষণ করুন
ডোমেইন-স্পেসিফিক ল্যাঙ্গুয়েজ (DSL) হল এমন একটি ভাষা যা কোডে সিস্টেমের আচরণ ক্যাপচার করতে ব্যবহৃত হয়। কম্পাইলারটি ডেটা ক্লাস তৈরি করে যা প্রোটোকল বাফার JSON-এ সিরিয়ালাইজ করা হয় এবং Google-এর অটোমেশন পরিষেবাগুলিতে কল করতে ব্যবহৃত হয়।
DSL নিম্নলিখিত স্কিমাটি অনুসন্ধান করে:
automation {
name = "AutomationName"
description = "An example automation description."
isActive = true
sequential {
val onOffTrait = starter<_>(device1, OnOffLightDevice, OnOff)
condition() { expression = onOffTrait.onOff equals true }
action(device2, OnOffLightDevice) { command(OnOff.on()) }
}
}
পূর্ববর্তী উদাহরণের অটোমেশন দুটি লাইটবাল্ব সিঙ্ক্রোনাইজ করে। যখন device1 এর OnOff অবস্থা On ( onOffTrait.onOff equals true ) তে পরিবর্তিত হয়, তখন device2 এর OnOff অবস্থা On ( command(OnOff.on() ) তে পরিবর্তিত হয়।
যখন আপনি অটোমেশন নিয়ে কাজ করছেন, তখন জেনে রাখুন যে সম্পদের সীমাবদ্ধতা রয়েছে।
একটি স্মার্ট হোমে স্বয়ংক্রিয় ক্ষমতা তৈরির জন্য অটোমেশন খুবই কার্যকর একটি হাতিয়ার। সবচেয়ে মৌলিক ব্যবহারের ক্ষেত্রে, আপনি নির্দিষ্ট ডিভাইস এবং বৈশিষ্ট্যগুলি ব্যবহার করার জন্য একটি অটোমেশনকে স্পষ্টভাবে কোড করতে পারেন। তবে আরও ব্যবহারিক ব্যবহারের ক্ষেত্রে এটি এমন একটি জায়গা যেখানে অ্যাপটি ব্যবহারকারীকে একটি অটোমেশনের ডিভাইস, কমান্ড এবং প্যারামিটারগুলি কনফিগার করতে দেয়। পরবর্তী বিভাগে ব্যাখ্যা করা হয়েছে যে কীভাবে একটি অটোমেশন সম্পাদক তৈরি করতে হয় যা ব্যবহারকারীকে ঠিক এটি করতে দেয়।
৪. একটি অটোমেশন এডিটর তৈরি করুন
স্যাম্পল অ্যাপের মধ্যে, আমরা একটি অটোমেশন এডিটর তৈরি করব যার সাহায্যে ব্যবহারকারীরা ডিভাইস, তারা যে ক্ষমতা (ক্রিয়া) ব্যবহার করতে চান এবং স্টার্টার ব্যবহার করে কীভাবে অটোমেশন ট্রিগার করা হয় তা নির্বাচন করতে পারবেন।




স্টার্টার সেট আপ করুন
অটোমেশনের জন্য অটোমেশন স্টার্টার হল এন্ট্রি পয়েন্ট। যখন কোনও নির্দিষ্ট ঘটনা ঘটে তখন একটি স্টার্টার একটি অটোমেশন ট্রিগার করে। স্যাম্পল অ্যাপে, আমরা StarterViewModel.kt সোর্স ফাইলে পাওয়া StarterViewModel ক্লাস ব্যবহার করে অটোমেশন স্টার্টারগুলি ক্যাপচার করি এবং StarterView ( StarterView.kt ) ব্যবহার করে এডিটর ভিউ প্রদর্শন করি।
একটি স্টার্টার নোডের জন্য নিম্নলিখিত উপাদানগুলির প্রয়োজন:
- যন্ত্র
- বৈশিষ্ট্য
- অপারেশন
- মূল্য
ডিভাইস API দ্বারা ফেরত পাঠানো বস্তু থেকে ডিভাইস এবং বৈশিষ্ট্য নির্বাচন করা যেতে পারে। প্রতিটি সমর্থিত ডিভাইসের জন্য কমান্ড এবং প্যারামিটারগুলি আরও জটিল বিষয়, আলাদাভাবে পরিচালনা করা প্রয়োজন।
অ্যাপটি অপারেশনের একটি পূর্ব-নির্ধারিত তালিকা সংজ্ঞায়িত করে:
// List of operations available when creating automation starters:
enum class Operation {
EQUALS,
NOT_EQUALS,
GREATER_THAN,
GREATER_THAN_OR_EQUALS,
LESS_THAN,
LESS_THAN_OR_EQUALS
}
তারপর প্রতিটি সমর্থিত বৈশিষ্ট্যের জন্য সমর্থিত ক্রিয়াকলাপগুলির ট্র্যাক রাখে:
// List of operations available when comparing booleans:
object BooleanOperations : Operations(listOf(
Operation.EQUALS,
Operation.NOT_EQUALS
))
// List of operations available when comparing values:
object LevelOperations : Operations(listOf(
Operation.GREATER_THAN,
Operation.GREATER_THAN_OR_EQUALS,
Operation.LESS_THAN,
Operation.LESS_THAN_OR_EQUALS
))
একইভাবে, নমুনা অ্যাপ বৈশিষ্ট্যের জন্য নির্ধারিত মানগুলির ট্র্যাক রাখে:
enum class OnOffValue {
On,
Off,
}
enum class ThermostatValue {
Heat,
Cool,
Off,
}
এবং অ্যাপ দ্বারা সংজ্ঞায়িত মান এবং API দ্বারা সংজ্ঞায়িত মানগুলির মধ্যে একটি ম্যাপিংয়ের ট্র্যাক রাখে:
val valuesOnOff: Map<OnOffValue, Boolean> = mapOf(
OnOffValue.On to true,
OnOffValue.Off to false,
)
val valuesThermostat: Map<ThermostatValue, ThermostatTrait.SystemModeEnum> = mapOf(
ThermostatValue.Heat to ThermostatTrait.SystemModeEnum.Heat,
ThermostatValue.Cool to ThermostatTrait.SystemModeEnum.Cool,
ThermostatValue.Off to ThermostatTrait.SystemModeEnum.Off,
)
এরপর অ্যাপটি ভিউ এলিমেন্টের একটি সেট প্রদর্শন করে যা ব্যবহারকারীরা প্রয়োজনীয় ক্ষেত্রগুলি নির্বাচন করতে ব্যবহার করতে পারেন।
সমস্ত স্টার্টার ডিভাইস রেন্ডার করতে StarterView.kt ফাইলে ধাপ 4.1.1 আনকমেন্ট করুন এবং একটি DropdownMenu ক্লিক কলব্যাক বাস্তবায়ন করুন:
val deviceVMs: List<DeviceViewModel> = structureVM.deviceVMs.collectAsState().value
...
DropdownMenu(expanded = expandedDeviceSelection, onDismissRequest = { expandedDeviceSelection = false }) {
// TODO: 4.1.1 - Starter device selection dropdown
// for (deviceVM in deviceVMs) {
// DropdownMenuItem(
// text = { Text(deviceVM.name) },
// onClick = {
// scope.launch {
// starterDeviceVM.value = deviceVM
// starterType.value = deviceVM.type.value
// starterTrait.value = null
// starterOperation.value = null
// }
// expandedDeviceSelection = false
// }
// )
// }
}
স্টার্টার ডিভাইসের সকল বৈশিষ্ট্য রেন্ডার করতে StarterView.kt ফাইলে ধাপ 4.1.2 আনকমেন্ট করুন এবং DropdownMenu ক্লিক কলব্যাক বাস্তবায়ন করুন:
// Selected starter attributes for StarterView on screen:
val starterDeviceVM: MutableState<DeviceViewModel?> = remember {
mutableStateOf(starterVM.deviceVM.value) }
...
DropdownMenu(expanded = expandedTraitSelection, onDismissRequest = { expandedTraitSelection = false }) {
// TODO: 4.1.2 - Starter device traits selection dropdown
// val deviceTraits = starterDeviceVM.value?.traits?.collectAsState()?.value!!
// for (trait in deviceTraits) {
// DropdownMenuItem(
// text = { Text(trait.factory.toString()) },
// onClick = {
// scope.launch {
// starterTrait.value = trait.factory
// starterOperation.value = null
// }
// expandedTraitSelection = false
// }
// )
}
}
নির্বাচিত বৈশিষ্ট্যের সমস্ত ক্রিয়াকলাপ রেন্ডার করতে এবং DropdownMenu ক্লিক কলব্যাক বাস্তবায়ন করতে StarterView.kt ফাইলে ধাপ 4.1.3 আনমন্ট করুন:
val starterOperation: MutableState<StarterViewModel.Operation?> = remember {
mutableStateOf(starterVM.operation.value) }
...
DropdownMenu(expanded = expandedOperationSelection, onDismissRequest = { expandedOperationSelection = false }) {
// ...
if (!StarterViewModel.starterOperations.containsKey(starterTrait.value))
return@DropdownMenu
// TODO: 4.1.3 - Starter device trait operations selection dropdown
// val operations: List<StarterViewModel.Operation> = StarterViewModel.starterOperations.get(starterTrait.value ?: OnOff)?.operations!!
// for (operation in operations) {
// DropdownMenuItem(
// text = { Text(operation.toString()) },
// onClick = {
// scope.launch {
// starterOperation.value = operation
// }
// expandedOperationSelection = false
// }
// )
// }
}
নির্বাচিত বৈশিষ্ট্যের সমস্ত মান রেন্ডার করতে এবং DropdownMenu ক্লিক কলব্যাক বাস্তবায়ন করতে StarterView.kt ফাইলে ধাপ 4.1.4 আনমন্ট করুন:
when (starterTrait.value) {
OnOff -> {
...
DropdownMenu(expanded = expandedBooleanSelection, onDismissRequest = { expandedBooleanSelection = false }) {
// TODO: 4.1.4 - Starter device trait values selection dropdown
// for (value in StarterViewModel.valuesOnOff.keys) {
// DropdownMenuItem(
// text = { Text(value.toString()) },
// onClick = {
// scope.launch {
// starterValueOnOff.value = StarterViewModel.valuesOnOff.get(value)
// }
// expandedBooleanSelection = false
// }
// )
// }
}
...
}
LevelControl -> {
...
}
}
ড্রাফ্ট অটোমেশনের স্টার্টার ViewModel ( draftVM.starterVMs ) এ সমস্ত স্টার্টার ViewModel ভেরিয়েবল সংরক্ষণ করতে StarterView.kt ফাইলে ধাপ 4.1.5 আনকমেন্ট করুন।
val draftVM: DraftViewModel = homeAppVM.selectedDraftVM.collectAsState().value!!
// Save starter button:
Button(
enabled = isOptionsSelected && isValueProvided,
onClick = {
scope.launch {
// TODO: 4.1.5 - store all starter ViewModel variables into draft ViewModel
// starterVM.deviceVM.emit(starterDeviceVM.value)
// starterVM.trait.emit(starterTrait.value)
// starterVM.operation.emit(starterOperation.value)
// starterVM.valueOnOff.emit(starterValueOnOff.value!!)
// starterVM.valueLevel.emit(starterValueLevel.value!!)
// starterVM.valueBooleanState.emit(starterValueBooleanState.value!!)
// starterVM.valueOccupancy.emit(starterValueOccupancy.value!!)
// starterVM.valueThermostat.emit(starterValueThermostat.value!!)
//
// draftVM.starterVMs.value.add(starterVM)
// draftVM.selectedStarterVM.emit(null)
}
})
{ Text(stringResource(R.string.starter_button_create)) }
অ্যাপটি চালানো এবং একটি নতুন অটোমেশন এবং স্টার্টার নির্বাচন করলে নিম্নলিখিত ধরণের দৃশ্য দেখাবে:

স্যাম্পল অ্যাপটি শুধুমাত্র ডিভাইসের বৈশিষ্ট্যের উপর ভিত্তি করে স্টার্টারগুলিকে সমর্থন করে।
অ্যাকশন সেট আপ করুন
অটোমেশন অ্যাকশন একটি অটোমেশনের কেন্দ্রীয় উদ্দেশ্য প্রতিফলিত করে, এটি কীভাবে ভৌত জগতের পরিবর্তনকে প্রভাবিত করে। স্যাম্পল অ্যাপে, আমরা ActionViewModel ক্লাস ব্যবহার করে অটোমেশন অ্যাকশনগুলি ক্যাপচার করি এবং ActionView ক্লাস ব্যবহার করে এডিটর ভিউ প্রদর্শন করি।
স্যাম্পল অ্যাপটি অটোমেশন অ্যাকশন নোডগুলি সংজ্ঞায়িত করতে নিম্নলিখিত হোম এপিআই সত্তাগুলি ব্যবহার করে:
- যন্ত্র
- বৈশিষ্ট্য
- কমান্ড
- মান (ঐচ্ছিক)
প্রতিটি ডিভাইস কমান্ড অ্যাকশনের জন্য একটি কমান্ড ব্যবহার করা হয়, তবে কিছু ডিভাইসের সাথে সম্পর্কিত একটি প্যারামিটার মানও প্রয়োজন হয়, যেমন MoveToLevel() এবং একটি লক্ষ্য শতাংশ।
ডিভাইস এবং বৈশিষ্ট্যটি ডিভাইস API দ্বারা ফেরত পাঠানো বস্তু থেকে নির্বাচন করা যেতে পারে।
অ্যাপটি কমান্ডের একটি পূর্বনির্ধারিত তালিকা সংজ্ঞায়িত করে:
// List of operations available when creating automation starters:
enum class Action {
ON,
OFF,
MOVE_TO_LEVEL,
MODE_HEAT,
MODE_COOL,
MODE_OFF,
}
অ্যাপটি প্রতিটি সমর্থিত বৈশিষ্ট্যের জন্য সমর্থিত ক্রিয়াকলাপের ট্র্যাক রাখে:
// List of operations available when comparing booleans:
object OnOffActions : Actions(listOf(
Action.ON,
Action.OFF,
))
// List of operations available when comparing booleans:
object LevelActions : Actions(listOf(
Action.MOVE_TO_LEVEL
))
// List of operations available when comparing booleans:
object ThermostatActions : Actions(listOf(
Action.MODE_HEAT,
Action.MODE_COOL,
Action.MODE_OFF,
))
// Map traits and the comparison operations they support:
val actionActions: Map<TraitFactory<out Trait>, Actions> = mapOf(
OnOff to OnOffActions,
LevelControl to LevelActions,
// BooleanState - No Actions
// OccupancySensing - No Actions
Thermostat to ThermostatActions,
)
এক বা একাধিক প্যারামিটার গ্রহণকারী কমান্ডের জন্য, একটি ভেরিয়েবলও রয়েছে:
val valueLevel: MutableStateFlow<UByte?>
API ভিউ এলিমেন্টের একটি সেট প্রদর্শন করে যা ব্যবহারকারীরা প্রয়োজনীয় ক্ষেত্রগুলি নির্বাচন করতে ব্যবহার করতে পারেন।
সমস্ত অ্যাকশন ডিভাইস রেন্ডার করতে ActionView.kt ফাইলে ধাপ 4.2.1 আনকমেন্ট করুন এবং actionDeviceVM সেট করতে একটি DropdownMenu ক্লিক কলব্যাক বাস্তবায়ন করুন।
val deviceVMs = structureVM.deviceVMs.collectAsState().value
...
DropdownMenu(expanded = expandedDeviceSelection, onDismissRequest = { expandedDeviceSelection = false }) {
// TODO: 4.2.1 - Action device selection dropdown
// for (deviceVM in deviceVMs) {
// DropdownMenuItem(
// text = { Text(deviceVM.name) },
// onClick = {
// scope.launch {
// actionDeviceVM.value = deviceVM
// actionTrait.value = null
// actionAction.value = null
// }
// expandedDeviceSelection = false
// }
// )
// }
}
actionDeviceVM এর সকল বৈশিষ্ট্য রেন্ডার করতে ActionView.kt ফাইলে ধাপ 4.2.2 আনকমেন্ট করুন এবং actionTrait সেট করার জন্য একটি DropdownMenu ক্লিক কলব্যাক প্রয়োগ করুন, যা কমান্ডটি যে বৈশিষ্ট্যের সাথে সম্পর্কিত তা উপস্থাপন করে।
val actionDeviceVM: MutableState<DeviceViewModel?> = remember {
mutableStateOf(actionVM.deviceVM.value) }
...
DropdownMenu(expanded = expandedTraitSelection, onDismissRequest = { expandedTraitSelection = false }) {
// TODO: 4.2.2 - Action device traits selection dropdown
// val deviceTraits: List<Trait> = actionDeviceVM.value?.traits?.collectAsState()?.value!!
// for (trait in deviceTraits) {
// DropdownMenuItem(
// text = { Text(trait.factory.toString()) },
// onClick = {
// scope.launch {
// actionTrait.value = trait
// actionAction.value = null
// }
// expandedTraitSelection = false
// }
// )
// }
}
ActionView.kt ফাইলে ধাপ 4.2.3 আনকমেন্ট করুন যাতে actionTrait এর সমস্ত উপলব্ধ ক্রিয়া রেন্ডার করা যায়। actionAction সেট করার জন্য একটি DropdownMenu ক্লিক কলব্যাক প্রয়োগ করুন, যা নির্বাচিত অটোমেশন ক্রিয়াকে প্রতিনিধিত্ব করে।
DropdownMenu(expanded = expandedActionSelection, onDismissRequest = { expandedActionSelection = false }) {
// ...
if (!ActionViewModel.actionActions.containsKey(actionTrait.value?.factory))
return@DropdownMenu
// TODO: 4.2.3 - Action device trait actions (commands) selection dropdown
// val actions: List<ActionViewModel.Action> = ActionViewModel.actionActions.get(actionTrait.value?.factory)?.actions!!
// for (action in actions) {
// DropdownMenuItem(
// text = { Text(action.toString()) },
// onClick = {
// scope.launch {
// actionAction.value = action
// }
// expandedActionSelection = false
// }
// )
// }
}
ActionView.kt ফাইলে ধাপ 4.2.4 আনকমেন্ট করুন যাতে trait action (command) এর উপলব্ধ মানগুলি রেন্ডার করা যায় এবং মান পরিবর্তন কলব্যাকে মানটিকে actionValueLevel এ সংরক্ষণ করা যায়:
when (actionTrait.value?.factory) {
LevelControl -> {
// TODO: 4.2.4 - Action device trait action(command) values selection widget
// Column (Modifier.padding(horizontal = 16.dp, vertical = 8.dp).fillMaxWidth()) {
// Text(stringResource(R.string.action_title_value), fontSize = 16.sp, fontWeight = FontWeight.SemiBold)
// }
//
// Box (Modifier.padding(horizontal = 24.dp, vertical = 8.dp)) {
// LevelSlider(value = actionValueLevel.value?.toFloat()!!, low = 0f, high = 254f, steps = 0,
// modifier = Modifier.padding(top = 16.dp),
// onValueChange = { value : Float -> actionValueLevel.value = value.toUInt().toUByte() }
// isEnabled = true
// )
// }
...
}
ActionView.kt ফাইলে ধাপ 4.2.5 আনকমেন্ট করুন যাতে ViewModel এর সকল অ্যাকশন ভেরিয়েবল ড্রাফ্ট অটোমেশনের অ্যাকশন ViewModel ( draftVM.actionVMs ) তে সংরক্ষণ করা যায়:
val draftVM: DraftViewModel = homeAppVM.selectedDraftVM.collectAsState().value!!
// Save action button:
Button(
enabled = isOptionsSelected,
onClick = {
scope.launch {
// TODO: 4.2.5 - store all action ViewModel variables into draft ViewModel
// actionVM.deviceVM.emit(actionDeviceVM.value)
// actionVM.trait.emit(actionTrait.value)
// actionVM.action.emit(actionAction.value)
// actionVM.valueLevel.emit(actionValueLevel.value)
//
// draftVM.actionVMs.value.add(actionVM)
// draftVM.selectedActionVM.emit(null)
}
})
{ Text(stringResource(R.string.action_button_create)) }
অ্যাপটি চালানো এবং একটি নতুন অটোমেশন এবং অ্যাকশন নির্বাচন করার ফলে নিম্নলিখিত ধরণের ভিউ দেখা উচিত:

আমরা শুধুমাত্র স্যাম্পল অ্যাপে ডিভাইসের বৈশিষ্ট্যের উপর ভিত্তি করে অ্যাকশন সমর্থন করি।
একটি খসড়া অটোমেশন রেন্ডার করুন
DraftViewModel সম্পূর্ণ হলে, এটি HomeAppView.kt দ্বারা রেন্ডার করা যেতে পারে:
fun HomeAppView (homeAppVM: HomeAppViewModel) {
...
// If a draft automation is selected, show the draft editor:
if (selectedDraftVM != null) {
DraftView(homeAppVM)
}
...
}
DraftView.kt এ:
fun DraftView (homeAppVM: HomeAppViewModel) {
val draftVM: DraftViewModel = homeAppVM.selectedDraftVM.collectAsState().value!!
...
// Draft Starters:
DraftStarterList(draftVM)
// Draft Actions:
DraftActionList(draftVM)
}
একটি অটোমেশন তৈরি করুন
এখন যেহেতু আপনি স্টার্টার এবং অ্যাকশন তৈরি করতে শিখেছেন, আপনি একটি অটোমেশন ড্রাফ্ট তৈরি করতে এবং এটি অটোমেশন API-তে পাঠাতে প্রস্তুত। API-তে একটি createAutomation() ফাংশন রয়েছে যা একটি অটোমেশন ড্রাফ্টকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করে এবং একটি নতুন অটোমেশন ইনস্ট্যান্স ফেরত দেয়।
স্যাম্পল অ্যাপের DraftViewModel ক্লাসে ড্রাফ্ট অটোমেশন প্রস্তুতি সম্পন্ন হয়। পূর্ববর্তী বিভাগে স্টার্টার এবং অ্যাকশন ভেরিয়েবল ব্যবহার করে আমরা কীভাবে অটোমেশন ড্রাফ্ট গঠন করি সে সম্পর্কে আরও জানতে getDraftAutomation() ফাংশনটি দেখুন।
যখন স্টার্টার বৈশিষ্ট্যটি OnOff থাকে তখন অটোমেশন গ্রাফ তৈরি করার জন্য প্রয়োজনীয় "select" এক্সপ্রেশন তৈরি করতে DraftViewModel.kt ফাইলে ধাপ 4.4.1-এ মন্তব্য মুক্ত করুন:
val starterVMs: List<StarterViewModel> = starterVMs.value
val actionVMs: List<ActionViewModel> = actionVMs.value
...
fun getDraftAutomation() : DraftAutomation {
...
val starterVMs: List<StarterViewModel> = starterVMs.value
...
return automation {
this.name = name
this.description = description
this.isActive = true
// The sequential block wrapping all nodes:
sequential {
// The select block wrapping all starters:
select {
// Iterate through the selected starters:
for (starterVM in starterVMs) {
// The sequential block for each starter (should wrap the Starter Expression!)
sequential {
...
val starterTrait: TraitFactory<out Trait> = starterVM.trait.value!!
...
when (starterTrait) {
OnOff -> {
// TODO: 4.4.1 - Set starter expressions according to trait type
// val onOffValue: Boolean = starterVM.valueOnOff.value
// val onOffExpression: TypedExpression<out OnOff> =
// starterExpression as TypedExpression<out OnOff>
// when (starterOperation) {
// StarterViewModel.Operation.EQUALS ->
// condition { expression = onOffExpression.onOff equals onOffValue }
// StarterViewModel.Operation.NOT_EQUALS ->
// condition { expression = onOffExpression.onOff notEquals onOffValue }
// else -> { MainActivity.showError(this, "Unexpected operation for OnOf
// }
}
LevelControl -> {
...
// Function to allow manual execution of the automation:
manualStarter()
...
}
নির্বাচিত অ্যাকশন বৈশিষ্ট্য LevelControl এবং নির্বাচিত অ্যাকশনটি MOVE_TO_LEVEL হলে অটোমেশন গ্রাফ তৈরি করার জন্য প্রয়োজনীয় সমান্তরাল এক্সপ্রেশন তৈরি করতে DraftViewModel.kt ফাইলে ধাপ 4.4.2-এ মন্তব্য মুক্ত করুন:
val starterVMs: List<StarterViewModel> = starterVMs.value
val actionVMs: List<ActionViewModel> = actionVMs.value
...
fun getDraftAutomation() : DraftAutomation {
...
return automation {
this.name = name
this.description = description
this.isActive = true
// The sequential block wrapping all nodes:
sequential {
...
// Parallel block wrapping all actions:
parallel {
// Iterate through the selected actions:
for (actionVM in actionVMs) {
val actionDeviceVM: DeviceViewModel = actionVM.deviceVM.value!!
// Action Expression that the DSL will check for:
action(actionDeviceVM.device, actionDeviceVM.type.value.factory) {
val actionCommand: Command = when (actionVM.action.value) {
ActionViewModel.Action.ON -> { OnOff.on() }
ActionViewModel.Action.OFF -> { OnOff.off() }
// TODO: 4.4.2 - Set starter expressions according to trait type
// ActionViewModel.Action.MOVE_TO_LEVEL -> {
// LevelControl.moveToLevelWithOnOff(
// actionVM.valueLevel.value!!,
// 0u,
// LevelControlTrait.OptionsBitmap(),
// LevelControlTrait.OptionsBitmap()
// )
// }
ActionViewModel.Action.MODE_HEAT -> { SimplifiedThermostat
.setSystemMode(SimplifiedThermostatTrait.SystemModeEnum.Heat) }
...
}
একটি অটোমেশন সম্পন্ন করার শেষ ধাপ হল একটি অটোমেশনড্রাফ্ট তৈরি করতে getDraftAutomation ফাংশন বাস্তবায়ন করা AutomationDraft.
Home API গুলিকে কল করে এবং ব্যতিক্রমগুলি পরিচালনা করে অটোমেশন তৈরি করতে HomeAppViewModel.kt ফাইলে ধাপ 4.4.3-এ মন্তব্য মুক্ত করুন:
fun createAutomation(isPending: MutableState<Boolean>) {
viewModelScope.launch {
val structure : Structure = selectedStructureVM.value?.structure!!
val draft : DraftAutomation = selectedDraftVM.value?.getDraftAutomation()!!
isPending.value = true
// TODO: 4.4.3 - Call the Home API to create automation and handle exceptions
// // Call Automation API to create an automation from a draft:
// try {
// structure.createAutomation(draft)
// }
// catch (e: Exception) {
// MainActivity.showError(this, e.toString())
// isPending.value = false
// return@launch
// }
// Scrap the draft and automation candidates used in the process:
selectedCandidateVMs.emit(null)
selectedDraftVM.emit(null)
isPending.value = false
}
}
এখন অ্যাপটি চালান এবং আপনার ডিভাইসে পরিবর্তনগুলি দেখুন!
একবার একটি স্টার্টার এবং অ্যাকশন নির্বাচন করার পরে, আপনি অটোমেশন তৈরি করতে প্রস্তুত:

নিশ্চিত করুন যে আপনি আপনার অটোমেশনের নাম অনন্য কিছু রেখেছেন, তারপর Create Automation বোতামটি আলতো চাপুন, যা API গুলিকে কল করবে এবং আপনার অটোমেশনের সাথে আপনাকে অটোমেশন তালিকা ভিউতে ফিরিয়ে আনবে:

আপনার তৈরি করা অটোমেশনে ট্যাপ করুন, এবং দেখুন API গুলি কীভাবে এটি ফেরত দেয়।

মনে রাখবেন যে API একটি মান প্রদান করে যা নির্দেশ করে যে একটি অটোমেশন বৈধ এবং বর্তমানে সক্রিয় কিনা । এমন অটোমেশন তৈরি করা সম্ভব যা সার্ভার সাইডে পার্স করার সময় বৈধতা পাস করে না। যদি একটি অটোমেশন পার্সিং বৈধতা ব্যর্থ হয়, তাহলে isValid false তে সেট করা হয়, যা নির্দেশ করে যে অটোমেশনটি অবৈধ এবং নিষ্ক্রিয়। যদি আপনার অটোমেশন অবৈধ হয়, তাহলে বিস্তারিত জানার জন্য automation.validationIssues ক্ষেত্রটি পরীক্ষা করুন।
নিশ্চিত করুন যে আপনার অটোমেশনটি বৈধ এবং সক্রিয় হিসাবে সেট করা আছে, এবং তারপর আপনি অটোমেশনটি চেষ্টা করে দেখতে পারেন।
তোমার অটোমেশন চেষ্টা করে দেখো
অটোমেশন দুটি উপায়ে কার্যকর করা যেতে পারে:
- একটি স্টার্টার ইভেন্ট সহ। যদি শর্তগুলি মিলে যায়, তাহলে এটি অটোমেশনে আপনার সেট করা ক্রিয়াটি ট্রিগার করে।
- একটি ম্যানুয়াল এক্সিকিউশন API কল সহ।
যদি একটি ড্রাফ্ট অটোমেশনে অটোমেশন ড্রাফ্ট DSL ব্লকে একটি manualStarter() সংজ্ঞায়িত থাকে, তাহলে অটোমেশন ইঞ্জিনটি সেই অটোমেশনের জন্য ম্যানুয়াল এক্সিকিউশন সমর্থন করবে। এটি ইতিমধ্যেই Sample App-এর কোড উদাহরণগুলিতে উপস্থিত রয়েছে।
যেহেতু আপনি এখনও আপনার মোবাইল ডিভাইসের অটোমেশন ভিউ স্ক্রিনে আছেন, তাই Manual Execute বোতামটি আলতো চাপুন। এটি automation.execute() কল করবে, যা অটোমেশন সেট আপ করার সময় আপনার নির্বাচিত ডিভাইসে আপনার অ্যাকশন কমান্ড চালায়।
API ব্যবহার করে ম্যানুয়াল এক্সিকিউশনের মাধ্যমে অ্যাকশন কমান্ডটি যাচাই করার পরে, এখন দেখার সময় এসেছে যে এটি আপনার সংজ্ঞায়িত স্টার্টার ব্যবহার করেও এক্সিকিউট হচ্ছে কিনা।
ডিভাইস ট্যাবে যান, অ্যাকশন ডিভাইস এবং বৈশিষ্ট্য নির্বাচন করুন এবং এটিকে একটি ভিন্ন মানে সেট করুন (উদাহরণস্বরূপ, light2 এর LevelControl (উজ্জ্বলতা) 50% এ সেট করুন, যেমনটি নিম্নলিখিত স্ক্রিনশটে দেখানো হয়েছে:

আমরা এখন স্টার্টার ডিভাইস ব্যবহার করে অটোমেশন ট্রিগার করার চেষ্টা করব। অটোমেশন তৈরি করার সময় আপনার নির্বাচিত স্টার্টার ডিভাইসটি নির্বাচন করুন। আপনার নির্বাচিত বৈশিষ্ট্যটি টগল করুন (উদাহরণস্বরূপ, starter outlet1 এর OnOff কে On এ সেট করুন):

আপনি দেখতে পাবেন যে এটি অটোমেশনও কার্যকর করে এবং অ্যাকশন ডিভাইস light2 এর LevelControl বৈশিষ্ট্যটিকে মূল মান, 100% এ সেট করে:

অভিনন্দন, আপনি অটোমেশন তৈরি করতে সফলভাবে হোম এপিআই ব্যবহার করেছেন!
অটোমেশন API সম্পর্কে আরও জানতে, Android অটোমেশন API দেখুন।
৫. সক্ষমতা আবিষ্কার করুন
হোম এপিআইগুলিতে ডিসকভারি এপিআই নামে একটি ডেডিকেটেড এপিআই অন্তর্ভুক্ত থাকে, যা ডেভেলপাররা একটি নির্দিষ্ট ডিভাইসে কোন অটোমেশন সক্ষম বৈশিষ্ট্যগুলি সমর্থিত তা জিজ্ঞাসা করতে ব্যবহার করতে পারে। স্যাম্পল অ্যাপটি একটি উদাহরণ প্রদান করে যেখানে আপনি কোন কমান্ডগুলি উপলব্ধ তা আবিষ্কার করতে এই এপিআই ব্যবহার করতে পারেন।
কমান্ড আবিষ্কার করুন
এই বিভাগে, আমরা আলোচনা করব কিভাবে সমর্থিত CommandCandidates আবিষ্কার করা যায় এবং কিভাবে আবিষ্কৃত প্রার্থী নোডের উপর ভিত্তি করে একটি অটোমেশন তৈরি করা যায়।
Sample অ্যাপে, আমরা device.candidates() কে কল করে প্রার্থীদের একটি তালিকা পাই, যার মধ্যে CommandCandidate , EventCandidate অথবা TraitAttributesCandidate এর উদাহরণ অন্তর্ভুক্ত থাকতে পারে।
HomeAppViewModel.kt ফাইলে যান এবং প্রার্থী তালিকা পুনরুদ্ধার করতে ধাপ 5.1.1 আনকমেন্ট করুন এবং Candidate ধরণ দিয়ে ফিল্টার করুন:
fun showCandidates() {
...
// TODO: 5.1.1 - Retrieve automation candidates, filtering to include CommandCandidate types only
// // Retrieve a set of initial automation candidates from the device:
// val candidates: Set<NodeCandidate> = deviceVM.device.candidates().first()
//
// for (candidate in candidates) {
// // Check whether the candidate trait is supported:
// if(candidate.trait !in HomeApp.supportedTraits)
// continue
// // Check whether the candidate type is supported:
// when (candidate) {
// // Command candidate type:
// is CommandCandidate -> {
// // Check whether the command candidate has a supported command:
// if (candidate.commandDescriptor !in ActionViewModel.commandMap)
// continue
// }
// // Other candidate types are currently unsupported:
// else -> { continue }
// }
//
// candidateVMList.add(CandidateViewModel(candidate, deviceVM))
// }
...
// Store the ViewModels:
selectedCandidateVMs.emit(candidateVMList)
}
CommandCandidate. API দ্বারা ফেরত পাঠানো প্রার্থীরা বিভিন্ন ধরণের। Sample অ্যাপটি CommandCandidate সমর্থন করে। এই সমর্থিত বৈশিষ্ট্যগুলি সেট করতে ActionViewModel.kt এ সংজ্ঞায়িত commandMap এ ধাপ 5.1.2 মন্তব্য মুক্ত করুন:
// Map of supported commands from Discovery API:
val commandMap: Map<CommandDescriptor, Action> = mapOf(
// TODO: 5.1.2 - Set current supported commands
// OnOffTrait.OnCommand to Action.ON,
// OnOffTrait.OffCommand to Action.OFF,
// LevelControlTrait.MoveToLevelWithOnOffCommand to Action.MOVE_TO_LEVEL
)
এখন যেহেতু আমরা Discovery API কল করতে পারছি এবং Sample App-এ আমাদের সাপোর্ট করা ফলাফল ফিল্টার করতে পারছি, তাই আমরা আলোচনা করব কিভাবে আমরা এটিকে আমাদের এডিটরে ইন্টিগ্রেট করতে পারি।

ডিসকভারি এপিআই সম্পর্কে আরও জানতে, অ্যান্ড্রয়েডে লিভারেজ ডিভাইস ডিসকভারি দেখুন।
সম্পাদককে একীভূত করুন
আবিষ্কৃত ক্রিয়াগুলি ব্যবহার করার সবচেয়ে সাধারণ উপায় হল সেগুলি একজন শেষ-ব্যবহারকারীর কাছে উপস্থাপন করা যাতে সেগুলি থেকে নির্বাচন করা যায়। ব্যবহারকারী খসড়া অটোমেশন ক্ষেত্রগুলি নির্বাচন করার ঠিক আগে, আমরা তাদের আবিষ্কৃত ক্রিয়াগুলির তালিকা দেখাতে পারি এবং তারা যে মানের নির্বাচন করে তার উপর নির্ভর করে আমরা অটোমেশন খসড়ায় অ্যাকশন নোডটি আগে থেকে পূরণ করতে পারি।
CandidatesView.kt ফাইলটিতে ভিউ ক্লাস রয়েছে যা আবিষ্কৃত প্রার্থীদের প্রদর্শন করে। CandidateListItem এর .clickable{} ফাংশন সক্রিয় করতে পদক্ষেপ 5.2.1 মন্তব্য মুক্ত করুন যা homeAppVM.selectedDraftVM candidateVM হিসেবে সেট করে:
fun CandidateListItem (candidateVM: CandidateViewModel, homeAppVM: HomeAppViewModel) {
val scope: CoroutineScope = rememberCoroutineScope()
Box (Modifier.padding(horizontal = 24.dp, vertical = 8.dp)) {
Column (Modifier.fillMaxWidth().clickable {
// TODO: 5.2.1 - Set the selectedDraftVM to the selected candidate
// scope.launch { homeAppVM.selectedDraftVM.emit(DraftViewModel(candidateVM)) }
}) {
...
}
}
}
HomeAppView.kt এর ধাপ ৪.৩ এর মতো, যখন selectedDraftVM সেট করা হয়, তখন এটি DraftView.kt` DraftView(...) in রেন্ডার করে:
fun HomeAppView (homeAppVM: HomeAppViewModel) {
...
val selectedDraftVM: DraftViewModel? by homeAppVM.selectedDraftVM.collectAsState()
...
// If a draft automation is selected, show the draft editor:
if (selectedDraftVM != null) {
DraftView(homeAppVM)
}
...
}
পূর্ববর্তী বিভাগে দেখানো light2 - MOVE_TO_LEVEL ট্যাপ করে আবার চেষ্টা করুন, যা আপনাকে প্রার্থীর কমান্ডের উপর ভিত্তি করে একটি নতুন অটোমেশন তৈরি করতে অনুরোধ করবে:

এখন যেহেতু আপনি স্যাম্পল অ্যাপে অটোমেশন তৈরির সাথে পরিচিত, আপনি আপনার অ্যাপগুলিতে অটোমেশন সংহত করতে পারেন।
৬. উন্নত অটোমেশন উদাহরণ
শেষ করার আগে, আমরা কিছু অতিরিক্ত অটোমেশন DSL উদাহরণ নিয়ে আলোচনা করব। এগুলি API গুলির সাহায্যে আপনি যে উন্নত ক্ষমতা অর্জন করতে পারেন তার কিছু চিত্র তুলে ধরে।
শুরুর সময় হিসেবে দিনের সময়
ডিভাইসের বৈশিষ্ট্য ছাড়াও, গুগল হোম এপিআইগুলি কাঠামো ভিত্তিক বৈশিষ্ট্যগুলি অফার করে, যেমন Time । আপনি এমন একটি অটোমেশন তৈরি করতে পারেন যার সময় ভিত্তিক স্টার্টার রয়েছে, যেমন নিম্নলিখিত:
automation {
name = "AutomationName"
description = "An example automation description."
isActive = true
description = "Do ... actions when time is up."
sequential {
// starter
val starter = starter<_>(structure, Time.ScheduledTimeEvent) {
parameter(
Time.ScheduledTimeEvent.clockTime(
LocalTime.of(hour, min, sec, 0)
)
)
}
// action
...
}
}
অ্যাকশন হিসেবে অ্যাসিস্ট্যান্ট ব্রডকাস্ট
AssistantBroadcast বৈশিষ্ট্যটি SpeakerDevice এ ডিভাইস-স্তরের বৈশিষ্ট্য হিসেবে (যদি স্পিকার এটি সমর্থন করে) অথবা কাঠামো-স্তরের বৈশিষ্ট্য হিসেবে (কারণ Google স্পিকার এবং Android মোবাইল ডিভাইসগুলি Assistant সম্প্রচার চালাতে পারে) পাওয়া যায়। উদাহরণস্বরূপ:
automation {
name = "AutomationName"
description = "An example automation description."
isActive = true
description = "Broadcast in Speaker when ..."
sequential {
// starter
...
// action
action(structure) {
command(
AssistantBroadcast.broadcast("Time is up!!")
)
}
}
}
DelayFor ব্যবহার করুন এবং suppressFor
অটোমেশন API তে delayFor এর মতো উন্নত অপারেটরও রয়েছে, যা কমান্ড বিলম্বিত করার জন্য ব্যবহৃত হয় এবং suppressFor এর মতো অপারেটরগুলি নির্দিষ্ট সময়ের মধ্যে একই ইভেন্ট দ্বারা ট্রিগার হওয়া থেকে অটোমেশনকে দমন করতে পারে। এই অপারেটরগুলি ব্যবহারের কিছু উদাহরণ এখানে দেওয়া হল:
sequential {
val starterNode = starter<_>(device, OccupancySensorDevice, MotionDetection)
// only proceed if there is currently motion taking place
condition { starterNode.motionDetectionEventInProgress equals true }
// ignore the starter for one minute after it was last triggered
suppressFor(Duration.ofMinutes(1))
// make announcements three seconds apart
action(device, SpeakerDevice) {
command(AssistantBroadcast.broadcast("Intruder detected!"))
}
delayFor(Duration.ofSeconds(3))
action(device, SpeakerDevice) {
command(AssistantBroadcast.broadcast("Intruder detected!"))
}
...
}
স্টার্টারে AreaPresenceState ব্যবহার করুন
AreaPresenceState হল একটি কাঠামো-স্তরের বৈশিষ্ট্য যা সনাক্ত করে যে কেউ বাড়িতে আছে কিনা।
উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণটি দেখায় যে রাত ১০টার পরে কেউ বাড়িতে থাকলে দরজা স্বয়ংক্রিয়ভাবে লক হয়ে যায়:
automation {
name = "Lock the doors when someone is home after 10pm"
description = "1 starter, 2 actions"
sequential {
val unused =
starter(structure, event = Time.ScheduledTimeEvent) {
parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(22, 0, 0, 0)))
}
val stateReaderNode = stateReader<_>(structure, AreaPresenceState)
condition {
expression =
stateReaderNode.presenceState equals
AreaPresenceStateTrait.PresenceState.PresenceStateOccupied
}
action(structure) { command(AssistantBroadcast.broadcast("Locks are being applied")) }
for (lockDevice in lockDevices) {
action(lockDevice, DoorLockDevice) {
command(Command(DoorLock, DoorLockTrait.LockDoorCommand.requestId.toString(), mapOf()))
}
}
}
এখন যেহেতু আপনি এই উন্নত অটোমেশন ক্ষমতাগুলির সাথে পরিচিত, তাই বেরিয়ে পড়ুন এবং দুর্দান্ত অ্যাপ তৈরি করুন!
৭. অভিনন্দন!
অভিনন্দন! আপনি গুগল হোম এপিআই ব্যবহার করে একটি অ্যান্ড্রয়েড অ্যাপ তৈরির দ্বিতীয় অংশ সফলভাবে সম্পন্ন করেছেন। এই কোডল্যাব জুড়ে, আপনি অটোমেশন এবং ডিসকভারি এপিআইগুলি অন্বেষণ করেছেন।
আমরা আশা করি আপনি এমন অ্যাপ তৈরি করতে উপভোগ করবেন যা গুগল হোম ইকোসিস্টেমের মধ্যে সৃজনশীলভাবে ডিভাইস নিয়ন্ত্রণ করে এবং হোম এপিআই ব্যবহার করে উত্তেজনাপূর্ণ অটোমেশন পরিস্থিতি তৈরি করে!
পরবর্তী পদক্ষেপ
- কীভাবে কার্যকরভাবে অ্যাপ ডিবাগ করতে হয় এবং হোম এপিআই সম্পর্কিত সমস্যাগুলির সমাধান করতে হয় তা জানতে সমস্যা সমাধান পড়ুন।
- আপনি যেকোনো সুপারিশের জন্য আমাদের সাথে যোগাযোগ করতে পারেন, অথবা ইস্যু ট্র্যাকার , স্মার্ট হোম সাপোর্ট টপিকের মাধ্যমে যেকোনো সমস্যা রিপোর্ট করতে পারেন।