Raspberry Pi Pico W: Online-Wetterstation mit Vorhersage (über DWD-API)

Eine Wetterstation ist in der Regel eine Zusammenstellung verschiedener Messgeräte, die zur Messung meteorologischer Größen dienen. In diesem Fall ist es ein Raspberry Pi Pico W, der verschiedene meteorologische Größen aus einer API bezieht, die vom Deutschen Wetterdienst (DWD) kostenlos bereitgestellt wird. Dazu fragen wir Daten von der Wetter-API ab, bringen sie in die richtige Form und anschließend geben wir sie aus.

Dieser Artikel soll nur der Ausgangspunkt für eine eigene Online-Wetterstation mit Vorhersage sein. Der Programmcode ist also nicht komplett oder vollständig. Er zeigt im wesentliche nur, wie die DWD-API einmalig abgefragt werden kann.

Denkbar wäre, diese Wetterstation um ein Display, eigene Sensoren und regelmäßige Aktualisierung zu ergänzen.

Wetter-API des Deutschen Wetterdienstes (DWD)

Die API des Deutschen Wetterdienstes ist mit Vorsicht zu genießen. Eine Dokumentation gibt es praktisch nicht.

Damit man mit der API sinnvoll arbeiten kann, muss man wissen, dass die DWD-API nicht von jedem beliebigen Ort Wetterdaten liefern kann. Die Daten kommen von Wetterstationen, die der DWD selber betreibt oder duch Kooperationen mit anderen Betreibern von Wetterstationen. Zum Beispiel im Ausland. Das heißt, die DWD-API kann auch Daten von ungewöhnlichen Orten liefern, die irgendwo auf der Welt sein können. Um die Daten einer bestimmten Wetterstation abfragen zu können, benötigt man die ID dieser Wetterstation. Diese ID mus man zuerst ermitteln. Die folgende URL verweist auf ein Dokument, dass alle verfügbaren Wetterstationen der DWD-API auflistet. Benötigt wird der Wert aus der Spalte „id“.

Verwende die Suchfunktion Deines Browsers, um einen Ort zu finden. Beachte, dass Ortsnamen in Deutschland mehrmals vorkommen können und Du nicht versehentlich die falsche Stations-ID ermittelst. Orientiere Dich an den Ortsnamen, die in der Liste darüber oder darunter liegen. Es kann gut sein, dass in Deinem Ort keine DWD-Station steht, sondern in einer Ortschaft ein paar Kilometer weiter. Zu beachten ist, dass Umlaute, wie ü als ue, usw. geschrieben werden.
In der Liste befinden sich auch Ortsnamen, die nicht in Deutschland liegen. Du findest in dieser Liste Orte, die auf der ganzen Welt verteilt sind.

Alternativen

Wenn Dir die Wetter-API des Deutschen Wetterdienstes nicht zusagt, dann werfe mal einen Blick auf folgende Alternativen:

Programmcode

Im folgenden Programmcode müssen die Zugangsdaten für das WLAN und die Stations-ID des DWD eingetragen werden. Die URL für die Abfrage ist schon korrekt gewählt.

Nach dem WLAN-Verbindungsaufbau werden die Daten per HTTP-Request abgefragt. Die Daten liegen dann als JSON-Datensatz vor. Aus diesem kann man verschiedene meteorologische Daten auslesen. Der Programmcode beschränkt sich auf die minimale und maximale Temperaturen des Tages und ergänzt die Vorhersage um einen beschreibenden Text, für den es normalerweise ein grafisches Symbol gibt.

# Bibliotheken laden
import machine
import network
import urequests as requests
import time

# WLAN-Konfiguration
wlanSSID = 'WLANNAME'
wlanPW = 'WLANPASSWORD'
network.country('DE')

# DWD-API
dwdStationID = 'K2714'
dwdURL = 'https://app-prod-ws.warnwetter.de/v16/stationOverview?stationIds=' + dwdStationID
dwdText = ('Sonne','Sonne und leicht bewölkt','Sonne und bewölkt','Wolken','Nebel','Nebel mit Rutschgefahr','Leichter Regen','Regen','Starker Regen','Leichter Regen mit Rutschgefahr','Starker Regen mit Rutschgefahr','Regen mit vereinzeltem Schneefall','Regen mit vermehrtem Schneefall','Leichter Schneefall','Schneefall','Starker Schneefall','Wolken mit Hagel','Sonne mit leichtem Regen','Sonne mit starkem Regen','Sonne mit Regen und vereinzeltem Schneefall','Sonne mit Regen und vermehrtem Schneefall','Sonne mit vereinzeltem Schneefall','Sonne mit vermehrtem Schneefall','Sonne mit Hagel','Sonne mit starkem Hagel','Gewitter','Gewitter mit Regen','Gewitter mit starkem Regen','Gewitter mit Hagel','Gewitter mit starker Hagel','Wind')
dwdData = ''

# Status-LED
led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0)

# Funktion: WLAN-Verbindung
def wlanConnect():
    wlan = network.WLAN(network.STA_IF)
    if not wlan.isconnected():
        print('WLAN-Verbindung herstellen')
        wlan.active(True)
        wlan.connect(wlanSSID, wlanPW)
        for i in range(10):
            if wlan.status() < 0 or wlan.status() >= 3:
                break
            led_onboard.toggle()
            print('.', wlan.status())
            time.sleep(1)
    if wlan.isconnected():
        print('WLAN-Verbindung hergestellt')
        led_onboard.on()
        print('WLAN-Status:', wlan.status())
        netConfig = wlan.ifconfig()
        print('IPv4-Adresse:', netConfig[0], '/', netConfig[1])
        print('Standard-Gateway:', netConfig[2])
        print('DNS-Server:', netConfig[3])
    else:
        print('Keine WLAN-Verbindung')
        led_onboard.off()
        print('WLAN-Status:', wlan.status())

# WLAN-Verbindung herstellen
wlanConnect()

# API-Daten abrufen
try:
    print()
    print('HTTP-Request an', dwdURL)
    response = requests.get(dwdURL)
    print('Status-Code:', response.status_code)
    if response.status_code == 200:
        # JSON-Datensatz umwandeln
        dwdData = response.json()
    # Verbindung schließen
    response.close()
except OSError:
    print()
    print('Fehler: Keine Netzwerk-Verbindung (WLAN)')

# Daten verarbeiten und ausgeben
if (len(dwdData) > 0):
    # Daten-Verarbeitung
    tempMax = dwdData[dwdStationID][0]['temperatureMax'] / 10
    tempMin = dwdData[dwdStationID][0]['temperatureMin'] / 10
    icon2   = dwdData[dwdStationID][0]['icon2']
    # Daten-Ausgabe
    print()
    print("Temperatur: max. %s °C / min. %s °C" % (tempMax, tempMin))
    print(dwdText[icon2])

Der Programmcode sendet einmal einen HTTP-Request an die DWD-API und gibt dann die Daten in der Kommandozeile/Shell aus. Der Programmcode wird danach automatisch beendet.

Hinweis: Die URL des HTTP-Requests (Kommandozeile/Shell) liefert einen JSON-Datensatz. Diese URL kann man auch in einem Browser aufruft. Hier werden die Daten hierarchisch als Baumstruktur dargestellt. Wichtig ist, dass man die Werte richtig interpretieren und mit Einheiten versehen kann. Temperaturen muss man zum Beispiel erst durch 10 teilen, um die richtige Temperatur zu erhalten. Der richtige Umgang mit meteorologische Daten nimmt einem die DWD-API also nicht ab.

Erweiterungen

Die angezeigten Daten sind Vorhersage-Daten. Wenn man möchte, dann kann man mit einem externen Temperatur-Sensor die Datenausgabe um lokale Daten ergänzen.

Die Ausgabe auf der Kommandozeile ist natürlich nicht besonders attraktiv. Wenn jemand ein Display hat, kann man das zur Ausgabe der Daten verwenden und die Abfrage einmal am Tag durchführen lassen.

Ergänzen lässt sich der Programmcode noch um die Ermittlung des aktuellen Datums und der Uhrzeit per NTP, um die interne RTC beim Start des Programmcodes einzustellen. So kann man die Abfrage zu einer bestimmten Uhrzeit steuern.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren