NodeRED: zyklische Fenster-Offen-Meldung

Ein offenes Fenster kann Dich über einen Messenger daran erinnern, dass es wieder geschlossen werden möchte. Eine mögliche Lösung mit NodeRED und dem Messenger Telegram möchte ich Dir in dieser Anleitung zeigen. Folgende Hauptpunkte werden dabei umgesetzt:

  • Der Eingangsparameter “Fensterstatus” (offen/geschlossen) dient als Auslöser.
  • Nach 10 Minuten erfolgt die erste Meldung “Fenster X ist noch offen.“.
  • Nach jeweils weiteren 10 Minuten wird die Meldung “Fenster X ist immer noch offen.” ausgegeben.
  • Wird das Fenster geschlossen, so erhältst Du die Meldung “Fenster X wurde geschlossen.“.
  • Jede Meldung löscht dabei die zuvor ausgebene Meldung, so dass der Chatverlauf nur die letzte Meldung für das Fenster enthält.

Eine erweiterte Version findest du im Beitrag “alternative zyklische Fenster-Offen-Meldung“.

Voraussetzungen

Komponenten

Bis Du eine Meldung in Deinem Messenger siehst, sind grob folgende Schritte notwendig:

  1. Konfiguration der Daten der Nachrichtenerstellung und des Telegram-Bots: hier teiltst Du mit, wie die Unterschiede der Meldungstypen aussehen und an wen die Nachricht gehen soll.
  2. Erstellung der Nachricht: diese Komponente erzeugt den Nachrichteninhalt, welcher in Deinem Messenger sichtbar ist.
  3. Versand der Nachricht: der Teil ist dafür zuständig, die Telegram-Nodes anzusprechen.
  4. Speichern der NachrichtenID: optional kann die NachrichtenID gespeichert werden. Das wird bei der zykl. Meldung dazu benutzt, die vorhergehende Nachricht zu löschen, damit der Chatverlauf nicht “zugespammt” wird.

Konfiguration der Daten

Die Konfiguration kannst Du bequem in einem Change-Node erledigen. Der Flow benötigt folgende Parameter:

  • msg.topic: Das ist eine eindeutige Raumbezeichnung, welche zum Speichern der Anzahl der erfolgten Meldungen und der letzten NachrichtenID sowie zur Ausgabe der Meldung benutzt wird.
  • msg.type: Zur Unterscheidung zwischen Türen und Fenstern kannst Du hier eine Zeichenkette vorgeben, die in der Meldung erscheint.
  • msg.chatId: das ist die ID, an die die Nachricht geschickt wird. Gruppen enthalten ein vorangestelltes Minus-Zeichen.

Erstellen des Nachrichtentexts

Der Text, die im Messenger erscheinen soll, wird abhängig von den Eingangsparameter erstellt. Dabei wird die Markdown-Syntax für die Formatierungen Fett und Kursiv benutzt.

  1. Im ersten Function-Node wird ein Eintrag im globalen Kontext angelegt. Dieser enthält mindestens den Zähler (count), den Type (Fenster/Tür) und den Status (offen/geschlossen). Der Zähler wird beim Fensteröffnen zurück gesetzt.
  2. Der Trigger-Node hält die NodeRED-Nachricht für 10min zurück. Hier kannst Du auch einstellen, in welchem Zeitabstand du die Meldung im Messenger erhalten möchtest.
  3. Nach Ablauf der Zeit im Trigger-Node wird im angeschlossenen Function-Node der Text erstellt. Hier wird auch die Zählvariable erhöht.
  4. Im Anschluß wird noch die NachrichtenID der letzten Messenger-Nachricht in das NodeRED-Nachrichten-Objekt geschrieben, damit diese gelöscht werden kann.
  5. Wird das Fenster geschlossen, so wird der Trigger-Node gestoppt und der Text “Fenster X wurde geschlossen.” erstellt. Gibt es jedoch keine vorhergehende Offen-Meldung, so wird die Text-Erstellung abgebrochen und auch nichts versendet.
  6. Der letzte Function-Node holt und setzt noch die die letzte NachrichtenID zum Löschen der vorhergehenden Nachricht.

Versand

Der Subflow für den Versand löscht zuerst die letzte Nachricht und versendet die neue. Es gibt zwar auch die Möglichkeit, die letzte Nachricht zu modifizieren, jedoch hat das mehrere Nachteile:

  • die neue Nachricht muss unterschiedlich zur alten Nachricht sein
  • der Zeitstempel der Nachricht ändert sich nicht
  • die Historie, also die Abfolge der Nachrichten ändert sich nicht, so dass gegebenenfalls neuere Ereignisse weiter hinten stehen

NodeRED-Flow

Im nachfolgenden Flow musst Du nach dem Einfügen noch folgende Einstellungen durchführen:

  1. Deine ChatId im Switch-Node “Chatdaten festlegen” eintragen.


  2. Deinen ChatBot in den beiden Telegram-Nodes konfigurieren.

Den aktuellen Flow kannst Du dir von meiner github-Seite herunterladen.

Erweiterungen

Diese Meldung habe ich bei mir noch mit der Ausgabe des Counters, also wie oft wurde sie schon ausgegeben, und der aktuellen Außentemperatur ergänzt. Weiterhin wird ab einer Außentemperatur X nur noch zur vollen Stunde eine Sammel-Meldung über alle geöffneten Fenster ausgegeben, damit man bei warmem Wetter länger lüften kann.

Fazit

Ich hoffe, diese Anleitung inspiriert Dich, Deine Fenster-Offen-Meldung zu erstellen. Falls Du Verbesserungsvorschläge hast, teile sie mir bitte gern in den Kommentaren oder per PN mit.

Updates

  • 10.05.2021: Hinweis auf die erweiterte Version
  • 09.03.2021: Anpassung des Subflows für die Nachrichtenerstellung – mehrere Fenster im selben Raum nutzten fälschlicherweise das selbe Kontextobjekt
  • 19.03.2021: Ersetzung des Flows mit dem github-Link

André

War dieser Artikel nützlich für Dich? Dann hinterlasse gern eine Bewertung. So erkenne ich, welche Informationen hilfreich sind und investiere weiter in diese Richtung. Vielleicht habe ich auch bereits eine neuere Version und muss sie nur in den Artikel einarbeiten. Hast Du Meinungen, Hinweise oder Fragen? Dann hinterlasse einen Kommentar, kontaktiere mich per E-Mail an oder schreibe in die Telegram-Diskussionsgruppe https://t.me/joinchat/4v43ZhqxG2sxOTMy.

Alle Beiträge ansehen von André →

2 Gedanken zu “NodeRED: zyklische Fenster-Offen-Meldung

    1. Hallo Lukas,

      herzlich willkommen als erster Kommentator 🙂
      Was genau funktioniert nicht? Bereits ein Subflow?

      VG

      edit
      Ich habe den Flow bei mir noch mal probiert. Es müssen nach dem Import noch folgende Dinge angepasst werden:
      -die Ziel-Chat-ID in im Node “Chatdaten festlegen” eintragen, d.h. deine TG-Nummer
      -im Subflow “sendMessage” muss noch Dein Chatbot in den beiden Nodes “Telegram sender” hinterlegt werden

      Zum Testen kannst Du im Subflow “peripherals message” die Zeit im Trigger-Node “Auslöser 10min” auf 10s stellen. So erhältst du schnellere Ergebnisse 🙂
      Im globalen Kontext müsstest Du auch sehen, dass unter “peripheralsState” ein Objekt mit einem Zähler angelegt wurde, der hochgezählt wird.

      Ich habe den Flow gleich ins github verlagert, das lässt sich für mich leichter pflegen. Gleichzeitig habe ich noch einen Schönheits-Fehler beim Import bereinigt – NodeRED verwendet offenbar keinen Unicode.

      Wenn du magst, kannst du mich auch gern per E-Mail anschreiben (oder für das Forum im Login-Bereich anmelden) und wir können das gemeinsam durchgehen. Die Adresse findest du ganz unter auf der Webseite unter “Kontakt”.

Sag mir deine Meinung! (Kommentar-Regeln)

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.