Parameterübergabe an Skript zur Steuerung von Avatto Thermostaten

Hallo zusammen!

Ich möchte zu bestimmten Gelegenheiten (Heizung aus, Urlaub, …) meine Avatto-Thermostate umprogrammieren. Für jeden Tag der Woche kann man diesen einen “Schedule” mit jeweils 6 Schaltpunkten eintragen. Da wir als Rentner keinen Unterschied zwischen Werktagen und Wochenende machen müssen, kann/muss der selbe Schedule für alle 7 Tage der Woche angegeben werden.

Beispiel: “07:30/21.0 08:00/21.0 12:00/21.0 14:00/21.0 18:00/21.0 22:00/16.0”

Da ich nun keine Lust habe, diesen (nicht besonders gut lesbaren) String sieben mal eintragen zu müssen (und das für jeden der Thermostate ggfs. unterschiedlich), wollte ich ein Skript mit Parametern dafür verwenden, was mir bis jetzt nicht geglückt ist.

Zum Testen habe ich mir das folgende Skript erstellt:

alias: Test - Schreibe Wert an Thermostat
sequence:
  - device_id: ac827200d3fd1505d87923a99c74603e
    domain: text
    entity_id: 4c369b697670579aed7144144973304c
    type: set_value
    value: 07:30/21.0 08:00/21.0 12:00/21.0 14:00/21.0 18:00/21.0 22:00/16.0
  - action: persistent_notification.create
    metadata: {}
    data:
      message: "{{schedule}}"
description: ""
fields:
  schedule:
    selector:
      text: null
    name: schedule
    required: true

Hier kann man sehen, wie ich der “action” (notification) den Parameter “schedule” übergebe, der dann auch bei Ausführung korrekt angezeigt wird. Wie ich den Parameter an das erste Element der “sequence” (“device_id”) übergeben soll, weiß ich (noch) nicht.

Aufgerufen wird das Skript aus folgender Automation:

alias: "Test: Reaktion auf Testschalter"
description: >-
  Bei jedem Anklicken des Buttons wird das u.a. Skript mit dem einen Parmeter
  'schedule' aufgerufen
triggers:
  - trigger: state
    entity_id:
      - input_boolean.testschalter
conditions: []
actions:
  - action: script.test_schreibe_wert_an_thermostat
    metadata: {}
    data:
      schedule: 07:30/21.0 08:00/21.0 12:00/21.0 14:00/21.0 18:00/21.0 22:00/16.0
mode: single

Versuche ich, im Skript bei der ersten Aktion (“device_id”) ebenfalls den Parameter einzusetzen, erhalte ich die Fehlermeldung “Message malformed: extra keys not allowed @ data[‘data’]”.

Kann jemand erkennen, was ich da falsch mache und mich auf den rechten Weg schubsen? Mir ist aufgefallen, dass die meisten Tutorials im Zusamenhang mit Parametern diese an eine “action” übergeben, während in o.a. Beispiel ein “device_id” in der Sequenz vorkommt.

Abschließend noch das Skript im visuellen Editor:

Eigentlich sieht alles gut aus, aber ich habe die gleiche Fehlermeldung auch schon bekommen.
Editierst Du Deine Skripte/Automationen zufällig im Browser? Ich habe festgestellt, dass es dort bei z.B. Cut & Paste manchmal offensichtlich zu Fehlern kommt. Versuche mal die “fehlerhafte” Stelle im Skript in der App mit allen Blanks einzutippen.
Keine Ahnung ob es bei mir am Safari liegt oder auch in anderen Browsern auftritt. Vielleicht hat da ja jemand aus der Community entsprechende Erfahrungen.

1 „Gefällt mir“

Wahrscheinlich habe ich mich bei dem Beispiel unklar ausgedrückt: So, wie die YAML-Datei des Skripts aussieht, funktioniert es ja auch. Die Variante, die zu o.a. Fehler führt, sieht so aus:

alias: Test - Schreibe Wert an Thermostat
sequence:
  - device_id: ac827200d3fd1505d87923a99c74603e
    domain: text
    entity_id: 4c369b697670579aed7144144973304c
    type: set_value
    metadata: {}
    data:
      value: "{{schedule}}"
  - action: persistent_notification.create
    metadata: {}
    data:
      message: "{{schedule}}"
description: ""
fields:
  schedule:
    selector:
      text: null
    name: schedule
    required: true

Ich habe einfach das “Beispiel” aus dem “action”-Element in das “device_id”-Element analog übertragen.

Das ‘sequence’-Element “action” akzeptiert “data”, während das Element “device_id” dies offenbar nicht tut.

Ich gebe zu, von YAML nicht sehr viel zu verstehen. Insbesondere weiß ich auch nicht, wo ich Hinweise auf die zulässige Syntax finde. In XML kann man in den Schema-Files nachsehen. Gibt es so etwas auch für YAML? Oder wie - falls es überhaupt funktioniert - muss die o.a. Datei syntaktisch aussehen? Ich bin nicht unbedingt verzweifelt, aber als alter Programmierer denke ich, dass es doch eine Lösung geben muss. Oder liege ich da falsch?

Also zum Templating findest Du hier eine gute Doku:

https://www.home-assistant.io/docs/configuration/templating/

Was mir sehr merkwürdig vorkommt ist die entity_id. Hat Dein Thermostat tatsächlich eine textbasierte Entity (domain) für den Zeitplan? Ich würde eine climate Entität erwarten, die dann als Attribute eine Zeitplan hat.

1 „Gefällt mir“

So sehen die Eigenschaften des Zeitplans für Montag aus.

Und so sehen die Eigenschaften des Thermostats aus.

Wenn ich den String “07:30/21.0 08:00/21.0 …” explizit in meinem Skript eintrage, lässt sich der Zeitplan damit ja auch ändern. Meine Idee war lediglich, ihn nur ein einziges Mal als Parameter zu definieren, und ihn dann auf alle 7 Tage der Woche zu verteilen. Und im (Winter-)Urlaub einen anderen Zeitplan an das Skript zu übergeben.

OK, wenn es mit einem String geht, sollte es auch mit einem Template gehen.
Dann versuche anstatt
value: “{{schedule}}”
mal

value: >
  {{ schedule }} 

einzutippen. Wie gesagt, bei mir hat es nur in der HA App, nicht im Browser funktioniert. Eine Erklärung dafür habe ich bisher nicht gefunden.

1 „Gefällt mir“

Dein Code-Vorschlag ist syntaktisch korrekt, das Skript lässt sich damit speichern und ausführen.

ABER…

Als ich die Geräte zunächst in Betrieb genommen habe, ließen sie sich nicht ansteuern. Es kam regelmäßig die Fehlermeldung

error z2m: Publish ‘set’ ‘schedule_monday’ to ‘Thermostat Flur EG’ failed: ‘Error: Invalid schedule: there should be 4 transitions’`

Nach einigem Forschen fand ich raus, dass ich eine Art Ersatz-Treiber (meine Bezecihnung) installieren musste, in der 6 Transitions akzeptiert werden (siehe GitHub - sychu/avatto_me167_TZE200_p3dbf6qs: This is (hopefully) fix for thermostatic valve AVATTO).

Der Zugriff auf die avatto_me167.js Datei erlaubt mir nun anzuzeigen, an welchem String/Schedule er sich stört. Und siehe da, die Fehlermeldung lautet nun:

error z2m: Publish ‘set’ ‘schedule_monday’ to ‘Thermostat Flur EG’ failed: 'Error: Invalid schedule: there should be 6 transitions {{ schedule }} '`

Da wird also kein Template ausgewertet, anstatt des Schedules kommt nur der String “{{ schedule }}” an. Nebenbei: falls ich mich bei der Anzahl der Transitions vertue, kommt es ebenfalls zu einer (erwarteten) Fehlermeldung wie folgt:

error z2m: Publish ‘set’ ‘schedule_monday’ to ‘Thermostat Flur EG’ failed: ‘Error: Invalid schedule: there should be 6 transitions 07:30/21.0 08:00/21.0 12:00/21.0 14:00/21.0 18:00/21.0’`

Für’s erste gebe ich hier auf. Demnächst will ich Versuche mit der Parameterübergabe an andere Zigbee-Geräte machen. Mal sehen, was daraus wird.

Danke jedenfalls für für deine Hinweise!

Es gibt noch eine Alternative. Definiere in dem Skript eine Variable und setze die mit dem “{{ schedule }}” Wert. Diese Variable kannst Du dann zum Aufruf nutzen.

1 „Gefällt mir“

Daher für den Tipp! Ich werde es morgen mal ausprobieren.

Update:
Heureka! Ich hab’s! Beim Durchforsten der möglichen Aktionen bin ich auf text.set_value gestoßen, mit der mir der Durchbruch gelungen ist. Das Skript sieht nun so aus:

sequence:
  - action: text.set_value
    metadata: {}
    data:
      value: "{{schedule}}"
    target:
      entity_id: text.thermostat_flur_eg_schedule_monday
fields:
  schedule:
    selector:
      text: null
    name: schedule
    required: true

Die Tiefen von Home Assistant sind schier endlos, doch “Geht nicht!” gibt’s nicht.

Danke für die Unterstützung, die mich zum hartnäckigen Dranbleiben motiviert hat.

Letzte Frage: Muss ich jetzt noch irgendwo so was wie [Gelöst] eintragen?

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

1 „Gefällt mir“

Sehr schön, aber doch merkwürdig, dass es vorher schon mit set_value als Action und einem String als value funktioniert hat.