Возникла проблема с парсингом данных о погоде с Open Meteo на esp32s3
Обновляю данные через weather_task каждые 5 мин , при последовательном http запросе на втором http возникает ошибка
[ 1571][I][weather_task.cpp:62] weather_task(): [weather_task] current weather API: http://api.open-meteo.com/v1/forecast?latitude=55.783640&longitude=37.458337¤t=temperature_2m,dew_point_2m,relative_humidity_2m,apparent_temperature,is_day,weather_code,cloud_cover,wind_speed_10m,wind_direction_10m,wind_gusts_10m,uv_index&timeformat=unixtime&timezone=auto
[ 1799][E][WiFiClient.cpp:517] flush(): fail on fd 48, errno: 11, "No more processes"
Current weather data обновлены
[ 1808][I][weather_task.cpp:88] weather_task(): [weather_task] daily weather API: https://api.open-meteo.com/v1/forecast?latitude=55.783640&longitude=37.458337&daily=temperature_2m_max,temperature_2m_min,daylight_duration,sunshine_duration,rain_sum,showers_sum,snowfall_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max,sunrise,sunset&timeformat=unixtime&timezone=auto
Free Heap: 188168
[ 2021][E][weather_task.cpp:96] weather_task(): [weather_task] deserializeJson() failed: InvalidInput
если использовать один запрос неважно какой , то все нормально данные обновляются .
#include <Arduino.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <time.h>
#include "core.h"
#include "open_meteo.h"
#include "config.h"
static const char* TAG = "weather_task";
// Координаты
const String latitude = "55.783640";
const String longitude = "37.458337";
// URL для получения текущих данных:
static const char *WEATHER_URL_CURRENT =
"http://api.open-meteo.com/v1/forecast?"
"latitude=%s&longitude=%s&"
"current=temperature_2m,dew_point_2m,relative_humidity_2m,apparent_temperature,"
"is_day,weather_code,cloud_cover,wind_speed_10m,wind_direction_10m,wind_gusts_10m,uv_index&"
"timeformat=unixtime&timezone=auto";
static const char *WEATHER_URL_HOURLY =
"https://api.open-meteo.com/v1/forecast?"
"latitude=%s&longitude=%s&"
"hourly=temperature_2m,dew_point_2m,precipitation_probability,rain,showers,snowfall,"
"wind_speed_10m,wind_gusts_10m,sunshine_duration,cloud_cover,is_day&"
"timeformat=unixtime&timezone=auto&forecast_days=3";
static const char *WEATHER_URL_DAILY =
"https://api.open-meteo.com/v1/forecast?"
"latitude=%s&longitude=%s&"
"daily=temperature_2m_max,temperature_2m_min,"
"daylight_duration,sunshine_duration,"
"rain_sum,showers_sum,snowfall_sum,precipitation_probability_max,"
"wind_speed_10m_max,wind_gusts_10m_max,sunrise,sunset&"
"timeformat=unixtime&timezone=auto";
extern SemaphoreHandle_t mutex;
void weather_task(void *pvParameter){
current_weather_data_t current_data = {0};
hourly_weather_data_t hourly_data[48] = {0};
daily_weather_data_t daily_data[7] = {0};
char url[512];
// флаг обновления данных
bool current_success = false;
bool hourly_success = false;
bool daily_success = false;
for (;;) {
HTTPClient http;
// ------- current data -------
sprintf(url, WEATHER_URL_CURRENT, latitude.c_str(), longitude.c_str());
ESP_LOGI(TAG, "current weather API: %s", url);
http.begin(url);
if (http.GET() > 0) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, http.getString());
if (error) {
ESP_LOGE(TAG, "deserializeJson() failed: %s", error.c_str());
} else {
current_data.temperature_2m = doc["current"]["temperature_2m"];
current_data.is_day = doc["current"]["is_day"];
current_data.weather_code = doc["current"]["weather_code"];
current_data.cloud_cover = doc["current"]["cloud_cover"];
current_data.uv_index = doc["current"]["uv_index"];
current_data.wind_direction_10m = doc["current"]["wind_direction_10m"];
current_data.wind_speed_10m = doc["current"]["wind_speed_10m"];
current_data.wind_gusts_10m = doc["current"]["wind_gusts_10m"];
current_success = true;
Serial.println("Current weather data обновлены");
}
}
http.end();
// ------- Daily data -------
sprintf(url, WEATHER_URL_DAILY, latitude.c_str(), longitude.c_str());
ESP_LOGI(TAG, "daily weather API: %s", url);
http.begin(url);
if (http.GET() > 0) {
JsonDocument doc;
Serial.print("Получено: ");
Serial.println(http.getString());
// doc.clear();
DeserializationError error = deserializeJson(doc, http.getString());
if (error) {
ESP_LOGE(TAG, "deserializeJson() failed: %s", error.c_str());
} else {
for (int i = 0; i < NUM_DAYS; i++) {
daily_data[i].time = doc["daily"]["time"][i];
daily_data[i].weather_code = doc["daily"]["weather_code"][i];
daily_data[i].sunrise = doc["daily"]["sunrise"][i];
daily_data[i].sunset = doc["daily"]["sunset"][i];
daily_data[i].rain_sum = doc["daily"]["rain_sum"][i];
daily_success = true;
ESP_LOGI(TAG, "Daily weather data обновлены");
}
}
}
http.end();
if (current_success) {
// if (current_success && hourly_success && daily_success) {
ESP_LOGI(TAG, "Все данные пришли");
xSemaphoreTake(mutex, portMAX_DELAY);
disp_weather(¤t_data, hourly_data, daily_data);
xSemaphoreGive(mutex);
} else {
ESP_LOGW(TAG, "данные не обновлены (current:%d, hourly:%d, daily:%d)",
current_success, hourly_success, daily_success);
}
// сброс флага для обновления
current_success = false;
hourly_success = false;
daily_success = false;
vTaskDelay(1000 * 60 * 5 / portTICK_PERIOD_MS); // 10 Min
}
}
task
xTaskCreatePinnedToCore(
weather_task,
"Weather Task",
16384,
NULL,
1,
NULL,
1);
что не так делаю?