Android DSL কনসেপ্ট

এটি Android-এ অটোমেশন DSL-এর মৌলিক ধারণার একটি ওভারভিউ।

অটোমেশন কম্পোনেন্ট

অটোমেশনে নিম্নলিখিত প্রাথমিক কম্পোনেন্ট থাকে, সাধারণত এই ক্রমে মূল্যায়ন করা হয়:

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

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

  1. স্টার্টার — টিভি চালু করা হয়েছে, যা টিভির বৈশিষ্ট্যের স্ট্যাটাসে পরিবর্তন।
  2. শর্ত— টিভিটি যে হোমে আছে সেটির বর্তমান সময় মূল্যায়ন করা হয়।
  3. অ্যাকশন — টিভি যে ঘরে আছে সেই ঘরের আলো ডিম করা হয়েছে।

রুমের টিভি চালু হলে অটোমেশন অ্যাক্টিভেট হয়ে যাবে, তবে "সূর্যাস্ত ও সূর্যোদয়ের মধ্যে সময়" শর্ত পূরণ হলে তবেই অটোমেশন কাজ করবে।

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

নোড

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

সারণী: অটোমেশন নোডের ধরন
নোড Node-এর ধরন Kotlin প্রয়োগ করা বিবরণ
স্টার্টার আচরণগত StarterNodeDsl কোনও ট্রেইটের স্ট্যাটাস (যেকোনও অ্যাট্রিবিউট) পরিবর্তন হলে অটোমেশন শুরু করে।
StateReader আচরণগত StateReaderNodeDsl এটি কোনও ট্রেট অ্যাট্রিবিউট পড়ে এবং কন্ডিশন নোডে ব্যবহার করার জন্য আপনাকে এর ভ্যালু ক্যাপচার করতে দেয়।
অ্যাকশন আচরণগত ActionNodeDsl ট্রিগার কমান্ড ট্রিগার করে।
সিকোয়েন্সিয়াল এক্সিকিউশন ফ্লো SequentialFlow নেস্ট করা অ্যাকশন নোড সিকোয়েন্সে প্রয়োগ করে। এটি হল ডিফল্ট এক্সিকিউশন অ্যাকশন।
প্যারালাল এক্সিকিউশন ফ্লো ParallelFlow একই সাথে নেস্ট করা অ্যাকশন নোড এক্সিকিউট করে।
অবস্থা এক্সিকিউশন ফ্লো ConditionNodeDsl লজিক্যাল এক্সপ্রেশনের মূল্যায়নের ভিত্তিতে শর্তসাপেক্ষে এক্সিকিউশন ফ্লো পরিবর্তন করুন। শর্তাবলী কোনও স্টার্টারের সাথে যুক্ত থাকতে পারে (স্টার্টার নির্দিষ্ট শর্তাবলী) অথবা গ্লোবাল হতে পারে (সব স্টার্টারের ক্ষেত্রে প্রযোজ্য)।
বেছে নিন এক্সিকিউশন ফ্লো SelectFlow অটোমেশন চালু করার জন্য একাধিক স্টার্টারকে অনুমতি দেয়।
IfFlow এক্সিকিউশন ফ্লো IfFlowDsl কোন শর্ত (যদি থাকে) সত্য (if-then-else স্টেটমেন্টের মতো) হিসেবে মূল্যায়ন করা হয় তার উপর ভিত্তি করে সর্বাধিক একটি অ্যাকশন (বা ব্রাঞ্চ) রান করে।
এক্সপ্রেশন ভ্যালু Expression এটি কোনও ট্রেইটের অ্যাট্রিবিউটের ভ্যালু, কনস্ট্যান্ট বা লিটারাল ভ্যালু হতে পারে এবং এটি অবশ্যই তালিকা, সংখ্যা, বুলিয়ান বা স্ট্রিং হিসেবে মূল্যায়ন করতে হবে।

আচরণগত নোড

স্টার্টার ও অ্যাকশনের মতো Node হল আচরণগত Node। ডিভাইসের অ্যাট্রিবিউট পরিবর্তনের উপর ভিত্তি করে স্টার্টার অটোমেশন অ্যাক্টিভেট করে। অ্যাকশন ডিভাইসের জন্য কমান্ড ইস্যু করে অথবা অ্যাট্রিবিউট আপডেট করে।

আচরণগত নোড সাধারণত ডিভাইসের বৈশিষ্ট্য এবং আউটপুট বৈশিষ্ট্যের অবস্থার সাথে যুক্ত থাকে যাতে অন্যান্য নোডে ইনপুট হিসেবে ব্যবহার করা যায়।

এক্সিকিউশন ফ্লো নোড

কিছু নোড এক্সিকিউশন ফ্লো দেখায়, যেমন সিকোয়েন্সিয়াল ও প্যারালাল। এইসব নোডের প্রতিটিতে আচরণগত নোড থাকে যা অটোমেশনকে সংজ্ঞায়িত করে।

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

সিকোয়েন্সিয়াল এক্সিকিউশন ফ্লো
ছবি ১: সিকোয়েন্সিয়াল অটোমেশন ফ্লো

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

প্যারালাল এক্সিকিউশন ফ্লো
ছবি ২: প্যারালাল অটোমেশন ফ্লো

অন্য ধরনের এক্সিকিউশন ফ্লো হল কন্ডিশন ফ্লো, যা এক্সপ্রেশনের মূল্যায়নের ভিত্তিতে এক্সিকিউশন ফ্লো পরিবর্তন করতে পারে।

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

কন্ডিশন ফ্লো
ছবি ৩: কন্ডিশন ফ্লো

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

যেমন, আপনি এমন একটি অটোমেশন লিখতে পারেন যা সূর্যাস্তের সময় ব্লাইন্ড নামিয়ে দেয়, যদি তাপমাত্রা একটি নির্দিষ্ট থ্রেশহোল্ডের উপরে উঠে যায়, বা উজ্জ্বলতা একটি থ্রেশহোল্ড অতিক্রম করে। তিনটি আলাদা স্টার্টার এই প্রতিটি পরিস্থিতি ম্যানেজ করে এবং তিনটিই select ফ্লোতে র‍্যাপ করা হবে।

ফ্লো বেছে নিন
ছবি ৪: ফ্লো বেছে নিন

if-then-else ফ্লো (IfFlow) অটোমেশনের মধ্যে ব্রাঞ্চিং কন্ডিশনাল এক্সিকিউশনের সুবিধা দেয়। condition নোডের মতো নয়, যা শর্ত false হলে সম্পূর্ণ অটোমেশন বন্ধ করে দেয়, একটি if-then-else ফ্লো শর্তসাপেক্ষে নির্দিষ্ট অ্যাকশন এক্সিকিউট করে যখন কোনও শর্ত সত্য হয় এবং বিকল্প শর্ত বা ফলব্যাক অ্যাকশনে ফিরে যেতে পারে অথবা অটোমেশনে পরবর্তী নোডে চালিয়ে যেতে পারে। আরও বিবরণের জন্য, শর্তসাপেক্ষ এক্সিকিউশন দেখুন।

নেস্টেড ফ্লো

জটিল অটোমেশনে, এক্সিকিউশন ফ্লো নোডও নেস্ট করা যেতে পারে। যেমন, আপনার কাছে একটি সিকোয়েন্সিয়াল ফ্লো থাকতে পারে যা একটি প্যারালাল ফ্লো এক্সিকিউট করে।

নেস্টেড এক্সিকিউশন ফ্লো
ছবি ৫: নেস্টেড এক্সিকিউশন ফ্লো

নিচের সারণীতে উল্লেখ করা সীমাবদ্ধতা অনুযায়ী, আপনার নির্দিষ্ট প্রয়োজনীয়তা পূরণ করতে, DSL নোড বিভিন্ন উপায়ে নেস্ট ও একত্রিত করা যেতে পারে। Builder কলামটি Kotlin typesafe builder ডকুমেন্টেশনের সাথে লিঙ্ক করে, যা প্রতিটি ধরনের নোডে ব্যবহারের জন্য কী অনুমোদিত তা বিস্তারিতভাবে বর্ণনা করে।

টেবিল: নোড কীভাবে একত্রিত করা যেতে পারে
নোড নিম্নলিখিত নোডের ধরন ও ডেটা থাকতে পারে নিম্নলিখিত নোডের ধরনগুলির মধ্যে একটি হতে হবে
স্টার্টার এক্সপ্রেশন বেছে নিন, সিকোয়েন্সিয়াল
ManualStarter বেছে নিন, সিকোয়েন্সিয়াল
StateReader এক্সপ্রেশন (সাধারণত কোনও বৈশিষ্ট্য অ্যাট্রিবিউট ভ্যালু নিয়ে গঠিত) IfFlow, প্যারালাল, সিকোয়েন্সিয়াল
অ্যাকশন কমান্ড, এন্টিটি, এক্সপ্রেশন IfFlow, Parallel, Select, Sequential
সিকোয়েন্সিয়াল IfFlow, Parallel, Select, Sequential
প্যারালাল অ্যাকশন IfFlow, সিকোয়েন্সিয়াল
অবস্থা এক্সপ্রেশন IfFlow, প্যারালাল, সিকোয়েন্সিয়াল
বেছে নিন Condition, Sequential, Starter, ManualStarter সিকোয়েন্সিয়াল এবং ফ্লোতে অবশ্যই প্রথম নোড হতে হবে
IfFlow অ্যাকশন, শর্ত, বিলম্ব, IfFlow, প্যারালাল, সিকোয়েন্সিয়াল, StateReader, সাপ্রেশন ক্রমানুযায়ী

অটোমেশন DSL

Home API-তে, অটোমেশন DSL (ডোমেন-নির্দিষ্ট ভাষা) ব্যবহার করে অটোমেশন সংজ্ঞায়িত করা হয়। অটোমেশন DSL, Kotlin DSL (ডোমেন-নির্দিষ্ট ভাষা) হিসেবে প্রয়োগ করা হয়, Kotlin টাইপ-সেফ বিল্ডার ব্যবহার করে এবং অটোমেশন টেমপ্লেট সংজ্ঞায়িত করার জন্য বিশেষভাবে ডিজাইন করা হয়েছে।

কোনও অটোমেশন কম্পাইল করা হলে, Kotlin টাইপ-সেফ বিল্ডার Kotlin ডেটা ক্লাস তৈরি করে যা পরে প্রোটোকল বাফার JSON-এ সিরিয়ালাইজ করা হয়। এটি Google-এর অটোমেশন পরিষেবায় কল করার জন্য ব্যবহার করা হয়।

অটোমেশন DSL অটোমেশন তৈরির প্রসেসকে সহজ ও স্ট্রিমলাইন করে। এটি নেটিভভাবে একই ডেটা মডেল ব্যবহার করে Matter স্ট্যান্ডার্ড ট্রেট এবং smart home ট্রেট ডিভাইস API-তে ফিচার করা হয়েছে।

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

DSL সিনট্যাক্স Kotlin-এর মতোই এবং এটিও টাইপ-সেফ, তবে Automation DSL-এ লেখা অটোমেশন Kotlin-এ লেখা একই অটোমেশনের চেয়ে অনেক সহজ ও সংক্ষিপ্ত।

উদাহরণ

নিচে একটি অটোমেশনের উদাহরণ দেওয়া হল যা ডিভাইস চালু করে, এটি Automation DSL ব্যবহার করে লেখা হয়েছে:

val automation = automation {
  name = "MyFirstAutomation"
  description = "If light1 is on, turn on light2."
  isActive = true
  sequential {
    val onOffTrait = starter<_>(device1, OnOffLightDevice, OnOff)
    condition() { expression = onOffTrait.onOff equals true }
    action(device2, OnOffLightDevice) { command(OnOff.on()) }
  }
}

এই অটোমেশন খুবই সাধারণ: যখন device1, একটি আলো, চালু হয় (onOff অ্যাট্রিবিউট true-এ পরিবর্তিত হয়), তখন device2 চালু করার জন্য on() কমান্ড পাঠায়।

অটোমেশন একটি sequential নোড ব্যবহার করে, যা নির্দেশ করে যে এর নোডগুলি ক্রমিক ক্রমে চলবে।

sequential নোডের মধ্যে আচরণগত নোড আছে, যেমন starter, condition এবং action। starter নোডের আউটপুট condition নোডে ব্যবহারের জন্য একটি ভেরিয়েবলে অ্যাসাইন করা হয়েছে।