自动化 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)
}
}