Wettervorhersage im JSON Format auslesen und interpretieren

Dieser Artikel ist ein Update des inzwischen veralteten Artikels "Wetterbericht und Astrodaten auslesen..."
... und eigentlich schon wieder veraltet, da Darksky.net von Apple übernommen wurde und keine neuen kostenlosen Accounts mehr angenommen werden. Das Update findet ihr hier.

In meine Webcam möchte ich einen Wetterbericht mit einigen Tagen Vorausschau einblenden.

Der bisher von mir verwendete Webservice von Weather Underground stellt seine kostenfreie Schnittstelle zum Ende 2018 ein. Ich habe mich deshalb nach Alternativen umgesehen.

  1. Openweathermap.org: Sehr mächtiger Service mit kostenloser 5 Tage Vorhersage im 3 Stundentakt. Das klingt toll ist aber auch ein Problem, wenn man lediglich eine Tageszusammenfassung anzeigen will und keinen detaillierten Report. Blöderweise kostet der Service mit tageweiser Vorhersage etwas. Damit kommt Openweathermap für meine Zwecke nicht in Frage.
    Okay, man könnte sich, so wie Darksky das macht, den jeweils schlechtesten Wetterbericht eine Tages rauspicken und diesen für den ganzen Tag hernehmen sowie die Tages-Maxima bzw. Minima für die Temperatur ermitteln. Aber das ist mir zu mühsam.
  2. Darksky.net: Ebenfalls kostenlos (max. 1000 Abrufe/Tag) aber optional mit Tagesberichten für 8 Tage - genau das, was ich brauche. Zusätzlich gäbe es noch eine minutengenaue Vorhersage und eine stündliche Vorhersage.  In wie weit diese für Mittel- oder Südeuropa genau ist, muss sich noch zeigen. Jedenfalls kann man diese Werte auch aus der Response ausblenden um Zugriffszeiten und Pufferplatz zu sparen.
    Ferner hat Darksky auch Sonnenaufgangs und -untergangszeiten sowie eine Angabe der Mondphase für den Tag.

À propos Mond: vielleicht etwas nerdig, aber ich will eine möglichst genaue Anzeige der Mondphase und der sichtbaren Mondoberfläche in Prozent. Ich errechne deshalb die Mondphase selbst.

Schritt 1: Account anlegen

Surft zu https://darksky.net/dev und klickt den Button "Try for free" an.

Die Registrierung ist denkbar einfach: eine funktionierende E-Mail Adresse eingeben, ein Passwort und fertig. Ihr erhaltet dann ein Mail an die angegebene Adresse mit Bestätigungslink. Dieses Link führt dann zu einer Seite, auf welcher euer geheimer Schlüssel [key] der Art 14db9bc3e02b53a556ad7d67103a7b29 angezeigt wird. Mit diesem Schlüssel müsst ihr euch bzw. euer Programm bei künftigen Abfragen ausweisen.

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:

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 Entwicklerpaket 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 Darksky angebotenen Daten und deren Struktur gibt es eine gute Dokumentation auf deren Site  https://darksky.net/dev/docs.

a: Das JSON Format anschauen

Um das Prinzip zu verdeutlichen, nehmen wir uns für den Anfang den allgemeinen Wetterüberblick vor.

Gebt zuerst einmal folgende Zeile in euren Browser ein:

Anstatt DeinenDarkskyKey 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. Mit einem anschließenden Fragezeichen können weitere Aufrufparameter übergeben werden, die dann untereinander durch ein Ampersand "&" getrennt werden. Beim obigen Beispiel ist das die Sprache (lang=de) sowie metrische Einheiten ( &units=auto)

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.

Ich arbeite praktisch nur mit dem Firefox Browser, da weiß ich wenigstens, dass mein Sufverhalten nicht weiterverkauft wird - anders als bei Chrome oder Edge. Firefox hat eine sehr gute eingebaute Darstellung des empfangenen JSON Objekts. Edge und Chome können das übrigens von Haus aus nicht.

Das im Firefox Browser angezeigte Ergebnis für den 23. Oktober 2018 ist dann wie folgt:

<<kein Bild mehr vorhanden>>

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

Exkurs: Auch eine schön 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 Erweiterungen - JSON Viewer - Format JSON anklicken. Et voilà, JSON ist so noch besser anzusehen.
Ganz toll ist auch der Online JSON Editor bei http://jsoneditoronline.org/

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 daily dann data dann die fortlaufende Nummer, wobei 0 für den aktuellen Tag steht und schließlich das Element
sunriseTime
.
In Python ausgedrückt sieht das so aus:
sunrise = data['daily']['data'][0]['sunriseTime']
Die Zeit wird allerdings als UNIX Zeitstempel, eine 10stellige Zahl,  ausgegeben. Zur lesbaren Darstellung kann man diesen Wert mittels strftime natürlich gleich konvertieren. Hierzu muss allerdings noch "datetime" Attribut der datetime Bibliothek  importiert werden
from datetime import datetime as dt
. Die darin steckenden Routinen brauchen wir später auch noch für die Anzeige des Wochentags. Das as dt ist nur eine wahlfreie Abkürzung zur Vermeidung von Schreibarbeit.

Hinweis: Darksky bezieht sich bei den Zeitangaben immer auf die Zeit des Ortes, dessen Koordinaten man eingegeben hat. Es ist also keine Konversion von UTC (Universal Time Coordinated) nötig. Die Zeitstempel für die einzelnen Tages-Wetterberichte beziehen sich immer auf 0 Uhr Ortszeit.

d: Iteration

Bei iterativen Daten, z.B. der Wettervorhersage für heute und die nächsten 7 Tage kann man das natürlich auch per Schleife auslesen. Die Schleife läuft über den Wert 'day' in der dritten Ebene
['daily']['data'][day]
also die Stelle, wo wir vorhin nur die "0" verwendet haben.

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

Ich persönlich verwende nur die ersten vier Tage des Wetterberichts. Hier ist die Eintrittswahrscheinlichkeit noch relativ groß.

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 Darksky graben, es gibt da alle möglichen Wetter-Informationen.

Dieser Beitrag wurde inspiriert von der wirklich gut gemachten Site http://www.pythonforbeginners.com/scraping/scraping-wunderground wobei auch diese Seite jetzt veraltet sein dürfte.

5 Gedanken zu „Wettervorhersage im JSON Format auslesen und interpretieren

  1. Klasse Dokumentation!!!

    habe da ein Fehler im Listing gefunden, der dann bei der AUsführung eine Fehler generiert.

    # inits
    degreeChar = u'\N{DEGREE SIGN}'
    fcast = []
    wdays = ["Mo","Di","Mi",Do","Fr","Sa","So"]

    in diesem Teil "Mi",Do","Fr" ist der Do nichtin "" gesetzt und gibt ein Fehler. Richtig müsste es "Mi","Do","Fr" also;

    # inits
    degreeChar = u'\N{DEGREE SIGN}'
    fcast = []
    wdays = ["Mo","Di","Mi","Do","Fr","Sa","So"]

    sein.

    VG
    Abdullah

    1. Hallo Abdullah,
      danke für dein freundliches Feedback und den Hinweis auf den Fehler, den ich natürlich sogleich korrigieren werde. Das hat sich wohl beim manuellem Überarbeiten des Codes im WordPress eingeschlichen.
      Viel Spaß noch
      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