Grafana-Dashboard für OBD-Daten aus Amazon Timestream

Im ersten Beitrag dieser Reihe wurden der AWS IoT Core und Amazon Timestream konfiguriert und ein Python-Script für den Raspberry PI vorgestellt, dass OBD-Daten über ein ELM327-kompatibles Interface sowie GPS-Daten über NMEA0183 an den AWS IoT Core sendet. Im zweiten Teil haben wir den Raspberry PI so konfiguriert, dass er das Script als Service ausführt und mit einem „Read Only-Filesystem“ läuft, so dass er sich im Auto einfach verwenden lässt. Was noch fehlt, ist eine komfortable Möglichkeit, die Daten aus Amazon Timestream zu visualisieren. Wie das funktioniert, wird in diesem Beitrag vorgestellt.

Verwendete Hardware und Software

Installieren von Grafana

Es gibt zwar auch bei AWS ein Managed Grafana, das ist jedoch relativ teuer. Daher richten wir Grafana auf der lokalen Maschine ein. Für Installation und Start gibt es verschiedene Möglichkeiten: Entweder wird es per apt-Paket installiert und dann z.B. als Service gestartet oder es wird einfach aus einem Archiv in ein Verzeichnis entpackt und von dort gestartet. Für die ersten Tests ist der zweite Weg vorteilhaft. In der offiziellen Grafana-Dokumentation wird das als „Install from binary .tar.gz file“ bezeichnet. In der Dokumentation gibt es einen Link auf die Download-Seite, von der ich die „OSS“-Version installiert habe (nicht Enterprise). Der direkte Download-Link ist hier. Ich habe das Archiv dann in ~/tmp entpackt:

ralph@debian:~/tmp$ tar -xvzf grafana-8.4.4

Als nächstes müsst ihr das Plugin für Amazon Timestream installieren. Da Grafana aus dem .tar.gz-Archiv verwendet wird, könnt ihr dafür nicht einfach das grafana-cli verwenden sondern müsst das passen Archiv von der Amazon Timestream Plugin-Seite herunterladen (z.B. linux-amd64 für den hier verwendeten Debian-Rechner). Anschließend muss das .zip-Archiv entpackt werden und in das Grafana-Plugin-Verzeichnis verschoben werden:

ralph@debian:~/tmp$ unzip grafana-timestream-datasource-1.5.0.linux_amd64.zip
ralph@debian:~/tmp$ mv grafana-timestream-datasource grafana-8.4.4/plugins-bundled/

Danach könnt ihr in das Grafana-Verzeichnis wechseln und von dort Grafana starten:

ralph@debian:~/tmp/grafana-8.4.4$ ./bin/grafana-server web

Nachdem der grafana-server gestartet ist, könnt ihr mit einem Browser die URL: http://localhost:3000 öffnen und ihr landet auf dem grafana-Startbildschirm, siehe unten. Beim Öffnen fragt euch Grafana evtl. nach User und Passwort. Als Standard ist „admin/admin“ vergeben. In Grafana öffnet ihr Configuration->Data Sources und dann „Add data source“, um dann unter „Time Series Database“ Amazon Timestream auszuwählen.

Grafana-Dialog zum Hinzufügen von Datenquellen
Grafana-Dialog zum Hinzufügen von Datenquellen

Das Plugin fragt euch jetzt nach Zugangsdaten für die Amazon Timestream-Datenbank. Um diese zu bekommen, müsst ihr noch einen User in AWS anlegen. Dafür loggt ihr euch in der AWS Management Console ein und öffnet dort Services->Security, Identity & Compliance und dann „IAM“. In dem sich öffnenden Dialog klickt ihr links auf „Users“, damit sich der unten gezeigte Dialog öffnet, und dann auf „Add User“.

"Add User" in AWS Identity and Access Management
Der Dialog zum Hinzufügen eines Benutzers in AWS IAM

Im nächsten sich öffnenden Dialog vergebt ihr einen Benutzernamen (ich habe hier „grafana“ gewählt) und stellt den „credential type“ auf „Access key – Programmatic access“. Der Dialog sollte damit wie folgt aussehen:

AWS Add user - credential type
Einstellen des „credential type“ für den neuen AWS-Benutzer

In den folgenden Schritten 2-4 könnt ihr die Standardwerte übernehmen. Im letzten Dialog (unten dargestellt) werden „Access key ID“ und „Secret access key“ angezeigt. Beides benötigt ihr zum Einrichten von Grafana, also kopiert es euch oder ladet die .csv-Datei herunter. Achtung: Auf den „Secret access key“ habt ihr nur in diesem Dialog Zugriff. Nachträglich lässt sich nur noch ein neuer Key vergeben.

AWS "Add user"-Dialog mit Zugriff auf die security credentials für den neuen Benutzer
Dialog zum kopieren oder herunterladen der security credentials für den neuen AWS-Benutzer

Abschließend müssen dem neu angelegten User noch die benötigten Rechte erteilt werden, um auf die Amazon Timestream-Datenbank zuzugreifen. Dazu wählt ihr wieder das „Users“-Menü links in „IAM“ und klickt dort auf den gerade angelegten User „grafana“. Es öffnet sich das unten dargestellte Fenster, in dem ihr im Abschnitt „Permissions“ rechts auf „Add inline policy“ klickt.

Detailseite für den neuen AWS-Benutzer für das Hinzufügen der Zugriffsrechte
Hinzufügen von Zugriffsrechten für den neuen AWS-Benutzer

Im sich öffnenden Dialog wählt ihr im „Visual Editor“ unter Service „Timestream“ und unter Actions->Access level „List“ und „Read“. Wenn ihr nur die im vorherigen Beitrag angelegte Testdatenbank habt, könnt ihr unter Ressources vorerst „All ressources“ auswählen. Sicherer wäre es aber, die ARN’s für Datenbank und Tabelle anzugeben. Um unten gezeigten Dialog habe ich das so gemacht und lediglich bei scheduled-query „Any“ ausgewählt. Nachdem ihr auf „Review Policy“ geklickt habt, müsst ihr noch einen Namen für die Policy vergeben und sie kann dem Benutzer hinzugefügt werden.

Konfigurieren der Timestream-Zugriffsrechte für den den AWS-Benutzer
Konfigurieren der Timestream-Zugriffsrechte für den neuen AWS-Benutzer

Jetzt ist der User für Grafana in AWS konfiguriert und ihr müsst ihn noch in Grafana angeben. Unten ist der Dialog gezeigt, der vom Hinzufügen des Grafana-Plugins für Amazon Timestream noch offen ist. Als „Authentification Provider“ wählt ihr „Access & secret key“, als Access Key ID und Secret Access Key gebt ihr die Daten an, die ihr unter „Add User“ in AWS kopiert bzw. in der .csv-Datei gespeichert habt. Abschließend könnt ihr unten auf „Save & Test“ klicken und der Grafana-Zugriff auf die Amazon Timestream-Datenbank ist eingerichtet.

Konfigurieren des Zugriffs auf Timestream in Grafana
Konfigurieren des Zugriffs auf Timestream in Grafana

Als letztes fügen wir Grafana noch ein Dashboard mit zwei Panels, die auf Daten aus Amazon Timestream zugreifen, hinzu. Dazu klickt ihr als erstes im „Home“-Bildschirm von Grafana rechts oben auf „Add Panel“ und im sich dann öffnenden Bereich, der unten dargestellt ist, auf „Add a new panel“:

Dialog zum Hinzufügen eines neuen Panels in Grafana
Hinzufügen eines neuen Panels in Grafana

Als erstes fügen wir ein Diagramm für eine Zeitreihe ein. Dazu geht ihr rechts oben auf den Visualisierungstyp (Standard ist „Time Series“) und stellt ihr auf „Graph (old)“. Als nächstes wählt ihr links unten unter Database die „carDB“, unter Table die „carTable“ und unter Measure die Größe aus, die ihr euch anzeigen lassen wollt. Ich habe hier „daltitude“ vom GPS gewählt, da ich für die Versuche nur den GPS-Empfänger mit Timestream verbunden hatte und die GPS-Höhe ein relativ verrauschtes Signal ist, bei dem auf jeden Fall Signaländerungen erkennbar sind, auch wenn der Empfänger stationär ist. Im Text-Fenster rechts neben der Auswahl der Datenquelle müsst ihr die passende Abfrage eingeben. Das Format orientiert sich an SQL. Um alle Werte des Höhenkanals sowie deren Zeitpunkt für den Graphen auszugeben, verwendet die folgende Abfrage:

SELECT time, measure_name, measure_value::double AS temp
FROM $__database.$__table
WHERE measure_name = '$__measure'
ORDER BY time DESC

Nachdem die Abfrage angelegt ist, könnt ihr noch oben rechts über dem Panel auf den „Refresh“-Button (die beiden Pfeile im Kreis) klicken um die Abfrage neu auszuführen. Links davon kann die Zeitspanne der Abfrage ausgewählt werden – ich habe hier einen Zeitraum ausgewählt, für den GPS-Daten vorliegen. Anschließend sollte das Fenster wir unten dargestellt aussehen und ihr könnte den Graphen mit „Save“ oben rechts speichern.

Einstellungen für den Grafana-Graphen mit Timestream-Daten.
Einstellungen für den Grafana-Graphen mit Timestream-Daten

Auf einem zweiten Panel wollen wir den aktuellen (bzw. zuletzt empfangenen) Wert anzeigen. Dazu klickt ihr wieder auf „Add a new panel“. Als Visualisierungstyp wählt ihr diesmal „Stat“. Die Datenquelle stellt ihr wie beim vorherigen Panel ein. Auch die Abfrage ist fast die gleiche, außer das eine Zeile mit „Limit 1“ hinzugefügt wird:

SELECT time, measure_name, measure_value::double AS temp
FROM $__database.$__table
WHERE measure_name = '$__measure'
ORDER BY time DESC
Limit 1

Die Konfiguration sollte jetzt wie auf dem folgenden Bild gezeigt aussehen und ihr könnt ihr das Panel wieder mit „Save“ sichern.

Konfigurieren des Grafana-Panels zur Anzeige des neuesten Wertes aus Timestream
Konfigurieren des Grafana-Panels zur Anzeige des neuesten Wertes aus Timestream

Damit ist jetzt der erste Prototyp komplett – OBD und NMEA-Daten können aus einem Fahrzeug per AWS IoT-Core in einer Amazon Timestream-Datenbank abgelegt werden und von dort per Grafana visualisiert werden. Mit dieser Basis können erste Daten gesammelt und Erfahrungen gesammelt werden – und sicher gibt es in Zukunft noch viel daran zu verbessern!