Im Zuge meiner Umstellung einiger Sensoren auf MQTT habe ich mich mal damit befaßt, wie man die Daten eines GPS-Empfänger einlesen und in einen MQTT Broker schreiben kann. Ich wollte dazu Node-Red benutzen, um die Daten dann noch weiterverarbeiten zu können.
NMEA Daten zu parsen, muß wirklich nicht einfach sein. Eric. S. Raymond echauffiert sich in seinem Blogpost “Why GPSes suck” sehr über die Hersteller und die NMEA, die es nicht geschafft haben, ein vernünftiges und leicht nutzbares Datenprotokoll zu schaffen (Raymond 2009) und (Raymond [kein Datum]). Das Paket gpsd nimmt einem alle Probleme ab und erkennt einen angesteckten GPS-Empfänger automatisch. Als Ausgabeformat wird JSON verwendet, was ebenfalls ideal für diese Aufgabenstellung ist.
Für Node-Red gibt es die Erweiterung node-red-contrib-gpsd, die als Konfiguration nur die Adresse des Dämons benötigt. Da Node-Red bei mir unter Docker läuft, ist dies nicht localhost, sondern das Gateway des Docker-Subnetzes. Normalerweise ist gpsd so konfiguriert, das es nur unter localhost angesprochen werden kann. Unter Systemd-Troubleshooting ist erläutert, wie das zu ändern ist. Mit einem “function-node” kann man jetzt die unterschiedlichen Daten in eine Variable ablegen und über die verschiedenen Ausgänge geht es dann zu den MQTT-out Nodes, bei denen dann nur noch das passende Topic zu wählen ist. Die Geschwindigkeit wir als Kilometer/h umgerechnet und gerundet und “mode” in ein leichter lesbares Format gewandelt.
Die Autokofiguration für HomeAssistant erledigt man jetzt am besten auch gleich in Node-Red. Mit Hilfe eines Inject-Nodes kann man alle nötigen Informationen übergeben, damit HA den Sensor automatisch einbinden kann. Das ist auch nicht nennenswert mehr Aufwand, als die Konfiguration in einer mqtt.yaml zu sammeln. Man muß auch nicht immer beim ausprobieren HA neustarten.
{
"name": "Geschwindigkeit",
"device_class": "speed",
"state_topic": "home/gpsd/speed",
"unique_id": "raspiwowa_linux_gpsd_speed",
"unit_of_measurement": "km/h",
"icon": "mdi:speedometer",
"device": {
"identifiers": "raspiwowa_gpsd",
"name": "RaspiWoWa GPS",
"model": "Navilock"
}
}
Der Flow kann heruntergeladen werden.
