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. 