• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом Библиотека для работы с погодой

Алексей.

Active member
Сергей_Ф,
Я не критикую и тем более стараюсь не обсуждать решение автора, обучаясь на примерах ардуины, где правила кодирования преданы анафеме, а тест-кейсы отсутствуют по определению, не лучшая практика.
Работая со студентами у меня выработался иммунитет от срыва в жесткий холивар на выпады типа "ну если вам не нравиться, исправьте сами".
Исправляя ошибки ничему не научишь, указав на них, есть шанс что кому то это будет полезно.
 

Сергей_Ф

Moderator
Команда форума
@Алексей. Да даже если критикуете. Дело не в названии. У вас все по делу, конструктивно и даже с подсказками как лучше сделать. Обижаться на такое... Ну я не знаю, что ещё может быть полезнее.
 

Алексей.

Active member
Простой класс OpenWM для получения данных погоды от сервиса openweathermap.org
Для теста в пример добавил веб морду, часть кода в spiffs (конфиги храню там), если используете "Generic ESP8266 Module" не забудьте выставить для платы "Flash Size"
Собирал на ардуине 1.8.5 с пакетом "esp8266 by ESP8266 Community" версия 2.4.1
Проверял на ноде мсу и есп-01, броузер хром фф эдж.
 
Последнее редактирование:

Алексей.

Active member
К сожалению документация api на openweathermap слегка не соответствует реальным структурам, приходящим в ответах, порой не знаешь что ожидать пока не попробуешь и нет гарантий что структура ответа не поменяется в дальнейшем.
 

enjoynering

Well-known member
колбасит ребят из openweathermap - пытаются найти идеальную структуру. бывает. сам такой.
 

Gayrat

New member
Добрый день, сентябрь 2018г. - запускаю запрос API openweathermap , выясняется что роскомПозор заблокировал ip и у меня вызов API работает только через VPN.
Скажите пожалуйста - это я один такой невезучий ? (провайдер Yota)
 
Добрый день, сентябрь 2018г. - запускаю запрос API openweathermap , выясняется что роскомПозор заблокировал ip и у меня вызов API работает только через VPN.
Скажите пожалуйста - это я один такой невезучий ? (провайдер Yota)
Добрый день!

У меня на базе этой библиотеки работают часы с демонстрацией прогноза погоды.
Все работает нормально. Оператор - Ростелеком
 

Алексей.

Active member
Добрый день, сентябрь 2018г. - запускаю запрос API openweathermap , выясняется что роскомПозор заблокировал ip и у меня вызов API работает только через VPN.
Скажите пожалуйста - это я один такой невезучий ? (провайдер Yota)
Откуда такая информация о блокировках api?
Вы можете самостоятельно проверить попадает ли адрес в список заблокированных диапазонов адресов по ссылке, которую мне рекомендовали в суппорте Yota, когда я не мог получить доступ к своему vps у хостера digitalocean.
api.openweathermap.org резолвется на три адреса
Код:
alex@hp-envy13:~$ host api.openweathermap.org
api.openweathermap.org has address 178.62.207.82
api.openweathermap.org has address 146.185.181.89
api.openweathermap.org has address 95.85.63.65
Ни по одному из адресов не находится что то запретов, чего не скажешь о home.openweathermap.org, хотел в ЛК зайти, посмотреть свой appid и не получилось.
Код:
alex@hp-envy13:~$ host home.openweathermap.org
home.openweathermap.org has address 188.166.102.105
Адрес оказался заблокированным, попадает в пул 188.166.0.0 - 188.166.127.255 того самого хостера digitalocean.
Зашел в ЛК от другого провайдера взял appid и проверил апи на ёте, как ни странно, работает.
Код:
alex@hp-envy13:~$ curl -v 'http://api.openweathermap.org/data/2.5/weather?units=metric&appid=xxxxxx&lat=55.993&lon=37.645'
*   Trying 146.185.181.89...
* TCP_NODELAY set
* Connected to api.openweathermap.org (146.185.181.89) port 80 (#0)
> GET /data/2.5/weather?units=metric&appid=xxxxxx&lat=55.993&lon=37.645 HTTP/1.1
> Host: api.openweathermap.org
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: openresty
< Date: Mon, 24 Sep 2018 19:15:53 GMT
< Content-Type: application/json; charset=utf-8
< Content-Length: 431
< Connection: keep-alive
< X-Cache-Key: /data/2.5/weather?lat=55.99&lon=37.65&units=metric
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: GET, POST
<
* Connection #0 to host api.openweathermap.org left intact
{"coord":{"lon":37.65,"lat":55.99},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"base":"stations","main":{"temp":9.25,"pressure":996,"humidity":93,"temp_min":9,"temp_max":10},"visibility":10000,"wind":{"speed":7,"deg":130},"clouds":{"all":90},"dt":1537813800,"sys":{"type":1,"id":7323,"message":0.0527,"country":"RU","sunrise":1537759178,"sunset":1537802497},"id":490510,"name":"Sorokino","cod":200}
 
Последнее редактирование:

Gayrat

New member
Друзья, спасибо большое за отклики!

Конкретно в моем случае (Yota) вызов api.openweathermap.org работает только через VPN и это факт.
Нашел статью на Хабре:
OpenWeatherMap – как энтузиасты делают погоду
Написал
Dennsy
Он мне посоветовал делать вызов по адресу ru.api.openweathermap.org
В моем случае все заработало!
 

CCat

Member
Работают, но меня что-то эта библиотека пугает. :) Удобная, но какая-то большая.
Поэтому спрашивал про функцию из класса а автора топика, но понял, что мне незачем ее выдирать из класса.
Так что автору спасибо за лаконичный пример выдирания нужного из json. :cool:
Только я uint8_t на int заменил для температуры, а то с температурой ниже 0 как-то не того было. ;)

Код:
const char* openw = "{\"coord\":{\"lon\":37.62,\"lat\":55.75},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"base\":\"stations\",\"main\":{\"temp\":-11,\"pressure\":1025,\"humidity\":70,\"temp_min\":5,\"temp_max\":7},\"visibility\":10000,\"wind\":{\"speed\":2,\"deg\":190},\"clouds\":{\"all\":0},\"dt\":1539104400,\"sys\":{\"type\":1,\"id\":7325,\"message\":0.0219,\"country\":\"RU\",\"sunrise\":1539056950,\"sunset\":1539096182},\"id\":524901,\"name\":\"Moscow\",\"cod\":200}";
int temp;

void setup() {
  Serial.begin(115200);
  const char _temp[] = "temp";
  char * p;
  p = strstr( openw, _temp );
  if (p)
    temp = (int)atoi( p + strlen(_temp) + 2 );
  else
    temp = 0;

  Serial.println(temp);
}
 
Последнее редактирование:

Алексей.

Active member
При получении форекастов возвращаемый контент довольно тяжелый, 5 дней с 3-х часовыми интервалами, не хватает места для выделения джейсон-буфера чтоб распарстить весь контент сразу, поэтому контент я разбираю частями, зная структуру нахожу начало и конец элемента и выполняю парсеДжейсон только по частям.
Форекасты разбираю только пока не знаю что с ними делать, как отображать на дисплее который и так не велик, а с расстояния 2-х метров только крупные буквы видны.
 

CCat

Member
пока не знаю что с ними делать, как отображать на дисплее который и так не велик
Это да. Я поэтому на своей "Погодной коробке" вывожу только текущую температуру и ветер, причем от Гисметео и от Openweather.
Поскольку Гисметео, жадины, не дают текущую погоду ни в xml, ни в json, то приходится парсить средствами php на сервере (внешнем, не в ESP) их погодный информер. :D
В принципе, у меня и парсинг json Openweather производится сейчас там же, но это надежно только при наличии пожизненного домена и хостинга, а я то и дело забываю заплатить за хостинг. :rolleyes:
Вот и решил добавить в ESP процедуру "если файл на моем хостинге недоступен, то беру погоду прямиком с Openweather".

А вот прогноз Гисметео отдает нормально, но я тоже пока не знаю, куда его выводить.
Была где-то тема - люди берут дисплеи AMOLED от телефонов, ваяют к ним контроллеры и подключают к Ардуино. Вот там есть где развернуться. :cool:

В принципе, разве что подцепить к "Погодной коробке" какой-нибудь датчик жестов или хотя бы датчик расстояния с распознаванием простых жестов, типа VL53L0X и листать информацию на дисплее каким-нибудь жестом. Ну не совсем листать, как на смартфоне, а просто генерить нужный экран.
 
Последнее редактирование:

rst

Member
предлагаю отображать типа - ясно , сухо,осадки, возьми зонд и т д
Зонд - для зондирования почвы? :cool:
При получении форекастов возвращаемый контент довольно тяжелый, 5 дней с 3-х часовыми интервалами, не хватает места для выделения джейсон-буфера чтоб распарстить весь контент сразу
Можно на лету (принимаемые части) парсить в бинарный образ JSON. А потом после полного приёма - уже парсить всё сообщение целиком.
В бинарном образе вместо текстовых символических имен - их 8-и или 16-битные ID из базы во флешь, числовые значения - в бинарном виде и т.п. Тогда bin-образ получится компактным.
В принципе, разве что подцепить к "Погодной коробке" какой-нибудь датчик жестов или хотя бы датчик расстояния с распознаванием простых жестов, типа VL53L0X и листать информацию на дисплее каким-нибудь жестом.
Если совсем дёшево, то взять что-то типа: 1 шт. Шэньян HC SR04 в мире ультразвуковой волновой детектор Начиная модуль для arduino расстояние Сенсор купить на AliExpress
и сделать управление на нём.
 
Последнее редактирование:

d_tramp

New member
При получении форекастов возвращаемый контент довольно тяжелый, 5 дней с 3-х часовыми интервалами, не хватает места для выделения джейсон-буфера чтоб распарстить весь контент сразу, поэтому контент я разбираю частями, зная структуру нахожу начало и конец элемента и выполняю парсеДжейсон только по частям.
Форекасты разбираю только пока не знаю что с ними делать, как отображать на дисплее который и так не велик, а с расстояния 2-х метров только крупные буквы видны.
Привет! и все таки - как пропарсить forecst? С текущей погодой разобрался... а хочется выводить еще на 5 дней, скажем от 12 часов дня. А нажимая, скажем, на "завтра"
открыть отдельное окно, к тором показать прогноз по часам...
Было бы здорово, но вот как эту жуткую строку разобрать... :)
 

d_tramp

New member
Это был вопрос? Тот разбор, который я приводил в #23, вам не подходит? Сделайте свой.
ой :) я пропустил... Попробовал - очень интересно у вас получилось!!!
Но вот как теперь это все на экран выкидывать?
У меня Nextion Enhanced.
Хотел свой дизайн нарисовать...
 
Сверху Снизу