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

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

FHEM-Kurs

Dir gefällt dieses Video? Dann abonniere meinen Kanal, um in Zukunft kein Video mehr zu verpassen!

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.


Newsletter

Falls Dir dieser Beitrag gefallen hat, würde ich mich sehr freuen wenn Du Dich in meinen Newsletter einträgst.

Über diesen Weg verpasst Du keine Inhalte, bekommst jede Menge wertvolle Tipps und Informationen um Dein Zuhause smarter zu gestalten.

Matthias Kleine

Matthias Kleine

Großer Fan und Anhänger von OpenSource-Projekten und erweiterbare Haus-Automatisierungskomponenten. Je offener und flexibler das System, desto besser. Ich lege mich ungern auf einzelne Protokolle oder Standards fest, sondern probiere aus allen Welten das Beste zu verheiraten. Hauptberuflich Softwareentwickler und Blogger, sowie Trainer im Bereich Smart Home mit FHEM.


** Wenn Du über einen dieser Links etwas kaufst, bekommen wir eine kleine Provision von Amazon. Das Produkt wird dadurch natürlich NICHT teurer.