Node-RED Tutorial-Reihe - Part 5: Befehle in FHEM per MQTT ausführen

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

Node-RED Tutorial-Reihe - Part 5: Befehle in FHEM per MQTT ausführen
Node-RED Tutorial-Reihe - Part 5: Befehle in FHEM per MQTT ausführen
  • 06.01.2018
  • MQTT

Im vorigen Teil dieser Reihe bin ich ja schon darauf eingegangen, wie man sehr generisch in MQTT-FHEM Nachrichten erzeugen kann, ohne dafür hunderte Geräte anlegen zu müssen. Die Idee kam wohl so gut an, dass dies sogar im Forum diskutiert wurde und dafür bereits ein einges Modul gebaut wird. Freut mich doch immer, wenn ich helfen kann. Jedenfalls fehlte mir jetzt noch der Rückweg. Heißt: Ich wollte über MQTT auch ganz normale Befehle in FHEM ausführen, um dann zum Beispiel Lampen schalten zu können. In diesem Video stelle ich dafür meine Lösung vor und wir bauen dann auch direkt einen Schalter auf das Node-RED Dashboard um die Funktionsweise zu demonstrieren.

Was wird benötigt?

  • Einen Raspberry Pi mit Raspbian (in diesem Fall Stretch, sollte mit älteren Versionen aber genauso klappen)
  • Eine Node-RED-Installation
  • Eine FHEM-Installation

Video

ioBroker-Kurs

Befehle

Als erstes definieren wir ein Gerät, welches auf einem bestimmten Pfad lauscht, um die Befehle entgegen zu nehmen.

define SYS_MQTT MQTT_DEVICE
attr SYS_MQTT userattr subscribeReading_cmnd
attr SYS_MQTT alias MQTT-Command
attr SYS_MQTT room 99_System,MQTT
attr SYS_MQTT subscribeReading_cmnd /Service/fhem/cmnd

Mit einem Notify reagieren wir dann auf Änderungen des Readings “cmnd”. Die Daten die dann kommen, werden einfach ganz stumpf an die Perl-Funktion fhem() übergeben, welche daraus dann einen Befehl macht. So verhält sich MQTT dann praktisch genauso, als wenn man den Befehl direkt in die Befehlszeile auf der Weboberfläche eingibt.

define n_SYS_MQTT_cmnd notify SYS_MQTT:cmnd:.* {}

Der Code dabei ist relativ einfach. Wir nehmen alles was nach dem Doppelpunkt kommt und übergeben es an fhem. Ob das klappt können wir natürlich in diesem Fall nicht per MQTT zurückübermitteln.

SYS_MQTT:cmnd:.* {
	if ($EVENT =~ qr/.*?: (.*)/p) {
		my $cmnd = $1;
		Log3($NAME, 5, "executed mqtt command: " . $cmnd);
		fhem($cmnd);
	}
}

Natürlich kann in diesem Beispiel ALLES ausgeführt werden. Also nicht nur set oder setreading, sondern eben auch define, attr und so weiter. Das heißt, dass man über MQTT eine vollständige Schnittstelle zu FHEM bekommt. Das könnte natürlich ein Sicherheitsrisiko darstellen. Bitte MQTT entsprechend absichern und das Ganze nur implementieren, wenn man allen im Netzwerk auch vertraut. Denn so umgeht man praktisch alle Sicherheitsmechanismen von FHEMWEB.

Für mich ist das jedenfalls eine perfekte Lösung. So konnte ich in wenigen Minuten den Rückweg von Node-RED zu FHEM realieren und jetzt z.B. auch Schalter auf der Weboberfläche realisieren. Zusammen mit dem letzten Video hat man jetzt praktisch eine bidirektionale Verbindung und die Schalzustände auf dem Node-RED-Dashboard ändern sich gemeinsam mit dem Status in FHEM.

Wichtig ist auf jeden Fall, die eingehende Nachricht in Node-RED nicht durchzureichen. Ansonsten erzeugt man eine Endlosschleife und das System wird mit Nachrichten überschüttet und liegt ganz schnell lahm.

Du willst mehr?

Smart-Home-Trainings von A-Z

Steig' noch tiefer in die Themen ein und meistere Deine Projekte! Über 14.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.

ioBroker-Master-Kurs

ioBroker-Master-Kurs

Mehr Infos
Hausbau-Kurs

Hausbau mit KNX

Mehr Infos
Lox-Kurs

Lox-Kurs

Mehr Infos
Node-RED-Master-Kurs

Node-RED-Master-Kurs

Mehr Infos