DSL গাইড - মৌলিক অটোমেশন

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

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

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

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

অনুক্রমিক DSL উদাহরণ

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


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 {...}
  }
}

এটি অতিরিক্ত নোড যোগ করে পরিমার্জিত করা যেতে পারে।

স্টার্টার

স্টার্টার নোডগুলি প্রাথমিক পরিস্থিতিগুলিকে সংজ্ঞায়িত করে যা একটি অটোমেশন সক্রিয় করে। উদাহরণস্বরূপ, রাষ্ট্র বা মান পরিবর্তন। একটি অটোমেশনের কমপক্ষে একটি স্টার্টার থাকতে হবে, অন্যথায় এটি বৈধতা ব্যর্থ হবে। একটি অটোমেশনে একাধিক স্টার্টার যোগ করার জন্য, আপনাকে অবশ্যই একটি নির্বাচন নোড ব্যবহার করতে হবে।

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

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

  • ডিভাইস
  • ডিভাইসের ধরন যার বৈশিষ্ট্যটি অন্তর্গত
  • বৈশিষ্ট্য
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)

ডিভাইস টাইপ প্যারামিটার প্রয়োজন কারণ এটি আপনাকে অটোমেশন অ্যাড্রেসগুলি ডিভাইসের মধ্যে কোন ডিভাইসের ধরন নির্দিষ্ট করতে দেয়। উদাহরণস্বরূপ, একটি ডিভাইস একটি FanDevice এবং একটি HeatingCoolingUnitDevice এর সমন্বয়ে গঠিত হতে পারে, উভয়ের মধ্যেই OnOff বৈশিষ্ট্য রয়েছে৷ ডিভাইসের ধরন নির্দিষ্ট করে, ডিভাইসের কোন অংশটি অটোমেশনকে ট্রিগার করে সে সম্পর্কে কোন অস্পষ্টতা নেই।

ইভেন্টের উপর ভিত্তি করে স্টার্টার

একটি ইভেন্টের উপর ভিত্তি করে একটি স্টার্টার নোড ঘোষণা করার সময়, নির্দিষ্ট করুন:

  • ডিভাইস
  • ডিভাইসের ধরন যার বৈশিষ্ট্যটি অন্তর্গত
  • ঘটনা
starter<_>(doorBell, GoogleDoorbellDevice, DoorbellPressed)

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

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

উদাহরণস্বরূপ, এই স্টার্টারটি সকাল 7:00 এ অটোমেশন সক্রিয় করতে Time বৈশিষ্ট্যের ScheduledTimeEvent সময় ইভেন্ট ব্যবহার করে:

val earlyMorning = starter<_>(structure, Time.ScheduledTimeEvent) {
  parameter(Time.ScheduledTimeEvent.clockTime(
    LocalTime.of(7, 0, 0, 0)))
}

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

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

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

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

অন্য স্টার্টারের সাথে একটি 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)
}

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

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

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

অ্যাকশন নোড

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

action(device, SpeakerDevice) {
  command(AssistantBroadcast.broadcast("Intruder detected!"))
}

বিবৃতি আমদানি করুন

অটোমেশন তৈরি করার সময়, আপনার কোডে হোম API-এর বিভিন্ন উপাদান কীভাবে আমদানি করবেন তা সর্বদা স্পষ্ট নয়।

বৈশিষ্ট্যের বৈশিষ্ট্যগুলি বৈশিষ্ট্যের 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