বিভিন্ন অটোমেশন DSL নোড কীভাবে অটোমেশন তৈরি করতে ব্যবহার করা যেতে পারে তা বুঝতে নিম্নলিখিত নির্দেশিকা ব্যবহার করুন।
সব অটোমেশন DSL একটি automation নোডের মধ্যে প্লেস করা হয়।
automationনোডটি বাইরের Kotlin ভাষা
কনটেক্সট ও এম্বেড করা DSL কনটেক্সটের মধ্যে সীমানা তৈরি করে।
সিকোয়েন্সিয়াল ফ্লো
ক্রমিক ফ্লো হল অটোমেশন ফ্লোয়ের ডিফল্ট ধরন।
এখানে একটি খুব সাধারণ অটোমেশন DSL টেমপ্লেট দেওয়া হল যা একটি ক্রমিক ফ্লো ব্যবহার করে যার মধ্যে একটি স্টার্টার, একটি কন্ডিশন এবং একটি অ্যাকশন থাকে:
import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.condition
import com.google.home.automation.sequential
import com.google.home.automation.starter
...
automation {
sequential {
starter<_>(...)
condition {...}
action {...}
}
}
অতিরিক্ত নোড যোগ করে এটি আরও উন্নত করা যেতে পারে।
স্টার্টার
স্টার্টার নোড সেইসব প্রাথমিক পরিস্থিতিকে সংজ্ঞায়িত করে যা কোনও অটোমেশনকে অ্যাক্টিভেট করে। যেমন, কোনও স্টেট বা ভ্যালুতে পরিবর্তন। অটোমেশনে অন্তত একটি
স্টার্টার থাকতে হবে, তা না হলে এটি যাচাইকরণে ব্যর্থ হবে। অটোমেশনে একাধিক
স্টার্টার যোগ করতে, আপনাকে অবশ্যই select নোড ব্যবহার করতে হবে।
ট্রেইট অ্যাট্রিবিউটের উপর ভিত্তি করে স্টার্টার
কোনও ট্রেট অ্যাট্রিবিউটের উপর ভিত্তি করে স্টার্টার নোড ঘোষণা করার সময়, এগুলি নির্দিষ্ট করুন:
- ডিভাইস
- যে ডিভাইসের ধরনের সাথে ট্রেট সম্পর্কিত
- ট্রেইট
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
ডিভাইসের ধরন সংক্রান্ত প্যারামিটার প্রয়োজন কারণ এটি আপনাকে নির্দিষ্ট করতে দেয় যে অটোমেশন কোনও ডিভাইসের মধ্যে কোন
ধরনের ডিভাইসকে অ্যাড্রেস করে। যেমন, কোনও ডিভাইস
FanDevice
ও
HeatingCoolingUnitDevice
দিয়ে তৈরি হতে পারে,
দু'টিতেই
OnOff
বৈশিষ্ট্য আছে। ডিভাইসের ধরন নির্দিষ্ট করে দিলে, ডিভাইসের কোন অংশ অটোমেশন ট্রিগার করবে সেই সম্পর্কে
কোনও অস্পষ্টতা থাকে না।
ইভেন্টের উপর ভিত্তি করে স্টার্টার
ইভেন্টের উপর ভিত্তি করে স্টার্টার নোড ঘোষণা করার সময় এগুলি নির্দিষ্ট করুন:
- ডিভাইস
- যে ডিভাইসের ধরনের সাথে ট্রেট সম্পর্কিত
- ইভেন্ট
starter<_>(doorBell, GoogleDoorbellDevice, DoorbellPressed)
স্ট্রাকচার ও ইভেন্টের উপর ভিত্তি করে প্যারামিটার সহ স্টার্টার
কিছু ইভেন্টে প্যারামিটার থাকতে পারে, তাই এই প্যারামিটারগুলিকেও স্টার্টারে অন্তর্ভুক্ত করতে হবে।
যেমন, এই স্টার্টারটি সকাল ৭:০০টায় অটোমেশন অ্যাক্টিভেট করতে
Time ট্রেটের ScheduledTimeEvent ব্যবহার করে:
val earlyMorning = starter<_>(structure, Time.ScheduledTimeEvent) {
parameter(Time.ScheduledTimeEvent.clockTime(
LocalTime.of(7, 0, 0, 0)))
}
আবহাওয়ার উপর ভিত্তি করে স্টার্টার
আপনি স্টার্টারে বর্তমান বা পূর্বাভাসিত আবহাওয়ার পরিস্থিতি নির্দিষ্ট করতে পারেন, এর জন্য আবহাওয়ার ট্রেট ব্যবহার করুন:
val weatherState = starter<_>(structure, trait = Weather)
অটোমেশনের উদাহরণ পৃষ্ঠায় বৃষ্টি হওয়ার সম্ভাবনা থাকলে ব্লাইন্ড বন্ধ করে দাও বিকল্প দেখুন।
ম্যানুয়াল স্টার্টার
ম্যানুয়াল স্টার্টার হল এক বিশেষ ধরনের স্টার্টার যা ব্যবহারকারীকে অটোমেশন ম্যানুয়ালি রান করতে দেয়।
ম্যানুয়াল স্টার্টার ঘোষণা করার সময়:
- কোনও বিশেষত্ব বা ডিভাইসের ধরন উল্লেখ করবেন না।
- এমন একটি UI এলিমেন্ট দিন যা
Automation.execute()-কে কল করে।
অন্য স্টার্টারের সাথে select ফ্লোতে ম্যানুয়াল স্টার্টার প্লেস করলে, ম্যানুয়াল স্টার্টার অন্য স্টার্টারকে ওভাররাইড করে:
select {
manualStarter()
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
}
মনে রাখবেন, ম্যানুয়াল স্টার্টারের পরে থাকা যেকোনও condition নোড মূল্যায়ন করা হবে, এবং condition
এক্সপ্রেশনের উপর নির্ভর করে অটোমেশন এক্সিকিউশন ব্লক করতে পারে।
আপনার অটোমেশনকে এমনভাবে স্ট্রাকচার করার একটি উপায় যাতে ম্যানুয়াল স্টার্টারের মাধ্যমে অ্যাক্টিভেট করা অটোমেশনকে condition নোড ব্লক না করে তা হল, অন্য স্টার্টারকে
এর condition সহ একটি আলাদা সিকোয়েন্সিয়াল ফ্লোতে
রাখা:
automation_graph {
sequential {
select {
sequential {
starter<_>(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
}
অ্যাট্রিবিউটের ভ্যালু রেফারেন্স করা
এক্সপ্রেশনে অ্যাট্রিবিউটের ভ্যালু ব্যবহার করতে, নিম্নলিখিত সিনট্যাক্স ব্যবহার করুন।
stateReader-এর সাথে:
val time = stateReader<_>(structure, Structure, Time)
val currTime = time.currentTime
starter-এর সাথে:
val starterNode = starter<_>(device1, LaundryWasherDevice, OnOff)
condition() {
expression = starterNode.onOff equals true
}
কন্ডিশন নোড ও এক্সপ্রেশন
কন্ডিশন নোড একটি সিদ্ধান্তমূলক পয়েন্টকে বোঝায় যা নির্ধারণ করে যে
অটোমেশন চলবে কিনা। একটি অটোমেশনে একাধিক condition নোড থাকতে পারে।
কোনও condition নোডের এক্সপ্রেশন false হিসেবে মূল্যায়ন করা হলে, সম্পূর্ণ অটোমেশনের
এক্সিকিউশন শেষ হয়ে যায়।
condition নোডের মধ্যে, আপনি বিভিন্ন অপারেটর ব্যবহার করে একাধিক কন্ডিশন ক্রাইটেরিয়া একত্রিত করতে পারেন, তবে এক্সপ্রেশনকে
একটি বুলিয়ান ভ্যালু
হিসেবে মূল্যায়ন করতে হবে। ফলাফল true হলে, শর্ত পূরণ হয়েছে বলে ধরে নেওয়া হয় এবং
অটোমেশন পরবর্তী নোড এক্সিকিউট করা চালিয়ে যায়। এটি false হলে, অটোমেশন
সেই পয়েন্টে এক্সিকিউট করা বন্ধ করে দেয়।
এক্সপ্রেশনগুলি Kotlin-এর এক্সপ্রেশনের মতোই তৈরি হয় এবং এর মধ্যে সংখ্যা, অক্ষর, স্ট্রিং ও বুলিয়ানের মতো আদিম ভ্যালু এবং Enum ভ্যালু থাকতে পারে। প্যারেন্থেসিসের সাহায্যে সাব এক্সপ্রেশন গ্রুপ করলে, সেগুলি মূল্যায়ন করার ক্রম আপনি নিয়ন্ত্রণ করতে পারবেন।
এখানে condition-এর একটি উদাহরণ দেওয়া হল, যা একাধিক সাবএক্সপ্রেশনকে একটি
এক্সপ্রেশনে একত্রিত করে:
condition() {
val expr1 = starterNode.lockState equals DlLockState.Unlocked
val expr2 = stateReaderNode.lockState equals true
val expr3 = occupancySensingDevice.occupied notEquals 0
val expr4 = timeStateReaderNode
.currentTime
.between(
timeStateReaderNode.sunsetTime,
timeStateReaderNode.sunriseTime)
expression = (expr1 and expr2) or (expr3 and expr4)
}
আপনি স্টার্টারের মাধ্যমে অ্যাক্সেস করা কোনও ট্রেটের ভ্যালু রেফার করতে পারেন:
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
condition নোডে ট্রেট অ্যাট্রিবিউট ভ্যালু রেফারেন্স করার আরেকটি উপায় হল
stateReader নোড।
এটি করতে, প্রথমে stateReader নোডে ট্রেট অ্যাট্রিবিউট ভ্যালু ক্যাপচার করুন। A
stateReader আর্গুমেন্ট হিসেবে structure ও trait নেয়:
import com.google.home.automation.stateReader
...
val filterMonitoringState = stateReader<_>(structure, ActivatedCarbonFilterMonitoring)
তারপর condition নোডে stateReader-এর রেফারেন্স দিন:
condition() {
expression =
filterMonitoringState.changeIndication
.equals(ChangeIndicationEnum.Warning)
}
তুলনা ও
লজিক্যাল অপারেটর ব্যবহার করে, একাধিক
stateReaders condition নোডে ব্যবহার করা যেতে পারে:
val armState = stateReader<_>(doorLock, DoorLockDevice, ArmDisarm )
val doorLockState = stateReader<_>(doorLock, DoorLockDevice, DoorLock)
condition() {
expression =
(armState.armState equals true)
and
(doorLockState.lockState equals true)
}
কন্ডিশনের সময়সীমা
শর্তে বুলিয়ান এক্সপ্রেশন ছাড়াও, আপনি এমন একটি সময়সীমা নির্দিষ্ট করতে পারেন যেখানে অটোমেশন চালানোর জন্য এক্সপ্রেশনটি সঠিক হতে হবে। যেমন, আপনি এমন একটি কন্ডিশন নির্ধারণ করতে পারেন যা শুধুমাত্র কোনও লাইট দশ মিনিট ধরে চালু থাকলে তবেই ফায়ার করবে।
condition {
expression(lightStateReader.onOff == true)
forDuration(Duration.ofMinutes(10))
}
সময়কাল ৫ সেকেন্ড থেকে ২৪ ঘণ্টা পর্যন্ত হতে পারে।
অ্যাকশন নোড
অ্যাকশন নোড হল সেই জায়গা যেখানে অটোমেশনের কাজ হয়।
এই উদাহরণে, অ্যাকশনটি
AssistantBroadcast
ট্রেটের
broadcast() কমান্ডকে ইনভোক করে:
action(device, SpeakerDevice) {
command(AssistantBroadcast.broadcast("Intruder detected!"))
}
স্টেটমেন্ট ইমপোর্ট করা
অটোমেশন ডেভেলপ করার সময়, Home API-এর বিভিন্ন এলিমেন্ট কীভাবে আপনার কোডে ইমপোর্ট করবেন তা সবসময় স্পষ্ট হয় না।
ট্রেইট অ্যাট্রিবিউট, ট্রেইটের Companion অবজেক্ট থেকে ইমপোর্ট করা হয়:
import com.google.home.matter.standard.OnOff.Companion.onOff
ট্রেটের মাধ্যমে নির্ধারিত ডেটা স্ট্রাকচার, ট্রেট ক্লাস থেকে ইমপোর্ট করা হয় যেটির নামের শেষে "-Trait" থাকে:
import com.google.home.matter.standard.MediaPlaybackTrait.PlaybackStateEnum
ট্রেটের Companion অবজেক্ট থেকে ট্রেট কমান্ড ইমপোর্ট করা হয়:
import com.google.home.matter.standard.Thermostat.Companion.setTemperatureSetpointHold