iOS DSL গাইড

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

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

অনুক্রমিক প্রবাহ

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

অনুক্রমিক 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
)

পরামিতি সহ একটি কাঠামো এবং ইভেন্টের উপর ভিত্তি করে স্টার্টার

কিছু ইভেন্টের পরামিতি থাকতে পারে, তাই এই প্যারামিটারগুলিকেও স্টার্টারে অন্তর্ভুক্ত করতে হবে।

উদাহরণস্বরূপ, এই স্টার্টারটি সকাল 7:00 এ অটোমেশন সক্রিয় করতে 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 নোডে বৈশিষ্ট্য বৈশিষ্ট্যের মান উল্লেখ করার অন্য উপায় হল একটি stateReader নোড।

এটি করার জন্য, প্রথমে একটি stateReader নোডে বৈশিষ্ট্য বৈশিষ্ট্যের মান ক্যাপচার করুন। একটি stateReader আর্গুমেন্ট হিসাবে structure এবং বৈশিষ্ট্য গ্রহণ করে:

typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait

let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)

তারপর condition নোডে stateReader উল্লেখ করুন:

condition {
filterMonitoringState.changeIndication.equals(.warning)
}

তুলনা এবং লজিক্যাল অপারেটর ব্যবহার করে, একাধিক stateReaders একটি condition নোডে ব্যবহার করা যেতে পারে:

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

সময়কাল এক থেকে 30 মিনিটের মধ্যে হতে পারে।

অ্যাকশন নোড

অ্যাকশন নোড হল যেখানে অটোমেশনের কাজ হয়। এই উদাহরণে, অ্যাকশনটি AssistantBroadcastTrait এর broadcast() কমান্ডকে আহ্বান করে:

action(speaker, SpeakerDeviceType.self) {
  Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}