Android-এ Automation API এক নজরে

অটোমেশন হল কোনও বাড়ির টাস্ক ও ডিভাইস সেটিংস অটোমেট করার একটি উপায়। Google Home app (GHA)-এ রুটিন হিসেবে এবং Google Home for web-এ automation script editor-এর মাধ্যমে Google Home ইকোসিস্টেমে অটোমেশন উপলভ্য আছে।

এখন, Google Home ইকোসিস্টেমে অটোমেশন, Android-এর জন্য Home API-এর মাধ্যমে উপলভ্য। এগুলি GHA রুটিন ও script editor-এ ব্যবহৃত একই মৌলিক ধারণা ব্যবহার করে, তবে Home API-এর মাধ্যমে উন্নত ফিচার ও ক্ষমতা সহ, যার মধ্যে রয়েছে:

  • Home API-তে দেখানো, ডিভাইসের জন্য সব Matter স্ট্যান্ডার্ড এবং smart home বৈশিষ্ট্যে অ্যাক্সেস।
  • সিকোয়েন্সিয়াল, প্যারালাল ও সিলেক্ট এক্সিকিউশন ফ্লোর জন্য সহায়তা।

অটোমেশন DSL ব্যবহার করে অটোমেশন লেখা হয়, এটি একটি ডোমেন-নির্দিষ্ট ভাষা যা Kotlin-এ অটোমেশন তৈরি করার জন্য ডিজাইন করা হয়েছে।

Device & Structure বা Automation API-এর মাধ্যমে আপনার অ্যাপে যে ধরনের বৈশিষ্ট্য ও ধরন ব্যবহার করতে চান, তা অবশ্যই ইনিশিয়ালাইজেশনের সময় রেজিস্টার করতে হবে। Android-এ হোম ইনিশিয়ালাইজ করুন।

ব্যবহারকারী সম্পূর্ণ অনুমতি প্রত্যাহার করলে নির্দেশিকা

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

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

স্ট্রাকচার অ্যাক্সেস প্রত্যাহার করা হলে, আপনার ক্লাউড ব্যাকএন্ডে একটি StructureAccessRevokedEvent ডেলিভার করা হয়। এন্ড-টু-এন্ড পার্টনার ক্লাউড এবং মোবাইল অ্যাপ প্রত্যাহার ওয়ার্কফ্লোর জন্য Structure অনুদান দেখুন।

ডেভেলপার জার্নি

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

  1. ডেভেলপার তার অটোমেশন প্ল্যান করেন এবং অটোমেশন DSL ব্যবহার করে তা সংজ্ঞায়িত করেন।
  2. ডেভেলপার Kotlin Android অ্যাপে অটোমেশন সংজ্ঞা এম্বেড করেন।
  3. অ্যাপটি ব্যবহারকারীর ডিভাইসের তথ্যের উপর ভিত্তি করে অটোমেশন দেখায়, যার মধ্যে রয়েছে বৈশিষ্ট্য, অ্যাট্রিবিউট, কমান্ড এবং ইভেন্ট, যা Discovery API বা Device API ব্যবহার করে সংগ্রহ করা হয়।
    1. Discovery API-এর মাধ্যমে, অ্যাপটি ব্যবহারকারীর ইনপুট সহ বা ছাড়াই ব্যবহারকারীর স্ট্রাকচারে উপস্থিত ডিভাইসের ধরন এবং বৈশিষ্ট্যের জন্য কাস্টমাইজ করা একটি ড্রাফ্ট অটোমেশন তৈরি করতে পারে।
    2. Device API, Discovery API-এর মতোই বেশিরভাগ তথ্য প্রদান করতে পারে, তবে এটি অটোমেশন ব্যবহারের ক্ষেত্রে অপ্টিমাইজ করা হয়নি। আরও বিবরণের জন্য Device API ও Discovery API-এর মধ্যে তুলনা দেখুন।
  4. অ্যাপটি আসল অটোমেশন তৈরি করে যা বেছে নেওয়া স্ট্রাকচারের সাথে কী করা হয়।
  5. অটোমেশন এখন ব্যবহারকারীর স্ট্রাকচারে উপলভ্য এবং স্ট্রাকচার API পদ্ধতি ব্যবহার করে চালানো বা মুছে ফেলা যেতে পারে।

ব্যবহারকারী যেকোনও সময় অটোমেশনের নতুন ইনস্ট্যান্স তৈরি করতে পারেন, অন্য স্ট্রাকচার বেছে নিতে পারেন অথবা অ্যাপ লজিকের উপর নির্ভর করে, সম্ভবত অন্য ডিভাইসের সেট বেছে নিতে পারেন। প্রতিবার তারা এটি করলে, অ্যাপটি অটোমেশনের একটি নতুন ইনস্ট্যান্স তৈরি করে।

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

অটোমেশন তৈরি ও ম্যানেজ করা

Android-এ অটোমেশন তৈরি ও ম্যানেজ করতে:

  1. SDK ইনিশিয়ালাইজেশনের সময় HomeConfig-এ পাস করা FactoryRegistry-এ আপনার অটোমেশন দ্বারা রেফারেন্স করা সব ডিভাইসের ধরন ও বৈশিষ্ট্য রেজিস্টার করুন। রেজিস্ট্রেশন সংক্রান্ত বিবরণের জন্য, Android-এ হোম ইনিশিয়ালাইজ করুন দেখুন।
  2. automation() DSL ব্যবহার করে আপনার DraftAutomation (BaseAutomation) তৈরি করুন এবং Structure অবজেক্টে স্ট্যান্ডার্ড HasAutomations মেথড কল করুন:
    • হোমে অটোমেশন তৈরি করতে createAutomation() কল করুন।
    • হোমে আপনার অ্যাপের মাধ্যমে তৈরি করা অটোমেশন তালিকাভুক্ত করতে বা ফিরিয়ে আনতে automations() কল করুন।
    • Automation ইনস্ট্যান্সের মেটাডেটা আপডেট করতে বা এর automationGraph পরিবর্তন করতে update() কল করুন।
    • আইডি দিয়ে অটোমেশন সরাতে deleteAutomation() কল করুন।
val draft = automation {
  name = "Turn on light"
  description = "Turn on light2 when light1 turns on."
  sequential {
    val starterNode = starter<_>(light1, OnOffLightDevice, OnOff)
    condition { expression = starterNode.onOff equals true }
    action(light2, OnOffLightDevice) { command(OnOff.on()) }
  }
}

val createdAutomation = structure.createAutomation(draft)

সম্পূর্ণ DSL সিনট্যাক্স এবং CRUD কোডের উদাহরণের জন্য, Android-এ অটোমেশন তৈরি করুন দেখুন।

অটোমেশন সম্পর্কিত সাজেশন

   Android-এর জন্য স্যাম্পেল অ্যাপে প্রয়োগ করা হয়েছে   

Home API, Structure-এর জন্য অটোমেশন সাজেস্ট করতে পারে। এটি স্পেসে উপস্থিত ডিভাইসের ধরনের মতো বিষয়ের উপর ভিত্তি করে করা হয়।

অটোমেশন সম্পর্কিত সাজেশন AutomationSuggestion ক্লাস দ্বারা দেখানো হয়।

Structure ইন্টারফেস HasSuggestions ইন্টারফেসকে অন্তর্ভুক্ত করে, যা suggestions() ফাংশন প্রদান করে, যা অটোমেশন সাজেশনের একটি সংগ্রহ রিটার্ন করে।

likeSuggestion() এবং dislikeSuggestion() পদ্ধতিগুলি এবং UI কন্ট্রোলের সাথে যুক্ত করার জন্য ডিজাইন করা হয়েছে, যাতে ব্যবহারকারী মতামত দিতে ট্যাপ করতে পারেন।

তৃতীয় পদ্ধতি, clearSuggestionFeedback(), ব্যবহারকারীকে সাজেস্ট করা অটোমেশনের জন্য তার মতামত সরিয়ে দেওয়ার অনুমতি দেয়।

ব্যবহারকারীর মতামত ভবিষ্যতের সাজেশনকে প্রভাবিত করে।

এই উদাহরণে দেখানো হয়েছে যে কীভাবে Structure-এর জন্য উপলভ্য অটোমেশন সাজেশন উদ্ধার করা, সাজেশন আইডি এক্সট্র্যাক্ট করা এবং likeSuggestion(), clearSuggestionFeedback() এবং dislikeSuggestion() ব্যবহার করে ব্যবহারকারীর মতামত রেকর্ড করা যায়।

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.home.Structure
import kotlinx.coroutines.launch

class AutomationSuggestionsViewModel(private val structure: Structure) : ViewModel() {

  fun loadAndGiveFeedback() {
    viewModelScope.launch {
      // 1. Fetch suggestions from structure
      val suggestions = structure.suggestions()
      val firstSuggestion = suggestions.firstOrNull() ?: return@launch

      // Extract string suggestion ID
      val suggestionId: String = firstSuggestion.id.id

      // 2. Like the suggestion (thumbs up)
      val liked = structure.likeSuggestion(suggestionId)

      // 3. Clear previous feedback if the user toggled it off
      if (liked) {
        structure.clearSuggestionFeedback(suggestionId)
      }

      // 4. Dislike the suggestion (thumbs down)
      structure.dislikeSuggestion(suggestionId)
    }
  }
}

ডায়নামিক কমান্ড প্যারামিটার

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

  • রেফারেন্স যা স্টার্টার (যেমন ইভেন্ট পেলোড) বা স্টেট রিডার নোড থেকে অথবা অটোমেশন ফ্লোতে ঘোষিত লোকাল ভেরিয়েবল থেকে প্রপার্টির ভ্যালু পাস করে।
  • রানটাইম ডায়নামিক ভ্যালু (যেমন, ইভেন্ট প্রপার্টি বা স্টেট ভ্যালু) ক্যাপচার করে এবং ডায়নামিক ভ্যালু সরাসরি কমান্ড প্যারামিটারে পাস করে এমন এক্সপ্রেশন।

ব্যবহারিক ক্ষেত্র

একটি ফিজিক্যাল রোটারি সুইচ বাইন্ড করুন যা একটি ডিমেবল লাইটে মাল্টি-প্রেস ইভেন্ট পাঠায়। ক্লিকের সংখ্যা হল রানটাইমে LevelControl স্টেপ কমান্ডে পাস করা ডাইনামিক ভ্যালু।

ডায়নামিক প্যারামিটার কীভাবে কাজ করে

Android-এ অটোমেশন DSL-এ, কমান্ড প্যারামিটার Expression বা Reference ইনস্ট্যান্স সরাসরি স্ট্যাটিক কনস্ট্যান্ট ভ্যালুর জায়গায় গ্রহণ করে। অটোমেশন তৈরি করার সময় DSL এগুলিকে Parameter সংজ্ঞায় এনক্যাপসুলেট করে।

যাচাইকরণের নিয়ম

ডায়নামিক কমান্ড প্যারামিটার এইসব যাচাইকরণ সংক্রান্ত সীমাবদ্ধতা মেনে চলে:

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

Android-এ ডায়নামিক কমান্ড প্যারামিটার ব্যবহার করা

কমান্ড প্যারামিটারে সরাসরি ডায়নামিক এক্সপ্রেশন পাস করুন:

import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.fieldSelect
import com.google.home.automation.sequential
import com.google.home.automation.starter
import com.google.home.matter.standard.DimmableLightDevice
import com.google.home.matter.standard.DimmerSwitchDevice
import com.google.home.matter.standard.LevelControl
import com.google.home.matter.standard.LevelControlTrait.StepModeEnum
import com.google.home.matter.standard.Switch

val keypressAutomation = automation {
  name = "Dynamic command parameters example"
  description = "Pass starter event field directly to command"
  sequential {
    val dimmerStarter = starter(
      dimmerSwitch,
      DimmerSwitchDevice,
      Switch.MultiPressOngoingEvent,
    )

    val clickCountExpr = fieldSelect<Switch.MultiPressOngoingEvent, UInt>(
      dimmerStarter,
      Switch.MultiPressOngoingEvent.EventFields.currentNumberOfPressesCounted,
    )

    action(dimmableLight, DimmableLightDevice) {
      command(
        LevelControl.step(
          stepMode = StepModeEnum.Up,
          stepSize = clickCountExpr,
        )
      )
    }
  }
}

বিকল্প হিসেবে, লোকাল ভেরিয়েবেল ডিক্লারেশনে এক্সপ্রেশন অ্যাসাইন করুন এবং ফ্লোতে পরে ভেরিয়েবেল রেফারেন্স করুন:

import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.fieldSelect
import com.google.home.automation.sequential
import com.google.home.automation.starter
import com.google.home.automation.variable
import com.google.home.matter.standard.DimmableLightDevice
import com.google.home.matter.standard.DimmerSwitchDevice
import com.google.home.matter.standard.LevelControl
import com.google.home.matter.standard.LevelControlTrait.StepModeEnum
import com.google.home.matter.standard.Switch

val myAutomationWithVariable = automation {
  name = "Dynamic command parameters with variables"
  description = "Declare a variable, assign value, and pass reference"
  sequential {
    val dimmerStarter = starter(
      dimmerSwitch,
      DimmerSwitchDevice,
      Switch.MultiPressOngoingEvent,
    )

    val clickCountExpr = fieldSelect<Switch.MultiPressOngoingEvent, UInt>(
      dimmerStarter,
      Switch.MultiPressOngoingEvent.EventFields.currentNumberOfPressesCounted,
    )

    val clickCountVar = variable<UInt>()
    clickCountVar.assign(clickCountExpr)

    action(dimmableLight, DimmableLightDevice) {
      command(
        LevelControl.step(
          stepMode = StepModeEnum.Up,
          stepSize = clickCountVar,
        )
      )
    }
  }
}

বাধ্যবাধকতা টাইপ করুন

নিশ্চিত করুন যে ভেরিয়েবল এবং এক্সপ্রেশনের ধরনগুলি রিসিভিং কমান্ড প্যারামিটারের প্রয়োজনীয় Matter স্কিমা টাইপ সংজ্ঞার সাথে সামঞ্জস্যপূর্ণ (যেমন UShort, UByte, বা UInt8)।

রিসোর্সের সীমা

Home API-তে অটোমেশনের ক্ষেত্রে নিম্নলিখিত সীমা প্রযোজ্য:

টেবিল: Automation API রিসোর্স সীমা
মেট্রিক সীমা
প্রতিটি হোমে সর্বাধিক অটোমেশনের সংখ্যা ৬৪
প্রতি অটোমেশনে সর্বাধিক নোডের সংখ্যা 128
প্রতি অটোমেশনে এক্সপ্রেশন নোডের সর্বাধিক সংখ্যা ৬৪
প্রতিটি স্ট্রাকচারে অটোমেশন ইনস্ট্যান্সের সর্বাধিক সংখ্যা 1024
প্রতিটি স্ট্রাকচারে ডেভেলপার পিছু অটোমেশন ইনস্ট্যান্সের সর্বাধিক সংখ্যা ৬৪
প্রতিদিন স্ট্রাকচার প্রতি সর্বাধিক কতবার এক্সিকিউট করা যাবে 1024
প্রতিদিন প্রতিটি স্ট্রাকচারের জন্য ডেভেলপার পিছু সর্বাধিক এক্সিকিউশনের সংখ্যা 128