ESP + JSON + OpenWeatherMap

Vor einem Monat gabs einen Thread in dem jemand den Umbau eines Sketches auf OpenWeatherMap wollte (siehe Thread).

Ich hab nun einen Demo Sketch für den ESP gemacht der einige Wetterdaten von OpenWeatherMap abfragt und auf der seriellen Schnittstelle ausgibt:

Das sieht auf der Seriellen so aus:

current temp:  30.18
feels like:    30.15
pressure:      1012
humidity:      42
wind speed:    8.23
main:          Clear
description:   clear sky
summary:       Expect a day of partly cloudy with clear spells
alert_0_sender:GeoSphere Austria
event:         Heatwarning
description:   Increased heat stress must be expected.
tag:           Extreme high temperature

Es lassen sich zwar Texte auch auf deutsch anfordern, aber was ich bisher gesehen, habe funktioniert das für wenige Felder.

Ein eigenes Display oder die Ausgabe auf einem webserver sollte sich "leicht" erweitern lassen. (Anm.: Ich habe aktuell kein vernünftiges/verbreitetes hier - kommt später aber nach).

Paar Infos zur OpenWeatherMap Registrierung können auf meiner Page nachgelesen werden. Der kritische Punkt ist die Hinterlegung einer Kreditkartennummer für ein "gratis" Service.

Sketch gibts am Ende der Seite als Downloads. Er sollte am ESP8266 und ESP32 laufen.

https://werner.rothschopf.net/microcontroller/202409_esp_weather_en.htm

3 Likes

Keine Frage.
(Feedback willkommen).

Musste ich damals noch nicht. (Über 2 Jahre her).
Wäre eine Nutzer unfreundliche Änderung.

Ja, ist es.
Sie wollen damit sicher stellen, dass sie bei Überschreitung der zulässigen Abfragezahlen (was z.B. bei Programmierfehlern sehr schnell gehen kann), problemlos kassieren können.

Gruß Tommy

Vor der Änderung der Version wurde man für 24 Std. blockiert, ist mir passiert, bei heutigen Inet Zugängen, + ESP ist das schon DOS vom nur einem Rechner.
Dazu Aufbereitung der Daten, Server kosten auch + das Teuerstes die Programmierer.

Naja, von 1 PC oder ESP32 kannst Du direkt gegen einen vernünftigen Server keinen DOS fahren. Da lächelt der nur müde. Da müsstest Du schon andere DOS-Techniken einsetzen, die ich nicht öffentlich beschreibe.

Gruß Tommy

So wie das angekündigt wurde, funktioniert die API 2.5 seit heute Mittag bei mir nicht. Die Umstellung auf die 3.0 in der Software bringt nichts, so lange man auf der OW Seite sich nicht Anmeldet, und KK hinterlegt, ob man neuen Key bekommt weis nicht, habe die Änderung nicht zu Ende gemacht.
Die Sachen was Angezeigt werden habe selber geändert um aktuelle Außenwerte von Balkon haben.
Statt vorhersage habe hässliche Wolken mit Fragezeichen auf dem Display.

Meine 2.5er API funktioniert noch.

Die 3.0er Freischaltung dauerte bei mir ein paar Stunden. Soweit ich mich zurück erinnere, ging der unter 2.5 angelegte Key dann auch für 3.0.

Bin wirklich froh um Ihren Code. Vielen Dank.
Arduino IDE, ESP8266, OpenWeather API 3.0 (max. 900 Anfragen pro Tag)
Hatte das selbe Bild wie fony (post #7).
Seit 2 Tagen versuche ich erfolglos, bei der forecast das icon ausgeben zu lassen. Mit der Zusammenfassung (summary) funktionierts, aber nicht einen "Ordner" tiefer (weather/icon).
Ich bin für jeden Hinweis dankbar.
Hier snippets aus meiner Code-Bastelei in "openweather.h" (@noiasca ):

  JsonArray daily = doc["daily"];
  JsonObject daily_0 = daily[0];
  weather.daily_0_summary = daily_0["summary"].as<String>(); 

  JsonObject daily_1 = daily[1];
  weather.daily_1_weather_0_icon = daily_1["weather"]["icon"].as<String>(); 

Wurde sagen mach neuen Thread, New Topic, Neues Thema auf, danach das hier Löschen.
Dan kann ich was dazu schreiben .Danke.
Das hier gehört noiasca.

Vielen Dank für das rasche Hilfeangebot.
Der Code ist von noiasca und deshalb sollte die Frage an ihn gehen.
Sorry, bin neu am Posten im Forum. Muss zuerst herausfinden, wie ich aus dem hier einen neuen Thread mache.

Dan ist es OK :wink:
Ich nutze umgebauten Beispiel (Grafik geändert, eigene Sachen dazu gebaut usw.) vom Bodmer

Wen du direkt bei noiasca Anklopfen willst schreib im deinem Beitrag @ + Namen dann bekommt der Jenninger direkt Nachricht, und wen zeit zulässt antwortet der.

Danke @fony .
Das wäre auch mein Ziel, Bodmer mit OpenWeather API 3.0.

habs nicht ausprobiert, aber im tab zInfo.h ist ein kompletter JSON Parser Code basierend auf dem JSON das mir ausgegeben wurde und da ist das Icon definitiv in einer anderen Ebene.
siehe Zeile 105ff

Sehr gut, vielen Dank. Ich werde auf dieser Grundlage weiter pröbeln.

Und es funktioniert. Nochmals vielen Dank für das ultimative "Kochbuch für Json-Abfragen".

1 Like

Hallo,

ich bin im Endeffekt auf

umgestiegen, vielleicht ist das ja für den ein oder anderen eine alternative.

cu

Interessant, wen möglich zeige mall dein PRG für.

Ich wäre da auch an ein paar Informationen interessiert.

Welche Informationen denn genau? Muss mich da auch wieder einfuchsen, da ich das vergangenen Winter über gemacht habe.

Hier der Code zum holen und auswerten:

String wetterdaten_holen() {
  debm("void wetterdaten_holen");

  String wetterdaten = "";

  HTTPClient https;
  String apiUrl = "https://api.open-meteo.com/v1/dwd-icon?latitude=50.9042&longitude=12.08&hourly=temperature_2m,relative_humidity_2m,precipitation,weather_code,wind_speed_10m&daily=sunrise,sunset&wind_speed_unit=ms&timezone=Europe%2FBerlin&timeformat=unixtime&forecast_days=2&forecast_hours=24";

  if (https.begin(wificlient, apiUrl)) {
    int httpCode = https.GET();

    if (httpCode > 0) {
      if (httpCode == HTTP_CODE_OK) {
        wetterdaten = https.getString();
      }
    }

    https.end();
  }

  debm("aussprung wetterdaten_holen");

  return wetterdaten;
}

// ----------------------------------------------------------------------------

void wetterdaten_auswerten(const String& wetterdaten) {
  debm("void wetterdaten_auswerten");

  JsonDocument filter;

  JsonObject filter_hourly = filter["hourly"].to<JsonObject>();
  filter_hourly["temperature_2m"][0] = true;
  filter_hourly["relative_humidity_2m"][0] = true;
  filter_hourly["precipitation"][0] = true;
  filter_hourly["weather_code"][0] = true;
  filter_hourly["wind_speed_10m"][0] = true;

  JsonObject filter_daily = filter["daily"].to<JsonObject>();
  filter_daily["sunrise"][0] = true;
  filter_daily["sunset"][0] = true;


  JsonDocument wetter;

  DeserializationError error = deserializeJson(wetter, wetterdaten, DeserializationOption::Filter(filter));


  if (error) {
    Serial.print(F("Fehler beim Parsen der JSON-Daten: "));
    Serial.println(error.c_str());
    return;
  }

  JsonObject stunde = wetter["hourly"];

  JsonArray stunde_temp = stunde["temperature_2m"];
  for (int i = 0; i < 6; i++) {
    temp[i] = stunde_temp[(i * 4) + 1 ] ;
  }

  JsonArray stunde_luftfeuchte = stunde["relative_humidity_2m"];
  for (int i = 0; i < 6; i++) {
    luftfeuchte[i] = stunde_luftfeuchte[(i * 4) + 1] ;
  }

  JsonArray stunde_niederschlag = stunde["precipitation"];
  for (int i = 0; i < 6; i++) {
    niederschlag[i] = stunde_niederschlag[(i * 4) + 1] ;
  }

  JsonArray stunde_wettercode = stunde["weather_code"];
  for (int i = 0; i < 6; i++) {
    wettersymbol[i] = stunde_wettercode[(i * 4) + 1] ;
  }

  JsonArray stunde_windgeschwindigkeit = stunde["wind_speed_10m"];
  for (int i = 0; i < 6; i++) {
    windgeschwindigkeit[i] = stunde_windgeschwindigkeit[(i * 4) + 1] ;
  }

  JsonObject tag = wetter["daily"];

  JsonArray tag_sonnenaufgang = tag["sunrise"];
  for (int i = 0; i < 2; i++) {
    sonnenaufgang[i] = tag_sonnenaufgang[i] ;
  }

  JsonArray tag_sonnenuntergang = tag["sunset"];
  for (int i = 0; i < 2; i++) {
    sonnenuntergang[i] = tag_sonnenuntergang[i] ;
  }

  debm("aussprung wetterdaten_auswerten");
}

Ok, Korrektur, das Zertifikat hat mit dem Wetter eigentlich nichts zu tun.
Kann man das rausgeben, dann könnte ich ein "wokwi" zeigen?

Auf jeden Fall kann man dort eine Menge Informationen holen.

cu