Wetter mit Raspberry Pi auf das Smartphone (Unwetterwarnung basteln)
Da im Moment nicht viel zu tun ist, stöbere ich gerne im Internet. Genauer gesagt suche ich mir freie APIs oder Websites, die JSON-Daten zur Verfügung stellen. Damit kann ich mir dann eigene Tracker und Ticker basteln. OpenWeatherMap.org stellt ebenfalls kostenlos ein API zur Verfügung, mit dem Du Daten über das Wetter abfragen kannst.
Kostenlos ist der Service, allerdings musst Du Dich registrieren und Dir einen API-Schlüssel holen. Du darfst Dir sogar so viele API-Schlüssel generieren, wie Du willst. Der Anbieter rechnet alle Anfragen zusammen. Beim kostenlosen Konto sind maximal 1.000.000 Anfragen pro Monat gestattet (1.000 pro Tag mit dem One Call API). Mir reicht das auf jeden Fall, weil ich nur eine Anfrage pro Tag brauche.
Sobald Du Dich registriert hast und angemeldet bist, kannst Du Dir einen API-Schlüssel erstellen. Das ist recht einfach. Nimm einen Namen und klicke auf Generate. Das war es schon.
Schlau ist, sprechende Namen zu verwenden, solltest Du mit vielen API-Schlüsseln planen. Ich habe meinen Apprise getauft, weil ich mir damit später via Pushover die gewünschten Daten zum Wetter auf das Smartphone schicken lasse.
Welche Daten zum Wetter bekomme ich kostenlos?
Beim kostenlosen Konto bekommst Du aber nicht alle Wetterdaten. Für meine Zwecke sind es aber mehr als genug. Du darfst Dir aktuelle Daten zum Wetter holen (Current Weather Data).
Mit der Option One Call API bekommst Du eine minütliche Vorhersage für 1 Stunde, eine stündliche Prognose für 48 Stunden, eine tägliche Voraussage für 7 Tage und die Wetterdaten der letzten 5 Tage.
Ich greife auf die Option 5 day / 3 hour Forecast zu. Hier bekomme ich die Wettervorhersage für die nächsten 5 Tage im 3-Stunden-Takt. Da ich mir eine Unwetterwarnung zuschicken lassen möchte, erscheint mir das die beste Option.
Alle drei Optionen liefern mir unter anderem Daten im JSON-Format. Die Daten kann ich mit Python wunderbar weiterverarbeiten. Im Screenshot siehst Du auch, dass es für jede Option einen Link API doc gibt. Dort werden Dir die Aufrufe und die Optionen erklärt. An dieser Stelle gleich ein wichtiger Hinweis. Per Standard wirft ein Aufruf bei der Temperatur Kelvin aus. Möchtest Du metrische Daten, musst Du das dem Aufruf explizit mitteilen, indem Du &units=metric an die URL anhängst. Beispiel (5 day / 3 hour Forecast):
https://api.openweathermap.org/data/2.5/forecast?lat=<Dein Breitengrad>&lon=<Dein Längengrad>&appid=<Dein App-Schlüssel>&units=metric
Interessieren Dich Temperatur und Windgeschwindigkeiten nicht, ist es egal. Für Wolken und Regen macht es keinen Unterschied.
Möchtest Du den Aufruf mit One Call API durchführen, ersetze in der URL das forecast einfach mit onecall.
Du kannst anstelle von Längengrad und Breitengrad auch einen Ort angeben. OpenWeatherMap.com hat über 200.000 Orte in der Datenbank. Beispiel:
https://api.openweathermap.org/data/2.5/forecast?q=Regensburg,de&appid=<Dein App-Schlüssel>&units=metric
Eine Abfrage sieht im Browser zum Beispiel so aus:
Du siehst hier weitere wichtige Werte, die ich für meine Unwetterwarnung nutze.
Weitere wichtige Werte
Aus den JSON-daten unter weather nehme ich die Werte, die ich für meine Unwetter-Warnung benutze. Main und Description verraten mir schon, wie die Aussicht ist. Die id ist mir aber lieber, weil ich mit der Zahl leichter im Python-Programm tue. Was die id für eine Bedeutung hat, findest Du auf dieser Seite.
Alles zwischen 500 und 599 hat also mit Regen zu tun. Ab 600 fängt dann Schnee an.
Du kannst Dir sogar die Symbole zunutze machen, weil sie ebenfalls angegeben sind. Die Adresse für die URL lautet zum Beispiel: http://openweathermap.org/img/wn/10d@2x.png
800 und größer lässt die Schönwetterfans feiern.
Daten für das Wetter mit Python verarbeiten
Ich benutze wieder cfscrape, um die URL abzufragen. Ob das notwendig ist, musst Du selbst herausfinden. Du kannst damit die Bot-Prüfung von Cloudflare umgehen. Um cfscrape zu installieren, brauchst Du pip auf Deinem Raspberry Pi.
sudo apt install python3-pip
Sobald pip installiert ist:
pip3 install cfscrape
Das Abfragen des API und Anzeigen der Daten ist einfach. Erstelle zum Beispiel eine Datei openweathermap.py mit folgendem Inhalt:
import json import cfscrape scraper = cfscrape.create_scraper() url = 'https://api.openweathermap.org/data/2.5/forecast?lat=49.03451&lon=12.11923&appid=<Dein App-Schlüssel>&units=metric' cfurl = scraper.get(url).content data = json.loads(cfurl) print(data)
Vergiss nicht, Deinen eigenen App-Schlüssel einzusetzen. Nun rufst Du das Programm auf.
python3 openweathermap.py
Der Output ist allerdings recht unübersichtlich.
Python hat mir die JSON-Daten in ein sogenanntes Dictionary umgewandelt, das ich aber weiter verarbeiten kann. Ein Dictionary ist auch als assoziatives Array oder Feld bekannt und die können einen ziemlich irremachen. Ich versuche zu erklären, was bei der Abfrage passiert. Interessant wird es für mich ab list – darin sind weitere Daten angesiedelt, die vereinfacht gesagt so eine Struktur haben:
{ "cod": "200", "message": 0, "cnt": 40, "list": [ { "dt": 1590904800, "main": { ... }, "weather": [ { "id": 802, "main": "Clouds", "description": "scattered clouds", "icon": "03d" } ], ... "dt_txt": "2020-05-31 06:00:00" }, { "dt": 1590915600, "main": { ... }, "weather": [ { "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" } ], ... "dt_txt": "2020-05-31 09:00:00" },
Der Wert weather > id Daten befinden sich also in einem Dictionary > Liste > Dictionary … wie gesagt, die Dinger können den Kopf rauchen lassen.
Ich bekomme für die nächsten 5 Tage alle 3 Stunden neue Wetter-Daten. Nun muss ich die Tage in einer Schleife durchlaufen und mir die entsprechenden Daten holen.
import json import cfscrape scraper = cfscrape.create_scraper() url = 'https://api.openweathermap.org/data/2.5/forecast?lat=49.03451&lon=12.11923&appid=<Dein App-Schlüssel>&units=metric' cfurl = scraper.get(url).content data = json.loads(cfurl) for val in data['list']: sky = val['weather'][0]['id'] description = val['weather'][0]['description'] date = str(val['dt_txt']) if sky < 800: print(f"Schlechtes Wetter im Anmarsch: {description} (Code: {sky}) {date}")
Ich hätte die Werte nicht extra in die Variablen sky, description und date schreiben müssen, aber es dient der Übersichtlichkeit. Die Ausgabe des Programms ist so:
Viel schlechtes Wetter gibt es also nicht in den nächsten 5 Tagen.
Übrigens: Du könntest das auch mit 2 for-Schleifen lösen, dann wäre es vielleicht noch etwas übersichtlicher:
for val in data['list']: for v in val['weather']: sky = v['id']
Das war es im Prinzip schon. Nun kannst Du Dir überlegen, was Du daraus machst. Theoretisch könntest Du die Daten in Deine eigene Wetterstation übertragen, wobei das wenig Sinn ergibt. Hast Du eigene Sensoren, zum Beispiel einen Sense HAT, ist das etwas anderes.
Möchtest Du Dir die Daten auf Dein Smartphone senden, gibt es dafür auch mehrere Optionen. Im Moment benutze ich dafür Apprise und Pushover. Mit Apprise kannst Du Dir aber auch ein E-Mail schicken lassen. Damit hättest Du die Daten gleichzeitig auf dem Smartphone und dem Desktop. An dieser Stelle ist Deine Kreativität gefragt.
Du könntest die Sache auch mit LEDs kombinieren, die Grün für gutes und Rot für schlechtes Wetter anzeigen.
Ein paar Ideen für die Wetter-Warnung
Überlegen wir uns, wie wir die Daten zum Wetter sinnvoll einsetzen können. Bist Du gerne draußen unterwegs, könntest Du Dich warnen lassen, wenn Regen angesagt ist.
Es geht zwar gerade Richtung Sommer, aber wenn die kalte Jahreszeit wieder kommt, lasse Dich informieren, wenn die Wettervorhersage Minustemperaturen prognostiziert. Das ist natürlich wichtig wegen Glatteis und so weiter.
Vielleicht willst Du Dich auch warnen lassen, wenn sehr hohe Temperaturen angesagt sind. Manche Menschen vertragen die Hitze ja nicht besonders.
Möglicherweise möchtest Du auch wissen, wann ein Sturm oder Nebel angesagt ist. Schön an der Lösung ist, dass Du es genau an Deine Bedürfnisse anpassen kannst.
Du darfst nie vergessen, dass es sich um eine Prognose handelt. Das Wetter ist bekanntlich launisch. Weiß ich aber, was mich die nächsten 5 Tage erwarten könnte, sind Planung und Vorbereitung einfacher.
Es gibt jede Menge APIs
Mit dem Raspberry Pi und Python kannst Du jede Menge kostenlose APIs anzapfen. Bei OpenWeatherMap.org bekommst Du auch Daten zu Sonnenaufgang und Sonnenuntergang. Blaue Stunde und goldene Stunde sowie Dämmerung musst Du Dir aber anderswo besorgen. Das geht aber auch offline mit Astral und die Lösung gefällt mir sogar besser.
Ein anderer Anwendungsfall wäre ein Bitcoin-Ticker. Auch die aktuellen Zahlen zum Coronavirus kannst Du Dir mit dem Raspberry Pi holen.
Nette Pi-Konstellation
Suchst Du ein VPN für den Raspberry Pi? NordVPN* bietet einen Client, der mit Raspberry Pi OS (32-Bit / 64-Bit) und Ubuntu für Raspberry Pi (64-Bit) funktioniert.