Wetterbericht und Astrodaten als JSON auslesen und verarbeiten

Dieser Artikel ist in Bezug auf Weather Unterground leider überholt. Die Firma bietet keinen kostenlosen Webservice mehr an.

Hier geht es zu einer Alternative mit einer anderen kostenfreien API.

In meine Webcam möchte ich einen Wetterbericht einblenden. Außerdem will ich das Pi Camera Modul so aussteuern, dass Aufnahmen nachts mit längerer Belichtung durchgeführt werden. Die normale Kameraautomatik liefert sonst nur trübe oder schwarze Bilder.

Einen Weg, sich kostenlos mit korrekten Wetter und Astrodaten zu Sonnenaufgang und Untergang zu versorgen, zeige ich euch hier:

Es gibt eine ganze Reihe von Webdiensten, die einem die Wetterdaten etc. zur Verfügung stellen. Manchmal auch kostenlos. Ich verwende hier den amerikanischen Webservice Weather Underground, der bei gemäßigter Nutzung kostenlos ist und tatsächlich ein weltumspannendes Netzwerk an Wetterstationen betreibt. Zudem kann deren API sowohl XML als auch JSON. Ich habe mich für JSON entschieden, da das deutlich flexibler ist, als XML. Englischkenntnisse sind hilfreich, aber davon kann man wohl ausgehen, wenn sich jemand mit Raspberry Pi, Debian Linux und Python beschäftigt.wundergroundLogo_4c[1]

Anmerkung: In letzter Zeit war der Service eher unzuverässig und oft nicht erreichbar. Jetzt hat sich ergeben: Weather Unterground schickt seine API in den Ruhestand. Das heißt, ab dem 31.12.2018 wird diese Anleitung und alle Anwendungen, die auf der API basieren, nicht mehr funktionieren. Neue Accounts kann man seit ca. Mai 2018 nicht mehr anlegen. Angeblich will Weather Underground ein Angebot an alle Entwickler machen. Lassen wir uns überraschen… Ich bin jetzt dabei, meine Webcam auf eine andere API umzustellen. Anschließend werde ich darüber einen neuen Artikel schreiben.

Schritt 1: Account anlegen

Surft zu http://www.wunderground.com/weather/api/ und klickt den Button "Sign up for free" an.

Geht durch den Registrierungsdialog und tragt die abgefragten Daten ein. Beim "Pricing" Schema reicht fürs Erste der "Stratus Plan" und die Option "Developer" – die ist kostenlos, wenn man nicht mehr als 500 Abfragen pro Tag macht. Am Ende erhaltet ihr einen Schlüssel [key] der Art e5ed74b1ac3758b1 mit dem ihr euch bei künftigen Abfragen ausweist.

Schritt 2: Webservice ansprechen

Irgendwie müssen die Daten aus dem Webservice in Python eingelesen werden. Dafür gibt es in Python Standardmethoden. Mit der standardmäßig vorhandenen urllib2 Library habe ich mich allerdings etwas schwer getan. Die neuere  Library "Requests" ist meines Erachtens leichter zu bedienen, enthält netterweise auch die benötigten JSON Funktionen, muss aber erst noch installiert werden. Doch keine Angst, die Installation ist unkompliziert:

Requests is an elegant and simple HTTP library for Python, built for human beings.

Der Entwickler empfiehlt, das Paket mit  pip zu installieren:

sudo pip install requests

Wenn es zu einer Fehlermeldung kommt, weil pip noch nicht installiert ist, dann muss das pip Paket ebenfalls installiert werden – am besten gleich noch sicherstellen, dass ein weiteres wichtiges Entwicklerpakets mit installiert wird:

sudo apt-get install python-pip python-dev

anschließend requests wie oben dargestellt installieren.

Wer tiefer einsteigen will: weitere Info gibts bei Python Requests.

Damit ist euer Pi für die folgenden Schritte gerüstet.

Schritt 3: JSON verarbeiten

Bezüglich der Weather Underground angebotenen Daten und deren Struktur gibt es eine gute Dokumentation auf deren Site  http://www.wunderground.com/weather/api/d/docs.

a: Das JSON Format anschauen

Um das Prinzip zu verdeutlichen, nehmen wir uns für den Anfang die Astronomy Daten vor, das ist eine etwas kleinere Datei.

Gebt zuerst einmal folgende Zeile in euren Browser ein:

anstatt DeinWundergroundKey nehmt ihr natürlich euren eigenen, vorhin generierten Key. Die Zahlen am Ende sind die Geokoordinaten für den Ort, für den ihr die heutigen Astrodaten wissen wollt – in diesem Beispiel ist es der Hauptbahnhof München.

Hinweis: Geokoordinaten bekommt ihr heraus, indem ihr bei Google Maps die gewünschte Gegend anzeigt und dann einen Rechtsklick auf die Stelle macht, deren Koordinaten ihr wissen wollt. Dann "was ist hier" auswählen. Oben links werden dann die Geokoordinaten schon im richtigen Format angezeigt. Diese einfach mit Cut&Paste übernehmen und in die Codezeile eintragen. Dabei nicht vergessen, das Leerzeichen nach dem Komma zu entfernen.

Mehrsprachig ist der Dienst auch. Die Sprachkürzel sind allerdings deren Eigenschöpfung, anstatt der ISO Norm z.B. DE für Deutschland wird DL verwendet.  Für München sähe der String z.B. so aus:

Das Ergebnis für den 3. Januar 2015 ist dann wie folgt:

Diese wunderschön strukturierten Informationen können wir in Python jetzt ganz elegant verarbeiten.

Exkurs: Eine noch besser lesbare Struktur erhaltet ihr mit meinem Lieblingseditor Notepad++, der allerdings noch über den Plugin Manager die Erweiterung "JSON Viewer" bekommen muss. Notepad++ gibts kostenlos im Internet. Tante Google fragen.
Dazu den Menüpunkt Erweiterungen auswählen und dann auf Plugin Manager gehen. Dort dann unter dem Tab Available den JSON Viewer auswählen und auf Install klicken.
Zum Ansehen, den JSON String aus dem Browser in ein Bearbeitungsfenster von Notepad++ reinkopieren, mit der Maus komplett markieren und dann unter ErweiterungenJSON ViewerFormat JSON anklicken. Et voilà, JSON ist so noch besser anzusehen.
Ganz toll ist auch der Online JSON Editor bei http://jsoneditoronline.org/
Firefox Quantum (Version 57 und höher) kann ebenfalls eine wunderschöne JSON Darstellung.

b: Ein JSON Ojekt erzeugen

In die erste Zeile unseres Progrämmchens kommt das "Shebang" für Python. Dann noch die Codierung für UTF-8

Anschließend wird die soeben installierte Requests Bibliothek importiert

Zunächst einmal müssen wir den Webservice mit dem oben ausprobierten Aufruf ansprechen und den gelieferten Output einem Python Objekt [hier: r] zuweisen.

Damit kann man allerdings herzlich wenig anfangen. Das Objekt muss noch als JSON String geparsed (d.h. zergliedert) werden:

data = r.json()

data ist ein Python Dictionary Objekt und enthält den ganzen JSON String , nicht besonders schön anzusehen, aber komplett.

Hier noch das ganze Code Snippet:

und hier der Output davon:

c: Einzelne JSON Elemente ansprechen

Um beispielsweise direkt die Stunde des Sonnenaufgangs anzusprechen und in eine Variable hineinzuschreiben, muss man sich ganz einfach durch die Hierarchie des Directory Elements hangeln. An oberster Stelle kommt sun_phase dann sunrise dann hour.
In Python ausgedrückt sieht das so aus:

sunrise_hour = data['sun_phase']['sunrise']['hour'] #Sunrise Hour

Analog kann man alle anderen Werte einlesen. z.B. die Mondphase

mphase = data['moon_phase']['phaseofMoon'] #Moonphase

Der Astronomy Webservice hat eine ganz flache Struktur, d.h. genau einen Sonnenauf- und Untergang etc. Bei iterativen Daten, z.B. der Wettervorhersage für die nächsten 4 Tage kann man das natürlich auch per Schleife auslesen.

d: Iteration

nehmt hierzu z.B. den "Forecast" Webservice:

Zum Lesen der Wetterdaten hangelt man sich bis zum Knoten forecast-simpleforecast-forecastday vor und lässt dann die Schleife über den Tag [day] laufen.

Der Array fcst[x] enthält die Wettervorhersage für den Tag 0 bis 3, also vier Tage. Diese Daten könnt ihr nach Belieben in euren Programmen weiterverwenden. Bei öffentlich sichbarer Verwendung von Weather Underground Informationen muss gemäß Lizenzbedingungen ein Hinweis auf Weather Underground gezeigt werden.

Das Gradzeichen ist im normalen Zeichensatz nicht vorhanden und wird über degreeChar = u'\N{DEGREE SIGN}' erzeugt.

Der Output sieht dann hoffentlich so ähnlich wie hier aus.

Bei Interesse einfach tiefer bei Weather Underground graben, es gibt da alle möglichen Wetter-Informationen. Die Doku ist interaktiv und gut gemacht.

Dieser Beitrag wurde inspiriert von der wirklich gut gemachten Site http://www.pythonforbeginners.com/scraping/scraping-wunderground

In weiteren Beiträgen zeige ich, wie man mit der Kamera gemachte Bilder mit den gerade gewonnenen Informationen beschriftet, beschneidet, in der Größe ändert, auf den eigenen Webspace hochlädt und dann noch eine Javascript Slideshow für die gemachten Webcam Aufnahmen erstellt.

7 Gedanken zu „Wetterbericht und Astrodaten als JSON auslesen und verarbeiten

  1. Hi Chris,
    noch ein Fehler: Bei
    degreeChar = u'N{DEGREE SIGN}
    fehlt das "\".
    degreeChar = u'\N{DEGREE SIGN}
    Gruß,
    Uli

    1. Peinlich… und da ist über 2 Jahre niemand drauf gekommen. In meinem eigenen code hatte ich das korrekt drin, im Beispiel nicht. Ich habs entsprechend korrigiert. Danke nochmal
      Chris

  2. Hi Chris,
    leider funktioniert http://api.wunderground.com/api/DeinWundergroundKey/forecast/astronomy/lang:DL/q/Germany/Muenchen.json nicht mehr, ich würde Geodaten verwenden, also z.B. http://api.wunderground.com/MeinWundergroundKey/forecast/astronomy/lang:DL/q/48.140188,11.5585369.json für den Hauptbahnhof München.
    Ansonsten eine tolle Anleitung, danke.
    …../ )
    …..’ /
    —‘ (_____
    ……… ((__)
    ….. _ ((___)
    ……. -‘((__)
    –.___((_)

    Gruß,
    Uli

    1. Da kann man nichts machen, manchmal stellen die einfach ihren Service um, ohne dass man Bescheid bekommt. Danke für den Hinweis, ich werd's entsprechend in der Anleitung anpassen.
      Gruß
      Chris

    1. Nett! Allerdings fürchte ich, dass mit der bit.ly… Seite nur die Cracks was anfangen können. Gefühlt 50 Zeilen Code ohne Umbrüche und Kommentare oder Erklärungen überfordert die meisten User – zumindest für die Noobs die ein Noob wie ich mit diesem Blog hier erreichen will… 🙂 Außerden… wie bindet man sowas in Python ein??
      Gruß
      Chris

Schreibe einen Kommentar

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert