OpenWeather Daten holen geht mit der Zeit nicht mehr

Hallo Zusammen

Ich hole via API das aktuelle Wetter via OpenWeather. Am Anfang läuft der Code auch sauber durch aber mit der Zeit spuckt er mir immer ein: Error on HTTP request: -1 heraus.

Kann sich das jemand erklären? Starte ich den ESP8266 neu, funktioniert es schon wieder. Der WLan Status und der Heap-Speicher sehen auch in Ordnung aus.

Vielen Dank und ein schönes Wochenende. :slight_smile:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>

WiFiClient wifiClient;

const char* ssid = "***";
const char* password = "***";
IPAddress staticIP(192, 168, 50, 6);  // statische IP
IPAddress gateway(192, 168, 50, 1);   // Gateway
IPAddress subnet(255, 255, 255, 0);   // Subnetzmaske
IPAddress dns(192, 168, 178, 34);     // DNS-Server

const char* host = "api.openweathermap.org";
const char* apiKey = "***";
const char* city = "***";
const char* country = "***";

unsigned long previousMillis = 0;  // will store the last time the weather data was updated

const long interval = 240000;  // interval to get weather data (5 minutes)

String translateWeather(String weather) {
//.....
}


void setup() {
  Serial.begin(9600);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.config(staticIP, gateway, subnet, dns);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    if (WiFi.status() == WL_CONNECTED) {  //Check WiFi connection status
      HTTPClient http;

      // Set connection and response timeouts
      http.setTimeout(15000);  // 10 seconds

      String serverPath = "http://" + String(host) + "/data/2.5/weather?q=" + city + "," + country + "&appid=" + apiKey;

      // Your Domain name with URL path or IP address with path
      http.begin(wifiClient, serverPath);
      // Send HTTP POST request
      int httpResponseCode = http.GET();

      if (httpResponseCode > 0) {
        String response = http.getString();  //Get the response to the request

        //  Serial.println("Response: " + response);

        DynamicJsonDocument doc(8192);
        DeserializationError error = deserializeJson(doc, response);

        if (error) {
          Serial.println(F("Deserialization failed"));
          return;
        }

        float temp = doc["main"]["temp"].as<float>() - 273.15;
        int humidity = doc["main"]["humidity"];
        String weather = doc["weather"][0]["description"];

        Serial.println("Temperatur: " + String(temp));
        Serial.println("Feuchtigkeit: " + String(humidity));
        String weather_de = translateWeather(weather);

        Serial.println("Wetter: " + weather_de);
      } else {
        Serial.print("Error on HTTP request: ");
        Serial.println(httpResponseCode);
        Serial.println(http.errorToString(httpResponseCode));  // Print the error message for the returned code

        Serial.println();
        Serial.println(WiFi.status());
        Serial.println(ESP.getFreeHeap());
        Serial.println();
      }

      // Free resources
      http.end();
    } else {
      Serial.println("WiFi Disconnected");
      // Reconnect to WiFi
      WiFi.begin(ssid, password);
    }
  }
}


Du baust mit jedem Umlauf ein neues Stringobjekt.
Lege das Stringobjekt mal anfangs an und schau mal nach .reserve()

1 Like

Sie können den Anschein erwecken, als würden Sie einen Denial-of-Service-Angriff durchführen.

Versuchen Sie, die Anfragen seltener zu senden (Schnelltest: delay (1800000ul); // 30 min am Ende der loop() hinzufügen.

das Wetter alle 4 minuten abzufragen ... da würde mich eine Sperre vom Datenprovider nicht wundern...

Danke ich hab es geändert und teste es jetzt :slight_smile:

Warum? Die Free API kann man bis zu 1000 mal am Tag nutzen und wenn es beim ESP nicht mehr geht, kann ich es beim Browser mit dem direkt Link öffnen. :confused:

Seit wann?
Dazu kommt noch das die daten werden nicht jede Sekunde aktualisiert, also 20min sind schon optimal.

grafik

Ja wen man Abo abschließt :wink:
" 1.000 API-Aufrufe pro Tag kostenlos
0,0014 EUR pro API-Aufruf über dem Tageslimit"
Und so wie geschrieben die ändern nicht die Daten alle Sekunden, somit ist das mit alle 4Min unsin in meinen augen.
Habe die schon seit halbem Jahr, und die Vorhersagen für DE sind, naja.

Ach, Du warst doch nur noch einen Klick von der 1.000.000 im Monat entfernt :wink:
grafik

Wer's braucht :slight_smile:

der Daten-Aktualisierungsintervall ist mit <2h ... angegeben.
Ich bleib dabei, alle 4 Minuten ist nicht wirklich nicht notwendig.

Dan haben die das geändert, war mall 100 pro tag.
Ist egal alle 4 Min abfragen bringt nix.

1 Like

Ich auch. Aber nur alle 15min (Testphase) später reicht mir stündlich, denn es hängt ein ePaper-Display am ESP(32). Deshalb mache ich das im setup(), aktualisiere das Display und lege das Ding dann schlafen. Vielleicht ist diese Vorgehensweise eine Alternative auch für Dich.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.