OpenWeatherCurent & OpenWeatherForcasts

Bonjour a tous
Via un ESP8266, je me connecte au site OpenWeatherMap, pour en recolter des données.
J'utilise la bibliothèque : GitHub - ThingPulse/esp8266-weather-station: ESP8266 Weather Station library supporting OpenWeatherMap, Aeris and other sources

J'arrive sans problème a faire l'exemple OpenWeatherMapCurrentDemo ainsi que de faire l'exemple OpenWeatherMapForecastDemo

Mais quand j'essai de faire les deux en même temps, je n'y arrive pas.
J'ai essayé d'ajouter le code d'un exemple a l'autre mais cela ne fonctionne pas car il y a des conflits de variables de ce que j'ai pu comprendre entre les deux fichier .cpp de chaque exemple (dans src de la bibliotheque esp8266-weather-station OpenWeatherMapCurrent.cpp et OpenWeatherMapForecast.cpp).

Avez vous une idées de comment je pourrai m'y prendre?

Je me suis dit qu'il fallait que je crée deux nouveau fichier dans le dossier src de la bibliothèque ( OpenWeatherMapCurrentForecastDemo.h et OpenWeatherMapCurrentForecastDemo.cpp) pour y faire une fusion des deux et modifier le nom des variables en commun.
Mais pour le debutant que je suis je vais y passer des heures sans etre sur d'un resultat.

(J'ai essayé aussi l'exemple OpenWeatherMapOneCallDemo sans reussir et sans trop comprendre a quoi cet exemple sert)

Tu ne dois pas toucher aux fichiers cpp, ce sont ceux de la bibliothèque.
Si tu veux grouper deux démos, il faut grouper les deux fichiers ino. Ces démos n'utilisent pas la loop, le bloc void loop() est vide, donc tu dois combiner les contenus des bloc setup() de chaque démo en éliminant les doublons.

1 Like

Le problème c'est que les doublons sont dans les fichier cpp, pas dans le code ino
exemple la variable float temp existe dans les 2 fichiers, le code ino ne fait que l’appeler.

Pour OpenWeatherMapCurrent


#include "OpenWeatherMapCurrent.h"

client.setLanguage(OPEN_WEATHER_MAP_LANGUAGE);
  client.setMetric(IS_METRIC);
  client.updateCurrentById(&data, OPEN_WEATHER_MAP_APP_ID, OPEN_WEATHER_MAP_LOCATION_ID);

  Serial.println("------------------------------------");

  // "lon": 8.54, float lon;
  Serial.printf("lon: %f\n", data.lon);
  // "lat": 47.37 float lat;
  Serial.printf("lat: %f\n", data.lat);
  // "id": 521, weatherId weatherId;
  Serial.printf("weatherId: %d\n", data.weatherId);
  // "main": "Rain", String main;
  Serial.printf("main: %s\n", data.main.c_str());
  // "description": "shower rain", String description;
  Serial.printf("description: %s\n", data.description.c_str());
  // "icon": "09d" String icon; String iconMeteoCon;
  Serial.printf("icon: %s\n", data.icon.c_str());
  Serial.printf("iconMeteoCon: %s\n", data.iconMeteoCon.c_str());
  // "temp": 290.56, float temp;

Pour OpenWeatherMapForecast

#include "OpenWeatherMapForecast.h"

client.setMetric(IS_METRIC);
  client.setLanguage(OPEN_WEATHER_MAP_LANGUAGE);
  uint8_t allowedHours[] = {0,12};
  client.setAllowedHours(allowedHours, 2);
  uint8_t foundForecasts = client.updateForecastsById(data, OPEN_WEATHER_MAP_APP_ID, OPEN_WEATHER_MAP_LOCATION_ID, MAX_FORECASTS);
  Serial.printf("Found %d forecasts in this call\n", foundForecasts);
  Serial.println("------------------------------------");
  time_t time;
  for (uint8_t i = 0; i < foundForecasts; i++) {
    Serial.printf("---\nForecast number: %d\n", i);
    // {"dt":1527066000, uint32_t observationTime;
    time = data[i].observationTime;
    Serial.printf("observationTime: %d, full date: %s", data[i].observationTime, ctime(&time));
    // "main":{
    //   "temp":17.35, float temp;
    Serial.printf("temp: %f\n", data[i].temp);

Si je change le nom de la varible temp pour OpenWeatherMapForecast en tmpForecast par exemple elle ne conviendra plus a celle de la librairie.
D'ou mon envie d'aller modifier directement dans le cpp de OpenWeatherMapForecast

Et si je la supprime, je pense que la données ne sera plus collectée.

Bonjour,

Les variables temp sont des membres de structures différentes. Je ne vois pas bien en quoi ça pose problème.

Parce que dans les 2 exemples lesdites structures portent le même noms.
Il faudrait, par exemple, renommer dans le second exemple la structure data en dataForecast.

L'API OneCall, permet de récupérer en une seule requête les données courantes et les données de prévision. Les informations sont légèrement différentes de celles obtenues par les requêtes current et forecast. Il suffit de lire la doc des API ou de se plonger dans les fichiers .h de la librairie où tu trouveras tous les champs disponibles.

La solution est donnée par @fdufnews : dans la partie que tu copies de OpenWeatherMapForecastDemo.ino tu changes toutes les occurrences de data en (par exemple) dataforecast depuis cette ligne :
OpenWeatherMapForecastData data[MAX_FORECASTS];
jusqu'à celle-ci :
Serial.printf("observationTimeText: %s\n", data[i].observationTimeText.c_str());

1 Like

C'est effectivement une solution mais le mieux serait d'exploiter l'API onecall qui retourne toutes ces informations en une seule fois.
On a:

  • les infos courantes
  • les prévisions minute par minute pour l'heure à venir (pas exploité par la librairie)
  • les prévisions heure par heure pour 48h
  • les prévisions jour par jour pour 1 semaine

Oui, par contre le json renvoyé doit être un peu lourd

Merci pour vos réponse a tous.

Je me doutais un peu que OnCall regroupe les deux mais j'ai eu un bug de librairies et je viens de comprendre pourquoi, elle n'etais pas a sa place.... Je vais re-essayer.

Sinon si je veux fusionner les deux il faut que je modifie l'un des deux.

OK merci bien c'est plus clair pour moi, je vais voir ce que ca donne avec onecall et sinon je vais reviser le C+.
En meme temps je suis debutant, et galerer et farfouiller partout m'aide bcp a comprendre. Ce qui est pas plus mal au final.

Bonne soirée a tous

Oui, mais on peut demander d'exclure de la réponses les champs que l'on n'utilise pas. Par exemple dans le cas de la librairie en question, on peut demander que les informations MINUTELY soient absentes.

J'ai de nouveau essayé opencall. Aucun probléme ca fonctionne mais les infos sont tres limités.

Pas d'heure actuel, pas de vitesse du vent ni d'orientation du vent, pas d'heure couché levée soleil et seulement 4 prevision non configurable.

J'ai raté quelque chose?

Oups, je retire ce que j'ai dit :wink:

En allant voir dans le .cpp de OneCall, j'ai pu constater que toutes les infos que je recherche sont présente.
Je suis en train de modifier le .ino pour obtenir celle que je désire.

Il me reste a trouver comment changer la fréquence et le nombre des prévisions.

Le nombre de prévision est contenu dans la structure OpenWeatherMapOneCallData c'est ce que j'ai décrit précédemment:

  • les infos courantes
  • les prévisions minute par minute pour l'heure à venir (pas exploité par la librairie)
  • les prévisions heure par heure pour les prochaines 48h
  • les prévisions jour par jour sur 1 semaine

Pour la fréquence des mises à jour, dans le code de démo, la requête est faite dans setup() donc elle ne s'exécute qu'une fois. Mais si tu modifies le code en plaçant la requête dans loop avec un dispositif d'attente entre 2 requêtes tu peux avoir plusieurs mises à jour par 24h. La seule limite étant le nombre de requêtes autorisées par jour avec l'abonnement gratuit à OpenWeatherMap (1000 requêtes OneCall par jour).

1 Like

Pour le nombre des previsions j'ai trouvé vite fait dans le code.

Mais je me suis mal exprimé, je ne parle pas de la frequence de reactualisation (facile a faire avec millis() ) mais plutot de l'intervale entre chaque prevision.

Je vie en Bretagne ou il fait beau plusieurs fois par jours....
Avoir les prévisions toutes les 3h est plus adapté a la région :wink:

Une question hors sujet vite fait:
Mon ESP8266 renvoi les données collecté a un Arduino mega2560

Partie du code dans l'Arduino:

  if (Serial3.available() >0) {
    msg = Serial3.readString();
    Serial.println(msg);

Sur le moniteur serie s'affiche ceci:
1646993385;couvert;10.1;86;9.4;7.10;221.00;1002;1646980468;1647022278;10d;Q;7.86;1.31;100;10000

J'aimerai donc via le séparateur ";" faire rentrer chaque mesure dans des variables.

Je suis en train d'essayer avec la fonction strtok de tous separer mais pas moyen;
Si vous pouvez m'aider vite fait SVP, là je galère.

Les solutions sont multiples :

  • strtok()
  • sscanf()
  • expression régulière
1 Like

Voilà le détail de la structure OpenWeatherMapOneCallData, que l'on trouve dans OpenWeatherMapOneCall.h, elle contient les données reçues après une requête oneCall

typedef struct OpenWeatherMapOneCallData {
// "lon": 8.54,
float lon;
// "lat": 47.37
float lat;
// "timezone": "America/Chicago"
String timezone;
// "current": {}
OpenWeatherMapOneCallCurrentData current;
// "hourly": [...]
OpenWeatherMapOneCallHourlyData hourly[49];
// "daily": [...]
OpenWeatherMapOneCallDailyData daily[8];
} OpenWeatherMapOneCallData;

Le champs hourly qui est un tableau contient le détail heure par heure pour les prochaines 48 heures

Pour chaque heure tu as accès aux informations suivantes:

typedef struct OpenWeatherMapOneCallHourlyData {
// "dt":1587216739
uint32_t dt;
// "temp": 290.56
float temp;
// "feels_like": 290.56
float feels_like;
// "pressure": 290.56
uint16_t pressure;
// "humidity": 87
uint8_t humidity;
//"dew_point": -3.24
float dew_point;
// "clouds": 0
uint8_t clouds;
// "wind_speed": 1.5
float windSpeed;
// "wind_deg": 0
float windDeg;
// "id": 800
uint16_t weatherId;
// "main": "Rain"
String weatherMain;
// "description": "shower rain"
String weatherDescription;
// "icon": "09d"
String weatherIcon;
String weatherIconMeteoCon;
} OpenWeatherMapOneCallHourlyData;

Parfait je vais m'en occuper