FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Torxgewinde am 28 März 2018, 22:25:22

Titel: Statusänderungen als MQTT publishen
Beitrag von: Torxgewinde am 28 März 2018, 22:25:22
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:

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