适用于复杂自动化操作的 iOS DSL 指南

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

在操作中设置特征属性

如需设置特征属性的值,请执行以下操作:

  1. action 节点内创建 update 节点,并将相关特征作为实参传递给 update 节点:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
    
  2. update 节点内,针对要修改的每个属性,使用 mutator 函数并向其传递新值。如需构成 mutator 函数的名称,请执行以下操作:
    1. 将属性名称的首字母大写
    2. 在前面加上 set 一词。
    例如,如需更新名为 defaultMoveRate 的属性, 您可以使用名为 setDefaultMoveRate 的 mutator 函数。

请注意,一个 update 节点可以有多个 mutator 函数。以下示例展示了如何更新两个属性:

typealias FanDeviceType = Matter.FanDeviceType
typealias FanControlTrait = Matter.FanControlTrait

action(fan, FanDeviceType.self) {
  update(FanControlTrait.self) {
    $0.setFanMode(.on)
  }
}