Tibber Geschirrspüler mit sicherer Ausführung

Hi Leute,

ich habe eine Automatisierung gebastelt für Tibber.
Diese wird gestartet, wenn ich einen Schalter betätige und der aktuelle Strompreis unter den täglichen Durchschnittspreis fällt. Das funktioniert auch soweit denke ich.

Nun ist es in den letzten Nächten passiert, dass der aktuelle Strompreis nicht unter unter den Strompreis fällt. Natürlich möchte ich aber früh trotzdem sauberes Geschirr haben. Aber so richtig funktioniert es nicht.

Mein Gedanke :

Der Geschirrspüler soll starten, wenn ich den Schalter aktiviere und der Strompreis unter den Durchschnittspreis fällt.

Sollte das zwischen 02.01 und 02.05 Uhr nicht passieren, dann soll der Geschirrspüler trotzdem gestartet werden. Als Bedingung dafür habe ich dann noch den Status vom Geschirrspüler drin. Dieser muss “Ready” sein.
Ich denke mein Problem liegt darin, dass ich den Schalter um 19.00 Uhr einschalte, er dann die Rutine startet und die Uhrzeit abfragt. Aber nur ein mal. Ist es halt nicht 02.02 Uhr wenn ich den Schalter betätige, wird die Automatisierung nicht gestartet.
Kann das sein?

alias: Tibber Geschirrspüler
description: Programm Auto mit Tibber Laden
trigger:
  - platform: state
    entity_id:
      - input_boolean.tibber_geschirrspuler
    to: "on"
condition:
  - condition: or
    conditions:
      - condition: numeric_state
        entity_id: sensor.electricity_price_home
        attribute: avg_price
        above: sensor.electricity_price_home
        enabled: true
      - condition: and
        conditions:
          - condition: time
            after: "02:01:00"
            before: "02:05:00"
          - condition: state
            entity_id: sensor.geschirrspuler_operation_state
            state: Ready
action:
  - type: turn_on .........

Vielen Dank für eure Hilfe.

Gruß Martin

Ich denke, du brauchst einen zweiten Trigger um 02:01
bzw.
2 Trigger:

  1. Einen, wenn der Strompreis den Durchschnitt unterschreitet

und

  1. einen, um 02:01 Uhr.

Dann jeweils mit den entsprechenden Bedingungen.
Evtl. über die IDs abfragen

Wie oft läuft bei dir die Spülmaschine am Tag?

Ansonsten würde ich ebenfall einen zweiten Trigger nutze, wie @silberfuxx vorgeschlagen hat. Als zusätzliche Bedingung könntest du folgendes abfragen

{{ (as_timestamp(state_attr('automation.tibber_geschirrspuler','last_triggered')) | int) + 43200 <= now().timestamp() | int }}

Damit fragst du ab ob die Automation das letzte mal vor 12 Stunden oder länger gelaufen sein muss, sonst startet die nicht. Die Sekunden (43200) kannst du natürlich anpassen, wenn das nicht passen sollte. Den Namen der Automation musst du ggf. auch noch anpassen.

@sirector die Überlegung hatte ich auch. Aber ich habe es so verstanden, dass der Geschirrspüler “smart” ist und ein “ready” zurückgibt, sollte er befüllt und mit Reiniger usw. vorbereitet sein.

Ihr seid echt klasse. Ich habe jetzt alles kombiniert. So schaut es jetzt aus.
Als bedingung habe ich “Tür Geschlossen” + Status Geschirrspüler darf nicht “an” sein + Zeit seit letztem Ausführung der Automation über 10h.

alias: Geschirrspüler Zeit
description: ""
trigger:
  - platform: time
    at: "02:01:00"
condition:
  - condition: state
    entity_id: input_boolean.tibber_geschirrspuler
    state: "on"
  - type: is_not_open
    condition: device
    device_id: ec9b9d7
    entity_id: d95
    domain: binary_sensor
  - condition: state
    entity_id: sensor.geschirrspuler_operation_state
    state: Ready
  - condition: not
    conditions:
      - condition: state
        state: "on"
        entity_id: switch.geschirrspuler_power
  - condition: template
    value_template: >-
      {{
      (as_timestamp(state_attr('automation.tibber_geschirrspuler','last_triggered'))
      | int) + 43200 <= now().timestamp() | int }}
action:
  - service: automation.trigger
    metadata: {}
    data:
      skip_condition: true
    target:
      entity_id: automation.tibber_geschirrspuler
mode: single

Ich hoffe das passt jetzt so.

Vielen Dank noch einmal

So wie ich das sehe, löst er so aber nur genau um 02:01 Uhr aus und startet den Geschirrspüler nur dann, wenn zu dem Zeitpunkt alle deine Bedingungen erfüllt sind und nicht, wenn der Strompreis niedrig ist.
Dafür bräuchtest du zusätzlich einen zweiten Trigger, wie du oben geschrieben hast.

Genau, ich habe noch einen zweiten Trigger der das Programm startet, wenn der Preis niedrig ist. Vielen Dank für eure Hilfe

Laut Code stehen dort noch die 12h drin.

Mit dem zweiten Trigger passt es dann. Allerdings löst es nicht aus, wenn der Preis niedrig ist, aber die 12h noch nicht rum sind.

Den Code habe ich jetzt angepasst auf 4h. Das sollte mir reichen.
Ich habe jetzt die Trigger von der Automation getrennt.
1x Trigger für den Preis und 1x Trigger über die Uhrzeit. Beides getrennt vom starten des Geschirrspülers.

Für den Preis Trigger habe ich jetzt noch einen Helfer(Schalter) erstellt, der eingeschaltet wird wenn der aktuelle Preis unter den Durchschnittspreis fällt.
Leider funktioniert die Umschaltung nicht(möchte ich auch für andere Automationen nutzen). Könntet ihr mir da noch einmal helfen?

Ich habe zwei Automationen erstellt. Ein mal zum Einschalten des Helfers und ein mal zum Ausschalten des Helfers,

Einschalten :

alias: Sensor Schalter einschalten Tibber Preis unter Durchschnitzpreis
description: Schaltet den Helfer Tibber Preis unter Durchschnittspreis ein
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.electricity_price_home
    attribute: avg_price
    above: sensor.electricity_price_home
condition: []
action:
  - service: input_boolean.turn_on
    data: {}
    target:
      entity_id: input_boolean.tibber_preis_unter_durchschnittspreis
mode: single

und ausschalten :

alias: Sensor Schalter ausschalten Tibber Preis unter Durchschnitzpreis
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.electricity_price_home
    attribute: avg_price
    below: sensor.electricity_price_home
condition: []
action:
  - service: input_boolean.turn_off
    target:
      entity_id: input_boolean.tibber_preis_unter_durchschnittspreis
    data: {}
mode: single

So sollte der Helfer je nach Preis ein bzw. ausgeschaltet werden.

Habe ich einen Denkfehler?

Vielen Dank Martin

Der Trigger löst erst aus, wenn eine der beiden Grenzen über-/unterschritten wird. Ist der Wert bereits drüber oder drunter, löst nichts aus. Warte einfach ein bisschen ab.

Das ist ja das Problem, der Preis hat die Schwelle überschritten, hat aber den Trigger nicht ausgelöst. :thinking:

War der Wert vorher drunter? Hat die Automation überhaupt ausgelöst? Das siehst du in der Übersicht der Automationen.

Nein, die Automation wurde nicht ausgelöst. :thinking:
Woran könnte das liegen? Wenn ich mir die Werte in den Zuständen anschaue, sind sie aber Plausibel. Oder kann er Kommawerte nicht vergleichen. Also z.B. 0,36 zu 0,298.

Und ist dann darüber gestiegen? Und zu dem Zeitpunkt hat nichts ausgelöst?

1 „Gefällt mir“

Er ist gestiegen. Also über den Durchschnittspreis. Die Automation hat aber auch nicht ausgelöst.

Ich habe jetzt HA mal neu gestartet und den Preis in den Entwicklerwerkzeugen manuell geändert. Und es hat funktioniert. Ich beobachte es mal, ob es alleine auch funktioniert. Vielen Dank

1 „Gefällt mir“

Ich hab was ähnliches Gebaut. Meine Spühlmaschine startet jetzt automatisch verzögert zum günstigsten Preis sobald ich diese manuell anschalte (nicht starte).
Das einzige was ich bisher nicht geschafft habe ist das manuelle auswählen an der Spühlmaschine des Porgramms, das er das übernimmt. Deswegen mache ich es wie Simon und starte immer das Auto-Programm.
Hilft dir das oder geht das nicht in die Richtung die du erreichen möchtest?
Die Spühlmaschine läuft halt in jedem Fall und immer zum günstigsten zukünftigen Preis.

Hier das auslesen des Günstigsten Preis mit Datum.

{% set aktuelles_datum = now() %}
{% set today_prices = state_attr('sensor.tibber_prices', 'today') %}
{% set tomorrow_prices = state_attr('sensor.tibber_prices', 'tomorrow') %}
{% set all_prices = today_prices + tomorrow_prices %}
{% set kleinste_total = namespace(wert=None, datum=None) %}

{% for eintrag in all_prices %}
  {% if as_timestamp(eintrag.startsAt) > aktuelles_datum.timestamp() %}
    {% if kleinste_total.wert is none or eintrag.total < kleinste_total.wert %}
      {% set kleinste_total.wert = eintrag.total %}
      {% set kleinste_total.datum = eintrag.startsAt %}
    {% endif %}
  {% endif %}
{% endfor %}
{{ (kleinste_total.datum, kleinste_total.wert) }}

Hier die Automation wie die von Simon:

alias: Küche - Spühmaschine - Günstigste Zeit
description: ""
trigger:
  - platform: state
    entity_id:
      - switch.geschirrspuler_power
    from: "off"
    to: "on"
    for:
      hours: 0
      minutes: 0
      seconds: 10
condition: []
action:
  - service: input_datetime.set_datetime
    data:
      timestamp: "{{ as_timestamp(states('sensor.niedrigster_strompreiszeitpunkt')) }}"
    target:
      entity_id: input_datetime.startzeit_spuhlmaschine
  - delay:
      hours: 0
      minutes: 0
      seconds: 10
      milliseconds: 0
  - service: home_connect.start_program
    data:
      device_id: 7e703aeb066a20fdd8865cbbff0f0ecf
      program: Dishcare.Dishwasher.Program.Auto2
      key: BSH.Common.Option.StartInRelative
      value: >-
        {{
        (as_datetime(states("input_datetime.startzeit_spuhlmaschine")).astimezone()
        -  now()).seconds | int }}
mode: single

Hi Das ist nett. Aber meine Automatisierung funktioniert jetzt super. Sie wird gestartet über den Preis oder die Zeit.

Gruß Martin

@LeFlair , würde gerne den günstigsten Strompreis zum laden einer Funksteckdose verwenden, wo trage ich den Code ein?

@Martin80 Welche Trigger hast du alle erstellt?

Ich habe das ganze als Sensor eingetragen. So funktioniert es aber leider nicht.

Fehler: Error rendering data template: ValueError: Template error: as_timestamp got invalid input ‘unknown’ when rendering template ‘{{ as_timestamp(states(‘sensor.niedrigster_strompreiszeitpunkt’)) }}’ but no default was specified

Es werden keine Preise geliefert. Mir ist es aber sowieso ein Rätsel wie ich an die zukünftigen Preise von Tibber komme. Diese werden mir bei meiner Tibber Integration nicht angezeigt. Keine Ahnung was ich falsch mache.

Ich habe in die Yaml Configuration folgendes geschrieben:

sensor:
- platform: template
sensors:
niedrigster_strompreis:
friendly_name: "Niedrigster Strompreis"
value_template: >
{% set aktuelles_datum = now() %}
{% set today_prices = state_attr( 'sensor sonnenhaus_strompreis', 'today') %}
{% set tomorrow_prices = state_attr('sensor.sonnenhaus_strompreis', 'tomorrow') %}
{% set all_prices = today_prices + tomorrow_prices %}
{% set kleinste_total = namespace(wert=None, datum=None) %}
{% for eintrag in all_prices %}
{% if as_timestamp(eintrag.startsAt) > aktuelles_datum. timestamp() %3
{% if kleinste_total.wert is none or eintrag.total < kleinste_total.wert %}
{% set kleinste_total.wert = eintrag. total %}
{% set kleinste_total datum = eintrag.startsAt %}
{% endif %}
{% endif %}
{% endfor %}
{{ kleinste_total.datum }}

Meine Automation lautet dann:

alias: Küche - Spülmaschine - Günstigste Zeit
description: ""
triggers:
  - entity_id: sensor.geschirrspuler_tur
    to: closed
    trigger: state
conditions:
  - condition: state
    entity_id: switch.geschirrspuler_einschalter
    state: "on"
actions:
  - data:
      timestamp: "{{ as_timestamp(states('sensor.niedrigster_strompreiszeitpunkt')) }}"
    target:
      entity_id: input_datetime.startzeit_spuhlmaschine
    action: input_datetime.set_datetime
  - delay:
      hours: 0
      minutes: 0
      seconds: 10
      milliseconds: 0
  - data:
      device_id: [meine ID]
      key: BSH.Common.Option.StartInRelative
      program: switch.geschirrspuler_program_intensiv70
      value: >-
        {{
        (as_datetime(states("input_datetime.startzeit_spuhlmaschine")).astimezone()
        -  now()).seconds | int }}
    action: home_connect.start_program
mode: single