Bug in OpenWeather_simple oder OpenWeather.h?

Guten Abend in die Runde !

Kürzlich bin ich auf OpenWeather.org gestoßen, habe dann nach einer Implementierung mit einem ES8266 gesucht und bin auch fündig geworden: In der IDE unter den Beispielen gibt es den Sketch "OpenWeather_simple", darin die Zeile: "#include <OpenWeather.h>".

Nachdem die WLAN-Parameter und auch mein OW_API_KEY richtig konfiguriert waren, konnte ich dem Teil zunächst keinerlei Response entlocken. Als ich mich aber einmal zufällig bei der Stadt vertippt hatte, erhielt ich plötzlich doch eine Meldung: "CITY NOT FOUND!" Das zeigte immerhin, dass eine Verbindung zur OpenWeather.org zustande kam.

Ab dann suchte ich den Fehler nicht mehr bei mir, sondern im Beispiel-Sketch. Dabei stellte sich heraus, dass nach dem korrekten Empfang vernünftiger Daten "weather.status" nicht wie erwartet 200 liefert, sondern 0. Mit einem kleinen Work-Around habe ich die ganze Sache erfolgreich zum Laufen gebracht:

ALT: if(weather.status == OW_OK) printWeather(weather); //Data received, prints all data to Serial monitor
NEU: if( weather.status == OW_OK || weather.status == 0 ) printWeather(weather);

Dies ist aber nur ein Behelf. Besser wäre es wohl, an anderer Stelle zu bewirken, dass der HTTP-GET-Response-Status 200 auch von weather.status als 200 zurückgegeben wird und nicht (wie jetzt) als 0. Das ist dann aber nicht mehr meine Liga. Wer kann hier wie Abhilfe schaffen?

Viele Grüße,
Luigi

Eigentlich nur der Ersteller/Betreuer der Bibliothek. Denn jede Änderung durch einen Nutzer, ist beim nächsten Update wieder hinfällig.

Bitteschön:
verwendete Library

der Lib Ersteller hat sich entschieden nicht nur den HTTP Response Code durchzuschleifen, sondern er weist auch auf z.B.

/** Status of received message (> 0 HTTP codes, -1 to -11 are HTTP client errors defined in ESP8266HTTPClient.h) */

hin.
Weiters setzt er den status auf einige precompiler defines.

Ich stufe das nicht als Fehler ein. status macht einfach etwas anderes als du glaubst.

Wenn dir der weather.status == 0 aber auch reicht, dann sollst du das in deinem Sketch eben auch abfragen. Ich würde aber nicht auf 0 prüfen, sondern den Precompiler define vom Ersteller nehmen
weather.status == OW_NONE

Danke für die schnelle Antwort und den Profi-Hinweis zum Pre-Compiler (wieder was gelernt).

Für meine Zwecke ist das so in Ordnung.

Ob die Ursache im ESP8266HTTPClient.h zu suchen ist, habe ich mich auch gefragt und deshalb ein einfaches Beispiel für einen HTTP-Client modifiziert. Dort wird ebenfalls auf ESP8266HTTPClient.h verwiesen, also dieselbe Library, die auch im anderen Fall aufgerufen wird. Mit diesem Versuch bekomme ich jedesmal sofort status=200 zurück, und die payload enthält die einwandfreie Antwort von OpenWeather.

Auszug der wesentlichen Code-Zeilen
#include <ESP8266WiFi.h>  
#include <ESP8266HTTPClient.h> // derselbe wie in OpenWeather_simple    
WiFiClient httpClient ;           
HTTPClient http ;                 
    String payload ; 
    http.setTimeout( 2000 ); 
    http.begin( httpClient, myURL ); 
    int status = http.GET();          
    Serial.print(F("http.GET-status: ")); Serial.println( status ); // bringt 200 
    if( status==200 ){ payload = http.getString(); } // das klappt ! 
    http.end(); 

Auszug vom Seriellen Monitor
12:36:56.343 -> apply http.GET
12:36:56.443 -> http.GET-status: 200
12:36:56.443 -> payload: {"coord":{"lon":8.8078,"lat":53.0752},"weather":[{"id":8 ... usw.

Wie gesagt: Alles gut für meine Zwecke. Aber unglücklich finde ich, dass ein in einer Lib enthaltenes Beispiel ohne Änderung nicht funktioniert und hier nun ausgeschlossen werden konnte, dass es an einem include liegt.

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