HowTo: FHEM – MQTT Geräte anlegen

In dem Artikel RaspberryPi – MQTT Server auf dem RaspberryPi installieren hatte ich ein wenig zu MQTT geschrieben und erklärt wie man einen eigenen MQTT Server auf dem RaspberryPi installiert.

Damit ihr einen MQTT Server auch aus FHEM heraus nutzen könnt, müsst ihr allerdings noch ein paar FHEM-Module installieren. Wie das geht und worauf Ihr dabei achten müsst habe ich in dem folgendem Artikel beschrieben.


Sicherheitshinweise

Ich weiß die folgenden Hinweise sind immer irgendwie lästig und wirken unnötig. Aber leider haben schon viele Menschen die es "besser" wussten aus Leichtsinnigkeit Augen, Finger oder anderes verloren bzw. sich verletzt. Im Vergleich dazu ist ein Datenverlust fast nicht der Rede Wert, aber auch diese können echt ärgerlich sein. Deswegen nehmt Euch bitte fünf Minuten Zeit um die Sicherheitshinweise zu lesen. Denn auch das coolste Projekt ist keine Verletzung oder anderen Ärger wert.
https://www.nerdiy.de/sicherheitshinweise/

Affiliatelinks/Werbelinks

Die hier in aufgeführten Links zu Online-Shops sind sogenannte Affiliate-Links. Wenn Du auf so einen Affiliate-Link klickst und über diesen Link einkaufst, bekommt Nerdiy.de von dem betreffenden Online-Shop oder Anbieter eine Provision. Für Dich verändert sich der Preis nicht. Falls Du Deine Einkäufe über diese Links tätigst unterstützt Du Nerdiy.de dabei auch in Zukunft weitere nützliche Projekte anbieten zu können. 🙂 


Voraussetzungen

Bevor ihr mit diesem Artikel startet solltet ihr den RaspberryPi soweit vorbereitet haben, dass dieser über das Netzwerk erreichbar und per SSH Steuerbar ist.

Die folgenden drei Artikel beschreiben was zu tun ist um den RaspberryPi soweit vorzubereiten:
RaspberryPi – Einrichten für Nerdiys!
RaspberryPi – Die Erste Konfiguration!
RaspberryPi – Den RaspberryPi über SSH steuern
Das eigene Smart-Home – Installation und Einstieg in FHEM
Mosquitto auf der Himbeere – MQTT Server auf dem RaspberryPi installieren

Benötigte Werkzeuge:
-keins-

Benötigte Materialien:

In der folgenden Liste findet Ihr alle Teile die Ihr zur Umsetzung dieses Artikels benötigt.


Per SSH auf dem RaspberryPi einloggen

Um zu beginnen müsst Ihr Euch als erstes mit Putty per SSH auf dem RasPi einloggen. Wie das geht ist im Artikel RaspberryPi - Den RaspberryPi über SSH steuern beschrieben.

Nach der Eingabe Eures Benutzernamen und Passworts könnt Ihr die ersten Befehle eingeben.

Paketverwaltung aktualisieren

Die Paketverwaltung in Linux ist eine "zentrale Stelle" über die sich diverse Software-Pakete installieren lassen. Damit dies zuverlässig funktioniert sollten vor jeder Installation von neuen Paketen die Listen und Quellen der Paketverwaltung aktualisiert werden.

Um das Update der Paketverwaltung zu starten müsst ihr folgenden Befehl eingeben.
sudo apt-get update && sudo apt-get upgrade
Je nachdem wie lange Euer letztes Update der Paketverwaltung her ist kann dieser Vorgang nun etwas dauern. Dabei werden zuerst die Listen aktualisiert in denen auf die einzelnen Paketquellen verwiesen wird.
Danach werden die Pakete selber aktualisiert. Da dabei zusätzlicher Speicher belegt wird, werdet Ihr nochmal nach Eurem Einverständnis gefragt. Dies müsst Ihr mit einem "J" und "Enter" bestätigen.
Ist die Aktualisierung abgeschlossen wird euch eine kleine Zusammenfassung über die Dauer und den Umfang des Updates angezeigt.

Perl MQTT Pakete installieren

Damit FHEM mit dem MQTT Server kommunizieren kann, müssen zwei Perl Paket installiert werden.

Dazu müsst ihr euch mit Putty auf dem RasPi einloggen und folgenden Befehl eingeben.
sudo apt-get install libmodule-pluggable-perl && sudo cpan install Net::MQTT:Simple && sudo cpan install Net::MQTT:Constants
Die Warnung, dass dadurch zusätzlicher Speicherplatz belegt wird quittiert Ihr mit einem “J” und “Enter”.

Die Nachfrage “Would you like to configure as much as possible automatically? [yes]” bestaetigt ihr mit “yes” und Enter.
Die Installation der beiden Pakete hat bei mir ca. fünf Minuten gedauert. Also Zeit genug um sich einen neuen Kaffee zu holen. 🙂


MQTT-Clienten anlegen

Um im nächsten Schritt eine Verbindung mit einem MQTT-Device aufbauen zu können muss nun zuerst ein MQTT-Client angelegt werden. Dadurch wird später notwendige zur Verbindung mit dem MQTT-Server gespeichert.

Gebt dazu den folgenden Befehl in die Befehlseingabe Eurer FHEM-Instanz ein.
define mqttClient MQTT 192.168.0.1:1883

Der Befehl zum erstellen eines MQTT-Clienten entspricht dabei der folgenden “define Name-des-mqtt-clienten MQTT host-oder-ip-des-mqtt-servers:port-des-servers”. Hat Euer MQTT-Server also die IP-Adresse “192.168.0.1”, den Port 1883 was dem Standardport für MQTT entspricht) so lautet der Befehl zum erstellen des MQTT-Clienten “define mqttClient MQTT 192.168.0.1:1883”. Dabei kann für “mqttClient” natürlich auch jeder andere beliebige Name verwendet werden.

Klickt nun oben links auf “Save config” und startet Euren FHEM-Server mithilfe des folgenden Befehls neu.
shutdown restart

Nachdem der Server neu gestartet ist, seid Ihr so weit neue MQTT-Bridges und -devices anzulegen.

Ansicht des neu angelegten MQTT-Clienten. Hier könnt Ihr sehen ob eine Verbindung zum MQTT-Server hergestellt werden konnte. Außerdem werde Euch noch weitere Infos zu der Verbindung mit dem MQTT-Server angezeigt.
Damit die gemachten Änderungen übernommen und dauerhaft gespeichert bleiben müsst Ihr unbedingt daran denken auf “Save config” zu klicken. Dadurch werden die geänderten Einstellungen dauerhaft in der Konfigurationsdatei gespeichert.

MQTT-Bridge einrichten am Beispiel eines MAX!-Heizungsthermostats

In diesem Beispiel legen wir eine MQTT-Bridge an. Wie der Name schon erahnen lässt verbindet die MQTT-Bridge etwas miteinander. In diesem Fall den MAX!-Heizungsthermostat mit der MQTT-Welt. Diese Verknüpfung funktioniert prinzipiell nach dem gleichen Schema mit allen bereits installierten Sensoren oder Aktoren. Im Fall des MAX! Heizungsthermostats funktioniert dies geht mit folgendem Befehl.

Die Struktur des Befehls ist dabei wie folgt aufgebaut “define Name-der-mqtt-bridge MQTT_BRIDGE Name-des-sensors-bzw-aktors”. Im Fall des MAX! Heizungsthermostats mit dem Namen “MAX_15504f” lautet der Befehl also folgendermaßen.
define HeizungArbeitszimmerMqtt MQTT_BRIDGE MAX_15504f

Dadurch wird das Modul “HeizungArbeitszimmerMqtt” vom Typ “MQTT_BRIDGE” angelegt und mit dem bereits vorhandenen Modul “MAX_15504f” verknüpft.

Die erstellte MQTT_BRIDGE befindet sich nun im Raum “Unsorted”. Wechselt in diesen Raum und öffnet die Detailansicht der erstellten MQTT-Bridge.
In der Detailansicht könnt Ihr nun alle Infos zu der erstellten MQTT-Bridge sehen. Bevor die MQTT-Bridge allerdings Daten vom MAX!-Heizungsthermostat mit der MQTT-Welt verbinden kann, muss es zunächst wissen welches Reading des Heizungsthermostats mit welchem MQTT-Topic verknüpft werden soll.

Dazu gibt es das Attribut “publishReading_XYZ”. Dieses bewirkt, dass die MQTT-Bridge alle Aktualisierungen auf dem Reading “XYZ” automatisch an das angegebene Topic weitergeleitet wird.

Gebt also folgenden Befehl in die Befehlseingabe Eurer FHEM-Instanz ein um automatisch jede aktualisierung des Readings “temperature” an das Topic “heizung/Arbeitszimmer/temperature” weiterleiten zu lassen.
attr HeizungArbeitszimmerMqtt publishReading_temperature heizung/Arbeitszimmer/temperature

Achtet hierbei darauf, dass “publishReading” und “temperature”(das reading des Heizkörperthermostats(oder jedes anderen Sensors/Aktors)) mit einem Unterstrich verbunden sein müssen. So ergibt sich “publishReading_temperature”.
Für das Reading “Battery” würde das ganze dann folgendermaßen aussehen.

attr HeizungArbeitszimmerMqtt publishReading_battery heizung/Arbeitszimmer/battery
Dies Verknüpfung von Reading und MQTT-Topics funktioniert aber auch andersherum. Damit Werte die an ein MQTT-Topic gesendet werden automatisch in ein Reading des Heizungsthermostats eingetragen werden, müsst ihr folgendes Attribut setzen.
attr HeizungArbeitszimmerMqtt subscribeSet_desiredTemperature heizung/Arbeitszimmer/desiredTemperature

Dies bewirkt, dass das Topic “heizung/Arbeitszimmer/desiredTemperature” aboniert wird und jeder darauf eingehender Wert automatisch in das Reading “desiredTemperature” eingetragen wird. Auf diesem Wege könnt Ihr die gewünschte Temperatur des Heizungsthermostats per MQTT-Nachricht steuern.

Die Detailansicht Eurer MQTT-Bridge sollte nun so aussehen. Ihr seht unter Attributes alle verknüpften Reading/MQTT-Topic Kombinationen. Denkt wieder daran diese Änderung der Konfiguration durch einen Klick auf “Save config” abzuspeichern.

Testen der eingestellten MQTT-Bridge

Eine Möglichkeit die frisch erstellte MQTT-Bridge testen zu können, ist hier beschrieben.

Dazu habe ich in NodeRed einen Mini-MQTT-Viewer gebastelt, der Euch die Werte anzeigt die an die eingestellten Topics “heizung/Arbeitszimmer/temperature” und “heizung/Arbeitszimmer/battery” gesendet werden. Außerdem habt ihr die Möglichkeit an das Topic “heizung/Arbeitszimmer/desiredTemperature” den Wert 25 zu senden. Dies hat zur Folge, dass – sollte alles korrekt funktionieren – der verknüpfte Heizkörperthermostat auf 25°C gestellt wird.

Zuerst prüfen wir nun ob der Empfang und die Übernahme von per MQTT empfangenen Werten funktioniert. Wechselt dazu in den Raum “MAX” und dann in die Detailansicht des jeweiligen Heizungsthermostats.
In der Detailansicht scrollt Ihr nun runter bis Ihr das Reading …

… “desiredTemperature” findet. Dies ist das Reading, dass wir in der Konfiguration der MQTT-Bridge mit dem MQTT-Topic “heizung/Arbeitszimmer/desiredTemperature” verknüpft haben. Hier werden euch außerdem der aktuelle Wert des Readings und der Zeitpunkt der letzten Aktualisierung angezeigt.

Klickt Ihr in dem selbst gebauten MQTT-Viewer nun auf die Inject-Node sendet Ihr damit den Wert 25 an das Topic “heizung/Arbeitszimmer/desiredTemperature”. Dadurch sollte nun also auch das Reading Eures Heizungsthermostats auf den Wert 25 aktualisiert werden. Außerdem wird der Zeitpunkt der letzten Aktualisierung auf den aktuellen Zeitpunkt gesetzt.

Um nun den umgekehrten Weg – also die Veröffentlichung eines geänderten Readings auf ein MQTT-Topic – zu testen genügt es in der Detailansicht des MAX!-Heizungsthermostats nach ganz oben zu scrollen. Dort angekommen ändert Ihr wie abgebildet die gewünschte Temperatur Eures Heizungsthermostats.

Dies löst automatisch eine aktualisierung des Readings “battery” aus. Durch die Verknüpfung der MQTT-Bridge mit dem Topic “heizung/Arbeitszimmer/battery” wird dessen Wert dann wie gewünscht über das Topic veröffentlicht und ist dann über die konfigurierte Debug-Node in Eurer NodeRed-Umgebung sichtbar.

MQTT-Device anlegen am Beispiel eines Temperatursensors

Eine weitere Möglichkeit des MQTT-Moduls ist das Anlegen von MQTT-Devices. Darunter fallen alle Sensoren oder Geräte die ihre Messwerte direkt über MQTT versenden. Damit Ihr diese Werte erfassen und in einem virtuellen Sensor zusammenfassen könnt, müsst Ihr ein MQTT-Device anlegen.

In diesem Beispiel haben wir in unserem Netzwerk einen Temperatursensor, der in regelmäßigen Abständen den gemessenen Temperaturwert per MQTT-Topic “Umgebungsdaten/keller/Temp” versendet. Um diesen nun zu erfassen wird zuerst mit folgendem Befehl ein MQTT-Device angelegt.

define kellerSensor MQTT_DEVICE
Der Befehl setzt sich dabei wieder wie folgt zusammen “define Name-des-Mqtt-Devices MQTT_DEVICE”. Da wir in diesem Beispiel einen Temperatursensor einbinden der sich im Keller befindet nennen wir das MQTT_DEVICE “kellerSensor. Der komplette Befehl zum erstellen des MQTT_Devices lautet also “Umgebungsdaten/keller/Temp”.
Nach dem Ihr das MQTT_Device erstellt habt findet Ihr diesen im Raum “Unsorted”. Darüber könnt Ihr auch die abgebildete Detailansicht öffnen.

Bevor dieses MQTT_Device nun Werte anzeigen kann muss es natürlich zuerst mit dem gewünschten MQTT-Topic verknüpft werden. In diesem Beispiel wollen wir alle auf dem MQTT-Topic “Umgebungsdaten/keller/Temp” eingehenden Werte im erstellten MQTT-Device anzeigen lassen.

Dazu müsst Ihr folgendes Attribut setzen:

attr kellerSensor subscribeReading_Temp Umgebungsdaten/keller/Temp

Dies bewirkt, dass im erstellten MQTT_Device “kellerSensor” das Reading “Temp” erstellt und mit dem abonierten Topic “Umgebungsdaten/keller/Temp” verknüpft wird.

In der Ansicht der Readings taucht nun also auch das Reading “Temp” mit dem aktuellen bzw. zuletzt empfangenen Wert und dem Datum der letzten Aktualisierung auf.

Um die Ansicht nun noch etwas aufzuhübschen könnt Ihr mit folgendem Attribut angeben, dass dem Wert des Readings Temp ein “°C” angehängt werden soll.

attr kellerSensor stateFormat Temp °C
Gebt dazu den Befehl “attr kellerSensor stateFormat Temp °C” in die Befehlszeile Eurer FHEM-Instanz ein.
Dadurch wird die aktuelle Temperatur des “kellerSensors” nun auch mit einem “°C” versehen und es ist direkt ersichtlich, dass es sich dabei um einen Temperaturwert handelt.

Weitere Informationen

https://wiki.fhem.de/wiki/MQTT_Einf%C3%BChrung


Viel Spaß mit dem Projekt

Ich hoffe bei euch hat alles wie beschrieben funktioniert. Falls nicht oder ihr Fragen oder Anregungen habt lasst es mich in den Kommentaren bitte wissen. Ich trage dies dann ggf. in den Artikel nach.
Auch Ideen für neue Projekte sind immer gerne willkommen. 🙂

P.S. Viele dieser Projekte - besonders die Hardwareprojekte - kosten viel Zeit und Geld. Natürlich mache ich das weil ich Spaß daran habe, aber wenn Du es cool findest, dass ich die Infos dazu mit Euch teile, würde ich mich über eine kleine Spende an die Kaffeekasse freuen. 🙂

Buy Me a Coffee at ko-fi.com       

Ein Kommentar

  1. Hi Fab
    Thank you so much for all of the information you have made available here. I have spent many years with homeassistant, and no time at all with FHEM which I am now using to try to get better control of my FHT heating devices. If I can get FHEM communicating with an existing MQTT server that would be my dream.

    I have FHEM running on Raspian OS within a docker container, the install went as per your advice with no errors – but when I try to enter the commands via FHEM web front end I get Cannot load module MQTT_BRIDGE or Cannot load module MQTT_CLIENT which makes me think either I’ve messed up not installing the perl/mqtt from within the docker container or I’ve not done something within FHEM to invoke the new MQTT capability?

    Kind Regards

    Nick

Kommentar hinterlassen

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.