Addons - Node Red

Node Red Installation

Beschreibung:

Node Red ist ein Flussdiagramm basiertes Programmieren von Regeln.
Das macht das ganze sehr einfach und Übersichtlich.
Mit Variablen , schleifen etc.

Installation:

Auf einstellungen -> Addons gehen

Auswahl_176.png

Nun auf Addon Store

Auswahl_177.png

Dann runter scrollen bis Node Red und dann Node anklicken

Auswahl_178.png

Nun auf installieren klicken

Auswahl_179.png

Nach der installation sieht das ganze so aus

Auswahl_191.png

Nun auf Konfiguration gehen  und credential_secret eintragen. Dieses passwort aufschreiben.

Auswahl_192.png

Den Haken SSL rausnehemne und auf speichern klicken

Auswahl_197.png

Nun die Haken einhaken:
Beim booten starten
Watchdog
Automatische Updates
In der Seiteleiste anzeigen

Dann auf starten klicken

Auswahl_195.png

Nach dem starten in der Seitenleiste auf Node-Red klicken.
Nun öffnet sich das Node Red Fenster.

Auswahl_198.png

 Dort oben Rechts auf das Burger Menü klicken

Auswahl_207.png

Und im Menü Paletten verwalten anklicken

Menü_009.png

Dort schauen Ob in der Liste das Node-Red contrib Home Assistant Websocket installiert ist.
Da es in der Regel beim Node-Red standardmäßig mit installiert wurde steht da kein installieren, aber eine neue Version.
Sollte es bei euch nicht installiert sein. Steht anstelle von Aktuialiseren installieren.
Sollte sogar die aktuellste Version drauf sein steht da gar nichts.
Ich klicke erst mal auf aktualisieren um die aktuellste Version zu bekommen.

Auswahl_208.png

Dann nochmal bestätigen

Auswahl_209.png

Nun warten...

Auswahl_210.png

Nach dem Upgrade muss Node Red  neu gestartet werden

Auswahl_211.png

Nun auf schließen klicken

Auswahl_212.png

Jetzt auf Einstellungen -> Addon Ons

Auswahl_213.png

Dann auf Node Red klicken

Auswahl_214.png

Dann auf neustarten klicken

Auswahl_215.png

Dann wieder auf Node Red in der Seitenleiste. Und die Warnung ist auch weg.

Auswahl_216.png

Node RED-Companion installieren:

Was macht dieser:

Hauptfunktionen:

  • Entitätenverwaltung:
    • Erstellen und Aktualisieren von Home Assistant Entitäten über Node-RED, einschließlich:
      • Binärsensoren
      • Tasten
      • Zahlen
      • Auswahlen
      • Sensoren
      • Schalter
      • Textfelder
  • Flow-Steuerung:
    • Aktivieren oder Deaktivieren von Node-RED Flows direkt über die Home Assistant-Benutzeroberfläche.
  • Webhooks:
    • Erstellen und Verwalten von Home Assistant Webhooks mit Verarbeitung in Node-RED.
  • Geräteautomatisierung:
    • Nutzen von Gerätetriggern und -aktionen in Node-RED für erweiterte Automatisierungsmöglichkeiten.

Installation:

Auf HACS -> integrationen gehen

Auswahl_243.png

Dann unten auf Durchsuchen und herunterldaen von repositories klicken

Auswahl_244.png

Dort in den suchfilter node eingeben und dann NODE-RED Companion anklicken

Auswahl_245.png

Rechts unten dann auf herunterladen klicken

Auswahl_246.png

Nun nochmals auf Herunterladen klicken. Aktuellste Version ist vor ausgewählt

Auswahl_247.png
Es steht danach immer noch wieder herunterladen, das ist okay. Weil man könnte ja die Version wechseln

Danach Home Assistant neustarten.
Nach dem Neustart die Seite nochmal neuladen.

Nun unter Einstellungen -> Geräte und Dienste gehen

Auswahl_248.png

Dann auf integration hinzufügen klicken

Auswahl_249.png

Nun node als suchbegriff eingeben und dann node red companion anklicken

Auswahl_250.png

Nun auf Absenden klicken

Auswahl_251.png

Nun haben wir in der Liste unter konfiguriert, den Node Red Companion. Fertig
Auswahl_252.png

Grundübersicht

Flows und Nodes

Übersicht

Flows sind die Seiten auf den Nodes plaziert werden. Mann kann mehrere Flows haben. Vergleichbar mit Szenen.
Somit wird es übersichtlicher. Man kann natürlich auch alles auf einen Flow packen. Aber der Übersichthalber kann man halt mehrere Flows anlegen.

Die Nodes sind auf der Linke Seite.
Nodes sind unsere Bausteine mit den wir unseren Flow bauen.

Auswahl_217.png

Flow hinzufügen

Um ein weiteren Flow hinzu zu fügen klicken wir auf das + Symbol

Auswahl_218.png

Nun haben wir einen zweiten Flow im Tab daneben.

Auswahl_219.png

Im Rechten Fenster sehen wir auch nochmal unsere Flows.

Flow umbenennen

Um einen Flow umzubenennen, doppelklick auf den Tab des Flows den man umbenennen möchte

Auswahl_221.png

Nun dort den Text ändern. Wir haben auch die Möglichkeit eine Beschreibung hinzuzufügen.
Darin kann man zum Beispiel noch mal seine Abläufe erläutern, damit man nach einem jahr auch noch weiß was womit gemeint war, so ne Art Doku.

Auswahl_222.png



Geändert und eine Beschreibung eingefügt. Nun auf Fertig klicken.

Auswahl_223.png

Flow löschen

Doppelklcik wieder auf den Reiter des zu löschenden Flows

Auswahl_224.png

Und dort dann löschen anklicken

Auswahl_225.png

Nodes

Plazieren von Nodes

Um ein Node auf den Flow zu ziehen, den node den man haben möchte aus der Liste Links mit der linken Muastatse gedrückt halten und auf den Flow ziehen

Auswahl_226.png

Nun ist die Node plaziert.

Auswahl_227.png

Eigenschaften der Node anzeigen, umbenennen und löschen

Hierrüber kann die Node auch gelöscht werden, analog wie beim Tab.
Dazu doppelklick auf die Node.
Nun können wir Name vergeben oder aber über den löschen Button die Node löschen.

Auswahl_228.png

Deployen - scharf schalten

Damit Nodes eigenschften etc. auch Aktiv geschaltet werden, gibt es oben rechts den Butto deploy.
Kann man gleich setzten mit speichern oder übernehmen.

Auswahl_233.png

Über den Pfeil kann man auch sagen, mann will nur bestimmte Bereiche Deployen möchte

Auswahl_234.png




Erste Automation

Denn Node RED dient ja dazu Automatisierungen Visuell zu Programmieren mit Blöcken (Nodes)
Was brauchen wir für die Automatisierung:

Nodes typen

Kommentar Node

Die Kommentar Node hat keine Funktion, sie dient zur Dokumentation von Bausteinen oder sonstigen infos.
Jetzt suchen wir uns die Comment Node raus. Dazu einfach comm
Oben links ist ein suchfilter. Da kann man nach Nodes filtern.
Dann braucht man nicht so viel scrollen. DIese dann wieder mit linker Taste gedrückt halten und auf die freie Fläche ziehen

Auswahl_229.png

Nun doppelklick auf die Node, kann man Name und den Kommentar eingeben

Auswahl_230.png

In der Node selbst wird der name angezigt, klickt man die Node an. wird im rechten Fenster der Inhalt also unser Kommentartext angezeigt.

Auswahl_232.png


Entity Node (Ersetzt durch eine neue Gruppe von Elementen die "Home Assitant Entities" )

Die Entity Node ist eine Node mit der man eine Entität in Home Assistant anlegen kann. Also ein Virtuelles Gerät.
Zum Beispiel ein Schalter oder ein sensor. Diese Entität ist allerding deprecated. Denn in diese Entität war zu unflexibel.
Dafür gibt es jetzt neue Nodes, mit denen Man GUI Elemnte oder Sensororen in Home Assistant bauen kann.
Virtuell halt.

Am Namen kann man schon erkennen was was sein soll.

Auswahl_235.png

Wir ziehen uns einen Schalter (switch) auf die freie Fläche) doppelklcik drauf und geben Ihm den Namen. Testschalter.

Auswahl_236.png
klicken dann auf den Bleistift.
In Neueren Versionen ist dies ein + Button

Auswahl_238.png

Nun Einen Namen angeben, switch auswählen und Device class auch switch.
Mit dem Stift bei Device kann man auch einen Eigenen Geräte Namen und Hersteller angeben.
Hier ist es jetzt in neueren Version auch ein + Button anstatt Stift
Wenn man möchte. Dann auf Hinzufügen

Auswahl_239.png

Nun noch Auf Fertig klicken.
Danach auf deploy klicken

Auswahl_237.png

Nun haben wir einen registrierten Schalter

Auswahl_253.png


Um zu sehen welche Entitäten von Node-RED Companion es gibt, gehen wir unter
EInstellungen -> Geräte und Dienste

Auswahl_248.png

Dort sehen wir dann bei Node Red Companion 1 Entität. Weil wir haben zur Zeit einen Schalter.
Da klicken wir drauf.

Auswahl_254.png

Nun sehen wir unseren Schalter. Name soll irgendwas machen. vom Typ switch.{name} name = soll irgendwas machen.
läuft. Dieses Gerät kann wie jedes anderes Gerät dann auch ein Bereich zugewiesen werden usw.

Auswahl_255.png

Auf dem Dashboard sieht das dann so aus. Ein Virtueller Schalter.

Auswahl_256.png

Event State Node (trigger/sensor)  Teil 1

Die Event State Node fragt Geräte eigenschaften / Zustände ab, also ein trigger.

Wieder eine Node hinzufügen, hier die Event State Node einen Namen vergeben, Server auswählen (HomeAssistant)
und das Entity auswählen.
Über die suche hab ich jetzt einfach "soll" eingegeben. Und schon bekommen wir unseren Schalter soll irgendwas machen.
Wir klicken erstmal auf fertig.

Auswahl_194.png

Debug Node

Bevor es an die Bedingung geht.
Was für einen Wert gibt unser Schalter denn zurück?
Das bekommen wir mit der Debug Node raus.
Diese Node ist besonders hilfreich um zustände zu bekommen.

In der Seitenleiste Rechts gibt es Symbol mit nem Käfer, da landen alle Infos von Debug Nodes oder Fehler von Nodes.
Über die Mülltonne mit all, lassen sich alle Nachrichten löschen, sprich das Debug Log leeren.

Auswahl_196.png
Für Fehler braucht man keine Debug Nodes.

Wir fügen eine Debug Node hinzu und geben Ihr einen Namen.
Als Ausgabe wollen wir meisten den payload, also sprich die Daten die das Gerät zurück gibt.
Den Haken bei Debug Tab rein, so das diese Dann auch im Debug Log hinzugefügt werden.
ist der Haken raus, steht der Zustand nur unten drin

Auswahl_195.png

Nun den Ausgang unserer prüfe schalter node mit dem Eingang des Debug Nodes  verbinden und auf Deploy klicken

Auswahl_201.png


Nun einen neuen Tab öffnen und unseren Schalter aus und wieder einschalten betätigen.
Nach Erstellung ist der Schalter Standardmäßig eingeschaltet

Auswahl_198.png

Nun machen wir den Schalter aus

Auswahl_199.png

Und wieder ein

Im Debug ist nun folgendes zu sehen.

Für einfache Zustände braucht man tatsächlich keine Debug Node, aber es geht ums Prinzip, denn wie zu sehen, wir der Wert unterm Testschalter angegeben, allerdings immer nur der letzte.
Übers Debug Node wissen wir nun beide zustände. Wenn der Schalter eingeschaltet ist ist es der Wert on und wenn er ausgeschaltet ist , ist es off.
Es hätte ja genauso gut true and false sein können.
Da der Wert on off ein Text ist, wissen wir das wir einen String vergleichen müssen.

Auswahl_202.png


Event State Node (trigger/sensor)  Teil 2

Nun können wir wieder unseren Service anklicken und die Bedingung eintragen. Ist Text und on.

Auswahl_203.png

Unsere Node hat zwei Ausgänge.
Der Erste wenn die Bedingung wahr ist und die zweite Unwahr.
So können wir zwei Zustände erfassen. Ist der Schalter an, mach das, ist der aus mach das.

Nachdem wir die Bedingung eingetragen haben, bekommen wir im Debug auch nur noch on.
Denn vorher war die Node ja immer true und der Payload wurde für on wie auch off an dem ersten Ausgang übertragen. Wollen wir im Debug Node auch jetzt noch beide zustände müssen wir den False Ausgang auch noch ans Debug Modul packen.

Auswahl_204.png

Beide Ausgänge aufs Debug Modul.

Auswahl_205.png

Jetzt wäre ein Kommenta sinnvoll und das Debug modul kann gelöscht werden, wenn man es nicht braucht, oder deaktiviert, damit das Log nicht vollgemüllt wird.

Deaktivieren

Auswahl_206.png

Nun ist es deaktiviert. Deployen nicht vergessen.

Auswahl_207.png

Ich lösche das Debug Objekt aber und ändere unser Kommentarfeld was jetzt auch einen sinn macht

Auswahl_209.png

Ich schreibe oben in den Titel schon die Werte rein. Für die Vollbeschreibung dann doppelklick auf das Kommentar Node

Auswahl_210.png

Nun können wir endlich unsere Aktion hinzufügen.
Das machen wir mit der call service node

Call Service Node

Wir fügen ein call service node hinzu vergeben einen Namen und die wählen unsere Geräte Klasse,
Hier Licht

Auswahl_211.png

Bei Enitity wählen wir das eigentliche Gerät.
ich gebe in die suche light an, so werden mir alle Geräte mit light aufgelistet.
ich wähle mein Sofa licht. Auch Gruppen können ausgewählt werden wie meine Gruppe light.wohnzimmerlichter

Auswahl_212.png

Nun wählen wir den Service aus. Da wir gesagt bei status on soll das licht an gehen und nicht togglen, wählen wir hier on

Auswahl_213.png

Nun da wir den Service ausgwählt haben, haben wir weiter unten bei Data eine reihe von Werten die Wir übergeben können angezeigt.
Die Service node hat übrigends auch die Möglichkeit Debug Informationen anzuzeigen. So braucht man keine Extra Debug Node erstellen.
Viele Nodes haben das schon inbegriffen.
Hier aber eine Liste der Werte, die dieser Service unterstützt, einige Werte werden eventuell von dem Entity nicht unterstützt.
Dann passiert halt nichts und wird nur eingeschaltet.
zum Beispiel bei einer weißen Lampe die keine Farben unterstützt, kann ich auch keine Farbe setzten:

Auswahl_214.png

Hier sind zufällig alle Parameter optional, das heißt in das Feld Data einfach zwei geschweifte Klammern.
Wichtig: Bei Data Format muss Json ausgewählt sein, nicht json Data

Auswahl_219.png

aber möchte man ein Beispiel, einfach auf Load Example Data klicken.
Das find ich total Praktisch, dann braucht man nur noch die Werte ändern.

Auswahl_215.png


Nun braucht man nur noch den Farbwert ändern als Beispiel

Auswahl_220.png

Wir belassen es bei leeren klammern.
Nun auf Fertig.
Jetzt können wir event state Ausgang wahr mit dem Licht verbinden und deployen das ganze.

Auswahl_217.png

Jetzt machen wir zwei Tabs auf. Einmal wieder zu unserem Schalter und dann den Gerätestaus vom Licht.
Wir schalten unser licht als erstes aus, auf der Geräte Seite

Auswahl_221.png


Nun gehen wir aufs Dashbaord und schalten den schalter aus und wieder ein.

Auswahl_199.png

Auswahl_198.png

Nun wurde auch die Lampe eingeschaltet, siehe Geräte Seite

Auswahl_222.png

Nun möchten wir natürlich das beim ausschalten des Schalters die Lampe auch ausgeht.
Dazu kopieren wir die Node Licht Wohnzimmer. Anklicken strg+c bzw bei mac command+c und strg+v bzw command+v
Jetzt haben wir die Node zweimal

Auswahl_223.png

Wir klicken die erste noch verbundene doppelt an und ändern den Namen

Auswahl_225.png

Bei der zweiten Node ändern wir den Namen in aus und wählen den Service turn_off

Auswahl_226.png

Nun verbinden wir die zweite node mit dem false Ausgang des event state, dann deployen

Auswahl_227.png

Nun kann man mittels Schalter das Licht ein und ausschalten.
Und jep Ihr habt recht, man hatte auch die Schalter Ausgänge direkt mit den Services verbinden können.
ich wollte hier aber den event  state vorstellen, denn anstatt eines Schalters hätte es ja auch ein Bewegungsmelder sein können, und den können wir nur über event state abfragen.

Direkt mit Schalter sähe so aus:

Auswahl_227.png

Damit das Aber klappt muss im Schalter noch ein Haken gesetzt werden das der Status als Payload weitergeben werden soll

Auswahl_228.png

Dies kann dann bei Standard also belassen werden

Auswahl_229.png

Fertig, nun kann das Licht direkt ohne event state geschaltet werden, da der Button ja schon ein event (Ereignis auslöst)
Wie hier auch nochmal zu sehen

Auswahl_230.png

Dieser Schalter dient wirklich nur dazu, wenn man gerne einen Knopf in der Oberfläche haben möchte der kein Echter Schalter ist.

Hat man so einen Schalter nur zum debuggen eingebaut, damit ich auch ohne event state meine Aktion testen kann, gibt es einen besseren Weg.
Denn jedes mal zum Bewegungsmelder zu rennen damit er ein Ereignis ausgibt kann ich mir einen Hilfsknopf direkt in Node Red bauen, ohne den Dashboard Knopf.
Über die Entwicklerwerkzeuge hab ich auch die Möglichkeit Werte zu ändern, aber da muss ich ja schon wieder ein Tab im Browser wechseln.
Siehe Geräte Werte Temporär ändern

Und nun der Inject Knopf

Inject Node

Der Inejct Knopf ist ein Debug Hilfsmittel mit dem Ich ein Ereignis innerhalb Node Red triggern kann.
Entweder im Intervall oder einmal.

Wir löschen erstmal die Verbindungen zu unserem Vorherigen Button und schieben die Lichter ein wenig nach rechts

Auswahl_231.png

Nun fügen wir die Inject Node hinzu. Vergeben einen namen.
ALs Payload wird der Zeitstempel übergeben. Der Payload ist uns eigentlich negal, da er ja sowieso nur ein true rausgibt egal was drin steht. Das teil hat ja nur einen Zustand.

Auswahl_232.png

Unten wäre die Möglichkeit auch eine Uhrzeit einzusetllen, dann ist es Kein Debug Knopf mehr sondern währe ein Taskplaner.
Wie geil ist das denn ;-)

Auswahl_233.png

Wir nutzen Ihn hier aber nur als Debug Button zum Auslösen beim drauf drücken.
Diesen verbinden wir jetzt mit Lmape an. Genauso wie unseren Prüfe schalter Verbinden wir auch wieder mit Lampe an und Lampe aus.
Dann sieht das ganze wieder so aus. Wird der Dashboard Schalter gedrückt löst das event state wieder aus jenach nzustand an oder aus. Wird unser Debug Knopf gedrückt wird das licht angeschaltet unabhängig vom event state

Auswahl_234.png

Wir kopieren den Debug Knopf noch einmal und verbinden diesen mit Wohnzimmer aus und deployen das ganze.

Auswahl_235.png

man löst den Debug knopf über die Schaltfläche davor aus, wie bei der Debug Node den Knopf

Auswahl_236.png

Anhand der Uhrzeit sieht mann ich hab erst on dann off gedrückt.

Auswahl_238.png

Hier auch nochmal im Log der Lampe

Auswahl_237.png

Anstatt den Button in der event statse noder zu überwachen, würde man hier einen Bewegungsmelder nehmen oder was auch immer nehmen, ist schon klar.
Es geht hier ums Prinzip ;-)

Variablen: Change und Function Node :

Es gibt zwei Typen von Variablen:

  1. Flow Variablen - Gelten nur in dem aktuellen  Flow
  2. Global Variablen - Gelten über alle Flows

Dazu ziehen wir uns eine Change Node in den Flow, setzten den Namen.
und wählen dann flow oder Global aus der Liste aus.

Auswahl_240.png

Nach flow. den variable Namen und darunter der Wert

Auswahl_241.png

Uns stehen folgende Variable Typen zur Verfügung. Flow und Global machen meist keinen Sinnd weil wir hier ja eine flow/global Variable definieren. Möchten wir eine bestehende Variable ändern, kommt meist noch mehr dazu als nur Inhalt Variable 1 in Variable 2 kopieren
(was natürlich geht in dem to Value dann die Flowvariable ausgewählt wird mit dem Quellvariablennamen).
Für komplexere Sachen nehmen wir lieber dann die später erklärte Function Node.

Das bei Set to value ist das msg Objekt, das msg was am Eingang der Node ankommt zum Beispiel der Wert eines vorherigen verbundenen Sensors oder so.

Auswahl_242.png

Nun setzten wir uns ein Inject Knopf und verbinden die Change Node mit um diesen dann triggern.

Auswahl_243.png
Setzen uns eine weiteres Inject und Verbinden eine Debug Node.
Dort einen Namen wählen und als payload flow und unseren Variable namen.

Auswahl_244.png

Nun deployen wir das ganze und drücken dann auf den inject button 1 und danach inject button 2

Auswahl_245.png

Nun sehen wir in der Debug leiste unseren Wert.

Auswahl_246.png

Wir können die Variable aber auch innerhalb eines Payloads nutzen also sprich als Varibale in einem text oder so.
Dazu nutzen wir eine Function Node und setzten diese zwischen dem inject und dem debug

Auswahl_248.png

Doppelklick auf die Function und die Function anpassen

Auswahl_249.png

Beschreibung:

var newText = flow.get("meinevariable"); //wir holen die flow Variable meinevariable und stecken sie in eine loakle in dieser funktion
newText = "Dieser texte enthält folgende Variable: "+newText+" in der Mitte"; //wir überschreiben newtext mit einem text und in der mitte die ausgelesene Variable die noch in newtext steckt.
//newtext ist jetzt der neue text
flow.set("meineneuevariable",newText); //wir legen eine neue flow variable an, falls man darauf später zurgeifen möchte und nicht gleich in der nächsten node
msg.payload = newText; //gleichzeitig geben wir als payload den neuen text aus, falls man gleich schon mit dem payload in der nächsten node weiterarbeiten möchte, man kann aber auch die neue flow variable nehmen
return msg; //die message zurückgeben

Da wir als Payload auch unseren neuen Text ausgegeben haben, ist der auch sofort im Debug Node sichtabr

Auswahl_250.png

DIe flow.meineneue Variable können wir auch in einer weiteren function, weiterverarbeiten
oder mit einer change node die msg.payload einfach auf den Wert des flows/global setzten
Beispiel Eigenschaften einer change node.
Der Name muss natürlich auch ausgefüllt werden, geht ums Prinzip, die mgs payload auf den Inhalt eines flows/global zu setzten:

Auswahl_251.png

Eine Function macht dann sinn, wenn man einer Variable Werte hinzufügen/ rechnen oder was was ich mach möchte oder gleich mehrere dinge auf einmal.
Wie die Variable komplex ändern und gleichzeitig als Payload ausgeben.
Will man aber tastächlich nur variable definieren und als payload ausgeben geht das auch mit change. denn mit hinzufügen kann man mehre aktionen durchführen.
Diese werden von oben nach unten abgearbeitet.
Beispiel:

Auswahl_259.png

Wir können aber auch anstatt eine Change Node zu nehmen auch gleich eine Function Node nehmen um dieses durch zu führen, eine Variable zu definieren und als Payload ausgeben. Allerdings finde ich zum reinen definieren ne Change Node einfacher.
Das gleiche geht natürlich dann auch mit global anstatt flow global schreiben, wenn man global variablen braucht.

JSON in eine Variable laden, so hat man ein Array in einer Variablen:

Wie man Variablen anlegt haben wir ja schon gesehen.
So speichern wir ein JSON Object in einer Variablen und lesen einzelne Elemete wieder aus.
So können wir mehrere Werte in einer Variablen speichern. Und hätten damit ein Array

Hier mal ein Beispiel JSON. Hier haben wir 4 Eigenschaften: name, color,on,brightness

{
	"name":"licht Sofa",
    "color":"blau",
    "on":"true",
    "brightness":100
}

Mit einer Change node können wir diese JSON speichern. Kommt sie von einer msg nutzen wir ebenfalls die change node.
Wir erstellen einen inject button eine change node und eine debug node

Auswahl_252.png

Doppelklick auf die Change Node
Dort vergeben wir einen Namen, bei setze wieder flow/gloabl und den variablennamen und bei set to wählen wir json aus.

Auswahl_253.png

nun klicken wir auf die 3 Punkte

Auswahl_254.png

und fügen unser json Data Beispiel von oben ein und dann auf fertig
Auswahl_255.png

Nun sieht das ganze so aus und jetzt unten auf hinzufügen klicken

Auswahl_258.png

Nun kann die msg.payload Ausgabe gesetzt werden auf die flow Variable die wir im ersten schritt defniert haben, danach auf fertig. Diese variable kann nun in der nächsten node durch setzten des msg.payload, wie auch später über den Variablenamen wieder verwendet werden.

Auswahl_260.png

Nun unsere Nodes Verbinden und dann deploy anklicken

Auswahl_257.png

Wenn wir jetzt auf den Injector klicken sehen wir im Debug Fenster unsere json Objekt

Auswahl_261.png

Klicken wir auf den Pfeil gibt ne bessere Übersicht.

Auswahl_262.png

Auswahl_263.png

Daten Zugreifen.
Da das ein JSON Object können wir dem "." auf die Objekte zugreifen..
Wir legen dazu wieder ein Inject und ein Debug an Verbinden die auch gleich.
Auswahl_264.png
Nun doppelklick auf die Inject node
Dort einen Namen vergeben und dann bei Flow den Variablenamen einegben.

Auswahl_265.png

Nun kann hinter den Variablennamen ein punkt angeben werden und wir bekommen eine auflistung der Elemente

Auswahl_266.png

Wir nehmen hier mal den Namen und klicken auf fertig.
Auswahl_267.png

Nun deployen
Dann den ersten inject für die für die json variable erstellen.
Dann den zweiten Inject für das auslesen.
nun sehen wir den Wert der Eigenschaft Name als Payload.
Nämlichen den Namen.

Auswahl_268.png


Push Notifactions / Benachrichtigungen

Beschreibung:

Wenn man die Home Assistant Companion App installiert hat auf Android oder iOS kann man benachrichtungen senden.
Natürlich kann man auch andere Geräte Nachrichten senden, das hängt davon ab, welche Entität (Device) ausgewählt wurde, was die Benachrichtigung erhalten soll.

Kanäle für Benachrichtungen  Android:

Es gibt zwei Arten von Kanälen


Hinweis:

Push Töne werden auf den Medianausgabe Streams ausgegben
Push Töne funktionieren nicht im Lautlosmodus, selbst wenn bei Push Benachrichtung im Channel,
auch bei Bitte nicht stören, melden angehakt ist.
Wenn bitte nicht nicht stören angehakt ist lässt nur die Benachrichigung dann anzeigen, den Ton hört man trotzdem nicht!

Workaround: Die Lautstärke per Befehl vorher hochstellen kommen wir später zu..
Hier schon mal der Befehl fürs laut stellen des Benachrichtungs Media Stream

data:
      message: command_volume_level
      title: "100"
      data:
        channel: notification_stream
        
        
Als JSON Data für den Service in Node Red

{
    "message": "command_volume_level",
    "data": {
        "command": 100,
        "media_stream": "notification_stream"
    }
}

Kanäle für Benachrichtungen iOS

Auf iOS gibt es Keine Kanäle in diesem Sinne wie bei Android. Hier können wir zwischen 3 Kategorien wählen

Die drei Kategorien sind:

  1. notification (Standard)

    • Beschreibung: Dies ist die Standardkategorie. Die Benachrichtigung wird in der Mitteilungszentrale angezeigt, spielt eventuell einen Ton ab (abhängig von den Geräteeinstellungen) und erscheint als Banner.
      Wird keine Category angegeben, wird sowieo notifiction benutzt. Ist also Standard
    • Geeignet für: Allgemeine Benachrichtigungen, die keine besondere Aufmerksamkeit erfordern.
    • Beispiel:
      {
        "message": "Neue Nachricht erhalten.",
        "data": {
          "push": {
            "category": "notification"
          }
        }
      }
      

  2. alarm

    • Beschreibung: Diese Kategorie priorisiert die Benachrichtigung stark. Sie wird auch dann abgespielt, wenn der Nicht stören-Modus aktiv ist, und ein lauter Ton wird abgespielt (vorausgesetzt, die Benachrichtigung hat einen Ton definiert).
    • Geeignet für: Kritische Alarme wie Rauchmelder, Einbruchalarm oder medizinische Warnungen.
    • Beispiel:
      {
        "message": "Rauchmelder-Alarm! Bitte überprüfen!",
        "data": {
          "push": {
            "category": "alarm"
          }
        }
      }
      




  3. silent

    • Beschreibung: Die Benachrichtigung wird still gesendet, ohne Banner, Ton oder Mitteilung in der Mitteilungszentrale. Sie wird nur in Home Assistant verarbeitet.
    • Geeignet für: Hintergrundaufgaben, stille Benachrichtigungen oder Datenübertragungen an Home Assistant.
    • Beispiel:
      {
        "message": "Daten aktualisiert.",
        "data": {
          "push": {
            "category": "silent"
          }
        }
      }
      

      Siehe auch Tabelle Beschreibung der Parameter hier


Benachrichtung TTS Android only

Um TTS Benachrichtungen zu senden, erstelle wir einen Service call.
Wählen notify bei Domäne aus und service wenn es ein rundruf an alle werden soll notify aus explicit das Gerät.
Über die 3 Punkte erstellen wir die Nachricht

Auswahl_424.png

Quelltext

{
    "message": "TTS",
    "data": {
        "priority": "high",
        "media_stream": "alarm_stream",
        "tts_text": "Rauchmelder Fahrradschuppen Rauch erkannt"
    }
}

Parameter

Parameter Typ Beschreibung Beispiel
message String Der Haupttext der Benachrichtigung, der dem Benutzer angezeigt wird. Hier wird TTS als Befehl ausgewertet und es erscheint keine Benachrichtung, da die TTS einfach abgespielt wird.
"TTS"
data Objekt Zusätzliche Daten und Einstellungen für die Benachrichtigung. Siehe unten.
 priority String Die Wichtigkeit der Benachrichtigung. high sorgt dafür, dass die Benachrichtigung mit hoher Priorität gesendet wird. "high"
 media_stream String Gibt an, welcher Audiokanal für die Benachrichtigung verwendet wird. alarm_stream spielt sie über den Alarmkanal ab. Dieser Kanal ist auch im Silent modus erreichbar und kann auch nicht gemuted werden.
"alarm_stream"
 tts_text String Text, der über Text-to-Speech (TTS) wiedergegeben werden soll. "Rauchmelder Fahrradschuppen Rauch erkannt"

Benachrichtung TTS ios

Eigentlich ist es keine Benachrichtung, aber es passt trotzdem hier her.
Denn iOS unterstützt keine TTS Push Benachrichtung, aber mit einem trick können wir das über die App machen.
Mittels Plugin asu dem HACS Store.

Auswahl_425.png

Dann auf die 3 Punkte und auf Herunterladen klicken.Menü_014.png

Nun die letzte Version auswählen und herunterladen anklicken.

Auswahl_426.png

nachdem das heruntergeladen wurde auf Geräte gehen und auf integration hinzufügen klicken.
Als Suchbgriff brow eingeben und die integration Browser mod auswählen.
Auswahl_427.png
Nun erscheint in der Seitenleiste Browser mod.
Dieses brauchen wir aber erst auf dem iPAD. (Es sei denn Ihr seid schon auf dem iPAD, dann machen wir da später weiter.
Jetzt muss noch die configration.yaml angepasst werden.

Wir fügen folgende abschnitte hinzu.
Solltet ihr den google translate teil schon haben, weil ihr den für was anderes konfiguriert habt, könnt ihr den natürlich weg lassen.

...
# Text to speech
tts:
  - platform: google_translate
    language: de
...
#tatsächlich nur den namen, nichts mehr
browser_mod:
...

Danach Home Assistant neustarten (yaml neuladen reicht nicht)

Nun auf dem Gerät in den Reiter Browsermod gehen
Den haken zum Registrieren rein packen

IMG_0147.PNG

Nun geben wir unserem gerät hinter der ID Namen zum identifizieren.

IMG_0148.PNG

Nun nach dem Speichern wir der link zu den Profilen freigeschaltet, da drauf klicken nach unten scrollen

IMG_0149.PNG

Nun das Auto trennen raus nehmen.

IMG_0150.PNG

Ein TTS Objekt in Node RED erstellen

Ein call service erstellen domain tts , service google translate, auswählen und als entity unser ipad (die Browser ID)

grafik.png

ALs json data haben wir nur Message und sprache

{
    "message": "Rauchmelder {{ global.rauchmeldertext }} Rauch erkannt",
    "language": "de"
}

grafik.png

Benachrichtung mit Aktionen

Man kann auch Benachrichtungen mit Buttons erstellen, die Aktionen ausführen wie Seiten öffnen oder variablen ändern in node red.

Dazu legen wir uns eine Benachrichtigung an mit zwei Buttons.
Dazu wieder einen call service reinziehen und vom typ notify auswählen.
Dann unter service notify für alle Geräte oder das Gerät an das gesendet werden soll, explicit auswählen.
Dann auf die 3 Punkte um unseren Inhalt der Benachrichtung zu definieren

Auswahl_424.png

Der Quelltext

{
    "message": "Rauchmelder-Alarm! Bitte überprüfen!",
    "data": {
        "channel": "Alarm",
        "priority": "high",
        "importance": "high", 
        "ttl": 0,
        "push":{
            "category": "alarm",
            "interruption_level": "time-sensitive"
        },
        "actions": [
            {
                "action": "SNOOZE",
                "title": "Rauchmelder Stoppen",
                "icon": "mdi:bell-alert"
            },
            {
                "action": "IRGENDWAS",
                "title": "IRGENDWAS Stoppen",
                "icon": "mdi:bell-alert"
            }
        ]
    }
}

Beschreibung der Parameter:
Parameter Typ Beschreibung Beispiel
message String Die Hauptnachricht der Benachrichtigung, die dem Benutzer angezeigt wird. "Rauchmelder-Alarm! Bitte überprüfen!"
data Objekt Enthält zusätzliche Informationen und Konfigurationen für die Benachrichtigung. Siehe unten.
 channel String Der Benachrichtigungskanal, der für Android verwendet wird. Kanäle steuern Benachrichtigungseigenschaften wie Ton oder Priorität. "Alarm"
 priority String

priority ist ein älteres, legacy‑Feld, das vor allem auf Android < 8.0 (NotificationCompat) greift.

Auf neueren Geräten (ab Android 8.0) wird priority zwar noch akzeptiert, empfohlen wird aber, den Kanal per importance korrekt zu konfigurieren und priority nur als Fallback zu verwenden.

Die Property priority legt fest, wie wichtig die Notification vom Betriebssystem eingestuft wird und beeinflusst vor allem auf Android, ob sie als Heads‑Up‑Popup aufplatzt oder eher still im Hintergrund landet.

  • priority: "high" ⇒ kurze Heads‑Up‑Notification oben am Bildschirm, mit Ton (vorausgesetzt der Kanal/Stream ist entsprechend konfiguriert)

  • priority: "default" ⇒ normale Mitteilung ohne Popup

  • priority: "low" oder "min" ⇒ möglichst unaufdringlich (kein Ton, kein Banner)

Tipp: Für Alarm‑ oder TTS‑Nachrichten immer "high" verwenden, damit die Nachricht wirklich direkt auffällt.

"high"
importance String

Auf Android‑Geräten (ab Version 8.0+) wird die Wichtigkeit eines Notification‑Kanals über das importance‑Feld gesteuert. Die möglichen Werte sind:

  • min
    low
    default
    high
    max

Die Beschreibung der Werte Siehe Tabelle importance


 ttl Integer ttl steht für Time To Live und bestimmt, wie lange eine Notification auf dem Server zwischengespeichert und immer wieder zugestellt wird, falls das Gerät gerade offline ist.
  • ttl: 0 → Nachricht wird sofort zugestellt und nicht zwischengespeichert.

  • ttl: 3600 → Nachricht bleibt bis zu 1 Stunde aktiv und wird wiederholt, bis sie zugestellt oder die Stunde abgelaufen ist.

Merke: Ein hoher ttl‑Wert sorgt dafür, dass du auch dann noch benachrichtigt wirst, wenn dein Handy gerade keine Verbindung hatte.

0
push Array
Push ist ein Array für iOS, zum Verständnis sind bei den nächsten beiden Parametern das Wort push davor, damit man man weis wo zu es gehört. Der Typ String bezieht sich auf das Element in push

push.category String

Auf iOS gibt es kein Äquivalent zu den Android‑Feldern priority oder importance – die werden von der Companion App schlicht ignoriert. Stattdessen steuerst du das Verhalten über zwei iOS‑spezifische Felder in deinem Payload:

 

push.category

  • Legt fest, in welche Kategorie (notification, alarm, silent) die Notification fällt.

    alarm spielt deinen definierten Ton auch im „Nicht stören“ ab.

Es werden folgende Werte unterstützt:

  • notification (Standard)

    • Anzeige: Banner in der Mitteilungszentrale und auf dem Sperrbildschirm

    • Ton: Spielt einen Ton ab, sofern das Gerät nicht stumm geschaltet ist und der User es erlaubt

    • Einsatz: Allgemeine Hinweise, Status‑Updates, alles, was keine besondere Dringlichkeit hat

  • alarm

    • Anzeige: Banner und Mitteilung wie bei „notification“, selbst im „Nicht stören“‑Modus

    • Ton: Laut und durchdringend, auch wenn das Gerät stumm ist oder DND aktiv

    • Einsatz: Kritische Warnungen (Rauchmelder, Einbruch, medizinische Notfälle), bei denen man sofortige Aufmerksamkeit benötigt

  • silent

    • Anzeige: Kein sichtbarer Banner, kein Ton, keine Badges

    • Verarbeitung: Wird nur intern von der Companion App entgegengenommen und in Home Assistant verarbeitet

    • Einsatz: Hintergrund‑Signale, Status‑Synchronisation, Updates ohne User‑Unterbrechung (z. B. Daten‑Refresh)

"data": {
  "push": {
    "category": "alarm"
  }
}
push.interruption_level String
  • notification (Standard)

    • Anzeige: Banner in der Mitteilungszentrale und auf dem Sperrbildschirm

    • Ton: Spielt einen Ton ab, sofern das Gerät nicht stumm geschaltet ist und der User es erlaubt

    • Einsatz: Allgemeine Hinweise, Status‑Updates, alles, was keine besondere Dringlichkeit hat

  • alarm

    • Anzeige: Banner und Mitteilung wie bei „notification“, selbst im „Nicht stören“‑Modus

    • Ton: Laut und durchdringend, auch wenn das Gerät stumm ist oder DND aktiv

    • Einsatz: Kritische Warnungen (Rauchmelder, Einbruch, medizinische Notfälle), bei denen man sofortige Aufmerksamkeit benötigt

  • silent

    • Anzeige: Kein sichtbarer Banner, kein Ton, keine Badges

    • Verarbeitung: Wird nur intern von der Companion App entgegengenommen und in Home Assistant verarbeitet

    • Einsatz: Hintergrund‑Signale, Status‑Synchronisation, Updates ohne User‑Unterbrechung (z. B. Daten‑Refresh)

 "data": {
  "push": {
    "category": "alarm",
    "interruption_level": "time-sensitive"
  }
}
 actions Array Eine Liste von Aktionen, die in der Benachrichtigung angezeigt werden. SIehe json Data
 action String Der interne Schlüssel für die Aktion, der in Automatisierungen verwendet wird, wenn die Schaltfläche gedrückt wird.
Das ist auch der Wert den wir dann auswerten.
"SNOOZE"
 title String Der Text des Button, der in der Benachrichtigung angezeigt wird. "Rauchmelder Stoppen"
 icon String (Optional) Ein Icon, das mit der Aktion verknüpft ist. iOS unterstützt dies, aber Android zeigt normalerweise keine Icons an. "mdi:bell-alert"
Tabelle importance Werte und unterschied zu Priority
Stufe Konstante Verhalten Entspricht (Android 7.x priority)
None IMPORTANCE_NONE (0) Keine Anzeige, kein Ton, nicht im Benachrichtigungsbereich sichtbar (kein Äquivalent)
Min IMPORTANCE_MIN (1) Kein Ton, kein Icon, nicht im Status‑Bar‑Bereich PRIORITY_MIN
Low IMPORTANCE_LOW (2) Kein Ton, nur in der Benachrichtigungs‑Leiste PRIORITY_LOW
Default IMPORTANCE_DEFAULT (3) Ton, erscheint in Leiste PRIORITY_DEFAULT
High IMPORTANCE_HIGH (4) Ton + Heads‑Up‑Popup (aufklappbar) PRIORITY_HIGH / PRIORITY_MAX

Kurz erklärt:

Unterschied zu priority:

Notfication, stehen lassen, nicht wegwischbar, bei drauf tippen nicht auslösen:

Manchmal möchte man das die Notification ein Button gedrückt werden muss, mit drauf tippen soll auch nichts auseglöst werden.
Sondern nur beim Button

Erklärung der Optionen:
Verhalten:
Was solltest du verwenden?

Beides gibt dir Flexibilität, je nachdem, wie wichtig die Benachrichtigung in deinem Fall ist.

Android:

iOS:
iOS und Android:

Im Beispiel Quelltext, wir lassen sticky für Android einfach stehen.:

{
    "message": "Rauchmelder-Alarm! Bitte überprüfen!",
    "data": {
        "channel": "Alarm",
        "priority": "high",
        "importance":"high",
        "ttl": 0,
        "sticky": true,
        "persistent": true,
        "tag": "android_phone_anna",
        "actions": [
            {
                "action": "SNOOZE",
                "title": "Rauchmelder Stoppen",
                "icon": "mdi:bell-alert"
            },
            {
                "action": "IRGENDWAS",
                "title": "IRGENDWAS Stoppen",
                "icon": "mdi:bell-alert"
            }
        ]
    }
}

Den Button druck auswerten

Dazu brauchen wir ein Alle Events Node

image.png

Dann eine Switch Node zum auswerten

image.png

Nun können wir die Events node mit der Switch node verbinden.
Der Oberste Ausgang der Switchnode wird true, also wenn der button gedrückt wurde.

image.png

Die Eigenschaft der Events Node

image.png

Die Eigenschaft der Switch node

Namen vergeben

Wir wollen msg.payload.event.action auswerten, den Button

Und nun die Werte als string rein.
Über hinzufügen können mehrer Werte angegeben werden, jeder ausgang ist für den jeweiligen Wert.
Hier snooze PIN1 IRGENDWAS PIN2

image.png


Sollten mehrer buttons vorhanden zein können die pin zwei und soweiter für weitere Buttons benutzt werden.

Tipp, wenn auf verschiednenen Geräten Buttons Ausgewertet werden sollen, die in verschiedenen Flows drin sind.
Macht es sinn die Werte der Buttons unique für jedes Gerät zu machen. Sprich beim Send button den Button unique definieren und beim Auswerten diesen wieder zu nehmen.

Beispiel beim Button senden

image.png

Und dann beim Button empfangen

image.png

Bei den anderen Flows würde man dann andere namen nehmen.
fertig

Nicht weg wischbare Nachricht über den Tag wieder löschen.

message, der Befehl das eine Notification entfernt werden soll, hier "clear_notification"
Als data muss nur der tag der zu löschenden Notification übergeben werden
Hier :   "tag": "android_phone_anna"

{
    "message": "clear_notification",
    "data": {
       "tag": "android_phone_anna"
    }
}

Das die Home Assistant App nicht geöffnet wird, wenn die Nachricht angeklickt wird.

Für iOS wird URL verwendet mit dem Wert null,
Für Android wird clickAction mit noAction verwendet

{
    "message": "Rauchmelder-Alarm! Bitte überprüfen!",
    "data": {
        "channel": "Alarm",
        "priority": "high",
        "ttl": 0,
        "sticky": true,
        "persistent": true,
        "tag": "android_phone_anna",
        "url": null,
        "clickAction": "noAction",
        "actions": [
            {
                "action": "SNOOZE",
                "title": "Rauchmelder Stoppen"
            },
            {
                "action": "IRGENDWAS",
                "title": "IRGENDWAS Stoppen"
            }
        ]
    }
}

NUR iOS Push Benachrichtung auch anzeigen, wenn die Home assistant APP im vordergrund also geöffnet ist:

Das Feld presentation_options betrifft nur die iOS-App und steuert, wie Notifications angezeigt werden, wenn die Companion‑App im Vordergrund läuft. Standardmäßig blendet iOS eingehende Pushes aus, sobald die App aktiv ist – mit presentation_options kannst du das ändern.

Mögliche Werte (als Array oder einzelner String):

Du kannst mehrere Optionen kombinieren, z. B.:

{
  "message": "Rauchmelder-Alarm!",
  "data": {
    "push": {
      "category": "alarm",
      "presentation_options": ["alert","sound"]
    }
  }
}

Rauchmelder Beispiel mit Benachrichtigungen

Beschreibung:

Ein Rauchmelder Beispiel mit Stopp Benachrichtigung:

Es wurden zwei Rauchmelder definiert und jenachdem Weclher als erstes Auslöst gibt die Nachricht per TTS aus.

image.png

DIe States sind die Rauchmelder, diese triggern die Send Action Buttons, also die Nachricht die eingeblendet wird um den TTS wieder stoppen. Und sie setzten eine globale Variable mit dem Text des Rauchmelders.
Dann wird die abort false gesetzt. Dann gehts in die schleife die checkt ob abort true ist. Ist dies nicht der fall gehts an die nachricht sagen dann 10 sekunden warten und wieder zum check. solange bis auf dem button stopp gedrückt wurde.
Dann wird über überpüfe Tab bzw dem danachfolgendem Switch (werte aus) und wenn das passt, dann durch ein change das abort abort false zu true und die schleife wird beendet.

Tipp, wenn auf verschiednenen Geräten Buttons Ausgewertet werden sollen, die in verschiedenen Flows drin sind.
Macht es sinn die Werte der Buttons unique für jedes Gerät zu machen. Sprich beim Send button den Button unique definieren und beim Auswerten diesen wieder zu nehmen.

Beim Button senden

image.png

Und dann beim Button empfangen

image.png

Bei den anderen Flows würde man dann andere namen nehmen.
fertig



Hier einmal der Komplette code als export:

[
    {
        "id": "72f8bbccc156abc9",
        "type": "tab",
        "label": "Flow 78",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "fd846045ce203fdb",
        "type": "switch",
        "z": "72f8bbccc156abc9",
        "name": "Check abort",
        "property": "abort",
        "propertyType": "global",
        "rules": [
            {
                "t": "false"
            },
            {
                "t": "true"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 1110,
        "y": 380,
        "wires": [
            [
                "b2b1641da0ae4e50"
            ],
            [
                "4189cd5f02c60a22",
                "75cb06568f31df0d"
            ]
        ]
    },
    {
        "id": "bd0cc484a47ac218",
        "type": "api-call-service",
        "z": "72f8bbccc156abc9",
        "name": "Send  Actions Buttons",
        "server": "0b5c0a092e06b662",
        "version": 5,
        "debugenabled": true,
        "domain": "notify",
        "service": "mobile_app_gm1913",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "{\"message\":\"Rauchmelder-Alarm! Bitte überprüfen!\",\"data\":{\"channel\":\"alarm_stream_max\",\"priority\":\"high\",\"ttl\":0,\"sticky\":true,\"persistent\":true,\"importance\":\"high\",\"tag\":\"{{ global.message_tag }}\",\"presentation_options\":\"alert\",\"url\":null,\"clickAction\":\"noAction\",\"actions\":[{\"action\":\"SNOOZE_SMARTPHONE_STEFAN\",\"title\":\"Rauchmelder Stoppen\"}]}}",
        "dataType": "json",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "data"
            }
        ],
        "queue": "none",
        "x": 940,
        "y": 40,
        "wires": [
            []
        ]
    },
    {
        "id": "7a2df04207532b6e",
        "type": "delay",
        "z": "72f8bbccc156abc9",
        "name": "",
        "pauseType": "delay",
        "timeout": "10",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "5",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 1590,
        "y": 180,
        "wires": [
            [
                "fd846045ce203fdb"
            ]
        ]
    },
    {
        "id": "b2b1641da0ae4e50",
        "type": "api-call-service",
        "z": "72f8bbccc156abc9",
        "name": "TTS Raucherkannt auf dem Media Stream Alarm",
        "server": "0b5c0a092e06b662",
        "version": 5,
        "debugenabled": true,
        "domain": "notify",
        "service": "mobile_app_gm1913",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "{\"message\":\"TTS\",\"data\":{\"priority\":\"high\",\"media_stream\":\"alarm_stream\",\"tts_text\":\"Rauch {{ global.rauchmeldertext }} erkannt\"}}",
        "dataType": "json",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 1360,
        "y": 40,
        "wires": [
            [
                "7a2df04207532b6e"
            ]
        ]
    },
    {
        "id": "20fc249d39285d23",
        "type": "change",
        "z": "72f8bbccc156abc9",
        "name": "Set abort faLSE",
        "rules": [
            {
                "t": "set",
                "p": "abort",
                "pt": "global",
                "to": "false",
                "tot": "bool"
            }
        ],
        "x": 980,
        "y": 240,
        "wires": [
            [
                "fd846045ce203fdb"
            ]
        ]
    },
    {
        "id": "4189cd5f02c60a22",
        "type": "debug",
        "z": "72f8bbccc156abc9",
        "name": "debug 8",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1480,
        "y": 380,
        "wires": []
    },
    {
        "id": "4c344c4831e5fcac",
        "type": "server-state-changed",
        "z": "72f8bbccc156abc9",
        "name": "",
        "server": "0b5c0a092e06b662",
        "version": 4,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "binary_sensor.smoke_detected_1",
        "entityidfiltertype": "exact",
        "outputinitially": false,
        "state_type": "str",
        "haltifstate": "on",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 2,
        "output_only_on_state_change": true,
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 240,
        "y": 200,
        "wires": [
            [
                "41e0d6ee2b5907b9",
                "650bd1c892f800a0"
            ],
            []
        ]
    },
    {
        "id": "41e0d6ee2b5907b9",
        "type": "change",
        "z": "72f8bbccc156abc9",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "rauchmeldertext",
                "pt": "global",
                "to": "Fahrradschuppen",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 680,
        "y": 240,
        "wires": [
            [
                "20fc249d39285d23"
            ]
        ]
    },
    {
        "id": "4dcffc1f5cb9e580",
        "type": "server-state-changed",
        "z": "72f8bbccc156abc9",
        "name": "",
        "server": "0b5c0a092e06b662",
        "version": 4,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "binary_sensor.smoke_detected_2",
        "entityidfiltertype": "exact",
        "outputinitially": false,
        "state_type": "str",
        "haltifstate": "on",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 2,
        "output_only_on_state_change": true,
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 200,
        "y": 440,
        "wires": [
            [
                "15bcfcc2b81baf03",
                "650bd1c892f800a0"
            ],
            []
        ]
    },
    {
        "id": "15bcfcc2b81baf03",
        "type": "change",
        "z": "72f8bbccc156abc9",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "rauchmeldertext",
                "pt": "global",
                "to": "Wohnstube",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 680,
        "y": 440,
        "wires": [
            [
                "20fc249d39285d23"
            ]
        ]
    },
    {
        "id": "75cb06568f31df0d",
        "type": "api-call-service",
        "z": "72f8bbccc156abc9",
        "name": "Clear Actions Buttons",
        "server": "0b5c0a092e06b662",
        "version": 5,
        "debugenabled": false,
        "domain": "notify",
        "service": "mobile_app_gm1913",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "{\"message\":\"clear_notification\",\"data\":{\"tag\":\"{{ global.message_tag }}\"}}",
        "dataType": "json",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "data"
            }
        ],
        "queue": "none",
        "x": 1520,
        "y": 460,
        "wires": [
            []
        ]
    },
    {
        "id": "47d0e3399b240284",
        "type": "inject",
        "z": "72f8bbccc156abc9",
        "name": "manuell starten",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 160,
        "y": 140,
        "wires": [
            [
                "41e0d6ee2b5907b9",
                "650bd1c892f800a0"
            ]
        ]
    },
    {
        "id": "faf2cf47f8a2e467",
        "type": "inject",
        "z": "72f8bbccc156abc9",
        "name": "manuell starten",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 120,
        "y": 380,
        "wires": [
            [
                "15bcfcc2b81baf03",
                "650bd1c892f800a0"
            ]
        ]
    },
    {
        "id": "650bd1c892f800a0",
        "type": "change",
        "z": "72f8bbccc156abc9",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "message_tag",
                "pt": "global",
                "to": "benachrichtung_stefan",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 690,
        "y": 40,
        "wires": [
            [
                "bd0cc484a47ac218"
            ]
        ]
    },
    {
        "id": "f5e75181e7417fe2",
        "type": "change",
        "z": "72f8bbccc156abc9",
        "name": "Set abort true",
        "rules": [
            {
                "t": "set",
                "p": "abort",
                "pt": "global",
                "to": "true",
                "tot": "bool"
            }
        ],
        "x": 800,
        "y": 600,
        "wires": [
            []
        ]
    },
    {
        "id": "8f5bb3abc51be77f",
        "type": "server-events",
        "z": "72f8bbccc156abc9",
        "name": "überpüfe tap",
        "server": "0b5c0a092e06b662",
        "version": 2,
        "eventType": "mobile_app_notification_action",
        "exposeToHomeAssistant": false,
        "eventData": "",
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "waitForRunning": true,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            }
        ],
        "event_type": "",
        "x": 90,
        "y": 600,
        "wires": [
            [
                "765be5afb170835b",
                "24ebd151429c0ffb"
            ]
        ]
    },
    {
        "id": "765be5afb170835b",
        "type": "switch",
        "z": "72f8bbccc156abc9",
        "name": "werte aus",
        "property": "payload.event.action",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "SNOOZE_SMARTPHONE_STEFAN",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "IRGENDWAS",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 420,
        "y": 600,
        "wires": [
            [
                "f5e75181e7417fe2",
                "14956e7bf6034ba7"
            ],
            []
        ]
    },
    {
        "id": "24ebd151429c0ffb",
        "type": "debug",
        "z": "72f8bbccc156abc9",
        "name": "debug 10",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 420,
        "y": 520,
        "wires": []
    },
    {
        "id": "14956e7bf6034ba7",
        "type": "debug",
        "z": "72f8bbccc156abc9",
        "name": "debug 11",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload.event.action",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 660,
        "y": 720,
        "wires": []
    },
    {
        "id": "0b5c0a092e06b662",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "30",
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": ": ",
        "statusYear": "hidden",
        "statusMonth": "short",
        "statusDay": "numeric",
        "statusHourCycle": "default",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": false
    }
]