একটি অটোমেশন তৈরিতে বিভিন্ন অটোমেশন DSL নোড কীভাবে ব্যবহার করা যেতে পারে তা বুঝতে নিম্নলিখিত নির্দেশিকাটি ব্যবহার করুন।
সমস্ত অটোমেশন ডিএসএল একটি একক automation নোডের মধ্যে স্থাপন করা হয়। automation নোডটি বাইরের সুইফট ভাষার প্রসঙ্গ এবং এমবেডেড ডিএসএল প্রসঙ্গের মধ্যে সীমানা তৈরি করে।
ক্রমিক প্রবাহ
সিকুয়েন্সিয়াল ফ্লো হলো ডিফল্ট ধরণের অটোমেশন ফ্লো।
এখানে একটি খুবই মৌলিক অটোমেশন DSL টেমপ্লেট রয়েছে যা একটি স্টার্টার, একটি শর্ত এবং একটি ক্রিয়া সমন্বিত একটি ক্রমিক প্রবাহ ব্যবহার করে:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
অতিরিক্ত নোড যোগ করে এটি পরিমার্জিত করা যেতে পারে।
স্টার্টার
স্টার্টার নোডগুলি প্রাথমিক পরিস্থিতিগুলিকে সংজ্ঞায়িত করে যা একটি অটোমেশন সক্রিয় করে। উদাহরণস্বরূপ, অবস্থা বা মানের পরিবর্তন। একটি অটোমেশনে কমপক্ষে একটি স্টার্টার থাকতে হবে, অন্যথায় এটি যাচাইকরণ ব্যর্থ হবে। একটি অটোমেশনে একাধিক স্টার্টার যোগ করার জন্য, আপনাকে অবশ্যই একটি select নোড ব্যবহার করতে হবে।
বৈশিষ্ট্য বৈশিষ্ট্যের উপর ভিত্তি করে স্টার্টার
একটি trait অ্যাট্রিবিউটের উপর ভিত্তি করে একটি স্টার্টার নোড ঘোষণা করার সময়, উল্লেখ করুন:
- যন্ত্রটি
- বৈশিষ্ট্যটি যে ধরণের ডিভাইসের সাথে সম্পর্কিত
- বৈশিষ্ট্যটি
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
ডিভাইস টাইপ প্যারামিটারটি প্রয়োজনীয় কারণ এটি আপনাকে একটি ডিভাইসের মধ্যে কোন ডিভাইসের ধরণটি অটোমেশন ঠিকানাগুলি নির্দিষ্ট করতে দেয়। উদাহরণস্বরূপ, একটি ডিভাইস একটি FanDeviceType এবং একটি HeatingCoolingUnitDeviceType দিয়ে তৈরি হতে পারে, যার উভয়টিতেই OnOffTrait বৈশিষ্ট্য রয়েছে। ডিভাইসের ধরণ নির্দিষ্ট করে, ডিভাইসের কোন অংশটি অটোমেশন ট্রিগার করে তা নিয়ে কোনও অস্পষ্টতা থাকে না।
ইভেন্টের উপর ভিত্তি করে শুরু
কোনও ইভেন্টের উপর ভিত্তি করে স্টার্টার নোড ঘোষণা করার সময়, উল্লেখ করুন:
- যন্ত্রটি
- বৈশিষ্ট্যটি যে ধরণের ডিভাইসের সাথে সম্পর্কিত
- ঘটনাটি
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
প্যারামিটার সহ একটি কাঠামো এবং ইভেন্টের উপর ভিত্তি করে স্টার্টার
কিছু ইভেন্টের প্যারামিটার থাকতে পারে, তাই এই প্যারামিটারগুলিও স্টার্টারে অন্তর্ভুক্ত করা প্রয়োজন।
উদাহরণস্বরূপ, এই স্টার্টারটি সকাল ৭:০০ টায় অটোমেশন সক্রিয় করতে TimeTrait এর ScheduledEvent ব্যবহার করে:
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
ম্যানুয়াল স্টার্টার
ম্যানুয়াল স্টার্টার হল একটি বিশেষ ধরণের স্টার্টার যা ব্যবহারকারীকে ম্যানুয়ালি অটোমেশন চালাতে দেয়।
ম্যানুয়াল স্টার্টার ঘোষণা করার সময়:
- কোনও বৈশিষ্ট্য বা ডিভাইসের ধরণ নির্দিষ্ট করবেন না।
-
Automation.execute()কল করে এমন একটি UI উপাদান প্রদান করুন।
একটি select ফ্লোতে অন্য একটি স্টার্টারের সাথে একটি ম্যানুয়াল স্টার্টার স্থাপন করার সময়, ম্যানুয়াল স্টার্টারটি অন্য স্টার্টারটিকে ওভাররাইড করে:
select {
manualStarter()
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
}
মনে রাখবেন যে ম্যানুয়াল স্টার্টারের পরে যেকোনো condition নোড মূল্যায়ন করা হবে এবং condition এক্সপ্রেশনের উপর নির্ভর করে অটোমেশনের কার্যকরকরণকে ব্লক করতে পারে।
ম্যানুয়াল স্টার্টার দিয়ে সক্রিয় করা কোনও অটোমেশন যাতে condition নোড ব্লক না করে, তার জন্য অটোমেশন গঠনের একটি উপায় হল অন্য স্টার্টারটিকে তার condition সাথে একটি পৃথক ক্রমিক প্রবাহে রাখা:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
select {
sequential {
starter(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
একটি বৈশিষ্ট্যের মান উল্লেখ করুন
একটি এক্সপ্রেশনে একটি অ্যাট্রিবিউটের মান ব্যবহার করতে, নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করুন।
একটি stateReader সহ:
typealias TimeTrait = Google.TimeTrait
let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime
starter সহ:
typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait
let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
কন্ডিশন নোড এবং এক্সপ্রেশন
একটি কন্ডিশন নোড একটি সিদ্ধান্ত বিন্দু প্রতিনিধিত্ব করে যা নির্ধারণ করে যে অটোমেশন অব্যাহত থাকবে কিনা। একটি অটোমেশনে একাধিক condition নোড থাকতে পারে। যদি কোনও condition নোডের এক্সপ্রেশনটি false হিসাবে মূল্যায়ন করে, তাহলে সম্পূর্ণ অটোমেশনের সম্পাদন শেষ হয়ে যায়।
একটি condition নোডের মধ্যে, আপনি বিভিন্ন অপারেটর ব্যবহার করে একাধিক কন্ডিশন ক্রাইটেরিয়া একত্রিত করতে পারেন, যতক্ষণ না এক্সপ্রেশনটি একটি একক বুলিয়ান মানের মূল্যায়ন করে। যদি ফলাফলের মান true হয়, তাহলে শর্তটি পূরণ হয় এবং অটোমেশন পরবর্তী নোডের এক্সিকিউশন অব্যাহত রাখে। যদি এটি false , তাহলে অটোমেশন সেই সময়ে এক্সিকিউশন বন্ধ করে দেয়।
সুইফটের এক্সপ্রেশনের মতোই এক্সপ্রেশন তৈরি হয় এবং এতে সংখ্যা, অক্ষর, স্ট্রিং এবং বুলিয়ানের মতো আদিম মান থাকতে পারে, পাশাপাশি Enum মানও থাকতে পারে। সাব এক্সপ্রেশনগুলিকে বন্ধনী দিয়ে গ্রুপ করার মাধ্যমে আপনি তাদের মূল্যায়নের ক্রম নিয়ন্ত্রণ করতে পারবেন।
এখানে এমন একটি condition উদাহরণ দেওয়া হল যা একাধিক উপ-অভিব্যক্তিকে একটি একক অভিব্যক্তিতে একত্রিত করে:
condition {
let exp1 = starterNode.lockState.equals(.unlocked)
let exp2 = stateReaderNode.lockState.equals(true)
let exp3 = occupancySensingDevice.occupied.notEquals(0)
(exp1.and(exp2)).or(exp3)
}
আপনি একটি স্টার্টারের মাধ্যমে অ্যাক্সেস করা একটি বৈশিষ্ট্যের মান উল্লেখ করতে পারেন:
typealias OnOffTrait = Matter.OnOffTrait
let starterNode = starter(device, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
স্টেটরিডার
condition নোডে trait অ্যাট্রিবিউটের মান উল্লেখ করার আরেকটি উপায় হল stateReader নোড।
এটি করার জন্য, প্রথমে একটি stateReader নোডে trait attribute মান ক্যাপচার করুন। একটি stateReader structure এবং trait কে আর্গুমেন্ট হিসেবে নেয়:
typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait
let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)
তারপর condition নোডে stateReader রেফারেন্স করুন:
condition {
filterMonitoringState.changeIndication.equals(.warning)
}
তুলনা এবং লজিক্যাল অপারেটর ব্যবহার করে, একটি condition নোডে একাধিক stateReaders ব্যবহার করা যেতে পারে:
typealias ArmDisarm = Google.ArmDisarmTrait
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLock = Matter.DoorLockTrait
let armState = stateReader(doorLock, DoorLockDevice.self, ArmDisarm )
let doorLockState = stateReader(doorLock, DoorLockDevice.self, DoorLock)
armState
doorLockState
condition {
let exp1 = armState.armState
let exp2 = doorLockState.lockState
exp1.and(exp2)
}
শর্তের সময়কাল
একটি কন্ডিশনে বুলিয়ান এক্সপ্রেশন ছাড়াও, আপনি একটি সময়সীমা নির্দিষ্ট করতে পারেন যার মধ্যে অটোমেশন চালানোর জন্য এক্সপ্রেশনটি সত্য হতে হবে। উদাহরণস্বরূপ, আপনি এমন একটি শর্ত সংজ্ঞায়িত করতে পারেন যা কেবল দশ মিনিট ধরে আলো জ্বললেই জ্বলবে।
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
সময়কাল এক থেকে ৩০ মিনিট পর্যন্ত হতে পারে।
অ্যাকশন নোড
অ্যাকশন নোড হল সেই জায়গা যেখানে অটোমেশনের কাজটি সম্পন্ন হয়। এই উদাহরণে, অ্যাকশনটি AssistantBroadcastTrait এর broadcast() কমান্ডটি ব্যবহার করে:
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}