Ich hatte ja schon mal beschrieben, wie man die Daten des LTE-Routers nach HomeAssistant bekommt. Eigentlich war ja das Ziel, die Daten zuerst über MQTT zu lesen und dann in HA anzuzeigen. Mit Node-Red habe ich jetzt noch mal einen neuen Anlauf gestartet. Dieser Flow macht genau das, und funktioniert auch, aber die Daten, die der RUT950 über MQTT bereitstellt, sind begrenzt. Mehr Informationen lassen sich über Modbus holen, aber nur mit deutlich höherem Aufwand. Da aber viele Geräte wie z.B. Photovoltaiklader ihre Daten über RS485 und Modbus bereitstellen, könnte das für manche interessant sein. Da ich inzwischen JSON schätzen gelernt habe, war das Ziel, die Daten so zum MQTT-Broker schicken zu können.
Modbus – egal ob über RS232/485 oder über TCP – funktioniert so, das man dem Server eine Anfrage schickt und ihm sagt, ab welcher Adresse man Daten haben möchte, und wieviele Register. Jedes Register entspricht 16 Bit, für eine 32Bit Zahl muß man also 2 Register lesen (Modbus Grundlagen (2014); WuT Modbus-TCP Hintergrundwissen ([kein Datum])). Für einen String dann halt so viele Register, wie der String Zeichen hat. Ein Modbus-Node in Node-Red gibt natürlich keine Zahlen oder Strings aus, sondern so viele einzelne Daten, wie man halt angefordert hat. Die muß man dann weiterverarbeiten. Maximal lassen sich 125 Register auf einmal lesen. Die Implementierung ist aber von Gerät zu Gerät unterschiedlich, und niemand garantiert einem dies. Wie wir sehen werden, stimmt das auch. Zum Auswerten der Daten gibt es das Paket node-red-contrib-buffer-parser. Man liest den interessierenden Registerbereich aus und konfiguriert im Node die Bereiche und die Datentypen:
Leider funktioniert das Auslesen am Stück bei meinem RUT950 nur für die ersten 125 Register. Man kann dann nicht einfach die nächsten 125 Register auslesen und bei Register 126 beginnen, da bekommt man eine leere Antwort. Es klappt aber mit Auslesen von bis zu 16 Registern, so daß ich für die Werte aus höheren Registern eigene Abfragen erstellt habe. Über einen Join-Node – dem man natürlich mitgeben muß, auf wieviele Daten er warten soll – faßt man alle Pakete zusammen, wandelt sie in JSON, et voilà, fertig. Die Auswertung in Homeassistant ist dann einfach, man muß in der Autoconfiguration nur über value_json angeben, welchen Wert man für den Sensor ausgewertet haben möchte.
{
"name": "Teltonika - Mobile Signal Strength",
"state_topic": "technik/rut950/data",
"value_template": "{{ value_json.signal }}",
"unique_id": "Teltonika_Mobile_Signal_Strength",
"unit_of_measurement": "dBm",
"device_class": "signal_strength",
"icon": "mdi:signal",
"device": {
"identifiers": "rut950",
"name": "Teltonika-RUT950",
"model": "RUT950"
}
}
Kleine Bitte an alle Firmen: Wenn schon MQTT, dan gleich alle Daten als JSON ausgeben. Das macht es für alle einfacher. Den Flow habe ich wieder zum Download bereitgestellt.
