複雑な自動化のための Android DSL ガイド

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

複数のアクションを含むシーケンシャル

複数のアクションを含むシーケンシャル

1 つの自動化で複数の処理を行うことができます。たとえば、単一の action ノードの代わりに、複数の action ノードを順番に実行できます。

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

複数の並列アクションを含むシーケンシャル

複数の並列アクションを含むシーケンシャル

複数の action ノードを parallel ノードに配置すると、アクションが同時に実行されます。

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

parallel ノードの後に sequential ノードに 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 日中外出している間に掃除機をかける 1 回限りの自動化を設定できます。

これを行うには、自動化の maxExecutionCount メタデータ フィールドを設定します。次の例は、1 回だけ実行できる自動化です。

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 に達するとすぐに削除されます。自動化の履歴エントリは、automation_id を含め、Google Home app (GHA) [アクティビティ] タブに残ります。

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

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

  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)
  }
}