Node Red Flow zu berechneter Zeit starten

Hi,

folgendes Szenario: Ich würde gerne abhängig von einigen Faktoren die Schließzeit meiner Rollläden berechnen, diese Zeit im Dashboard anzeigen können und, basierend auf dem Eintreten der jeweiligen Schließzeit, einen Node Red Flow triggern, der dann Aktionen startet, wie z.B. ausgewählte Rollläden zu schließen und ggf. noch mehr Schabernack.

Hierzu habe ich mir erst einmal ein paar Helferlein angelegt - was voraussichtlich Overkill ist und mit Sicherheit eleganter geht. Seht mir auch die einzelnen Funktionsaufrufe nach, komprimieren ließe sich der Code sicherlich, wenn es erst einmal funktioniert.

Helfer 1: Die Schließzeit in einem Sensor Template ermitteln. Das ist noch nicht wahnsinnig kompliziert, soll aber dynamischer werden, wenn das Konzept erst einmal steht:

{% set nextSetting = as_timestamp(state_attr('sun.sun', 'next_setting')) %}

{% if is_state('binary_sensor.sommerzeit', 'off') -%}
  {% set closeTimeStamp = nextSetting + 1800 %}
{%- else -%}
  {% set closeTimeStamp = nextSetting + 0000 %}
{%- endif %}

{% set closeTime = as_datetime(closeTimeStamp) %}
{% set closeTime = closeTime.replace(second = 0, microsecond = 0) %}

{{ as_local(closeTime) }}

Helfer 2: Einfache Konvertierung der Zeit in einen String für das Dashboard

{{ as_timestamp(states('sensor.rolladenschliesszeit')) | timestamp_custom('%d. %b \'%y %H:%M') }}

Helfer 3: Das soll der eigentliche Trigger (State Flip auf on/true) sein für Node Red, aber ich fürchte, ich habe hier eine Race Condition, das, je nachdem, wann das Template evaluiert wurde, Helfer 1 bereits auf den morgigen Tag geflippt ist, weil die “sun.sun[next_setting]” bereits einen neuen Wert bekommen hat und damit die Schließzeit (Helfer 1) neu ermittelt wurde. Demnach greift das Helfer 3 Template ins Leere, wenn es erst ein Mü später evaluiert wird, weil es schon das morgige Datum findet. Ich könnte natürlich eine Unschärfe reinbringen und das Datum ignorieren und nur die Uhrzeit prüfen im Template. Die paar Sekunden Unterschied pro Tag sollen es nicht ausmachen. Aber ich mag es nicht heuristisch :slight_smile:

{% set timeNow = now().replace(second = 0, microsecond = 0) %}
{% set closeTime = as_local(as_datetime(states('sensor.rolladenschliesszeit'))).replace(second = 0, microsecond = 0) %}

{{ closeTime == timeNow }}

Unabhängig von meiner Präferenz, die tatsächlichen Aktionen eher in Node Red zu “malen”, als direkt in Home Assistant YAML/JSON zu schreiben: Was wäre der bessere und deterministische Weg, basierend auf meiner ermittelten Schließzeit, das in Home Assistant zu handhaben? Zeitplan scheint nicht dynamisch ermittelt bzw. an Helfer gebunden werden zu können, was schade ist.

Danke für Euren Input.

Kai

PS: Ja, ich hatte die Suche bemüht, da das Thema sicherlich zigfach abgehandelt wurde, ich habe aber partout nichts gefunden.

Viel Text aber ich verstehe nicht wirklich was du willst.

Ansatz: In Home Assistant kannst du dir einen Helfer “input_datetime” erzeugen und Uhrzeit setzen. Den du aus der Gui anlegen kannst.

Wenn du schon Node-Red nutzt warum machst du dann in Home Assistant mit Template und Jinja rum? Die Home Asstant Entitäten mit Events und Statusänderungen hast du doch alle in Node-Red. Mach doch dann die ganze Logik dort. Und nicht hier ein bischen und dann was anderes dort.

Wenn du eine Aktion zu einer gewissen Zeit planen willst kannst du das mit Cron-Plus machen. Dafür einfach payload der Anleitung entsprechend versorgen. Der Zeitplan bleibt auch nach einem möglichen Restart bestehen. node-red-contrib-cron-plus (node) - Node-RED

1 „Gefällt mir“

Ich verwende bei Node-RED Chronos.

Sehr Mächtig wenn es um Zeitsteuerung bei Node-RED geht.

Danke für Eure Antworten! Chronos kannte ich noch nicht und gucke ich mir mal an.

Aber ich habe mich dem Anschein nach nicht klar (genug) ausgedrückt.

  • Ich würde die Zeit für die Aktion Schließen gerne zentral ermitteln, um dann entscheiden zu können, wo und wie ich sie verwende, also an mehreren Punkten in Home Assistant oder sogar in Node Red

Einfacher Fall derzeit ist:

  • Einmal soll diese Zeit im Dashboard angezeigt werden
  • Einmal soll sie als Trigger für eine Aktion verwendet werden

Ja, ich verwende Node Red, aber das ist relativ irrelevant für mein Problem - meine ich jedenfalls.

Zuvor habe ich als Auslöser für meine Aktionen auch CronPlus verwendet, aber da ich die Schließzeit gerne auch im Dashboard anzeigen lassen würde, muss ich diese ja außerhalb NodeRed / CronPlus ermitteln, bzw. ich will die Regeln / Offsets nicht zum einen in CronPlus und zum anderen außerhalb für das Dashboard errechnen. D.h. einmal in CronPlus und dann nochmal als helper oder Jinja nachbauen für das Dashboard.

Also war meine Idee, einen Helper zu bauen, der die Zeit ermittelt (Helper 1 oben). Der zweite Helper formatiert mir die Zeit. Der dritte Helper sollte als Trigger für die Aktion fungieren. Und da habe ich, denke ich, die Race Condition und bin mir nicht sicher, wie ich die elegant in Home Assistant vermeiden / auflösen soll.

Ich hoffe, das erklärt meine Frage besser.

Danke Euch

Kai

Mit

Kannst du einen formatierten Zeitstempel in einen HA Helper schreiben und dann im Dashboard ausgeben.

Node RED kann auf HA Trigger reagieren. Aber das wirst du ja wissen.

Ob nun HA oder Node RED triggert sollte egal sein. Hauptsache nur einer von Beiden.