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?
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();
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.