Trigger ausführen, wenn (zusätzliche) Bedingung über bestimmten Zeitraum wahr ist

Eine Automation kann ausgelöst werden, wenn zum Beispiel die Lichtstärke in den letzten 15 Minuten über 15’000 Lux war

trigger: numeric_state
entity_id:
  - sensor.lichtsensor_front_beleuchtungsstarke
for:
  hours: 0
  minutes: 15
  seconds: 0
id: Lichtsensor Front
above: 15000

Wie aber kann man die Automation ausführen wenn der Trigger

a) den Azimut betreffen soll aber
b) nur unter der Bedingung ausgeführt werden soll, wenn die Lichtstärke in den letzten 15 Minuten über 15’000 Lux war?

a)

trigger: numeric_state
entity_id:
  - sensor.sun_solar_azimuth
above: 88
id: azimut.ein.front

b) mit folgender Bedingung wird der IST-Zustand abgefragt, aber nicht die letzten 15 Minuten.

condition: numeric_state
entity_id: sensor.lichtsensor_front_beleuchtungsstarke
above: 15000

Kann das mit einem Template gelöst werden oder muss eine zusätzliche Automation erstellt werden?

Gruss

Chris

Du kannst doch im “actions” Teil jede Beliebige Bedingung Abfragen. Der Trigger gibt nur an, was die Bearbeitung auslöst, z.B. 15 Minuten Helligkeit über 15000.

Danach z.B.

triggers:
.
.
.
conditions:
.
.
.
actions:
  - if:
      - condition: and
        conditions:
          - condition: state
            entity_id: schedule.zeitsteuuerung_flur
            state: "on"
          - type: is_illuminance
            condition: device
            entity_id: licht_flur
            below: 0.25
    then:
      - data: {}
        target:
          entity_id: switch.plug_flur
        action: switch.turn_on
    else:
      - data: {}
        target:
          entity_id: switch.plug_flur
        action: switch.turn_off

oder nur eine Abfrage (ohne und Verknüpfung):

      - if:
          - condition: state
            entity_id: input_boolean.geschirr_nachricht_handy
            state: "on"
        then:

Da könnte da der Azimut abgefragt werden.

Hallo LutzHB.

Danke für deine Ausführungen.

Du kannst doch im “actions” Teil jede Beliebige Bedingung Abfragen.

Genau. Und in diesem Teil müsste dann die Abfrage nach den Lux der letzten 15 Minuten stattfinden.

Der Trigger wird ja durch den Azimut ausgelöst. Dieser soll aber nicht ausgelöst werden, wenn in den letzten 15 Minuten die Lux nicht permanent über 15000 waren

Du könntest z.B. in einer 2. Automation einen input_boolean auf on setzen, wenn die letzten 15 Min. die Lux hoch waren. Und wieder auf off, wenn die lux niedriger sind.
In der 1. Automation fragst du denn input_boolean dann als Bedingung ab.

Nimm eine zweite Bedingung in Form einer Template-Bedingung mit rein:


conditions:
  - condition: numeric_state
    entity_id: sensor.lux
    above: 15000
  - condition: template
    value_template: "{{ now() - states.sensor.lux.last_changed > timedelta(minutes=15) }}"

Maxe

Danke.
Das hatte und habe ich als Plan b) im “Hinterkopf”, ist aber nicht so “galant” :slightly_smiling_face:

Kitty. Ich vermute, dein Vorschlag funktioniert (wie all deine Vorschläge). Gebe noch Bescheid.

Was meinst du zu folgender Template-Bedingung?

value_template: "{{ (now() - states.sensor.lichtsensor_front_beleuchtungsstarke.last_changed).total_seconds() > 900 }}"

Oje. Zuviel der Ehre.

Klar, das geht natürlich auch.

Dann darf sich die lux aber nicht verändern, z.b. von 15035 auf 15123.

Jep, das ist die Crux bei einem „zittrigen“ state wie Lux. Funktioniert im Prinzip nur dann zuverlässig, wenn der Sensor in einem dunklen Raum hängt.

Hier eine mögliche Lösung

Template-Sensor erstellen:

template:
  - sensor:
      - name: "Lux über 20k" # ergibt entity_id: sensor.lux_uber_20k
        state: >
          {% if states('sensor.lichtsensor_front_durchschnittliche_beleuchtungsstarke') | float > 20000 %}
            on
          {% else %}
            off
          {% endif %}

Dieser Template-Sensor gibt on zurück, wenn der Wert über 20’000 Lux liegt, und off, wenn er darunter liegt.

history_stats-Sensor auf den Template-Sensor anwenden:

- platform: history_stats
  name: "Lux über 20k 30 Minuten" # ergibt entity_id: sensor.lux_uber_20k_30_minuten
  entity_id: sensor.lux_uber_20k
  state: 'on'
  type: time
  end: '{{ now() }}'
  duration:
    minutes: 30

Dieser misst, wie lange der Template-Sensor den Zustand on (also mehr als 20.000 Lux) in den letzten 30 Minuten hatte.
Der Zustand wird in Stunden angeben. Somit sind 15 Minuten über 20’000 lx = Wert von 0.25 (Stunden).

Nun in der Automation die zusätzliche Bedingung (oder als Trigger) integrieren:

    condition:
      - condition: numeric_state
        entity_id: sensor.lux_uber_20k_30_minuten
        above: '0.25'  # entspricht 15 Minuten

Somit würde zum Beispiel der Rollo heruntergefahren, sobald in den letzten 30 Minuten die Lux während (total) 15 Minuten über 20’000 waren.

Home-Assistant ist Neuland für mich. Also gut möglich, dass es auch eine einfachere Lösung gibt.

Ich würde es mit einem Template Binary Sensor testen, ob die gewünschten Ergebnisse erzielt werden.


  - binary_sensor:
      - name: Lux-Veränderung
        delay_on:
          minutes: 1
        state: >
          {{ states('sensor.lux') |int(-1) > 100 }}

delay_on bedeutet, dass mein Luxsensor 1 min. über 100 gewesen sein muss, damit der Binärsensor auf on springt, das funktioniert auch soweit.

Ja. Funktioniert auch. Ich sehe aber nicht ganz, was der Vorteil ist

Nur eine zusätzliche Hilfs-Entität statt zweier.

Aber das heisst, dass die LUX dann im Zeitraum der Verzögerung nie unter den gewählten Wert (20’000) fallen darf, da ansonsten die Verzögerung neu startet (zum Beispiel weil für 2 Minuten eine Wolke vorbei zieht).

2 Entitäten haben den Vorteil, dass das berücksichtigt werden kann, indem in der Automation der gewünschte Wert eingestellt wird.

Falls erforderlich, dass die LUX während der gesamten “Beobachtungsperiode” nie unter den gewählten Wert fallen dürfen, kann dies durch Erhöhung des above: in der Automation angepasst werden:

Bei eine (Beobachtungs-) Periode von 30 Minuten

above: '0.49'  # entspricht 29.4 Minuten

In diesem Fall wäre aber dein Vorschlag sicher sinnvoller.

Oder übersehe ich sonst noch etwas?

Vielleicht hab ich jetzt Mattscheibe, aber der History Stats Sensor misst doch auch nur, wie oft innerhalb von 30 min. die Luxwerte über einem bestimmten Wert lagen, also ebenso zufällig.

Ja, an einen entsprechend erhöhten Wert hab ich auch schon gedacht. Oder ein above-below-Fenster.

Genau.
Er gibt an, wie viele Minuten der Luxwert über dem definierten Wert während der Beobachtungsperiode (zum Beispiel 30 Minuten) lag. Daraus erfolgt der Zustand in Stunden.

Beobachtungzeitraum = die letzten 30 Minuten
Anzahl Minuten Luxwert über definiertem Wert = 20 Minuten (egal ob alles an 1 Stück oder mit Unterbrüchen)
Somit ist der Zustand des history-stats: 0.33 = 20 Minuten von 60 Minuten

Mit dem - binary_sensor: müssen alle gemessenen Werte während des gesamten Zeitraumes über dem definierten Wert liegen. Ansonsten erfolgt jedes Mal ein “Neustart” der Zählung.

Mit dem history-stats können einzelne “Ausrutscher” berücksichtigt werden. Je höher der (above-) Wert in der Automation, desto weniger “Ausrutscher” dürfen vorhanden sein.

Ja also, wenn’s so verlässlicher funktioniert, denn mal ran. :+1:t2: Und berichte mal nach ein paar Tagen.