Node-RED zuverlässig mit Loxone nutzen trotz Verbindungsabbrüchen

IM EINSATZ?

Dann schau dir UNSEREN LOXKURS an und profitiere von unserem Wissen!

Seit einiger Zeit habe ich jetzt schon Node-RED auf einem Intel NUC8i3BEH (Affiliate-Link) im Einsatz, um bspw. meinen Strom- und Fernwärmezähler auszulesen und deren Werte an Loxone zur weiteren Verarbeitung zu schicken. Leider brach die Verbindung zwischen beiden Systemen hin und wieder ab – insbesondere nach mehreren Neustarts des Miniservers in schneller Folge. Dann flossen überhaupt keine Daten mehr und es war keine vernünftige Auswertung mehr bis zum nächsten manuell eingeleiteten Neustart von Node-RED möglich.

Wie ich das Problem gelöst habe, damit Node-RED und Loxone wieder zuverlässig miteinander reden können, – insbesondere nach mehreren Neustarts und etwaigen dauerhaften Verbindungsabbrüchen – ist Inhalt des nachfolgenden Blogposts.

Vorab: Hier der Loxone Onlineshop meines Vertrauens, sofern ihr “akuten” Bedarf habt: smarthirsch.de (Affiliate-Link)

Node-RED und Loxone miteinander verbinden

Um Node-RED mit Loxone sprechen zu lassen, muss in Node-RED lediglich über den “Menübutton rechts oben” -> “Palette verwalten”

-> “Installieren” die entsprechende Node namens “node-red-contrib-loxone” (GitHub-Link) ins System übernommen werden.

Und nach einigen Momenten tauchen in der Nodes-Liste links die Entsprechenden In- und Output-Nodes für Loxone auf.

Um die Verbindung zum Miniserver herzustellen, wird bspw. eine “online”-Node rechts in den Arbeitsbereich (Flow) gezogen und doppelt angeklickt. Bei den “Properties” einfach auf den Stift klicken…

und die entsprechenden Daten des Loxone Miniservers eingeben und mit dem “roten Button” zu speichern. Die Einstellungen zu “Encryption” und “Keepalive” können so bleiben, wie sie sind.

Meine Empfehlung ist dabei immer einen separaten User (hier “nodered”) in der Loxone Config mit eingeschränkten Rechten anzulegen. Aber rein technisch lässt sich die Anbindung zu Node-RED natürlich auch mit dem “admin”-User realisieren.

Wurden die Daten korrekt gepflegt und das System per “Deploy”-Button aktualisiert, sollte die eingefügte Node recht schnell auf “connected” schalten.

Automatische Wiederaufnahme bei getrennter Verbindung

Wird die Verbindung nun eine Weile aufgrund von Netzwerkproblemen unterbrochen bzw. startet der Miniserver in schneller Folge mehrmals neu, hatte ich des Öfteren das Problem, dass der Status dauerhaft auf “disconnected” verharrte und entsprechend kein Datenaustausch mehr möglich war.

Die Lösung des Problems sieht dabei folgendermaßen aus:

Erstmal wird eine “exec”-Node in den Flow gezogen und doppelt angeklickt.

In Das Befehlfeld wird dabei Folgendes eingetragen:

curl -X POST http://localhost:1880/flows -H "Content-Type: application/json" -H "Node-RED-Deployment-Type: reload"

Bekommt die Node an dessen Input einen Trigger, werden durch diesen Systembefehl alle in Node-RED bestehenden Flows neugestartet, wodurch ein neuer Verbindungsaufbau zum Miniserver erfolgt.

Als Trigger nutze ich dabei zwei Komponenten:

Einmal wird recht simpel durch die “inject” Node um 23:55 ein entsprechender Befehl ausgelöst.

Das ist aber quasi nur als Backup gedacht.

Der eigentlich wichtige Trigger wird durch eine “http in” Node ausgelöst. Hier wird als Methode “get” ausgewählt und als URL “/flows_restart” (ohne Anführungszeichen).

Sofern die Nodes wie im Screenshot verbunden sind, erhält Node-RED den Restart-Befehl sobald im Netzwerk die URL “http://IP-DES-NODE-RED-SERVERS/flows_restart” aufgerufen wird. In meinem Fall ist das “http://192.168.3.30/flows_restart”.

Am Schluss dann noch auf “Deploy” klicken, um die Änderungen zu übernehmen und zu speichern. Hier nochmal der gesamte Flow zum Importieren in Node-RED:

[
{
"id": "91e4fb2e.be81d8",
"type": "tab",
"label": "Zentral",
"disabled": false,
"info": ""
},
{
"id": "5438eb8e.871b84",
"type": "http in",
"z": "91e4fb2e.be81d8",
"name": "Restart Node-RED Flows",
"url": "/flows_restart",
"method": "get",
"upload": false,
"swaggerDoc": "",
"x": 450,
"y": 120,
"wires": [
[
"bf32bb37.d73488"
]
]
},
{
"id": "bf32bb37.d73488",
"type": "exec",
"z": "91e4fb2e.be81d8",
"command": "curl -X POST http://localhost:1880/flows -H \"Content-Type: application/json\" -H \"Node-RED-Deployment-Type: reload\"",
"addpay": false,
"append": "",
"useSpawn": "false",
"timer": "10",
"oldrc": false,
"name": "Restart Node-RED Flows",
"x": 770,
"y": 200,
"wires": [
[],
[],
[]
],
"info": "Restart Node-RED Flows\n-> Reopen closed connection to Loxone Miniserver"
},
{
"id": "f32c2fb5.f1035",
"type": "inject",
"z": "91e4fb2e.be81d8",
"name": "Trigger um 23:55",
"topic": "",
"payload": "true",
"payloadType": "bool",
"repeat": "",
"crontab": "55 23 * * *",
"once": false,
"onceDelay": 0.1,
"x": 470,
"y": 220,
"wires": [
[
"bf32bb37.d73488"
]
]
},
{
"id": "286f8669.6aa72a",
"type": "loxone-online",
"z": "91e4fb2e.be81d8",
"name": "Loxone Miniserver",
"miniserver": "a78ad6.b7983528",
"x": 430,
"y": 320,
"wires": [
[]
]
},
{
"id": "a78ad6.b7983528",
"type": "loxone-miniserver",
"z": "",
"host": "192.168.3.5",
"port": "80",
"enctype": "0",
"active": true,
"keepalive": "60000"
}
]

Damit NodeRED nach jedem Miniserver-Neustart diesen Befehl ausführt, wird dann noch ein entsprechender Trigger in Loxone gesetzt.

Virtuellen Ausgangsbefehl in Loxone setzen

Dazu wird erstmal ein “Virtueller Ausgang” mit der Adresse “http://192.168.3.30:1880” erzeugt. Die IP muss natürlich jeder mit der seines Node-RED-Servers tauschen. 1880 ist der Standardport, auf den Node-RED lauscht. Wer anders als ich noch ein Node-RED-Passwort gesetzt hat, muss dieses in die URL einbauen. Vermutlich so (ohne Gewähr): “http://user:pass@IP-DES-NODE-RED-SERVERS:1880”

Danach wird der gerade erzeugte virtuelle Ausgang mit einem “Virtueller Ausgang Befehl” ergänzt:

Als “Befehl bei EIN” wird “/flows_restart” (ohne Anführungszeichen) eingefügt und der virtuelle Ausgangsbefehl ins rechte Config-Fenster gezogen.

Der Befehl soll immer 30 Sekunden nach einem Miniserver-Neustart auslösen.

Dazu habe ich den “Startimpuls” hergenommen und einen “Verzögerten Impuls” mit entsprechend 30 sekündiger Verzögerungszeit und 0,02 sekündigem Ausgangsimpuls eingefügt. Die Remanenz ist deaktiviert.

Ebenso wie beim nachfolgenden “Schalter”, an dem der verzögerte Impuls an “O” angeschlossen wird.

Am Schalter hängt dan ein “Merker”, welcher dann nach der Logik 30 Sekunden nach Miniserver-Neustart dauerhaft einschaltet.

Diese Logik nutze ich an vielen Stellen und pflege sie deshalb auch nur einmal zentral, deshalb auch die Nutzung des Merkes. Für nachfolgende Abbildung habe ich die Bausteine aber einmal zur Erläuterung auf den selben Arbeitsbereich gezogen.

Der Merker triggert dann einen “Monoflop” (0,02s Ausgangsimpuls) und dieser wiederum den oben definierten virtuellen Ausgang, welcher den Neustart der Node-RED-Flows bewirkt. Wer genau hinsieht, entdeckt links oben auch noch einen virtuellen Eingang namens “Node-RED Restart…”. Diesen habe ich eigentlich nur Anfangs testweise in der Visualisierung genutzt, um den Trigger manuell auslösen zu können. Da alles schon seit Monaten zuverlässig funktioniert, könnte ich diesen aber auch mal entfernen.

Aus meinem täglichen Leben

Lange habe ich nach einem halbwegs eleganten Weg gesucht, um das anfangs genannte Problem der dauerhaften Verbindungsabbrüche in den Griff zu bekommen. Aber nirgends im Netz habe ich auch nur eine halbgare Lösung dafür finden können. Komisch eigentlich, wenn man bedenkt, dass ich nicht der Einzige bin, der diese Kombination nutzt.

Die vorgestellte Lösung könnte man auch als etwas umständlich bezeichnen, aber mir ist nichts Besseres eingefallen, was wirklich auch dauerhaft funktioniert hat. Jedenfalls bin ich mit der Lösung jetzt total zufrieden, da dauerhafte Verbindungsabbrüche jetzt kein Thema mehr sind und insbesondere auch meine aggregierten Logging-Daten zwecks Stromproduktion und -verbrauch locker flockig vom Loxone-System über Node-RED in der InfluxDB landen, um in Grafana schick visualisiert zu werden. Hier mal noch ein kleiner Teaser, was ich die letzten Wochen hier so gebastelt habe. (Detaillierte Vorstellung folgt…)

Alle Dienste (FHEM, Node-RED, InfluxDB, Grafana, etc.) laufen übrigens per ProxMox in getrennten virtuellen Maschinen auf dem oben erwähnten Intel NUC8i3BEH (Affiliate-Link), welchen ich jetzt auch schon einige Monate in Betrieb habe. Damit möchte ich jetzt auch nach und nach alle meine im Haus verteilen RaspberryPi-Systeme ersetzen, die sich im Laufe der Jahre so angesammelt haben. Genug Power hat der Intel NUC dafür jedenfalls – wenn das Umziehen nur schneller gehen würde…

14 Kommentare
  1. Super ausführliche Anleitung Jörg. Danke dir!
    Ich frage mich, ob du sowas auch mit einer “Heartbeat” Lösung hinbekommen hättest. Sprich: Loxone triggert alle X-Minuten was am Node-Red, was wiederum einen Input bei Loxone triggert. Wenn bei Loxone nix mehr kommt für X Heartbeats -> Restart

    Das würde dann auch andere Unterbrechungen außer Reboots vom Miniserver direkt fixen.

    Bin aber absolut kein Experte auf dem Gebiet von Loxone und Node-Red.
    Bisher nur ein “Interessent” 😉

    Nur so als Idee.

    Gruß
    Simon

    1. Hi Simon!
      Dein Ansatz gefällt mir gut – glaube das werde ich nachrüsten.
      Alle 60 Sekunden einen Impuls über die Schnittstelle von NodeRED an einen virtuellen Eingang in Loxone senden und dort eine Ausschaltverzögerung von 121 Sekunden anhängen. Wenn das Signal entsprechend lange ausbleibt, wird der virtuelle Ausgangsbefehl in Loxone befeuert, welcher die Flows in NodeRED neustartet. Technisch easy umzusetzen.

      Viele Grüße und danke nochmal für deinen Denkanstoß
      Jörg

  2. Gern geschehen. Freut mich wenn es hilft.

    Gleichzeitig kann man das Spiel auch umdrehen und damit in NodeRed überwachen ob der Miniserver noch am Leben ist und gegebenenfalls Benachrichtigungen oder ein Notprogramm starten.

    Mein Plan wäre, dass bei einem längeren Ausfall vom Miniserver, wenigstens die Grundfunktionen wie Licht und Rolläden noch funktionieren.
    Hast du sowas für deine KNX-Geräte mittels Node-Red mal angedacht, bzw. vielleicht sogar eingerichtet?

    Gruß
    Simon

    1. True! Genau so ein Notfallszenario wollte ich auch schon lange mal umsetzen, um die per KNX angebundenen Dimmer und Aktoren zu steuern, welche für die Beleuchtung zuständig sind. Da die Wandtaster auch per KNX eingebunden sind, könnte man die Verknüpfung zwischen Sensor und Aktor natürlich auch dynamisch per NodeRED übernehmen, sofern der Miniserver kein Lebenszeichen mehr von sich gibt. Dann hätte man eben keine Lichtszenen/-stimmungen mehr, könnte aber zumindest immer noch ein- und ausschalten. Bisher hatte ich aber ehrlich gesagt noch keinen wirklichen Druck, da der Miniserver bisher – auf Holz klopf – noch nie im laufenden Betrieb abgeschmiert ist. Werde ich aber sicher noch irgendwann realisieren – spätestens nach dem ersten Totalcrash… 😀

      Viele Grüße
      Jörg

  3. Hallo zusammen, ich habe leider ein größeres Problem. Ich habe meinen Miniserver mit Node Red verbunden und konnte so seither problemlos über Alex alles steuern. Jetzt habe ich auf Node red leider ein Update gemacht und nun kann ich mich mit dem Miniserver nicht mehr verbinden. Kann ich die ältere Version wieder herstellen oder wie kann ich mich mit der neuen Version verbinden?

  4. Sag mal Jörg, wie nimmst du denn den Startimpuls ab? Also woher bekommst du den Impuls wenn der Miniserver neu gestartet wurde?
    Ich meine mal irgendwo so eine Statusmeldung gesehen zu haben… aber wo…?

    Viele Grüße
    Leo

  5. Top Beschreibung – klasse!

    Gibt es auch die Möglichkeit mit dem Befehl nur eine bestimmte Node neu zu starten?
    Betreibe bei mir mehrere Schnittstellen und ich möchte aber nur die, die zu Loxone führen, neu starten.

    Besten Dank!
    Marco

  6. Hallo Jörg,
    vermutlich bin ich hier nicht ganz an der richtigen Stelle, konnte aber im I-Net dazu nicht wirklich was passendes finden. Und aufmerksam bin ich auf das Thema durch Deinen super Blog geworden.
    Ich hab seit kurzem die CCU3 im Einsatz und RaspberryMatic draufgepackt. Dann noch RedMatic installiert und wollte nun in RedMatic die Loxone-Palette installieren. Doch leider erhalte ich eine Fehlermeldung.
    (Code 128, Command Faild, Command: git ls-remote ssh://git@github.com/codm/node-lox-ws-api.git
    In der Node-Information heißt es, es müsse Git installiert sein.
    Liegt es daran?
    Aber wie installiere ich Git auf der CCU3? Dazu find ich leider überhaupt nix.
    Über SSH mit Root-Login und sudo-installations-Befehl hab ichs schon versucht, da heißt es nur: sudo – not found.
    Kannst Du mir evtl. “auf die Sprünge helfen”, wie ich die Loxone-Palette in mein RedMatic bekomme?

    1. Schade, dass ich nicht mal eine kleine/kurze Antwort bekommen hab. Dachte zunächst, dass hier nichts mehr gepostet wird und deshalb keine Antwort kommt. Scheint aber nicht so zu sein.
      Naja … keine Antwort ist auch eine Antwort.
      Dann halt nicht.

  7. Hallo Jörg
    Ich arbeite mich aktuell mit Loxone und Node red auf einer Homematic (Raspberrymatic installiert) ein. Eigentlich funktioniert alles sehr gut. Ich verstehe einfach noch nicht genau, wann die Datenstruktur von Loxone an Node Red weitergegeben werden. Wenn ich in Loxone einen neuen Virtuellen Eingang definiere, welcher dann von Node Red angesteuert wird, dauert es immer relativ lange, bis ich in Node Red den neuen Virtuellen Eingang sehen. Kann dieser Datenabgleich erzwungen werden?
    Danke für eine Rückmeldung.
    Urs

    1. Hi Urs,
      nachdem der Miniserver neugestartet wurde (mit den neu definierten virtuellen Eingängen), braucht NodeRed eine gewisse Zeit (max eine Minute), bis die Verbindung zum Miniserver wieder hergestellt wird. Dann sollten die neuen Komponenten erkannt werden… Hatte da bisher keine Problem.

      Viele Grüße
      Jörg

  8. Hallo Jörg
    Danke für die Antwort. Es scheint so, als ob es mit dem Virtuellen Texteingang etwas länger dauert. Die anderen funktionieren relativ zeitnah. Und ….. Übung macht den Meister.
    Besten Dank für Deine Arbeit.
    En Gruess
    Urs

Schreibe einen Kommentar zu Marco Antworten abbrechen

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

Das könnte dir auch gefallen