"oder" und "und" Verknüpfung klappt nicht

Liebe Community, ich habe eine (dachte ich) simple Automatisierung. Leider klappt sie nicht.
Ziel: Boilerschalter einschalten, wenn
PV Leistung > 3000 W
oder
Stromtarif < 16 ct/kWh
und
Solarbatterie > 90 %.
Mein Code:

alias: "Boiler EIN bei PV > 3000 und Tarif <16 und Batterie >90% "
description: Boiler EIN bei PV > 3000 und Tarif <16 und Batterie >90%
triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.solarnet_pv_leistung
    enabled: true
    above: 3000
  - trigger: numeric_state
    entity_id:
      - sensor.epex_spot_data_net_price
    below: 16
    enabled: true
conditions:
  - condition: numeric_state
    entity_id: sensor.byd_battery_box_premium_hv_ladezustand
    above: 89.5
    enabled: true
actions:
  - action: switch.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: switch.warmwasser_boiler_schalter
mode: single

Leider ist das Ergebnis IMMER „on“, auch wenn die aktuellen Werte z.B: PV = 1000 W und/oder Tarif 30 ct und Batterie = 30 % sind
oder ich die Sollwerte auf <> IST hinauf- resp. hinunter setze.
Was ist da falsch ?

PV > 3000 oder Tarif < 16 bedeutet aber, dass die Trigger erst auslösen, wenn die Werte der PV von <3000 auf >3000 kommen oder der Tarif von >16 auf <16 fällt.
Wenn die Werte schon >3000 oder <16 sind, muss erst die Schwelle wieder „durchbrochen“ werden.

War die PV denn zwischenzeitlich schon mal wieder <3000 oder der Tarif >16 ?

1 „Gefällt mir“

nunja, ich habe probeweise die Werte verändert. Z.B: PV auf Soll 6000 geändert (derzeit sind es aktuell aber nur 5000W), gespeichert und aktualisert, aber Zuszand blieb ON

Wie schon geschrieben, die Trigger sind Schwellenwert-Auslöser. Es muss die Schwelle erst über-/unterschritten werden und anschließend bei wieder Erhöhung/Verringerung wird ausgelöst.

Schalte den Switch aus und warte dann ab, ob bei Über-/Unterschreitung richtig ausgeführt wird.

1 „Gefällt mir“

hmm, das verstehe ich nicht. Du hast in deiner Automation doch gar kein turn_off bestimmt. Dann ist doch klar, dass der Switch an bleibt.

ich dachte, wenn eine der Bedingungen nicht (mehr) zutrifft, dann schaltet die Automation ohnehin auf OFF. Da liege ich wohl falsch. Muss ich daher eine 2. Automation erstellen, die den OFF Zustand definiert? Also wenn
PV < 3000 W
UND (als Condition)
Tarif > 16 ct
UND
Batterie < 50 %
dann Schalter auf OFF
?

alias: Boiler AUS bei PV < 3000 und Tarif >16 und Akku < 50
description: ""
triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.solarnet_pv_leistung
    below: 2999.9
conditions:
  - condition: numeric_state
    entity_id: sensor.epex_spot_data_net_price
    above: 16
  - condition: numeric_state
    entity_id: sensor.byd_battery_box_premium_hv_ladezustand
    below: 50
actions:
  - action: switch.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: switch.warmwasser_boiler_schalter
mode: single

oder geht das einfacher?

Muss jetzt leider für 2 Stunden weg. Danke für die INfos bisher… melde mich wieder.

Einfacher nicht aber in einer Automation. Dann musst du allerdings den Triggern jeweils eine ID geben und in den Aktionen dann die Bedingungen abfragen.

1 „Gefällt mir“

hmm, da muss ich mich erst einlesen, bin noch newbie. Danke jedenfalls für die Tipps.

alias: "Boiler EIN bei PV > 3000 und Tarif <16 und Batterie >90%"
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.solarnet_pv_leistung
    id: Leistung
  - trigger: state
    entity_id:
      - sensor.epex_spot_data_net_price
    id: Preis
conditions: []
actions:
  - if:
      - condition: and
        conditions:
          - condition: numeric_state
            entity_id: sensor.byd_battery_box_premium_hv_ladezustand
            above: 89.5
          - condition: or
            conditions:
              - condition: template
                value_template: >
                  {{ trigger.id == "Leistung" and trigger.to_state.state | float
                  > 3000 }}
              - condition: template
                value_template: >
                  {{ trigger.id == "Preis" and trigger.to_state.state | float <
                  16 }}
    then:
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          entity_id: switch.warmwasser_boiler_schalter
    else:
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          entity_id: switch.warmwasser_boiler_schalter
mode: single

Hier ist eine Version, wo bei jeder Wertänderung deiner Trigger reagiert wird und dann direkt geprüft wird ob diese Bedingung zutrifft. Und je nachdem ob diese Zuftriff oder nicht wird er Schalter ein bzw. ausgeschaltet.

Probiere es gern mal aus und lass mich wissen ob es so für dich funktioniert oder nicht.

1 „Gefällt mir“

Hi UncleSam, vielen Dank. Bin seit gestern leider auf Seminar, kann erst morgen testen. Code schaut sehr verständlich aus. Melde mich auf jeden Fall wieder. Schönen Samstag.

Funktioniert prima UncleSam. Danke.
Als Steigerung möchte ich nun nicht einen fixen Mindest-Tarif eingeben, sondern ein Zeitfenster von 1 Stunde mit dem „lowest price per day“ automatisch abfragen und als SOLL Vorgabe verwenden. Den lowest price habe ich schon ( sensor.epex_spot_data_lowest_price), nur bei der Eingabe des Zeitfensters stehe ich an. Kannst du mir bitte auch dabei helfen?

Mit dem Zeitfenster verstehe ich gerade nicht 100%ig. Soll für jede Stunde der geringste Preis ermittelt werden, oder was ist genau dein Ziel?

ahja, kompliziert gedacht und geschrieben, sorry.
Also ich möchte einfach in der Zeit den Boiler einschalten, in dem der Tagestarif am günstigsten ist. (Zusätzlich zu den anderen Bedingungen)

Eigentlich müsste ich hier ja nur statt der Vorgabe von 16 ct/kWh den „sensor.epex_spot_data_lowest_price“ nehmen:

value_template: >
                  {{ trigger.id == "Preis" and trigger.to_state.state | float = 
                  'sensor.epex_spot_data_lowest_price'}}

aber das funktioniert nicht.

Ah, ok. jetzt verstehe ich es. Also ganz einfach du willst immer den günstigsten Preis statt der ursprünglichen 16 ct/kWh nehmen.

Damit kann ich arbeiten, sollte somit nicht allzu schwer sein.

geeenau :grinning:

Ok, damit ich das ganze optimal umsetzen kann. Bräuchte ich dann doch noch einige Informationen, da ich nicht mit deinem System arbeite.

Diese 2 Sensoren sind mir bekannt aus deinem System:

  1. sensor.epex_spot_data_net_price - Zeigt den Preis an der jetzt gerade gültig ist an
  2. sensor.epex_spot_data_lowest_price - Zeit dieser Sensor den günstigesten Preis für den Tag bzw. einen bestimmten Zeitraum an?

Zumindest verstehe ich deine beiden Sensoren so.

Sollte das so sein, müsste man meiner Meinung einen Vergleich dieser beiden Sensoren durchführen und sobald der aktuelle Preis = der günstigste Preis ist dann den Boiler einschalten.

Im Prinzip ja, aber…
der sensor.epex_spot_data_net_price inkludiert die Aufschläge (Netzkosten, MwSt, …), während der …lowest_price nur den Nettobetrag aufweist. D.h. entweder den Nettobetrag hochrechnen ((Netto*1,03)+1,5)*1,2)) = (3% Aufschlag + 1,5 ct/kWh Fixgebühr + 20% MwSt)
oder den … data_net_price zum Vergleichen entsprechend reduzieren.
Aber sonst hast du vollkommen recht.

Ich gebe keine Garantie ab, aber versuch mal das hier:

alias: Boiler EIN bei PV > 3000 und Tarif <16 und Batterie >90%
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.solarnet_pv_leistung
    id: Leistung
  - trigger: state
    entity_id:
      - sensor.epex_spot_data_net_price
    id: Preis
conditions: []
actions:
  - if:
      - condition: and
        conditions:
          - condition: numeric_state
            entity_id: sensor.byd_battery_box_premium_hv_ladezustand
            above: 89.5
          - condition: or
            conditions:
              - condition: template
                value_template: >
                  {{ trigger.id == "Leistung" and trigger.to_state.state | float
                  > 3000 }}
              - condition: template
                value_template: |-
                  {{ trigger.id == "Preis" and 
                     ((states('sensor.epex_spot_data_lowest_price') | float * 1.03 + 1.5) * 1.2) 
                     == (states('sensor.epex_spot_data_net_price') | float) }}
    then:
      - action: switch.turn_on
        metadata: {}
        data: {}
        target:
          entity_id: switch.warmwasser_boiler_schalter
    else:
      - action: switch.turn_off
        metadata: {}
        data: {}
        target:
          entity_id: switch.warmwasser_boiler_schalter
mode: single
1 „Gefällt mir“

schaut sehr gut aus. Ich werde das morgen beobachten, da heute der Tiefstpreis ja schon vorbei ist.
Vielen Dank UncleSam!

hat leider nicht geklappt. Es gab zwar keine Fehlermeldung, aber der Boiler wurde nicht eingeschaltet.
Aber jetzt werde ich noch herausfordernder - wenn das mit dem billigsten Tarif klappt:
mit der 1 Stunde (wenn keine PV Leistung vorhanden) erreicht der Boiler leider nicht seine max Temperatur. D.h. ich brauche doch eine Art Zeitfenster der günstigsten Stunden. Solange z.B.
11:00 5 ct/kWh
12:00 6 ct/kWh
13:00 7 ct/kWh
könnte man das vielleicht über einen „wait“ Kommand machen. "schalte um 11:00 ein, warte 2 Stunden - schalte wieder aus.
aber wenn z.B
11:00 5 ct/kWh
12:00 4 ct/kWh
13:00 6 ct/kWh
müsste der Boiler bereits 1 Stunde VOR dem Tiefstpreis einschalten. Wie geht denn sowas???