Variable Zeiten in Skripten

Dieter G

New member
Hallo,

ich habe mal wieder Probleme mit der Syntax im YAML von Skripten. Ich möchte in dem nachfolgenden Skript die hours/minutes und seconds durch einen Sensorwert ersetzen.

Code:
licht_fd_wechsel:
  alias: Licht FD Wechsel
  sequence:
  - repeat:
      while:
      - condition: state
        entity_id: input_boolean.ferien
        state: 'on'
      sequence:
      - parallel:
        - if:
          - condition: state
            entity_id: light.technik
            state: 'on'
            for:
              hours: 0
              minutes: 03
              seconds: 59
          then:
          - service: light.turn_off
            data: {}
            target:
              entity_id: light.technik
        - if:
          - condition: state
            entity_id: light.technik
            state: 'off'
            for:
              hours: 0
              minutes: 59
              seconds: 59
          then:
          - service: light.turn_on
            data: {}
            target:
              entity_id: light.technik
  mode: restart

Der template-Ansatz {{ states('sensor.licht_fd_muster_1') | float % 60 }} z.B. für die Minuten funktioniert zwar im template-Test der Entwicklerwerkzeuge wird aber im Skript immer wieder als fehlerhaft verworfen.

Fehlermeldung:
Error loading /config/configuration.yaml: invalid key: "OrderedDict([("states('sensor.licht_fd_muster_1') | float % 60", None)])" in "/config/scripts.yaml", line 289, column 0

Hat irgendjemand eine Idee, wie man das hinbiegen kann?

Gruß Dieter
 

blurrrr

Well-known member
Error loading /config/configuration.yaml: invalid key: "OrderedDict([("states('sensor.licht_fd_muster_1') | float % 60", None)])" in "/config/scripts.yaml", line 289, column 0
Muss da evtl. noch etwas hinten dran? Anscheinend wird ja vom System noch ein "None" ergänzt mit dem Vermerk "invalid Key". Kann jetzt aber auch völlig daneben sein, ist nur so eine Idee :)
 

Nival

-
Moderator
Hat irgendjemand eine Idee, wie man das hinbiegen kann?
Die Verwendung von value_template ist an der Stelle afaik nicht möglich.

Mögliche Alternative die mir einfällt wäre ein Sensor in der configuration.yaml, den Du an der Stelle abfragen kannst, Beispielcode:
YAML:
  - platform: template
    sensors:
      light_helper_on:
        value_template: >-
          {{ is_state('input_boolean.i_am_home', 'off') and (now() - states.input_boolean.i_am_home.last_changed).total_seconds() > states('sensor.test_int') | float }}
In diesem Fall "Bin ich nicht daheim und hat sich der Status von diesem Zustand schon mehr Sekunden nicht geändert als der Sensor test_int anzeigt" - müsstest Dir das eben auf Deine Bedingungen umschreiben und an Stelle von meinem sensor.test_int Deine Berechnung eintragen.

Im Skript würdest Du das dann mittels
YAML:
condition: state
entity_id: sensor.light_helper_on
state: 'True'
abgreifen können.
 

Dieter G

New member
Und genau da bin ich auch hängen geblieben. Egal welche Doku man sich ansieht, die Funktion states('........') kennt keinen zweiten Parameter. Wenn ich ja wenigstens ansatzweise einen Hinweis finden würde.
Ich habe die Vermutung, dass ich an dieser Stelle nur mit festen Zahlen arbeiten darf/kann.
Eigentlich will ich nur ein Muster erzeugen, dass bei Abwesenheit eine Lampe zwischen 45sek und 3min eine Lampe angeschaltet ist und zwischen 15 und 60min ausgeschaltet ist. Später sollte dieses Muster dann nur Abends auf die Lampe geschaltet werden.
 

Dieter G

New member
@Nival
Sorry mein Kommentar bezog sich auf die Rückmeldung von blurrrr.
Bin erst Morgen wieder zurück und werde versuchen deinen Ansatz umzusetzen.
 

Dieter G

New member
Die Verwendung von value_template ist an der Stelle afaik nicht möglich.

Mögliche Alternative die mir einfällt wäre ein Sensor in der configuration.yaml, den Du an der Stelle abfragen kannst, Beispielcode:
YAML:
  - platform: template
    sensors:
      light_helper_on:
        value_template: >-
          {{ is_state('input_boolean.i_am_home', 'off') and (now() - states.input_boolean.i_am_home.last_changed).total_seconds() > states('sensor.test_int') | float }}
In diesem Fall "Bin ich nicht daheim und hat sich der Status von diesem Zustand schon mehr Sekunden nicht geändert als der Sensor test_int anzeigt" - müsstest Dir das eben auf Deine Bedingungen umschreiben und an Stelle von meinem sensor.test_int Deine Berechnung eintragen.

Im Skript würdest Du das dann mittels
YAML:
condition: state
entity_id: sensor.light_helper_on
state: 'True'
abgreifen können.
Sorry für die späte Rückmeldung. Bin leider nicht früher dazu gekommen deinen Ansatz umzusetzen. Habe je einen Sensor, allerdings als binary_sensor, für on und off erstellt und kann jetzt den 0 ->1-Wechsel als Trigger-Bedingung in je einer Automation nutzen um die Lampe ein- bzw. auszuschalten. Genau das was ich erreichen wollte. Nochmals Danke für den Ansatz.

Was ich noch machen muss ist die Umspeicherung der Random-Zahlen (Zeitdauer für Ein- und Aus) in einen Helfer damit die Zeitdauer gegen die mit '>' geprüft wird, sich nicht fortwährend in der Ein- oder Ausperiode ändert.
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
968
Beiträge
14.038
Mitglieder
499
Neuestes Mitglied
John58
Oben