次のガイドでは、さまざまな Automation DSL ノードを使用して自動化を構築する方法について説明します。
すべての自動化 DSL は、単一の automation
ノード内に配置されます。automation
ノードは、外側の Swift 言語コンテキストと埋め込み DSL コンテキストの境界を形成します。
順次フロー
順序型フローは、自動化フローのデフォルト タイプです。
以下は、開始条件、条件、アクションで構成される順序型のフローを使用する、非常に基本的な Automation DSL テンプレートです。
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
ノードを追加することで、このモデルを絞り込むことができます。
Starter
開始条件ノードは、自動化を有効にする初期状況を定義します。たとえば、状態や値の変化です。自動化には少なくとも 1 つの開始条件が必要です。開始条件がないと、検証で不合格になります。自動化に複数の開始条件を追加するには、select
ノードを使用する必要があります。
特徴属性に基づくスターター
トレイト属性に基づく開始ノードを宣言する場合は、次のように指定します。
- デバイス
- トレイトが属するデバイスタイプ
- 特性
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
デバイスタイプ パラメータは、自動化がデバイス内のどのデバイスタイプを対象とするかを指定する必要があるため必須です。たとえば、デバイスが FanDeviceType
と HeatingCoolingUnitDeviceType
で構成されている場合、どちらにも OnOffTrait
の特徴が含まれています。デバイスタイプを指定することで、デバイスのどの部分が自動化をトリガーするかが明確になります。
イベントベースの開始条件
イベントに基づく開始ノードを宣言する場合は、次のように指定します。
- デバイス
- トレイトが属するデバイスタイプ
- イベント
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
構造とイベントに基づく開始条件(パラメータあり)
一部のイベントにはパラメータが含まれるため、これらのパラメータも開始条件に含める必要があります。
たとえば、この開始条件は TimeTrait
の ScheduledEvent
を使用して、午前 7 時に自動化を有効にします。
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
手動スターター
手動開始条件は、ユーザーが自動化を手動で実行できるようにする特別なタイプの開始条件です。
手動開始条件を宣言する場合:
- トレイトやデバイスタイプは指定しないでください。
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 の式と同様の方法で作成され、数値、文字、文字列、ブール値などのプリミティブ値や列挙型値を含めることができます。サブ式を括弧でグループ化すると、評価順序を制御できます。
複数のサブ式を 1 つの式に結合する 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
ノードで特徴属性の値を参照するもう 1 つの方法は、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 である必要がある期間を指定できます。たとえば、ライトが 10 分間点灯している場合にのみトリガーされる条件を定義できます。
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
時間は 1 ~ 30 分の範囲で指定できます。
アクションノード
アクションノードは、自動化の処理が行われる場所です。この例では、アクションは AssistantBroadcastTrait
の broadcast()
コマンドを呼び出します。
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}