Einschaltbedingungen mit Verzögerung und neuerlicher Prüfung

Hallo!

Ich habe folgende Herausforderung:

Ich will meinen Luftentfeuchter einschalten, wenn ich einen Überschuss in der Solarproduktion habe und der Luftentfeuchter zumindest 5 Minuten ausgeschaltet war. (Den Zweig zum Ausschalten lasse ich zur Vereinfachung weg.)

Wenn die 5 Minuten “Verweilzeit” im Status “aus” nicht erfüllt sind, dann möchte ich - die restliche Zeit auf die 5 Minuten warten. Wenn danach immer noch Überproduktion vorhanden ist, dann möchte ich den Luftentfeuchter einschalten.

Mir ist bei dieser Aufgabenstellung leider nicht vollkommen klar wie ich die Lösung angehe. Überproduktion ist der Trigger. Die Wartezeit auf 5 Minuten würde ich auch hinbekommen. Aber dann zu prüfen ob der Trigger immer noch Gültigkeit hat (es könnte auch eine dicke Wolke gekommen sein und ich habe keine Überproduktion mehr) und ggf. einschalten - da fehlt mir die Fantasie. Hat jemand so etwas schon gelöst und kann mir bitte helfen?

Danke, Rallye

Eine Möglichkeit wäre, einen Countdown von 5 Minuten zu starten, wenn eine Überproduktion erkannt wird. Nach Ablauf des Countdowns wird dann der Luftentfeuchter eingeschaltet. Sollte keine Überproduktion mehr vorhanden sein, schaltet eine zweite Automation den Countdown einfach aus.
Du brauchst also drei Automationen:

  1. Überproduktion erkannt → Countdown (neu)starten
  2. Keine Überproduktion erkannt → Countdown anhalten
  3. Countdown abgelaufen → Entfeuchter einschalten

Den Anteil zum Ausschalten kannst Du entsprechend gestalten.

1 „Gefällt mir“

Ich habe bei meiner Überschusheizung eine ähnliche Logik. Vielleicht hilft Dir das Snippet ja bei auch Deinem Problem:

alias: Überschussheizen EIN (setzt nur Helfer)
description: >-
  Aktiviert das Warmwasser nur bei PV-Überschuss am Tag und vollem Akku (ohne
  Tageslimit)
triggers:
  - entity_id: sensor.grid_power_out_varta
    above: 3000
    for:
      minutes: 5
    trigger: numeric_state
conditions:
  - condition: numeric_state
    entity_id: sensor.varta_ladestand_gefiltert
    above: 95
  - condition: state
    entity_id: input_boolean.schalter_uberschussheizen
    state: "off"
    for:
      hours: 0
      minutes: 15
      seconds: 0
actions:
  - target:
      entity_id: input_boolean.schalter_uberschussheizen
    action: input_boolean.turn_on
    data: {}
mode: single

Diese Bedingung hier sollte helfen (angepasster Auszug):

  - condition: state
    entity_id: DEIN LUFTENTFEUCHTER
    state: "off"
    for:
      hours: 0
      minutes: 5
      seconds: 0
1 „Gefällt mir“

Danke, jotka. Das wäre das, woran ich auch gedacht hätte. Aber: wenn zum Zeitpunkt der Auslösung des Triggers der Schalter noch keine 15 Minuten “aus” war, dann wird nicht eingeschaltet. Erst, wenn der Trigger wieder auslöst. Und genau das ist mein Problem das ich lösen will. Wenn also um 9:00 ein Überschuss da ist, dann wird eingeschaltet (vernachlässigen wir mal die Batterie), weil zuvor abgeschaltet war. Nach 10 Minuten kommt eine dicke Wolke - du schaltest ab (ich gehe mal davon aus, ist nicht in deinem Beispiel). Die Wolke verschwindet nach 3 Minuten für den Rest des Tages und du hat Überschuss bis Sonnenuntergang. Weil aber zum Zeitpunkt, als der Überschuss begonnen hat der Schalter nicht lange genug auf “aus” war, schaltet er nicht mehr ein - trotz hellem Sonnenschein. Oder hast du da andere Erfahrungen?

So ähnlich habe ich mir das gedacht (unter 2. sollte ich die Automation beenden, weil der Schalter 5 Minuten durchgehend auf “aus” sein sollte. Diese Zeit kann ich doch vom Schalter abfragen - denke ich).

Nur in der Praxis ist mir nicht klar wie ich das handhabe, denn während des “Wartens” kann ich doch nicht auf Überproduktion prüfen. Oder?

Beim Abschalten habe ich ähnliche Verzögerungen drin. Es muss mehr als N Minuten weniger eingespeist werden als N Watt. Nur dann wird abgeschaltet.

Ebenfalls wird erst nach frühestens N Minuten wieder abgeschaltet. Außer der SOC ist unter einem definierten Wert. Soll ich dir morgen mal die Abschaltlogik schicken?

/Edit: Siehe hier: SmartGrid-Steuerung an Dimplex LI 16I-TUR

Bei 2. prüfst Du nicht auf Überproduktion sondern auf das Gegenteil. Wenn Überproduktion auf False/Off/Aus geht, dann stoppst Du den Countdown.

Viele Wege führen nach Rom. Ich habe mich gestern Abend noch hingesetzt und etwas gelesen. Im Kern ist die Berechnung der Verzögerung herausgekommen die so aussieht:

{{ [300 - ((as_timestamp(now()) - as_timestamp(states.switch.luftentfeuchter.last_changed)) | int) , 0] | max }}

Damit berechne ich die noch abzuwartenden Sekunden seit der letzten Statusänderung des Schalters des Luftentfeuchters, bis 5 Minuten (300 Sekunden) vergangen sind. Wenn >5 Minuten vergangen sind wird 0 (keine Wartezeit mehr) zurückgegeben, ansonsten eben die noch zu wartende Zeit.

Danach prüfe ich nochmals die Bedingung des Auslösers. Ist unschön, mir fällt aber nichts besseres ein um das alles in einer Automation (das erhöht aus meiner Sicht die Übersichtlichkeit, da ich eben nur EINE Automation “angreifen” muss).

Final ist der Code so:

alias: LuftentfeuchterOnOff
description: >-
  Wenn mehr 650W Netzeinspeisung, dann Luftentfeuchter einschalten. Wenn
  weniger als 100W Netzeinspeisung, dann Luftentfeuchter ausschalten
triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.power_ins_netz_watt
    above: 650
    id: genugStrom
  - trigger: numeric_state
    entity_id:
      - sensor.power_ins_netz_watt
    below: 100
    id: zuwenigStrom
conditions: []
actions:
  - delay:
      hours: 0
      minutes: 0
      seconds: >-
        {{ [300 - ((as_timestamp(now()) -
        as_timestamp(states.switch.luftentfeuchter.last_changed)) | int) , 0] |
        max }}
      milliseconds: 0
  - choose:
      - conditions:
          - condition: trigger
            id:
              - genugStrom
          - condition: state
            entity_id: switch.luftentfeuchter
            state: "off"
          - condition: numeric_state
            entity_id: sensor.power_ins_netz_watt
            above: 650
        sequence:
          - action: switch.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: switch.luftentfeuchter
      - conditions:
          - condition: trigger
            id:
              - zuwenigStrom
          - condition: state
            entity_id: switch.luftentfeuchter
            state: "on"
          - condition: numeric_state
            entity_id: sensor.power_ins_netz_watt
            below: 100
        sequence:
          - action: switch.turn_off
            metadata: {}
            data: {}
            target:
              entity_id: switch.luftentfeuchter
mode: single

Also: ich setze als Auslöser >650W Überproduktion habe (und vergebe eine entity-ID) oder eben <100W Überproduktion (und vergebe ebenfalls eine entity-ID).

Nun berechne ich (siehe oben) wie lange es dauert bis 5 Minuten vergangen sind und setze einen Wait-timer (der eben auch “0” reinkann). Diesen Wait-Timer brauche ich auf jeden Fall, da ich sowohl beim Einschalten, als auch beim Ausschalten die 5 Minuten Schaltzeit abwarten möchte.

Im Anschluss prüfe ich - je nach Entity.ID - der Auslöser immer noch “wahr” ist und schalte entsprechend (oder auch nicht). Den Status des Schalters überprüfe ich, da beispielsweise die Überproduktion von 800 auf 600 und zurück auf 800 Überproduktion wechseln kann und unter dieser Bedingung nicht abgeschaltet wird. Einen Eingeschaltenen Schalter einschalten erzeugt aus meiner Sicht nur Overhead.

Ob das mit der Wartezeit/Verzögerung von eventuell >60 Sekunden funktioniert oder ich “umrechnen” muss wird der heutige Tag zeigen.

Gruß Rallye

1 „Gefällt mir“

“Schönheit liegt im Auge des Betrachters”…
Wenn die Automation für Deine Anforderungen so funktioniert, dann ist doch alles gut. :+1:

3 „Gefällt mir“

Update: das Ding macht genau das was ich mir vorgestellt habe - funktioniert einwandfrei

Danke an Alle
Gruß Rallye

1 „Gefällt mir“