自动化 DSL 可用于创建比 DSL 指南 - 适用于 iOS 的基本自动化操作中所述的自动化操作更复杂的自动化操作。
包含多项操作的顺序
一个自动化操作可以执行多项操作。例如,您可以使用多个 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 小时。
例如,如需将灯切换四次,每次切换之间间隔 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
。
在操作中设置 trait 属性
如需设置 trait 属性的值,请执行以下操作:
- 在
action
节点内创建update
节点,并将相关 trait 作为update
节点的参数包含在内:action(deviceReference, deviceType) { update(trait) { } }
- 在
update
节点中,对于要修改的每个属性,使用修饰符函数并将新值传递给它。 如需构成更改器函数的名称,请执行以下操作:- 将属性名称转换为大写
- 在其前面添加
set
字样。
defaultMoveRate
的属性,您可以使用名为setDefaultMoveRate
的修饰符函数。
请注意,一个 update
节点可以有多个修饰符函数。以下示例更新了两个属性:
typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait
action(fan, FanDeviceType.self) {
update(FanControlTrait.self) {
$0.setFanMode(.on)
}
}