Sonnenaufgang vom OpenWeatherMap

Moin, ich wollte mal anfragen, wie ich es anstellen muss, bei OpenWeatherMap den Sonnenauf/untergang des Folgetages auszulesen. Format wäre JSON. Für den aktuellen (current) Tag funktioniert das problemlos, nur die Syntax für den Folgetag verwirrt mich.

Danke, Thomas

taximan:
Moin, ich wollte mal anfragen, wie ich es anstellen muss, bei OpenWeatherMap den Sonnenauf/untergang des Folgetages auszulesen. Format wäre JSON. Für den aktuellen (current) Tag funktioniert das problemlos, nur die Syntax für den Folgetag verwirrt mich.

Welche Api benutzt Du?
Die 4 Tage-Vorhersage ist dokumentiert.
https://openweathermap.org/api/hourly-forecast
Da werden 96 einzelne Stundenwerte übergeben.
Die Rückgabe ist dokunmentiert weiter unten:
-> Fields in API response

Der erste ListWert ist UNIXtime list.dt Time of data forecasted, Unix, UTC
Also für Morgen die UnixTime ausrechnen und das Feld vergleichen.
Wenns passt, dann aus der Liste die letzten beiden Felder
sunrise Sunrise time, Unix, UTC
sunset Sunset time, Unix, UTC
übernehmen.

1 Like

nur die Syntax für den Folgetag verwirrt mich.

na dann stell mal deinen funktionierenden für heute ein und deinen besten Versuch der nicht klappt für morgen.

die appid kannst ja verstümmeln.

Wobei ich so vorhersebare Daten wie Sonnenaufgang/Untergang tendenziell fix im Code machen würde und nicht von außen holen
(openWeather liegt bei mir oft falsch, nicht nur in der Stadt sondern auch im Alpenraum…)

Selbst ausrechnen mit der sunMoon Library.
Die ist zwar blöd geschrieben, weil man da neben Latitude und Longitude die Zeitzone in Minuten angeben muss.
Das ist wohl global unüblich.
Ich hab mir das Teil umgeschrieben auf reguläre Zeitzonen +- Stunden von GMT statt Minuten.
Funktioniert auf die Minute perfekt.
TimeLord ist Müll. Der vergisst plötzlich seine Aufgaben und gibt 20min. bis 2h abweichende Daten zurück.

Hallo,

bei Fips gibts sowas auch, da hab ich das her, seinen Tab ein bisschen anpassen und fertig.

Bei mir ist noch ein Würmchen drin, am Tag der Zeitumstellung war die Angabe dann für Sonntag falsch. Die Berechnung mache ich bei Datumswechsel , anschließend wird um 2:00 die Zeit umgestellt, das geht natürlich daneben. :wink: Na ja kann ich mit leben, das nächste mal wenn ich da wieder dran gehe mach ich das mit.

Berechnung für den Folgetag sollte damit auch kein Problem sein, obwohl lohnt sich die Aussage ?

Heinz

http://api.openweathermap.org/data/2.5/forecast?q=Nairobi,KE,&appid=2692eeeee5bd0d2b8bda08a15a02cxyz&units=metric

Ich bekomme hiermit eine Vorhersage bis "2021-04-11 18:00:00", allerdings taucht sunrise/sunset genau einmal auf, und liefert die Daten für heute. (ganz am Ende)

Rentner:
Hallo,

bei Fips gibts sowas auch, da hab ich das her, seinen Tab ein bisschen anpassen und fertig.

Berechnung für den Folgetag sollte damit auch kein Problem sein, obwohl lohnt sich die Aussage ?

Heinz

Na ja, ist wie so vieles Spielerei, aber wenn es geht / gehen könnte....

Das ist übrigens mein Werk für den laufenden Tag:

String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey ;
 jsonBuffer = httpGETRequest(serverPath.c_str());
 Serial.println(jsonBuffer);
 JSONVar myObject = JSON.parse(jsonBuffer);
 if (JSON.typeof(myObject) == "undefined") {
  Serial.println("Parsing input failed!");
  return;
 }

long t2 = myObject["sys"]["sunrise"];

Mit dieser Zeile kann ich immerhin schon mal die gewünschten Daten als gaaaanz langen String auslesen.

String serverPath = "http://api.openweathermap.org/data/2.5/onecall?lat=51.7&lon=7.4&exclude=hourly,minutely,alerts,current&APPID=" + openWeatherMapApiKey ;

JJetzt natürlich die Frage, wie kann da einzelne Werte rausziehen?

Dann solltest Du uns das Ergebnis zeigen oder sollen wir uns da jetzt alle einen Account einrichten?

Gruß Tommy

taximan:
Mit dieser Zeile kann ich immerhin schon mal die gewünschten Daten als gaaaanz langen String auslesen.

Naja, ist halt nen Json nicht mit 1 Eintrag sondern 96 Einträgen.

JJetzt natürlich die Frage, wie kann da einzelne Werte rausziehen?

Das sollte doch über die Ebenen gehen oder nicht?
Wenn ich mich nicht ganz täusche, kommt für jede Stunde ein ganzer Satz.
In jedem Satz ist der Sunrise-Eintrag für den Tag wo er gültig ist.
Dann könntest einfach die ersten 23 übergehen und den 24.ten nehmen für's auswerten...

Halbwissen aus der api-beschreibung/logik.

Bitte schön, schon mal halbwegs formatiert

{“lat”:51.7,“lon”:7.4,“timezone”:“Europe/Berlin”,“timezone_offset”:7200,“daily”:[
{“dt”:1617793200,“sunrise”:1617771094,“sunset”:1617819181,"…
{“dt”:1617879600,“sunrise”:1617857360,“sunset”:1617905682,"…
{“dt”:1617966000,“sunrise”:1617943625,“sunset”:1617992183,"…

liefert die Daten für heute und die nächsten beiden Tage.
Ganz ausführlich im Anhang (8 Tage)

Ich habe übrigens nur die täglichen Daten angefordert, lässt sich mit ‘exclude’ ausfiltern.

JSON_Ergebnisse.txt (3.41 KB)

Dann suche mit strstr nach ""sunrise":" und gib 10 Zeichen weiter an atol, dann das Gleiche mit ""sunset"" und 8 Zeichen später. Dann hast Du die Werte für den 1. Tag.

Gruß Tommy

taximan:
{"lat":51.7,"lon":7.4,"timezone":"Europe/Berlin","timezone_offset":7200,"daily":[
{"dt":1617793200,"sunrise":1617771094,"sunset":1617819181,"........
{"dt":1617879600,"sunrise":1617857360,"sunset":1617905682,".......

liefert die Daten für heute und die nächsten beiden Tage.

Nene!
Der liefert jeden Tag 13:00:00 für insgesamt 8 Tage.

Wie sieht denn Dein JSon - Teiler für einen Datensatz aus?
Das muss doch daran angelehnt umzusetzen sein.

my_xy_projekt:
Wie sieht denn Dein JSon - Teiler für einen Datensatz aus?

Da versuche ich mich gerade rein zu lesen / arbeiten.
Die Daten die hinter Sunrise/set stehen hätte ich gerne als Variablen, sind übrigens die "richtigen".

jsonBuffer = httpGETRequest(serverPath.c_str());

Serial.println(jsonBuffer);

JSONVar myObject = JSON.parse(jsonBuffer);
if (JSON.typeof(myObject) == "undefined") {
  Serial.println("Parsing input failed!");
  return;
}

//long t2 = myObject["daily"]["sunrise"];




hilft dir das weiter?

taximan:
hilft dir das weiter?

Nein.
Du schreibst im Eröffnungspost

Für den aktuellen (current) Tag funktioniert das problemlos,

Wie?

habe es hiermit hinbekommen, ist jedoch nur für den laufenden Tag.

String serverPath = "http://api.openweathermap.org/data/2.5/weather?q" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey ;

Ich wurschtel mich hier gerade durch, sieht einigermaßen vielversprechend aus:

https://randomnerdtutorials.com/decoding-and-encoding-json-with-arduino-or-esp8266/

melde mich morgen wieder, wird sonst zu spät

taximan:
Ich wurschtel mich hier gerade durch, sieht einigermaßen vielversprechend aus:

https://randomnerdtutorials.com/decoding-and-encoding-json-with-arduino-or-esp8266/

Gott IST DAS EINFACH!
Datt hab sogar ich verstanden, der davon keine Ahnung hat! Und der englischen Sprache wirklichnicht mächtig ist.

Ausgehend von #10: https://forum.arduino.cc/index.php?topic=735808.msg4952800#msg4952800
habe ich den Puffer genommen und in ein Char-Array gesteckt.
ACHTUNG! Das geht auf einem Mega gerade so…

Der Sketch verwendet 9714 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 7822 Bytes (95%) des dynamischen Speichers, 370 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.

Und hab mir dann drumrum mal was gebastelt.
Und siehe da: Wenn man dem tut folgt und das Schritt für Schritt macht, kommt man nach 30 Minuten drauf, wie es funktioniert.

Nicht die 6-er Version nehmen für das ArduinoJSON, sondern die 5er wie angegeben - sonst muss man umbauen, weil die Puffergröße nicht deklarierbar ist.

Das ganze sieht dann im Code so aus:

#include <ArduinoJson.h>

StaticJsonBuffer<4000> jsonBuffer;
char json[] = "{\"lat\":51.7,\"lon\":7.4,\"timezone\":\"Europe/Berlin\",\"timezone_offset\":7200,\"daily\":[{\"dt\":1617793200,\"sunrise\":1617771094,\"sunset\":1617819181,\"temp\":{\"day\":277.26,\"min\":272.43,\"max\":278.7,\"night\":274.07,\"eve\":276.76,\"morn\":272.93},\"feels_like\":{\"day\":273.08,\"night\":267.69,\"eve\":271.88,\"morn\":267.69},\"pressure\":1014,\"humidity\":92,\"dew_point\":275.91,\"wind_speed\":5.63,\"wind_deg\":296,\"weather\":[{\"id\":616,\"main\":\"Snow\",\"description\":\"rain and snow\",\"icon\":\"13d\"}],\"clouds\":99,\"pop\":1,\"rain\":1.53,\"snow\":1.24,\"uvi\":2.01},{\"dt\":1617879600,\"sunrise\":1617857360,\"sunset\":1617905682,\"temp\":{\"day\":279.25,\"min\":272.5,\"max\":282.29,\"night\":278.19,\"eve\":281.28,\"morn\":272.93},\"feels_like\":{\"day\":275.76,\"night\":268.93,\"eve\":278.69,\"morn\":268.93},\"pressure\":1024,\"humidity\":56,\"dew_point\":271.08,\"wind_speed\":5.24,\"wind_deg\":244,\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":86,\"pop\":0.12,\"uvi\":2.36},{\"dt\":1617966000,\"sunrise\":1617943625,\"sunset\":1617992183,\"temp\":{\"day\":283.62,\"min\":276.81,\"max\":284.96,\"night\":280.64,\"eve\":283.48,\"morn\":276.81},\"feels_like\":{\"day\":282.13,\"night\":273.09,\"eve\":282.21,\"morn\":273.09},\"pressure\":1014,\"humidity\":54,\"dew_point\":274.62,\"wind_speed\":5.44,\"wind_deg\":235,\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":100,\"pop\":0,\"uvi\":3.07},{\"dt\":1618052400,\"sunrise\":1618029892,\"sunset\":1618078684,\"temp\":{\"day\":279.47,\"min\":279.2,\"max\":280.38,\"night\":280.07,\"eve\":279.45,\"morn\":279.2},\"feels_like\":{\"day\":277.38,\"night\":277.03,\"eve\":276.92,\"morn\":277.03},\"pressure\":1011,\"humidity\":96,\"dew_point\":278.76,\"wind_speed\":2.8,\"wind_deg\":57,\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10d\"}],\"clouds\":100,\"pop\":1,\"rain\":19.02,\"uvi\":0.32},{\"dt\":1618138800,\"sunrise\":1618116159,\"sunset\":1618165185,\"temp\":{\"day\":287.95,\"min\":277.31,\"max\":287.95,\"night\":277.31,\"eve\":282.46,\"morn\":281.77},\"feels_like\":{\"day\":287.42,\"night\":280.59,\"eve\":281.57,\"morn\":280.59},\"pressure\":1007,\"humidity\":74,\"dew_point\":283.19,\"wind_speed\":7.65,\"wind_deg\":196,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":99,\"pop\":1,\"rain\":4.74,\"uvi\":0.82},{\"dt\":1618225200,\"sunrise\":1618202426,\"sunset\":1618251686,\"temp\":{\"day\":279.87,\"min\":275.79,\"max\":280.65,\"night\":276.91,\"eve\":278.49,\"morn\":275.79},\"feels_like\":{\"day\":276.64,\"night\":271.7,\"eve\":275.01,\"morn\":271.7},\"pressure\":1022,\"humidity\":56,\"dew_point\":271.83,\"wind_speed\":5,\"wind_deg\":354,\"weather\":[{\"id\":616,\"main\":\"Snow\",\"description\":\"rain and snow\",\"icon\":\"13d\"}],\"clouds\":100,\"pop\":0.8,\"rain\":0.13,\"snow\":0.45,\"uvi\":1},{\"dt\":1618311600,\"sunrise\":1618288695,\"sunset\":1618338187,\"temp\":{\"day\":282.66,\"min\":274.76,\"max\":282.88,\"night\":278.05,\"eve\":280.51,\"morn\":275.48},\"feels_like\":{\"day\":280.95,\"night\":273.95,\"eve\":278.9,\"morn\":273.95},\"pressure\":1026,\"humidity\":52,\"dew_point\":273.2,\"wind_speed\":3.21,\"wind_deg\":299,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":98,\"pop\":0.67,\"rain\":0.98,\"uvi\":1},{\"dt\":1618398000,\"sunrise\":1618374964,\"sunset\":1618424688,\"temp\":{\"day\":278.45,\"min\":276.25,\"max\":279.35,\"night\":277.44,\"eve\":277.95,\"morn\":277.55},\"feels_like\":{\"day\":276.64,\"night\":276.1,\"eve\":277.95,\"morn\":276.1},\"pressure\":1022,\"humidity\":93,\"dew_point\":277.44,\"wind_speed\":2.23,\"wind_deg\":227,\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10d\"}],\"clouds\":100,\"pop\":1,\"rain\":12.29,\"uvi\":1}]}";


void setup() {
  Serial.begin(115200);
  Serial.println(F("Start..."));
  JsonObject& root = jsonBuffer.parseObject(json);
  if (!root.success()) {
    Serial.println("parseObject() failed");
  }
  float lat = root["lat"];
  float lon = root["lon"];
  const char *tz  = root["timezone"];
  long zeit[5] = {0};
  long sunrise[5] = {0};
  for (int i = 0; i < 5; i++)
  {
    zeit[i] = root["daily"][i]["dt"];
    sunrise[i] = root["daily"][i]["sunrise"];
  }
  Serial.println(lat);
  Serial.println(lon);
  for (int i = 0; i < 5; i++)
  {
    Serial.print(zeit[i]);
    Serial.print(F("\t"));
    Serial.println(sunrise[i]);
  }
}

void loop() {}

Und die Ausgabe liefert für die ersten 5 Einträge die Zeit “dt” sowie die Zeit “sunrise” im Unix-Format.

14:58:05.016 -> Start...
14:58:05.016 -> 51.70
14:58:05.016 -> 7.40
14:58:05.016 -> 1617793200	1617771094
14:58:05.016 -> 1617879600	1617857360
14:58:05.016 -> 1617966000	1617943625
14:58:05.050 -> 1618052400	1618029892
14:58:05.050 -> 1618138800	1618116159

Willst Du also morgen haben, nimmst Du als wert [i] nur die 0; für übermorgen die 1 und so weiter…

Na das ist wirklich eine lib, von der ich überzeiugt bin das sie die Arbeit sehr vereinfacht :wink:

Jau, läuft bei mir auch. Dass das recht einfach ist, dachte ich mir gestern abend auch, ich hatte nur keine Zeit mehr zum ausprobieren. Danke dir für deine Mühe. Vielleicht kann es der ein oder andere ja auch gebrauchen.

taximan:
Jau, läuft bei mir auch. Vielleicht kann es der ein oder andere ja auch gebrauchen.

Na dann hier meine Komplettlösung: An der einzigen Stelle wo Du was ändern könntest, ist kommentiert

#include <ArduinoJson.h>

StaticJsonBuffer<3000> jsonBuffer;
char json[] = "{\"lat\":51.7,\"lon\":7.4,\"timezone\":\"Europe/Berlin\",\"timezone_offset\":7200,\"daily\":[{\"dt\":1617793200,\"sunrise\":1617771094,\"sunset\":1617819181,\"temp\":{\"day\":277.26,\"min\":272.43,\"max\":278.7,\"night\":274.07,\"eve\":276.76,\"morn\":272.93},\"feels_like\":{\"day\":273.08,\"night\":267.69,\"eve\":271.88,\"morn\":267.69},\"pressure\":1014,\"humidity\":92,\"dew_point\":275.91,\"wind_speed\":5.63,\"wind_deg\":296,\"weather\":[{\"id\":616,\"main\":\"Snow\",\"description\":\"rain and snow\",\"icon\":\"13d\"}],\"clouds\":99,\"pop\":1,\"rain\":1.53,\"snow\":1.24,\"uvi\":2.01},{\"dt\":1617879600,\"sunrise\":1617857360,\"sunset\":1617905682,\"temp\":{\"day\":279.25,\"min\":272.5,\"max\":282.29,\"night\":278.19,\"eve\":281.28,\"morn\":272.93},\"feels_like\":{\"day\":275.76,\"night\":268.93,\"eve\":278.69,\"morn\":268.93},\"pressure\":1024,\"humidity\":56,\"dew_point\":271.08,\"wind_speed\":5.24,\"wind_deg\":244,\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":86,\"pop\":0.12,\"uvi\":2.36},{\"dt\":1617966000,\"sunrise\":1617943625,\"sunset\":1617992183,\"temp\":{\"day\":283.62,\"min\":276.81,\"max\":284.96,\"night\":280.64,\"eve\":283.48,\"morn\":276.81},\"feels_like\":{\"day\":282.13,\"night\":273.09,\"eve\":282.21,\"morn\":273.09},\"pressure\":1014,\"humidity\":54,\"dew_point\":274.62,\"wind_speed\":5.44,\"wind_deg\":235,\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":100,\"pop\":0,\"uvi\":3.07},{\"dt\":1618052400,\"sunrise\":1618029892,\"sunset\":1618078684,\"temp\":{\"day\":279.47,\"min\":279.2,\"max\":280.38,\"night\":280.07,\"eve\":279.45,\"morn\":279.2},\"feels_like\":{\"day\":277.38,\"night\":277.03,\"eve\":276.92,\"morn\":277.03},\"pressure\":1011,\"humidity\":96,\"dew_point\":278.76,\"wind_speed\":2.8,\"wind_deg\":57,\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10d\"}],\"clouds\":100,\"pop\":1,\"rain\":19.02,\"uvi\":0.32},{\"dt\":1618138800,\"sunrise\":1618116159,\"sunset\":1618165185,\"temp\":{\"day\":287.95,\"min\":277.31,\"max\":287.95,\"night\":277.31,\"eve\":282.46,\"morn\":281.77},\"feels_like\":{\"day\":287.42,\"night\":280.59,\"eve\":281.57,\"morn\":280.59},\"pressure\":1007,\"humidity\":74,\"dew_point\":283.19,\"wind_speed\":7.65,\"wind_deg\":196,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":99,\"pop\":1,\"rain\":4.74,\"uvi\":0.82},{\"dt\":1618225200,\"sunrise\":1618202426,\"sunset\":1618251686,\"temp\":{\"day\":279.87,\"min\":275.79,\"max\":280.65,\"night\":276.91,\"eve\":278.49,\"morn\":275.79},\"feels_like\":{\"day\":276.64,\"night\":271.7,\"eve\":275.01,\"morn\":271.7},\"pressure\":1022,\"humidity\":56,\"dew_point\":271.83,\"wind_speed\":5,\"wind_deg\":354,\"weather\":[{\"id\":616,\"main\":\"Snow\",\"description\":\"rain and snow\",\"icon\":\"13d\"}],\"clouds\":100,\"pop\":0.8,\"rain\":0.13,\"snow\":0.45,\"uvi\":1},{\"dt\":1618311600,\"sunrise\":1618288695,\"sunset\":1618338187,\"temp\":{\"day\":282.66,\"min\":274.76,\"max\":282.88,\"night\":278.05,\"eve\":280.51,\"morn\":275.48},\"feels_like\":{\"day\":280.95,\"night\":273.95,\"eve\":278.9,\"morn\":273.95},\"pressure\":1026,\"humidity\":52,\"dew_point\":273.2,\"wind_speed\":3.21,\"wind_deg\":299,\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":98,\"pop\":0.67,\"rain\":0.98,\"uvi\":1},{\"dt\":1618398000,\"sunrise\":1618374964,\"sunset\":1618424688,\"temp\":{\"day\":278.45,\"min\":276.25,\"max\":279.35,\"night\":277.44,\"eve\":277.95,\"morn\":277.55},\"feels_like\":{\"day\":276.64,\"night\":276.1,\"eve\":277.95,\"morn\":276.1},\"pressure\":1022,\"humidity\":93,\"dew_point\":277.44,\"wind_speed\":2.23,\"wind_deg\":227,\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10d\"}],\"clouds\":100,\"pop\":1,\"rain\":12.29,\"uvi\":1}]}";


void setup() {
  Serial.begin(115200);
  Serial.println(F("Start..."));
  JsonObject& root = jsonBuffer.parseObject(json);
  if (!root.success()) {
    Serial.println(F("parseObject() failed"));
  }
  unsigned long sunrise = 0;
  unsigned long sunset = 0;
  unsigned long tzo = 0;
  byte tag = 0; // Forecast: maximal 7
  sunrise = root["daily"][tag]["sunrise"];
  sunset = root["daily"][tag]["sunset"];

  tzo = root["timezone_offset"];
  Serial.print(sunrise);
  Serial.print(F("\t"));
  Serial.println(sunset);
  Serial.print(F("Mit Berücksichtigung der Zeitzone: Sonnenaufgang: "));
  Serial.print(((sunrise + tzo) % 86400) / 3600);
  Serial.print(":");
  Serial.print(((sunrise + tzo) % 86400) % 3600 / 60);
  Serial.print(F(" Sonnenuntergang: "));
  Serial.print(((sunset + tzo) % 86400) / 3600);
  Serial.print(":");
  Serial.println(((sunset + tzo) % 86400) % 3600 / 60);
}

void loop() {}

Ein Fehler ist dann doch aufgetaucht:

StaticJsonBuffer<4500> jsonBuffer;

‘StaticJsonBuffer’ does not name a type

Wieso läuft das im Beispielscript, und in einem anderem Script (auf demselben Rechner) nicht?
LIB ist die 5.13.2