Automation 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 节点中有 action 节点位于 parallel 节点之后,这些节点会等待,直到 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。
在操作中设置特征属性
如需设置特征属性的值,请执行以下操作:
- 在
action节点中创建一个update节点,并将相关特征作为update节点的实参:action(deviceReference, deviceType) { update(trait) { } } - 在
update节点中,对于要修改的每个属性, 使用 mutator 函数,并向其传递新值。 如需构成 mutator 函数的名称,请执行以下操作:- 将属性的名称大写
- 在前面加上单词
set。
defaultMoveRate的属性, 您可以使用名为setDefaultMoveRate的 mutator 函数。
请注意,update 节点可以有多个 mutator 函数。以下示例展示了如何更新两个属性:
typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait
action(fan, FanDeviceType.self) {
update(FanControlTrait.self) {
$0.setFanMode(.on)
}
}