Погода с OpenWeatherMap


#1

Зарегистрируйтесь на OpenWeatherMap, получите свой appid, создайте новое правило weather.js, скопируйте туда код, внесите свои изменения в части запроса.

Скрипт, позволяющий делать запросы к API OpenWeatherMap.org, парсить их и выводить в virtualDevice.

defineVirtualDevice("weather", { //Виртуальное устройство для записи данных и отправки их в MQTT
  title: "Погода Кингисепп",
  cells: {
    temperature: {
      type: "temperature",
      value: -12.0,
    },
    humidity: {
      type: "rel_humidity",
      value: 75,
    },
    wind: {
      type: "wind_speed",
      value: 3,
    }
  }
}); 

defineRule("weather_call", {	// регулярный запрос к серверу погоды
  when: cron("@every 30m"),
  then: function() {
    runShellCommand("wget -qO /usr/weather/data.json 'https://api.openweathermap.org/data/2.5/weather?id=548602&appid=here_needed_your_api_key&units=metric'");
    startTimer("wait_weather", 5 * 1000);  		// запустили таймер на задержку для получения данных погоды	
//    log("Request sent");
  }
}); 

defineRule("parse_weather", {	// чтение полученных от сервера данных погоды
  when: function() { 
    return timers.wait_weather.firing;
  },
  then: function() {
  	var weather_data = readConfig("/usr/weather/data.json");
    dev["weather"]["temperature"] = format(weather_data.main.temp);
    dev["weather"]["humidity"] = format(weather_data.main.humidity);
    dev["weather"]["wind"] = format(weather_data.wind.speed);
//    log("Time: {}".format(weather_data.dt));
//    log("Temperature is: {}".format(weather_data.main.temp));
//    log("Humidity is: {}".format(weather_data.main.humidity));
//    log("Wind speed is: {}".format(weather_data.wind.speed));
  }
});
    log("Weather script updated!");

Изменения в запрос:
Вместо id=548602 (Кингисепп) подставьте свой код населенного пункта, также вместо id=548602 можно подставить q=Kingisepp,RU или координаты широты и долготы lat=59.37&lon=28.61.
Вместо appid=here_needed_your_api_key подставьте свой appid, который получите при регистрации на OpenWeatherMap.
Результат:
image

Возможно, если скрипт не создаст файл данных, то перед запуском потребуется создать папку /usr/weater и положить туда файл data.json.

{"coord":{"lon":28.61,"lat":59.37},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"base":"stations","main":{"temp":-12.89,"pressure":1017.54,"humidity":79,"temp_min":-12.89,"temp_max":-12.89,"sea_level":1026.34,"grnd_level":1017.54},"wind":{"speed":2.76,"deg":188.503},"clouds":{"all":80},"dt":1548221415,"sys":{"message":0.0039,"country":"RU","sunrise":1548225311,"sunset":1548252012},"id":548602,"name":"Kingisepp","cod":200}

UPD:Как сделать в сообщении, чтобы длинный код спрятать под спойлер?


#2

Супер. Ещё бы forecast прикрутить от www.yr.no.


#3

Их данные можно прикрутить при желании прямо на странице WebUI, вставив просто в index.html код типа

<script type=»text/javascript» src=»www.yr.no/sted/Norge/Akershus/Bærum/Skui/ekstern_boks_stripe.js»>


#4

А так прогноз можно забирать и с OpenWeatherMap, там есть такая возможность, просто мне это не очень надо было.


#5

Насколько знаю, на OWM прогноз только при условии платной подписки.


#6

5 day / 3 hour forecast

API doc Subscribe

  • 5 day forecast is available at any location or city
  • 5 day forecast includes weather data every 3 hours
  • Forecast is available in JSON and XML
  • Available for Free and all other paid accounts

На 16 дней прогноз уже платный


#7

Мне эти данные по погоде нужны были не просто чтобы посмотреть, а для использования в вычислениях параметров удельного потребления ресурсов на отопление, поэтому сначала засовывал их в виртуальный девайс, а затем переправлял на сервер для вычислений.


#8

Если я правильно понял, то в момент написания сообщения нужно нажать на дополнительные опции(шестеренка) и там выбрать “скрыть детали”.


#9

Точно! Спасибо!