DSL 指南 - 複雜的自動化動作

自動化 DSL 可用於建立比DSL 指南 - 基本自動化動作中所述的自動化動作更複雜的自動化動作。

包含多個動作的順序

包含多個動作的順序

自動化動作可以執行多項動作。舉例來說,您可以使用多個 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 小時。

例如,如果想在每次切換燈具時停頓五秒,總共切換四次燈具,請按照下列步驟操作:

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,且您指定的觸發抑制時間為五分鐘,那麼當 starter 觸發時,系統就不會在接下來五分鐘內再次觸發。這可避免自動化動作不斷重複觸發。

如要將觸發事件抑制功能套用至自動化動作,請使用 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

在動作中設定特徵屬性

如要設定特徵屬性的值,請按照下列步驟操作:

  1. action 節點中建立 update 節點,並將相關特徵納入 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)
  }
}