Automation DSL を使用すると、DSL ガイド - iOS での基本的な自動化で説明されているものよりも複雑な自動化を作成できます。
複数のアクションを含む順序型
1 つの自動化で複数の処理を行うことができます。たとえば、単一の action
ノードではなく、複数の action
ノードを連続して実行することもできます。
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
action {...}
action {...}
}
複数の並列アクションを含む順序型
parallel
ノードに複数の action
ノードを配置すると、アクションは同時に実行されます。
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
parallel {
action {...}
action {...}
action {...}
}
}
sequential
ノードに parallel
ノードより後に action
ノードがある場合、parallel
ノード内のすべてのノードが実行を完了するまで待機します。
処理の遅れ
自動化に一時停止を導入するには、delay(for:)
メソッドを使用します。このメソッドは、実行を続行する前に一時停止する時間を表す Duration
引数を受け取ります。一時停止時間は最短で 5 秒、最長で 24 時間です。
たとえば、ライトを 4 回切り替えて、切り替えるたびに 5 秒間待機するには、次のようにします。
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias OnOffTrait = Matter.OnOffTrait
sequential {
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
delay(for:.seconds(5))
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}
トリガーの抑制
トリガーの抑制は、最初のトリガー イベントの後に、自動化が starter
を指定された期間無視できるようにする機能です。たとえば、自動化に動き検知によってトリガーされる starter
があり、トリガー抑制時間を 5 分に指定した場合、starter
がトリガーされても、次の 5 分間はトリガーされません。これにより、自動化が何度もすばやくトリガーされるのを防ぐことができます。
トリガーの抑制を自動化に適用するには、suppress(for:)
キーワードと、後続のトリガーに応答するまでの待機時間を表す Duration
引数を使用します。抑制期間は、最短で 5 秒、最長で 24 時間に設定できます。
typealias OccupancySensorDevice = Matter.OccupancySensorDeviceType
typealias OnOffLightDevice = Matter.OnOffLightDeviceType
typealias MotionDetectionTrait = Google.MotionDetectionTrait
typealias OnOffTrait = Matter.OnOffTrait
automation {
let starterNode = starter(device, OccupancySensorDevice.self, MotionDetectionTrait.self)
starterNode
suppress(for: .seconds(30 * 60) // 30 minutes
action(light, OnOffLightDevice.self) { OnOffTrait.toggle() }
}
トリガーの抑制は、Suppression
の前に続く自動化内のすべての starters
に影響します。
アクションで特徴属性を設定する
特徴属性の値を設定するには:
action
ノード内にupdate
ノードを作成し、関連するトレイトをupdate
ノードの引数として含めます。action(deviceReference, deviceType) { update(trait) { } }
update
ノード内で、変更する属性ごとにミュータ関数を使用して、新しい値を渡します。ミュータ関数の名前を作成するには:- 属性名を大文字にする
- 先頭に
set
という単語を付けます。
defaultMoveRate
という属性を更新するには、setDefaultMoveRate
というミュータタ関数を使用します。
update
ノードには複数のミュータタ関数を含めることができます。2 つの属性が更新される例を次に示します。
typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait
action(fan, FanDeviceType.self) {
update(FanControlTrait.self) {
$0.setFanMode(.on)
}
}