Nach Ablauf von Zeit X eine Aktion abbrechen und zur nächsten übergehen

Servus,

ich habe gerade nen Knoten im Hirn und finde einfach keine Möglichkeit wie ich einzelne Aktionen abbrechen lassen kann wenn Sie nicht innerhalb einer Zeit erfüllt worden sind.
Das Szenario:
Ich habe verschiedene Gardena Bluetooth Ventile, welche durch die Smart Irrigation aktiviert werden wenn die Bewässerungszeit über 120Sekunden ist. Da diese jedoch von Zeit zu Zeit nicht erreichbar sind wird vorher geprüft ob diese da sind. Wenn nicht dann wird eine Schleife gesetzt das den ESP Proxy neustartet, dann 3 Minuten wartet. Bis das Ventil wieder verfügbar ist. und dann Bewässert. Ansonsten, also wenn das Ventil verfügbar ist wird sofort bewässert.

Nun zum Problem:
Durch die Schleife läuft das ja unendlich lang sollte sich das Ventil nicht mehr anmelden, Batterie leer oder warum auch immer… Deshalb möchte ich einen Timer von zb. 60 Minuten starten. Wenn in dieser Zeit das Ventil nicht wieder erreichbar ist, dann soll diese eine Aktionskette abgebrochen werden und er zur nächsten Aktion(nächstes Ventil) springen.

Das hier ist der Code für ein Ventil.

# Wenn die berechnete Zeit über 120s dann soll die nachfolgende Aktion ausgelöst werden.
if:
  - condition: numeric_state
    entity_id: sensor.smart_irrigation_zone2_rasen
    above: 120
then:
# Wenn das Ventil aber nicht verfügbar ist dann erstelle eine Wiederholungsschleife ( starte den ESP Neu und warte 3 Minuten. Solange bis das Ventil wieder da ist)
  - if:
      - condition: state
        entity_id: switch.gardena_rasen_2_offen
        state: unavailable
    then:
      - repeat:
          sequence:
            - device_id: 7e47df87c7bcab40ad9eb5781667fb1e
              domain: button
              entity_id: 9d552b8aeba0640e0b91b88c83e1db7d
              type: press
            - delay:
                hours: 0
                minutes: 3
                seconds: 0
                milliseconds: 0
          until:
            - condition: or
              conditions:
                - condition: state
                  entity_id: switch.gardena_rasen_2_offen
                  state: "on"
                - condition: state
                  entity_id: switch.gardena_rasen_2_offen
                  state: "off"
# Wenn das Ventil dann wieder da ist, starte das Skript das den Sekunden Wert der Integration in Minuten umrechnet und dieses dann in das Ventil zur Öffnung der Zeit schreibt.
      - action: script.set_gardena_rasen_2_value_in_minutes
        data: {}
# Warte sicherheitshalber 10 Sekunden bis der passende Bucket gelöscht wird.
      - delay:
          hours: 0
          minutes: 0
          seconds: 10
          milliseconds: 0
      - action: smart_irrigation.reset_bucket
        target:
          entity_id: sensor.smart_irrigation_zone2_rasen
        data: {}
# Um keine Ventile gleichzeitig zu öffnen wegen dem Wasserdruck warte bis sich der Zustand von On zu Off ändert. Aber maximal 1 Stunde, denn das ist die maximale Bewässerungszeit.
      - wait_for_trigger:
          - platform: state
            entity_id:
              - switch.gardena_rasen_2_offen
            from: "on"
            to: "off"
        timeout:
          hours: 1
          minutes: 0
          seconds: 0
          milliseconds: 0
    else:
# Wenn das Ventil aber sofort verfügbar war, starte sofort das Skript.
      - action: script.set_gardena_rasen_2_value_in_minutes
        data: {}
      - delay:
          hours: 0
          minutes: 0
# Warte sicherheitshalber 10 Sekunden bis der passende Bucket gelöscht wird.
          seconds: 10
          milliseconds: 0
      - action: smart_irrigation.reset_bucket
        target:
          entity_id: sensor.smart_irrigation_zone2_rasen
        data: {}
# Um keine Ventile gleichzeitig zu öffnen wegen dem Wasserdruck warte bis sich der Zustand von On zu Off ändert. Aber maximal 1 Stunde, denn das ist die maximale Bewässerungszeit.
      - wait_for_trigger:
          - platform: state
            entity_id:
              - switch.gardena_rasen_2_offen
            from: "on"
            to: "off"
        timeout:
          hours: 1
          minutes: 0
          seconds: 0
          milliseconds: 0

Vielen Dank schon mal

Moin,

bin nicht der Programmierer vor dem Herren, daher habe ich mal gemini befragt :wink:

Ab hier ist das Googels Idee :slight_smile:

Absolut! Lass uns gemeinsam eine Automation in Home Assistant erstellen, die dein Ventil dreimal neu startet, falls es nicht reagiert.

Verstehen der Anforderungen:

  • Trigger: Ein Ereignis, das die Automation startet (z.B. ein Zeitplan, ein Sensor, ein anderer Zustand).
  • Bedingung: Das Ventil ist nicht geöffnet.
  • Aktion:
    • Ventil ausschalten.
    • Kurze Pause.
    • Ventil einschalten.
    • Zähler erhöhen.
    • Wenn Zähler < 3, wiederhole die Aktion.

YAML-Beispiel für die Automation:

automation:
  - alias: Ventil-Reboot-Schleife
    trigger:
      # Hier den gewünschten Trigger anpassen (z.B. time_pattern: '0 0 * * 6')
      - platform: time_pattern
        minutes: /5
    condition:
      # Hier die Bedingung anpassen (z.B. state: binary_sensor.ventil_status == 'off')
      - condition: state
        entity_id: binary_sensor.ventil_status
        state: 'off'
    action:
      - service: switch.turn_off
        entity_id: switch.ventil
      - delay:
          seconds: 5
      - service: switch.turn_on
        entity_id: switch.ventil
      - service: input_number.increment
        entity_id: input_number.ventil_reboot_counter
      - condition:
          condition: template
          value_template: '{{ states.input_number.ventil_reboot_counter.state | int < 3 }}'
        then:
          - repeat:
              count: 1
              sequence:
                - service: automation.trigger
                  entity_id: automation.ventil_reboot_scheife  # Ersetze durch die genaue ID deiner Automation

Erklärung:

  • Trigger: Hier kannst du einen Zeitplan festlegen, wann die Automation regelmäßig überprüft werden soll.
  • Bedingung: Passe die Bedingung an, um zu prüfen, ob das Ventil tatsächlich geschlossen ist.
  • Aktion:
    • Das Ventil wird ausgeschaltet und wieder eingeschaltet.
    • Ein Zähler wird erhöht, um die Anzahl der Versuche zu verfolgen.
    • Solange der Zähler kleiner als 3 ist, wird die Schleife wiederholt.

Wichtige Anpassungen:

  • Entity-IDs: Ersetze binary_sensor.ventil_status und switch.ventil durch die korrekten Entity-IDs in deiner Home Assistant-Instanz.
  • Trigger: Wähle einen geeigneten Trigger aus (z.B. Zeitplan, Sensor, anderes Ereignis).
  • Bedingung: Passe die Bedingung an deine spezifische Situation an.
  • Zähler: Erstelle einen input_number-Entität namens ventil_reboot_counter, um die Anzahl der Versuche zu speichern.

Zusätzliche Überlegungen:

  • Fehlerbehandlung: Du könntest eine Nachricht in ein Logbuch schreiben oder eine Benachrichtigung senden, wenn der maximale Anzahl an Versuchen erreicht ist.
  • Fehlerursache: Versuche herauszufinden, warum das Ventil nicht reagiert. Möglicherweise gibt es ein anderes Problem, das behoben werden muss.
  • Optimierung: Du könntest die Wartezeit zwischen den Versuchen anpassen oder weitere Bedingungen hinzufügen.

Visualisierung:

Um einen besseren Überblick zu behalten, kannst du die Automation in der Home Assistant-Oberfläche visualisieren. Es gibt verschiedene Add-ons und Integrationen, die dies ermöglichen.

Hinweis:

  • Sicherheit: Stelle sicher, dass die Automation keine unerwünschten Nebeneffekte hat.
  • Testen: Teste die Automation gründlich, bevor du sie im produktiven Einsatz verwendest.

Mit dieser Automation hast du eine robuste Lösung, um dein Ventil automatisch neu zu starten, falls es Probleme gibt.

Möchtest du weitere Anpassungen oder Ergänzungen vornehmen?

VG
Bernd

Danke dir für deinen Tipp. Wenn ich den Code richtig verstehe, dann bezieht er sich auf den Bereich (rot markiert) diesen könnte ich dadurch ersetzen, dann wird nach dem festgelegten Counter der rote Part beendet, würde aber dann direkt darunter weitermachen, er müsste aber alles darunter liegende mit abbrechen, also der gesamte blaue Bereich müsste beendet werden. Ich muss also irgendwie davor, also zu Beginn des DANN etwas einbinden. Ich dachte ja an ein Oder (entweder Zeit läuft ab oder die Aktionskette wurde erfüllt) nur gibt es a kein Oder bei Aktionen sondern nur bei Bedingungen.

Moin,

Es sind ja mehrere Bedingungen, die erfüllt seien müssen.

  1. Ventil ist online
    • ja, dann mach Regen
      • Regen für x Minuten
      • Fertig, Ende
    • nein, dann starte das Gerät neu → setze Counter auf 1
      • Counter > 3, nein kleiner
      • 1er-Durchlauf, Gerät ist online → ja, dann mach Regen
    • nein, dann starte das Gerät neu → setze Counter auf 2
      • Counter > 3, nein kleiner
      • 2er-Durchlauf, Gerät ist online → ja, dann mach Regen
  • nein, dann starte das Gerät neu → setze Counter auf 3
  • Counter > 3
    • 3er-Durchlauf, Gerät ist online → ja, dann mach Regen
  • nein, dann starte das Gerät neu → setze Counter auf 4
  • Counter > 3
    • ja, breche ab
    • Mail → Gerät nicht erreicht

Die Bewässerung ist dann ein eigener Zweig

So oder so ähnlich, ich habe aber heute keine Lust mehr mir das Gehirn zu martern :slight_smile:

VG
Bernd

P.S.: Hier im Forum gibt es bessere Programmierer als mich, ich schaue hier auch nur ab :slight_smile:

Ich werfe mal was relativ einfaches ins Renne.
Kauf Dir anständige Bewässrung-Ventile! :wink:

Auswahl als Aktion:

Option 1:
Wenn Ventil geschlossen, also nicht nicht verfügbar.
Dann Ventil öffnen.

Option 2:
Wenn Ventil nicht verfügbar und letze Änderung nicht älter als 60 min. Also das Ventil ist nicht länger als 60 min nicht verfügbar.
Dann ESP neu starten, 3 min warten und die Automatisierung neu starten.

action:
  - choose:
      - conditions:
          - condition: state
            entity_id: valve.xyz
            state: closed
        sequence:
          - action: valve.open_valve
            metadata: {}
            data: {}
            target:
              entity_id: valve.xyz
      - conditions:
          - condition: state
            entity_id: valve.xyz
            state: unavailable
          - condition: template
            value_template: >-
              {{ (((as_timestamp(now()) -
              as_timestamp(states.valve.xyz.last_changed))) /
              60) < 60 }}
        sequence:
          - action: button.press
            metadata: {}
            data: {}
            target:
              entity_id: button.esp_restart
          - delay:
              hours: 0
              minutes: 3
              seconds: 0
              milliseconds: 0
          - action: automation.trigger
            metadata: {}
            data:
              skip_condition: false
            target:
              entity_id: automation.bewasserung
mode: single

Bleibt das Ventil länger unverändert im Status nicht verfügbar, in dem Fall länger als 60 min.
Hört die Autonmatisierung auf sich selbst zu triggern.

Gruß
Osorkon

1 „Gefällt mir“

Danke dir für deinen Code. Habe mit Options bisher noch nicht so gearbeitet da ich mit wenn dann sonst immer alles hinbekommen habe. Aber da das wohl etwas mächtiger ist sollte ich mich damit mal befassen.

Zu den Ventilen. Ja da mag es bestimmt besseres geben, nur habe ich an der Stelle keinen Strom deshalb sind es die 9V von Gardena geworden.

Dein Code sieht gut aus vielen Dank. Werd ich mir auch mal näher anschauen. Ich habe gegen Mitternacht tatsächlich noch nen Code zusammen bekommen der das auch bewirken soll. war eigentlich ganz simple, in die “Wiederholen bis Schleife” einfach ein zusätzliches Oder in die Bedingung mit rein. Manchmal sieht man den Wald vor lauter Bäumen einfach nicht.

Das wäre das was ich zusammen geschustert habe.

if:
  - condition: numeric_state
    entity_id: sensor.smart_irrigation_zone2_rasen
    above: 120
then:
  - if:
      - condition: state
        entity_id: switch.gardena_rasen_2_offen
        state: unavailable
    then:
      - repeat:
          sequence:
            - device_id: 7e47df87c7bcab40ad9eb5781667fb1e
              domain: button
              entity_id: 9d552b8aeba0640e0b91b88c83e1db7d
              type: press
            - delay:
                hours: 0
                minutes: 3
                seconds: 0
                milliseconds: 0
          until:
            - condition: or
              conditions:
                - condition: or
                  conditions:
                    - condition: state
                      entity_id: switch.gardena_rasen_2_offen
                      state: "on"
                    - condition: state
                      entity_id: switch.gardena_rasen_2_offen
                      state: "off"
                - condition: state
                  entity_id: switch.gardena_rasen_2_offen
                  state: unavailable
                  for:
                    hours: 1
                    minutes: 0
                    seconds: 0
      - if:
          - condition: or
            conditions:
              - condition: state
                entity_id: switch.gardena_rasen_2_offen
                state: "off"
              - condition: state
                entity_id: switch.gardena_rasen_2_offen
                state: "on"
        then:
          - action: script.set_gardena_rasen_2_value_in_minutes
            data: {}
          - action: timer.start
            target:
              entity_id: timer.bewasserungsventilzeit
            data:
              duration: >
                {% set total_seconds =
                (states('sensor.smart_irrigation_zone2_rasen') | int) -10 %} {%
                set hours = total_seconds // 3600 %} {% set minutes =
                (total_seconds % 3600) // 60 %} {% set seconds = total_seconds %
                60 %} {{ '{:02}:{:02}:{:02}'.format(hours, minutes, seconds) }}
          - delay:
              hours: 0
              minutes: 0
              seconds: 5
              milliseconds: 0
          - action: smart_irrigation.reset_bucket
            target:
              entity_id: sensor.smart_irrigation_zone2_rasen
            data: {}
          - wait_for_trigger:
              - platform: state
                entity_id:
                  - timer.bewasserungsventilzeit
                to: idle
            timeout:
              hours: 1
              minutes: 0
              seconds: 0
              milliseconds: 0
            continue_on_timeout: true
    else:
      - action: script.set_gardena_rasen_2_value_in_minutes
        data: {}
      - action: timer.start
        target:
          entity_id: timer.bewasserungsventilzeit
        data:
          duration: >
            {% set total_seconds =
            (states('sensor.smart_irrigation_zone2_rasen') | int) -10 %} {% set
            hours = total_seconds // 3600 %} {% set minutes = (total_seconds %
            3600) // 60 %} {% set seconds = total_seconds % 60 %} {{
            '{:02}:{:02}:{:02}'.format(hours, minutes, seconds) }}
      - delay:
          hours: 0
          minutes: 0
          seconds: 5
          milliseconds: 0
      - action: smart_irrigation.reset_bucket
        target:
          entity_id: sensor.smart_irrigation_zone2_rasen
        data: {}
      - wait_for_trigger:
          - platform: state
            entity_id:
              - timer.bewasserungsventilzeit
            to: idle
        timeout:
          hours: 1
          minutes: 0
          seconds: 0
          milliseconds: 0
        continue_on_timeout: true