DSL-Leitfaden: komplexe Automatisierungen

Mit der Automation DSL können Sie Automatisierungen erstellen, die komplexer sind als die im DSL-Leitfaden – grundlegende Automatisierungen beschriebenen.

Sequenziell mit mehreren Aktionen

Sequenziell mit mehreren Aktionen

Eine Automatisierung kann mehrere Aktionen ausführen. Anstelle des einzelnen action-Knotens können Sie beispielsweise mehrere action-Knoten verwenden, die in sequenzieller Reihenfolge ausgeführt werden:

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

Sequenziell mit mehreren parallelen Aktionen

Sequenziell mit mehreren parallelen Aktionen

Wenn Sie mehrere action-Knoten in einen parallel-Knoten einfügen, werden die Aktionen gleichzeitig ausgeführt.

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

Wenn sich im sequential-Knoten action-Knoten nach dem parallel-Knoten befinden, wird die Ausführung erst fortgesetzt, wenn alle Knoten im parallel-Knoten ausgeführt wurden.

Verzögerungen

Mit dem Keyword delayFor können Sie Pausen in Ihren Automatisierungen einfügen. Es nimmt das Argument java.time.Duration entgegen, das angibt, wie lange die Pause dauern soll, bevor die Ausführung fortgesetzt wird. Die Pause kann zwischen fünf Sekunden und 24 Stunden dauern.

So schalten Sie beispielsweise eine Lampe viermal mit einer Pause von fünf Sekunden zwischen den einzelnen Schaltvorgängen ein und aus:

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

Triggerunterdrückung

Mit der Triggerunterdrückung kann Ihre Automatisierung nach dem ersten auslösenden Ereignis einen starter für einen bestimmten Zeitraum ignorieren. Wenn die Automatisierung beispielsweise eine starter hat, die durch Bewegungserkennung ausgelöst wird, und Sie eine Dauer von fünf Minuten für die Auslöseunterdrückung angeben, wird die starter nach dem Auslösen erst nach fünf Minuten wieder ausgelöst. So wird verhindert, dass die Automatisierung immer wieder schnell ausgelöst wird.

Wenn Sie die Triggerunterdrückung auf Ihre Automatisierung anwenden möchten, verwenden Sie das Keyword suppressFor mit dem Argument java.time.Duration, das angibt, wie lange gewartet werden soll, bevor auf nachfolgende Trigger reagiert wird. Die Dauer der Unterdrückung kann zwischen fünf Sekunden und 24 Stunden liegen.

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

Hinweis: Die Unterdrückung von Triggern wirkt sich auf alle starters in einer Automatisierung aus, die vor der suppressFor stehen.

Merkmalsattribute in einer Aktion festlegen

So legen Sie den Wert eines Merkmalattributs fest:

  1. Erstellen Sie einen update-Knoten innerhalb eines action-Knotens und geben Sie das entsprechende Merkmal als Argument für den update-Knoten an:
    action(deviceReference, deviceType) {
      update(trait) {
    
      }
    }
  2. Verwenden Sie innerhalb des update-Knotens für jedes Attribut, das geändert werden soll, eine Mutatorfunktion und übergeben Sie ihr den neuen Wert. So bilden Sie den Namen der Mutatorfunktion:
    1. Geben Sie den Namen des Attributs in Großbuchstaben ein.
    2. Stellen Sie ihr das Wort set voran.
    Wenn Sie beispielsweise ein Attribut namens defaultMoveRate aktualisieren möchten, verwenden Sie eine Mutatorfunktion namens setDefaultMoveRate.

Ein update-Knoten kann mehrere Mutatorfunktionen haben. Hier ist ein Beispiel, bei dem zwei Attribute aktualisiert werden:

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