{"id":1065,"date":"2018-10-30T13:23:33","date_gmt":"2018-10-30T12:23:33","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=1065"},"modified":"2021-02-14T13:02:16","modified_gmt":"2021-02-14T12:02:16","slug":"wettervorhersage-im-json-format-auslesen-und-interpretieren","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/wettervorhersage-im-json-format-auslesen-und-interpretieren\/","title":{"rendered":"Wettervorhersage im JSON Format auslesen und interpretieren"},"content":{"rendered":"<h6 class=\"\"><em>Dieser Artikel ist ein Update des inzwischen veralteten Artikels <span style=\"color: #000000;\"><a style=\"color: #000000;\" href=\"https:\/\/www.rustimation.eu\/index.php\/wetterbericht-und-astrodaten-auslesen-und-mit-json-verarbeiten\/\" target=\"_blank\" rel=\"noopener noreferrer\">\"Wetterbericht und Astrodaten auslesen&#8230;<\/a><\/span>\"<br \/>\n<\/em><\/h6>\n<h6><em>&#8230; und eigentlich schon wieder veraltet, da Darksky.net von Apple \u00fcbernommen wurde und keine neuen kostenlosen Accounts mehr angenommen werden. Das Update <a href=\"https:\/\/www.rustimation.eu\/index.php\/nochmal-update-wetterbericht-im-json-format-auslesen-und-verarbeiten\/\">findet ihr hier<\/a>.<\/em><\/h6>\n<p>In meine <a title=\"rusticam Le Fasse - Lago di Garda\" href=\"http:\/\/rusticam.eu\" target=\"_blank\" rel=\"noopener noreferrer\">Webcam <\/a>m\u00f6chte ich einen Wetterbericht mit einigen Tagen Vorausschau einblenden.<\/p>\n<p>Der bisher von mir verwendete Webservice von <em>Weather Underground<\/em> stellt seine kostenfreie Schnittstelle zum Ende 2018 ein. Ich habe mich deshalb nach Alternativen umgesehen.<\/p>\n<p><!--more--><\/p>\n<ol>\n<li><a href=\"https:\/\/openweathermap.org\/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Openweathermap.org<\/strong><\/a>: Sehr m\u00e4chtiger 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\u00f6derweise kostet der Service mit tageweiser Vorhersage etwas. Damit kommt Openweathermap f\u00fcr meine Zwecke nicht in Frage.<br \/>\nOkay, man k\u00f6nnte sich, so wie Darksky das macht, den jeweils schlechtesten Wetterbericht eine Tages rauspicken und diesen f\u00fcr den ganzen Tag hernehmen sowie die Tages-Maxima bzw. Minima f\u00fcr die Temperatur ermitteln. Aber das ist mir zu m\u00fchsam.<\/li>\n<li><a href=\"https:\/\/darksky.net\/dev\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Darksky.net<\/strong><\/a>: Ebenfalls kostenlos (max. 1000 Abrufe\/Tag) aber optional mit Tagesberichten f\u00fcr 8 Tage &#8211; genau das, was ich brauche. Zus\u00e4tzlich g\u00e4be es noch eine minutengenaue Vorhersage und eine st\u00fcndliche Vorhersage.\u00a0 In wie weit diese f\u00fcr Mittel- oder S\u00fcdeuropa genau ist, muss sich noch zeigen. Jedenfalls kann man diese Werte auch aus der Response ausblenden um Zugriffszeiten und Pufferplatz zu sparen.<br \/>\nFerner hat Darksky auch Sonnenaufgangs und -untergangszeiten sowie eine Angabe der Mondphase f\u00fcr den Tag.<\/li>\n<\/ol>\n<p style=\"padding-left: 60px;\"><span style=\"color: #808080;\"><strong>\u00c0 propos Mond<\/strong>: vielleicht etwas nerdig, aber ich will eine m\u00f6glichst genaue Anzeige der Mondphase und der sichtbaren Mondoberfl\u00e4che in Prozent. Ich <a href=\"https:\/\/www.rustimation.eu\/index.php\/mondphase-und-beleuchtung-ausrechnen\/\">errechne deshalb die Mondphase selbst<\/a>.<br \/>\n<\/span><\/p>\n<h2>Schritt 1: Account anlegen<\/h2>\n<p>Surft zu <a href=\"https:\/\/darksky.net\/dev\">https:\/\/darksky.net\/dev<\/a> und klickt den Button \"Try for free\" an.<\/p>\n<p>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\u00e4tigungslink. Dieses Link f\u00fchrt dann zu einer Seite, auf welcher euer geheimer Schl\u00fcssel [key] der Art\u00a0<em>14db9bc3e02b53a556ad7d67103a7b29<\/em> angezeigt wird. Mit diesem Schl\u00fcssel m\u00fcsst ihr euch bzw. euer Programm bei k\u00fcnftigen Abfragen ausweisen.<\/p>\n<h2>Schritt 2: Webservice ansprechen<\/h2>\n<p>Irgendwie m\u00fcssen die Daten aus dem Webservice in Python eingelesen werden. Daf\u00fcr gibt es in Python Standardmethoden. Mit der standardm\u00e4\u00dfig vorhandenen urllib2 Library habe ich mich allerdings etwas schwer getan. Die neuere\u00a0 Library \"Requests\" ist meines Erachtens leichter zu bedienen, enth\u00e4lt netterweise auch die ben\u00f6tigten JSON Funktionen, muss aber erst noch installiert werden. Doch keine Angst, die Installation ist unkompliziert:<\/p>\n<blockquote><p><em>Requests is an elegant and simple HTTP library for Python, built for human beings.<\/em><\/p><\/blockquote>\n<p>Der Entwickler empfiehlt, das Paket mit\u00a0 <code>pip <\/code>zu installieren:<\/p>\n<pre>sudo pip install requests<\/pre>\n<p>Wenn es zu einer Fehlermeldung kommt, weil <code>pip <\/code>noch nicht installiert ist, dann muss das <code>pip <\/code>Paket ebenfalls installiert werden &#8211; am besten gleich noch sicherstellen, dass ein weiteres wichtiges Entwicklerpaket mit installiert wird:<\/p>\n<pre class=\"lang:sh decode:1 inline:1 \">sudo apt-get install python-pip python-dev<\/pre>\n<p>anschlie\u00dfend <code>requests <\/code>wie oben dargestellt installieren.<\/p>\n<p>Wer tiefer einsteigen will: weitere Info gibts bei <a title=\"Requests\" href=\"http:\/\/docs.python-requests.org\/en\/latest\/user\/install\/\" target=\"_blank\" rel=\"noopener noreferrer\">Python Requests.<\/a><\/p>\n<p>Damit ist euer Pi f\u00fcr die folgenden Schritte ger\u00fcstet.<\/p>\n<h2>Schritt 3: JSON verarbeiten<\/h2>\n<p>Bez\u00fcglich der Darksky angebotenen Daten und deren Struktur gibt es eine gute Dokumentation auf deren Site\u00a0 <a href=\"https:\/\/darksky.net\/dev\/docs\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/darksky.net\/dev\/docs<\/a>.<\/p>\n<h4>a: Das JSON Format anschauen<\/h4>\n<p>Um das Prinzip zu verdeutlichen, nehmen wir uns f\u00fcr den Anfang den allgemeinen Wetter\u00fcberblick vor.<\/p>\n<p>Gebt zuerst einmal folgende Zeile in euren <strong>Browser<\/strong> ein:<\/p>\n<pre class=\"expand:true lang:sh decode:true\"><code class=\"EnlighterJSRAW\" data-enlighter-language=\"html\">https:\/\/api.darksky.net\/forecast\/DeinenDarkskyKey\/48.140276,11.559858?lang=de&amp;units=auto<\/code><\/pre>\n<p>Anstatt <em>DeinenDarkskyKey<\/em> nehmt ihr nat\u00fcrlich euren eigenen, vorhin generierten Key. Die Zahlen am Ende sind die Geokoordinaten f\u00fcr den Ort, f\u00fcr den ihr die heutigen Astrodaten wissen wollt &#8211; in diesem Beispiel ist es der Hauptbahnhof M\u00fcnchen. Mit einem anschlie\u00dfenden Fragezeichen k\u00f6nnen weitere Aufrufparameter \u00fcbergeben werden, die dann untereinander durch ein Ampersand \"&amp;\" getrennt werden. Beim obigen Beispiel ist das die Sprache (lang=de) sowie metrische Einheiten ( &amp;units=auto)<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #808080;\"><strong>Hinweis<\/strong><\/span>: Geokoordinaten bekommt ihr heraus, indem ihr bei Google Maps die gew\u00fcnschte Gegend anzeigt und dann einen Rechtsklick auf die Stelle macht, deren Koordinaten ihr wissen wollt. Dann \"was ist hier\" ausw\u00e4hlen. Oben links werden dann die Geokoordinaten schon im richtigen Format angezeigt. Diese einfach mit Cut&amp;Paste \u00fcbernehmen und in die Codezeile eintragen. Dabei nicht vergessen, das Leerzeichen nach dem Komma zu entfernen.<\/p>\n<p>Ich arbeite praktisch nur mit dem Firefox Browser, da wei\u00df ich wenigstens, dass mein Sufverhalten nicht weiterverkauft wird &#8211; anders als bei Chrome oder Edge. Firefox hat eine sehr gute eingebaute Darstellung des empfangenen JSON Objekts. Edge und Chome k\u00f6nnen das \u00fcbrigens von Haus aus nicht.<\/p>\n<p>Das im Firefox Browser angezeigte Ergebnis f\u00fcr den 23. Oktober 2018 ist dann wie folgt:<\/p>\n<p><em>&lt;&lt;kein Bild mehr vorhanden&gt;&gt;<\/em><\/p>\n<p>Diese wundersch\u00f6n strukturierten Informationen k\u00f6nnen wir in Python jetzt ganz elegant verarbeiten.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #808080;\"><strong>Exkurs<\/strong>: Auch eine sch\u00f6n lesbare Struktur erhaltet ihr mit meinem Lieblingseditor Notepad++, der allerdings noch \u00fcber den Plugin Manager die Erweiterung \"JSON Viewer\" bekommen muss. Notepad++ gibts kostenlos im Internet. Tante Google fragen.<\/span><br \/>\n<span style=\"color: #808080;\">Dazu den Men\u00fcpunkt <em>Erweiterungen<\/em> ausw\u00e4hlen und dann auf <em>Plugin Manager<\/em> gehen. Dort dann unter dem Tab <em>Available<\/em> den JSON Viewer ausw\u00e4hlen und auf <em>Install<\/em> klicken.<\/span><br \/>\n<span style=\"color: #808080;\">Zum Ansehen, den JSON String aus dem Browser in ein Bearbeitungsfenster von Notepad++ reinkopieren, mit der Maus komplett markieren und dann unter <em>Erweiterungen<\/em> &#8211; <em>JSON Viewer<\/em> &#8211; <em>Format JSON<\/em> anklicken. Et voil\u00e0, JSON ist so noch besser anzusehen.<\/span><br \/>\n<span style=\"color: #808080;\">Ganz toll ist auch der Online JSON Editor bei <\/span><a href=\"http:\/\/jsoneditoronline.org\/\"><span style=\"color: #808080;\">http:\/\/jsoneditoronline.org\/<\/span><\/a><\/p>\n<h3>b: Ein JSON Ojekt erzeugen<\/h3>\n<p>In die erste Zeile unseres Progr\u00e4mmchens kommt das \"<a title=\"Shebang! Oder wie man Python wegl\u00e4sst\" href=\"http:\/\/www.rustimation.eu\/index.php\/shebang-oder-wie-man-python-weglaesst\/\">Shebang<\/a>\" f\u00fcr Python. Dann noch die Codierung f\u00fcr UTF-8<\/p>\n<pre class=\"lang:python decode:true EnlighterJSRAW\" data-enlighter-language=\"python\">!\/usr\/bin\/python\r\n#coding=UTF-8<\/pre>\n<p>Anschlie\u00dfend wird die soeben installierte Requests Bibliothek importiert<\/p>\n<pre class=\"lang:python decode:true EnlighterJSRAW\" data-enlighter-language=\"python\"><code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import requests<\/code><\/pre>\n<p>Zun\u00e4chst einmal m\u00fcssen wir den Webservice mit dem oben ausprobierten Aufruf ansprechen und den gelieferten Output einem Python Objekt [hier: r] zuweisen.<\/p>\n<pre class=\"expand:true lang:python decode:true EnlighterJSRAW\" data-enlighter-language=\"python\">r = requests.get(\"https:\/\/api.darksky.net\/forecast\/DeinDarkskyKey\/45.66,10.74?lang=de&amp;exclude=minutely,hourly&amp;units=auto\")<\/pre>\n<p>Damit kann man allerdings herzlich wenig anfangen. Das Objekt muss noch als JSON String geparsed (d.h. zergliedert) werden:<\/p>\n<pre class=\"lang:python decode:1 inline:1 \">data = r.json()<\/pre>\n<p><code>data <\/code>ist ein Python Dictionary Objekt und enth\u00e4lt den ganzen JSON String , nicht besonders sch\u00f6n anzusehen, aber komplett.<\/p>\n<p>Hier noch das ganze Code Snippet:<\/p>\n<pre class=\"expand:true lang:python decode:true EnlighterJSRAW\" data-enlighter-language=\"python\">#!\/usr\/bin\/python\r\n#coding=UTF-8\r\n\r\nimport requests\r\n\r\n# get data from location as JSON\r\nr = requests.get(\"https:\/\/api.darksky.net\/forecast\/DeinDarkskyKey\/48.140276,11.559858?lang=de&amp;exclude=minutely,hourly&amp;units=auto\")\r\ndata = r.json() # data contains the parsed JSON string\r\nprint data      # just to check that it worked\r\nr.close()       # good practice to close files after use   \r\n<\/pre>\n<p>und hier der Output davon:<\/p>\n<pre class=\"height-set:true height:250 wrap:true lang:sh decode:true EnlighterJSRAW \" data-enlighter-language=\"json\">{\"latitude\":48.140276,\"longitude\":11.559858,\"timezone\":\"Europe\/Berlin\",\"currently\":{\"time\":1540814475,\"summary\":\"Stark bew\u00f6lkt\",\"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\u00b0C 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 \u00fcberwiegend bew\u00f6lkt.\",\"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 \u00fcberwiegend bew\u00f6lkt.\",\"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 \u00fcberwiegend bew\u00f6lkt.\",\"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 \u00fcberwiegend bew\u00f6lkt.\",\"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 \u00fcberwiegend bew\u00f6lkt.\",\"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\u00f6lkt.\",\"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\u00f6lkt.\",\"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}<\/pre>\n<h3>c: Einzelne JSON Elemente ansprechen<\/h3>\n<p>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 <code>daily<\/code> dann <code>data<\/code> dann die fortlaufende Nummer, wobei <code>0<\/code> f\u00fcr den aktuellen Tag steht und schlie\u00dflich das Element<\/p>\n<pre class=\"lang:default decode:1 inline:1 \">sunriseTime<\/pre>\n<p>.<br \/>\nIn Python ausgedr\u00fcckt sieht das so aus:<\/p>\n<pre class=\"lang:python decode:1 inline:1 \">sunrise = data['daily']['data'][0]['sunriseTime']\r\n<\/pre>\n<p>Die Zeit wird allerdings als UNIX Zeitstempel, eine 10stellige Zahl,\u00a0 ausgegeben. Zur lesbaren Darstellung kann man diesen Wert mittels <em>strftime<\/em> nat\u00fcrlich gleich konvertieren. Hierzu muss allerdings noch \"datetime\" Attribut der <em>datetime<\/em> Bibliothek\u00a0 importiert werden<\/p>\n<pre class=\"lang:default decode:1 inline:1 \">from datetime import datetime as dt<\/pre>\n<p>. Die darin steckenden Routinen brauchen wir sp\u00e4ter auch noch f\u00fcr die Anzeige des Wochentags. Das <em>as dt<\/em> ist nur eine wahlfreie Abk\u00fcrzung zur Vermeidung von Schreibarbeit.<\/p>\n<pre class=\"lang:default decode:true EnlighterJSRAW\" data-enlighter-language=\"python\">sunrise_time = dt.fromtimestamp(data['daily']['data'][0]['sunriseTime']).strftime('%H:%M')<\/pre>\n<p style=\"padding-left: 30px;\"><span style=\"color: #808080;\"><strong>Hinweis<\/strong>: Darksky bezieht sich bei den Zeitangaben immer auf die Zeit des Ortes, dessen Koordinaten man eingegeben hat. Es ist also keine Konversion von UTC (<a href=\"https:\/\/www.timeanddate.com\/worldclock\/timezone\/utc\">Universal Time Coordinated<\/a>) n\u00f6tig. Die Zeitstempel f\u00fcr die einzelnen Tages-Wetterberichte beziehen sich immer auf 0 Uhr Ortszeit.<\/span><\/p>\n<h4>d: Iteration<\/h4>\n<p>Bei iterativen Daten, z.B. der Wettervorhersage f\u00fcr heute und die n\u00e4chsten 7 Tage kann man das nat\u00fcrlich auch per Schleife auslesen. Die Schleife l\u00e4uft \u00fcber den Wert 'day' in der dritten Ebene<\/p>\n<pre class=\"lang:python decode:1 inline:1 \">['daily']['data'][day]<\/pre>\n<p>also die Stelle, wo wir vorhin nur die \"0\" verwendet haben.<\/p>\n<pre class=\"expand:true lang:python mark:15 decode:true EnlighterJSRAW\" data-enlighter-language=\"python\"><code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">#!\/usr\/bin\/python\r\n#coding=UTF-8\r\n \r\nimport requests\r\nfrom datetime import datetime as dt\r\nfrom datetime import date \r\n\r\n# inits\r\ndegreeChar = u'\\N{DEGREE SIGN}'\r\nfcast = []\r\nwdays = [\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\",\"So\"]\r\n \r\n#get webservice data\r\nr = requests.get(\"https:\/\/api.darksky.net\/forecast\/DeinDarkskyKey1\/48.140276,11.559858?lang=de&amp;exclude=minutely,hourly&amp;units=auto\")\r\ndata=r.json() # data contains the parsed JSON string\r\nr.close()\r\n\r\n# Get sunrise\/sunset in readable format\r\nsunrise_time = dt.fromtimestamp(data['daily']['data'][0]['sunriseTime']).strftime('%H:%M')\r\nsunset_time = dt.fromtimestamp(data['daily']['data'][0]['sunsetTime']).strftime('%H:%M')\r\nprint \"Sonnenaufgang:\", sunrise_time\r\nprint \"Sonnenuntergang:\", sunset_time\r\n\r\n# Forecast 7 day summary\r\nsummary = data['daily']['summary']\r\nprint \"Vorhersage f\u00fcr die n\u00e4chsten 7 Tage:\", summary\r\n\r\n#Iteration across all available days\r\nfor day in data['daily']['data']:\r\n    fctext = day['summary']\r\n    fcdegmax = day['temperatureHigh']\r\n    fcdegmin = day['temperatureLow']\r\n    fcweekday = date.fromtimestamp(day['time']).weekday()  \r\n    fcast.append(fctext)  # Optional for further processing\r\n    \r\n    print \"%s: %s %1.0f%sC\/%1.0f%sC\" % (wdays[fcweekday],fctext,fcdegmax,degreeChar,fcdegmin,degreeChar)\r\n\r\n<\/code><\/pre>\n<p>Der Array <code>fcst[x]<\/code> enth\u00e4lt die Wettervorhersage f\u00fcr den Tag 0 bis 7, also acht Tage. Diese Daten k\u00f6nnt ihr nach Belieben in euren Programmen weiterverwenden. Bei \u00f6ffentlich sichtbarer Verwendung von Darksky Informationen muss gem\u00e4\u00df Lizenzbedingungen ein Hinweis auf die Quelle gezeigt werden.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #808080;\">Ich pers\u00f6nlich verwende nur die ersten vier Tage des Wetterberichts. Hier ist die Eintrittswahrscheinlichkeit noch relativ gro\u00df.<\/span><\/p>\n<p>Das Gradzeichen ist im normalen Zeichensatz nicht vorhanden und wird \u00fcber <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">degreeChar = u'\\N{DEGREE SIGN}'<\/code> erzeugt.<\/p>\n<p>Der Output sieht dann hoffentlich so \u00e4hnlich wie hier aus.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Sonnenaufgang: 06:57\r\nSonnenuntergang: 17:00\r\nVorhersage f\u00fcr heute und die n\u00e4chsten 7 Tage: Die ganze Woche kein Niederschlag mit steigender Temperatur von 14\u00b0C am Montag.\r\nDi: Vormittag frische Brise sowie \u00fcberwiegend bew\u00f6lkt bis abends. 10\u00b0C\/1\u00b0C\r\nMi: Den ganzen Tag lang \u00fcberwiegend bew\u00f6lkt. 11\u00b0C\/2\u00b0C\r\nDo: Den ganzen Tag lang \u00fcberwiegend bew\u00f6lkt. 13\u00b0C\/7\u00b0C\r\nFr: Den ganzen Tag lang \u00fcberwiegend bew\u00f6lkt. 13\u00b0C\/6\u00b0C\r\nSa: \u00dcberwiegend bew\u00f6lkt bis Nachmittag. 12\u00b0C\/2\u00b0C\r\nSo: Den ganzen Tag lang \u00fcberwiegend bew\u00f6lkt. 13\u00b0C\/4\u00b0C\r\nMo: \u00dcberwiegend bew\u00f6lkt bis abends. 14\u00b0C\/5\u00b0C\r\nDi: Den ganzen Tag lang \u00fcberwiegend bew\u00f6lkt. 14\u00b0C\/6\u00b0C<\/pre>\n<p>Bei Interesse einfach tiefer bei Darksky graben, es gibt da alle m\u00f6glichen Wetter-Informationen.<\/p>\n<p>Dieser Beitrag wurde inspiriert von der wirklich gut gemachten Site <a href=\"http:\/\/www.pythonforbeginners.com\/scraping\/scraping-wunderground\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.pythonforbeginners.com\/scraping\/scraping-wunderground <\/a>wobei auch diese Seite jetzt veraltet sein d\u00fcrfte.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit einem Raspberry Pi und Python einen Wetter-Webservice auslesen, interpretieren und weiterverarbeiten.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,9],"tags":[96,95,44,45,50,51],"class_list":["post-1065","post","type-post","status-publish","format-standard","hentry","category-json","category-python","tag-api","tag-darksky","tag-sonnenaufgang","tag-sonnenuntergang","tag-webservice","tag-wetterbericht"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1065"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1065\/revisions"}],"predecessor-version":[{"id":1641,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1065\/revisions\/1641"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=1065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=1065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}