Openweather - Programmierung

Wir erstellen die Klasse COpenweather, die in sich alle erforderlichen Properties und Methoden zum Handling der Wetterdaten kapselt. Mit dem Instanziieren der Klasse werden auch die Properties initiiert. Wir reichen die Public-Methode Run nach draußen, die den eigentlichen Job ausführt.

Stellenmarkt
  1. Projektkoordinator (m/w/d)
    Packsize GmbH, Herford
  2. Data Scientist / Statistikerin / Statistiker / Epidemiologin / Epidemiologe - Hämatologie ... (m/w/d)
    Universitätsklinikum Frankfurt, Frankfurt am Main
Detailsuche

Dieser Job besteht zunächst darin, die vorhandene CSV-Datei darauf zu prüfen, ob sie zur aktuellen Stunde passt. Wir tun dies über das FileInfo-Objekt aus dem System.IO-Namespace. Stimmt die aktuelle Stunde nicht mit der Stunde des Zeitpunktes zusammen, an dem die Datei geschrieben wurde, oder gibt es die CSV-Datei noch nicht, holen wir neue Daten von der Openweather-Webseite ab.

Für die Abfrage der Webseite bauen wir die URL wie oben beschrieben zusammen und rufen sie mittels HttpWebRequest aus dem System.Net-Namespace ab. Das JSON-Ergebnis fangen wir in einem String auf. Zum Schluss besteht die Aufgabe darin, den JSON-String in seine Bestandteile zu zerlegen, also die einzelnen Werte daraus zu extrahieren.

Bevor wir jetzt prüfen, welche JSON-Bibliotheken es im Mono-Framework unter Raspbian gibt, wie wir diese installieren und anwenden, bauen wir uns einen JSON-Parser selbst. Das Openweather-JSON ist relativ einfach gehalten und hat keine große Verschachtelungstiefe.

Golem Karrierewelt
  1. IT-Sicherheit: (Anti-)Hacking für Administratoren und Systembetreuer: virtueller Drei-Tage-Workshop
    10.-12.10.2022, Virtuell
  2. Deep-Dive Kubernetes – Production Grade Deployments: virtueller Ein-Tages-Workshop
    08.11.2022, Virtuell
Weitere IT-Trainings

Wir erstellen also die Funktion GetInnerJson, die als Parameter einen JSON-String, einen Knotennamen sowie die zuständigen Klammer-Zeichen entgegennimmt und den String zwischen den Klammern zurückliefert. Mit dieser Funktion extrahieren wir als erstes die Daten für die obersten Knoten. Wir erhalten einen current-, 48-hourly- und 8-daily-JSON-Strings.

Diese Strings zerlegen wir mit derselben Funktion in ihre Bestandteile und erhalten damit für diese drei Zeitkategorien die Werte für unsere CSV-Datei. Wir übernehmen nur diejenigen Daten, die wir für die Anzeige benötigen, zusätzlich einige wenige Daten zur Kontrolle.

Zum Handling der CSV-Daten erstellen wir die Klasse CWeather. Diese enthält für jede Spalte der CSV-Datei eine Property. Die Readonly-Property csv liefert den String, den wir nach Belegung aller Properties mit Werten zum Schreiben in die csv-Datei benutzen.

Zu beachten ist, dass es sich bei allen Zeitangaben um UTC-Zeiten im Unix-Format handelt. UTC ist die einheitliche Weltzeit. Unixzeit ist eine Zeitdefinition, wie sie für Unix-Betriebssysteme definiert wurde. Um diese Zeitangaben für uns lesbar zu machen, wandeln wir sie beim Schreiben in die CSV-Datei in einen entsprechenden Datums-/Zeit-String um.

Raspberry Pi: Das umfassende Handbuch. Über 1.000 Seiten in Farbe. Mit Einstieg in Linux, Python und Elektrotechnik. Aktuell zum Raspberry Pi 4

Die Klasse COpenWeather verwaltet die nachfolgend beschriebenen Dateien. Da wir von verschiedenen Stellen auf die Dateien zugreifen wollen und auch auf verschiedenen Systemen unterwegs sind (Entwicklung unter Windows, Ausführung unter Raspbian), bauen wir den Dateipfad - also den Namen der Datei und des Verzeichnisses - an zentraler Stelle zusammen. Dies implementieren wir in der Klasse CGeneral.

VariablennameBeschreibung der Datei
_csvfileName der CSV-Datei mit Wetterdaten
Enthält Zeilen mit Daten für die Zeitabschnitte current, monthly und daily. Die Spalten sind durch Semikolon separiert.
Es gibt nur eine Version dieser Datei. Wenn neue Daten ankommen, wird der bisherige Dateiinhalt mit den neuen Daten überschrieben.
_csvbakfileName einer Backup-Datei der aktuellen CSV-Datei (für Tests)
Im Dateinamen ist der aktuelle Timestamp enthalten.
Jedes Mal, wenn eine neue CSV-Datei erstellt wird, legen wir zu Testzwecken gleichzeitig auch eine Kopie dieser Datei beiseite. Dies dient zu Kontrollzwecken.
Wenn wir später auf unserem Display Darstellungen erhalten, die nicht stimmen oder wir nicht erklären können, schauen wir hier nach und vergleichen auch im zugehörigen _responsejsonfile die Originaldaten.
_responsejsonfileName einer Textdatei zur Ablage des JSON-Resultsets (für Tests)
Jedes Mal, wenn erfolgreich das Wetter abgeholt wurde, schreiben wir die originalen Openweather-Daten in diese Datei. Gerade mit Inbetriebnahme der Uhr ist es sinnvoll, die Daten nicht gleich zu verwerfen, sondern noch eine Weile aufzuheben.
Auch hier ist im Dateinamen der aktuelle Timestamp enthalten, so dass wir leicht die zugehörige CSV-Datei heraussuchen können (sofern es sie gibt).
Die Dateien _responsejsonfile und _csvbakfile werden nach einer ausreichend langen fehlerfrei verlaufenden Testphase nicht mehr benötigt. Wir stellen das Schreiben dieser Dateien zu gegebener Zeit ein.
_logfileName der Protokolldatei
Hier protokollieren wir den Erfolg bzw. Misserfolg des Abholens der Wetterdaten und des Erstellens der CSV-Datei mit Datum und Uhrzeit.
_errjsonfileName einer Fehlerdatei
Wenn beim Erstellen der CSV-Datei ein Fehler auftritt, schreiben wir einerseits eine Fehlermeldung ins Log-File und andererseits die originalen Openweather-Daten in diese Datei.
Entweder ist das JSON fehlerhaft oder unser Parser. Auch hier ist im Dateinamen der aktuelle Timestamp enthalten.
In COpenWeather verwaltete Dateien

Wenn beim Erstellen der CSV-Datei ein Fehler auftritt, schreiben wir einerseits eine Fehlermeldung ins Log-File und andererseits die originalen Openweather-Daten in diese Datei. Entweder ist das JSON fehlerhaft oder unser Parser. Auch hier ist im Dateinamen der aktuelle Timestamp enthalten.

  • Openweather-Icons zur Einbindung in eigene Apps oder Webseiten (Bild: Openweather)
  • Beispiel für ein Openweather-Resultset im JSON-Format (Screenshot: Michael Bröde)
  • UML-Schema der für Openweather zuständigen Klassen (Screenshot: Michael Bröde)
  • Für das Projekt aufbereitete Wetterdaten im CSV-Format (Screenshot: Michael Bröde)
  • Koordinaten und Bedeutung der einzelnen Linear-Uhr-Blöcke (Screenshot: Michael Bröde)
  • Beispiel für die Zeitermittlung anhand der aktiven Linear-Uhr-Blöcke (Screenshot: Michael Bröde)
  • UML-Schema der für die Linear-Uhr zuständigen Klassen (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige der Temperatur (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Verlaufs der Temperatur in den nächsten zwölf Stunden (Bild: Michael Bröde)
  • Durch eigene Daten erweiterte Liste der Openweather-IDs (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige von Bewölkung und Niederschlag (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Bewölkungs- und Niederschlagverlaufs in den nächsten zwölf Stunden (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige des Windstärke (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Verlaufs der Windstärken in den nächsten zwölf Stunden (Bild: Michael Bröde)
  • Beispiel für die Anzeige der Min/Max-Wetter-Werte der nächsten zwölf Stunden (Bild: Michael Bröde)
  • Idee für eine Vorschau auf den Wetterverlauf der nächsten sieben Tage (Screenshot: Michael Bröde)
UML-Schema der für Openweather zuständigen Klassen (Screenshot: Michael Bröde)
  • Openweather-Icons zur Einbindung in eigene Apps oder Webseiten (Bild: Openweather)
  • Beispiel für ein Openweather-Resultset im JSON-Format (Screenshot: Michael Bröde)
  • UML-Schema der für Openweather zuständigen Klassen (Screenshot: Michael Bröde)
  • Für das Projekt aufbereitete Wetterdaten im CSV-Format (Screenshot: Michael Bröde)
  • Koordinaten und Bedeutung der einzelnen Linear-Uhr-Blöcke (Screenshot: Michael Bröde)
  • Beispiel für die Zeitermittlung anhand der aktiven Linear-Uhr-Blöcke (Screenshot: Michael Bröde)
  • UML-Schema der für die Linear-Uhr zuständigen Klassen (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige der Temperatur (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Verlaufs der Temperatur in den nächsten zwölf Stunden (Bild: Michael Bröde)
  • Durch eigene Daten erweiterte Liste der Openweather-IDs (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige von Bewölkung und Niederschlag (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Bewölkungs- und Niederschlagverlaufs in den nächsten zwölf Stunden (Screenshot: Michael Bröde)
  • Koordinaten der Blöcke für die Anzeige des Windstärke (Screenshot: Michael Bröde)
  • Beispiel für die Anzeige des Verlaufs der Windstärken in den nächsten zwölf Stunden (Bild: Michael Bröde)
  • Beispiel für die Anzeige der Min/Max-Wetter-Werte der nächsten zwölf Stunden (Bild: Michael Bröde)
  • Idee für eine Vorschau auf den Wetterverlauf der nächsten sieben Tage (Screenshot: Michael Bröde)
Für das Projekt aufbereitete Wetterdaten im CSV-Format (Screenshot: Michael Bröde)

Der gesamte Code des Openweather-Handlings liegt in der Datei openweather_classes.cs. Der Aufruf des Threads ist im Hauptprogramm der Wetter-Uhr in der Datei programm.cs implementiert.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Openweather - Einbindung in die UhrWetter-Uhr - Anzeigekonzept 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10.  


mbroede 22. Aug 2022 / Themenstart

Hallo Kastenbrot, ich gebe Dir recht: Windows Forms, WPF o.ä. unter Linux nur wenn man...

OutOfCoffee 19. Aug 2022 / Themenstart

Flaschenhals? Willst Du die Daten alle paar Millisekunden abfragen? Das Wetter scheint...

Paramus 18. Aug 2022 / Themenstart

... sind genau was man momentan braucht - aber immerhin kann man mit dem Ding im...

landfuerst 18. Aug 2022 / Themenstart

Wenn du deine Wettervorhersage selber berechnen willst, mit ähnlichem Umfang, wirst du...

Kommentieren



Aktuell auf der Startseite von Golem.de
Superbase V
Zendures Solarstation mit 6.400 Wh kommt mit hohem Rabatt

Vor dem Verkaufsstart über die eigene Webseite verkauft Zendure seine Superbase V über Kickstarter - mit teilweise fast 50 Prozent Rabatt.

Superbase V: Zendures Solarstation mit 6.400 Wh kommt mit hohem Rabatt
Artikel
  1. Tesla Optimus: Elon Musk zeigt Roboter-Prototyp
    Tesla Optimus
    Elon Musk zeigt Roboter-Prototyp

    Roboter könnten für Tesla aus Sicht von Elon Musk bedeutender werden als Elektroautos. Der Konzern zeigte seinen ersten Roboter-Prototypen.

  2. Microsofts E-Mail: Modern Auth in Exchange macht Admins Arbeit
    Microsofts E-Mail
    Modern Auth in Exchange macht Admins Arbeit

    Ab dem 1. Oktober 2022 müssen Exchange-Clients zwingend Microsofts moderne Authentifizierung nutzen. Das bedeutet Mehrarbeit.
    Eine Analyse von Oliver Nickel

  3. Google: Nutzer fordern Bluetooth-Freigabe für Stadia-Controller
    Google
    Nutzer fordern Bluetooth-Freigabe für Stadia-Controller

    Mit der Einstellung von Stadia können auch Tausende der speziellen Controller ohne ein Update nicht mehr drahtlos genutzt werden.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • MindStar (u. a. LC-Power LC-M27-QHD-240-C-K 389€) und Damn-Deals (u. a. Kingston A400 240/480 GB 17,50€/32€, NZXT Kraken X73 139€) • Alternate: Weekend Sale • Razer Strider XXL 33,90€ • JBL Live Pro+ 49€ • PCGH-Ratgeber-PC 3000 Radeon Edition 2.500€ • LG OLED65CS9LA 1.699€ [Werbung]
    •  /