راهنمای DSL - اتوماسیون های اساسی، راهنمای DSL - اتوماسیون های اساسی

از راهنمای زیر برای درک چگونگی استفاده از گره های DSL مختلف اتوماسیون برای ساخت یک اتوماسیون استفاده کنید.

تمام DSL های اتوماسیون درون یک گره automation قرار می گیرند. گره automation مرز بین زمینه زبان کاتلین خارجی و زمینه DSL تعبیه شده را تشکیل می دهد.

جریان متوالی

جریان متوالی نوع پیش فرض جریان اتوماسیون است.

مثال DSL متوالی

در اینجا یک الگوی بسیار ابتدایی اتوماسیون 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)

شروع کننده بر اساس ساختار و رویداد، با پارامترها

برخی از رویدادها می توانند پارامترهایی داشته باشند، بنابراین این پارامترها نیز باید در استارت گنجانده شوند.

به عنوان مثال، این شروع کننده از ScheduledTimeEvent ویژگی Time برای فعال کردن اتوماسیون در ساعت 7:00 صبح استفاده می کند:

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

استارت دستی

استارت دستی نوع خاصی از استارت است که به کاربر اجازه می دهد اتوماسیون را به صورت دستی اجرا کند.

هنگام اعلام استارت دستی:

  • یک ویژگی یا نوع دستگاه را مشخص نکنید.
  • یک عنصر رابط کاربری ارائه کنید که Automation.execute() را فراخوانی کند.

هنگام قرار دادن یک استارت دستی در یک جریان 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 باشد، اتوماسیون در آن نقطه اجرا را متوقف می کند.

عبارات مشابه عبارات در Kotlin تشکیل می شوند و ممکن است حاوی مقادیر ابتدایی مانند اعداد، کاراکترها، رشته ها و بولی ها و همچنین مقادیر 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 }

StateReader

راه دیگر برای ارجاع مقادیر ویژگی صفت در گره condition ، با گره stateReader است.

برای انجام این کار، ابتدا مقدار ویژگی trait را در یک گره stateReader ثبت کنید. یک stateReader structure و ویژگی را به عنوان آرگومان می گیرد:

import com.google.home.automation.stateReader
...
val filterMonitoringState = stateReader<_>(structure, ActivatedCarbonFilterMonitoring)

سپس stateReader را در گره condition ارجاع دهید:

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 دقیقه متغیر باشد.

گره های عمل

گره عمل جایی است که کار اتوماسیون در آن انجام می شود. در این مثال، این اکشن دستور broadcast() ویژگی AssistantBroadcast را فراخوانی می کند:

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

بیانیه های وارداتی

هنگام توسعه اتوماسیون، همیشه مشخص نیست که چگونه عناصر مختلف APIهای Home را به کد خود وارد کنید.

ویژگی‌های صفت از شی Companion این صفت وارد می‌شوند:

import com.google.home.matter.standard.OnOff.Companion.onOff

ساختارهای داده‌ای که توسط یک صفت تعریف می‌شوند از کلاس صفت که نام آن به "-Trait" ختم می‌شود وارد می‌شوند:

import com.google.home.matter.standard.MediaPlaybackTrait.PlaybackStateEnum

دستورات Trait از شی Companion این صفت وارد می شوند:

import com.google.home.matter.standard.Thermostat.Companion.setTemperatureSetpointHold