iOS DSL 指南

請參閱以下指南,瞭解如何使用各種 Automation DSL 節點建構自動化動作。

所有自動化 DSL 都會放在單一 automation 節點中。automation 節點會形成外部 Swift 語言情境和內嵌 DSL 情境之間的界線。

依序流程

序列式流程是自動化流程的預設類型。

順序 DSL 範例

以下是相當基本的自動化動作 DSL 範本,使用由啟動條件、限制條件和動作組成的順序流程:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {
  starter(...)
  condition {...}
  action {...}
}

您可以新增其他節點來改善這項功能。

Starter

啟動條件節點會定義啟用自動化動作的初始情況。例如狀態或值的變更。自動化動作必須至少包含一個啟動條件,否則無法通過驗證。如要在自動化動作中新增多個啟動條件,您必須使用 select 節點。

以特徵屬性為依據的啟動條件

宣告以特徵屬性為基礎的啟動節點時,請指定:

  • 裝置
  • 特徵所屬的裝置類型
  • 特徵
starter(
  thermostat,
  Matter.TemperatureSensorDeviceType.self,
  Matter.TemperatureMeasurementTrait.self
)

裝置類型參數是必要的,因為它可讓您指定自動化動作要處理的裝置內裝置類型。舉例來說,裝置可能由 FanDeviceTypeHeatingCoolingUnitDeviceType 組成,兩者都包含 OnOffTrait 特徵。指定裝置類型後,系統就會明確知道裝置的哪個部分會觸發自動化動作。

以事件為準的啟動條件

宣告事件啟動節點時,請指定:

  • 裝置
  • 特徵所屬的裝置類型
  • 事件
starter(
  doorbell,
  Google.GoogleDoorbellDeviceType.self,
  Google.DoorbellPressTrait.DoorbellPressedEvent
)

以結構和事件為基礎的啟動條件,並含有參數

部分事件可能包含參數,因此這些參數也必須納入啟動條件。

舉例來說,這個啟動條件會使用 TimeTraitScheduledEvent,在早上 7 點啟用自動化動作:

typealias TimeTrait = Google.TimeTrait

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

手動啟動器

手動啟動條件是一種特殊的啟動條件,可讓使用者手動執行自動化動作。

宣告手動啟動條件時:

當您在 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

您也可以使用 stateReader 節點,在 condition 節點中參照特徵屬性值。

如要這麼做,請先在 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 分鐘不等。

動作節點

動作節點是自動化動作執行的所在位置。在本範例中,動作會叫用 AssistantBroadcastTraitbroadcast() 指令:

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