বিভিন্ন অটোমেশন ডিএসএল নোড ব্যবহার করে কীভাবে একটি অটোমেশন তৈরি করা যেতে পারে, তা বোঝার জন্য নিম্নলিখিত নির্দেশিকাটি ব্যবহার করুন।
সমস্ত অটোমেশন ডিএসএল একটিমাত্র automation নোডের মধ্যে স্থাপন করা হয়। এই automation নোডটি বাইরের কোটলিন ল্যাঙ্গুয়েজ কনটেক্সট এবং এমবেডেড ডিএসএল কনটেক্সটের মধ্যে সীমানা তৈরি করে।
ক্রমিক প্রবাহ
অনুক্রমিক প্রবাহ হলো অটোমেশন প্রবাহের ডিফল্ট ধরন।
এখানে একটি অত্যন্ত সাধারণ অটোমেশন ডিএসএল টেমপ্লেট দেওয়া হলো, যা একটি স্টার্টার, একটি কন্ডিশন এবং একটি অ্যাকশন সমন্বিত একটি অনুক্রমিক প্রবাহ ব্যবহার করে:
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)))
}
আবহাওয়ার উপর ভিত্তি করে শুরু করুন
আপনি Weather ট্রেইট ব্যবহার করে একটি স্টার্টারে বর্তমান বা পূর্বাভাসিত আবহাওয়ার অবস্থা নির্দিষ্ট করতে পারেন:
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 হয়, তাহলে অটোমেশনটি সেই পর্যায়ে কার্য সম্পাদন বন্ধ করে দেয়।
কোটলিনের এক্সপ্রেশনের মতোই এক্সপ্রেশন গঠন করা হয় এবং এতে সংখ্যা, অক্ষর, স্ট্রিং ও বুলিয়ানের মতো প্রিমিটিভ ভ্যালুর পাশাপাশি 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 }
স্টেটরিডার
একটি 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)
}
তুলনা এবং যৌক্তিক অপারেটর ব্যবহার করে, একটি condition নোডে একাধিক stateReaders ব্যবহার করা যেতে পারে:
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!"))
}
আমদানি বিবৃতি
অটোমেশন তৈরি করার সময়, হোম এপিআই-এর বিভিন্ন উপাদান আপনার কোডে কীভাবে ইম্পোর্ট করতে হবে তা সবসময় স্পষ্ট বোঝা যায় না।
ট্রেইট অ্যাট্রিবিউটগুলো ট্রেইটের 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