API Daten verarbeiten

Ich habe gerade die API in einem Arduino Programm verarbeitet. Entweder läuft das ganze am Ende auf einem ESP01-S oder einem D1 Mini oder Ähnlichem. Je nachdem was die Leistung hergibt.

Der Code holt sich das JSON-Objekt von der API und verarbeitet es dementsprechend weiter. Auf den ersten Blick sieht das Programm ziemlich wild aus, ist aber eigentlich nichts spektakuläres:

#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <ArduinoJson.h> HTTPClient sender; // ##################################################################### // USER DATA USER DATA USER DATA USER DATA USER DATA USER DATA USER DATA // ##################################################################### // WLAN-Daten const char* ssid = "WLAN-SSID"; const char* password = "WLAN-PSK"; // ##################################################################### // home.openweathermap.org/api_keys const int zipcode = 12345; const String apikey = "d96f32a2a42s3832fa0695fx4553c5c4"; // USER DATA USER DATA USER DATA USER DATA USER DATA USER DATA USER DATA // ##################################################################### String json; String city_name; String weather_description; int weather_id; /* * * DEFINITIONEN DER EINZELENEN WETTER-IDs * */ // THUNDERSTORM // GEWITTER int thunderstorm[]={200, 201, 2020, 210, 211, 212, 221, 230, 231, 232}; // DRIZZLE // NIESELREGEN int drizzle[]={300, 301, 302, 310, 311, 312, 313, 314, 321}; // RAIN // REGEN int rain[]={500, 501, 502, 503, 504, 511, 520, 521, 522, 531}; // SNOW // SCHNEE int snow[]={600, 601, 602, 611, 612, 613, 615, 616, 620, 621, 622}; // ATMOSPHERE // ATMOSPHÄRE int atmosphere[]={701, 711, 721, 731, 741, 751, 761, 762, 771, 781}; // CLEAR // KLAR int clear_0[]={800}; // CLOUDS // BEWÖLKT int clouds[]={801, 802, 803, 804}; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print("."); } Serial.println("Verbunden!"); // JSON-Objekt von der API abfragen und in Variable speichern json = get_weather_json(zipcode, apikey); // JSON Objekt ausgeben (DEBUG) Serial.println(json); // Values der Keys in die einzelnen Variablen speichern city_name = get_city_name(json); weather_description = get_weather_description(json); weather_id = get_weather_id(json); // Ausgabe der einzelnen Variablen (DEBUG) Serial.println(city_name + " :: " + weather_description + " :: " + weather_id); //HIER NUR EIN BEISPIEL ZUM VERABRITEN if (std::find(std::begin(thunderstorm), std::end(thunderstorm), weather_id) != std::end(thunderstorm)){ Serial.println("Es ist herrscht ein Gewitter!"); } if (std::find(std::begin(drizzle), std::end(drizzle), weather_id) != std::end(drizzle)){ Serial.println("Es ist herrscht Nieselregen!"); } if (std::find(std::begin(rain), std::end(rain), weather_id) != std::end(rain)){ Serial.println("Es ist regnet!"); } if (std::find(std::begin(snow), std::end(snow), weather_id) != std::end(snow)){ Serial.println("Es ist schneit!"); } if (std::find(std::begin(atmosphere), std::end(atmosphere), weather_id) != std::end(atmosphere)){ Serial.println("Trübe Atmosphäre!"); } if (std::find(std::begin(clear_0), std::end(clear_0), weather_id) != std::end(clear_0)){ Serial.println("Der Himmel ist klar!"); } if (std::find(std::begin(clouds), std::end(clouds), weather_id) != std::end(clouds)){ Serial.println("Es ist (leicht) bewölkt!"); } //HIER NUR EIN BEISPIEL ZUM VERABRITEN } void loop() { } /* * * * ##### DEFINED FUNCTIONS ##### * * */ String get_weather_json(int zipcode, String apikey){ if (sender.begin("http://api.openweathermap.org/data/2.5/weather?zip=" + String(zipcode) + ",DE&appid=" + apikey)) { // HTTP-Code der Response speichern int httpCode = sender.GET(); if (httpCode > 0) { // Anfrage wurde gesendet und Server hat geantwortet // Info: Der HTTP-Code für 'OK' ist 200 if (httpCode == HTTP_CODE_OK) { // Hier wurden die Daten vom Server empfangen // String vom Webseiteninhalt speichern String payload = sender.getString(); // Hier kann mit dem Wert weitergearbeitet werden // ist aber nicht unbedingt notwendig // Serial.println(payload); return payload; } }else{ // Falls HTTP-Error Serial.printf("HTTP-Error: ", sender.errorToString(httpCode).c_str()); } // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet sender.end(); }else { Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!"); } } String get_city_name(String input_json){ const size_t capacity = 800; DynamicJsonDocument doc(capacity); const char* json = input_json.c_str(); deserializeJson(doc, json); const char* cityname = doc["name"]; return String(cityname); } String get_weather_description(String input_json){ const size_t capacity = 800; DynamicJsonDocument doc(capacity); const char* json = input_json.c_str(); deserializeJson(doc, json); JsonObject weather_0 = doc["weather"][0]; const char* weather_0_description = weather_0["description"]; return String(weather_0_description); } int get_weather_id(String input_json){ const size_t capacity = 800; DynamicJsonDocument doc(capacity); const char* json = input_json.c_str(); deserializeJson(doc, json); JsonObject weather_0 = doc["weather"][0]; int weather_0_id = weather_0["id"]; return weather_0_id; }

Mit dem folgendem Code-Snippet wird die API abgerufen. Die Einzelnen Werte werden dementsprechend in Variablen gespeichert. Für mich sind nur 3 Values ausschlaggebend.

Der Ort, die Wetter-Beschreibung und die Wetter-ID.

Für den eigentlichen Call und die Ausgabe sind nur die folgenden Zeilen verantwortlich:

// JSON-Objekt von der API abfragen und in Variable speichern json = get_weather_json(zipcode, apikey); // JSON Objekt ausgeben (DEBUG) Serial.println(json); // Values der Keys in die einzelnen Variablen speichern city_name = get_city_name(json); weather_description = get_weather_description(json); weather_id = get_weather_id(json); // Ausgabe der einzelnen Variablen (DEBUG) Serial.println(city_name + " :: " + weather_description + " :: " + weather_id); München :: few clouds :: 801

Der Rest des Codes sind die definierten Funktionen auf die zugegriffen werden. Also u.a get_weather_id(), get_weather_json() oder get_city_name().

Ihr könnt das Programm 1:1 kopieren und einfügen und natürlich testen. Ihr müsst nur 4 Parameter anpassen:

// WLAN-Zugangsdaten const char* ssid = "WLAN-SSID"; const char* password = "WLAN-PSK"; // PLZ und API-Key const int zipcode = 12345; const String apikey = "d96f32a2a42s3832fa0695fx4553c5c4";

Ich halte euch auf dem Laufenden.