راهنمای iOS DSL

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

تمام DSL های اتوماسیون درون یک گره automation قرار می گیرند. گره automation مرز بین زمینه زبان سوئیفت خارجی و زمینه 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 's ScheduledEvent برای فعال کردن اتوماسیون در ساعت 7:00 صبح استفاده می کند:

typealias TimeTrait = Google.TimeTrait

let earlyMorning = starter(
  structure,
  TimeTrait.ScheduledEvent.self
) {
  TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}

استارت دستی

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

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

  • یک ویژگی یا نوع دستگاه را مشخص نکنید.
  • یک عنصر رابط کاربری ارائه کنید که 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 }

StateReader

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

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

typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait

let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)

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

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

گره های عمل

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

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