MQTT Gateway - Alle FHEM-Readings weitergeben

Um generisch alle Readings von FHEM an den MQTT-Broker weiterzugeben (z.B. Daten von EnoceanPi), kann diese Minimalkonfiguration verwendet werden:


define lb_mosquitto MQTT loxberry:1883 loxberry <deinMQTTPasswort>
define mqttGeneric MQTT_GENERIC_BRIDGE
attr mqttGeneric IODev lb_mosquitto
attr mqttGeneric globalDefaults sub:qos=2 pub:qos=0 retain=1
attr mqttGeneric globalPublish *:topic={"fhemwohnzimmer/$device/$reading"}

Kurz-Beschreibung:

Zeile 1: lb_mosquitto ist der Name der Verbindung, und loxberry:1883 der Hostname:Port des Brokers am LoxBerry. Dahinter der Benutzer und das Passwort des MQTT-Brokers (siehst du im Plugin unter MQTT-Broker)

Zeile 2: Das GENERIC_BRIDGE Plugin wird definiert

Zeile 3: Der generischen Bridge wird die Verbindung zugeordnet

Zeile 4: Es wird mit retain=1 an den Broker übergeben, d.h. das LoxBerry MQTT Gateway erhält bei einem Neustart die letzten Daten

Zeile 5: Es wird * (alles) an das Topic fhemwohnzimmer/device/reading übergeben. Die Topicbezeichnung fhemwohnzimmer ist dabei frei wählbar. Sie sollte eindeutig sein - und muss konsequent verwendet werden.


Im LoxBerry MQTT Gateway folgende Subscription erstellen: fhemwohnzimmer/#

Mit Filter-Attributen in mqttGeneric können die übermittelten Readings eingegrenzt werden (z.B. nur Temperatur), siehe Doku.


Dokumentation des FHEM mqttGeneric Moduls: https://fhem.de/commandref_DE.html#MQTT_GENERIC_BRIDGE

Problem mit dem MQTT Modul

Bei einem Benutzer analysierte ich das Verhalten, dass die MQTT-Verbindung von FHEM durchgehend geöffnet und geschlossen wurde (zick mal pro Sekunde). Das Problem war, dass die Credentials initial falsch eingegeben wurden. Durch einen Bug in FHEM/MQTT werden bei einem erneuten define lb_mosquitto MQTT in der fhem.cfg die neuen Zugangsdaten nicht übernommen.

Lösungsweg:

  • An der Shell anmelden (Eine SSH-Verbindung mit putty aufbauen / Shell-Zugriff)
  • Zu root machen: su
  • cd /opt/fhem/FHEM/FhemUtils (bei alten Versionen des FHEM-Plugins: /opt/loxberry/data/plugins/fhem/FHEM/FhemUtils)
  • nano uniqueID
  • In der Datei befinden sich sämtliche Zugangsdaten, die du in der fhem.cfg definiert hast. Prüfe den Benutzernamen und das Passwort bei den Einträgen von lb_mosquitto, dass diese mit den Daten im MQTT Gateway Plugin übereinstimmen.
  • In nano speicherst du mit Strg-X ("Änderungen speichern?") und J ("Ja").
  • Danach FHEM neu starten und prüfen, ob die Verbindung nun offen ist (nicht mehr "flackert").

Nur die Readings aus einem bestimmten Raum übergeben

Damit nicht global alle Geräte senden, besteht die Möglichkeit durch einen Raum (z.B. MQTT) eine Art Filter anzulegen. Also nur die Geräte die sich im Raum MQTT befinden, senden dann noch an den Miniserver.

Dazu wird der folgende Befehl in die Commandozeile von FHEM eingegeben:

defmod mqttGeneric MQTT_GENERIC_BRIDGE mqtt room=MQTT


Rückgängig machen, um wieder alle Geräte, aus allen Räumen zu übergeben:

defmod mqttGeneric MQTT_GENERIC_BRIDGE


FHEM-Dienststatus per MQTT publishen

Der Status von FHEM selbst kann auf diese Weise an den Broker übergeben werden:


attr lb_mosquitto last-will retain:1 fhemwohnzimmer/connection/status disconnected
attr lb_mosquitto on-connect retain:1 {Log3("mqtt",3,"connected to MQTT server");;1} fhemwohnzimmer/connection/status connected
attr lb_mosquitto on-disconnect retain:1 {Log3("mqtt",3,"disconnected from MQTT server");;1} fhemwohnzimmer/connection/status disconnected

Man kann 'connected' und 'disconnected' dann mit Conversions in Zahlen übersetzen (z.B. 1 und 0), oder man übergibt statt 'connected' und 'disconnected' direkt die entsprechenden Zahlen.