DSL 指南 - 复杂的自动化操作

自动化 DSL 可用于创建比 DSL 指南 - 基本自动化操作中所述的自动化操作更复杂的自动化操作。

包含多项操作的顺序

包含多项操作的序列

一个自动化操作可以执行多项操作。例如,您可以使用多个 action 节点(而不是单个 action 节点),这些节点按顺序运行:

automation {
  sequential {
    starter<_>(...)
    condition {...}
    action {...}
    action {...}
    action {...}
    }
}

序列操作,包含多个并行操作

序列操作,包含多个并行操作

如果您在 parallel 节点中放置多个 action 节点,则这些操作会并发执行。

automation {
  sequential {
    starter<_>(...)
    condition {...}
    parallel {
      action {...}
      action {...}
      action {...}
    }
  }
}

如果 sequential 节点中存在位于 parallel 节点之后的 action 节点,则这些节点会等待执行,直到 parallel 节点中的所有节点都完成执行。

延误

您可以使用 delayFor 关键字在自动化操作中引入暂停,该关键字接受 java.time.Duration 参数,表示在继续执行之前暂停的时长。暂停时长最短可为 5 秒,最长可为 24 小时。

例如,如需将灯具切换四次,每次切换之间间隔 5 秒,请执行以下操作:

sequential {
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
  delayFor(Duration.ofSeconds(5))
  action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}

触发器抑制

触发器抑制功能可让自动化操作在初始触发事件发生后指定时间内忽略 starter。例如,如果自动化操作包含由动作检测触发的 starter,并且您指定了 5 分钟的触发器抑制时长,那么当 starter 触发时,它在接下来的 5 分钟内不会再次触发。这可防止自动化操作反复快速触发。

如需对自动化操作应用触发器抑制功能,请将 suppressFor 关键字与 java.time.Duration 参数搭配使用,表示在响应后续触发器之前需要等待多长时间。停用时长最短可为 5 秒,最长可为 24 小时。

automation {
  sequential {
    val starterNode = starter<_>(device, OccupancySensor, MotionDetection)
    suppressFor(Duration.ofMinutes(30))
    action(light, OnOffLightDevice) { command(OnOff.toggle()) }
}

请注意,触发器抑制会影响自动化操作中位于 suppressFor 之前的所有 starters

在操作中设置 trait 属性

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

  1. action 节点内创建 update 节点,并将相关 trait 作为 update 节点的参数包含在内:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
  2. update 节点中,对于要修改的每个属性,使用修饰符函数并将新值传递给它。 如需构成更改器函数的名称,请执行以下操作:
    1. 将属性名称转换为大写
    2. 为该地址加上 set 字样作为前缀。
    例如,如需更新名为 defaultMoveRate 的属性,您可以使用名为 setDefaultMoveRate 的修饰符函数。

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

action(device, Fan) {
  update(FanControl) {
    setPercentSetting(50u)
    setRockSetting(FanControlCluster.RockBitmap.rockUpDown)
  }
}