অ্যান্ড্রয়েডে হোম API ব্যবহার করে অটোমেশন তৈরি করুন

1. আপনি শুরু করার আগে

এটি গুগল হোম API ব্যবহার করে একটি অ্যান্ড্রয়েড অ্যাপ তৈরির সিরিজের দ্বিতীয় কোডল্যাব। এই কোডল্যাবে আমরা কীভাবে হোম অটোমেশন তৈরি করতে পারি এবং API ব্যবহার করে সেরা অনুশীলনের বিষয়ে কিছু টিপস প্রদান করি। আপনি যদি এখনও প্রথম কোডল্যাব সম্পূর্ণ না করে থাকেন, তাহলে Android-এ Home API ব্যবহার করে একটি মোবাইল অ্যাপ তৈরি করুন , আমরা আপনাকে এই কোডল্যাব শুরু করার আগে সেটি সম্পূর্ণ করার পরামর্শ দিই।

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

পূর্বশর্ত

আপনি কি শিখবেন

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

2. আপনার প্রকল্প সেট আপ করা

নিম্নলিখিত চিত্রটি একটি Home APIs অ্যাপের আর্কিটেকচারকে চিত্রিত করে:

একটি অ্যান্ড্রয়েড অ্যাপের জন্য হোম API-এর আর্কিটেকচার

  • অ্যাপ কোড: মূল কোড যা ডেভেলপাররা অ্যাপের ইউজার ইন্টারফেস তৈরি করতে কাজ করে এবং হোম API SDK-এর সাথে ইন্টারঅ্যাক্ট করার যুক্তি।
  • হোম APIs SDK: Google দ্বারা প্রদত্ত হোম APIs SDK স্মার্ট হোম ডিভাইসগুলিকে নিয়ন্ত্রণ করতে GMSCore-এর হোম API পরিষেবার সাথে কাজ করে৷ ডেভেলপাররা হোম API-এর সাথে কাজ করে এমন অ্যাপগুলিকে Home API SDK-এর সাথে বান্ডিল করে তৈরি করে।
  • অ্যান্ড্রয়েডে GMSCore: GMSCore, Google Play পরিষেবা নামেও পরিচিত, একটি Google প্ল্যাটফর্ম যা মূল সিস্টেম পরিষেবা প্রদান করে, সমস্ত প্রত্যয়িত Android ডিভাইসে মূল কার্যকারিতা সক্ষম করে৷ Google Play পরিষেবাগুলির হোম মডিউলে সেই পরিষেবাগুলি রয়েছে যা হোম APIগুলির সাথে ইন্টারঅ্যাক্ট করে৷

এই কোডল্যাবে আমরা Android-এ Home APIs ব্যবহার করে Build a mobile app- এ যা কভার করেছি তার উপর ভিত্তি করে তৈরি করব।

নিশ্চিত করুন যে আপনার অন্তত দুটি সমর্থিত ডিভাইস সহ একটি কাঠামো আছে এবং অ্যাকাউন্টে কাজ করছে। যেহেতু আমরা এই কোডল্যাবে অটোমেশন সেট আপ করতে যাচ্ছি (একটি ডিভাইসের অবস্থার পরিবর্তন অন্যটিতে একটি অ্যাকশন ট্রিগার করে) ফলাফলগুলি দেখতে আপনার দুটি ডিভাইসের প্রয়োজন হবে৷

নমুনা অ্যাপ পান

স্যাম্পল অ্যাপের সোর্স কোড 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

মনে রাখবেন যে এটি Android-এ Home APIs ব্যবহার করে মোবাইল অ্যাপ তৈরিতে ব্যবহৃত একটি ভিন্ন শাখা। কোডবেসের এই শাখাটি তৈরি হয় যেখানে প্রথম কোডল্যাবটি ছেড়ে গিয়েছিল। এই সময়, উদাহরণগুলি আপনাকে কীভাবে অটোমেশন তৈরি করতে হয় তার মধ্যে নিয়ে যায়। আপনি যদি পূর্বের কোডল্যাবটি সম্পূর্ণ করেন এবং সমস্ত কার্যকারিতা কাজ করতে সক্ষম হন, তাহলে আপনি codelab-branch-2 ব্যবহার করার পরিবর্তে এই কোডল্যাবটি সম্পূর্ণ করতে একই Android স্টুডিও প্রকল্প ব্যবহার করতে পারেন।

একবার আপনার সোর্স কোড সংকলিত হয়ে গেলে এবং আপনার মোবাইল ডিভাইসে চালানোর জন্য প্রস্তুত হলে, পরবর্তী বিভাগটি চালিয়ে যান।

3. অটোমেশন সম্পর্কে জানুন

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

অটোমেশনগুলি নোড নামে পরিচিত তিনটি ভিন্ন ধরণের উপাদান নিয়ে গঠিত: স্টার্টার, অ্যাকশন এবং শর্ত। এই নোডগুলি স্মার্ট হোম ডিভাইসগুলি ব্যবহার করে আচরণগুলি স্বয়ংক্রিয় করতে একসাথে কাজ করে। সাধারণত, তারা নিম্নলিখিত ক্রমে মূল্যায়ন করা হয়:

  1. স্টার্টার — স্বয়ংক্রিয়তা সক্রিয় করে এমন প্রাথমিক শর্তগুলি সংজ্ঞায়িত করে, যেমন একটি বৈশিষ্ট্য মান পরিবর্তন। একটি অটোমেশনের একটি স্টার্টার থাকতে হবে।
  2. শর্ত - একটি অটোমেশন ট্রিগার হওয়ার পরে মূল্যায়ন করার জন্য কোনো অতিরিক্ত সীমাবদ্ধতা। একটি অটোমেশনের ক্রিয়াগুলি কার্যকর করার জন্য একটি শর্তের অভিব্যক্তিটিকে সত্য হিসাবে মূল্যায়ন করতে হবে৷
  3. অ্যাকশন — কমান্ড বা স্টেট আপডেট যা সঞ্চালিত হয় যখন সব শর্ত পূরণ করা হয়।

উদাহরণস্বরূপ, আপনার একটি অটোমেশন থাকতে পারে যা একটি রুমের আলো কমিয়ে দেয় যখন একটি সুইচ টগল করা হয়, যখন সেই ঘরে টিভি চালু থাকে। এই উদাহরণে:

  • স্টার্টার — রুমের সুইচটি টগল করা হয়েছে।
  • শর্ত — টিভি অনঅফ অবস্থাকে চালু বলে মূল্যায়ন করা হয়।
  • অ্যাকশন — সুইচের মতো একই ঘরে আলো নিভে গেছে।

এই নোডগুলি, একটি সিরিয়াল বা সমান্তরাল ফ্যাশনে অটোমেশন ইঞ্জিন দ্বারা মূল্যায়ন করা হয়।

image5.png

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

image6.png

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

অটোমেশন স্কিমা অন্যান্য ধরনের নোড আছে. আপনি হোম APIs বিকাশকারীর গাইডের নোড বিভাগে তাদের সম্পর্কে আরও জানতে পারেন। উপরন্তু, বিকাশকারীরা জটিল অটোমেশন তৈরি করতে বিভিন্ন ধরনের নোডকে একত্রিত করতে পারে, যেমন:

image13.png

বিকাশকারীরা এই নোডগুলি অটোমেশন ইঞ্জিনে প্রদান করে একটি ডোমেন-নির্দিষ্ট ভাষা (DSL) ব্যবহার করে যা বিশেষভাবে Google Home অটোমেশনের জন্য তৈরি করা হয়েছে।

অটোমেশন ডিএসএল অন্বেষণ করুন

একটি ডোমেন-নির্দিষ্ট ভাষা (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() ) এ পরিবর্তিত হয়।

আপনি যখন অটোমেশন নিয়ে কাজ করছেন, তখন জেনে রাখুন সম্পদের সীমা আছে।

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

4. একটি অটোমেশন সম্পাদক তৈরি করুন

স্যাম্পল অ্যাপের মধ্যে, আমরা একটি অটোমেশন এডিটর তৈরি করব যার সাহায্যে ব্যবহারকারীরা ডিভাইস নির্বাচন করতে পারবে, তারা যে ক্ষমতাগুলি (ক্রিয়াগুলি) ব্যবহার করতে চায় এবং কীভাবে স্টার্টার ব্যবহার করে অটোমেশনগুলি ট্রিগার হয়৷

img11-01.pngimg11-02.pngimg11-03.pngimg11-04.png

স্টার্টার সেট আপ করুন

অটোমেশন স্টার্টার হল অটোমেশনের এন্ট্রি পয়েন্ট। একটি প্রদত্ত ইভেন্ট সঞ্চালিত হলে একটি স্টার্টার একটি অটোমেশন ট্রিগার করে। স্যাম্পল অ্যাপে, আমরা StarterViewModel ক্লাস ব্যবহার করে অটোমেশন স্টার্টার ক্যাপচার করি, StarterViewModel.kt সোর্স ফাইলে পাওয়া যায় এবং 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,
)

অ্যাপটি তারপরে ভিউ উপাদানগুলির একটি সেট প্রদর্শন করে যা ব্যবহারকারীরা প্রয়োজনীয় ক্ষেত্রগুলি নির্বাচন করতে ব্যবহার করতে পারেন।

সমস্ত স্টার্টার ডিভাইস রেন্ডার করতে এবং DropdownMenu ক্লিক কলব্যাক প্রয়োগ করতে StarterView.kt ফাইলে পদক্ষেপ 4.1.1 আনকমেন্ট করুন:

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
//         }
//     )
// }
}

স্টার্টার ডিভাইসের সমস্ত বৈশিষ্ট্য রেন্ডার করতে এবং DropdownMenu ক্লিক কলব্যাক প্রয়োগ করতে StarterView.kt ফাইলে পদক্ষেপ 4.1.2 আনকমেন্ট করুন:

// 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)) }

অ্যাপ্লিকেশন চালানো এবং একটি নতুন অটোমেশন এবং স্টার্টার নির্বাচন করা নিম্নলিখিত মত একটি দৃশ্য দেখাতে হবে:

79beb3b581ec71ec.png

স্যাম্পল অ্যাপ শুধুমাত্র ডিভাইসের বৈশিষ্ট্যের উপর ভিত্তি করে স্টার্টারদের সমর্থন করে।

কর্ম সেট আপ করুন

অটোমেশন ক্রিয়া একটি অটোমেশনের কেন্দ্রীয় উদ্দেশ্যকে প্রতিফলিত করে, এটি কীভাবে ভৌত জগতের পরিবর্তনকে প্রভাবিত করে। স্যাম্পল অ্যাপে, আমরা ActionViewModel ক্লাস ব্যবহার করে অটোমেশন অ্যাকশন ক্যাপচার করি এবং ActionView ক্লাস ব্যবহার করে এডিটর ভিউ প্রদর্শন করি।

নমুনা অ্যাপটি অটোমেশন অ্যাকশন নোডগুলিকে সংজ্ঞায়িত করতে নিম্নলিখিত হোম API সত্তাগুলি ব্যবহার করে:

  • ডিভাইস
  • বৈশিষ্ট্য
  • আদেশ
  • মান (ঐচ্ছিক)

প্রতিটি ডিভাইস কমান্ড অ্যাকশন একটি কমান্ড ব্যবহার করে, কিন্তু কিছু কিছু এর সাথে যুক্ত একটি প্যারামিটার মান প্রয়োজন, যেমন 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 আনকমেন্ট করুন এবং একটি DropdownMenu ক্লিক কলব্যাক প্রয়োগ করুন actionTrait সেট করার জন্য, যে বৈশিষ্ট্যের সাথে কমান্ডটি রয়েছে তার প্রতিনিধিত্ব করে।

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
//         }
//     )
// }
}

actionTrait সমস্ত উপলব্ধ অ্যাকশন রেন্ডার করার জন্য ActionView.kt ফাইলে পদক্ষেপ 4.2.3 আনকমেন্ট করুন এবং 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 বৈশিষ্ট্য অ্যাকশন (কমান্ড) এর উপলব্ধ মান রেন্ডার করুন এবং মান পরিবর্তন কলব্যাকে 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 অটোমেশনের অ্যাকশন ViewModel ( draftVM.actionVMs ) ViewModel

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)) }

অ্যাপটি চালানো এবং একটি নতুন অটোমেশন এবং অ্যাকশন নির্বাচন করার ফলে নিম্নলিখিতগুলির মতো একটি দৃশ্য পাওয়া উচিত:

6efa3c7cafd3e595.png

আমরা শুধুমাত্র স্যাম্পল অ্যাপে ডিভাইসের বৈশিষ্ট্যের উপর ভিত্তি করে অ্যাকশন সমর্থন করি।

একটি খসড়া অটোমেশন রেন্ডার করুন

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 হলে অটোমেশন গ্রাফ তৈরি করার জন্য প্রয়োজনীয় "নির্বাচন" এক্সপ্রেশন তৈরি করতে 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()
     ...
}

অটোমেশন গ্রাফ তৈরি করার জন্য প্রয়োজনীয় সমান্তরাল এক্সপ্রেশন তৈরি করতে DraftViewModel.kt ফাইলে 4.4.2 ধাপে আনকমেন্ট করুন যখন নির্বাচিত অ্যাকশন বৈশিষ্ট্য LevelControl হয় এবং নির্বাচিত অ্যাকশনটি MOVE_TO_LEVEL হয় :

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) }
          ...
}

একটি অটোমেশন সম্পূর্ণ করার শেষ ধাপ হল একটি AutomationDraft. তৈরি করতে getDraftAutomation ফাংশন বাস্তবায়ন করা।

HomeAppViewModel.kt ফাইলে অকমেন্ট স্টেপ 4.4.3 হোম API কল করে এবং ব্যতিক্রমগুলি পরিচালনা করে অটোমেশন তৈরি করুন:

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
  }
}

এখন অ্যাপটি চালান এবং আপনার ডিভাইসে পরিবর্তনগুলি দেখুন!

একবার একটি স্টার্টার এবং অ্যাকশন নির্বাচন করার পরে, আপনি অটোমেশন তৈরি করতে প্রস্তুত:

ec551405f8b07b8e.png

নিশ্চিত করুন যে আপনি আপনার অটোমেশনকে অনন্য কিছু নাম দিয়েছেন, তারপরে অটোমেশন তৈরি করুন বোতামটি আলতো চাপুন, যা API গুলিকে কল করবে এবং আপনার অটোমেশনের সাথে আপনাকে অটোমেশন তালিকা দৃশ্যে ফিরিয়ে আনবে:

8eebc32cd3755618.png

আপনি এইমাত্র যে অটোমেশনটি তৈরি করেছেন তা আলতো চাপুন এবং দেখুন কিভাবে APIs দ্বারা এটি ফিরিয়ে দেওয়া হয়।

931dba7c325d6ef7.png

সচেতন থাকুন যে API একটি মান প্রদান করে যা নির্দেশ করে যে একটি অটোমেশন বৈধ এবং বর্তমানে সক্রিয় কিনা । এমন অটোমেশন তৈরি করা সম্ভব যেগুলি সার্ভার সাইডে পার্স করার সময় বৈধতা পাস করে না। যদি একটি অটোমেশন পার্সিং বৈধকরণে ব্যর্থ হয়, তাহলে isValid false সেট করা হয়, যা নির্দেশ করে যে অটোমেশনটি অবৈধ এবং নিষ্ক্রিয়। আপনার অটোমেশন অবৈধ হলে, বিস্তারিত জানার জন্য automation.validationIssues ক্ষেত্রটি পরীক্ষা করুন।

নিশ্চিত করুন যে আপনার অটোমেশন বৈধ এবং সক্রিয় হিসাবে সেট করা আছে এবং তারপর আপনি অটোমেশন চেষ্টা করে দেখতে পারেন।

আপনার অটোমেশন চেষ্টা করুন

অটোমেশন দুটি উপায়ে কার্যকর করা যেতে পারে:

  1. একটি স্টার্টার ইভেন্ট সঙ্গে. শর্ত মিলে গেলে, এটি অটোমেশনে আপনার সেট করা অ্যাকশনটিকে ট্রিগার করে।
  2. একটি ম্যানুয়াল এক্সিকিউশন API কল সহ।

যদি একটি ড্রাফ্ট অটোমেশনের অটোমেশন ড্রাফ্ট DSL ব্লকে একটি manualStarter() সংজ্ঞায়িত থাকে, তাহলে অটোমেশন ইঞ্জিন সেই অটোমেশনের জন্য ম্যানুয়াল এক্সিকিউশন সমর্থন করবে। এটি ইতিমধ্যেই নমুনা অ্যাপের কোড উদাহরণগুলিতে উপস্থিত রয়েছে৷

যেহেতু আপনি এখনও আপনার মোবাইল ডিভাইসে অটোমেশন ভিউ স্ক্রিনে আছেন, ম্যানুয়াল এক্সিকিউট বোতামটি আলতো চাপুন৷ এটি automation.execute() কল করা উচিত, যা অটোমেশন সেট আপ করার সময় আপনার নির্বাচিত ডিভাইসে আপনার অ্যাকশন কমান্ড চালায়।

একবার আপনি API ব্যবহার করে ম্যানুয়াল এক্সিকিউশনের মাধ্যমে অ্যাকশন কমান্ডটি যাচাই করলে, এখন এটি আপনার সংজ্ঞায়িত স্টার্টার ব্যবহার করে কার্যকর হচ্ছে কিনা তা দেখার সময়।

ডিভাইস ট্যাবে যান, অ্যাকশন ডিভাইস এবং বৈশিষ্ট্য নির্বাচন করুন এবং এটিকে একটি ভিন্ন মান সেট করুন (উদাহরণস্বরূপ, light2 এর LevelControl (উজ্জ্বলতা) 50% সেট করুন, যেমনটি নিম্নলিখিত স্ক্রিনশটে চিত্রিত হয়েছে:

d0357ec71325d1a8.png

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

230c78cd71c95564.png

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

1f00292128bde1c2.png

অভিনন্দন, আপনি অটোমেশন তৈরি করতে সফলভাবে হোম API ব্যবহার করেছেন!

অটোমেশন API সম্পর্কে আরও জানতে, Android Automation API দেখুন।

5. সক্ষমতা আবিষ্কার করুন

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

কমান্ড আবিষ্কার করুন

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

নমুনা অ্যাপে, আমরা প্রার্থীদের একটি তালিকা পেতে device.candidates() কল করি, যাতে CommandCandidate , EventCandidate বা TraitAttributesCandidate এর উদাহরণ থাকতে পারে।

HomeAppViewModel.kt ফাইলে যান এবং প্রার্থী তালিকা পুনরুদ্ধার করতে এবং Candidate ধরন সহ ফিল্টার করতে পদক্ষেপ 5.1.1 মন্তব্য করুন:

   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 দ্বারা ফিরে আসা প্রার্থীরা বিভিন্ন ধরণের অন্তর্গত। নমুনা অ্যাপটি 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
)

এখন যেহেতু আমরা ডিসকভারি এপিআই কল করতে সক্ষম হয়েছি, এবং নমুনা অ্যাপে আমরা যে ফলাফলগুলি সমর্থন করি তা ফিল্টার করতে পেরেছি, আমরা কীভাবে এটিকে আমাদের সম্পাদকের সাথে সংহত করতে পারি তা নিয়ে আলোচনা করব৷

8a2f0e8940f7056a.png

ডিসকভারি এপিআই সম্পর্কে আরও জানতে, অ্যান্ড্রয়েডে লিভারেজ ডিভাইস আবিষ্কারে যান।

সম্পাদককে সংহত করুন

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

CandidatesView.kt ফাইলটিতে ভিউ ক্লাস রয়েছে যা আবিষ্কৃত প্রার্থীদের প্রদর্শন করে। CandidateListItem এর .clickable{} ফাংশন সক্রিয় করতে পদক্ষেপ 5.2.1 Uncomment করুন যা 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 এর ধাপ 4.3-এর মতো, যখন selectedDraftVM DraftVM সেট করা হয়, তখন এটি 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 ট্যাপ করে এটি আবার চেষ্টা করুন, যা আপনাকে প্রার্থীর আদেশের উপর ভিত্তি করে একটি নতুন অটোমেশন তৈরি করতে অনুরোধ করে:

15e67763a9241000.png

এখন যেহেতু আপনি নমুনা অ্যাপে অটোমেশন তৈরির সাথে পরিচিত, আপনি আপনার অ্যাপে অটোমেশনকে একীভূত করতে পারেন।

6. উন্নত অটোমেশন উদাহরণ

আমরা শেষ করার আগে, আমরা কিছু অতিরিক্ত অটোমেশন ডিএসএল উদাহরণ নিয়ে আলোচনা করব। এগুলি কিছু উন্নত ক্ষমতাগুলিকে চিত্রিত করে যা আপনি APIগুলির সাথে অর্জন করতে পারেন৷

স্টার্টার হিসাবে দিনের সময়

ডিভাইসের বৈশিষ্ট্যগুলি ছাড়াও, Google Home 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 স্পিকার এবং অ্যান্ড্রয়েড মোবাইল ডিভাইসগুলি সহকারী সম্প্রচার চালাতে পারে)। যেমন:

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 ব্যবহার করুন

অটোমেশন এপিআই উন্নত অপারেটরও প্রদান করে যেমন 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 হল একটি কাঠামো-স্তরের বৈশিষ্ট্য যা সনাক্ত করে যে কেউ বাড়িতে আছে কিনা।

উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণটি দেখায় যে কেউ যখন রাত 10 টার পরে বাড়িতে থাকে তখন স্বয়ংক্রিয়ভাবে দরজা লক করা হয়:

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()))
      }
    }
  }

এখন যেহেতু আপনি এই উন্নত অটোমেশন ক্ষমতাগুলির সাথে পরিচিত, বাইরে যান এবং দুর্দান্ত অ্যাপ তৈরি করুন!

7. অভিনন্দন!

অভিনন্দন! আপনি Google Home API ব্যবহার করে একটি Android অ্যাপ তৈরির দ্বিতীয় অংশ সফলভাবে সম্পন্ন করেছেন। এই কোডল্যাব জুড়ে, আপনি অটোমেশন এবং ডিসকভারি APIগুলি অন্বেষণ করেছেন৷

আমরা আশা করি আপনি এমন অ্যাপ তৈরি করতে উপভোগ করবেন যা Google হোম ইকোসিস্টেমের মধ্যে সৃজনশীলভাবে ডিভাইসগুলি নিয়ন্ত্রণ করে এবং হোম API ব্যবহার করে উত্তেজনাপূর্ণ অটোমেশন পরিস্থিতি তৈরি করে!

পরবর্তী পদক্ষেপ

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