iOS DSL গাইড

অটোমেশন তৈরি করতে বিভিন্ন অটোমেশন DSL নোড কীভাবে ব্যবহার করা যেতে পারে তা বুঝতে নিম্নলিখিত নির্দেশিকা ব্যবহার করুন।

সব অটোমেশন DSL একটি automation নোডের মধ্যে রাখা হয়। automation নোডটি বাইরের Swift ল্যাঙ্গুয়েজ কন্টেক্সট এবং এম্বেড করা DSL কন্টেক্সটের মধ্যে সীমানা তৈরি করে।

সিকোয়েন্সিয়াল ফ্লো

সিকোয়েন্সিয়াল ফ্লো হল অটোমেশন ফ্লোয়ের ডিফল্ট ধরন।

সিকোয়েন্সিয়াল DSL-এর উদাহরণ

এখানে একটি খুব সাধারণ অটোমেশন DSL টেমপ্লেট রয়েছে যা একটি সিকোয়েন্সিয়াল ফ্লো ব্যবহার করে যার মধ্যে একটি স্টার্টার, একটি শর্ত এবং একটি অ্যাকশন রয়েছে:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {
  starter(...)
  condition {...}
  action {...}
}

অতিরিক্ত নোড যোগ করে এটি আরও উন্নত করা যেতে পারে।

স্টার্টার

স্টার্টার নোড প্রাথমিক পরিস্থিতি নির্ধারণ করে যা অটোমেশনকে অ্যাক্টিভেট করে। যেমন, স্ট্যাটাস বা ভ্যালুতে পরিবর্তন। অটোমেশনে অন্তত একটি স্টার্টার থাকতে হবে, অন্যথায় এটি যাচাইকরণে ব্যর্থ হবে। অটোমেশনে একাধিক স্টার্টার যোগ করতে, আপনাকে অবশ্যই select নোড ব্যবহার করতে হবে।

বৈশিষ্ট্য অ্যাট্রিবিউটের উপর ভিত্তি করে স্টার্টার

কোনও ট্রেইট অ্যাট্রিবিউটের উপর ভিত্তি করে স্টার্টার নোড ঘোষণা করার সময়, এগুলি উল্লেখ করুন:

  • ডিভাইসটি
  • যে ডিভাইসের ধরনের সাথে এই বৈশিষ্ট্যটি সম্পর্কিত
  • ট্রেইট
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))
}

আবহাওয়ার উপর ভিত্তি করে স্টার্টার

আপনি স্টার্টারে বর্তমান বা পূর্বাভাস দেওয়া আবহাওয়ার পরিস্থিতি নির্দিষ্ট করতে পারবেন, আবহাওয়ার বৈশিষ্ট্য ব্যবহার করে:

let weatherState = starter<_>(structure, trait = Weather)

অটোমেশনের উদাহরণ পৃষ্ঠায় বৃষ্টি হওয়ার সম্ভাবনা থাকলে ব্লাইন্ড বন্ধ করুন দেখুন।

ম্যানুয়াল স্টার্টার

ম্যানুয়াল স্টার্টার হল বিশেষ ধরনের স্টার্টার যা ব্যবহারকারীকে ম্যানুয়ালি অটোমেশন রান করতে দেয়।

ম্যানুয়াল স্টার্টার ঘোষণা করার সময়:

  • কোনও বৈশিষ্ট্য বা ডিভাইসের ধরন উল্লেখ করবেন না।
  • এমন একটি UI এলিমেন্ট প্রদান করুন যা Automation.execute() কল করে।

অন্য স্টার্টারের সাথে 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 হলে, অটোমেশন সেই পয়েন্টে এক্সিকিউট করা বন্ধ করে দেয়।

এক্সপ্রেশনগুলি Swift-এর এক্সপ্রেশনের মতোই তৈরি হয় এবং এতে সংখ্যা, অক্ষর, স্ট্রিং এবং বুলিয়ানের মতো আদিম মান থাকতে পারে, সেইসাথে 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 }

stateReader

condition নোডে ট্রেট অ্যাট্রিবিউট ভ্যালু রেফারেন্স করার অন্য উপায় হল stateReader নোড ব্যবহার করা।

এটি করতে, প্রথমে stateReader নোডে ট্রেট অ্যাট্রিবিউটের ভ্যালু ক্যাপচার করুন। stateReader structure এবং বৈশিষ্ট্যকে আর্গুমেন্ট হিসেবে নেয়:

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")
}