iOS DSL গাইড

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

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

ক্রমিক প্রবাহ

অনুক্রমিক প্রবাহ হলো অটোমেশন প্রবাহের ডিফল্ট ধরন।

ক্রমিক ডিএসএল উদাহরণ

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

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

আবহাওয়ার উপর ভিত্তি করে শুরু করুন

আপনি Weather ট্রেইট ব্যবহার করে একটি স্টার্টারে বর্তমান বা পূর্বাভাসিত আবহাওয়ার অবস্থা নির্দিষ্ট করতে পারেন:

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

সুইফটের এক্সপ্রেশনের মতোই এক্সপ্রেশন গঠন করা হয় এবং এতে সংখ্যা, অক্ষর, স্ট্রিং ও বুলিয়ানের মতো প্রিমিটিভ ভ্যালুর পাশাপাশি 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 নোডে ট্রেইট অ্যাট্রিবিউটের মান উল্লেখ করার আরেকটি উপায় হলো 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")
}