請參閱下列指南,瞭解如何使用各種自動化 DSL 節點建構自動化動作。
所有自動化 DSL 都會放在單一 automation 節點中。automation 節點會形成外部 Swift 語言情境和內嵌 DSL 情境之間的邊界。
依序流程
依序流程是預設的自動化動作流程類型。
以下是相當基本的自動化動作 DSL 範本,使用由啟動條件、限制條件和動作組成的依序流程:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
您可以新增節點,進一步調整。
Starter
啟動條件節點定義了啟動自動化動作的初始條件。例如狀態或值的變更。自動化動作必須至少有一個啟動條件,否則無法通過驗證。如要在自動化動作中新增多個啟動條件,必須使用 select 節點。
依特質屬性決定先發
宣告以特徵屬性為基礎的起始節點時,請指定:
- 裝置
- 特徵所屬的裝置類型
- 特徵
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
裝置類型參數為必填,因為您必須指定自動化動作要處理的裝置類型。舉例來說,裝置可能由 FanDeviceType 和 HeatingCoolingUnitDeviceType 組成,兩者都包含 OnOffTrait 特性。指定裝置類型後,就能明確知道裝置的哪個部分會觸發自動化動作。
以事件為準的啟動條件
宣告以事件為基礎的啟動條件節點時,請指定:
- 裝置
- 特徵所屬的裝置類型
- 活動
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
根據住家結構和事件建立啟動條件,並設定參數
部分事件可能含有參數,因此這些參數也必須包含在啟動器中。
舉例來說,這個啟動條件會使用 TimeTrait 的 ScheduledEvent,在上午 7:00 啟動自動化動作:
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
根據天氣啟動
您可以使用天氣特徵,在啟動條件中指定目前或預測的天氣狀況:
let weatherState = starter<_>(structure, trait = Weather)
請參閱「自動化動作範例」頁面上的「如果可能下雨,請關上百葉窗」。
手動啟動條件
手動啟動條件是一種特殊類型的啟動條件,可讓使用者手動執行自動化動作。
宣告手動啟動條件時:
- 請勿指定特徵或裝置類型。
- 提供呼叫
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,自動化動作就會停止執行。
運算式的形式與 Swift 中的運算式類似,可能包含原始值 (例如數字、字元、字串和布林值) 以及列舉值。使用括號將子運算式分組,即可控制評估順序。
以下是 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 節點。
方法是先在 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)
}
條件持續時間
除了條件中的布林運算式外,您還可以指定運算式必須為 true 的時間範圍,才能執行自動化動作。舉例來說,你可以定義條件,讓動作只在燈亮起十分鐘後觸發。
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
時間長度介於 1 到 30 分鐘。
動作節點
動作節點是自動化動作執行的位置。在本範例中,動作會叫用 AssistantBroadcastTrait 的 broadcast() 指令:
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}