Kampis Elektroecke

Auslesen von Wetterdaten

Raspberry Pi

In dieses Beispiel möchte ich zeigen, wie Wetterdaten abrufen und mittels eines Python-Programms weiter verarbeitet werden können. Auf diese Weise kann z. B. das aktuelle Wetter auf einer Webseite oder dem Bildschirm ausgegeben werden. Als Quelle für die Wetterdaten soll die Datenbank von OpenWeatherMap genutzt werden.

Den Dienst nutzen:

Um den Dienst nutzen zu können, ist ein API-Schlüssel notwendig, für den ein Account bei OpenWeatherMap benötigt wird. Sowohl der Account, als auch der API-Schlüssel sind umsonst. Sobald der Account angelegt worden ist, kann man über das Menü API keys seines Profils einen neuen API-Schlüssel erzeugen (der gezeigte Schlüssel ist nur ein Testschlüssel).

Der neue API-Schlüssel steht dann sofort zur Verfügung und kann direkt verwendet werden.

Mit dem Gratisabonnement können Informationen zum aktuellen Wetter oder einer Vorhersage für 5 Tage im 3 h Intervall abgerufen werden. Weitere Dienste sind dann kostenpflichtig.

Aktuelle Wetterdaten können nach der Anmeldung und nach dem Erzeugen eines API-Schlüssels mit der folgenden Anfrage abgerufen werden:

Die Werte Stadt und Schlüssel werden mit der abzufragenden Stadt und dem angelegten API-Schlüssel ersetzt. Das Ergebnis der Abfrage sind die Daten im JSON-Format, die dann ausgewertet werden können.

Was ist eine JSON-Datei?:

Eine JSON-Datei (JavaScript Object Notation) ist eine Datei, die Daten, bzw. Datenstrukturen in einer kompakten Datenstruktur abgelegt. Sie ermöglicht es Daten effizient zwischen verschiedenen Anwendungen, wie z. B. das Internet oder andere Computersysteme auszutauschen. Sämtliche Daten sind als Klartext hinterlegt und können demnach auch von Menschen gelesen werden.

Eine JSON-Datei besteht aus einer Struktur, die mit Schlüssel/Werte-Paaren gefüllt ist. Einzelne Elemente können auch wieder als Struktur aus Schlüssel/Werte-Paare bestehen.

Durch diesen einfachen Aufbau lassen sich JSON-Dateien von verschiedenen Interpretern leicht einlesen.

Einlesen der Daten mittels Python:

Zum Einlesen der Daten sollen die Python-Module requests und json genutzt werden.

Anschließend wird ein neues Python-Skript geöffnet und die beiden Module importiert. Über die get-Methode des Modul requests wird dann eine neue Anfrage abgesendet.

Die Antwort der Anfrage wird in einem Response-Objekt mit dem Namen Response gespeichert und kann über die json-Methode dieses Objektes in eine JSON-Struktur geparsed werden. Über die dumps-Methode des json-Moduls kann das Ergebnis dann in der Konsole ausgegeben werden.

Das Resultat ist die JSON-Struktur mit den vollständigen Wetterdaten des jeweiligen Tages:

Natürlich kann die Ausgabe jetzt noch etwas aufgehübscht werden, indem die einzelnen Elemente ausgelesen und angezeigt werden.

Eine GUI mit PyQt zum Anzeigen der Daten:

Statt über die Konsole können die Daten auch mit Hilfe einer Qt-GUI angezeigt werden. Mit dem Modul PyQt ist es möglich das Framework Qt in einer Pythonumgebung zu nutzen. Die Installation des Moduls kann mit Hilfe von pip durchgeführt werden:

Zu allererst muss das Aussehen der Oberfläche designed werden. Leider liefert das Modul PyQt keinen Designer, etc. mit, sodass man zusätzlich noch den Qt Creator oder den Qt Designer installieren muss. Ein netter Vorteil von PyQt ist es allerdings, dass geschriebene (oder mit dem Designer entworfene) Qt UIs direkt eingebunden werden, sodass man ganz einfach bestehende Anwendungen nach Python portieren kann.

Für die Anwendung habe ich eine recht einfache GUI entworfen, die die folgenden Elemente beinhaltet:

  • Ein Eingabefeld für den Standort
  • Ein Eingabefeld für den API-Schlüssel
  • Einen Knopf um die Ausgabe zu starten
  • Ein Ausgabefeld für den ausgelesenen Standort und das Land
  • Ein Ausgabefeld für ein wetterabhängiges Bild
  • Eine Ausgabetabelle für die Wetterdaten

 

In dem Python-Skript muss dann zuerst ein neues QApplication-Objekt erzeugt werden, welches dann als Hauptfenster genutzt werden kann:

Dieses Hauptfenster kann nun mit der entworfenen GUI erweitert werden. Die erzeugte GUI wird anschließend mit der show()-Methode angezeigt:

Was jetzt noch fehlt sich die Slots für den Knopf und die Textfelder:

Über den Timer werden die Daten periodisch neu abgefragt, sodass immer die aktuellsten Daten angezeigt werden. Anschließend werden die Daten in der __refreshData()-Methode formatiert in die Tabelle eingetragen und das passende Wetterbild geladen.

Am Ende sieht die GUI dann folgendermaßen aus:

Nachfolgend ist noch eine GUI abgebildet, die ich mit Node-RED entworfen habe und die für den offiziellen Raspberry Pi optimiert worden ist. Es wird das Wetter inkl. UV-Werte, eine Vorhersage für 5 Tage sowie eine Regen-, bzw. Wolkenkarte angezeigt. Die Daten werden zudem in einer SQL-Datenbank mitgeloggt.

Das Python-Skript gibt es in meinem GitLab-Repository zum Download.

Last Updated on

7 Kommentare

  1. Die Idee die Wetterdaten mit einem Python-script zu lesen ist sehr gut, allerdings habe ich das gleiche Problem und exakt die gleichen Fehlermeldungen wie
    enshiro vom 10. November 2017 um 18:25 Uhr
    Leider gibt es dazu eine Antworten.
    Ich habe danach eine die Webseite geändert in
    Baum = urllib.urlopen(“https://www.yahoo.com/news/weather/”).read()
    Dann kommt schon ein Fehler bei der Zeile
    Baum = parseString(Baum)
    Ich komme leider nicht zu einem funktionierenden Script.
    Meine Frage wäre noch, ob das Script auch unter Python3 lauffähig ist ?

  2. Vielen Dank für die gute Beschreibung und die links für die Wetterdaten. Leider finde ich nicht den link für das Python-Script zur GUI in GitLab. Vielen Dank im voraus für einen Hinweis.

    1. Hallo Rolf,

      die GUI ist auch kein Python-Skript, sondern ein Flow für Node-Red. Aktuell ist es auch noch nicht bei Git zu finden aber du kannst dir die aktuelle Version (noch nicht komplett fertig) stattdessen über meine Dropbox runterladen.

      Gruß
      Daniel

  3. Hallo Daniel,
    entschuldige, wenn ich mich erst heute melde, aber so schnell habe ich nicht mit eine Antwort von Dir gerechnet. Dafür aber vielen Dank.
    Mit Node-Red habe ich mich bis heute noch nicht beschäftigt, werde ich aber zum Anlass nehmen, mich hier einzulesen. Nützlich war für mich aber der link zu OpenWeatherMap, von wo ich den API-Key erhalten habe und mir jetzt die aktuelle Außentemperatur für meine Geo-Daten zur weiteren Verarbeitung in einem Python-Script verwenden kann.
    Nochmals vielen Dank
    Gruß
    Rolf

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.