// Die Wundergound Weather API – endlich eine brauchbare

Seit längerem befinde ich mich auf der Suche nach (brauchbaren!) externen Wetterdaten für Weather.chrisge.org – Die Google Wetter API existiert schon seit längerem nicht mehr und das YAHOO! Pendant ist auf Grund nicht enthaltener Werte für mich unbrauchbar geworden. Zunächst bin ich dann dazu übergegangen die deutsche Unterseite von TheWeatherChannel zu dumpen. Da die Seite aber einen Relaunch erlebt hat und ich keine Lust mehr auf ständiges Anpassen der Munin Plugins hatte, habe ich mich auf die Suche nach einer brauchbaren API gemacht und in der Wunderground.com Weather API eine hervorragende gefunden.

Features

Als Entwickler bekommt man den API-Zugang mit sämtlichen Zusatzfeatures für lau. Darin enthalten ist folgendes:

  • Anvil Plan mit Radar- und Satellitenbilder, Webcam Thumbnails und vielen mehr oder weniger brauchbaren Features
  • das History Add-On („one of the biggest historical weather databases on the web“)
  • …und eine Limitierung auf 10 Anfragen pro Minute und 500 pro Tag :-(

Nach dem man sich für einen API Key registriert hat, empfiehlt es sich zunächst sich etwas in der Dokumentation umzusehen. Es fällt auf, dass in die Anwendung bzw. in die Webseite das Wunderground Logo eingebunden werden muss, was auf Grund der sehr humanen Vorschriften (das „Horizontal Logo“ darf auf 126px skaliert werden) absolut kein Problem darstellt.

Einfache Abfragen

Eine Übersicht über mögliche Abfragemethoden findet sich in der Dokumentation. Unter anderem können auch sog. Layers erzeugt werden (sehr empfehlenswert!). Für mich war aber in erster Linie eine Abfrage der Conditions relevant, weshalb ich mich im folgenden auch nur mit diesen beschäftigen werde.

Zunächst muss entscheiden werden, ob die Antwort in XML oder JSON „formatiert“ sein soll. Ich entscheide mich für JSON. Eine Abfrage nach den aktuellen Conditions sieht nun in etwa so aus (wobei die Variablen natürlich ersetzt werden müssen):

http://api.wunderground.com/api/${KEY}/conditions/${OPTIONS}/q/${PLACE}.json

Den Ortscode ${PLACE} erhält man, indem man auf der Startseite nach dem Ort sucht und sich die URL anschaut (z.B. für Schutterwald http://www.wunderground.com/q/zmw:00000.47.10805zmw:00000.47.10805). Ich wähle folgende Werte für die Variablen:

KEY=""                         # generierten API Key angeben
OPTIONS="lang:DL"              # Sprache auf Deutsch
PLACE="zmw:00000.47.10805"     # Ortscode für Schutterwald...
PLACE="zmw:00000.1.10702"      # bzw. für Karlsruhe

Die Abfrage kann nun testweise im Browser oder natürlich auch mit einem Textbrowser wie w3m oder lynx ausgeführt werden:

w3m -dump http://api.wunderground.com/api/${KEY}/conditions/${OPTIONS}/q/${PLACE}.json

Als Antwort erhalte ich für die Wetterbedingungen in Karlsruhe unter anderem folgendes (stark gekürzt):

"weather":"Partly Cloudy",
"temp_c":12.2,
"relative_humidity":"85%",
"wind_string":"Calm",
"wind_dir":"WSW",
"wind_degrees":242,
"wind_kph":0.0,
"wind_gust_kph":"1.6",
"pressure_mb":"1001",
"dewpoint_c":10,
"feelslike_c":"12.2",
"visibility_km":"10.0",
"UV":"1",

Die darin enthalten Werte sind für meine Bedürfnisse mehr als ausreichend :-)

Eine praktische Umsetzung

Zuerst scheinen 500 Anfragen pro Tag ausreichend. Das würde immerhin alle drei Minuten eine Anfrage gestatten. Das Problem ist nur, dass ich drei Munin Plugins einsetze, die alle 5 Minuten zweimal (wegen zwei Muninmastern) ausgeführt werden. Außerdem frage ich die Werte hin und wieder für den Versand via SMS oder XMPP ab. Folglich muss eine andere Lösung her.
Dazu habe ich folgendes kleine Skript (api-get) erstellt, welches mir die Werte für Schutterwald abfrägt bzw. mit wget downloaded:

#!/bin/bash
 
FILE="/var/weather/output_sw"      # Pfad anpassen
KEY=""                             # Key einfügen!
OPTIONS="lang:DL"
PLACE="zmw:00000.47.10805"         # Ortscodes/Variablen anpassen!
 
wget -q http://api.wunderground.com/api/${KEY}/conditions/${OPTIONS}/q/${PLACE}.json -O $FILE

Das obige Skript führe ich alle 4 Minuten in Cron aus.

Das $FILE verarbeite ich nun mit allen weiteren Services, die Zugriff auf die Wetterdaten brauchen, mit folgendem Skript (api):

#!/bin/bash
FILE="/var/weather/output_sw"    # Ort anpassen
WHAT="$1"
 
case "$WHAT" in
 
# Verarbeiten von $FILE; JSON lässt sich in der bash sicherlich auch schöner verarbeiten ;-)
temp)
   grep temp_c $FILE | cut -d':' -f2 | cut -d',' -f1
   ;;
 
dew)
   grep dewpoint_c $FILE | cut -d':' -f2 | cut -d',' -f1
   ;;
 
hum)
   grep relative_humidity $FILE | cut -d':' -f2 | cut -d',' -f1 | cut -d'"' -f2 | cut -d'%' -f1
   ;;
 
*)
   echo "ERR: WHAT!"
   exit 1
   ;;
esac

Nun kann ich mit /Pfad/zum/api/skript [temp|dew|hum] die aktuellen Werte aus der heruntergeladenen Datei auslesen. Natürlich muss der jew. User Zugriff auf die Datei haben und die benötigten Rechte besitzen um das Skript ausführen zu dürfen!

Fazit

Ich hoffe der Wetter API von Wunderground.com ist ein längeres Leben als der von Google prophezeit. Ende Dezember bin ich auf die Wundeground Weather API umgestiegen und ich muss sagen, dass ich höchst zufrieden bin.
Bis jetzt habe ich noch nicht alle Möglichkeiten der API ausgeschöpft, mit den History und Layer Feeatures muss ich mich unbedingt noch mehr auseinandersetzen.

Comments

No. 1 @ 2014/09/18 12:45

Zurest mal herzlichen DANK für die INFOs. Es funktioniert prima mit deiner Anleitung. Die Text-Ausgabe wird noch besser, wenn du lang:DL anstelle von lang:DE verwendest. DE ist offenbar kein gültiger Code!

No. 2 @ 2014/09/18 22:31

@Rolf: Vielen Dank für den Hinweis! Habs geändert. Da hätte ich doch nochmal in die Doku schauen sollen und mich nicht einfach auf den üblichen Ländercode verlassen sollen :-)

Klaus Schmid
No. 3 @ 2015/11/05 16:37

Danke für die Infos, genau was ich für mein kleines SMS Projekt gebraucht habe.

Ich les die einzelnen Werte dann per perl regex aus: perl -n -e'/„feelslike_c“:“([^“]+)“/ && print $1'

No. 4 @ 2015/11/07 18:15

@Klaus Schmid: Deine Lösung mit dem Perl regex ist definitiv schöner als mein Rumgefrickel mit cut und grep ;-)

[…] Die Wundergound Weather API – endlich eine brauchbare – chrisge.org […]

Leave a comment…




   _  __   ____   ___      __  _      __ ______  __  __   ____   ____   ___    _  __ ______
  / |/ /  / __/  / _ | __ / / | | /| / //_  __/ / / / /  /  _/  / __/  / _ \  | |/_//_  __/
 /    /  / _/   / __ |/ // /  | |/ |/ /  / /   / /_/ /  _/ /   / _/   / // / _>  <   / /   
/_/|_/  /___/  /_/ |_|\___/   |__/|__/  /_/    \____/  /___/  /_/    /____/ /_/|_|  /_/
  • E-Mail address will not be published.
  • Formatting:
    //italic//  __underlined__
    **bold**  ''preformatted''
  • Links:
    [[http://example.com]]
    [[http://example.com|Link Text]]
  • Quotation:
    > This is a quote. Don't forget the space in front of the text: "> "
  • Code:
    <code>This is unspecific source code</code>
    <code [lang]>This is specifc [lang] code</code>
    <code php><?php echo 'example'; ?></code>
    Available: html, css, javascript, bash, cpp, …
  • Lists:
    Indent your text by two spaces and use a * for
    each unordered list item or a - for ordered ones.
Hello World!

This is the personal website of Christoph Winkler.
Here you will find a sort of blog and some information about me and my projectshave fun!

Recent Comments
Latest Tweets
QR-Code: aktuelle Seiten-URL
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 3.0 Unported