অটোমেশন তৈরি করতে বিভিন্ন অটোমেশন 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 নোডে ট্রেট অ্যাট্রিবিউটের ভ্যালু ক্যাপচার করুন। stateReader
structure এবং বৈশিষ্ট্যকে আর্গুমেন্ট হিসেবে নেয়:
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