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.
- 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. - 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:
1 |
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 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:
1 |
https://api.darksky.net/forecast/DeinenDarkskyKey/48.140276,11.559858?lang=de&units=auto |
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
1 2 |
!/usr/bin/python #coding=UTF-8 |
Anschließend wird die soeben installierte Requests Bibliothek importiert
1 |
import requests |
Zunächst einmal müssen wir den Webservice mit dem oben ausprobierten Aufruf ansprechen und den gelieferten Output einem Python Objekt [hier: r] zuweisen.
1 |
r = requests.get("https://api.darksky.net/forecast/DeinDarkskyKey/45.66,10.74?lang=de&exclude=minutely,hourly&units=auto") |
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:
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/python #coding=UTF-8 import requests # get data from location as JSON r = requests.get("https://api.darksky.net/forecast/DeinDarkskyKey/48.140276,11.559858?lang=de&exclude=minutely,hourly&units=auto") data = r.json() # data contains the parsed JSON string print data # just to check that it worked r.close() # good practice to close files after use |
und hier der Output davon:
1 |
{"latitude":48.140276,"longitude":11.559858,"timezone":"Europe/Berlin","currently":{"time":1540814475,"summary":"Stark bewölkt","icon":"cloudy","precipIntensity":0,"precipProbability":0,"temperature":6.18,"apparentTemperature":2.85,"dewPoint":5.97,"humidity":0.99,"pressure":995.31,"windSpeed":4.91,"windGust":7.22,"windBearing":81,"cloudCover":1,"uvIndex":2,"visibility":4.67,"ozone":295.83},"daily":{"summary":"Die ganze Woche kein Niederschlag mit einem Temperaturminimum von 11°C am Mittwoch.","icon":"clear-day","data":[{"time":1540767600,"summary":"Vormittag Nebel und Nacht frische Brise.","icon":"wind","sunriseTime":1540792534,"sunsetTime":1540828905,"moonPhase":0.67,"precipIntensity":0.0178,"precipIntensityMax":0.1092,"precipIntensityMaxTime":1540836000,"precipProbability":0.25,"precipType":"rain","temperatureHigh":12.87,"temperatureHighTime":1540828800,"temperatureLow":6.49,"temperatureLowTime":1540882800,"apparentTemperatureHigh":12.87,"apparentTemperatureHighTime":1540828800,"apparentTemperatureLow":3.96,"apparentTemperatureLowTime":1540882800,"dewPoint":5.99,"humidity":0.92,"pressure":996.55,"windSpeed":3.47,"windGust":14.53,"windGustTime":1540850400,"windBearing":82,"cloudCover":0.94,"uvIndex":2,"uvIndexTime":1540807200,"visibility":10.56,"ozone":298.13,"temperatureMin":2.52,"temperatureMinTime":1540767600,"temperatureMax":13.18,"temperatureMaxTime":1540843200,"apparentTemperatureMin":-0.13,"apparentTemperatureMinTime":1540774800,"apparentTemperatureMax":13.18,"apparentTemperatureMaxTime":1540843200},{"time":1540854000,"summary":"Vormittag frische Brise und den ganzen Tag lang überwiegend bewölkt.","icon":"wind","sunriseTime":1540879027,"sunsetTime":1540915206,"moonPhase":0.7,"precipIntensity":0.0051,"precipIntensityMax":0.0533,"precipIntensityMaxTime":1540857600,"precipProbability":0.06,"precipType":"rain","temperatureHigh":9.23,"temperatureHighTime":1540900800,"temperatureLow":0.56,"temperatureLowTime":1540965600,"apparentTemperatureHigh":7.36,"apparentTemperatureHighTime":1540900800,"apparentTemperatureLow":-2.27,"apparentTemperatureLowTime":1540965600,"dewPoint":2.36,"humidity":0.66,"pressure":999.3,"windSpeed":1.88,"windGust":18.79,"windGustTime":1540868400,"windBearing":212,"cloudCover":0.71,"uvIndex":1,"uvIndexTime":1540886400,"visibility":16.09,"ozone":324.21,"temperatureMin":4.02,"temperatureMinTime":1540936800,"temperatureMax":12.83,"temperatureMaxTime":1540864800,"apparentTemperatureMin":1.94,"apparentTemperatureMinTime":1540936800,"apparentTemperatureMax":12.83,"apparentTemperatureMaxTime":1540864800},{"time":1540940400,"summary":"Den ganzen Tag lang überwiegend bewölkt.","icon":"partly-cloudy-night","sunriseTime":1540965520,"sunsetTime":1541001509,"moonPhase":0.74,"precipIntensity":0.0025,"precipIntensityMax":0.0051,"precipIntensityMaxTime":1540944000,"precipProbability":0.06,"precipType":"rain","temperatureHigh":10.87,"temperatureHighTime":1540990800,"temperatureLow":4.86,"temperatureLowTime":1541052000,"apparentTemperatureHigh":10.87,"apparentTemperatureHighTime":1540990800,"apparentTemperatureLow":3.3,"apparentTemperatureLowTime":1541052000,"dewPoint":1.93,"humidity":0.74,"pressure":1015.98,"windSpeed":2.63,"windGust":8.57,"windGustTime":1540998000,"windBearing":119,"cloudCover":0.6,"uvIndex":2,"uvIndexTime":1540983600,"visibility":16.09,"ozone":303.44,"temperatureMin":0.56,"temperatureMinTime":1540965600,"temperatureMax":10.87,"temperatureMaxTime":1540990800,"apparentTemperatureMin":-2.27,"apparentTemperatureMinTime":1540965600,"apparentTemperatureMax":10.87,"apparentTemperatureMaxTime":1540990800},{"time":1541026800,"summary":"Den ganzen Tag lang überwiegend bewölkt.","icon":"partly-cloudy-day","sunriseTime":1541052014,"sunsetTime":1541087813,"moonPhase":0.78,"precipIntensity":0.0025,"precipIntensityMax":0.0279,"precipIntensityMaxTime":1541109600,"precipProbability":0.19,"precipType":"rain","temperatureHigh":14.5,"temperatureHighTime":1541073600,"temperatureLow":6.02,"temperatureLowTime":1541134800,"apparentTemperatureHigh":14.5,"apparentTemperatureHighTime":1541073600,"apparentTemperatureLow":5.64,"apparentTemperatureLowTime":1541131200,"dewPoint":3.39,"humidity":0.66,"pressure":1015.77,"windSpeed":0.79,"windGust":4.96,"windGustTime":1541026800,"windBearing":201,"cloudCover":0.79,"uvIndex":2,"uvIndexTime":1541070000,"visibility":16.09,"ozone":293.36,"temperatureMin":4.86,"temperatureMinTime":1541052000,"temperatureMax":14.5,"temperatureMaxTime":1541073600,"apparentTemperatureMin":3.3,"apparentTemperatureMinTime":1541052000,"apparentTemperatureMax":14.5,"apparentTemperatureMaxTime":1541073600},{"time":1541113200,"summary":"Den ganzen Tag lang überwiegend bewölkt.","icon":"partly-cloudy-day","sunriseTime":1541138507,"sunsetTime":1541174119,"moonPhase":0.82,"precipIntensity":0.0457,"precipIntensityMax":0.2083,"precipIntensityMaxTime":1541138400,"precipProbability":0.69,"precipType":"rain","temperatureHigh":12.96,"temperatureHighTime":1541167200,"temperatureLow":7.57,"temperatureLowTime":1541224800,"apparentTemperatureHigh":12.96,"apparentTemperatureHighTime":1541167200,"apparentTemperatureLow":6.08,"apparentTemperatureLowTime":1541224800,"dewPoint":5.95,"humidity":0.82,"pressure":1023.26,"windSpeed":0.76,"windGust":4.14,"windGustTime":1541127600,"windBearing":140,"cloudCover":0.93,"uvIndex":2,"uvIndexTime":1541152800,"visibility":16.09,"ozone":289.43,"temperatureMin":6.02,"temperatureMinTime":1541134800,"temperatureMax":12.96,"temperatureMaxTime":1541167200,"apparentTemperatureMin":5.64,"apparentTemperatureMinTime":1541131200,"apparentTemperatureMax":12.96,"apparentTemperatureMaxTime":1541167200},{"time":1541199600,"summary":"Den ganzen Tag lang überwiegend bewölkt.","icon":"partly-cloudy-day","sunriseTime":1541225001,"sunsetTime":1541260427,"moonPhase":0.85,"precipIntensity":0.0406,"precipIntensityMax":0.2438,"precipIntensityMaxTime":1541268000,"precipProbability":0.39,"precipType":"rain","temperatureHigh":13.31,"temperatureHighTime":1541250000,"temperatureLow":9.22,"temperatureLowTime":1541307600,"apparentTemperatureHigh":13.31,"apparentTemperatureHighTime":1541250000,"apparentTemperatureLow":8.01,"apparentTemperatureLowTime":1541307600,"dewPoint":6.75,"humidity":0.8,"pressure":1023.23,"windSpeed":1.85,"windGust":3.61,"windGustTime":1541271600,"windBearing":152,"cloudCover":0.77,"uvIndex":2,"uvIndexTime":1541239200,"visibility":16.09,"ozone":274.17,"temperatureMin":7.57,"temperatureMinTime":1541224800,"temperatureMax":13.31,"temperatureMaxTime":1541250000,"apparentTemperatureMin":6.08,"apparentTemperatureMinTime":1541224800,"apparentTemperatureMax":13.31,"apparentTemperatureMaxTime":1541250000},{"time":1541286000,"summary":"Den ganzen Tag lang stark bewölkt.","icon":"cloudy","sunriseTime":1541311495,"sunsetTime":1541346736,"moonPhase":0.89,"precipIntensity":0.0127,"precipIntensityMax":0.066,"precipIntensityMaxTime":1541368800,"precipProbability":0.25,"precipType":"rain","temperatureHigh":13.98,"temperatureHighTime":1541340000,"temperatureLow":7,"temperatureLowTime":1541397600,"apparentTemperatureHigh":13.98,"apparentTemperatureHighTime":1541340000,"apparentTemperatureLow":7,"apparentTemperatureLowTime":1541397600,"dewPoint":6.86,"humidity":0.74,"pressure":1015.71,"windSpeed":1.64,"windGust":6.26,"windGustTime":1541361600,"windBearing":187,"cloudCover":0.95,"uvIndex":2,"uvIndexTime":1541329200,"visibility":16.09,"ozone":274.43,"temperatureMin":9.22,"temperatureMinTime":1541307600,"temperatureMax":13.98,"temperatureMaxTime":1541340000,"apparentTemperatureMin":8.01,"apparentTemperatureMinTime":1541307600,"apparentTemperatureMax":13.98,"apparentTemperatureMaxTime":1541340000},{"time":1541372400,"summary":"Den ganzen Tag lang stark bewölkt.","icon":"cloudy","sunriseTime":1541397988,"sunsetTime":1541433046,"moonPhase":0.93,"precipIntensity":0.0686,"precipIntensityMax":0.3073,"precipIntensityMaxTime":1541383200,"precipProbability":0.49,"precipType":"rain","temperatureHigh":13.52,"temperatureHighTime":1541430000,"temperatureLow":6.5,"temperatureLowTime":1541487600,"apparentTemperatureHigh":13.52,"apparentTemperatureHighTime":1541430000,"apparentTemperatureLow":3.21,"apparentTemperatureLowTime":1541484000,"dewPoint":6.39,"humidity":0.76,"pressure":1004.83,"windSpeed":2.41,"windGust":12.82,"windGustTime":1541440800,"windBearing":100,"cloudCover":0.97,"uvIndex":1,"uvIndexTime":1541408400,"visibility":16.09,"ozone":287.3,"temperatureMin":7,"temperatureMinTime":1541397600,"temperatureMax":13.52,"temperatureMaxTime":1541430000,"apparentTemperatureMin":7,"apparentTemperatureMinTime":1541397600,"apparentTemperatureMax":13.52,"apparentTemperatureMaxTime":1541430000}]},"flags":{"sources":["meteoalarm","cmc","gfs","icon","isd","madis"],"meteoalarm-license":"Based on data from EUMETNET - MeteoAlarm [https://www.meteoalarm.eu/]. Time delays between this website and the MeteoAlarm website are possible; for the most up to date information about alert levels as published by the participating National Meteorological Services please use the MeteoAlarm website.","nearest-station":8.111,"units":"si"},"offset":1} |
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.
1 |
sunrise_time = dt.fromtimestamp(data['daily']['data'][0]['sunriseTime']).strftime('%H:%M') |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/usr/bin/python #coding=UTF-8 import requests from datetime import datetime as dt from datetime import date # inits degreeChar = u'\N{DEGREE SIGN}' fcast = [] wdays = ["Mo","Di","Mi","Do","Fr","Sa","So"] #get webservice data r = requests.get("https://api.darksky.net/forecast/DeinDarkskyKey1/48.140276,11.559858?lang=de&exclude=minutely,hourly&units=auto") data=r.json() # data contains the parsed JSON string r.close() # Get sunrise/sunset in readable format sunrise_time = dt.fromtimestamp(data['daily']['data'][0]['sunriseTime']).strftime('%H:%M') sunset_time = dt.fromtimestamp(data['daily']['data'][0]['sunsetTime']).strftime('%H:%M') print "Sonnenaufgang:", sunrise_time print "Sonnenuntergang:", sunset_time # Forecast 7 day summary summary = data['daily']['summary'] print "Vorhersage für die nächsten 7 Tage:", summary #Iteration across all available days for day in data['daily']['data']: fctext = day['summary'] fcdegmax = day['temperatureHigh'] fcdegmin = day['temperatureLow'] fcweekday = date.fromtimestamp(day['time']).weekday() fcast.append(fctext) # Optional for further processing print "%s: %s %1.0f%sC/%1.0f%sC" % (wdays[fcweekday],fctext,fcdegmax,degreeChar,fcdegmin,degreeChar) |
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.
1 2 3 4 5 6 7 8 9 10 11 |
Sonnenaufgang: 06:57 Sonnenuntergang: 17:00 Vorhersage für heute und die nächsten 7 Tage: Die ganze Woche kein Niederschlag mit steigender Temperatur von 14°C am Montag. Di: Vormittag frische Brise sowie überwiegend bewölkt bis abends. 10°C/1°C Mi: Den ganzen Tag lang überwiegend bewölkt. 11°C/2°C Do: Den ganzen Tag lang überwiegend bewölkt. 13°C/7°C Fr: Den ganzen Tag lang überwiegend bewölkt. 13°C/6°C Sa: Überwiegend bewölkt bis Nachmittag. 12°C/2°C So: Den ganzen Tag lang überwiegend bewölkt. 13°C/4°C Mo: Überwiegend bewölkt bis abends. 14°C/5°C Di: Den ganzen Tag lang überwiegend bewölkt. 14°C/6°C |
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.
Leider hat Apple Darksky übernommen (https://blog.darksky.net/). Somit kann man sich nicht mehr als API Nutzer registrieren.
Danke für diese traurige Nachricht. Ich werde meinen Beitrag dann nochmal umschreiben.
Gruß aus München
Chris
https://github.com/Ash-Lambert/Wetter
Hier mal das ganze Wetter in JavaScript über openweathermap.org für einen Tag.
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
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