Wetter mit Raspberry Pi auf das Smartphone (Unwetterwarnung basteln)

Kein Kommentar Autor: Jürgen (jdo)

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.

Um Daten über das Wetter zu erhalten, brauchst Du einen API-Schlüssel

Um Daten über das Wetter zu erhalten, brauchst Du einen API-Schlüssel

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.

Beim kostenlosen Konto stehen mir brauchbare Optionen zur Verfügung

Beim kostenlosen Konto stehen mir brauchbare Optionen zur Verfügung

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:

OpenWaetherMap.org liefert Daten im JSON-Format

OpenWaetherMap.org liefert Daten im JSON-Format

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.

Die Codes für Regen und Schnee

Die Codes für Regen und Schnee

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.

Das Wetter als Dictionary

Das Wetter als Dictionary

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:

Es wird eine schöne Woche

Es wird eine schöne Woche

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.




 Alle Kommentare als Feed abonnieren

Kommentare sind geschlossen.