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

自动化 DSL 可用于创建比 DSL 指南 - Android 上的基本自动化中讨论的自动化更复杂的自动化。

包含多项操作的序列

包含多项操作的序列

自动化操作可以执行多项任务。例如,您可以拥有多个 action 节点,而不是单个 action 节点,这些节点按顺序运行:

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

包含多个并行操作的序列

包含多个并行操作的序列

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

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

如果 sequential 节点中有 action 个节点位于 parallel 节点之后,则这些节点会等待,直到 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

限制执行次数

您可以限制自动化流程的运行次数。

例如,您可能想设置一个一次性自动化操作,让吸尘器在您白天外出时运行。

为此,请设置自动化的 maxExecutionCount 元数据字段。以下示例是一个只能执行一次的自动化操作:

automation {
  // The automation can only be executed once.
  maxExecutionCount = 1
  // When the door lock state changes
  sequential {
    val doorLockEvent = starter<_>(doorLock, DoorLockDevice, LockOperationEvent)
    // if the door is unlocked
    condition() {
      expression = (doorLockEvent.lockOperationType equals LockOperationTypeEnum.Unlock)
    }
    // turn the light on
    action(light, DimmableLightDevice) { command(OnOff.on()) }
  }
}

当自动化操作最后一次执行完毕并达到 maxExecutionCount 时,系统会立即将其删除。自动化操作的历史记录条目会保留在Google Home app (GHA) 活动标签页中,包括 automation_id

在操作中设置特征属性

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

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

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

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