Statusänderungen als MQTT publishen

Begonnen von Torxgewinde, 28 März 2018, 22:25:22

Vorheriges Thema - Nächstes Thema

Torxgewinde

Hallo,
Da ich FHEM in Kombination mit Node-Red nutzen will, hier schonmal ein BASH Snippet mit dem ich mir alle Events an Node-RED via MQTT sende.

Annahmen:

  • Auf Localhost läuft FHEM
  • FHEM hat den Telnetport 7072 und lauscht nur auf "localhost" bzw. "127.0.0.1" ohne Authentifizierung oder TLS. Da es lokal läuft und keine weiteren User auf dem System sind, ist das hier kein Sicherheitsrisiko. Im define vom Telnetserver darf nicht "global" stehen!
  • auf dem Server "server.fritz.box" läuft Mosquitto (der MQTT Broker) mit TLS und Authentifizierung. Ein MQTT Server ohne diese Sicherheitsmaßnahmen ist leider häufig, aber völlig ungesichert.
  • die Zertifikate sind von einer eigenen CA signiert. Das Zertifikat ist in "ca.crt". Let's Encrypt ist in meiner Anwendung nicht interessant, da es ein LAN ohne exponierte Hosts ist.

Dieser BASH-Befehl bzw. Shell-Befehl wird auf dem FHEM Server ausgeführt:
echo "inform on" | nc 127.0.0.1 7072 | xargs -d$'\n' -L1 sh -c 'echo $0 | sed -e "s/\([^ ]*\)[ ]*\([^ ]*\)[ ]*\(.*\)/{\"type\": \"\1\", \"name\": \"\2\", \"value\": \"\3\"}/"' | mosquitto_pub -h server.fritz.box -p 8883 -t "fhem" --cafile ca.crt -u "<Dein MQTT Nutzername>" -P "<Dein MQTT Passwort>" -l -q 2

Letztendlich wird alles, was man auf der Telnetschnittstelle nach dem Befehl "inform on" sieht an den MQTT Server geschickt.

Die MQTT Verbindung ist aufgrund des TLS Handshakes erhaltenswert und wird nur einmal aufgebaut und dann immer wieder für nachfolgende Messages genutzt.

Ich nutze "sed" um die Meldung JSON-konform zu formatieren; das macht die Weiterverarbeitung auf der Node-Red-Seite einfacher. Mit QOS=2 sorge ich dafür, dass Nachrichten nur genau einmal zugestellt werden. Das ist zwar minimal aufwendiger, aber in einem LAN überhaupt kein Thema.

Edit:
Falls der MQTT mal nicht läuft, stirbt der mosquitto_pub Prozess und muss neu gestartet werden. Damit dabei keine Messages verloren gehen kann man es so lösen:
echo "inform on" | nc 127.0.0.1 7072 | xargs -d$'\n' -L1 sh -c 'echo $0 | sed -e "s/\([^ ]*\)[ ]*\([^ ]*\)[ ]*\(.*\)/{\"type\": \"\1\", \"name\": \"\2\", \"value\": \"\3\"}/"' | while true; do mosquitto_pub -h server.fritz.box -p 8883 -t "fhem" --cafile ca.crt -u "<Dein MQTT Nutzername>" -P "<Dein MQTT Passwort>" -l -q 2; sleep 1; done