Zum Hauptinhalt Zur Navigation

ESP32: Coronainzidenz anzeigen im Selbstbau

Wie mit Daten des Robert Koch-Instituts und einem 32-Bit-Mikrocontroller einfach die aktuellen Corona-Inzidenzdaten extrapoliert werden können.
/ Thomas Ell
36 Kommentare News folgen (öffnet im neuen Fenster)
Das Robert Koch-Institut (RKI) bietet eine ganze Reihe von Daten an, die Entwickler frei verwenden können. (Bild: Pixabay / Montage: Golem.de)
Das Robert Koch-Institut (RKI) bietet eine ganze Reihe von Daten an, die Entwickler frei verwenden können. Bild: Pixabay / Montage: Golem.de

Zwar fällt die Covid-19-Inzidenz im Moment, aber wer will schon sicher sagen, dass sie im Herbst nicht wieder steigen wird. Der Wert stellt eine der wichtigsten Informationen im Zusammenhang mit Corona dar und auch die Politik hat an der Inzidenz verschiedene Maßnahmen verankert.

Darum interessiert es mich, jeden Morgen den aktuellen Wert zu kennen, um so für mich selbst mit den Werten extrapolieren zu können und frühzeitig zu erkennen, wenn es zum Beispiel eine Trendumkehr gibt. Den Wert will ich einfach nur irgendwo ablesen, ich möchte weder mit dem Smartphone danach suchen noch den großen Computer dafür anwerfen müssen.

Doch auch für Steuerungen kann das Verfahren interessant sein. Denkbar wäre zum Beispiel eine Tür, die nur aufgeht, wenn die Inzidenz einen bestimmten Wert unterschreitet.

Zum Glück habe ich noch einige ESP32 mit integriertem Display von Lilygo herumliegen. Die können auch ins Internet. Ob es nicht möglich ist, eines davon dazu zu bringen, die Inzidenz abzufragen und auf dem Display darzustellen? Den Mikrocontroller gibt es bei Banggood. In diesem Artikel stelle ich dar, wo man die benötigten Informationen herbekommt und wie man sie für die eigenen Zwecke abfragen kann.

Das Robert Koch-Institut (RKI) bietet eine ganze Reihe von Daten an, die Entwickler frei verwenden können. Zitat: "Der Covid-19-Datenhub ist ein durch Esri betriebenes und durch das RKI verantwortetes Kollaborationsportal, welches eine Datenplattform, Analysetools und Dashboards bereitstellt. Es werden Daten rund um die Covid-19-Pandemie für Behörden, die Presse, aber auch eine breite Öffentlichkeit bereitgestellt. Die Daten können hier z. B. per APIs in Scripte oder eigene Anwendungen eingebunden werden. Des Weiteren können diese aber auch in diversen Datenformaten direkt heruntergeladen werden. Zusätzlich werden bereits fertige Anwendungen bereitgestellt, wie z.B. das RKI Covid-19 Dashboard, das Dashboard der WHO oder das Intensivbettenregister."

Esri Inc. ist ein US-amerikanischer Softwarehersteller von Geoinformationssystemen (GIS). Also: Das RKI liefert Daten an Esri, das diese mit seinem GIS mundgerecht aufbereitet und auf Webseiten visualisiert.

Wo findet man die Daten?

Die übergeordnete Seite zum Thema ist hier(öffnet im neuen Fenster) . Auf einer der Unterseiten findet sich eine Deutschlandkarte mit den einzelnen Landkreisen(öffnet im neuen Fenster) .

Wenn man davon einen anklickt, poppt ein Fenster auf, in dem sich unter OBJECTID eine Nummer findet.

Für meinen Landkreis ist das die Nummer 127. Die ist für die weitere Entwicklung wichtig.

Alternative für das Ermitteln der OBJECTID

Falls der gerade beschriebene Weg nicht funktioniert, zeige ich hier noch einen zweiten auf. Alternativ kann man über das Icon mit der Wolke und einem Pfeil nach unten eine CSV-Datei herunterladen und in dieser nach seinem Landkreis suchen.

Ich verwende für das Bearbeiten bzw. Ansehen von CSV-Dateien Libreoffice Calc. Wenn man damit die Datei öffnet, wird sofort ein Importassistent angeboten, in dem unter Ab Zeile : auf 2 gestellt werden muss.

In der sich anschließend öffnenden Tabelle wird in der ersten Spalte die OBJECTID und in der neunten Spalte der Landkreis aufgeführt.

Also aufschreiben! Links unten findet sich ein blauer Balken Verwenden . Durch einen Klick darauf erscheint ein Popupmenü mit weiteren Möglichkeiten.

Dort wird auf In API-Explorer öffnen geklickt. Dann erscheint eine neue Seite, in der sich die URL zusammenklicken lässt. In dem mit Abfrage bezeichneten Kasten werden alle Kästchen, bis auf cases7_per_100k , deaktiviert.

Rechts oben findet sich jetzt die Abfrage, die aber leider noch nicht auf den Landkreis eingeschränkt ist. Das geht manuell. Einfach die URL herauskopieren und den String 1%3D1 durch OBJECTID=127 ersetzen. Wer die dadurch entstandene URL in einem Browser absendet, bekommt eine im Datenformat JavaScript Object Notation (JSON) formatierte Ergebnismenge zurück, in der die Inzidenz zu finden ist.

Das sieht auf den ersten Blick wie ein einziger großer Datenhaufen aus. Für einen strukturierten Überblick empfehle ich das Add-on JSON-Formatter von Alexei Moroz für den Firefox-Browser.

Nach der Installation findet sich rechts unterhalb der Titelleiste von Firefox ein Icon Click to stringify your JSON . Durch einen Klick darauf werden die Daten blitzschnell strukturiert dargestellt. Und dort ist dann der gesuchte Wert unter cases7_per_100k zu finden.

Darunter steht eine Fülle von Zahlen, die Geokoordinaten sind und mit deren Hilfe der Landkreis gezeichnet werden kann. Das interessiert uns hier aber erst einmal nicht. Leider führen diese Zahlen noch zu einem Problem, aber dazu gleich mehr. Wir haben jetzt eine URL, die jeden Tag die aktuelle Inzidenz für den eigenen Landkreis zurückgibt. Bei mir ist es diese(öffnet im neuen Fenster) .

Was ist JSON?

Immer wenn mehr als eine Handvoll Werte verarbeitet und weitergegeben werden müssen, empfiehlt es sich, die Daten in einer strukturierten Form zu halten, so dass der Zugriff auf einzelne Werte möglichst einfach ist. Als Beispiel mag da eine CSV-Datei dienen, deren Format schon seit Jahrzehnten dazu da ist, einfach strukturierte Daten untereinander auszutauschen.

Das funktioniert mit Daten, deren Struktur sich tabellarisch darstellen lässt, sehr gut. Wenn es aber mehr Ebenen gibt, taugt das CSV-Format nichts mehr. Dafür ist die Auszeichnungssprache XML erfunden worden. Sie ermöglicht es, hierarchisch verschachtelte Informationen auszutauschen und noch vieles mehr.

Ihr größter Nachteil ist der große Speicherplatzbedarf, da jedes Attribut von benannten Auszeichnungen umrahmt ist. Darum hat sich in den letzten Jahren JSON durchgesetzt. JSON ermöglicht bei minimalem Platzbedarf die Organisation von hierarchisch strukturierten Daten. JSON dient zum Beispiel bei der Entwicklung von Webanwendungen zum Übertragen von Daten.

Wer jetzt Angst hat, auf dem ESP32 für JSON einen eigenen Parser entwickeln zu müssen, sei beruhigt. Das hat schon jemand gemacht und es der Allgemeinheit zur Verfügung gestellt. Die ArduinoJson-Bibliothek kann einfach über die Arduino IDE installiert werden. Mit ihrer Hilfe ist der Zugriff auf einzelne Datenelemente im oben beschriebenen Datenwust kinderleicht.

Das Display IPS ST7789V

Dass der Lilygo ESP32 schon gleich mit einem prachtvoll leuchtenden Display verkauft wird, macht die Lösung unserer Aufgabe sehr einfach, da wir noch nicht einmal ein Display an einen ESP32-Mikrocontroller löten müssen. Einzig die Ansteuerung des Displays müssen wir noch lösen.

Zum Glück gibt es auch dafür eine Bibliothek, mit der dies relativ einfach zu machen ist. Sie heißt TFT_eSPI und ist hier(öffnet im neuen Fenster) zu bekommen. Der Inhalt der ZIP-Datei wird nach C:\Users\Tom\Documents\Arduino\libraries kopiert. Tom wird natürlich durch den eigenen Namen ersetzt. Dort, in der Datei User_Setup_Select.h werden dann die Kommentarzeichen am Anfang der Zeile entfernt.

        
//#include <User_Setups/Setup135_ST7789.h> // Setup file for ESP8266 and ST7789 135 x 240 TFT

Das sollte es gewesen sein.

Wie kann man die Daten herunterladen?

Ruft man die Daten im Browser ab, so wird eine SSL-Verbindung verwendet. Also müsste auch der ESP32 entsprechend programmiert werden. Dazu benötige ich ein Zertifikat. Das habe ich mir so geholt:

Im Browser auf das Tab mit dem JSON-Code und dort auf das Schloss-Symbol neben der URL klicken. Dann auf Verbindung sicher klicken, danach auf Weitere Informationen .

Es erscheint ein neues Fenster. Dort auf Zertifikat anzeigen klicken.

Es öffnet sich ein neues Browser-Tab. Dort auf Amazon Root CA 1 und dann unten auf PEM (Zertifikat) klicken.

Dann gibt es die Möglichkeit, das Zertifikat in einem Editor zu öffnen oder es herunterzuladen.

Aus dem Editor kann es mit Cut-and-copy in den eigenen Code kopiert werden.

Die JSON-Daten müssen über eine verschlüsselte Verbindung heruntergeladen werden. Dazu habe ich die Bibliothek WiFiClientSecure verwendet.

        
#include <WiFiClientSecure.h></em>

Mit Hilfe der genannten Bibliothek kann die durch die URL bestimmte Abfrage durchgeführt und das vom Server zurückgegebene JSON als String empfangen werden. Um auf einzelne Attribute der Daten zuzugreifen, müssen sie in ein JSON-Objekt umgewandelt werden.

Bei einem meiner ersten Versuche mit der JSON-Bibliothek bekam ich schon beim Kompilieren einen Speicherfehler und sann darüber nach, wie ich den String so verkleinern konnte, dass es zu keiner Fehlermeldung kam. Die vom GIS zurückgegebene Datenmenge enthielt sehr viele Geokoordinaten, die ich für meinen Zweck überhaupt nicht benötigte. Darum kürzte ich den String mit folgenden Anweisungen:

        
long pos = payload.indexOf("geometry\"");
payload = payload.substring(0, pos - 2) + "}]}";

Mit folgenden drei Zeilen bekomme ich daraus ein JSON-Objekt:

        
DynamicJsonDocument doc(2048);
deserializeJson(doc, payload);
JsonObject obj = doc.as<JsonObject>();

Und mit einer einzigen weiteren Zeile den gesuchten Wert:

        cases7_per_100k = round ((double) (obj["features"][0]["attributes"]["cases7_per_100k"]) * 10) / 10;

Es gibt ein paar Nachkommastellen, die man so entfernen kann:

        char buffer[10]; dtostrf(cases7_per_100k, 3, 1, buffer);

In buffer steht der gewünschte Wert.

Wie oft updaten?

Das RKI findet es sicher nicht lustig, wenn wir die Daten alle paar Sekunden anfordern, obwohl sie sich nur einmal täglich ändern. Darum muss das Programm so gestaltet werden, dass es ebenfalls nur einmal am Tag die Daten anfordert. Ideal wäre ein Zeitpunkt, kurz nachdem das RKI die Daten aktualisiert hat.

Dann müssten wir aber erst einmal wissen, wann das ist. Und dann müsste das ESP32 die aktuelle Uhrzeit kennen. Das kann man zwar machen, erfordert aber einiges an Aufwand. Um die Lösung möglichst einfach zu halten, schlage ich vor, einfach nur jede oder jede zweite Stunde die Daten abzurufen. Sollten die Daten in der Nacht upgedatet werden, so haben wir sie jeden Fall am nächsten Morgen.

Dieser Artikel erschien zuerst bei Steinlaus.de(öffnet im neuen Fenster) , dem Blog von Thomas Ell alias Tinkerpete. Dort findet sich auch das dokumentierte Programm(öffnet im neuen Fenster) .


Relevante Themen