DSL ガイド - 複雑な自動化

Automation DSL を使用すると、DSL ガイド - 基本的な自動化で説明されているものよりも複雑な自動化を作成できます。

複数のアクションを含む順序型

複数のアクションを含む順序型

1 つの自動化で複数の処理を行うことができます。たとえば、単一の 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 時間です。

たとえば、照明を 4 回切り替えて、切り替えるたびに 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 に影響します。

アクションで特徴属性を設定する

特徴属性の値を設定するには:

  1. action ノード内に update ノードを作成し、関連するトレイトを update ノードの引数として含めます。
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
  2. update ノード内で、変更する属性ごとにミュータ関数を使用して、新しい値を渡します。ミュータ関数の名前を作成するには:
    1. 属性の名前を大文字にする
    2. set という単語を接頭辞として追加します。
    たとえば、defaultMoveRate という属性を更新するには、setDefaultMoveRate というミュータタ関数を使用します。

update ノードには複数のミュータタ関数を含めることができます。2 つの属性が更新される例を次に示します。

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