• Система автоматизации с открытым исходным кодом на базе 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.
Хотел свой дизайн нарисовать...
 
Сверху Снизу