From bba3ab4e876b58746055355fa686096d97592255 Mon Sep 17 00:00:00 2001 From: Troy Anderson Date: Thu, 4 Jul 2024 13:12:01 -0700 Subject: [PATCH 1/6] Added support for the thirty day forecast in the pro 2.5 API --- CHANGELOG.md | 1 + README.md | 29 ++- lib/open_weather/client.rb | 1 + lib/open_weather/endpoints.rb | 1 + .../endpoints/thirty_day_forecast.rb | 16 ++ lib/open_weather/models/forecast.rb | 1 + lib/open_weather/models/forecast/city.rb | 1 + .../models/forecast/thirty_day.rb | 5 + .../models/forecast/thirty_day/forecast.rb | 33 +++ .../models/forecast/thirty_day/temp.rb | 18 ++ .../models/forecast/thirty_day/thirty_day.rb | 26 +++ .../open_weather/forecast/thirty_day.yml | 217 ++++++++++++++++++ .../forecast/thirty_day_forecast_spec.rb | 88 +++++++ 13 files changed, 436 insertions(+), 1 deletion(-) create mode 100644 lib/open_weather/endpoints/thirty_day_forecast.rb create mode 100644 lib/open_weather/models/forecast/thirty_day.rb create mode 100644 lib/open_weather/models/forecast/thirty_day/forecast.rb create mode 100644 lib/open_weather/models/forecast/thirty_day/temp.rb create mode 100644 lib/open_weather/models/forecast/thirty_day/thirty_day.rb create mode 100644 spec/fixtures/open_weather/forecast/thirty_day.yml create mode 100644 spec/open_weather/forecast/thirty_day_forecast_spec.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d9a85..6bda5e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### 0.5.1 (Next) +* [#42](https://github.com/dblock/open-weather-ruby-client/pull/42): Added support for the thirty day forecast in the pro 2.5 API - [@troya2](https://github.com/troya2). * Your contribution here. ### 0.5.0 (2024/07/03) diff --git a/README.md b/README.md index 775efe3..0de7322 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Unlike other clients, including [open-weather](https://github.com/coderhs/ruby_o - [Current and Forecast Weather](#current-and-forecast-weather) - [Historical Weather](#historical-weather) - [Hourly Forecast (Pro)](#hourly-forecast-pro) + - [30 Day Forecast (Pro)](#30-day-forecast-pro) - [Stations](#stations) - [Register a Station](#register-a-station) - [List Stations](#list-stations) @@ -221,9 +222,10 @@ data.hourly # => Array[OpenWeather::Models::OneCall::HourlyWeather] The [Hourly Forecast API](https://openweathermap.org/api/hourly-forecast) provides hourly weather forecast for 4 days. Note: This API requires a paid api-key from [OpenWeather.org](https://openweathermap.org/full-price#current). ```ruby -data = client.client.hourly(lat: 33.5312, lon: -111.9426) # => OpenWeather::Models::Forecast::Hourly +data = client.client.hourly(lat: 33.5312, lon: -111.9426, appid: "") # => OpenWeather::Models::Forecast::Hourly data.cnt # => 96 (number of entries) +data.city # => OpenWeather::Models::Forecast::City data.list.first # => OpenWeather::Models::Forecast::Forecast data.list.first.dt # => Time data.list.first.main # => OpenWeather::Models::Forecast::Main @@ -238,6 +240,31 @@ data.list.first.sys # => OpenWeather::Models::Forecast::Sys or nil data.list.first.dt_txt # => String (Time of data forecasted, ISO, UTC) ``` +### 30 Day Forecast (Pro) + +The [30 Day Forecast API](https://openweathermap.org/api/forecast30) provides daily weather forecast for 30 days. Note: This API requires a paid api-key from [OpenWeather.org](https://openweathermap.org/full-price#current). + +```ruby +data = client.client.forecast(lat: 33.5312, lon: -111.9426, appid: "") # => OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay + +data.cnt # => 30 (number of entries - sometimes this is 29) +data.city # => OpenWeather::Models::Forecast::City +data.list.first # => OpenWeather::Models::Forecast::ThirtyDay::Forecast +data.list.first.dt # => Time - time of data forcasted, UTC +data.list.first.sunrise # => Time - Sunrise time, UTC +data.list.first.sunset # => Time - Sunset time, UTC +data.list.first.temp # => OpenWeather::Models::Forecast::ThirtyDay::Temp +data.list.first.feels_like # => OpenWeather::Models::OneCall::FeelsLike +data.list.first.pressure # => int - Atmospheric pressure on the sea level, hPa +data.list.first.humidity # => int - Humidity, % (e.g. integer 24 means 24% cloudiness) +data.list.first.weather # => Array[OpenWeather::Models::Weather] +data.list.first.speed # => double - Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour +data.list.first.deg # => int - Wind direction, degrees (meteorological) +data.list.first.clouds # => int - Cloudiness, % (e.g. integer 78 means 78% cloudiness) +data.list.first.rain # => double or nil - Precipitation volume, mm. Please note that only mm as units of measurement are available for this parameter +data.list.first.snow # => double or nil - Snow volume, mm. Please note that only mm as units of measurement are available for this parameter +``` + ### Stations The [Stations API](https://openweathermap.org/stations) lets your manage personal weather stations and measurements. diff --git a/lib/open_weather/client.rb b/lib/open_weather/client.rb index 15b533c..b6b4481 100644 --- a/lib/open_weather/client.rb +++ b/lib/open_weather/client.rb @@ -6,6 +6,7 @@ class Client include Request include Endpoints::Current include Endpoints::Hourly + include Endpoints::ThirtyDayForecast include Endpoints::OneCall include Endpoints::Stations diff --git a/lib/open_weather/endpoints.rb b/lib/open_weather/endpoints.rb index 78ba719..07ebb57 100644 --- a/lib/open_weather/endpoints.rb +++ b/lib/open_weather/endpoints.rb @@ -4,3 +4,4 @@ require_relative 'endpoints/one_call' require_relative 'endpoints/stations' require_relative 'endpoints/hourly' +require_relative 'endpoints/thirty_day_forecast' diff --git a/lib/open_weather/endpoints/thirty_day_forecast.rb b/lib/open_weather/endpoints/thirty_day_forecast.rb new file mode 100644 index 0000000..caba2ec --- /dev/null +++ b/lib/open_weather/endpoints/thirty_day_forecast.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module OpenWeather + module Endpoints + module ThirtyDayForecast + def thirty_day_forecast(lat, lon = nil, options = {}) + # default to the pro endpoint if not specified + endpoint = options.delete(:endpoint) || pro_endpoint + options = options.merge(endpoint: endpoint) + + options = lat.is_a?(Hash) ? options.merge(lat) : options.merge(lat: lat, lon: lon) + OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay.new(get('2.5/forecast/climate', options), options) + end + end + end +end diff --git a/lib/open_weather/models/forecast.rb b/lib/open_weather/models/forecast.rb index d86f273..d2fbf90 100644 --- a/lib/open_weather/models/forecast.rb +++ b/lib/open_weather/models/forecast.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true require_relative 'forecast/hourly' +require_relative 'forecast/thirty_day' require_relative 'forecast/forecast' require_relative 'forecast/city' diff --git a/lib/open_weather/models/forecast/city.rb b/lib/open_weather/models/forecast/city.rb index 6190aba..06b4548 100644 --- a/lib/open_weather/models/forecast/city.rb +++ b/lib/open_weather/models/forecast/city.rb @@ -11,6 +11,7 @@ class City < Model property 'timezone' # shift in seconds from UTC property 'sunrise', transform_with: ->(v) { Time.at(v).utc } # Sunrise time, UTC property 'sunset', transform_with: ->(v) { Time.at(v).utc } # Sunset time, UTC + property 'population' # City population end end end diff --git a/lib/open_weather/models/forecast/thirty_day.rb b/lib/open_weather/models/forecast/thirty_day.rb new file mode 100644 index 0000000..9e03809 --- /dev/null +++ b/lib/open_weather/models/forecast/thirty_day.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require_relative 'thirty_day/thirty_day' +require_relative 'thirty_day/forecast' +require_relative 'thirty_day/temp' diff --git a/lib/open_weather/models/forecast/thirty_day/forecast.rb b/lib/open_weather/models/forecast/thirty_day/forecast.rb new file mode 100644 index 0000000..3816630 --- /dev/null +++ b/lib/open_weather/models/forecast/thirty_day/forecast.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module OpenWeather + module Models + module Forecast + module ThirtyDay + class Forecast < Model + property 'dt', transform_with: ->(v) { Time.at(v).utc } # time of data forcasted, UTC + property 'sunrise', transform_with: ->(v) { Time.at(v).utc } # Sunrise time, UTC + property 'sunset', transform_with: ->(v) { Time.at(v).utc } # Sunset time, UTC + property 'temp' # Array of OpenWeather::Models::Forecast::ThityDay::Temp + property 'feels_like' # OpenWeather::Models::OneCall::FeelsLike + property 'pressure' # Atmospheric pressure on the sea level, hPa + property 'humidity' # Humidity, % (e.g. integer 24 means 24% cloudiness) + property 'weather' # Array of OpenWeather::Models::Weather + property 'speed' # Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour + property 'deg' # Wind direction, degrees (meteorological) + property 'clouds' # Cloudiness, % (e.g. integer 78 means 78% cloudiness) + property 'rain' # Precipitation volume, mm. Please note that only mm as units of measurement are available for this parameter + property 'snow' # Snow volume, mm. Please note that only mm as units of measurement are available for this parameter + + def initialize(args = nil, options = {}) + super args, options + + self.temp = Temp.new(temp, options) if temp + self.feels_like = OpenWeather::Models::OneCall::FeelsLike.new(feels_like, options) if feels_like + self.weather = weather.map { |w| OpenWeather::Models::Weather.new(w, options) } if weather + end + end + end + end + end +end diff --git a/lib/open_weather/models/forecast/thirty_day/temp.rb b/lib/open_weather/models/forecast/thirty_day/temp.rb new file mode 100644 index 0000000..3275d24 --- /dev/null +++ b/lib/open_weather/models/forecast/thirty_day/temp.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module OpenWeather + module Models + module Forecast + module ThirtyDay + class Temp < Model + temperature_property 'day' # Day temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'min' # Min daily temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'max' # Max daily temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'night' # Night temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'eve' # Evening temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'morn' # Morning temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + end + end + end + end +end diff --git a/lib/open_weather/models/forecast/thirty_day/thirty_day.rb b/lib/open_weather/models/forecast/thirty_day/thirty_day.rb new file mode 100644 index 0000000..91cafb7 --- /dev/null +++ b/lib/open_weather/models/forecast/thirty_day/thirty_day.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module OpenWeather + module Models + module Forecast + module ThirtyDay + class ThirtyDay < Model + include Enumerable + + property 'cod' # Internal parameter + property 'message' # Internal parameter + property 'city' + property 'cnt' # Number of items in list + property 'list' # List of ??? objects + + def initialize(args = nil, options = {}) + super args, options + + self.list = list.map { |forecast| Forecast.new(forecast, options) } if list + self.city = OpenWeather::Models::Forecast::City.new(city, options) if city + end + end + end + end + end +end diff --git a/spec/fixtures/open_weather/forecast/thirty_day.yml b/spec/fixtures/open_weather/forecast/thirty_day.yml new file mode 100644 index 0000000..51d847c --- /dev/null +++ b/spec/fixtures/open_weather/forecast/thirty_day.yml @@ -0,0 +1,217 @@ +--- +http_interactions: +- request: + method: get + uri: https://pro.openweathermap.org/data/2.5/forecast/climate?appid=api-key&lat=33.5312&lon=-111.9426 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json; charset=utf-8 + Content-Type: + - application/json + User-Agent: + - OpenWeather Ruby Client/0.5.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - openresty + Date: + - Thu, 04 Jul 2024 19:45:44 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '10770' + Connection: + - keep-alive + X-Cache-Key: + - "/data/2.5/forecast/climate?lat=33.53&lon=-111.94" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: '{"city":{"id":5308049,"name":"Paradise Valley","coord":{"lon":-111.9426,"lat":33.5312},"country":"US","population":12820,"timezone":-25200},"code":"200","message":22.2974177,"cnt":29,"list":[{"dt":1720119600,"sunrise":1720095772,"sunset":1720147281,"temp":{"day":310.33,"min":300.15,"max":313.81,"night":304.51,"eve":313.81,"morn":301.79},"feels_like":{"day":309.61,"night":303.36,"eve":312.52,"morn":301.32},"pressure":1013,"humidity":24,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":5.41,"deg":241,"clouds":78},{"dt":1720206000,"sunrise":1720182201,"sunset":1720233672,"temp":{"day":311.7,"min":300.15,"max":316.37,"night":306.86,"eve":316.37,"morn":300.15},"feels_like":{"day":310.53,"night":304.99,"eve":314.42,"morn":300.12},"pressure":1010,"humidity":20,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.13,"deg":250,"clouds":39},{"dt":1720292400,"sunrise":1720268631,"sunset":1720320061,"temp":{"day":313.16,"min":302.55,"max":317.45,"night":307.54,"eve":317.45,"morn":302.68},"feels_like":{"day":311.95,"night":306,"eve":315.32,"morn":301.48},"pressure":1009,"humidity":18,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.65,"deg":243,"clouds":8},{"dt":1720378800,"sunrise":1720355061,"sunset":1720406449,"temp":{"day":313.48,"min":301.78,"max":318.04,"night":307.46,"eve":318.04,"morn":302.55},"feels_like":{"day":312.38,"night":305.66,"eve":315.58,"morn":301.5},"pressure":1009,"humidity":18,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.38,"deg":250,"clouds":7},{"dt":1720465200,"sunrise":1720441493,"sunset":1720492835,"temp":{"day":314.67,"min":301.78,"max":319.16,"night":307.78,"eve":319.16,"morn":301.78},"feels_like":{"day":313.33,"night":305.43,"eve":315.43,"morn":300.96},"pressure":1007,"humidity":16,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.94,"deg":259,"clouds":3},{"dt":1720551600,"sunrise":1720527925,"sunset":1720579220,"temp":{"day":316.51,"min":303.2,"max":319.42,"night":308.39,"eve":319.42,"morn":303.2},"feels_like":{"day":314.22,"night":306.14,"eve":315.68,"morn":301.59},"pressure":1006,"humidity":12,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":5.48,"deg":259,"clouds":16},{"dt":1720638000,"sunrise":1720614358,"sunset":1720665603,"temp":{"day":314.89,"min":304.81,"max":318.09,"night":307.36,"eve":318.09,"morn":304.92},"feels_like":{"day":312.98,"night":305.24,"eve":315.21,"morn":302.92},"pressure":1009,"humidity":14,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":5.06,"deg":243,"clouds":43},{"dt":1720724400,"sunrise":1720700792,"sunset":1720751985,"temp":{"day":313.61,"min":304.81,"max":317.44,"night":308.13,"eve":317.44,"morn":304.81},"feels_like":{"day":313.52,"night":306.42,"eve":315.31,"morn":302.98},"pressure":1012,"humidity":21,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":3.78,"deg":111,"clouds":32},{"dt":1720810800,"sunrise":1720787227,"sunset":1720838365,"temp":{"day":312.82,"min":303.45,"max":317.23,"night":307.63,"eve":317.23,"morn":305.06},"feels_like":{"day":312.06,"night":305.85,"eve":315.06,"morn":303.55},"pressure":1012,"humidity":20,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":4.18,"deg":238,"clouds":55},{"dt":1720897200,"sunrise":1720873662,"sunset":1720924743,"temp":{"day":311.86,"min":302.26,"max":315.85,"night":306.35,"eve":315.85,"morn":303.45},"feels_like":{"day":310.75,"night":304.37,"eve":313.8,"morn":302.27},"pressure":1010,"humidity":20,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":4.92,"deg":248,"clouds":80},{"dt":1720983600,"sunrise":1720960098,"sunset":1721011120,"temp":{"day":312.25,"min":300.26,"max":314.83,"night":304.58,"eve":314.83,"morn":302.26},"feels_like":{"day":310.32,"night":302.65,"eve":312.33,"morn":300.95},"pressure":1009,"humidity":16,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":5.1,"deg":243,"clouds":12},{"dt":1721070000,"sunrise":1721046535,"sunset":1721097495,"temp":{"day":312.02,"min":300.2,"max":314.54,"night":304.02,"eve":314.54,"morn":300.26},"feels_like":{"day":309.66,"night":302.08,"eve":311.76,"morn":299.53},"pressure":1010,"humidity":14,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.98,"deg":245,"clouds":6},{"dt":1721156400,"sunrise":1721132973,"sunset":1721183869,"temp":{"day":312.22,"min":300.2,"max":314.48,"night":303.7,"eve":314.48,"morn":300.2},"feels_like":{"day":309.53,"night":301.92,"eve":311.94,"morn":299.42},"pressure":1011,"humidity":12,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":4.99,"deg":234,"clouds":17},{"dt":1721242800,"sunrise":1721219411,"sunset":1721270241,"temp":{"day":308.95,"min":300.32,"max":312.47,"night":304.29,"eve":312.47,"morn":300.32},"feels_like":{"day":306.62,"night":303.03,"eve":310.58,"morn":299.56},"pressure":1011,"humidity":16,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.32,"deg":207,"clouds":65},{"dt":1721329200,"sunrise":1721305849,"sunset":1721356612,"temp":{"day":311.12,"min":302.75,"max":313.58,"night":304.27,"eve":313.58,"morn":302.78},"feels_like":{"day":309.56,"night":303.1,"eve":312.51,"morn":301.63},"pressure":1011,"humidity":19,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":3.39,"deg":252,"clouds":44},{"dt":1721415600,"sunrise":1721392288,"sunset":1721442981,"temp":{"day":310.37,"min":301.64,"max":313.45,"night":303.71,"eve":313.45,"morn":302.75},"feels_like":{"day":308.82,"night":302.21,"eve":311.78,"morn":301.75},"pressure":1011,"humidity":20,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.38,"deg":250,"clouds":72},{"dt":1721502000,"sunrise":1721478728,"sunset":1721529349,"temp":{"day":311.5,"min":301.64,"max":314.39,"night":304.71,"eve":314.39,"morn":301.64},"feels_like":{"day":309.26,"night":302.89,"eve":312.38,"morn":300.61},"pressure":1011,"humidity":15,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":2.72,"deg":264,"clouds":65},{"dt":1721588400,"sunrise":1721565168,"sunset":1721615715,"temp":{"day":312.23,"min":302.12,"max":316.01,"night":307.14,"eve":316.01,"morn":303.01},"feels_like":{"day":309.71,"night":305.1,"eve":313.65,"morn":301.34},"pressure":1011,"humidity":13,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":4.06,"deg":276,"clouds":75},{"dt":1721674800,"sunrise":1721651608,"sunset":1721702080,"temp":{"day":314.31,"min":302.12,"max":316.91,"night":308.03,"eve":316.91,"morn":302.12},"feels_like":{"day":312.01,"night":305.95,"eve":314.69,"morn":300.75},"pressure":1010,"humidity":13,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":3.77,"deg":262,"clouds":17},{"dt":1721761200,"sunrise":1721738049,"sunset":1721788443,"temp":{"day":315.64,"min":302.98,"max":318.37,"night":309.72,"eve":318.37,"morn":302.98},"feels_like":{"day":313.23,"night":307.71,"eve":315.51,"morn":301.5},"pressure":1010,"humidity":12,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.44,"deg":268,"clouds":30},{"dt":1721847600,"sunrise":1721824490,"sunset":1721874805,"temp":{"day":314.53,"min":305.43,"max":318.06,"night":309.2,"eve":318.06,"morn":305.43},"feels_like":{"day":312.54,"night":307.12,"eve":315.18,"morn":303.59},"pressure":1009,"humidity":14,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.34,"deg":278,"clouds":68},{"dt":1721934000,"sunrise":1721910932,"sunset":1721961166,"temp":{"day":316.29,"min":302.79,"max":318.24,"night":307.01,"eve":318.24,"morn":306.1},"feels_like":{"day":313.97,"night":304.97,"eve":315.37,"morn":304.11},"pressure":1008,"humidity":12,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.6,"deg":267,"clouds":35},{"dt":1722020400,"sunrise":1721997374,"sunset":1722047525,"temp":{"day":314.05,"min":301.36,"max":316.61,"night":305.71,"eve":316.61,"morn":302.79},"feels_like":{"day":312.25,"night":303.72,"eve":313.98,"morn":301.29},"pressure":1010,"humidity":15,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":5.38,"deg":249,"clouds":7},{"dt":1722106800,"sunrise":1722083816,"sunset":1722133883,"temp":{"day":312.32,"min":300.79,"max":316.29,"night":305.25,"eve":316.29,"morn":301.36},"feels_like":{"day":310.62,"night":303.34,"eve":313.63,"morn":300.45},"pressure":1011,"humidity":17,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.41,"deg":258,"clouds":10},{"dt":1722193200,"sunrise":1722170258,"sunset":1722220239,"temp":{"day":313.12,"min":300.56,"max":316.2,"night":305.23,"eve":316.2,"morn":300.79},"feels_like":{"day":311.13,"night":303.32,"eve":313.87,"morn":300.03},"pressure":1011,"humidity":15,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":5.28,"deg":244,"clouds":7},{"dt":1722279600,"sunrise":1722256701,"sunset":1722306594,"temp":{"day":312.9,"min":300.56,"max":315.91,"night":306.42,"eve":315.91,"morn":300.56},"feels_like":{"day":311.1,"night":304.62,"eve":313.54,"morn":299.92},"pressure":1011,"humidity":16,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":5.75,"deg":258,"clouds":18},{"dt":1722366000,"sunrise":1722343143,"sunset":1722392947,"temp":{"day":313.77,"min":301.96,"max":316.3,"night":306.04,"eve":316.3,"morn":302.01},"feels_like":{"day":312.77,"night":304.75,"eve":314.71,"morn":301.03},"pressure":1012,"humidity":18,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":5.14,"deg":262,"clouds":28},{"dt":1722452400,"sunrise":1722429586,"sunset":1722479300,"temp":{"day":313.2,"min":301.96,"max":315.27,"night":305.72,"eve":315.27,"morn":301.96},"feels_like":{"day":312.6,"night":304.76,"eve":314.48,"morn":301.57},"pressure":1011,"humidity":20,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.72,"deg":263,"clouds":26},{"dt":1722538800,"sunrise":1722516029,"sunset":1722565651,"temp":{"day":313.98,"min":302.56,"max":316.13,"night":307.08,"eve":316.13,"morn":302.56},"feels_like":{"day":313.73,"night":306.34,"eve":315.69,"morn":302.28},"pressure":1012,"humidity":20,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.54,"deg":270,"clouds":44}]}' + recorded_at: Thu, 04 Jul 2024 19:45:44 GMT +- request: + method: get + uri: https://pro.openweathermap.org/data/2.5/forecast/climate?appid=api-key&lat=82.8628&lon=135.0 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json; charset=utf-8 + Content-Type: + - application/json + User-Agent: + - OpenWeather Ruby Client/0.5.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - openresty + Date: + - Thu, 04 Jul 2024 19:52:33 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '10399' + Connection: + - keep-alive + X-Cache-Key: + - "/data/2.5/forecast/climate?lat=82.86&lon=135" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: '{"city":{"id":0,"name":"","coord":{"lon":135,"lat":82.8628},"country":"","population":0,"timezone":32400},"code":"200","message":22.4998097,"cnt":29,"list":[{"dt":1720148400,"sunrise":0,"sunset":0,"temp":{"day":273.74,"min":273.2,"max":273.91,"night":273.3,"eve":273.49,"morn":273.91},"feels_like":{"day":269.95,"night":269.97,"eve":269.81,"morn":270.27},"pressure":1011,"humidity":93,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.5,"deg":332,"clouds":15,"snow":0.14},{"dt":1720234800,"sunrise":0,"sunset":0,"temp":{"day":273.2,"min":273.11,"max":273.2,"night":273.19,"eve":273.2,"morn":273.2},"feels_like":{"day":270.52,"night":271.54,"eve":273.2,"morn":270.13},"pressure":1014,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":2.67,"deg":336,"clouds":98,"snow":0.14},{"dt":1720321200,"sunrise":0,"sunset":0,"temp":{"day":273.13,"min":273.11,"max":273.16,"night":273.13,"eve":273.11,"morn":273.11},"feels_like":{"day":269.51,"night":268.18,"eve":269.33,"morn":269.91},"pressure":1010,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.19,"deg":49,"clouds":53,"snow":0.42},{"dt":1720407600,"sunrise":0,"sunset":0,"temp":{"day":273.2,"min":273.16,"max":273.25,"night":273.25,"eve":273.25,"morn":273.16},"feels_like":{"day":267.51,"night":267.76,"eve":267.69,"morn":267.62},"pressure":1012,"humidity":93,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.53,"deg":55,"clouds":88,"snow":0.92},{"dt":1720494000,"sunrise":0,"sunset":0,"temp":{"day":273.24,"min":273.21,"max":273.25,"night":273.25,"eve":273.25,"morn":273.21},"feels_like":{"day":267.87,"night":268.07,"eve":268.06,"morn":267.74},"pressure":1014,"humidity":92,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.07,"deg":57,"clouds":90,"snow":0.81},{"dt":1720580400,"sunrise":0,"sunset":0,"temp":{"day":273.23,"min":273.11,"max":273.25,"night":273.18,"eve":273.25,"morn":273.21},"feels_like":{"day":267.53,"night":267.44,"eve":267.5,"morn":267.76},"pressure":1018,"humidity":93,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.84,"deg":55,"clouds":98,"snow":0.55},{"dt":1720666800,"sunrise":0,"sunset":0,"temp":{"day":273.2,"min":273.11,"max":273.34,"night":273.34,"eve":273.32,"morn":273.11},"feels_like":{"day":267.24,"night":267.33,"eve":267.27,"morn":267.25},"pressure":1019,"humidity":93,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":7.44,"deg":49,"clouds":99,"snow":0.61},{"dt":1720753200,"sunrise":0,"sunset":0,"temp":{"day":273.32,"min":273.32,"max":273.45,"night":273.45,"eve":273.38,"morn":273.32},"feels_like":{"day":267.79,"night":269.43,"eve":268.49,"morn":267.4},"pressure":1018,"humidity":95,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":7.12,"deg":51,"clouds":93,"snow":0.18},{"dt":1720839600,"sunrise":0,"sunset":0,"temp":{"day":273.36,"min":273.01,"max":273.39,"night":273.05,"eve":273.23,"morn":273.39},"feels_like":{"day":270.18,"night":268.59,"eve":269.27,"morn":270.11},"pressure":1017,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.42,"deg":292,"clouds":39,"snow":0.14},{"dt":1720926000,"sunrise":0,"sunset":0,"temp":{"day":273.03,"min":273.01,"max":273.04,"night":273.04,"eve":273.04,"morn":273.01},"feels_like":{"day":268.87,"night":269.2,"eve":269.27,"morn":268.41},"pressure":1015,"humidity":95,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.42,"deg":292,"clouds":92,"snow":0.59},{"dt":1721012400,"sunrise":0,"sunset":0,"temp":{"day":273.11,"min":273.04,"max":273.16,"night":273.16,"eve":273.15,"morn":273.04},"feels_like":{"day":268.49,"night":268.29,"eve":268.21,"morn":268.83},"pressure":1016,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.04,"deg":331,"clouds":89,"snow":0.67},{"dt":1721098800,"sunrise":0,"sunset":0,"temp":{"day":273.12,"min":273.1,"max":273.21,"night":273.19,"eve":273.15,"morn":273.1},"feels_like":{"day":268.44,"night":268.73,"eve":268.47,"morn":268.45},"pressure":1018,"humidity":95,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.61,"deg":297,"clouds":89,"snow":0.5},{"dt":1721185200,"sunrise":0,"sunset":0,"temp":{"day":273.29,"min":272.99,"max":273.32,"night":273.19,"eve":273.32,"morn":273.21},"feels_like":{"day":269.08,"night":268.82,"eve":269.12,"morn":268.83},"pressure":1022,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.3,"deg":261,"clouds":86,"snow":0.11},{"dt":1721271600,"sunrise":0,"sunset":0,"temp":{"day":273.17,"min":272.99,"max":273.6,"night":273.6,"eve":273.43,"morn":272.99},"feels_like":{"day":267.9,"night":268.56,"eve":268.35,"morn":267.86},"pressure":1022,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.65,"deg":258,"clouds":92,"snow":0.5},{"dt":1721358000,"sunrise":0,"sunset":0,"temp":{"day":273.53,"min":273.53,"max":273.6,"night":273.6,"eve":273.57,"morn":273.56},"feels_like":{"day":269.13,"night":269.65,"eve":269.29,"morn":268.67},"pressure":1021,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.14,"deg":273,"clouds":96,"snow":0.7},{"dt":1721444400,"sunrise":0,"sunset":0,"temp":{"day":273.69,"min":273.58,"max":273.79,"night":273.79,"eve":273.78,"morn":273.58},"feels_like":{"day":271.07,"night":270.46,"eve":270.77,"morn":270.33},"pressure":1021,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.26,"deg":220,"clouds":95,"snow":0.7},{"dt":1721530800,"sunrise":0,"sunset":0,"temp":{"day":273.78,"min":273.73,"max":273.83,"night":273.83,"eve":273.79,"morn":273.73},"feels_like":{"day":269.9,"night":270.15,"eve":269.97,"morn":270.13},"pressure":1019,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.64,"deg":210,"clouds":89,"snow":0.53},{"dt":1721617200,"sunrise":0,"sunset":0,"temp":{"day":273.67,"min":273.49,"max":273.76,"night":273.56,"eve":273.54,"morn":273.76},"feels_like":{"day":269.71,"night":268.75,"eve":269.28,"morn":270.39},"pressure":1019,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.11,"deg":85,"clouds":53,"snow":0.64},{"dt":1721703600,"sunrise":0,"sunset":0,"temp":{"day":273.38,"min":273.1,"max":273.49,"night":273.17,"eve":273.26,"morn":273.49},"feels_like":{"day":267.61,"night":268.53,"eve":267.84,"morn":268.08},"pressure":1014,"humidity":95,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.82,"deg":81,"clouds":96,"snow":4.33},{"dt":1721790000,"sunrise":0,"sunset":0,"temp":{"day":273.11,"min":273.1,"max":273.28,"night":273.24,"eve":273.14,"morn":273.1},"feels_like":{"day":270.42,"night":273.24,"eve":273.14,"morn":269.38},"pressure":1010,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.24,"deg":61,"clouds":100,"snow":1.14},{"dt":1721876400,"sunrise":0,"sunset":0,"temp":{"day":273.36,"min":273.23,"max":273.41,"night":273.35,"eve":273.41,"morn":273.28},"feels_like":{"day":271.29,"night":269.82,"eve":270.36,"morn":271.67},"pressure":1010,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.66,"deg":299,"clouds":98,"snow":2.4},{"dt":1721962800,"sunrise":0,"sunset":0,"temp":{"day":273.17,"min":273.06,"max":273.23,"night":273.16,"eve":273.13,"morn":273.23},"feels_like":{"day":269.14,"night":268.19,"eve":268.7,"morn":269.21},"pressure":1010,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.87,"deg":303,"clouds":94,"snow":1.75},{"dt":1722049200,"sunrise":0,"sunset":0,"temp":{"day":273.03,"min":273.03,"max":273.38,"night":273.38,"eve":273.19,"morn":273.06},"feels_like":{"day":268.01,"night":268.32,"eve":268.41,"morn":267.65},"pressure":1011,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.87,"deg":303,"clouds":84,"snow":2.18},{"dt":1722135600,"sunrise":0,"sunset":0,"temp":{"day":273.24,"min":273,"max":273.36,"night":273.04,"eve":273.12,"morn":273.36},"feels_like":{"day":268.67,"night":268.61,"eve":268.57,"morn":268.53},"pressure":1010,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.95,"deg":239,"clouds":96,"snow":1.55},{"dt":1722222000,"sunrise":0,"sunset":0,"temp":{"day":273.07,"min":273,"max":273.25,"night":273.23,"eve":273.15,"morn":273},"feels_like":{"day":269.09,"night":269.46,"eve":269.1,"morn":268.67},"pressure":1012,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.02,"deg":271,"clouds":90,"snow":0.37},{"dt":1722308400,"sunrise":0,"sunset":0,"temp":{"day":273.34,"min":273.25,"max":273.42,"night":273.33,"eve":273.42,"morn":273.25},"feels_like":{"day":269.47,"night":269.69,"eve":269.25,"morn":269.52},"pressure":1015,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.92,"deg":304,"clouds":72,"snow":0.15},{"dt":1722394800,"sunrise":0,"sunset":0,"temp":{"day":273.6,"min":273.38,"max":273.87,"night":273.82,"eve":273.7,"morn":273.38},"feels_like":{"day":268.96,"night":268.26,"eve":268.21,"morn":269.54},"pressure":1017,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.86,"deg":217,"clouds":44,"snow":4.32},{"dt":1722481200,"sunrise":0,"sunset":0,"temp":{"day":273.8,"min":273.77,"max":273.87,"night":273.86,"eve":273.84,"morn":273.87},"feels_like":{"day":268.15,"night":268.45,"eve":268.23,"morn":268.22},"pressure":1012,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.86,"deg":217,"clouds":85,"snow":5.1},{"dt":1722567600,"sunrise":0,"sunset":0,"temp":{"day":273.7,"min":273.58,"max":273.77,"night":273.58,"eve":273.58,"morn":273.77},"feels_like":{"day":269.66,"night":270.62,"eve":270.62,"morn":268.81},"pressure":1005,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.36,"deg":216,"clouds":93,"snow":1.86}]}' + recorded_at: Thu, 04 Jul 2024 19:52:33 GMT +- request: + method: get + uri: https://pro.openweathermap.org/data/2.5/forecast/climate?appid=api-key&lat=39.00801&lon=-76.97647 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json; charset=utf-8 + Content-Type: + - application/json + User-Agent: + - OpenWeather Ruby Client/0.5.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - openresty + Date: + - Thu, 04 Jul 2024 19:55:42 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '11254' + Connection: + - keep-alive + X-Cache-Key: + - "/data/2.5/forecast/climate?lat=39.01&lon=-76.98" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: '{"city":{"id":4346991,"name":"Adelphi","coord":{"lon":-76.9765,"lat":39.008},"country":"US","population":15086,"timezone":-14400},"code":"200","message":21.4966823,"cnt":30,"list":[{"dt":1720108800,"sunrise":1720086455,"sunset":1720139813,"temp":{"day":304.33,"min":293.81,"max":304.33,"night":297.81,"eve":300.63,"morn":293.81},"feels_like":{"day":305.67,"night":298.42,"eve":302.74,"morn":293.86},"pressure":1012,"humidity":48,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":4.88,"deg":196,"clouds":61,"rain":0.51},{"dt":1720195200,"sunrise":1720172888,"sunset":1720226199,"temp":{"day":306.47,"min":296.98,"max":306.47,"night":296.98,"eve":299.91,"morn":297.23},"feels_like":{"day":310.4,"night":297.9,"eve":302.78,"morn":297.99},"pressure":1010,"humidity":51,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":3.16,"deg":223,"clouds":31,"rain":3.31},{"dt":1720281600,"sunrise":1720259322,"sunset":1720312584,"temp":{"day":306.4,"min":296.98,"max":306.4,"night":299.87,"eve":302.62,"morn":297.93},"feels_like":{"day":309.65,"night":301.14,"eve":305.92,"morn":298.76},"pressure":1010,"humidity":49,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.1,"deg":236,"clouds":32},{"dt":1720368000,"sunrise":1720345758,"sunset":1720398967,"temp":{"day":299.98,"min":296.31,"max":299.98,"night":296.98,"eve":298.46,"morn":296.31},"feels_like":{"day":303.13,"night":297.93,"eve":299.5,"morn":296.9},"pressure":1014,"humidity":87,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":4.51,"deg":180,"clouds":95,"rain":13.94},{"dt":1720454400,"sunrise":1720432195,"sunset":1720485347,"temp":{"day":300.93,"min":296.21,"max":300.93,"night":296.21,"eve":300.33,"morn":296.48},"feels_like":{"day":305.14,"night":296.56,"eve":302.69,"morn":297.38},"pressure":1008,"humidity":83,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":5.64,"deg":189,"clouds":88,"rain":16.5},{"dt":1720540800,"sunrise":1720518633,"sunset":1720571726,"temp":{"day":304.34,"min":292.99,"max":304.34,"night":292.99,"eve":300,"morn":296.1},"feels_like":{"day":305.31,"night":292.88,"eve":301.25,"morn":296.44},"pressure":1014,"humidity":46,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":3.4,"deg":261,"clouds":11},{"dt":1720627200,"sunrise":1720605073,"sunset":1720658103,"temp":{"day":305.05,"min":292.99,"max":305.05,"night":296.85,"eve":299.29,"morn":298.45},"feels_like":{"day":307.57,"night":297.78,"eve":299.29,"morn":298.68},"pressure":1017,"humidity":51,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":4.28,"deg":213,"clouds":55,"rain":12.85},{"dt":1720713600,"sunrise":1720691513,"sunset":1720744479,"temp":{"day":302.62,"min":293.92,"max":302.62,"night":293.92,"eve":298.92,"morn":296.24},"feels_like":{"day":303.44,"night":293.83,"eve":299.2,"morn":297.03},"pressure":1015,"humidity":50,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":4.28,"deg":213,"clouds":39,"rain":9.62},{"dt":1720800000,"sunrise":1720777954,"sunset":1720830852,"temp":{"day":302.68,"min":292.83,"max":302.68,"night":296.39,"eve":298.38,"morn":292.83},"feels_like":{"day":303.67,"night":296.68,"eve":298.79,"morn":292.92},"pressure":1017,"humidity":51,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":2.66,"deg":320,"clouds":17},{"dt":1720886400,"sunrise":1720864397,"sunset":1720917224,"temp":{"day":302.77,"min":296.39,"max":302.77,"night":297.41,"eve":298.65,"morn":296.86},"feels_like":{"day":303.65,"night":297.72,"eve":299.11,"morn":297.35},"pressure":1014,"humidity":50,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":2.16,"deg":138,"clouds":44},{"dt":1720972800,"sunrise":1720950840,"sunset":1721003593,"temp":{"day":302.88,"min":296.73,"max":302.88,"night":297.89,"eve":299.83,"morn":296.73},"feels_like":{"day":304.11,"night":298.14,"eve":301.21,"morn":297.1},"pressure":1015,"humidity":52,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":2.56,"deg":219,"clouds":80},{"dt":1721059200,"sunrise":1721037284,"sunset":1721089961,"temp":{"day":304.84,"min":296.73,"max":304.84,"night":300.2,"eve":301.57,"morn":296.73},"feels_like":{"day":305.7,"night":300.81,"eve":302.4,"morn":297.02},"pressure":1014,"humidity":44,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.79,"deg":205,"clouds":54},{"dt":1721145600,"sunrise":1721123729,"sunset":1721176327,"temp":{"day":304.53,"min":297.15,"max":304.53,"night":297.61,"eve":299.87,"morn":297.15},"feels_like":{"day":310.23,"night":298.51,"eve":302.76,"morn":297.67},"pressure":1015,"humidity":65,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":3.73,"deg":244,"clouds":52,"rain":11.83},{"dt":1721232000,"sunrise":1721210175,"sunset":1721262692,"temp":{"day":299.89,"min":291.83,"max":299.89,"night":291.83,"eve":294.57,"morn":296.67},"feels_like":{"day":302.73,"night":292.08,"eve":295.17,"morn":297.58},"pressure":1014,"humidity":85,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":6.01,"deg":16,"clouds":86,"rain":29.64},{"dt":1721318400,"sunrise":1721296622,"sunset":1721349054,"temp":{"day":296.86,"min":288.7,"max":296.86,"night":288.7,"eve":293.15,"morn":290.63},"feels_like":{"day":296.67,"night":288.32,"eve":292.98,"morn":290.55},"pressure":1022,"humidity":53,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":5.11,"deg":14,"clouds":57,"rain":0.2},{"dt":1721404800,"sunrise":1721383070,"sunset":1721435415,"temp":{"day":295.47,"min":288.7,"max":295.47,"night":288.77,"eve":292.46,"morn":289.64},"feels_like":{"day":295.12,"night":288.55,"eve":292.27,"morn":289.2},"pressure":1024,"humidity":52,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.7,"deg":70,"clouds":84},{"dt":1721491200,"sunrise":1721469518,"sunset":1721521774,"temp":{"day":296.32,"min":288.35,"max":296.32,"night":288.35,"eve":293.16,"morn":289.01},"feels_like":{"day":296.1,"night":288.15,"eve":293.07,"morn":288.79},"pressure":1023,"humidity":54,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":4.9,"deg":56,"clouds":15},{"dt":1721577600,"sunrise":1721555967,"sunset":1721608132,"temp":{"day":296.54,"min":288.35,"max":296.54,"night":289.36,"eve":293.47,"morn":288.69},"feels_like":{"day":296.24,"night":289.13,"eve":293.46,"morn":288.34},"pressure":1019,"humidity":50,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.21,"deg":357,"clouds":38},{"dt":1721664000,"sunrise":1721642416,"sunset":1721694488,"temp":{"day":300.26,"min":289.36,"max":300.26,"night":290.01,"eve":296.25,"morn":290.88},"feels_like":{"day":300.37,"night":290.08,"eve":296.47,"morn":290.46},"pressure":1017,"humidity":45,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":3.58,"deg":33,"clouds":10},{"dt":1721750400,"sunrise":1721728867,"sunset":1721780842,"temp":{"day":302.08,"min":290.01,"max":302.08,"night":291.2,"eve":297.8,"morn":293.88},"feels_like":{"day":303.49,"night":291.62,"eve":298.44,"morn":294.05},"pressure":1019,"humidity":56,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.47,"deg":105,"clouds":7,"rain":1.37},{"dt":1721836800,"sunrise":1721815317,"sunset":1721867194,"temp":{"day":302.43,"min":291.2,"max":302.43,"night":296.19,"eve":298.85,"morn":295.17},"feels_like":{"day":304.83,"night":296.8,"eve":299.46,"morn":295.83},"pressure":1018,"humidity":61,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.08,"deg":134,"clouds":15,"rain":1.33},{"dt":1721923200,"sunrise":1721901769,"sunset":1721953545,"temp":{"day":301.71,"min":296.19,"max":301.71,"night":298,"eve":300.81,"morn":296.56},"feels_like":{"day":304.17,"night":298.45,"eve":302.95,"morn":297.1},"pressure":1017,"humidity":65,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.82,"deg":179,"clouds":97,"rain":0.1},{"dt":1722009600,"sunrise":1721988220,"sunset":1722039894,"temp":{"day":303.38,"min":297.17,"max":303.38,"night":298.19,"eve":299.02,"morn":297.17},"feels_like":{"day":307.53,"night":298.86,"eve":299.75,"morn":297.74},"pressure":1017,"humidity":65,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.82,"deg":212,"clouds":53,"rain":0.87},{"dt":1722096000,"sunrise":1722074673,"sunset":1722126242,"temp":{"day":302.35,"min":297.43,"max":302.35,"night":300.2,"eve":300.95,"morn":297.43},"feels_like":{"day":306.32,"night":302.09,"eve":304.61,"morn":298.13},"pressure":1017,"humidity":70,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":3.86,"deg":194,"clouds":88,"rain":0.35},{"dt":1722182400,"sunrise":1722161125,"sunset":1722212588,"temp":{"day":306.71,"min":297.62,"max":306.71,"night":297.62,"eve":301.16,"morn":298.26},"feels_like":{"day":310.28,"night":298.32,"eve":304.53,"morn":298.76},"pressure":1014,"humidity":49,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":3.91,"deg":225,"clouds":16,"rain":2.24},{"dt":1722268800,"sunrise":1722247578,"sunset":1722298933,"temp":{"day":306.29,"min":297.37,"max":306.29,"night":298.58,"eve":301.86,"morn":297.37},"feels_like":{"day":309.72,"night":299.32,"eve":305.09,"morn":298.07},"pressure":1015,"humidity":50,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":2.46,"deg":266,"clouds":21},{"dt":1722355200,"sunrise":1722334031,"sunset":1722385276,"temp":{"day":307.09,"min":298.21,"max":307.09,"night":300.35,"eve":303.62,"morn":298.21},"feels_like":{"day":310.45,"night":302.08,"eve":306.9,"morn":298.91},"pressure":1011,"humidity":47,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":3.28,"deg":244,"clouds":24},{"dt":1722441600,"sunrise":1722420485,"sunset":1722471617,"temp":{"day":306.78,"min":297.84,"max":306.78,"night":297.84,"eve":302.04,"morn":298.85},"feels_like":{"day":310.43,"night":298.3,"eve":305.11,"morn":299.54},"pressure":1013,"humidity":49,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.92,"deg":252,"clouds":17,"rain":1.4},{"dt":1722528000,"sunrise":1722506939,"sunset":1722557958,"temp":{"day":300.17,"min":295.89,"max":300.17,"night":295.89,"eve":298.02,"morn":295.95},"feels_like":{"day":301.87,"night":296.62,"eve":298.7,"morn":296.4},"pressure":1017,"humidity":68,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":3.37,"deg":51,"clouds":78,"rain":4.87},{"dt":1722614400,"sunrise":1722593393,"sunset":1722644296,"temp":{"day":295.89,"min":295.89,"max":295.89,"night":295.89,"eve":295.89,"morn":295.89},"feels_like":{"day":296.62,"night":296.62,"eve":296.62,"morn":296.62},"pressure":1017,"humidity":92,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":1.31,"deg":79,"clouds":76,"rain":0.27}]}' + recorded_at: Thu, 04 Jul 2024 19:55:42 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/open_weather/forecast/thirty_day_forecast_spec.rb b/spec/open_weather/forecast/thirty_day_forecast_spec.rb new file mode 100644 index 0000000..7a18f4a --- /dev/null +++ b/spec/open_weather/forecast/thirty_day_forecast_spec.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'thirty day forecast' do + include_context 'API client' + + it 'mostly sunny', vcr: { cassette_name: 'forecast/thirty_day' } do + data = client.thirty_day_forecast(lat: 33.5312, lon: -111.9426) + + expect(data).to be_a OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay + expect(data.cnt).to eq 29 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list.first.tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::ThirtyDay::Forecast + expect(forecast.dt).to be_a Time + expect(forecast.sunrise).to be_a Time + expect(forecast.sunset).to be_a Time + expect(forecast.temp).to be_a OpenWeather::Models::Forecast::ThirtyDay::Temp + expect(forecast.feels_like).to be_a OpenWeather::Models::OneCall::FeelsLike + expect(forecast.pressure).to eq 1013 + expect(forecast.humidity).to eq 24 + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.speed).to eq 5.41 + expect(forecast.deg).to eq 241 + expect(forecast.clouds).to eq 78 + expect(forecast.rain).to be_nil + expect(forecast.snow).to be_nil + end + end + + it 'snowy', vcr: { cassette_name: 'forecast/thirty_day' } do + data = client.thirty_day_forecast(lat: 82.8628, lon: 135.0000) + + expect(data).to be_a OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay + expect(data.cnt).to eq 29 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list.first.tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::ThirtyDay::Forecast + expect(forecast.dt).to be_a Time + expect(forecast.sunrise).to be_a Time + expect(forecast.sunset).to be_a Time + expect(forecast.temp).to be_a OpenWeather::Models::Forecast::ThirtyDay::Temp + expect(forecast.feels_like).to be_a OpenWeather::Models::OneCall::FeelsLike + expect(forecast.pressure).to eq 1011 + expect(forecast.humidity).to eq 93 + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.speed).to eq 3.5 + expect(forecast.deg).to eq 332 + expect(forecast.clouds).to eq 15 + expect(forecast.rain).to be_nil + expect(forecast.snow).to eq 0.14 + end + end + + it 'rainy', vcr: { cassette_name: 'forecast/thirty_day' } do + data = client.thirty_day_forecast(lat: 39.00801, lon: -76.97647) + + expect(data).to be_a OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay + expect(data.cnt).to eq 30 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list.first.tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::ThirtyDay::Forecast + expect(forecast.dt).to be_a Time + expect(forecast.sunrise).to be_a Time + expect(forecast.sunset).to be_a Time + expect(forecast.temp).to be_a OpenWeather::Models::Forecast::ThirtyDay::Temp + expect(forecast.feels_like).to be_a OpenWeather::Models::OneCall::FeelsLike + expect(forecast.pressure).to eq 1012 + expect(forecast.humidity).to eq 48 + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.speed).to eq 4.88 + expect(forecast.deg).to eq 196 + expect(forecast.clouds).to eq 61 + expect(forecast.rain).to eq 0.51 + expect(forecast.snow).to be_nil + end + end +end From ad9e2f561461d2e0842788504e357d7af963c152 Mon Sep 17 00:00:00 2001 From: Troy Anderson Date: Thu, 4 Jul 2024 12:02:54 -0700 Subject: [PATCH 2/6] Added additional VCR responses from openweather that includes all data types - i.e. rain and snow --- CHANGELOG.md | 1 + .../fixtures/open_weather/forecast/hourly.yml | 421 +++++++++++++++++- spec/open_weather/forecast/hourly_spec.rb | 62 ++- 3 files changed, 472 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d9a85..91980fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### 0.5.1 (Next) +* [#41](https://github.com/dblock/open-weather-ruby-client/pull/41): Added additional tests for hourly forecast that include all data types - i.e. rain and snow - [@troya2](https://github.com/troya2). * Your contribution here. ### 0.5.0 (2024/07/03) diff --git a/spec/fixtures/open_weather/forecast/hourly.yml b/spec/fixtures/open_weather/forecast/hourly.yml index 4ef759e..a9aa74f 100644 --- a/spec/fixtures/open_weather/forecast/hourly.yml +++ b/spec/fixtures/open_weather/forecast/hourly.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://pro.openweathermap.org/data/2.5/forecast/hourly?appid=api-key&lat=33.5312&lon=-111.9426 + uri: https://pro.openweathermap.org/data/2.5/forecast/hourly?appid=api-key&lat=82.8628&lon=135.0 body: encoding: US-ASCII string: '' @@ -23,15 +23,15 @@ http_interactions: Server: - openresty Date: - - Tue, 02 Jul 2024 20:52:29 GMT + - Thu, 04 Jul 2024 18:35:22 GMT Content-Type: - application/json; charset=utf-8 Content-Length: - - '1845' + - '38505' Connection: - keep-alive X-Cache-Key: - - "/data/2.5/forecast/hourly?lat=33.53&lon=-111.94" + - "/data/2.5/forecast/hourly?lat=82.86&lon=135" Access-Control-Allow-Origin: - "*" Access-Control-Allow-Credentials: @@ -40,6 +40,415 @@ http_interactions: - GET, POST body: encoding: UTF-8 - string: '{"city":{"coord":{"lat":44.34,"lon":10.99},"country":"IT","id":3163858,"name":"Zocca","population":4593,"sunrise":1661834187,"sunset":1661882248,"timezone":7200},"cnt":96,"cod":"200","list":[{"clouds":{"all":97},"dt":1661875200,"dt_txt":"2022-08-30 16:00:00","main":{"feels_like":296.02,"grnd_level":933,"humidity":50,"pressure":1015,"sea_level":1015,"temp":296.34,"temp_kf":-1.9,"temp_max":298.24,"temp_min":296.34},"pop":0.32,"rain":{"1h":0.13},"sys":{"pod":"d"},"visibility":10000,"weather":[{"description":"light rain","icon":"10d","id":500,"main":"Rain"}],"wind":{"deg":66,"gust":2.16,"speed":1.06}},{"clouds":{"all":95},"dt":1661878800,"dt_txt":"2022-08-30 17:00:00","main":{"feels_like":296.07,"grnd_level":932,"humidity":53,"pressure":1015,"sea_level":1015,"temp":296.31,"temp_kf":0.11,"temp_max":296.31,"temp_min":296.2},"pop":0.4,"rain":{"1h":0.24},"sys":{"pod":"d"},"visibility":10000,"weather":[{"description":"light rain","icon":"10d","id":500,"main":"Rain"}],"wind":{"deg":103,"gust":3.52,"speed":1.58}},{"clouds":{"all":93},"dt":1661882400,"dt_txt":"2022-08-30 18:00:00","main":{"feels_like":294.74,"grnd_level":931,"humidity":60,"pressure":1015,"sea_level":1015,"temp":294.94,"temp_kf":2.1,"temp_max":294.94,"temp_min":292.84},"pop":0.33,"rain":{"1h":0.2},"sys":{"pod":"n"},"visibility":10000,"weather":[{"description":"light rain","icon":"10n","id":500,"main":"Rain"}],"wind":{"deg":157,"gust":3.39,"speed":1.97}},{"clouds":{"all":100},"dt":1662217200,"dt_txt":"2022-09-03 15:00:00","main":{"feels_like":293.99,"grnd_level":931,"humidity":65,"pressure":1014,"sea_level":1014,"temp":294.14,"temp_kf":0,"temp_max":294.14,"temp_min":294.14},"pop":0.53,"sys":{"pod":"d"},"visibility":10000,"weather":[{"description":"overcast clouds","icon":"04d","id":804,"main":"Clouds"}],"wind":{"deg":104,"gust":1.92,"speed":0.91}}],"message":0}' - recorded_at: Tue, 02 Jul 2024 20:52:29 GMT + string: '{"cod":"200","message":0,"cnt":96,"list":[{"dt":1720119600,"main":{"temp":273.47,"feels_like":271.03,"temp_min":273.47,"temp_max":273.47,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":56},"wind":{"speed":2.03,"deg":54,"gust":2.52},"visibility":2686,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 19:00:00"},{"dt":1720123200,"main":{"temp":273.42,"feels_like":270.74,"temp_min":273.22,"temp_max":273.42,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":99,"temp_kf":0.2},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":59},"wind":{"speed":2.23,"deg":67,"gust":2.56},"visibility":551,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 20:00:00"},{"dt":1720126800,"main":{"temp":273.32,"feels_like":270.38,"temp_min":273.09,"temp_max":273.32,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0.23},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":66},"wind":{"speed":2.45,"deg":78,"gust":2.84},"visibility":262,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 21:00:00"},{"dt":1720130400,"main":{"temp":273.19,"feels_like":270.77,"temp_min":273.01,"temp_max":273.19,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0.18},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":73},"wind":{"speed":1.98,"deg":81,"gust":2.17},"visibility":356,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 22:00:00"},{"dt":1720134000,"main":{"temp":273.14,"feels_like":270.75,"temp_min":273.06,"temp_max":273.14,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0.08},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":82},"wind":{"speed":1.95,"deg":90,"gust":2.13},"visibility":2166,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 23:00:00"},{"dt":1720137600,"main":{"temp":273.28,"feels_like":270.95,"temp_min":273.28,"temp_max":273.28,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":90},"wind":{"speed":1.92,"deg":99,"gust":2.12},"visibility":1841,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 00:00:00"},{"dt":1720141200,"main":{"temp":273.39,"feels_like":271.15,"temp_min":273.39,"temp_max":273.39,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.86,"deg":105,"gust":1.97},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 01:00:00"},{"dt":1720144800,"main":{"temp":273.32,"feels_like":270.94,"temp_min":273.32,"temp_max":273.32,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.96,"deg":115,"gust":2.15},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 02:00:00"},{"dt":1720148400,"main":{"temp":273.42,"feels_like":271.25,"temp_min":273.42,"temp_max":273.42,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.81,"deg":124,"gust":1.97},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 03:00:00"},{"dt":1720152000,"main":{"temp":273.46,"feels_like":271.63,"temp_min":273.46,"temp_max":273.46,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.58,"deg":134,"gust":1.6},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 04:00:00"},{"dt":1720155600,"main":{"temp":273.48,"feels_like":270.97,"temp_min":273.48,"temp_max":273.48,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.09,"deg":123,"gust":2.22},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 05:00:00"},{"dt":1720159200,"main":{"temp":273.31,"feels_like":270.32,"temp_min":273.31,"temp_max":273.31,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.5,"deg":125,"gust":2.9},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 06:00:00"},{"dt":1720162800,"main":{"temp":273.43,"feels_like":270.64,"temp_min":273.43,"temp_max":273.43,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.33,"deg":142,"gust":2.61},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 07:00:00"},{"dt":1720166400,"main":{"temp":273.43,"feels_like":270.4,"temp_min":273.43,"temp_max":273.43,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.56,"deg":148,"gust":2.87},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 08:00:00"},{"dt":1720170000,"main":{"temp":273.32,"feels_like":270.02,"temp_min":273.32,"temp_max":273.32,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.82,"deg":152,"gust":3.21},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 09:00:00"},{"dt":1720173600,"main":{"temp":273.37,"feels_like":270.1,"temp_min":273.37,"temp_max":273.37,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.79,"deg":154,"gust":3.4},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 10:00:00"},{"dt":1720177200,"main":{"temp":273.52,"feels_like":270.04,"temp_min":273.52,"temp_max":273.52,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.06,"deg":155,"gust":3.64},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 11:00:00"},{"dt":1720180800,"main":{"temp":273.48,"feels_like":269.8,"temp_min":273.48,"temp_max":273.48,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.29,"deg":162,"gust":3.95},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 12:00:00"},{"dt":1720184400,"main":{"temp":273.47,"feels_like":269.85,"temp_min":273.47,"temp_max":273.47,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.22,"deg":173,"gust":3.72},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 13:00:00"},{"dt":1720188000,"main":{"temp":273.46,"feels_like":270.04,"temp_min":273.46,"temp_max":273.46,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.98,"deg":174,"gust":3.56},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 14:00:00"},{"dt":1720191600,"main":{"temp":273.5,"feels_like":269.86,"temp_min":273.5,"temp_max":273.5,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.25,"deg":178,"gust":3.75},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 15:00:00"},{"dt":1720195200,"main":{"temp":273.42,"feels_like":270.02,"temp_min":273.42,"temp_max":273.42,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.95,"deg":172,"gust":3.88},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 16:00:00"},{"dt":1720198800,"main":{"temp":273.55,"feels_like":269.96,"temp_min":273.55,"temp_max":273.55,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.2,"deg":174,"gust":4.15},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 17:00:00"},{"dt":1720202400,"main":{"temp":273.53,"feels_like":269.73,"temp_min":273.53,"temp_max":273.53,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.46,"deg":179,"gust":4.46},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 18:00:00"},{"dt":1720206000,"main":{"temp":273.63,"feels_like":269.86,"temp_min":273.63,"temp_max":273.63,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.45,"deg":181,"gust":4.45},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 19:00:00"},{"dt":1720209600,"main":{"temp":273.61,"feels_like":269.81,"temp_min":273.61,"temp_max":273.61,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.48,"deg":186,"gust":4.58},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 20:00:00"},{"dt":1720213200,"main":{"temp":273.61,"feels_like":269.89,"temp_min":273.61,"temp_max":273.61,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.37,"deg":192,"gust":4.36},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 21:00:00"},{"dt":1720216800,"main":{"temp":273.73,"feels_like":269.95,"temp_min":273.73,"temp_max":273.73,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.48,"deg":195,"gust":4.38},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 22:00:00"},{"dt":1720220400,"main":{"temp":273.78,"feels_like":269.95,"temp_min":273.78,"temp_max":273.78,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.57,"deg":193,"gust":4.55},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 23:00:00"},{"dt":1720224000,"main":{"temp":273.8,"feels_like":269.83,"temp_min":273.8,"temp_max":273.8,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.76,"deg":201,"gust":4.41},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 00:00:00"},{"dt":1720227600,"main":{"temp":273.64,"feels_like":269.67,"temp_min":273.64,"temp_max":273.64,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.71,"deg":199,"gust":4.88},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 01:00:00"},{"dt":1720231200,"main":{"temp":273.6,"feels_like":269.6,"temp_min":273.6,"temp_max":273.6,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.74,"deg":201,"gust":5.1},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 02:00:00"},{"dt":1720234800,"main":{"temp":273.67,"feels_like":269.57,"temp_min":273.67,"temp_max":273.67,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.9,"deg":205,"gust":5.11},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 03:00:00"},{"dt":1720238400,"main":{"temp":273.73,"feels_like":269.47,"temp_min":273.73,"temp_max":273.73,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.17,"deg":212,"gust":5.08},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 04:00:00"},{"dt":1720242000,"main":{"temp":273.67,"feels_like":269.44,"temp_min":273.67,"temp_max":273.67,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.1,"deg":220,"gust":4.95},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 05:00:00"},{"dt":1720245600,"main":{"temp":273.65,"feels_like":269.61,"temp_min":273.65,"temp_max":273.65,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.82,"deg":224,"gust":4.7},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 06:00:00"},{"dt":1720249200,"main":{"temp":273.6,"feels_like":269.58,"temp_min":273.6,"temp_max":273.6,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.77,"deg":228,"gust":4.44},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 07:00:00"},{"dt":1720252800,"main":{"temp":273.52,"feels_like":269.63,"temp_min":273.52,"temp_max":273.52,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.57,"deg":225,"gust":4.84},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 08:00:00"},{"dt":1720256400,"main":{"temp":273.47,"feels_like":269.47,"temp_min":273.47,"temp_max":273.47,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.71,"deg":232,"gust":5.18},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 09:00:00"},{"dt":1720260000,"main":{"temp":273.68,"feels_like":269.77,"temp_min":273.68,"temp_max":273.68,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.64,"deg":230,"gust":5.13},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 10:00:00"},{"dt":1720263600,"main":{"temp":273.65,"feels_like":269.17,"temp_min":273.65,"temp_max":273.65,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":90,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.48,"deg":243,"gust":5.24},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 11:00:00"},{"dt":1720267200,"main":{"temp":273.48,"feels_like":269.75,"temp_min":273.48,"temp_max":273.48,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.36,"deg":236,"gust":5.04},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 12:00:00"},{"dt":1720270800,"main":{"temp":273.6,"feels_like":269.65,"temp_min":273.6,"temp_max":273.6,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.67,"deg":243,"gust":5.56},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 13:00:00"},{"dt":1720274400,"main":{"temp":273.66,"feels_like":270.01,"temp_min":273.66,"temp_max":273.66,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.3,"deg":235,"gust":5.09},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 14:00:00"},{"dt":1720278000,"main":{"temp":273.69,"feels_like":269.87,"temp_min":273.69,"temp_max":273.69,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.53,"deg":235,"gust":5.66},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 15:00:00"},{"dt":1720281600,"main":{"temp":273.71,"feels_like":269.69,"temp_min":273.71,"temp_max":273.71,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.8,"deg":234,"gust":5.8},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 16:00:00"},{"dt":1720285200,"main":{"temp":273.8,"feels_like":269.66,"temp_min":273.8,"temp_max":273.8,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4,"deg":239,"gust":6.53},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 17:00:00"},{"dt":1720288800,"main":{"temp":273.77,"feels_like":269.55,"temp_min":273.77,"temp_max":273.77,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.12,"deg":237,"gust":6.83},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 18:00:00"},{"dt":1720292400,"main":{"temp":273.9,"feels_like":269.63,"temp_min":273.9,"temp_max":273.9,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.24,"deg":240,"gust":7.21},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 19:00:00"},{"dt":1720296000,"main":{"temp":273.85,"feels_like":269.54,"temp_min":273.85,"temp_max":273.85,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.29,"deg":244,"gust":7.8},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 20:00:00"},{"dt":1720299600,"main":{"temp":273.82,"feels_like":269.38,"temp_min":273.82,"temp_max":273.82,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.48,"deg":251,"gust":8.31},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 21:00:00"},{"dt":1720303200,"main":{"temp":273.78,"feels_like":269.28,"temp_min":273.78,"temp_max":273.78,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.56,"deg":252,"gust":7.98},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 22:00:00"},{"dt":1720306800,"main":{"temp":273.78,"feels_like":269.3,"temp_min":273.78,"temp_max":273.78,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.53,"deg":255,"gust":7.72},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 23:00:00"},{"dt":1720310400,"main":{"temp":273.78,"feels_like":269.21,"temp_min":273.78,"temp_max":273.78,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.68,"deg":262,"gust":8.05},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 00:00:00"},{"dt":1720314000,"main":{"temp":273.72,"feels_like":269.19,"temp_min":273.72,"temp_max":273.72,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.59,"deg":256,"gust":7.68},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 01:00:00"},{"dt":1720317600,"main":{"temp":273.7,"feels_like":269.13,"temp_min":273.7,"temp_max":273.7,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.64,"deg":257,"gust":7.97},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 02:00:00"},{"dt":1720321200,"main":{"temp":273.67,"feels_like":268.96,"temp_min":273.67,"temp_max":273.67,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.87,"deg":251,"gust":8.16},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 03:00:00"},{"dt":1720324800,"main":{"temp":273.59,"feels_like":268.75,"temp_min":273.59,"temp_max":273.59,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.06,"deg":254,"gust":8.74},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 04:00:00"},{"dt":1720328400,"main":{"temp":273.59,"feels_like":268.78,"temp_min":273.59,"temp_max":273.59,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5,"deg":253,"gust":8.87},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 05:00:00"},{"dt":1720332000,"main":{"temp":273.53,"feels_like":268.46,"temp_min":273.53,"temp_max":273.53,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.46,"deg":248,"gust":9.46},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 06:00:00"},{"dt":1720335600,"main":{"temp":273.6,"feels_like":268.52,"temp_min":273.6,"temp_max":273.6,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.5,"deg":250,"gust":9.45},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 07:00:00"},{"dt":1720339200,"main":{"temp":273.61,"feels_like":268.35,"temp_min":273.61,"temp_max":273.61,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.86,"deg":250,"gust":9.99},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 08:00:00"},{"dt":1720342800,"main":{"temp":273.49,"feels_like":268.1,"temp_min":273.49,"temp_max":273.49,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":6.06,"deg":241,"gust":9.99},"visibility":10000,"pop":0.49,"rain":{"1h":0.24},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 09:00:00"},{"dt":1720346400,"main":{"temp":273.46,"feels_like":267.65,"temp_min":273.46,"temp_max":273.46,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":6.97,"deg":236,"gust":11.81},"visibility":10000,"pop":0.49,"rain":{"1h":0.28},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 10:00:00"},{"dt":1720350000,"main":{"temp":273.66,"feels_like":267.57,"temp_min":273.66,"temp_max":273.66,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":97,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":7.79,"deg":239,"gust":13.57},"visibility":10000,"pop":0.69,"rain":{"1h":0.34},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 11:00:00"},{"dt":1720353600,"main":{"temp":273.89,"feels_like":267.61,"temp_min":273.89,"temp_max":273.89,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":96,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":8.49,"deg":243,"gust":14.84},"visibility":10000,"pop":0.77,"rain":{"1h":0.61},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 12:00:00"},{"dt":1720357200,"main":{"temp":274.04,"feels_like":267.57,"temp_min":274.04,"temp_max":274.04,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":95,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":9.17,"deg":246,"gust":16.1},"visibility":10000,"pop":0.77,"rain":{"1h":0.27},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 13:00:00"},{"dt":1720360800,"main":{"temp":274.29,"feels_like":268.05,"temp_min":274.29,"temp_max":274.29,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":94,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":8.71,"deg":252,"gust":16.02},"visibility":10000,"pop":0.81,"rain":{"1h":0.43},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 14:00:00"},{"dt":1720364400,"main":{"temp":274.46,"feels_like":268.29,"temp_min":274.46,"temp_max":274.46,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.66,"deg":256,"gust":16.49},"visibility":10000,"pop":0.85,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 15:00:00"},{"dt":1720368000,"main":{"temp":274.59,"feels_like":268.27,"temp_min":274.59,"temp_max":274.59,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":9.21,"deg":256,"gust":16.69},"visibility":10000,"pop":0.77,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 16:00:00"},{"dt":1720371600,"main":{"temp":274.78,"feels_like":268.51,"temp_min":274.78,"temp_max":274.78,"pressure":1014,"sea_level":1014,"grnd_level":1014,"humidity":89,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":9.27,"deg":261,"gust":16.7},"visibility":10000,"pop":0.69,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 17:00:00"},{"dt":1720375200,"main":{"temp":274.93,"feels_like":268.89,"temp_min":274.93,"temp_max":274.93,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":88,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.71,"deg":269,"gust":16.85},"visibility":10000,"pop":0.61,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 18:00:00"},{"dt":1720378800,"main":{"temp":275.04,"feels_like":269.14,"temp_min":275.04,"temp_max":275.04,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":87,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.41,"deg":274,"gust":15.77},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 19:00:00"},{"dt":1720382400,"main":{"temp":274.99,"feels_like":269.19,"temp_min":274.99,"temp_max":274.99,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":87,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.06,"deg":277,"gust":15.02},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 20:00:00"},{"dt":1720386000,"main":{"temp":274.72,"feels_like":269.08,"temp_min":274.72,"temp_max":274.72,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":88,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":7.44,"deg":279,"gust":14.29},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 21:00:00"},{"dt":1720389600,"main":{"temp":274.58,"feels_like":269.05,"temp_min":274.58,"temp_max":274.58,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":90,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":7.05,"deg":278,"gust":12.57},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 22:00:00"},{"dt":1720393200,"main":{"temp":274.47,"feels_like":269.06,"temp_min":274.47,"temp_max":274.47,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.69,"deg":278,"gust":12.09},"visibility":10000,"pop":0.05,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 23:00:00"},{"dt":1720396800,"main":{"temp":274.37,"feels_like":269.05,"temp_min":274.37,"temp_max":274.37,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.43,"deg":277,"gust":11.65},"visibility":10000,"pop":0.04,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 00:00:00"},{"dt":1720400400,"main":{"temp":274.26,"feels_like":269.14,"temp_min":274.26,"temp_max":274.26,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.94,"deg":283,"gust":10.92},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 01:00:00"},{"dt":1720404000,"main":{"temp":274.12,"feels_like":269.2,"temp_min":274.12,"temp_max":274.12,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.45,"deg":289,"gust":9.82},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 02:00:00"},{"dt":1720407600,"main":{"temp":273.96,"feels_like":269.16,"temp_min":273.96,"temp_max":273.96,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.16,"deg":289,"gust":8.77},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 03:00:00"},{"dt":1720411200,"main":{"temp":273.91,"feels_like":269.29,"temp_min":273.91,"temp_max":273.91,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.82,"deg":290,"gust":7.99},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 04:00:00"},{"dt":1720414800,"main":{"temp":273.85,"feels_like":269.43,"temp_min":273.85,"temp_max":273.85,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.45,"deg":291,"gust":7.49},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 05:00:00"},{"dt":1720418400,"main":{"temp":273.73,"feels_like":269.5,"temp_min":273.73,"temp_max":273.73,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":4.11,"deg":294,"gust":6.91},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 06:00:00"},{"dt":1720422000,"main":{"temp":273.7,"feels_like":269.63,"temp_min":273.7,"temp_max":273.7,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":91},"wind":{"speed":3.87,"deg":289,"gust":6.13},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 07:00:00"},{"dt":1720425600,"main":{"temp":273.59,"feels_like":269.54,"temp_min":273.59,"temp_max":273.59,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":96},"wind":{"speed":3.81,"deg":286,"gust":5.82},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 08:00:00"},{"dt":1720429200,"main":{"temp":273.54,"feels_like":269.39,"temp_min":273.54,"temp_max":273.54,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":97},"wind":{"speed":3.93,"deg":286,"gust":5.53},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 09:00:00"},{"dt":1720432800,"main":{"temp":273.52,"feels_like":269.4,"temp_min":273.52,"temp_max":273.52,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":3.89,"deg":285,"gust":5.42},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 10:00:00"},{"dt":1720436400,"main":{"temp":273.45,"feels_like":269.5,"temp_min":273.45,"temp_max":273.45,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":3.63,"deg":283,"gust":5.29},"visibility":9702,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 11:00:00"},{"dt":1720440000,"main":{"temp":273.42,"feels_like":269.56,"temp_min":273.42,"temp_max":273.42,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":3.5,"deg":277,"gust":5.4},"visibility":921,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 12:00:00"},{"dt":1720443600,"main":{"temp":273.4,"feels_like":269.93,"temp_min":273.4,"temp_max":273.4,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.02,"deg":274,"gust":4.67},"visibility":378,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 13:00:00"},{"dt":1720447200,"main":{"temp":273.32,"feels_like":269.79,"temp_min":273.32,"temp_max":273.32,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.07,"deg":271,"gust":4.13},"visibility":6499,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 14:00:00"},{"dt":1720450800,"main":{"temp":273.32,"feels_like":269.87,"temp_min":273.32,"temp_max":273.32,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.98,"deg":255,"gust":4.05},"visibility":414,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 15:00:00"},{"dt":1720454400,"main":{"temp":273.39,"feels_like":269.68,"temp_min":273.39,"temp_max":273.39,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.3,"deg":247,"gust":4.58},"visibility":225,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 16:00:00"},{"dt":1720458000,"main":{"temp":273.32,"feels_like":269.72,"temp_min":273.32,"temp_max":273.32,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.16,"deg":242,"gust":4.61},"visibility":136,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 17:00:00"},{"dt":1720461600,"main":{"temp":273.28,"feels_like":269.49,"temp_min":273.28,"temp_max":273.28,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":99,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.38,"deg":243,"gust":4.63},"visibility":439,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 18:00:00"}],"city":{"id":0,"name":"","coord":{"lat":82.8628,"lon":135},"country":"","population":0,"timezone":32400,"sunrise":0,"sunset":0}}' + recorded_at: Thu, 04 Jul 2024 18:35:22 GMT +- request: + method: get + uri: https://pro.openweathermap.org/data/2.5/forecast/hourly?appid=api-key&lat=-70.8696&lon=-75.11441 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json; charset=utf-8 + Content-Type: + - application/json + User-Agent: + - OpenWeather Ruby Client/0.5.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - openresty + Date: + - Thu, 04 Jul 2024 18:52:05 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '38448' + Connection: + - keep-alive + X-Cache-Key: + - "/data/2.5/forecast/hourly?lat=-70.87&lon=-75.11" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: '{"cod":"200","message":0,"cnt":96,"list":[{"dt":1720119600,"main":{"temp":265.96,"feels_like":258.96,"temp_min":265.96,"temp_max":265.96,"pressure":1000,"sea_level":1000,"grnd_level":951,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":15.75,"deg":340,"gust":23.86},"visibility":111,"pop":1,"snow":{"1h":1.3},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 19:00:00"},{"dt":1720123200,"main":{"temp":266.07,"feels_like":259.07,"temp_min":266.07,"temp_max":266.52,"pressure":1000,"sea_level":1000,"grnd_level":950,"humidity":95,"temp_kf":-0.45},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":15.03,"deg":339,"gust":23.02},"visibility":105,"pop":1,"snow":{"1h":1.28},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 20:00:00"},{"dt":1720126800,"main":{"temp":266.62,"feels_like":259.62,"temp_min":266.62,"temp_max":267.6,"pressure":1000,"sea_level":1000,"grnd_level":950,"humidity":95,"temp_kf":-0.98},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":14.27,"deg":335,"gust":21.47},"visibility":107,"pop":0.98,"snow":{"1h":1.47},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 21:00:00"},{"dt":1720130400,"main":{"temp":267.24,"feels_like":260.24,"temp_min":267.24,"temp_max":268.1,"pressure":999,"sea_level":999,"grnd_level":950,"humidity":95,"temp_kf":-0.86},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":13.65,"deg":330,"gust":20.36},"visibility":117,"pop":0.98,"snow":{"1h":1.41},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 22:00:00"},{"dt":1720134000,"main":{"temp":267.82,"feels_like":260.82,"temp_min":267.82,"temp_max":268.28,"pressure":999,"sea_level":999,"grnd_level":950,"humidity":95,"temp_kf":-0.46},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":12.8,"deg":329,"gust":19.36},"visibility":124,"pop":0.98,"snow":{"1h":1.32},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 23:00:00"},{"dt":1720137600,"main":{"temp":268.42,"feels_like":261.42,"temp_min":268.42,"temp_max":268.42,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":95,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":12.09,"deg":326,"gust":18.35},"visibility":131,"pop":0.98,"snow":{"1h":1.3},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 00:00:00"},{"dt":1720141200,"main":{"temp":268.44,"feels_like":261.44,"temp_min":268.44,"temp_max":268.44,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":95,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.3,"deg":324,"gust":17.19},"visibility":154,"pop":1,"snow":{"1h":1.2},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 01:00:00"},{"dt":1720144800,"main":{"temp":268.49,"feels_like":261.49,"temp_min":268.49,"temp_max":268.49,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":96,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":10.13,"deg":320,"gust":15.74},"visibility":151,"pop":1,"snow":{"1h":1.06},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 02:00:00"},{"dt":1720148400,"main":{"temp":268.33,"feels_like":261.33,"temp_min":268.33,"temp_max":268.33,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":97,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":7.82,"deg":309,"gust":12.62},"visibility":95,"pop":1,"snow":{"1h":1.09},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 03:00:00"},{"dt":1720152000,"main":{"temp":267.82,"feels_like":262.03,"temp_min":267.82,"temp_max":267.82,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":97,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":4.36,"deg":288,"gust":8.02},"visibility":95,"pop":1,"snow":{"1h":0.94},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 04:00:00"},{"dt":1720155600,"main":{"temp":267.15,"feels_like":262.73,"temp_min":267.15,"temp_max":267.15,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":97,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":2.74,"deg":245,"gust":4.44},"visibility":160,"pop":1,"snow":{"1h":0.57},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 05:00:00"},{"dt":1720159200,"main":{"temp":266.61,"feels_like":261.43,"temp_min":266.61,"temp_max":266.61,"pressure":999,"sea_level":999,"grnd_level":950,"humidity":96,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.35,"deg":224,"gust":5.15},"visibility":307,"pop":1,"snow":{"1h":0.25},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 06:00:00"},{"dt":1720162800,"main":{"temp":266.05,"feels_like":261.07,"temp_min":266.05,"temp_max":266.05,"pressure":1000,"sea_level":1000,"grnd_level":950,"humidity":96,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.05,"deg":216,"gust":4.4},"visibility":472,"pop":0.75,"snow":{"1h":0.19},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 07:00:00"},{"dt":1720166400,"main":{"temp":265.26,"feels_like":260.54,"temp_min":265.26,"temp_max":265.26,"pressure":1000,"sea_level":1000,"grnd_level":951,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.69,"deg":207,"gust":3.29},"visibility":8256,"pop":0.67,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 08:00:00"},{"dt":1720170000,"main":{"temp":262.92,"feels_like":257.83,"temp_min":262.92,"temp_max":262.92,"pressure":1001,"sea_level":1001,"grnd_level":951,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.63,"deg":198,"gust":2.79},"visibility":8322,"pop":0.32,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 09:00:00"},{"dt":1720173600,"main":{"temp":260.99,"feels_like":255.29,"temp_min":260.99,"temp_max":260.99,"pressure":1002,"sea_level":1002,"grnd_level":951,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":92},"wind":{"speed":2.81,"deg":198,"gust":3.11},"visibility":9537,"pop":0.3,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 10:00:00"},{"dt":1720177200,"main":{"temp":260.34,"feels_like":254.12,"temp_min":260.34,"temp_max":260.34,"pressure":1003,"sea_level":1003,"grnd_level":952,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":86},"wind":{"speed":3.11,"deg":205,"gust":3.65},"visibility":10000,"pop":0.14,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 11:00:00"},{"dt":1720180800,"main":{"temp":259.42,"feels_like":252.42,"temp_min":259.42,"temp_max":259.42,"pressure":1003,"sea_level":1003,"grnd_level":952,"humidity":94,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":80},"wind":{"speed":3.72,"deg":209,"gust":4.56},"visibility":10000,"pop":0.01,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 12:00:00"},{"dt":1720184400,"main":{"temp":258.51,"feels_like":251.51,"temp_min":258.51,"temp_max":258.51,"pressure":1004,"sea_level":1004,"grnd_level":953,"humidity":90,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":10},"wind":{"speed":3.62,"deg":208,"gust":4.42},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 13:00:00"},{"dt":1720188000,"main":{"temp":258.17,"feels_like":251.17,"temp_min":258.17,"temp_max":258.17,"pressure":1005,"sea_level":1005,"grnd_level":953,"humidity":83,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":8},"wind":{"speed":3.96,"deg":210,"gust":4.97},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 14:00:00"},{"dt":1720191600,"main":{"temp":257.81,"feels_like":250.81,"temp_min":257.81,"temp_max":257.81,"pressure":1005,"sea_level":1005,"grnd_level":954,"humidity":78,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":6},"wind":{"speed":3.62,"deg":210,"gust":4.23},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 15:00:00"},{"dt":1720195200,"main":{"temp":257.7,"feels_like":250.7,"temp_min":257.7,"temp_max":257.7,"pressure":1005,"sea_level":1005,"grnd_level":954,"humidity":74,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":5},"wind":{"speed":3.85,"deg":211,"gust":4.29},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 16:00:00"},{"dt":1720198800,"main":{"temp":257.5,"feels_like":250.5,"temp_min":257.5,"temp_max":257.5,"pressure":1006,"sea_level":1006,"grnd_level":954,"humidity":73,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":4},"wind":{"speed":3.93,"deg":212,"gust":4.56},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 17:00:00"},{"dt":1720202400,"main":{"temp":257.2,"feels_like":250.2,"temp_min":257.2,"temp_max":257.2,"pressure":1007,"sea_level":1007,"grnd_level":955,"humidity":72,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":9},"wind":{"speed":3.82,"deg":213,"gust":4.35},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 18:00:00"},{"dt":1720206000,"main":{"temp":257.11,"feels_like":250.11,"temp_min":257.11,"temp_max":257.11,"pressure":1007,"sea_level":1007,"grnd_level":955,"humidity":72,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"clouds":{"all":37},"wind":{"speed":3.76,"deg":218,"gust":4.25},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 19:00:00"},{"dt":1720209600,"main":{"temp":256.94,"feels_like":249.94,"temp_min":256.94,"temp_max":256.94,"pressure":1008,"sea_level":1008,"grnd_level":956,"humidity":77,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"clouds":{"all":38},"wind":{"speed":3.52,"deg":220,"gust":4},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 20:00:00"},{"dt":1720213200,"main":{"temp":256.83,"feels_like":250.1,"temp_min":256.83,"temp_max":256.83,"pressure":1008,"sea_level":1008,"grnd_level":956,"humidity":84,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":59},"wind":{"speed":2.96,"deg":235,"gust":3.38},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 21:00:00"},{"dt":1720216800,"main":{"temp":256.93,"feels_like":250.95,"temp_min":256.93,"temp_max":256.93,"pressure":1008,"sea_level":1008,"grnd_level":957,"humidity":90,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":69},"wind":{"speed":2.48,"deg":248,"gust":2.87},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 22:00:00"},{"dt":1720220400,"main":{"temp":256.15,"feels_like":251.48,"temp_min":256.15,"temp_max":256.15,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":93,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":75},"wind":{"speed":1.72,"deg":262,"gust":2.1},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 23:00:00"},{"dt":1720224000,"main":{"temp":255.07,"feels_like":255.07,"temp_min":255.07,"temp_max":255.07,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":95,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":78},"wind":{"speed":1.3,"deg":283,"gust":1.46},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 00:00:00"},{"dt":1720227600,"main":{"temp":254.22,"feels_like":254.22,"temp_min":254.22,"temp_max":254.22,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":94},"wind":{"speed":1.13,"deg":302,"gust":1.46},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 01:00:00"},{"dt":1720231200,"main":{"temp":255,"feels_like":250.78,"temp_min":255,"temp_max":255,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":97},"wind":{"speed":1.47,"deg":296,"gust":1.86},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 02:00:00"},{"dt":1720234800,"main":{"temp":254.31,"feels_like":249.94,"temp_min":254.31,"temp_max":254.31,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":1.49,"deg":301,"gust":2.08},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 03:00:00"},{"dt":1720238400,"main":{"temp":253.44,"feels_like":249.17,"temp_min":253.44,"temp_max":253.44,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":1.41,"deg":312,"gust":1.99},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 04:00:00"},{"dt":1720242000,"main":{"temp":253.98,"feels_like":249.98,"temp_min":253.98,"temp_max":253.98,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":1.34,"deg":326,"gust":1.94},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 05:00:00"},{"dt":1720245600,"main":{"temp":252.16,"feels_like":247.89,"temp_min":252.16,"temp_max":252.16,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":1.35,"deg":349,"gust":1.92},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 06:00:00"},{"dt":1720249200,"main":{"temp":252.79,"feels_like":247.45,"temp_min":252.79,"temp_max":252.79,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":1.79,"deg":2,"gust":2.31},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 07:00:00"},{"dt":1720252800,"main":{"temp":253.35,"feels_like":247.47,"temp_min":253.35,"temp_max":253.35,"pressure":1009,"sea_level":1009,"grnd_level":956,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.08,"deg":10,"gust":2.59},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 08:00:00"},{"dt":1720256400,"main":{"temp":254.83,"feels_like":248.13,"temp_min":254.83,"temp_max":254.83,"pressure":1008,"sea_level":1008,"grnd_level":956,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.68,"deg":14,"gust":3.17},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 09:00:00"},{"dt":1720260000,"main":{"temp":254.78,"feels_like":247.78,"temp_min":254.78,"temp_max":254.78,"pressure":1008,"sea_level":1008,"grnd_level":956,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.13,"deg":18,"gust":3.95},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 10:00:00"},{"dt":1720263600,"main":{"temp":254.58,"feels_like":247.58,"temp_min":254.58,"temp_max":254.58,"pressure":1008,"sea_level":1008,"grnd_level":955,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.43,"deg":18,"gust":4.55},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 11:00:00"},{"dt":1720267200,"main":{"temp":256.12,"feels_like":249.12,"temp_min":256.12,"temp_max":256.12,"pressure":1006,"sea_level":1006,"grnd_level":955,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4,"deg":20,"gust":6.04},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 12:00:00"},{"dt":1720270800,"main":{"temp":257.42,"feels_like":250.42,"temp_min":257.42,"temp_max":257.42,"pressure":1005,"sea_level":1005,"grnd_level":954,"humidity":89,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.42,"deg":20,"gust":8.36},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 13:00:00"},{"dt":1720274400,"main":{"temp":258.27,"feels_like":251.27,"temp_min":258.27,"temp_max":258.27,"pressure":1004,"sea_level":1004,"grnd_level":953,"humidity":87,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.06,"deg":20,"gust":10.05},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 14:00:00"},{"dt":1720278000,"main":{"temp":258.96,"feels_like":251.96,"temp_min":258.96,"temp_max":258.96,"pressure":1003,"sea_level":1003,"grnd_level":952,"humidity":84,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.92,"deg":19,"gust":11.85},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 15:00:00"},{"dt":1720281600,"main":{"temp":259.01,"feels_like":252.01,"temp_min":259.01,"temp_max":259.01,"pressure":1002,"sea_level":1002,"grnd_level":951,"humidity":84,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.83,"deg":23,"gust":13.22},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 16:00:00"},{"dt":1720285200,"main":{"temp":258.51,"feels_like":251.51,"temp_min":258.51,"temp_max":258.51,"pressure":1001,"sea_level":1001,"grnd_level":949,"humidity":85,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":7.43,"deg":26,"gust":14.6},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 17:00:00"},{"dt":1720288800,"main":{"temp":258.95,"feels_like":251.95,"temp_min":258.95,"temp_max":258.95,"pressure":999,"sea_level":999,"grnd_level":948,"humidity":84,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.99,"deg":21,"gust":16.88},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 18:00:00"},{"dt":1720292400,"main":{"temp":259.42,"feels_like":252.42,"temp_min":259.42,"temp_max":259.42,"pressure":997,"sea_level":997,"grnd_level":946,"humidity":85,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":10.44,"deg":14,"gust":18.54},"visibility":10000,"pop":0.16,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 19:00:00"},{"dt":1720296000,"main":{"temp":259.96,"feels_like":252.96,"temp_min":259.96,"temp_max":259.96,"pressure":995,"sea_level":995,"grnd_level":944,"humidity":94,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.71,"deg":16,"gust":20.52},"visibility":170,"pop":0.43,"snow":{"1h":0.31},"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 20:00:00"},{"dt":1720299600,"main":{"temp":260.49,"feels_like":253.49,"temp_min":260.49,"temp_max":260.49,"pressure":993,"sea_level":993,"grnd_level":943,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":12.32,"deg":12,"gust":20.23},"visibility":161,"pop":0.72,"snow":{"1h":0.9},"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 21:00:00"},{"dt":1720303200,"main":{"temp":261.14,"feels_like":254.14,"temp_min":261.14,"temp_max":261.14,"pressure":991,"sea_level":991,"grnd_level":941,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.83,"deg":12,"gust":20.41},"visibility":150,"pop":0.75,"snow":{"1h":1.21},"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 22:00:00"},{"dt":1720306800,"main":{"temp":262.15,"feels_like":255.15,"temp_min":262.15,"temp_max":262.15,"pressure":990,"sea_level":990,"grnd_level":940,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.05,"deg":3,"gust":19.13},"visibility":139,"pop":0.85,"snow":{"1h":2.01},"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 23:00:00"},{"dt":1720310400,"main":{"temp":264.38,"feels_like":257.38,"temp_min":264.38,"temp_max":264.38,"pressure":988,"sea_level":988,"grnd_level":939,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.8,"deg":352,"gust":19.84},"visibility":110,"pop":0.95,"snow":{"1h":2.05},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 00:00:00"},{"dt":1720314000,"main":{"temp":266.18,"feels_like":259.18,"temp_min":266.18,"temp_max":266.18,"pressure":987,"sea_level":987,"grnd_level":938,"humidity":95,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":12.3,"deg":345,"gust":19.21},"visibility":115,"pop":1,"snow":{"1h":1.8},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 01:00:00"},{"dt":1720317600,"main":{"temp":267.61,"feels_like":260.61,"temp_min":267.61,"temp_max":267.61,"pressure":986,"sea_level":986,"grnd_level":937,"humidity":95,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.76,"deg":331,"gust":17.19},"visibility":127,"pop":1,"snow":{"1h":1.06},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 02:00:00"},{"dt":1720321200,"main":{"temp":266.91,"feels_like":259.91,"temp_min":266.91,"temp_max":266.91,"pressure":986,"sea_level":986,"grnd_level":937,"humidity":90,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":9.8,"deg":287,"gust":13.51},"visibility":10000,"pop":0.92,"snow":{"1h":0.29},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 03:00:00"},{"dt":1720324800,"main":{"temp":262.75,"feels_like":255.75,"temp_min":262.75,"temp_max":262.75,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":7.08,"deg":296,"gust":11.7},"visibility":2416,"pop":0.88,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 04:00:00"},{"dt":1720328400,"main":{"temp":261.69,"feels_like":254.69,"temp_min":261.69,"temp_max":261.69,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.82,"deg":293,"gust":11.73},"visibility":1741,"pop":0.81,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 05:00:00"},{"dt":1720332000,"main":{"temp":261.28,"feels_like":254.28,"temp_min":261.28,"temp_max":261.28,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.49,"deg":295,"gust":12.01},"visibility":3817,"pop":0.81,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 06:00:00"},{"dt":1720335600,"main":{"temp":260.88,"feels_like":253.88,"temp_min":260.88,"temp_max":260.88,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.86,"deg":295,"gust":10.62},"visibility":2459,"pop":0.27,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 07:00:00"},{"dt":1720339200,"main":{"temp":261.12,"feels_like":254.12,"temp_min":261.12,"temp_max":261.12,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":94,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":5.05,"deg":301,"gust":9.77},"visibility":640,"pop":0.64,"snow":{"1h":0.19},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 08:00:00"},{"dt":1720342800,"main":{"temp":261.44,"feels_like":254.44,"temp_min":261.44,"temp_max":261.44,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":4.21,"deg":311,"gust":7.7},"visibility":507,"pop":0.84,"snow":{"1h":0.19},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 09:00:00"},{"dt":1720346400,"main":{"temp":261.5,"feels_like":254.57,"temp_min":261.5,"temp_max":261.5,"pressure":986,"sea_level":986,"grnd_level":936,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.98,"deg":330,"gust":6.14},"visibility":953,"pop":0.84,"snow":{"1h":0.18},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 10:00:00"},{"dt":1720350000,"main":{"temp":261.5,"feels_like":254.6,"temp_min":261.5,"temp_max":261.5,"pressure":986,"sea_level":986,"grnd_level":936,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.95,"deg":337,"gust":5.44},"visibility":985,"pop":0.8,"snow":{"1h":0.19},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 11:00:00"},{"dt":1720353600,"main":{"temp":261.9,"feels_like":255.71,"temp_min":261.9,"temp_max":261.9,"pressure":986,"sea_level":986,"grnd_level":936,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.36,"deg":334,"gust":4.44},"visibility":354,"pop":0.84,"snow":{"1h":0.2},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 12:00:00"},{"dt":1720357200,"main":{"temp":262.27,"feels_like":256.17,"temp_min":262.27,"temp_max":262.27,"pressure":986,"sea_level":986,"grnd_level":937,"humidity":97,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.35,"deg":282,"gust":6.58},"visibility":252,"pop":0.85,"snow":{"1h":0.17},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 13:00:00"},{"dt":1720360800,"main":{"temp":259.68,"feels_like":252.68,"temp_min":259.68,"temp_max":259.68,"pressure":988,"sea_level":988,"grnd_level":938,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":9.36,"deg":245,"gust":14.26},"visibility":9564,"pop":0.54,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 14:00:00"},{"dt":1720364400,"main":{"temp":256.42,"feels_like":249.42,"temp_min":256.42,"temp_max":256.42,"pressure":990,"sea_level":990,"grnd_level":939,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":8.76,"deg":254,"gust":14.93},"visibility":10000,"pop":0.22,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 15:00:00"},{"dt":1720368000,"main":{"temp":254.75,"feels_like":247.75,"temp_min":254.75,"temp_max":254.75,"pressure":991,"sea_level":991,"grnd_level":940,"humidity":96,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":83},"wind":{"speed":8.16,"deg":258,"gust":14.23},"visibility":10000,"pop":0.12,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 16:00:00"},{"dt":1720371600,"main":{"temp":254.72,"feels_like":247.72,"temp_min":254.72,"temp_max":254.72,"pressure":992,"sea_level":992,"grnd_level":941,"humidity":97,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":77},"wind":{"speed":8.19,"deg":257,"gust":14.1},"visibility":7385,"pop":0.07,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 17:00:00"},{"dt":1720375200,"main":{"temp":254.69,"feels_like":247.69,"temp_min":254.69,"temp_max":254.69,"pressure":993,"sea_level":993,"grnd_level":942,"humidity":97,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":80},"wind":{"speed":7.59,"deg":261,"gust":12.8},"visibility":8599,"pop":0.03,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 18:00:00"},{"dt":1720378800,"main":{"temp":254.29,"feels_like":247.29,"temp_min":254.29,"temp_max":254.29,"pressure":994,"sea_level":994,"grnd_level":943,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":86},"wind":{"speed":7.34,"deg":263,"gust":12.45},"visibility":8984,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 19:00:00"},{"dt":1720382400,"main":{"temp":253.29,"feels_like":246.29,"temp_min":253.29,"temp_max":253.29,"pressure":995,"sea_level":995,"grnd_level":943,"humidity":98,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":84},"wind":{"speed":6.52,"deg":263,"gust":10.96},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 20:00:00"},{"dt":1720386000,"main":{"temp":252.28,"feels_like":245.28,"temp_min":252.28,"temp_max":252.28,"pressure":996,"sea_level":996,"grnd_level":944,"humidity":99,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":78},"wind":{"speed":5.41,"deg":262,"gust":9.49},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 21:00:00"},{"dt":1720389600,"main":{"temp":250.78,"feels_like":243.78,"temp_min":250.78,"temp_max":250.78,"pressure":998,"sea_level":998,"grnd_level":945,"humidity":100,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":76},"wind":{"speed":3.43,"deg":262,"gust":6.75},"visibility":8629,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 22:00:00"},{"dt":1720393200,"main":{"temp":249.65,"feels_like":243.37,"temp_min":249.65,"temp_max":249.65,"pressure":998,"sea_level":998,"grnd_level":946,"humidity":100,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":76},"wind":{"speed":1.98,"deg":277,"gust":4.46},"visibility":8715,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 23:00:00"},{"dt":1720396800,"main":{"temp":249.41,"feels_like":249.41,"temp_min":249.41,"temp_max":249.41,"pressure":999,"sea_level":999,"grnd_level":946,"humidity":100,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":78},"wind":{"speed":1.24,"deg":273,"gust":3.4},"visibility":4267,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 00:00:00"},{"dt":1720400400,"main":{"temp":250.18,"feels_like":250.18,"temp_min":250.18,"temp_max":250.18,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.26,"deg":301,"gust":2.66},"visibility":3232,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 01:00:00"},{"dt":1720404000,"main":{"temp":251.18,"feels_like":251.18,"temp_min":251.18,"temp_max":251.18,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.2,"deg":332,"gust":2.41},"visibility":3194,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 02:00:00"},{"dt":1720407600,"main":{"temp":251.35,"feels_like":246.08,"temp_min":251.35,"temp_max":251.35,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.67,"deg":360,"gust":2.53},"visibility":3255,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 03:00:00"},{"dt":1720411200,"main":{"temp":251.26,"feels_like":246.4,"temp_min":251.26,"temp_max":251.26,"pressure":1000,"sea_level":1000,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.51,"deg":12,"gust":2.34},"visibility":3355,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 04:00:00"},{"dt":1720414800,"main":{"temp":251.25,"feels_like":246.45,"temp_min":251.25,"temp_max":251.25,"pressure":1000,"sea_level":1000,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.49,"deg":29,"gust":2.41},"visibility":3013,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 05:00:00"},{"dt":1720418400,"main":{"temp":251.7,"feels_like":246.16,"temp_min":251.7,"temp_max":251.7,"pressure":1000,"sea_level":1000,"grnd_level":948,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.8,"deg":41,"gust":2.56},"visibility":2784,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 06:00:00"},{"dt":1720422000,"main":{"temp":252.55,"feels_like":246.39,"temp_min":252.55,"temp_max":252.55,"pressure":1000,"sea_level":1000,"grnd_level":948,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.15,"deg":47,"gust":2.77},"visibility":2070,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 07:00:00"},{"dt":1720425600,"main":{"temp":254.38,"feels_like":247.66,"temp_min":254.38,"temp_max":254.38,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":99,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.64,"deg":48,"gust":3.32},"visibility":1844,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 08:00:00"},{"dt":1720429200,"main":{"temp":256.01,"feels_like":249.13,"temp_min":256.01,"temp_max":256.01,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.95,"deg":47,"gust":3.82},"visibility":2824,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 09:00:00"},{"dt":1720432800,"main":{"temp":257.07,"feels_like":250.12,"temp_min":257.07,"temp_max":257.07,"pressure":998,"sea_level":998,"grnd_level":947,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.16,"deg":52,"gust":4.31},"visibility":3776,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 10:00:00"},{"dt":1720436400,"main":{"temp":257.67,"feels_like":250.67,"temp_min":257.67,"temp_max":257.67,"pressure":997,"sea_level":997,"grnd_level":946,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.55,"deg":56,"gust":4.92},"visibility":2414,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 11:00:00"},{"dt":1720440000,"main":{"temp":259.1,"feels_like":252.1,"temp_min":259.1,"temp_max":259.1,"pressure":996,"sea_level":996,"grnd_level":945,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.17,"deg":62,"gust":6.53},"visibility":1230,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 12:00:00"},{"dt":1720443600,"main":{"temp":259.91,"feels_like":252.91,"temp_min":259.91,"temp_max":259.91,"pressure":995,"sea_level":995,"grnd_level":944,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.55,"deg":63,"gust":8.1},"visibility":719,"pop":0.56,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 13:00:00"},{"dt":1720447200,"main":{"temp":260.48,"feels_like":253.48,"temp_min":260.48,"temp_max":260.48,"pressure":994,"sea_level":994,"grnd_level":943,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":5.36,"deg":63,"gust":9.68},"visibility":235,"pop":0.6,"snow":{"1h":0.14},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 14:00:00"},{"dt":1720450800,"main":{"temp":260.75,"feels_like":253.75,"temp_min":260.75,"temp_max":260.75,"pressure":993,"sea_level":993,"grnd_level":942,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":6.44,"deg":63,"gust":11.35},"visibility":219,"pop":0.74,"snow":{"1h":0.2},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 15:00:00"},{"dt":1720454400,"main":{"temp":260.85,"feels_like":253.85,"temp_min":260.85,"temp_max":260.85,"pressure":992,"sea_level":992,"grnd_level":941,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":7.1,"deg":60,"gust":11.8},"visibility":188,"pop":0.88,"snow":{"1h":0.22},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 16:00:00"},{"dt":1720458000,"main":{"temp":260.79,"feels_like":253.79,"temp_min":260.79,"temp_max":260.79,"pressure":991,"sea_level":991,"grnd_level":941,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":6.92,"deg":60,"gust":11.02},"visibility":176,"pop":0.91,"snow":{"1h":0.28},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 17:00:00"},{"dt":1720461600,"main":{"temp":260.91,"feels_like":253.91,"temp_min":260.91,"temp_max":260.91,"pressure":990,"sea_level":990,"grnd_level":939,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":6.96,"deg":60,"gust":11.22},"visibility":178,"pop":0.91,"snow":{"1h":0.28},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 18:00:00"}],"city":{"id":0,"name":"","coord":{"lat":-70.8696,"lon":-75.1144},"country":"","population":0,"timezone":-10800,"sunrise":0,"sunset":0}}' + recorded_at: Thu, 04 Jul 2024 18:52:05 GMT recorded_with: VCR 6.2.0 diff --git a/spec/open_weather/forecast/hourly_spec.rb b/spec/open_weather/forecast/hourly_spec.rb index ea60b63..7de9667 100644 --- a/spec/open_weather/forecast/hourly_spec.rb +++ b/spec/open_weather/forecast/hourly_spec.rb @@ -2,11 +2,11 @@ require 'spec_helper' -RSpec.describe 'hourly forecast' do +RSpec.describe 'hourly forecast without rain or snow' do include_context 'API client' - it 'hourly', vcr: { cassette_name: 'forecast/hourly' } do - data = client.hourly(lat: 33.5312, lon: -111.9426) + it 'hourly mostly sunny', vcr: { cassette_name: 'forecast/hourly' } do + data = client.hourly(lat: 82.8628, lon: 135.0000) expect(data).to be_a OpenWeather::Models::Forecast::Hourly expect(data.cnt).to eq 96 @@ -15,7 +15,32 @@ expect(data.list).to be_a Array data.list.first.tap do |forecast| expect(forecast).to be_a OpenWeather::Models::Forecast::Forecast - expect(forecast.dt).to eq Time.at(1661875200) + expect(forecast.dt).to be_a Time + expect(forecast.main).to be_a OpenWeather::Models::Main + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.clouds).to be_a OpenWeather::Models::Clouds + expect(forecast.wind).to be_a OpenWeather::Models::Wind + expect(forecast.rain).to be_nil + expect(forecast.snow).to be_nil + expect(forecast.visibility).to eq 2686 + expect(forecast.pop).to eq 0.0 + expect(forecast.sys).to be_a OpenWeather::Models::Sys + expect(forecast.dt_txt).to eq '2024-07-04 19:00:00' + end + end + + it 'hourly with rain', vcr: { cassette_name: 'forecast/hourly' } do + data = client.hourly(lat: 82.8628, lon: 135.0000) + + expect(data).to be_a OpenWeather::Models::Forecast::Hourly + expect(data.cnt).to eq 96 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list[64].tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::Forecast + expect(forecast.dt).to be_a Time expect(forecast.main).to be_a OpenWeather::Models::Main expect(forecast.weather).to be_a Array expect(forecast.weather.first).to be_a OpenWeather::Models::Weather @@ -24,9 +49,34 @@ expect(forecast.rain).to be_a OpenWeather::Models::Rain expect(forecast.snow).to be_nil expect(forecast.visibility).to eq 10000 - expect(forecast.pop).to eq 0.32 + expect(forecast.pop).to eq 0.69 + expect(forecast.sys).to be_a OpenWeather::Models::Sys + expect(forecast.dt_txt).to eq '2024-07-07 11:00:00' + end + end + + it 'hourly with snow', vcr: { cassette_name: 'forecast/hourly' } do + data = client.hourly(lat: -70.86960, lon: -75.11441) + + expect(data).to be_a OpenWeather::Models::Forecast::Hourly + expect(data.cnt).to eq 96 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list[1].tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::Forecast + expect(forecast.dt).to be_a Time + expect(forecast.main).to be_a OpenWeather::Models::Main + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.clouds).to be_a OpenWeather::Models::Clouds + expect(forecast.wind).to be_a OpenWeather::Models::Wind + expect(forecast.rain).to be_nil + expect(forecast.snow).to be_a OpenWeather::Models::Snow + expect(forecast.visibility).to eq 105 + expect(forecast.pop).to eq 1.0 expect(forecast.sys).to be_a OpenWeather::Models::Sys - expect(forecast.dt_txt).to eq '2022-08-30 16:00:00' + expect(forecast.dt_txt).to eq '2024-07-04 20:00:00' end end end From 2274c1a6782078a559ab2e82644799ed6d1b2c98 Mon Sep 17 00:00:00 2001 From: Troy Anderson Date: Fri, 5 Jul 2024 15:23:01 -0700 Subject: [PATCH 3/6] Fix/rubocop (#40) * Rubocop autocorrections * Revert "Rubocop autocorrections" This reverts commit 6a044fc4a90fc7053ad7d788ad38e5ed9477a346. * Updated .rubocop.yml with suggested rules and applied changes to appease the cop. Removed .rubocop_todo.yml as it's no longer needed to pass rubocop. --- .rubocop.yml | 181 +++++++++++++++++- .rubocop_todo.yml | 44 ----- CHANGELOG.md | 1 + lib/open_weather/endpoints/stations.rb | 2 +- lib/open_weather/logger.rb | 2 +- lib/open_weather/models/forecast/forecast.rb | 2 +- lib/open_weather/models/mixins/temp.rb | 4 +- .../models/one_call/current_weather.rb | 4 +- .../models/one_call/daily_weather.rb | 4 +- .../models/one_call/hourly_weather.rb | 4 +- .../models/stations/measurement.rb | 2 +- spec/open_weather/client_spec.rb | 4 +- spec/open_weather/current/cities_box_spec.rb | 4 +- spec/open_weather/endpoints/stations_spec.rb | 43 +++-- .../open_weather/errors/access_denied_spec.rb | 4 +- 15 files changed, 222 insertions(+), 83 deletions(-) delete mode 100644 .rubocop_todo.yml diff --git a/.rubocop.yml b/.rubocop.yml index 4fc00db..9daa722 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,13 +1,184 @@ -Style/NumericLiterals: +AllCops: + SuggestExtensions: false + +Gemspec/RequiredRubyVersion: + Exclude: + - 'open-weather-ruby-client.gemspec' + +Naming/FileName: + Exclude: + - 'lib/open-weather-ruby-client.rb' + +Gemspec/DevelopmentDependencies: + Enabled: false +Gemspec/RequireMFA: Enabled: false +Gemspec/DeprecatedAttributeAssignment: + Enabled: true +Style/NumericLiterals: + Enabled: false Style/ModuleFunction: Enabled: false - Style/Documentation: Enabled: false - Metrics: Enabled: false - -inherit_from: .rubocop_todo.yml +Layout/LineContinuationLeadingSpace: + Enabled: true +Layout/LineContinuationSpacing: + Enabled: true +Layout/LineEndStringConcatenationIndentation: + Enabled: true +Layout/SpaceBeforeBrackets: + Enabled: true +Lint/AmbiguousAssignment: + Enabled: true +Lint/AmbiguousOperatorPrecedence: + Enabled: true +Lint/AmbiguousRange: + Enabled: true +Lint/ConstantOverwrittenInRescue: + Enabled: true +Lint/DeprecatedConstants: + Enabled: true +Lint/DuplicateBranch: + Enabled: true +Lint/DuplicateMagicComment: + Enabled: true +Lint/DuplicateRegexpCharacterClassElement: + Enabled: true +Lint/EmptyBlock: + Enabled: true +Lint/EmptyClass: + Enabled: true +Lint/EmptyInPattern: + Enabled: true +Lint/IncompatibleIoSelectWithFiberScheduler: + Enabled: true +Lint/LambdaWithoutLiteralBlock: + Enabled: true +Lint/NoReturnInBeginEndBlocks: + Enabled: true +Lint/NonAtomicFileOperation: + Enabled: true +Lint/NumberedParameterAssignment: + Enabled: true +Lint/OrAssignmentToConstant: + Enabled: true +Lint/RedundantDirGlobSort: + Enabled: true +Lint/RefinementImportMethods: + Enabled: true +Lint/RequireRangeParentheses: + Enabled: true +Lint/RequireRelativeSelfPath: + Enabled: true +Lint/SymbolConversion: + Enabled: true +Lint/ToEnumArguments: + Enabled: true +Lint/TripleQuotes: + Enabled: true +Lint/UnexpectedBlockArity: + Enabled: true +Lint/UnmodifiedReduceAccumulator: + Enabled: true +Lint/UselessRescue: + Enabled: true +Lint/UselessRuby2Keywords: + Enabled: true +Naming/BlockForwarding: + Enabled: true +Security/CompoundHash: + Enabled: true +Security/IoMethods: + Enabled: true +Style/ArgumentsForwarding: + Enabled: true +Style/ArrayIntersect: + Enabled: true +Style/CollectionCompact: + Enabled: true +Style/ComparableClamp: + Enabled: true +Style/ConcatArrayLiterals: + Enabled: true +Style/DirEmpty: + Enabled: true +Style/DocumentDynamicEvalDefinition: + Enabled: true +Style/EmptyHeredoc: + Enabled: true +Style/EndlessMethod: + Enabled: true +Style/EnvHome: + Enabled: true +Style/FetchEnvVar: + Enabled: true +Style/FileEmpty: + Enabled: true +Style/FileRead: + Enabled: true +Style/FileWrite: + Enabled: true +Style/HashConversion: + Enabled: true +Style/HashExcept: + Enabled: true +Style/IfWithBooleanLiteralBranches: + Enabled: true +Style/InPatternThen: + Enabled: true +Style/MagicCommentFormat: + Enabled: true +Style/MapCompactWithConditionalBlock: + Enabled: true +Style/MapToHash: + Enabled: true +Style/MapToSet: + Enabled: true +Style/MinMaxComparison: + Enabled: true +Style/MultilineInPatternThen: + Enabled: true +Style/NegatedIfElseCondition: + Enabled: true +Style/NestedFileDirname: + Enabled: true +Style/NilLambda: + Enabled: true +Style/NumberedParameters: + Enabled: true +Style/NumberedParametersLimit: + Enabled: true +Style/ObjectThen: + Enabled: true +Style/OpenStructUse: + Enabled: true +Style/OperatorMethodCall: + Enabled: true +Style/QuotedSymbols: + Enabled: true +Style/RedundantArgument: + Enabled: true +Style/RedundantConstantBase: + Enabled: true +Style/RedundantDoubleSplatHashBraces: + Enabled: true +Style/RedundantEach: + Enabled: true +Style/RedundantHeredocDelimiterQuotes: + Enabled: true +Style/RedundantInitialize: + Enabled: true +Style/RedundantSelfAssignmentBranch: + Enabled: true +Style/RedundantStringEscape: + Enabled: true +Style/SelectByRegexp: + Enabled: true +Style/StringChars: + Enabled: true +Style/SwapValues: + Enabled: true diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml deleted file mode 100644 index d65d3e8..0000000 --- a/.rubocop_todo.yml +++ /dev/null @@ -1,44 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2023-03-20 09:58:58 UTC using RuboCop version 1.48.1. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 1 -# Configuration parameters: Severity, Include. -# Include: **/*.gemspec -Gemspec/RequiredRubyVersion: - Exclude: - - 'open-weather-ruby-client.gemspec' - -# Offense count: 1 -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: AllowedMethods. -# AllowedMethods: instance_of?, kind_of?, is_a?, eql?, respond_to?, equal? -Lint/RedundantSafeNavigation: - Exclude: - - 'lib/open_weather/endpoints/stations.rb' - -# Offense count: 1 -# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, CheckDefinitionPathHierarchyRoots, Regex, IgnoreExecutableScripts, AllowedAcronyms. -# CheckDefinitionPathHierarchyRoots: lib, spec, test, src -# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS -Naming/FileName: - Exclude: - - 'lib/open-weather-ruby-client.rb' - -# Offense count: 2 -# This cop supports unsafe autocorrection (--autocorrect-all). -Style/GlobalStdStream: - Exclude: - - 'lib/open_weather/logger.rb' - - 'spec/open_weather/client_spec.rb' - -# Offense count: 7 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns. -# URISchemes: http, https -Layout/LineLength: - Max: 181 diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d9a85..0841bdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### 0.5.1 (Next) +* [#40](https://github.com/dblock/open-weather-ruby-client/pull/40): Fixing rubocop violations and improved .rubocop.yml - [@troya2](https://github.com/troya2). * Your contribution here. ### 0.5.0 (2024/07/03) diff --git a/lib/open_weather/endpoints/stations.rb b/lib/open_weather/endpoints/stations.rb index b3ba880..366086f 100644 --- a/lib/open_weather/endpoints/stations.rb +++ b/lib/open_weather/endpoints/stations.rb @@ -46,7 +46,7 @@ def get_measurements(options) private def validate_id(id) - raise ArgumentError, 'Invalid ID' unless id&.is_a?(String) + raise ArgumentError, 'Invalid ID' unless id.is_a?(String) end end end diff --git a/lib/open_weather/logger.rb b/lib/open_weather/logger.rb index 6ec5a6f..8673f48 100644 --- a/lib/open_weather/logger.rb +++ b/lib/open_weather/logger.rb @@ -6,7 +6,7 @@ module OpenWeather class Logger < ::Logger def self.logger @logger ||= begin - logger = new STDOUT + logger = new $stdout logger.level = Logger::WARN logger end diff --git a/lib/open_weather/models/forecast/forecast.rb b/lib/open_weather/models/forecast/forecast.rb index 53745dc..bf4f7c1 100644 --- a/lib/open_weather/models/forecast/forecast.rb +++ b/lib/open_weather/models/forecast/forecast.rb @@ -13,7 +13,7 @@ class Forecast < Model property 'rain' property 'snow' property 'visibility' # Average visibility, metres. The maximum value of the visibility is 10km - property 'pop' # Probability of precipitation. The values of the parameter vary between 0 and 1, where 0 is equal to 0%, 1 is equal to 100% + property 'pop' # Probability of precipitation. Varies from 0 and 1, where 0 is equal to 0%, 1 is equal to 100% property 'sys' def initialize(args = nil, options = {}) diff --git a/lib/open_weather/models/mixins/temp.rb b/lib/open_weather/models/mixins/temp.rb index fb648b6..8369ec7 100644 --- a/lib/open_weather/models/mixins/temp.rb +++ b/lib/open_weather/models/mixins/temp.rb @@ -31,7 +31,7 @@ def to_kelvin(value) when :metric (value.to_f + 273.15).round(2) when :imperial - ((value.to_f - 32) * 5 / 9 + 273.15).round(2) + (((value.to_f - 32) * 5 / 9) + 273.15).round(2) else value end @@ -55,7 +55,7 @@ def to_farenheit(value) when :imperial value else - ((value.to_f - 273.15) * 9 / 5 + 32).round(2) + (((value.to_f - 273.15) * 9 / 5) + 32).round(2) end end end diff --git a/lib/open_weather/models/one_call/current_weather.rb b/lib/open_weather/models/one_call/current_weather.rb index d66cf25..bd8285b 100644 --- a/lib/open_weather/models/one_call/current_weather.rb +++ b/lib/open_weather/models/one_call/current_weather.rb @@ -11,7 +11,9 @@ class CurrentWeather < Model temperature_property 'feels_like' # temperature, accounts for the human perception of weather property 'pressure' # atmospheric pressure on the sea level, hPa property 'humidity' # humidity, % - temperature_property 'dew_point' # atmospheric temperature (varying according to pressure and humidity) below which water droplets begin to condense and dew can form + # atmospheric temperature (varying according to pressure and humidity) + # below which water droplets begin to condense and dew can form + temperature_property 'dew_point' property 'clouds' # cloudiness, % property 'uvi' # UV index property 'visibility' # average visibility, meters diff --git a/lib/open_weather/models/one_call/daily_weather.rb b/lib/open_weather/models/one_call/daily_weather.rb index a3b0652..1c4b1a3 100644 --- a/lib/open_weather/models/one_call/daily_weather.rb +++ b/lib/open_weather/models/one_call/daily_weather.rb @@ -11,7 +11,9 @@ class DailyWeather < Model property 'feels_like' property 'pressure' # atmospheric pressure on the sea level, hPa property 'humidity' # humidity, % - temperature_property 'dew_point' # atmospheric temperature (varying according to pressure and humidity) below which water droplets begin to condense and dew can form + # atmospheric temperature (varying according to pressure and humidity) + # below which water droplets begin to condense and dew can form + temperature_property 'dew_point' speed_property 'wind_speed' # wind speed speed_property 'wind_gust' # wind gust property 'wind_deg' # wind direction, degrees (meteorological) diff --git a/lib/open_weather/models/one_call/hourly_weather.rb b/lib/open_weather/models/one_call/hourly_weather.rb index e0ba4f2..b76534c 100644 --- a/lib/open_weather/models/one_call/hourly_weather.rb +++ b/lib/open_weather/models/one_call/hourly_weather.rb @@ -9,7 +9,9 @@ class HourlyWeather < Model temperature_property 'feels_like' property 'pressure' # atmospheric pressure on the sea level, hPa property 'humidity' # humidity, % - temperature_property 'dew_point' # atmospheric temperature (varying according to pressure and humidity) below which water droplets begin to condense and dew can form + # atmospheric temperature (varying according to pressure and humidity) + # below which water droplets begin to condense and dew can form + temperature_property 'dew_point' property 'clouds' # cloudiness, % property 'visibility' # average visibility, meters speed_property 'wind_speed' # wind speed. diff --git a/lib/open_weather/models/stations/measurement.rb b/lib/open_weather/models/stations/measurement.rb index 2761fe0..fa36ec1 100644 --- a/lib/open_weather/models/stations/measurement.rb +++ b/lib/open_weather/models/stations/measurement.rb @@ -5,7 +5,7 @@ module Models module Stations class Measurement < Model property 'station_id' # The internal ID of the station - property 'type' # Type of the aggregated data - minute, hour or day. Specifies the letters m, h or d respectively + property 'type' # Type of the aggregated data - minute, hour or day - the letters m, h or d respectively property 'date' # Time of measurement property 'temp' property 'humidity' diff --git a/spec/open_weather/client_spec.rb b/spec/open_weather/client_spec.rb index f83d73b..00d795f 100644 --- a/spec/open_weather/client_spec.rb +++ b/spec/open_weather/client_spec.rb @@ -99,7 +99,7 @@ end end context 'logger option' do - let(:logger) { Logger.new(STDOUT) } + let(:logger) { Logger.new($stdout) } before do OpenWeather::Client.configure do |config| config.logger = logger @@ -110,7 +110,7 @@ expect(client.logger).to eq logger end it 'creates a connection with a logger' do - expect(client.send(:connection).builder.handlers).to include ::Faraday::Response::Logger + expect(client.send(:connection).builder.handlers).to include Faraday::Response::Logger end end end diff --git a/spec/open_weather/current/cities_box_spec.rb b/spec/open_weather/current/cities_box_spec.rb index 8923a03..a043b43 100644 --- a/spec/open_weather/current/cities_box_spec.rb +++ b/spec/open_weather/current/cities_box_spec.rb @@ -28,7 +28,9 @@ expect(data.cnt).to eq 15 end it 'returns cities in a box weather with coordinates' do - data = client.current_cities_geo_box(lon_left: 12, lat_bottom: 32, lon_right: 15, lat_top: 37, zoom: 10, cluster: true) + data = client.current_cities_geo_box( + lon_left: 12, lat_bottom: 32, lon_right: 15, lat_top: 37, zoom: 10, cluster: true + ) expect(data).to be_a OpenWeather::Models::List expect(data.cnt).to eq 15 end diff --git a/spec/open_weather/endpoints/stations_spec.rb b/spec/open_weather/endpoints/stations_spec.rb index f25fb22..a3de01f 100644 --- a/spec/open_weather/endpoints/stations_spec.rb +++ b/spec/open_weather/endpoints/stations_spec.rb @@ -98,17 +98,17 @@ describe '#create_measurements' do it 'creates measurements', vcr: { cassette_name: 'stations/create_measurement_success' } do create_params = { - "station_id": '5ed21a12cca8ce0001f1aef1', - "dt": 1479817340, - "temperature": 18.7, - "wind_speed": 1.2, - "wind_gust": 3.4, - "pressure": 1021, - "humidity": 87, - "rain_1h": 2, - "clouds": [ + station_id: '5ed21a12cca8ce0001f1aef1', + dt: 1479817340, + temperature: 18.7, + wind_speed: 1.2, + wind_gust: 3.4, + pressure: 1021, + humidity: 87, + rain_1h: 2, + clouds: [ { - "condition": 'NSC' + condition: 'NSC' } ] } @@ -124,17 +124,17 @@ context 'when station does not exist' do it 'raises error', vcr: { cassette_name: 'stations/create_measurement_failed_with_invalid_station' } do create_params = { - "station_id": 'abcde', - "dt": 1479817340, - "temperature": 18.7, - "wind_speed": 1.2, - "wind_gust": 3.4, - "pressure": 1021, - "humidity": 87, - "rain_1h": 2, - "clouds": [ + station_id: 'abcde', + dt: 1479817340, + temperature: 18.7, + wind_speed: 1.2, + wind_gust: 3.4, + pressure: 1021, + humidity: 87, + rain_1h: 2, + clouds: [ { - "condition": 'NSC' + condition: 'NSC' } ] } @@ -187,7 +187,8 @@ context 'without required params' do it 'raises error' do - expect { client.get_measurements(something: 'something') }.to raise_error(ArgumentError, /station_id, type, limit, from, to/) + expect { client.get_measurements(something: 'something') } + .to raise_error(ArgumentError, /station_id, type, limit, from, to/) end end end diff --git a/spec/open_weather/errors/access_denied_spec.rb b/spec/open_weather/errors/access_denied_spec.rb index 7a6fe42..adac277 100644 --- a/spec/open_weather/errors/access_denied_spec.rb +++ b/spec/open_weather/errors/access_denied_spec.rb @@ -6,6 +6,8 @@ include_context 'API client' it 'raises error', vcr: { cassette_name: 'errors/access_denied' } do - expect { client.current_weather(city: 'London') }.to raise_error(OpenWeather::Errors::Fault, 'Invalid API key. Please see http://openweathermap.org/faq#error401 for more info.') + expect { client.current_weather(city: 'London') } + .to raise_error(OpenWeather::Errors::Fault, + 'Invalid API key. Please see http://openweathermap.org/faq#error401 for more info.') end end From 6b9a61acc19ea40be0e8854d6b8cbf910f791bb8 Mon Sep 17 00:00:00 2001 From: Troy Anderson Date: Thu, 4 Jul 2024 13:12:01 -0700 Subject: [PATCH 4/6] Added support for the thirty day forecast in the pro 2.5 API --- CHANGELOG.md | 1 + README.md | 29 ++- lib/open_weather/client.rb | 1 + lib/open_weather/endpoints.rb | 1 + .../endpoints/thirty_day_forecast.rb | 16 ++ lib/open_weather/models/forecast.rb | 1 + lib/open_weather/models/forecast/city.rb | 1 + .../models/forecast/thirty_day.rb | 5 + .../models/forecast/thirty_day/forecast.rb | 33 +++ .../models/forecast/thirty_day/temp.rb | 18 ++ .../models/forecast/thirty_day/thirty_day.rb | 26 +++ .../open_weather/forecast/thirty_day.yml | 217 ++++++++++++++++++ .../forecast/thirty_day_forecast_spec.rb | 88 +++++++ 13 files changed, 436 insertions(+), 1 deletion(-) create mode 100644 lib/open_weather/endpoints/thirty_day_forecast.rb create mode 100644 lib/open_weather/models/forecast/thirty_day.rb create mode 100644 lib/open_weather/models/forecast/thirty_day/forecast.rb create mode 100644 lib/open_weather/models/forecast/thirty_day/temp.rb create mode 100644 lib/open_weather/models/forecast/thirty_day/thirty_day.rb create mode 100644 spec/fixtures/open_weather/forecast/thirty_day.yml create mode 100644 spec/open_weather/forecast/thirty_day_forecast_spec.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 0841bdd..5cd6c49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ### 0.5.1 (Next) * [#40](https://github.com/dblock/open-weather-ruby-client/pull/40): Fixing rubocop violations and improved .rubocop.yml - [@troya2](https://github.com/troya2). +* [#42](https://github.com/dblock/open-weather-ruby-client/pull/42): Added support for the thirty day forecast in the pro 2.5 API - [@troya2](https://github.com/troya2). * Your contribution here. ### 0.5.0 (2024/07/03) diff --git a/README.md b/README.md index 775efe3..0de7322 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Unlike other clients, including [open-weather](https://github.com/coderhs/ruby_o - [Current and Forecast Weather](#current-and-forecast-weather) - [Historical Weather](#historical-weather) - [Hourly Forecast (Pro)](#hourly-forecast-pro) + - [30 Day Forecast (Pro)](#30-day-forecast-pro) - [Stations](#stations) - [Register a Station](#register-a-station) - [List Stations](#list-stations) @@ -221,9 +222,10 @@ data.hourly # => Array[OpenWeather::Models::OneCall::HourlyWeather] The [Hourly Forecast API](https://openweathermap.org/api/hourly-forecast) provides hourly weather forecast for 4 days. Note: This API requires a paid api-key from [OpenWeather.org](https://openweathermap.org/full-price#current). ```ruby -data = client.client.hourly(lat: 33.5312, lon: -111.9426) # => OpenWeather::Models::Forecast::Hourly +data = client.client.hourly(lat: 33.5312, lon: -111.9426, appid: "") # => OpenWeather::Models::Forecast::Hourly data.cnt # => 96 (number of entries) +data.city # => OpenWeather::Models::Forecast::City data.list.first # => OpenWeather::Models::Forecast::Forecast data.list.first.dt # => Time data.list.first.main # => OpenWeather::Models::Forecast::Main @@ -238,6 +240,31 @@ data.list.first.sys # => OpenWeather::Models::Forecast::Sys or nil data.list.first.dt_txt # => String (Time of data forecasted, ISO, UTC) ``` +### 30 Day Forecast (Pro) + +The [30 Day Forecast API](https://openweathermap.org/api/forecast30) provides daily weather forecast for 30 days. Note: This API requires a paid api-key from [OpenWeather.org](https://openweathermap.org/full-price#current). + +```ruby +data = client.client.forecast(lat: 33.5312, lon: -111.9426, appid: "") # => OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay + +data.cnt # => 30 (number of entries - sometimes this is 29) +data.city # => OpenWeather::Models::Forecast::City +data.list.first # => OpenWeather::Models::Forecast::ThirtyDay::Forecast +data.list.first.dt # => Time - time of data forcasted, UTC +data.list.first.sunrise # => Time - Sunrise time, UTC +data.list.first.sunset # => Time - Sunset time, UTC +data.list.first.temp # => OpenWeather::Models::Forecast::ThirtyDay::Temp +data.list.first.feels_like # => OpenWeather::Models::OneCall::FeelsLike +data.list.first.pressure # => int - Atmospheric pressure on the sea level, hPa +data.list.first.humidity # => int - Humidity, % (e.g. integer 24 means 24% cloudiness) +data.list.first.weather # => Array[OpenWeather::Models::Weather] +data.list.first.speed # => double - Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour +data.list.first.deg # => int - Wind direction, degrees (meteorological) +data.list.first.clouds # => int - Cloudiness, % (e.g. integer 78 means 78% cloudiness) +data.list.first.rain # => double or nil - Precipitation volume, mm. Please note that only mm as units of measurement are available for this parameter +data.list.first.snow # => double or nil - Snow volume, mm. Please note that only mm as units of measurement are available for this parameter +``` + ### Stations The [Stations API](https://openweathermap.org/stations) lets your manage personal weather stations and measurements. diff --git a/lib/open_weather/client.rb b/lib/open_weather/client.rb index 15b533c..b6b4481 100644 --- a/lib/open_weather/client.rb +++ b/lib/open_weather/client.rb @@ -6,6 +6,7 @@ class Client include Request include Endpoints::Current include Endpoints::Hourly + include Endpoints::ThirtyDayForecast include Endpoints::OneCall include Endpoints::Stations diff --git a/lib/open_weather/endpoints.rb b/lib/open_weather/endpoints.rb index 78ba719..07ebb57 100644 --- a/lib/open_weather/endpoints.rb +++ b/lib/open_weather/endpoints.rb @@ -4,3 +4,4 @@ require_relative 'endpoints/one_call' require_relative 'endpoints/stations' require_relative 'endpoints/hourly' +require_relative 'endpoints/thirty_day_forecast' diff --git a/lib/open_weather/endpoints/thirty_day_forecast.rb b/lib/open_weather/endpoints/thirty_day_forecast.rb new file mode 100644 index 0000000..caba2ec --- /dev/null +++ b/lib/open_weather/endpoints/thirty_day_forecast.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module OpenWeather + module Endpoints + module ThirtyDayForecast + def thirty_day_forecast(lat, lon = nil, options = {}) + # default to the pro endpoint if not specified + endpoint = options.delete(:endpoint) || pro_endpoint + options = options.merge(endpoint: endpoint) + + options = lat.is_a?(Hash) ? options.merge(lat) : options.merge(lat: lat, lon: lon) + OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay.new(get('2.5/forecast/climate', options), options) + end + end + end +end diff --git a/lib/open_weather/models/forecast.rb b/lib/open_weather/models/forecast.rb index d86f273..d2fbf90 100644 --- a/lib/open_weather/models/forecast.rb +++ b/lib/open_weather/models/forecast.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true require_relative 'forecast/hourly' +require_relative 'forecast/thirty_day' require_relative 'forecast/forecast' require_relative 'forecast/city' diff --git a/lib/open_weather/models/forecast/city.rb b/lib/open_weather/models/forecast/city.rb index 6190aba..06b4548 100644 --- a/lib/open_weather/models/forecast/city.rb +++ b/lib/open_weather/models/forecast/city.rb @@ -11,6 +11,7 @@ class City < Model property 'timezone' # shift in seconds from UTC property 'sunrise', transform_with: ->(v) { Time.at(v).utc } # Sunrise time, UTC property 'sunset', transform_with: ->(v) { Time.at(v).utc } # Sunset time, UTC + property 'population' # City population end end end diff --git a/lib/open_weather/models/forecast/thirty_day.rb b/lib/open_weather/models/forecast/thirty_day.rb new file mode 100644 index 0000000..9e03809 --- /dev/null +++ b/lib/open_weather/models/forecast/thirty_day.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +require_relative 'thirty_day/thirty_day' +require_relative 'thirty_day/forecast' +require_relative 'thirty_day/temp' diff --git a/lib/open_weather/models/forecast/thirty_day/forecast.rb b/lib/open_weather/models/forecast/thirty_day/forecast.rb new file mode 100644 index 0000000..3816630 --- /dev/null +++ b/lib/open_weather/models/forecast/thirty_day/forecast.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module OpenWeather + module Models + module Forecast + module ThirtyDay + class Forecast < Model + property 'dt', transform_with: ->(v) { Time.at(v).utc } # time of data forcasted, UTC + property 'sunrise', transform_with: ->(v) { Time.at(v).utc } # Sunrise time, UTC + property 'sunset', transform_with: ->(v) { Time.at(v).utc } # Sunset time, UTC + property 'temp' # Array of OpenWeather::Models::Forecast::ThityDay::Temp + property 'feels_like' # OpenWeather::Models::OneCall::FeelsLike + property 'pressure' # Atmospheric pressure on the sea level, hPa + property 'humidity' # Humidity, % (e.g. integer 24 means 24% cloudiness) + property 'weather' # Array of OpenWeather::Models::Weather + property 'speed' # Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour + property 'deg' # Wind direction, degrees (meteorological) + property 'clouds' # Cloudiness, % (e.g. integer 78 means 78% cloudiness) + property 'rain' # Precipitation volume, mm. Please note that only mm as units of measurement are available for this parameter + property 'snow' # Snow volume, mm. Please note that only mm as units of measurement are available for this parameter + + def initialize(args = nil, options = {}) + super args, options + + self.temp = Temp.new(temp, options) if temp + self.feels_like = OpenWeather::Models::OneCall::FeelsLike.new(feels_like, options) if feels_like + self.weather = weather.map { |w| OpenWeather::Models::Weather.new(w, options) } if weather + end + end + end + end + end +end diff --git a/lib/open_weather/models/forecast/thirty_day/temp.rb b/lib/open_weather/models/forecast/thirty_day/temp.rb new file mode 100644 index 0000000..3275d24 --- /dev/null +++ b/lib/open_weather/models/forecast/thirty_day/temp.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module OpenWeather + module Models + module Forecast + module ThirtyDay + class Temp < Model + temperature_property 'day' # Day temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'min' # Min daily temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'max' # Max daily temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'night' # Night temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'eve' # Evening temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'morn' # Morning temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + end + end + end + end +end diff --git a/lib/open_weather/models/forecast/thirty_day/thirty_day.rb b/lib/open_weather/models/forecast/thirty_day/thirty_day.rb new file mode 100644 index 0000000..91cafb7 --- /dev/null +++ b/lib/open_weather/models/forecast/thirty_day/thirty_day.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module OpenWeather + module Models + module Forecast + module ThirtyDay + class ThirtyDay < Model + include Enumerable + + property 'cod' # Internal parameter + property 'message' # Internal parameter + property 'city' + property 'cnt' # Number of items in list + property 'list' # List of ??? objects + + def initialize(args = nil, options = {}) + super args, options + + self.list = list.map { |forecast| Forecast.new(forecast, options) } if list + self.city = OpenWeather::Models::Forecast::City.new(city, options) if city + end + end + end + end + end +end diff --git a/spec/fixtures/open_weather/forecast/thirty_day.yml b/spec/fixtures/open_weather/forecast/thirty_day.yml new file mode 100644 index 0000000..51d847c --- /dev/null +++ b/spec/fixtures/open_weather/forecast/thirty_day.yml @@ -0,0 +1,217 @@ +--- +http_interactions: +- request: + method: get + uri: https://pro.openweathermap.org/data/2.5/forecast/climate?appid=api-key&lat=33.5312&lon=-111.9426 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json; charset=utf-8 + Content-Type: + - application/json + User-Agent: + - OpenWeather Ruby Client/0.5.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - openresty + Date: + - Thu, 04 Jul 2024 19:45:44 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '10770' + Connection: + - keep-alive + X-Cache-Key: + - "/data/2.5/forecast/climate?lat=33.53&lon=-111.94" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: '{"city":{"id":5308049,"name":"Paradise Valley","coord":{"lon":-111.9426,"lat":33.5312},"country":"US","population":12820,"timezone":-25200},"code":"200","message":22.2974177,"cnt":29,"list":[{"dt":1720119600,"sunrise":1720095772,"sunset":1720147281,"temp":{"day":310.33,"min":300.15,"max":313.81,"night":304.51,"eve":313.81,"morn":301.79},"feels_like":{"day":309.61,"night":303.36,"eve":312.52,"morn":301.32},"pressure":1013,"humidity":24,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":5.41,"deg":241,"clouds":78},{"dt":1720206000,"sunrise":1720182201,"sunset":1720233672,"temp":{"day":311.7,"min":300.15,"max":316.37,"night":306.86,"eve":316.37,"morn":300.15},"feels_like":{"day":310.53,"night":304.99,"eve":314.42,"morn":300.12},"pressure":1010,"humidity":20,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.13,"deg":250,"clouds":39},{"dt":1720292400,"sunrise":1720268631,"sunset":1720320061,"temp":{"day":313.16,"min":302.55,"max":317.45,"night":307.54,"eve":317.45,"morn":302.68},"feels_like":{"day":311.95,"night":306,"eve":315.32,"morn":301.48},"pressure":1009,"humidity":18,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.65,"deg":243,"clouds":8},{"dt":1720378800,"sunrise":1720355061,"sunset":1720406449,"temp":{"day":313.48,"min":301.78,"max":318.04,"night":307.46,"eve":318.04,"morn":302.55},"feels_like":{"day":312.38,"night":305.66,"eve":315.58,"morn":301.5},"pressure":1009,"humidity":18,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.38,"deg":250,"clouds":7},{"dt":1720465200,"sunrise":1720441493,"sunset":1720492835,"temp":{"day":314.67,"min":301.78,"max":319.16,"night":307.78,"eve":319.16,"morn":301.78},"feels_like":{"day":313.33,"night":305.43,"eve":315.43,"morn":300.96},"pressure":1007,"humidity":16,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.94,"deg":259,"clouds":3},{"dt":1720551600,"sunrise":1720527925,"sunset":1720579220,"temp":{"day":316.51,"min":303.2,"max":319.42,"night":308.39,"eve":319.42,"morn":303.2},"feels_like":{"day":314.22,"night":306.14,"eve":315.68,"morn":301.59},"pressure":1006,"humidity":12,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":5.48,"deg":259,"clouds":16},{"dt":1720638000,"sunrise":1720614358,"sunset":1720665603,"temp":{"day":314.89,"min":304.81,"max":318.09,"night":307.36,"eve":318.09,"morn":304.92},"feels_like":{"day":312.98,"night":305.24,"eve":315.21,"morn":302.92},"pressure":1009,"humidity":14,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":5.06,"deg":243,"clouds":43},{"dt":1720724400,"sunrise":1720700792,"sunset":1720751985,"temp":{"day":313.61,"min":304.81,"max":317.44,"night":308.13,"eve":317.44,"morn":304.81},"feels_like":{"day":313.52,"night":306.42,"eve":315.31,"morn":302.98},"pressure":1012,"humidity":21,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":3.78,"deg":111,"clouds":32},{"dt":1720810800,"sunrise":1720787227,"sunset":1720838365,"temp":{"day":312.82,"min":303.45,"max":317.23,"night":307.63,"eve":317.23,"morn":305.06},"feels_like":{"day":312.06,"night":305.85,"eve":315.06,"morn":303.55},"pressure":1012,"humidity":20,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":4.18,"deg":238,"clouds":55},{"dt":1720897200,"sunrise":1720873662,"sunset":1720924743,"temp":{"day":311.86,"min":302.26,"max":315.85,"night":306.35,"eve":315.85,"morn":303.45},"feels_like":{"day":310.75,"night":304.37,"eve":313.8,"morn":302.27},"pressure":1010,"humidity":20,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":4.92,"deg":248,"clouds":80},{"dt":1720983600,"sunrise":1720960098,"sunset":1721011120,"temp":{"day":312.25,"min":300.26,"max":314.83,"night":304.58,"eve":314.83,"morn":302.26},"feels_like":{"day":310.32,"night":302.65,"eve":312.33,"morn":300.95},"pressure":1009,"humidity":16,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":5.1,"deg":243,"clouds":12},{"dt":1721070000,"sunrise":1721046535,"sunset":1721097495,"temp":{"day":312.02,"min":300.2,"max":314.54,"night":304.02,"eve":314.54,"morn":300.26},"feels_like":{"day":309.66,"night":302.08,"eve":311.76,"morn":299.53},"pressure":1010,"humidity":14,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.98,"deg":245,"clouds":6},{"dt":1721156400,"sunrise":1721132973,"sunset":1721183869,"temp":{"day":312.22,"min":300.2,"max":314.48,"night":303.7,"eve":314.48,"morn":300.2},"feels_like":{"day":309.53,"night":301.92,"eve":311.94,"morn":299.42},"pressure":1011,"humidity":12,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":4.99,"deg":234,"clouds":17},{"dt":1721242800,"sunrise":1721219411,"sunset":1721270241,"temp":{"day":308.95,"min":300.32,"max":312.47,"night":304.29,"eve":312.47,"morn":300.32},"feels_like":{"day":306.62,"night":303.03,"eve":310.58,"morn":299.56},"pressure":1011,"humidity":16,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.32,"deg":207,"clouds":65},{"dt":1721329200,"sunrise":1721305849,"sunset":1721356612,"temp":{"day":311.12,"min":302.75,"max":313.58,"night":304.27,"eve":313.58,"morn":302.78},"feels_like":{"day":309.56,"night":303.1,"eve":312.51,"morn":301.63},"pressure":1011,"humidity":19,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":3.39,"deg":252,"clouds":44},{"dt":1721415600,"sunrise":1721392288,"sunset":1721442981,"temp":{"day":310.37,"min":301.64,"max":313.45,"night":303.71,"eve":313.45,"morn":302.75},"feels_like":{"day":308.82,"night":302.21,"eve":311.78,"morn":301.75},"pressure":1011,"humidity":20,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.38,"deg":250,"clouds":72},{"dt":1721502000,"sunrise":1721478728,"sunset":1721529349,"temp":{"day":311.5,"min":301.64,"max":314.39,"night":304.71,"eve":314.39,"morn":301.64},"feels_like":{"day":309.26,"night":302.89,"eve":312.38,"morn":300.61},"pressure":1011,"humidity":15,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":2.72,"deg":264,"clouds":65},{"dt":1721588400,"sunrise":1721565168,"sunset":1721615715,"temp":{"day":312.23,"min":302.12,"max":316.01,"night":307.14,"eve":316.01,"morn":303.01},"feels_like":{"day":309.71,"night":305.1,"eve":313.65,"morn":301.34},"pressure":1011,"humidity":13,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":4.06,"deg":276,"clouds":75},{"dt":1721674800,"sunrise":1721651608,"sunset":1721702080,"temp":{"day":314.31,"min":302.12,"max":316.91,"night":308.03,"eve":316.91,"morn":302.12},"feels_like":{"day":312.01,"night":305.95,"eve":314.69,"morn":300.75},"pressure":1010,"humidity":13,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":3.77,"deg":262,"clouds":17},{"dt":1721761200,"sunrise":1721738049,"sunset":1721788443,"temp":{"day":315.64,"min":302.98,"max":318.37,"night":309.72,"eve":318.37,"morn":302.98},"feels_like":{"day":313.23,"night":307.71,"eve":315.51,"morn":301.5},"pressure":1010,"humidity":12,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.44,"deg":268,"clouds":30},{"dt":1721847600,"sunrise":1721824490,"sunset":1721874805,"temp":{"day":314.53,"min":305.43,"max":318.06,"night":309.2,"eve":318.06,"morn":305.43},"feels_like":{"day":312.54,"night":307.12,"eve":315.18,"morn":303.59},"pressure":1009,"humidity":14,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.34,"deg":278,"clouds":68},{"dt":1721934000,"sunrise":1721910932,"sunset":1721961166,"temp":{"day":316.29,"min":302.79,"max":318.24,"night":307.01,"eve":318.24,"morn":306.1},"feels_like":{"day":313.97,"night":304.97,"eve":315.37,"morn":304.11},"pressure":1008,"humidity":12,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.6,"deg":267,"clouds":35},{"dt":1722020400,"sunrise":1721997374,"sunset":1722047525,"temp":{"day":314.05,"min":301.36,"max":316.61,"night":305.71,"eve":316.61,"morn":302.79},"feels_like":{"day":312.25,"night":303.72,"eve":313.98,"morn":301.29},"pressure":1010,"humidity":15,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":5.38,"deg":249,"clouds":7},{"dt":1722106800,"sunrise":1722083816,"sunset":1722133883,"temp":{"day":312.32,"min":300.79,"max":316.29,"night":305.25,"eve":316.29,"morn":301.36},"feels_like":{"day":310.62,"night":303.34,"eve":313.63,"morn":300.45},"pressure":1011,"humidity":17,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":4.41,"deg":258,"clouds":10},{"dt":1722193200,"sunrise":1722170258,"sunset":1722220239,"temp":{"day":313.12,"min":300.56,"max":316.2,"night":305.23,"eve":316.2,"morn":300.79},"feels_like":{"day":311.13,"night":303.32,"eve":313.87,"morn":300.03},"pressure":1011,"humidity":15,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":5.28,"deg":244,"clouds":7},{"dt":1722279600,"sunrise":1722256701,"sunset":1722306594,"temp":{"day":312.9,"min":300.56,"max":315.91,"night":306.42,"eve":315.91,"morn":300.56},"feels_like":{"day":311.1,"night":304.62,"eve":313.54,"morn":299.92},"pressure":1011,"humidity":16,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":5.75,"deg":258,"clouds":18},{"dt":1722366000,"sunrise":1722343143,"sunset":1722392947,"temp":{"day":313.77,"min":301.96,"max":316.3,"night":306.04,"eve":316.3,"morn":302.01},"feels_like":{"day":312.77,"night":304.75,"eve":314.71,"morn":301.03},"pressure":1012,"humidity":18,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":5.14,"deg":262,"clouds":28},{"dt":1722452400,"sunrise":1722429586,"sunset":1722479300,"temp":{"day":313.2,"min":301.96,"max":315.27,"night":305.72,"eve":315.27,"morn":301.96},"feels_like":{"day":312.6,"night":304.76,"eve":314.48,"morn":301.57},"pressure":1011,"humidity":20,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.72,"deg":263,"clouds":26},{"dt":1722538800,"sunrise":1722516029,"sunset":1722565651,"temp":{"day":313.98,"min":302.56,"max":316.13,"night":307.08,"eve":316.13,"morn":302.56},"feels_like":{"day":313.73,"night":306.34,"eve":315.69,"morn":302.28},"pressure":1012,"humidity":20,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.54,"deg":270,"clouds":44}]}' + recorded_at: Thu, 04 Jul 2024 19:45:44 GMT +- request: + method: get + uri: https://pro.openweathermap.org/data/2.5/forecast/climate?appid=api-key&lat=82.8628&lon=135.0 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json; charset=utf-8 + Content-Type: + - application/json + User-Agent: + - OpenWeather Ruby Client/0.5.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - openresty + Date: + - Thu, 04 Jul 2024 19:52:33 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '10399' + Connection: + - keep-alive + X-Cache-Key: + - "/data/2.5/forecast/climate?lat=82.86&lon=135" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: '{"city":{"id":0,"name":"","coord":{"lon":135,"lat":82.8628},"country":"","population":0,"timezone":32400},"code":"200","message":22.4998097,"cnt":29,"list":[{"dt":1720148400,"sunrise":0,"sunset":0,"temp":{"day":273.74,"min":273.2,"max":273.91,"night":273.3,"eve":273.49,"morn":273.91},"feels_like":{"day":269.95,"night":269.97,"eve":269.81,"morn":270.27},"pressure":1011,"humidity":93,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.5,"deg":332,"clouds":15,"snow":0.14},{"dt":1720234800,"sunrise":0,"sunset":0,"temp":{"day":273.2,"min":273.11,"max":273.2,"night":273.19,"eve":273.2,"morn":273.2},"feels_like":{"day":270.52,"night":271.54,"eve":273.2,"morn":270.13},"pressure":1014,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":2.67,"deg":336,"clouds":98,"snow":0.14},{"dt":1720321200,"sunrise":0,"sunset":0,"temp":{"day":273.13,"min":273.11,"max":273.16,"night":273.13,"eve":273.11,"morn":273.11},"feels_like":{"day":269.51,"night":268.18,"eve":269.33,"morn":269.91},"pressure":1010,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.19,"deg":49,"clouds":53,"snow":0.42},{"dt":1720407600,"sunrise":0,"sunset":0,"temp":{"day":273.2,"min":273.16,"max":273.25,"night":273.25,"eve":273.25,"morn":273.16},"feels_like":{"day":267.51,"night":267.76,"eve":267.69,"morn":267.62},"pressure":1012,"humidity":93,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.53,"deg":55,"clouds":88,"snow":0.92},{"dt":1720494000,"sunrise":0,"sunset":0,"temp":{"day":273.24,"min":273.21,"max":273.25,"night":273.25,"eve":273.25,"morn":273.21},"feels_like":{"day":267.87,"night":268.07,"eve":268.06,"morn":267.74},"pressure":1014,"humidity":92,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.07,"deg":57,"clouds":90,"snow":0.81},{"dt":1720580400,"sunrise":0,"sunset":0,"temp":{"day":273.23,"min":273.11,"max":273.25,"night":273.18,"eve":273.25,"morn":273.21},"feels_like":{"day":267.53,"night":267.44,"eve":267.5,"morn":267.76},"pressure":1018,"humidity":93,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.84,"deg":55,"clouds":98,"snow":0.55},{"dt":1720666800,"sunrise":0,"sunset":0,"temp":{"day":273.2,"min":273.11,"max":273.34,"night":273.34,"eve":273.32,"morn":273.11},"feels_like":{"day":267.24,"night":267.33,"eve":267.27,"morn":267.25},"pressure":1019,"humidity":93,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":7.44,"deg":49,"clouds":99,"snow":0.61},{"dt":1720753200,"sunrise":0,"sunset":0,"temp":{"day":273.32,"min":273.32,"max":273.45,"night":273.45,"eve":273.38,"morn":273.32},"feels_like":{"day":267.79,"night":269.43,"eve":268.49,"morn":267.4},"pressure":1018,"humidity":95,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":7.12,"deg":51,"clouds":93,"snow":0.18},{"dt":1720839600,"sunrise":0,"sunset":0,"temp":{"day":273.36,"min":273.01,"max":273.39,"night":273.05,"eve":273.23,"morn":273.39},"feels_like":{"day":270.18,"night":268.59,"eve":269.27,"morn":270.11},"pressure":1017,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.42,"deg":292,"clouds":39,"snow":0.14},{"dt":1720926000,"sunrise":0,"sunset":0,"temp":{"day":273.03,"min":273.01,"max":273.04,"night":273.04,"eve":273.04,"morn":273.01},"feels_like":{"day":268.87,"night":269.2,"eve":269.27,"morn":268.41},"pressure":1015,"humidity":95,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.42,"deg":292,"clouds":92,"snow":0.59},{"dt":1721012400,"sunrise":0,"sunset":0,"temp":{"day":273.11,"min":273.04,"max":273.16,"night":273.16,"eve":273.15,"morn":273.04},"feels_like":{"day":268.49,"night":268.29,"eve":268.21,"morn":268.83},"pressure":1016,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.04,"deg":331,"clouds":89,"snow":0.67},{"dt":1721098800,"sunrise":0,"sunset":0,"temp":{"day":273.12,"min":273.1,"max":273.21,"night":273.19,"eve":273.15,"morn":273.1},"feels_like":{"day":268.44,"night":268.73,"eve":268.47,"morn":268.45},"pressure":1018,"humidity":95,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.61,"deg":297,"clouds":89,"snow":0.5},{"dt":1721185200,"sunrise":0,"sunset":0,"temp":{"day":273.29,"min":272.99,"max":273.32,"night":273.19,"eve":273.32,"morn":273.21},"feels_like":{"day":269.08,"night":268.82,"eve":269.12,"morn":268.83},"pressure":1022,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.3,"deg":261,"clouds":86,"snow":0.11},{"dt":1721271600,"sunrise":0,"sunset":0,"temp":{"day":273.17,"min":272.99,"max":273.6,"night":273.6,"eve":273.43,"morn":272.99},"feels_like":{"day":267.9,"night":268.56,"eve":268.35,"morn":267.86},"pressure":1022,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.65,"deg":258,"clouds":92,"snow":0.5},{"dt":1721358000,"sunrise":0,"sunset":0,"temp":{"day":273.53,"min":273.53,"max":273.6,"night":273.6,"eve":273.57,"morn":273.56},"feels_like":{"day":269.13,"night":269.65,"eve":269.29,"morn":268.67},"pressure":1021,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.14,"deg":273,"clouds":96,"snow":0.7},{"dt":1721444400,"sunrise":0,"sunset":0,"temp":{"day":273.69,"min":273.58,"max":273.79,"night":273.79,"eve":273.78,"morn":273.58},"feels_like":{"day":271.07,"night":270.46,"eve":270.77,"morn":270.33},"pressure":1021,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.26,"deg":220,"clouds":95,"snow":0.7},{"dt":1721530800,"sunrise":0,"sunset":0,"temp":{"day":273.78,"min":273.73,"max":273.83,"night":273.83,"eve":273.79,"morn":273.73},"feels_like":{"day":269.9,"night":270.15,"eve":269.97,"morn":270.13},"pressure":1019,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.64,"deg":210,"clouds":89,"snow":0.53},{"dt":1721617200,"sunrise":0,"sunset":0,"temp":{"day":273.67,"min":273.49,"max":273.76,"night":273.56,"eve":273.54,"morn":273.76},"feels_like":{"day":269.71,"night":268.75,"eve":269.28,"morn":270.39},"pressure":1019,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.11,"deg":85,"clouds":53,"snow":0.64},{"dt":1721703600,"sunrise":0,"sunset":0,"temp":{"day":273.38,"min":273.1,"max":273.49,"night":273.17,"eve":273.26,"morn":273.49},"feels_like":{"day":267.61,"night":268.53,"eve":267.84,"morn":268.08},"pressure":1014,"humidity":95,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.82,"deg":81,"clouds":96,"snow":4.33},{"dt":1721790000,"sunrise":0,"sunset":0,"temp":{"day":273.11,"min":273.1,"max":273.28,"night":273.24,"eve":273.14,"morn":273.1},"feels_like":{"day":270.42,"night":273.24,"eve":273.14,"morn":269.38},"pressure":1010,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.24,"deg":61,"clouds":100,"snow":1.14},{"dt":1721876400,"sunrise":0,"sunset":0,"temp":{"day":273.36,"min":273.23,"max":273.41,"night":273.35,"eve":273.41,"morn":273.28},"feels_like":{"day":271.29,"night":269.82,"eve":270.36,"morn":271.67},"pressure":1010,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.66,"deg":299,"clouds":98,"snow":2.4},{"dt":1721962800,"sunrise":0,"sunset":0,"temp":{"day":273.17,"min":273.06,"max":273.23,"night":273.16,"eve":273.13,"morn":273.23},"feels_like":{"day":269.14,"night":268.19,"eve":268.7,"morn":269.21},"pressure":1010,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.87,"deg":303,"clouds":94,"snow":1.75},{"dt":1722049200,"sunrise":0,"sunset":0,"temp":{"day":273.03,"min":273.03,"max":273.38,"night":273.38,"eve":273.19,"morn":273.06},"feels_like":{"day":268.01,"night":268.32,"eve":268.41,"morn":267.65},"pressure":1011,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.87,"deg":303,"clouds":84,"snow":2.18},{"dt":1722135600,"sunrise":0,"sunset":0,"temp":{"day":273.24,"min":273,"max":273.36,"night":273.04,"eve":273.12,"morn":273.36},"feels_like":{"day":268.67,"night":268.61,"eve":268.57,"morn":268.53},"pressure":1010,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.95,"deg":239,"clouds":96,"snow":1.55},{"dt":1722222000,"sunrise":0,"sunset":0,"temp":{"day":273.07,"min":273,"max":273.25,"night":273.23,"eve":273.15,"morn":273},"feels_like":{"day":269.09,"night":269.46,"eve":269.1,"morn":268.67},"pressure":1012,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":4.02,"deg":271,"clouds":90,"snow":0.37},{"dt":1722308400,"sunrise":0,"sunset":0,"temp":{"day":273.34,"min":273.25,"max":273.42,"night":273.33,"eve":273.42,"morn":273.25},"feels_like":{"day":269.47,"night":269.69,"eve":269.25,"morn":269.52},"pressure":1015,"humidity":96,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":3.92,"deg":304,"clouds":72,"snow":0.15},{"dt":1722394800,"sunrise":0,"sunset":0,"temp":{"day":273.6,"min":273.38,"max":273.87,"night":273.82,"eve":273.7,"morn":273.38},"feels_like":{"day":268.96,"night":268.26,"eve":268.21,"morn":269.54},"pressure":1017,"humidity":94,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.86,"deg":217,"clouds":44,"snow":4.32},{"dt":1722481200,"sunrise":0,"sunset":0,"temp":{"day":273.8,"min":273.77,"max":273.87,"night":273.86,"eve":273.84,"morn":273.87},"feels_like":{"day":268.15,"night":268.45,"eve":268.23,"morn":268.22},"pressure":1012,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":6.86,"deg":217,"clouds":85,"snow":5.1},{"dt":1722567600,"sunrise":0,"sunset":0,"temp":{"day":273.7,"min":273.58,"max":273.77,"night":273.58,"eve":273.58,"morn":273.77},"feels_like":{"day":269.66,"night":270.62,"eve":270.62,"morn":268.81},"pressure":1005,"humidity":97,"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"speed":5.36,"deg":216,"clouds":93,"snow":1.86}]}' + recorded_at: Thu, 04 Jul 2024 19:52:33 GMT +- request: + method: get + uri: https://pro.openweathermap.org/data/2.5/forecast/climate?appid=api-key&lat=39.00801&lon=-76.97647 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json; charset=utf-8 + Content-Type: + - application/json + User-Agent: + - OpenWeather Ruby Client/0.5.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - openresty + Date: + - Thu, 04 Jul 2024 19:55:42 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '11254' + Connection: + - keep-alive + X-Cache-Key: + - "/data/2.5/forecast/climate?lat=39.01&lon=-76.98" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: '{"city":{"id":4346991,"name":"Adelphi","coord":{"lon":-76.9765,"lat":39.008},"country":"US","population":15086,"timezone":-14400},"code":"200","message":21.4966823,"cnt":30,"list":[{"dt":1720108800,"sunrise":1720086455,"sunset":1720139813,"temp":{"day":304.33,"min":293.81,"max":304.33,"night":297.81,"eve":300.63,"morn":293.81},"feels_like":{"day":305.67,"night":298.42,"eve":302.74,"morn":293.86},"pressure":1012,"humidity":48,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":4.88,"deg":196,"clouds":61,"rain":0.51},{"dt":1720195200,"sunrise":1720172888,"sunset":1720226199,"temp":{"day":306.47,"min":296.98,"max":306.47,"night":296.98,"eve":299.91,"morn":297.23},"feels_like":{"day":310.4,"night":297.9,"eve":302.78,"morn":297.99},"pressure":1010,"humidity":51,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":3.16,"deg":223,"clouds":31,"rain":3.31},{"dt":1720281600,"sunrise":1720259322,"sunset":1720312584,"temp":{"day":306.4,"min":296.98,"max":306.4,"night":299.87,"eve":302.62,"morn":297.93},"feels_like":{"day":309.65,"night":301.14,"eve":305.92,"morn":298.76},"pressure":1010,"humidity":49,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.1,"deg":236,"clouds":32},{"dt":1720368000,"sunrise":1720345758,"sunset":1720398967,"temp":{"day":299.98,"min":296.31,"max":299.98,"night":296.98,"eve":298.46,"morn":296.31},"feels_like":{"day":303.13,"night":297.93,"eve":299.5,"morn":296.9},"pressure":1014,"humidity":87,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":4.51,"deg":180,"clouds":95,"rain":13.94},{"dt":1720454400,"sunrise":1720432195,"sunset":1720485347,"temp":{"day":300.93,"min":296.21,"max":300.93,"night":296.21,"eve":300.33,"morn":296.48},"feels_like":{"day":305.14,"night":296.56,"eve":302.69,"morn":297.38},"pressure":1008,"humidity":83,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":5.64,"deg":189,"clouds":88,"rain":16.5},{"dt":1720540800,"sunrise":1720518633,"sunset":1720571726,"temp":{"day":304.34,"min":292.99,"max":304.34,"night":292.99,"eve":300,"morn":296.1},"feels_like":{"day":305.31,"night":292.88,"eve":301.25,"morn":296.44},"pressure":1014,"humidity":46,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":3.4,"deg":261,"clouds":11},{"dt":1720627200,"sunrise":1720605073,"sunset":1720658103,"temp":{"day":305.05,"min":292.99,"max":305.05,"night":296.85,"eve":299.29,"morn":298.45},"feels_like":{"day":307.57,"night":297.78,"eve":299.29,"morn":298.68},"pressure":1017,"humidity":51,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":4.28,"deg":213,"clouds":55,"rain":12.85},{"dt":1720713600,"sunrise":1720691513,"sunset":1720744479,"temp":{"day":302.62,"min":293.92,"max":302.62,"night":293.92,"eve":298.92,"morn":296.24},"feels_like":{"day":303.44,"night":293.83,"eve":299.2,"morn":297.03},"pressure":1015,"humidity":50,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":4.28,"deg":213,"clouds":39,"rain":9.62},{"dt":1720800000,"sunrise":1720777954,"sunset":1720830852,"temp":{"day":302.68,"min":292.83,"max":302.68,"night":296.39,"eve":298.38,"morn":292.83},"feels_like":{"day":303.67,"night":296.68,"eve":298.79,"morn":292.92},"pressure":1017,"humidity":51,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":2.66,"deg":320,"clouds":17},{"dt":1720886400,"sunrise":1720864397,"sunset":1720917224,"temp":{"day":302.77,"min":296.39,"max":302.77,"night":297.41,"eve":298.65,"morn":296.86},"feels_like":{"day":303.65,"night":297.72,"eve":299.11,"morn":297.35},"pressure":1014,"humidity":50,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":2.16,"deg":138,"clouds":44},{"dt":1720972800,"sunrise":1720950840,"sunset":1721003593,"temp":{"day":302.88,"min":296.73,"max":302.88,"night":297.89,"eve":299.83,"morn":296.73},"feels_like":{"day":304.11,"night":298.14,"eve":301.21,"morn":297.1},"pressure":1015,"humidity":52,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":2.56,"deg":219,"clouds":80},{"dt":1721059200,"sunrise":1721037284,"sunset":1721089961,"temp":{"day":304.84,"min":296.73,"max":304.84,"night":300.2,"eve":301.57,"morn":296.73},"feels_like":{"day":305.7,"night":300.81,"eve":302.4,"morn":297.02},"pressure":1014,"humidity":44,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.79,"deg":205,"clouds":54},{"dt":1721145600,"sunrise":1721123729,"sunset":1721176327,"temp":{"day":304.53,"min":297.15,"max":304.53,"night":297.61,"eve":299.87,"morn":297.15},"feels_like":{"day":310.23,"night":298.51,"eve":302.76,"morn":297.67},"pressure":1015,"humidity":65,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":3.73,"deg":244,"clouds":52,"rain":11.83},{"dt":1721232000,"sunrise":1721210175,"sunset":1721262692,"temp":{"day":299.89,"min":291.83,"max":299.89,"night":291.83,"eve":294.57,"morn":296.67},"feels_like":{"day":302.73,"night":292.08,"eve":295.17,"morn":297.58},"pressure":1014,"humidity":85,"weather":[{"id":501,"main":"Rain","description":"moderate + rain","icon":"10d"}],"speed":6.01,"deg":16,"clouds":86,"rain":29.64},{"dt":1721318400,"sunrise":1721296622,"sunset":1721349054,"temp":{"day":296.86,"min":288.7,"max":296.86,"night":288.7,"eve":293.15,"morn":290.63},"feels_like":{"day":296.67,"night":288.32,"eve":292.98,"morn":290.55},"pressure":1022,"humidity":53,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":5.11,"deg":14,"clouds":57,"rain":0.2},{"dt":1721404800,"sunrise":1721383070,"sunset":1721435415,"temp":{"day":295.47,"min":288.7,"max":295.47,"night":288.77,"eve":292.46,"morn":289.64},"feels_like":{"day":295.12,"night":288.55,"eve":292.27,"morn":289.2},"pressure":1024,"humidity":52,"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"speed":3.7,"deg":70,"clouds":84},{"dt":1721491200,"sunrise":1721469518,"sunset":1721521774,"temp":{"day":296.32,"min":288.35,"max":296.32,"night":288.35,"eve":293.16,"morn":289.01},"feels_like":{"day":296.1,"night":288.15,"eve":293.07,"morn":288.79},"pressure":1023,"humidity":54,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":4.9,"deg":56,"clouds":15},{"dt":1721577600,"sunrise":1721555967,"sunset":1721608132,"temp":{"day":296.54,"min":288.35,"max":296.54,"night":289.36,"eve":293.47,"morn":288.69},"feels_like":{"day":296.24,"night":289.13,"eve":293.46,"morn":288.34},"pressure":1019,"humidity":50,"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"speed":4.21,"deg":357,"clouds":38},{"dt":1721664000,"sunrise":1721642416,"sunset":1721694488,"temp":{"day":300.26,"min":289.36,"max":300.26,"night":290.01,"eve":296.25,"morn":290.88},"feels_like":{"day":300.37,"night":290.08,"eve":296.47,"morn":290.46},"pressure":1017,"humidity":45,"weather":[{"id":800,"main":"Clear","description":"sky + is clear","icon":"01d"}],"speed":3.58,"deg":33,"clouds":10},{"dt":1721750400,"sunrise":1721728867,"sunset":1721780842,"temp":{"day":302.08,"min":290.01,"max":302.08,"night":291.2,"eve":297.8,"morn":293.88},"feels_like":{"day":303.49,"night":291.62,"eve":298.44,"morn":294.05},"pressure":1019,"humidity":56,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.47,"deg":105,"clouds":7,"rain":1.37},{"dt":1721836800,"sunrise":1721815317,"sunset":1721867194,"temp":{"day":302.43,"min":291.2,"max":302.43,"night":296.19,"eve":298.85,"morn":295.17},"feels_like":{"day":304.83,"night":296.8,"eve":299.46,"morn":295.83},"pressure":1018,"humidity":61,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.08,"deg":134,"clouds":15,"rain":1.33},{"dt":1721923200,"sunrise":1721901769,"sunset":1721953545,"temp":{"day":301.71,"min":296.19,"max":301.71,"night":298,"eve":300.81,"morn":296.56},"feels_like":{"day":304.17,"night":298.45,"eve":302.95,"morn":297.1},"pressure":1017,"humidity":65,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.82,"deg":179,"clouds":97,"rain":0.1},{"dt":1722009600,"sunrise":1721988220,"sunset":1722039894,"temp":{"day":303.38,"min":297.17,"max":303.38,"night":298.19,"eve":299.02,"morn":297.17},"feels_like":{"day":307.53,"night":298.86,"eve":299.75,"morn":297.74},"pressure":1017,"humidity":65,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.82,"deg":212,"clouds":53,"rain":0.87},{"dt":1722096000,"sunrise":1722074673,"sunset":1722126242,"temp":{"day":302.35,"min":297.43,"max":302.35,"night":300.2,"eve":300.95,"morn":297.43},"feels_like":{"day":306.32,"night":302.09,"eve":304.61,"morn":298.13},"pressure":1017,"humidity":70,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":3.86,"deg":194,"clouds":88,"rain":0.35},{"dt":1722182400,"sunrise":1722161125,"sunset":1722212588,"temp":{"day":306.71,"min":297.62,"max":306.71,"night":297.62,"eve":301.16,"morn":298.26},"feels_like":{"day":310.28,"night":298.32,"eve":304.53,"morn":298.76},"pressure":1014,"humidity":49,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":3.91,"deg":225,"clouds":16,"rain":2.24},{"dt":1722268800,"sunrise":1722247578,"sunset":1722298933,"temp":{"day":306.29,"min":297.37,"max":306.29,"night":298.58,"eve":301.86,"morn":297.37},"feels_like":{"day":309.72,"night":299.32,"eve":305.09,"morn":298.07},"pressure":1015,"humidity":50,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":2.46,"deg":266,"clouds":21},{"dt":1722355200,"sunrise":1722334031,"sunset":1722385276,"temp":{"day":307.09,"min":298.21,"max":307.09,"night":300.35,"eve":303.62,"morn":298.21},"feels_like":{"day":310.45,"night":302.08,"eve":306.9,"morn":298.91},"pressure":1011,"humidity":47,"weather":[{"id":801,"main":"Clouds","description":"few + clouds","icon":"02d"}],"speed":3.28,"deg":244,"clouds":24},{"dt":1722441600,"sunrise":1722420485,"sunset":1722471617,"temp":{"day":306.78,"min":297.84,"max":306.78,"night":297.84,"eve":302.04,"morn":298.85},"feels_like":{"day":310.43,"night":298.3,"eve":305.11,"morn":299.54},"pressure":1013,"humidity":49,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":2.92,"deg":252,"clouds":17,"rain":1.4},{"dt":1722528000,"sunrise":1722506939,"sunset":1722557958,"temp":{"day":300.17,"min":295.89,"max":300.17,"night":295.89,"eve":298.02,"morn":295.95},"feels_like":{"day":301.87,"night":296.62,"eve":298.7,"morn":296.4},"pressure":1017,"humidity":68,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":3.37,"deg":51,"clouds":78,"rain":4.87},{"dt":1722614400,"sunrise":1722593393,"sunset":1722644296,"temp":{"day":295.89,"min":295.89,"max":295.89,"night":295.89,"eve":295.89,"morn":295.89},"feels_like":{"day":296.62,"night":296.62,"eve":296.62,"morn":296.62},"pressure":1017,"humidity":92,"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"speed":1.31,"deg":79,"clouds":76,"rain":0.27}]}' + recorded_at: Thu, 04 Jul 2024 19:55:42 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/open_weather/forecast/thirty_day_forecast_spec.rb b/spec/open_weather/forecast/thirty_day_forecast_spec.rb new file mode 100644 index 0000000..7a18f4a --- /dev/null +++ b/spec/open_weather/forecast/thirty_day_forecast_spec.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'thirty day forecast' do + include_context 'API client' + + it 'mostly sunny', vcr: { cassette_name: 'forecast/thirty_day' } do + data = client.thirty_day_forecast(lat: 33.5312, lon: -111.9426) + + expect(data).to be_a OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay + expect(data.cnt).to eq 29 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list.first.tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::ThirtyDay::Forecast + expect(forecast.dt).to be_a Time + expect(forecast.sunrise).to be_a Time + expect(forecast.sunset).to be_a Time + expect(forecast.temp).to be_a OpenWeather::Models::Forecast::ThirtyDay::Temp + expect(forecast.feels_like).to be_a OpenWeather::Models::OneCall::FeelsLike + expect(forecast.pressure).to eq 1013 + expect(forecast.humidity).to eq 24 + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.speed).to eq 5.41 + expect(forecast.deg).to eq 241 + expect(forecast.clouds).to eq 78 + expect(forecast.rain).to be_nil + expect(forecast.snow).to be_nil + end + end + + it 'snowy', vcr: { cassette_name: 'forecast/thirty_day' } do + data = client.thirty_day_forecast(lat: 82.8628, lon: 135.0000) + + expect(data).to be_a OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay + expect(data.cnt).to eq 29 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list.first.tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::ThirtyDay::Forecast + expect(forecast.dt).to be_a Time + expect(forecast.sunrise).to be_a Time + expect(forecast.sunset).to be_a Time + expect(forecast.temp).to be_a OpenWeather::Models::Forecast::ThirtyDay::Temp + expect(forecast.feels_like).to be_a OpenWeather::Models::OneCall::FeelsLike + expect(forecast.pressure).to eq 1011 + expect(forecast.humidity).to eq 93 + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.speed).to eq 3.5 + expect(forecast.deg).to eq 332 + expect(forecast.clouds).to eq 15 + expect(forecast.rain).to be_nil + expect(forecast.snow).to eq 0.14 + end + end + + it 'rainy', vcr: { cassette_name: 'forecast/thirty_day' } do + data = client.thirty_day_forecast(lat: 39.00801, lon: -76.97647) + + expect(data).to be_a OpenWeather::Models::Forecast::ThirtyDay::ThirtyDay + expect(data.cnt).to eq 30 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list.first.tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::ThirtyDay::Forecast + expect(forecast.dt).to be_a Time + expect(forecast.sunrise).to be_a Time + expect(forecast.sunset).to be_a Time + expect(forecast.temp).to be_a OpenWeather::Models::Forecast::ThirtyDay::Temp + expect(forecast.feels_like).to be_a OpenWeather::Models::OneCall::FeelsLike + expect(forecast.pressure).to eq 1012 + expect(forecast.humidity).to eq 48 + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.speed).to eq 4.88 + expect(forecast.deg).to eq 196 + expect(forecast.clouds).to eq 61 + expect(forecast.rain).to eq 0.51 + expect(forecast.snow).to be_nil + end + end +end From 99e637c830c647f11400f8e41e551820d35ed4c5 Mon Sep 17 00:00:00 2001 From: Troy Anderson Date: Sun, 7 Jul 2024 14:47:41 -0700 Subject: [PATCH 5/6] Fixed rubocop line length issues --- .../models/forecast/thirty_day/forecast.rb | 4 ++-- lib/open_weather/models/forecast/thirty_day/temp.rb | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/open_weather/models/forecast/thirty_day/forecast.rb b/lib/open_weather/models/forecast/thirty_day/forecast.rb index 3816630..62db73b 100644 --- a/lib/open_weather/models/forecast/thirty_day/forecast.rb +++ b/lib/open_weather/models/forecast/thirty_day/forecast.rb @@ -16,8 +16,8 @@ class Forecast < Model property 'speed' # Wind speed. Unit Default: meter/sec, Metric: meter/sec, Imperial: miles/hour property 'deg' # Wind direction, degrees (meteorological) property 'clouds' # Cloudiness, % (e.g. integer 78 means 78% cloudiness) - property 'rain' # Precipitation volume, mm. Please note that only mm as units of measurement are available for this parameter - property 'snow' # Snow volume, mm. Please note that only mm as units of measurement are available for this parameter + property 'rain' # Precipitation volume, mm. Unit will only be in mm + property 'snow' # Snow volume, mm. Unit will only be in mm def initialize(args = nil, options = {}) super args, options diff --git a/lib/open_weather/models/forecast/thirty_day/temp.rb b/lib/open_weather/models/forecast/thirty_day/temp.rb index 3275d24..fb13621 100644 --- a/lib/open_weather/models/forecast/thirty_day/temp.rb +++ b/lib/open_weather/models/forecast/thirty_day/temp.rb @@ -5,12 +5,12 @@ module Models module Forecast module ThirtyDay class Temp < Model - temperature_property 'day' # Day temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit - temperature_property 'min' # Min daily temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit - temperature_property 'max' # Max daily temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit - temperature_property 'night' # Night temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit - temperature_property 'eve' # Evening temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit - temperature_property 'morn' # Morning temperature. Unit Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'day' # Day temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'min' # Min daily temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'max' # Max daily temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'night' # Night temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'eve' # Evening temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit + temperature_property 'morn' # Morning temperature. Default: Kelvin, Metric: Celsius, Imperial: Fahrenheit end end end From b9004f889043ce0b97c7f477091e51922c0ae9a2 Mon Sep 17 00:00:00 2001 From: Troy Anderson Date: Thu, 4 Jul 2024 12:02:54 -0700 Subject: [PATCH 6/6] Added additional VCR responses from openweather that includes all data types - i.e. rain and snow --- CHANGELOG.md | 1 + .../fixtures/open_weather/forecast/hourly.yml | 421 +++++++++++++++++- spec/open_weather/forecast/hourly_spec.rb | 62 ++- 3 files changed, 472 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cd6c49..0d670f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ### 0.5.1 (Next) * [#40](https://github.com/dblock/open-weather-ruby-client/pull/40): Fixing rubocop violations and improved .rubocop.yml - [@troya2](https://github.com/troya2). +* [#41](https://github.com/dblock/open-weather-ruby-client/pull/41): Added additional tests for hourly forecast that include all data types - i.e. rain and snow - [@troya2](https://github.com/troya2). * [#42](https://github.com/dblock/open-weather-ruby-client/pull/42): Added support for the thirty day forecast in the pro 2.5 API - [@troya2](https://github.com/troya2). * Your contribution here. diff --git a/spec/fixtures/open_weather/forecast/hourly.yml b/spec/fixtures/open_weather/forecast/hourly.yml index 4ef759e..a9aa74f 100644 --- a/spec/fixtures/open_weather/forecast/hourly.yml +++ b/spec/fixtures/open_weather/forecast/hourly.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://pro.openweathermap.org/data/2.5/forecast/hourly?appid=api-key&lat=33.5312&lon=-111.9426 + uri: https://pro.openweathermap.org/data/2.5/forecast/hourly?appid=api-key&lat=82.8628&lon=135.0 body: encoding: US-ASCII string: '' @@ -23,15 +23,15 @@ http_interactions: Server: - openresty Date: - - Tue, 02 Jul 2024 20:52:29 GMT + - Thu, 04 Jul 2024 18:35:22 GMT Content-Type: - application/json; charset=utf-8 Content-Length: - - '1845' + - '38505' Connection: - keep-alive X-Cache-Key: - - "/data/2.5/forecast/hourly?lat=33.53&lon=-111.94" + - "/data/2.5/forecast/hourly?lat=82.86&lon=135" Access-Control-Allow-Origin: - "*" Access-Control-Allow-Credentials: @@ -40,6 +40,415 @@ http_interactions: - GET, POST body: encoding: UTF-8 - string: '{"city":{"coord":{"lat":44.34,"lon":10.99},"country":"IT","id":3163858,"name":"Zocca","population":4593,"sunrise":1661834187,"sunset":1661882248,"timezone":7200},"cnt":96,"cod":"200","list":[{"clouds":{"all":97},"dt":1661875200,"dt_txt":"2022-08-30 16:00:00","main":{"feels_like":296.02,"grnd_level":933,"humidity":50,"pressure":1015,"sea_level":1015,"temp":296.34,"temp_kf":-1.9,"temp_max":298.24,"temp_min":296.34},"pop":0.32,"rain":{"1h":0.13},"sys":{"pod":"d"},"visibility":10000,"weather":[{"description":"light rain","icon":"10d","id":500,"main":"Rain"}],"wind":{"deg":66,"gust":2.16,"speed":1.06}},{"clouds":{"all":95},"dt":1661878800,"dt_txt":"2022-08-30 17:00:00","main":{"feels_like":296.07,"grnd_level":932,"humidity":53,"pressure":1015,"sea_level":1015,"temp":296.31,"temp_kf":0.11,"temp_max":296.31,"temp_min":296.2},"pop":0.4,"rain":{"1h":0.24},"sys":{"pod":"d"},"visibility":10000,"weather":[{"description":"light rain","icon":"10d","id":500,"main":"Rain"}],"wind":{"deg":103,"gust":3.52,"speed":1.58}},{"clouds":{"all":93},"dt":1661882400,"dt_txt":"2022-08-30 18:00:00","main":{"feels_like":294.74,"grnd_level":931,"humidity":60,"pressure":1015,"sea_level":1015,"temp":294.94,"temp_kf":2.1,"temp_max":294.94,"temp_min":292.84},"pop":0.33,"rain":{"1h":0.2},"sys":{"pod":"n"},"visibility":10000,"weather":[{"description":"light rain","icon":"10n","id":500,"main":"Rain"}],"wind":{"deg":157,"gust":3.39,"speed":1.97}},{"clouds":{"all":100},"dt":1662217200,"dt_txt":"2022-09-03 15:00:00","main":{"feels_like":293.99,"grnd_level":931,"humidity":65,"pressure":1014,"sea_level":1014,"temp":294.14,"temp_kf":0,"temp_max":294.14,"temp_min":294.14},"pop":0.53,"sys":{"pod":"d"},"visibility":10000,"weather":[{"description":"overcast clouds","icon":"04d","id":804,"main":"Clouds"}],"wind":{"deg":104,"gust":1.92,"speed":0.91}}],"message":0}' - recorded_at: Tue, 02 Jul 2024 20:52:29 GMT + string: '{"cod":"200","message":0,"cnt":96,"list":[{"dt":1720119600,"main":{"temp":273.47,"feels_like":271.03,"temp_min":273.47,"temp_max":273.47,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":56},"wind":{"speed":2.03,"deg":54,"gust":2.52},"visibility":2686,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 19:00:00"},{"dt":1720123200,"main":{"temp":273.42,"feels_like":270.74,"temp_min":273.22,"temp_max":273.42,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":99,"temp_kf":0.2},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":59},"wind":{"speed":2.23,"deg":67,"gust":2.56},"visibility":551,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 20:00:00"},{"dt":1720126800,"main":{"temp":273.32,"feels_like":270.38,"temp_min":273.09,"temp_max":273.32,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0.23},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":66},"wind":{"speed":2.45,"deg":78,"gust":2.84},"visibility":262,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 21:00:00"},{"dt":1720130400,"main":{"temp":273.19,"feels_like":270.77,"temp_min":273.01,"temp_max":273.19,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0.18},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":73},"wind":{"speed":1.98,"deg":81,"gust":2.17},"visibility":356,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 22:00:00"},{"dt":1720134000,"main":{"temp":273.14,"feels_like":270.75,"temp_min":273.06,"temp_max":273.14,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0.08},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":82},"wind":{"speed":1.95,"deg":90,"gust":2.13},"visibility":2166,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 23:00:00"},{"dt":1720137600,"main":{"temp":273.28,"feels_like":270.95,"temp_min":273.28,"temp_max":273.28,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":90},"wind":{"speed":1.92,"deg":99,"gust":2.12},"visibility":1841,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 00:00:00"},{"dt":1720141200,"main":{"temp":273.39,"feels_like":271.15,"temp_min":273.39,"temp_max":273.39,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.86,"deg":105,"gust":1.97},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 01:00:00"},{"dt":1720144800,"main":{"temp":273.32,"feels_like":270.94,"temp_min":273.32,"temp_max":273.32,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.96,"deg":115,"gust":2.15},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 02:00:00"},{"dt":1720148400,"main":{"temp":273.42,"feels_like":271.25,"temp_min":273.42,"temp_max":273.42,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.81,"deg":124,"gust":1.97},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 03:00:00"},{"dt":1720152000,"main":{"temp":273.46,"feels_like":271.63,"temp_min":273.46,"temp_max":273.46,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.58,"deg":134,"gust":1.6},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 04:00:00"},{"dt":1720155600,"main":{"temp":273.48,"feels_like":270.97,"temp_min":273.48,"temp_max":273.48,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.09,"deg":123,"gust":2.22},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 05:00:00"},{"dt":1720159200,"main":{"temp":273.31,"feels_like":270.32,"temp_min":273.31,"temp_max":273.31,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.5,"deg":125,"gust":2.9},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 06:00:00"},{"dt":1720162800,"main":{"temp":273.43,"feels_like":270.64,"temp_min":273.43,"temp_max":273.43,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.33,"deg":142,"gust":2.61},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 07:00:00"},{"dt":1720166400,"main":{"temp":273.43,"feels_like":270.4,"temp_min":273.43,"temp_max":273.43,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.56,"deg":148,"gust":2.87},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 08:00:00"},{"dt":1720170000,"main":{"temp":273.32,"feels_like":270.02,"temp_min":273.32,"temp_max":273.32,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.82,"deg":152,"gust":3.21},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 09:00:00"},{"dt":1720173600,"main":{"temp":273.37,"feels_like":270.1,"temp_min":273.37,"temp_max":273.37,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.79,"deg":154,"gust":3.4},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 10:00:00"},{"dt":1720177200,"main":{"temp":273.52,"feels_like":270.04,"temp_min":273.52,"temp_max":273.52,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.06,"deg":155,"gust":3.64},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 11:00:00"},{"dt":1720180800,"main":{"temp":273.48,"feels_like":269.8,"temp_min":273.48,"temp_max":273.48,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.29,"deg":162,"gust":3.95},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 12:00:00"},{"dt":1720184400,"main":{"temp":273.47,"feels_like":269.85,"temp_min":273.47,"temp_max":273.47,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.22,"deg":173,"gust":3.72},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 13:00:00"},{"dt":1720188000,"main":{"temp":273.46,"feels_like":270.04,"temp_min":273.46,"temp_max":273.46,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.98,"deg":174,"gust":3.56},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 14:00:00"},{"dt":1720191600,"main":{"temp":273.5,"feels_like":269.86,"temp_min":273.5,"temp_max":273.5,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.25,"deg":178,"gust":3.75},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 15:00:00"},{"dt":1720195200,"main":{"temp":273.42,"feels_like":270.02,"temp_min":273.42,"temp_max":273.42,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.95,"deg":172,"gust":3.88},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 16:00:00"},{"dt":1720198800,"main":{"temp":273.55,"feels_like":269.96,"temp_min":273.55,"temp_max":273.55,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.2,"deg":174,"gust":4.15},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 17:00:00"},{"dt":1720202400,"main":{"temp":273.53,"feels_like":269.73,"temp_min":273.53,"temp_max":273.53,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.46,"deg":179,"gust":4.46},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 18:00:00"},{"dt":1720206000,"main":{"temp":273.63,"feels_like":269.86,"temp_min":273.63,"temp_max":273.63,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.45,"deg":181,"gust":4.45},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 19:00:00"},{"dt":1720209600,"main":{"temp":273.61,"feels_like":269.81,"temp_min":273.61,"temp_max":273.61,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.48,"deg":186,"gust":4.58},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 20:00:00"},{"dt":1720213200,"main":{"temp":273.61,"feels_like":269.89,"temp_min":273.61,"temp_max":273.61,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.37,"deg":192,"gust":4.36},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 21:00:00"},{"dt":1720216800,"main":{"temp":273.73,"feels_like":269.95,"temp_min":273.73,"temp_max":273.73,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.48,"deg":195,"gust":4.38},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 22:00:00"},{"dt":1720220400,"main":{"temp":273.78,"feels_like":269.95,"temp_min":273.78,"temp_max":273.78,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.57,"deg":193,"gust":4.55},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 23:00:00"},{"dt":1720224000,"main":{"temp":273.8,"feels_like":269.83,"temp_min":273.8,"temp_max":273.8,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.76,"deg":201,"gust":4.41},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 00:00:00"},{"dt":1720227600,"main":{"temp":273.64,"feels_like":269.67,"temp_min":273.64,"temp_max":273.64,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.71,"deg":199,"gust":4.88},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 01:00:00"},{"dt":1720231200,"main":{"temp":273.6,"feels_like":269.6,"temp_min":273.6,"temp_max":273.6,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.74,"deg":201,"gust":5.1},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 02:00:00"},{"dt":1720234800,"main":{"temp":273.67,"feels_like":269.57,"temp_min":273.67,"temp_max":273.67,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.9,"deg":205,"gust":5.11},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 03:00:00"},{"dt":1720238400,"main":{"temp":273.73,"feels_like":269.47,"temp_min":273.73,"temp_max":273.73,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.17,"deg":212,"gust":5.08},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 04:00:00"},{"dt":1720242000,"main":{"temp":273.67,"feels_like":269.44,"temp_min":273.67,"temp_max":273.67,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.1,"deg":220,"gust":4.95},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 05:00:00"},{"dt":1720245600,"main":{"temp":273.65,"feels_like":269.61,"temp_min":273.65,"temp_max":273.65,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.82,"deg":224,"gust":4.7},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 06:00:00"},{"dt":1720249200,"main":{"temp":273.6,"feels_like":269.58,"temp_min":273.6,"temp_max":273.6,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.77,"deg":228,"gust":4.44},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 07:00:00"},{"dt":1720252800,"main":{"temp":273.52,"feels_like":269.63,"temp_min":273.52,"temp_max":273.52,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.57,"deg":225,"gust":4.84},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 08:00:00"},{"dt":1720256400,"main":{"temp":273.47,"feels_like":269.47,"temp_min":273.47,"temp_max":273.47,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.71,"deg":232,"gust":5.18},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 09:00:00"},{"dt":1720260000,"main":{"temp":273.68,"feels_like":269.77,"temp_min":273.68,"temp_max":273.68,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.64,"deg":230,"gust":5.13},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 10:00:00"},{"dt":1720263600,"main":{"temp":273.65,"feels_like":269.17,"temp_min":273.65,"temp_max":273.65,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":90,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.48,"deg":243,"gust":5.24},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 11:00:00"},{"dt":1720267200,"main":{"temp":273.48,"feels_like":269.75,"temp_min":273.48,"temp_max":273.48,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.36,"deg":236,"gust":5.04},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 12:00:00"},{"dt":1720270800,"main":{"temp":273.6,"feels_like":269.65,"temp_min":273.6,"temp_max":273.6,"pressure":1021,"sea_level":1021,"grnd_level":1021,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.67,"deg":243,"gust":5.56},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 13:00:00"},{"dt":1720274400,"main":{"temp":273.66,"feels_like":270.01,"temp_min":273.66,"temp_max":273.66,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.3,"deg":235,"gust":5.09},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 14:00:00"},{"dt":1720278000,"main":{"temp":273.69,"feels_like":269.87,"temp_min":273.69,"temp_max":273.69,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.53,"deg":235,"gust":5.66},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 15:00:00"},{"dt":1720281600,"main":{"temp":273.71,"feels_like":269.69,"temp_min":273.71,"temp_max":273.71,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.8,"deg":234,"gust":5.8},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 16:00:00"},{"dt":1720285200,"main":{"temp":273.8,"feels_like":269.66,"temp_min":273.8,"temp_max":273.8,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4,"deg":239,"gust":6.53},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 17:00:00"},{"dt":1720288800,"main":{"temp":273.77,"feels_like":269.55,"temp_min":273.77,"temp_max":273.77,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.12,"deg":237,"gust":6.83},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 18:00:00"},{"dt":1720292400,"main":{"temp":273.9,"feels_like":269.63,"temp_min":273.9,"temp_max":273.9,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.24,"deg":240,"gust":7.21},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 19:00:00"},{"dt":1720296000,"main":{"temp":273.85,"feels_like":269.54,"temp_min":273.85,"temp_max":273.85,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.29,"deg":244,"gust":7.8},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 20:00:00"},{"dt":1720299600,"main":{"temp":273.82,"feels_like":269.38,"temp_min":273.82,"temp_max":273.82,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.48,"deg":251,"gust":8.31},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 21:00:00"},{"dt":1720303200,"main":{"temp":273.78,"feels_like":269.28,"temp_min":273.78,"temp_max":273.78,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.56,"deg":252,"gust":7.98},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 22:00:00"},{"dt":1720306800,"main":{"temp":273.78,"feels_like":269.3,"temp_min":273.78,"temp_max":273.78,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.53,"deg":255,"gust":7.72},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 23:00:00"},{"dt":1720310400,"main":{"temp":273.78,"feels_like":269.21,"temp_min":273.78,"temp_max":273.78,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.68,"deg":262,"gust":8.05},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 00:00:00"},{"dt":1720314000,"main":{"temp":273.72,"feels_like":269.19,"temp_min":273.72,"temp_max":273.72,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.59,"deg":256,"gust":7.68},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 01:00:00"},{"dt":1720317600,"main":{"temp":273.7,"feels_like":269.13,"temp_min":273.7,"temp_max":273.7,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.64,"deg":257,"gust":7.97},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 02:00:00"},{"dt":1720321200,"main":{"temp":273.67,"feels_like":268.96,"temp_min":273.67,"temp_max":273.67,"pressure":1020,"sea_level":1020,"grnd_level":1020,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.87,"deg":251,"gust":8.16},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 03:00:00"},{"dt":1720324800,"main":{"temp":273.59,"feels_like":268.75,"temp_min":273.59,"temp_max":273.59,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.06,"deg":254,"gust":8.74},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 04:00:00"},{"dt":1720328400,"main":{"temp":273.59,"feels_like":268.78,"temp_min":273.59,"temp_max":273.59,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5,"deg":253,"gust":8.87},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 05:00:00"},{"dt":1720332000,"main":{"temp":273.53,"feels_like":268.46,"temp_min":273.53,"temp_max":273.53,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.46,"deg":248,"gust":9.46},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 06:00:00"},{"dt":1720335600,"main":{"temp":273.6,"feels_like":268.52,"temp_min":273.6,"temp_max":273.6,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.5,"deg":250,"gust":9.45},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 07:00:00"},{"dt":1720339200,"main":{"temp":273.61,"feels_like":268.35,"temp_min":273.61,"temp_max":273.61,"pressure":1019,"sea_level":1019,"grnd_level":1019,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.86,"deg":250,"gust":9.99},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 08:00:00"},{"dt":1720342800,"main":{"temp":273.49,"feels_like":268.1,"temp_min":273.49,"temp_max":273.49,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":6.06,"deg":241,"gust":9.99},"visibility":10000,"pop":0.49,"rain":{"1h":0.24},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 09:00:00"},{"dt":1720346400,"main":{"temp":273.46,"feels_like":267.65,"temp_min":273.46,"temp_max":273.46,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":6.97,"deg":236,"gust":11.81},"visibility":10000,"pop":0.49,"rain":{"1h":0.28},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 10:00:00"},{"dt":1720350000,"main":{"temp":273.66,"feels_like":267.57,"temp_min":273.66,"temp_max":273.66,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":97,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":7.79,"deg":239,"gust":13.57},"visibility":10000,"pop":0.69,"rain":{"1h":0.34},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 11:00:00"},{"dt":1720353600,"main":{"temp":273.89,"feels_like":267.61,"temp_min":273.89,"temp_max":273.89,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":96,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":8.49,"deg":243,"gust":14.84},"visibility":10000,"pop":0.77,"rain":{"1h":0.61},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 12:00:00"},{"dt":1720357200,"main":{"temp":274.04,"feels_like":267.57,"temp_min":274.04,"temp_max":274.04,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":95,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":9.17,"deg":246,"gust":16.1},"visibility":10000,"pop":0.77,"rain":{"1h":0.27},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 13:00:00"},{"dt":1720360800,"main":{"temp":274.29,"feels_like":268.05,"temp_min":274.29,"temp_max":274.29,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":94,"temp_kf":0},"weather":[{"id":500,"main":"Rain","description":"light + rain","icon":"10d"}],"clouds":{"all":100},"wind":{"speed":8.71,"deg":252,"gust":16.02},"visibility":10000,"pop":0.81,"rain":{"1h":0.43},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 14:00:00"},{"dt":1720364400,"main":{"temp":274.46,"feels_like":268.29,"temp_min":274.46,"temp_max":274.46,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.66,"deg":256,"gust":16.49},"visibility":10000,"pop":0.85,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 15:00:00"},{"dt":1720368000,"main":{"temp":274.59,"feels_like":268.27,"temp_min":274.59,"temp_max":274.59,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":9.21,"deg":256,"gust":16.69},"visibility":10000,"pop":0.77,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 16:00:00"},{"dt":1720371600,"main":{"temp":274.78,"feels_like":268.51,"temp_min":274.78,"temp_max":274.78,"pressure":1014,"sea_level":1014,"grnd_level":1014,"humidity":89,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":9.27,"deg":261,"gust":16.7},"visibility":10000,"pop":0.69,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 17:00:00"},{"dt":1720375200,"main":{"temp":274.93,"feels_like":268.89,"temp_min":274.93,"temp_max":274.93,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":88,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.71,"deg":269,"gust":16.85},"visibility":10000,"pop":0.61,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 18:00:00"},{"dt":1720378800,"main":{"temp":275.04,"feels_like":269.14,"temp_min":275.04,"temp_max":275.04,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":87,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.41,"deg":274,"gust":15.77},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 19:00:00"},{"dt":1720382400,"main":{"temp":274.99,"feels_like":269.19,"temp_min":274.99,"temp_max":274.99,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":87,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.06,"deg":277,"gust":15.02},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 20:00:00"},{"dt":1720386000,"main":{"temp":274.72,"feels_like":269.08,"temp_min":274.72,"temp_max":274.72,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":88,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":7.44,"deg":279,"gust":14.29},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 21:00:00"},{"dt":1720389600,"main":{"temp":274.58,"feels_like":269.05,"temp_min":274.58,"temp_max":274.58,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":90,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":7.05,"deg":278,"gust":12.57},"visibility":10000,"pop":0.09,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 22:00:00"},{"dt":1720393200,"main":{"temp":274.47,"feels_like":269.06,"temp_min":274.47,"temp_max":274.47,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":91,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.69,"deg":278,"gust":12.09},"visibility":10000,"pop":0.05,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 23:00:00"},{"dt":1720396800,"main":{"temp":274.37,"feels_like":269.05,"temp_min":274.37,"temp_max":274.37,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.43,"deg":277,"gust":11.65},"visibility":10000,"pop":0.04,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 00:00:00"},{"dt":1720400400,"main":{"temp":274.26,"feels_like":269.14,"temp_min":274.26,"temp_max":274.26,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.94,"deg":283,"gust":10.92},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 01:00:00"},{"dt":1720404000,"main":{"temp":274.12,"feels_like":269.2,"temp_min":274.12,"temp_max":274.12,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.45,"deg":289,"gust":9.82},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 02:00:00"},{"dt":1720407600,"main":{"temp":273.96,"feels_like":269.16,"temp_min":273.96,"temp_max":273.96,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.16,"deg":289,"gust":8.77},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 03:00:00"},{"dt":1720411200,"main":{"temp":273.91,"feels_like":269.29,"temp_min":273.91,"temp_max":273.91,"pressure":1015,"sea_level":1015,"grnd_level":1015,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.82,"deg":290,"gust":7.99},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 04:00:00"},{"dt":1720414800,"main":{"temp":273.85,"feels_like":269.43,"temp_min":273.85,"temp_max":273.85,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.45,"deg":291,"gust":7.49},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 05:00:00"},{"dt":1720418400,"main":{"temp":273.73,"feels_like":269.5,"temp_min":273.73,"temp_max":273.73,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":4.11,"deg":294,"gust":6.91},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 06:00:00"},{"dt":1720422000,"main":{"temp":273.7,"feels_like":269.63,"temp_min":273.7,"temp_max":273.7,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":91},"wind":{"speed":3.87,"deg":289,"gust":6.13},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 07:00:00"},{"dt":1720425600,"main":{"temp":273.59,"feels_like":269.54,"temp_min":273.59,"temp_max":273.59,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":96},"wind":{"speed":3.81,"deg":286,"gust":5.82},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 08:00:00"},{"dt":1720429200,"main":{"temp":273.54,"feels_like":269.39,"temp_min":273.54,"temp_max":273.54,"pressure":1016,"sea_level":1016,"grnd_level":1016,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":97},"wind":{"speed":3.93,"deg":286,"gust":5.53},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 09:00:00"},{"dt":1720432800,"main":{"temp":273.52,"feels_like":269.4,"temp_min":273.52,"temp_max":273.52,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":3.89,"deg":285,"gust":5.42},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 10:00:00"},{"dt":1720436400,"main":{"temp":273.45,"feels_like":269.5,"temp_min":273.45,"temp_max":273.45,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":3.63,"deg":283,"gust":5.29},"visibility":9702,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 11:00:00"},{"dt":1720440000,"main":{"temp":273.42,"feels_like":269.56,"temp_min":273.42,"temp_max":273.42,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":3.5,"deg":277,"gust":5.4},"visibility":921,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 12:00:00"},{"dt":1720443600,"main":{"temp":273.4,"feels_like":269.93,"temp_min":273.4,"temp_max":273.4,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.02,"deg":274,"gust":4.67},"visibility":378,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 13:00:00"},{"dt":1720447200,"main":{"temp":273.32,"feels_like":269.79,"temp_min":273.32,"temp_max":273.32,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.07,"deg":271,"gust":4.13},"visibility":6499,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 14:00:00"},{"dt":1720450800,"main":{"temp":273.32,"feels_like":269.87,"temp_min":273.32,"temp_max":273.32,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.98,"deg":255,"gust":4.05},"visibility":414,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 15:00:00"},{"dt":1720454400,"main":{"temp":273.39,"feels_like":269.68,"temp_min":273.39,"temp_max":273.39,"pressure":1017,"sea_level":1017,"grnd_level":1017,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.3,"deg":247,"gust":4.58},"visibility":225,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 16:00:00"},{"dt":1720458000,"main":{"temp":273.32,"feels_like":269.72,"temp_min":273.32,"temp_max":273.32,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.16,"deg":242,"gust":4.61},"visibility":136,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 17:00:00"},{"dt":1720461600,"main":{"temp":273.28,"feels_like":269.49,"temp_min":273.28,"temp_max":273.28,"pressure":1018,"sea_level":1018,"grnd_level":1018,"humidity":99,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.38,"deg":243,"gust":4.63},"visibility":439,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 18:00:00"}],"city":{"id":0,"name":"","coord":{"lat":82.8628,"lon":135},"country":"","population":0,"timezone":32400,"sunrise":0,"sunset":0}}' + recorded_at: Thu, 04 Jul 2024 18:35:22 GMT +- request: + method: get + uri: https://pro.openweathermap.org/data/2.5/forecast/hourly?appid=api-key&lat=-70.8696&lon=-75.11441 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - application/json; charset=utf-8 + Content-Type: + - application/json + User-Agent: + - OpenWeather Ruby Client/0.5.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - openresty + Date: + - Thu, 04 Jul 2024 18:52:05 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '38448' + Connection: + - keep-alive + X-Cache-Key: + - "/data/2.5/forecast/hourly?lat=-70.87&lon=-75.11" + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET, POST + body: + encoding: UTF-8 + string: '{"cod":"200","message":0,"cnt":96,"list":[{"dt":1720119600,"main":{"temp":265.96,"feels_like":258.96,"temp_min":265.96,"temp_max":265.96,"pressure":1000,"sea_level":1000,"grnd_level":951,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":15.75,"deg":340,"gust":23.86},"visibility":111,"pop":1,"snow":{"1h":1.3},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 19:00:00"},{"dt":1720123200,"main":{"temp":266.07,"feels_like":259.07,"temp_min":266.07,"temp_max":266.52,"pressure":1000,"sea_level":1000,"grnd_level":950,"humidity":95,"temp_kf":-0.45},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":15.03,"deg":339,"gust":23.02},"visibility":105,"pop":1,"snow":{"1h":1.28},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 20:00:00"},{"dt":1720126800,"main":{"temp":266.62,"feels_like":259.62,"temp_min":266.62,"temp_max":267.6,"pressure":1000,"sea_level":1000,"grnd_level":950,"humidity":95,"temp_kf":-0.98},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":14.27,"deg":335,"gust":21.47},"visibility":107,"pop":0.98,"snow":{"1h":1.47},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 21:00:00"},{"dt":1720130400,"main":{"temp":267.24,"feels_like":260.24,"temp_min":267.24,"temp_max":268.1,"pressure":999,"sea_level":999,"grnd_level":950,"humidity":95,"temp_kf":-0.86},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":13.65,"deg":330,"gust":20.36},"visibility":117,"pop":0.98,"snow":{"1h":1.41},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 22:00:00"},{"dt":1720134000,"main":{"temp":267.82,"feels_like":260.82,"temp_min":267.82,"temp_max":268.28,"pressure":999,"sea_level":999,"grnd_level":950,"humidity":95,"temp_kf":-0.46},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":12.8,"deg":329,"gust":19.36},"visibility":124,"pop":0.98,"snow":{"1h":1.32},"sys":{"pod":"d"},"dt_txt":"2024-07-04 + 23:00:00"},{"dt":1720137600,"main":{"temp":268.42,"feels_like":261.42,"temp_min":268.42,"temp_max":268.42,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":95,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":12.09,"deg":326,"gust":18.35},"visibility":131,"pop":0.98,"snow":{"1h":1.3},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 00:00:00"},{"dt":1720141200,"main":{"temp":268.44,"feels_like":261.44,"temp_min":268.44,"temp_max":268.44,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":95,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.3,"deg":324,"gust":17.19},"visibility":154,"pop":1,"snow":{"1h":1.2},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 01:00:00"},{"dt":1720144800,"main":{"temp":268.49,"feels_like":261.49,"temp_min":268.49,"temp_max":268.49,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":96,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":10.13,"deg":320,"gust":15.74},"visibility":151,"pop":1,"snow":{"1h":1.06},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 02:00:00"},{"dt":1720148400,"main":{"temp":268.33,"feels_like":261.33,"temp_min":268.33,"temp_max":268.33,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":97,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":7.82,"deg":309,"gust":12.62},"visibility":95,"pop":1,"snow":{"1h":1.09},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 03:00:00"},{"dt":1720152000,"main":{"temp":267.82,"feels_like":262.03,"temp_min":267.82,"temp_max":267.82,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":97,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":4.36,"deg":288,"gust":8.02},"visibility":95,"pop":1,"snow":{"1h":0.94},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 04:00:00"},{"dt":1720155600,"main":{"temp":267.15,"feels_like":262.73,"temp_min":267.15,"temp_max":267.15,"pressure":998,"sea_level":998,"grnd_level":949,"humidity":97,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":2.74,"deg":245,"gust":4.44},"visibility":160,"pop":1,"snow":{"1h":0.57},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 05:00:00"},{"dt":1720159200,"main":{"temp":266.61,"feels_like":261.43,"temp_min":266.61,"temp_max":266.61,"pressure":999,"sea_level":999,"grnd_level":950,"humidity":96,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.35,"deg":224,"gust":5.15},"visibility":307,"pop":1,"snow":{"1h":0.25},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 06:00:00"},{"dt":1720162800,"main":{"temp":266.05,"feels_like":261.07,"temp_min":266.05,"temp_max":266.05,"pressure":1000,"sea_level":1000,"grnd_level":950,"humidity":96,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.05,"deg":216,"gust":4.4},"visibility":472,"pop":0.75,"snow":{"1h":0.19},"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 07:00:00"},{"dt":1720166400,"main":{"temp":265.26,"feels_like":260.54,"temp_min":265.26,"temp_max":265.26,"pressure":1000,"sea_level":1000,"grnd_level":951,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.69,"deg":207,"gust":3.29},"visibility":8256,"pop":0.67,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 08:00:00"},{"dt":1720170000,"main":{"temp":262.92,"feels_like":257.83,"temp_min":262.92,"temp_max":262.92,"pressure":1001,"sea_level":1001,"grnd_level":951,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.63,"deg":198,"gust":2.79},"visibility":8322,"pop":0.32,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 09:00:00"},{"dt":1720173600,"main":{"temp":260.99,"feels_like":255.29,"temp_min":260.99,"temp_max":260.99,"pressure":1002,"sea_level":1002,"grnd_level":951,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":92},"wind":{"speed":2.81,"deg":198,"gust":3.11},"visibility":9537,"pop":0.3,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 10:00:00"},{"dt":1720177200,"main":{"temp":260.34,"feels_like":254.12,"temp_min":260.34,"temp_max":260.34,"pressure":1003,"sea_level":1003,"grnd_level":952,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":86},"wind":{"speed":3.11,"deg":205,"gust":3.65},"visibility":10000,"pop":0.14,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 11:00:00"},{"dt":1720180800,"main":{"temp":259.42,"feels_like":252.42,"temp_min":259.42,"temp_max":259.42,"pressure":1003,"sea_level":1003,"grnd_level":952,"humidity":94,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":80},"wind":{"speed":3.72,"deg":209,"gust":4.56},"visibility":10000,"pop":0.01,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 12:00:00"},{"dt":1720184400,"main":{"temp":258.51,"feels_like":251.51,"temp_min":258.51,"temp_max":258.51,"pressure":1004,"sea_level":1004,"grnd_level":953,"humidity":90,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":10},"wind":{"speed":3.62,"deg":208,"gust":4.42},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 13:00:00"},{"dt":1720188000,"main":{"temp":258.17,"feels_like":251.17,"temp_min":258.17,"temp_max":258.17,"pressure":1005,"sea_level":1005,"grnd_level":953,"humidity":83,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":8},"wind":{"speed":3.96,"deg":210,"gust":4.97},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 14:00:00"},{"dt":1720191600,"main":{"temp":257.81,"feels_like":250.81,"temp_min":257.81,"temp_max":257.81,"pressure":1005,"sea_level":1005,"grnd_level":954,"humidity":78,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":6},"wind":{"speed":3.62,"deg":210,"gust":4.23},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 15:00:00"},{"dt":1720195200,"main":{"temp":257.7,"feels_like":250.7,"temp_min":257.7,"temp_max":257.7,"pressure":1005,"sea_level":1005,"grnd_level":954,"humidity":74,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":5},"wind":{"speed":3.85,"deg":211,"gust":4.29},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 16:00:00"},{"dt":1720198800,"main":{"temp":257.5,"feels_like":250.5,"temp_min":257.5,"temp_max":257.5,"pressure":1006,"sea_level":1006,"grnd_level":954,"humidity":73,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":4},"wind":{"speed":3.93,"deg":212,"gust":4.56},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 17:00:00"},{"dt":1720202400,"main":{"temp":257.2,"feels_like":250.2,"temp_min":257.2,"temp_max":257.2,"pressure":1007,"sea_level":1007,"grnd_level":955,"humidity":72,"temp_kf":0},"weather":[{"id":800,"main":"Clear","description":"clear + sky","icon":"01d"}],"clouds":{"all":9},"wind":{"speed":3.82,"deg":213,"gust":4.35},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 18:00:00"},{"dt":1720206000,"main":{"temp":257.11,"feels_like":250.11,"temp_min":257.11,"temp_max":257.11,"pressure":1007,"sea_level":1007,"grnd_level":955,"humidity":72,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"clouds":{"all":37},"wind":{"speed":3.76,"deg":218,"gust":4.25},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 19:00:00"},{"dt":1720209600,"main":{"temp":256.94,"feels_like":249.94,"temp_min":256.94,"temp_max":256.94,"pressure":1008,"sea_level":1008,"grnd_level":956,"humidity":77,"temp_kf":0},"weather":[{"id":802,"main":"Clouds","description":"scattered + clouds","icon":"03d"}],"clouds":{"all":38},"wind":{"speed":3.52,"deg":220,"gust":4},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 20:00:00"},{"dt":1720213200,"main":{"temp":256.83,"feels_like":250.1,"temp_min":256.83,"temp_max":256.83,"pressure":1008,"sea_level":1008,"grnd_level":956,"humidity":84,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":59},"wind":{"speed":2.96,"deg":235,"gust":3.38},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 21:00:00"},{"dt":1720216800,"main":{"temp":256.93,"feels_like":250.95,"temp_min":256.93,"temp_max":256.93,"pressure":1008,"sea_level":1008,"grnd_level":957,"humidity":90,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":69},"wind":{"speed":2.48,"deg":248,"gust":2.87},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 22:00:00"},{"dt":1720220400,"main":{"temp":256.15,"feels_like":251.48,"temp_min":256.15,"temp_max":256.15,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":93,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":75},"wind":{"speed":1.72,"deg":262,"gust":2.1},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-05 + 23:00:00"},{"dt":1720224000,"main":{"temp":255.07,"feels_like":255.07,"temp_min":255.07,"temp_max":255.07,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":95,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":78},"wind":{"speed":1.3,"deg":283,"gust":1.46},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 00:00:00"},{"dt":1720227600,"main":{"temp":254.22,"feels_like":254.22,"temp_min":254.22,"temp_max":254.22,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":94},"wind":{"speed":1.13,"deg":302,"gust":1.46},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 01:00:00"},{"dt":1720231200,"main":{"temp":255,"feels_like":250.78,"temp_min":255,"temp_max":255,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":97},"wind":{"speed":1.47,"deg":296,"gust":1.86},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 02:00:00"},{"dt":1720234800,"main":{"temp":254.31,"feels_like":249.94,"temp_min":254.31,"temp_max":254.31,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":1.49,"deg":301,"gust":2.08},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 03:00:00"},{"dt":1720238400,"main":{"temp":253.44,"feels_like":249.17,"temp_min":253.44,"temp_max":253.44,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":98},"wind":{"speed":1.41,"deg":312,"gust":1.99},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 04:00:00"},{"dt":1720242000,"main":{"temp":253.98,"feels_like":249.98,"temp_min":253.98,"temp_max":253.98,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":1.34,"deg":326,"gust":1.94},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 05:00:00"},{"dt":1720245600,"main":{"temp":252.16,"feels_like":247.89,"temp_min":252.16,"temp_max":252.16,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":1.35,"deg":349,"gust":1.92},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 06:00:00"},{"dt":1720249200,"main":{"temp":252.79,"feels_like":247.45,"temp_min":252.79,"temp_max":252.79,"pressure":1009,"sea_level":1009,"grnd_level":957,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":1.79,"deg":2,"gust":2.31},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 07:00:00"},{"dt":1720252800,"main":{"temp":253.35,"feels_like":247.47,"temp_min":253.35,"temp_max":253.35,"pressure":1009,"sea_level":1009,"grnd_level":956,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.08,"deg":10,"gust":2.59},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 08:00:00"},{"dt":1720256400,"main":{"temp":254.83,"feels_like":248.13,"temp_min":254.83,"temp_max":254.83,"pressure":1008,"sea_level":1008,"grnd_level":956,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.68,"deg":14,"gust":3.17},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 09:00:00"},{"dt":1720260000,"main":{"temp":254.78,"feels_like":247.78,"temp_min":254.78,"temp_max":254.78,"pressure":1008,"sea_level":1008,"grnd_level":956,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.13,"deg":18,"gust":3.95},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 10:00:00"},{"dt":1720263600,"main":{"temp":254.58,"feels_like":247.58,"temp_min":254.58,"temp_max":254.58,"pressure":1008,"sea_level":1008,"grnd_level":955,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.43,"deg":18,"gust":4.55},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 11:00:00"},{"dt":1720267200,"main":{"temp":256.12,"feels_like":249.12,"temp_min":256.12,"temp_max":256.12,"pressure":1006,"sea_level":1006,"grnd_level":955,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4,"deg":20,"gust":6.04},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 12:00:00"},{"dt":1720270800,"main":{"temp":257.42,"feels_like":250.42,"temp_min":257.42,"temp_max":257.42,"pressure":1005,"sea_level":1005,"grnd_level":954,"humidity":89,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.42,"deg":20,"gust":8.36},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 13:00:00"},{"dt":1720274400,"main":{"temp":258.27,"feels_like":251.27,"temp_min":258.27,"temp_max":258.27,"pressure":1004,"sea_level":1004,"grnd_level":953,"humidity":87,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.06,"deg":20,"gust":10.05},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 14:00:00"},{"dt":1720278000,"main":{"temp":258.96,"feels_like":251.96,"temp_min":258.96,"temp_max":258.96,"pressure":1003,"sea_level":1003,"grnd_level":952,"humidity":84,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.92,"deg":19,"gust":11.85},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 15:00:00"},{"dt":1720281600,"main":{"temp":259.01,"feels_like":252.01,"temp_min":259.01,"temp_max":259.01,"pressure":1002,"sea_level":1002,"grnd_level":951,"humidity":84,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.83,"deg":23,"gust":13.22},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 16:00:00"},{"dt":1720285200,"main":{"temp":258.51,"feels_like":251.51,"temp_min":258.51,"temp_max":258.51,"pressure":1001,"sea_level":1001,"grnd_level":949,"humidity":85,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":7.43,"deg":26,"gust":14.6},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 17:00:00"},{"dt":1720288800,"main":{"temp":258.95,"feels_like":251.95,"temp_min":258.95,"temp_max":258.95,"pressure":999,"sea_level":999,"grnd_level":948,"humidity":84,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":8.99,"deg":21,"gust":16.88},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 18:00:00"},{"dt":1720292400,"main":{"temp":259.42,"feels_like":252.42,"temp_min":259.42,"temp_max":259.42,"pressure":997,"sea_level":997,"grnd_level":946,"humidity":85,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":10.44,"deg":14,"gust":18.54},"visibility":10000,"pop":0.16,"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 19:00:00"},{"dt":1720296000,"main":{"temp":259.96,"feels_like":252.96,"temp_min":259.96,"temp_max":259.96,"pressure":995,"sea_level":995,"grnd_level":944,"humidity":94,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.71,"deg":16,"gust":20.52},"visibility":170,"pop":0.43,"snow":{"1h":0.31},"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 20:00:00"},{"dt":1720299600,"main":{"temp":260.49,"feels_like":253.49,"temp_min":260.49,"temp_max":260.49,"pressure":993,"sea_level":993,"grnd_level":943,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":12.32,"deg":12,"gust":20.23},"visibility":161,"pop":0.72,"snow":{"1h":0.9},"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 21:00:00"},{"dt":1720303200,"main":{"temp":261.14,"feels_like":254.14,"temp_min":261.14,"temp_max":261.14,"pressure":991,"sea_level":991,"grnd_level":941,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.83,"deg":12,"gust":20.41},"visibility":150,"pop":0.75,"snow":{"1h":1.21},"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 22:00:00"},{"dt":1720306800,"main":{"temp":262.15,"feels_like":255.15,"temp_min":262.15,"temp_max":262.15,"pressure":990,"sea_level":990,"grnd_level":940,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.05,"deg":3,"gust":19.13},"visibility":139,"pop":0.85,"snow":{"1h":2.01},"sys":{"pod":"d"},"dt_txt":"2024-07-06 + 23:00:00"},{"dt":1720310400,"main":{"temp":264.38,"feels_like":257.38,"temp_min":264.38,"temp_max":264.38,"pressure":988,"sea_level":988,"grnd_level":939,"humidity":94,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.8,"deg":352,"gust":19.84},"visibility":110,"pop":0.95,"snow":{"1h":2.05},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 00:00:00"},{"dt":1720314000,"main":{"temp":266.18,"feels_like":259.18,"temp_min":266.18,"temp_max":266.18,"pressure":987,"sea_level":987,"grnd_level":938,"humidity":95,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":12.3,"deg":345,"gust":19.21},"visibility":115,"pop":1,"snow":{"1h":1.8},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 01:00:00"},{"dt":1720317600,"main":{"temp":267.61,"feels_like":260.61,"temp_min":267.61,"temp_max":267.61,"pressure":986,"sea_level":986,"grnd_level":937,"humidity":95,"temp_kf":0},"weather":[{"id":601,"main":"Snow","description":"snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":11.76,"deg":331,"gust":17.19},"visibility":127,"pop":1,"snow":{"1h":1.06},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 02:00:00"},{"dt":1720321200,"main":{"temp":266.91,"feels_like":259.91,"temp_min":266.91,"temp_max":266.91,"pressure":986,"sea_level":986,"grnd_level":937,"humidity":90,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":9.8,"deg":287,"gust":13.51},"visibility":10000,"pop":0.92,"snow":{"1h":0.29},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 03:00:00"},{"dt":1720324800,"main":{"temp":262.75,"feels_like":255.75,"temp_min":262.75,"temp_max":262.75,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":7.08,"deg":296,"gust":11.7},"visibility":2416,"pop":0.88,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 04:00:00"},{"dt":1720328400,"main":{"temp":261.69,"feels_like":254.69,"temp_min":261.69,"temp_max":261.69,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.82,"deg":293,"gust":11.73},"visibility":1741,"pop":0.81,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 05:00:00"},{"dt":1720332000,"main":{"temp":261.28,"feels_like":254.28,"temp_min":261.28,"temp_max":261.28,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":92,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":6.49,"deg":295,"gust":12.01},"visibility":3817,"pop":0.81,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 06:00:00"},{"dt":1720335600,"main":{"temp":260.88,"feels_like":253.88,"temp_min":260.88,"temp_max":260.88,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":5.86,"deg":295,"gust":10.62},"visibility":2459,"pop":0.27,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 07:00:00"},{"dt":1720339200,"main":{"temp":261.12,"feels_like":254.12,"temp_min":261.12,"temp_max":261.12,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":94,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":5.05,"deg":301,"gust":9.77},"visibility":640,"pop":0.64,"snow":{"1h":0.19},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 08:00:00"},{"dt":1720342800,"main":{"temp":261.44,"feels_like":254.44,"temp_min":261.44,"temp_max":261.44,"pressure":987,"sea_level":987,"grnd_level":937,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":4.21,"deg":311,"gust":7.7},"visibility":507,"pop":0.84,"snow":{"1h":0.19},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 09:00:00"},{"dt":1720346400,"main":{"temp":261.5,"feels_like":254.57,"temp_min":261.5,"temp_max":261.5,"pressure":986,"sea_level":986,"grnd_level":936,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.98,"deg":330,"gust":6.14},"visibility":953,"pop":0.84,"snow":{"1h":0.18},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 10:00:00"},{"dt":1720350000,"main":{"temp":261.5,"feels_like":254.6,"temp_min":261.5,"temp_max":261.5,"pressure":986,"sea_level":986,"grnd_level":936,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.95,"deg":337,"gust":5.44},"visibility":985,"pop":0.8,"snow":{"1h":0.19},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 11:00:00"},{"dt":1720353600,"main":{"temp":261.9,"feels_like":255.71,"temp_min":261.9,"temp_max":261.9,"pressure":986,"sea_level":986,"grnd_level":936,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.36,"deg":334,"gust":4.44},"visibility":354,"pop":0.84,"snow":{"1h":0.2},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 12:00:00"},{"dt":1720357200,"main":{"temp":262.27,"feels_like":256.17,"temp_min":262.27,"temp_max":262.27,"pressure":986,"sea_level":986,"grnd_level":937,"humidity":97,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":3.35,"deg":282,"gust":6.58},"visibility":252,"pop":0.85,"snow":{"1h":0.17},"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 13:00:00"},{"dt":1720360800,"main":{"temp":259.68,"feels_like":252.68,"temp_min":259.68,"temp_max":259.68,"pressure":988,"sea_level":988,"grnd_level":938,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":9.36,"deg":245,"gust":14.26},"visibility":9564,"pop":0.54,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 14:00:00"},{"dt":1720364400,"main":{"temp":256.42,"feels_like":249.42,"temp_min":256.42,"temp_max":256.42,"pressure":990,"sea_level":990,"grnd_level":939,"humidity":93,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":99},"wind":{"speed":8.76,"deg":254,"gust":14.93},"visibility":10000,"pop":0.22,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 15:00:00"},{"dt":1720368000,"main":{"temp":254.75,"feels_like":247.75,"temp_min":254.75,"temp_max":254.75,"pressure":991,"sea_level":991,"grnd_level":940,"humidity":96,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":83},"wind":{"speed":8.16,"deg":258,"gust":14.23},"visibility":10000,"pop":0.12,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 16:00:00"},{"dt":1720371600,"main":{"temp":254.72,"feels_like":247.72,"temp_min":254.72,"temp_max":254.72,"pressure":992,"sea_level":992,"grnd_level":941,"humidity":97,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":77},"wind":{"speed":8.19,"deg":257,"gust":14.1},"visibility":7385,"pop":0.07,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 17:00:00"},{"dt":1720375200,"main":{"temp":254.69,"feels_like":247.69,"temp_min":254.69,"temp_max":254.69,"pressure":993,"sea_level":993,"grnd_level":942,"humidity":97,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":80},"wind":{"speed":7.59,"deg":261,"gust":12.8},"visibility":8599,"pop":0.03,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 18:00:00"},{"dt":1720378800,"main":{"temp":254.29,"feels_like":247.29,"temp_min":254.29,"temp_max":254.29,"pressure":994,"sea_level":994,"grnd_level":943,"humidity":98,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":86},"wind":{"speed":7.34,"deg":263,"gust":12.45},"visibility":8984,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 19:00:00"},{"dt":1720382400,"main":{"temp":253.29,"feels_like":246.29,"temp_min":253.29,"temp_max":253.29,"pressure":995,"sea_level":995,"grnd_level":943,"humidity":98,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":84},"wind":{"speed":6.52,"deg":263,"gust":10.96},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 20:00:00"},{"dt":1720386000,"main":{"temp":252.28,"feels_like":245.28,"temp_min":252.28,"temp_max":252.28,"pressure":996,"sea_level":996,"grnd_level":944,"humidity":99,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":78},"wind":{"speed":5.41,"deg":262,"gust":9.49},"visibility":10000,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 21:00:00"},{"dt":1720389600,"main":{"temp":250.78,"feels_like":243.78,"temp_min":250.78,"temp_max":250.78,"pressure":998,"sea_level":998,"grnd_level":945,"humidity":100,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":76},"wind":{"speed":3.43,"deg":262,"gust":6.75},"visibility":8629,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 22:00:00"},{"dt":1720393200,"main":{"temp":249.65,"feels_like":243.37,"temp_min":249.65,"temp_max":249.65,"pressure":998,"sea_level":998,"grnd_level":946,"humidity":100,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":76},"wind":{"speed":1.98,"deg":277,"gust":4.46},"visibility":8715,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-07 + 23:00:00"},{"dt":1720396800,"main":{"temp":249.41,"feels_like":249.41,"temp_min":249.41,"temp_max":249.41,"pressure":999,"sea_level":999,"grnd_level":946,"humidity":100,"temp_kf":0},"weather":[{"id":803,"main":"Clouds","description":"broken + clouds","icon":"04d"}],"clouds":{"all":78},"wind":{"speed":1.24,"deg":273,"gust":3.4},"visibility":4267,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 00:00:00"},{"dt":1720400400,"main":{"temp":250.18,"feels_like":250.18,"temp_min":250.18,"temp_max":250.18,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.26,"deg":301,"gust":2.66},"visibility":3232,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 01:00:00"},{"dt":1720404000,"main":{"temp":251.18,"feels_like":251.18,"temp_min":251.18,"temp_max":251.18,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.2,"deg":332,"gust":2.41},"visibility":3194,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 02:00:00"},{"dt":1720407600,"main":{"temp":251.35,"feels_like":246.08,"temp_min":251.35,"temp_max":251.35,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.67,"deg":360,"gust":2.53},"visibility":3255,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 03:00:00"},{"dt":1720411200,"main":{"temp":251.26,"feels_like":246.4,"temp_min":251.26,"temp_max":251.26,"pressure":1000,"sea_level":1000,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.51,"deg":12,"gust":2.34},"visibility":3355,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 04:00:00"},{"dt":1720414800,"main":{"temp":251.25,"feels_like":246.45,"temp_min":251.25,"temp_max":251.25,"pressure":1000,"sea_level":1000,"grnd_level":947,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.49,"deg":29,"gust":2.41},"visibility":3013,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 05:00:00"},{"dt":1720418400,"main":{"temp":251.7,"feels_like":246.16,"temp_min":251.7,"temp_max":251.7,"pressure":1000,"sea_level":1000,"grnd_level":948,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":1.8,"deg":41,"gust":2.56},"visibility":2784,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 06:00:00"},{"dt":1720422000,"main":{"temp":252.55,"feels_like":246.39,"temp_min":252.55,"temp_max":252.55,"pressure":1000,"sea_level":1000,"grnd_level":948,"humidity":100,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.15,"deg":47,"gust":2.77},"visibility":2070,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 07:00:00"},{"dt":1720425600,"main":{"temp":254.38,"feels_like":247.66,"temp_min":254.38,"temp_max":254.38,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":99,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.64,"deg":48,"gust":3.32},"visibility":1844,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 08:00:00"},{"dt":1720429200,"main":{"temp":256.01,"feels_like":249.13,"temp_min":256.01,"temp_max":256.01,"pressure":999,"sea_level":999,"grnd_level":947,"humidity":97,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":2.95,"deg":47,"gust":3.82},"visibility":2824,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 09:00:00"},{"dt":1720432800,"main":{"temp":257.07,"feels_like":250.12,"temp_min":257.07,"temp_max":257.07,"pressure":998,"sea_level":998,"grnd_level":947,"humidity":96,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.16,"deg":52,"gust":4.31},"visibility":3776,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 10:00:00"},{"dt":1720436400,"main":{"temp":257.67,"feels_like":250.67,"temp_min":257.67,"temp_max":257.67,"pressure":997,"sea_level":997,"grnd_level":946,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":3.55,"deg":56,"gust":4.92},"visibility":2414,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 11:00:00"},{"dt":1720440000,"main":{"temp":259.1,"feels_like":252.1,"temp_min":259.1,"temp_max":259.1,"pressure":996,"sea_level":996,"grnd_level":945,"humidity":94,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.17,"deg":62,"gust":6.53},"visibility":1230,"pop":0,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 12:00:00"},{"dt":1720443600,"main":{"temp":259.91,"feels_like":252.91,"temp_min":259.91,"temp_max":259.91,"pressure":995,"sea_level":995,"grnd_level":944,"humidity":95,"temp_kf":0},"weather":[{"id":804,"main":"Clouds","description":"overcast + clouds","icon":"04d"}],"clouds":{"all":100},"wind":{"speed":4.55,"deg":63,"gust":8.1},"visibility":719,"pop":0.56,"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 13:00:00"},{"dt":1720447200,"main":{"temp":260.48,"feels_like":253.48,"temp_min":260.48,"temp_max":260.48,"pressure":994,"sea_level":994,"grnd_level":943,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":5.36,"deg":63,"gust":9.68},"visibility":235,"pop":0.6,"snow":{"1h":0.14},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 14:00:00"},{"dt":1720450800,"main":{"temp":260.75,"feels_like":253.75,"temp_min":260.75,"temp_max":260.75,"pressure":993,"sea_level":993,"grnd_level":942,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":6.44,"deg":63,"gust":11.35},"visibility":219,"pop":0.74,"snow":{"1h":0.2},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 15:00:00"},{"dt":1720454400,"main":{"temp":260.85,"feels_like":253.85,"temp_min":260.85,"temp_max":260.85,"pressure":992,"sea_level":992,"grnd_level":941,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":7.1,"deg":60,"gust":11.8},"visibility":188,"pop":0.88,"snow":{"1h":0.22},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 16:00:00"},{"dt":1720458000,"main":{"temp":260.79,"feels_like":253.79,"temp_min":260.79,"temp_max":260.79,"pressure":991,"sea_level":991,"grnd_level":941,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":6.92,"deg":60,"gust":11.02},"visibility":176,"pop":0.91,"snow":{"1h":0.28},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 17:00:00"},{"dt":1720461600,"main":{"temp":260.91,"feels_like":253.91,"temp_min":260.91,"temp_max":260.91,"pressure":990,"sea_level":990,"grnd_level":939,"humidity":95,"temp_kf":0},"weather":[{"id":600,"main":"Snow","description":"light + snow","icon":"13d"}],"clouds":{"all":100},"wind":{"speed":6.96,"deg":60,"gust":11.22},"visibility":178,"pop":0.91,"snow":{"1h":0.28},"sys":{"pod":"d"},"dt_txt":"2024-07-08 + 18:00:00"}],"city":{"id":0,"name":"","coord":{"lat":-70.8696,"lon":-75.1144},"country":"","population":0,"timezone":-10800,"sunrise":0,"sunset":0}}' + recorded_at: Thu, 04 Jul 2024 18:52:05 GMT recorded_with: VCR 6.2.0 diff --git a/spec/open_weather/forecast/hourly_spec.rb b/spec/open_weather/forecast/hourly_spec.rb index ea60b63..7de9667 100644 --- a/spec/open_weather/forecast/hourly_spec.rb +++ b/spec/open_weather/forecast/hourly_spec.rb @@ -2,11 +2,11 @@ require 'spec_helper' -RSpec.describe 'hourly forecast' do +RSpec.describe 'hourly forecast without rain or snow' do include_context 'API client' - it 'hourly', vcr: { cassette_name: 'forecast/hourly' } do - data = client.hourly(lat: 33.5312, lon: -111.9426) + it 'hourly mostly sunny', vcr: { cassette_name: 'forecast/hourly' } do + data = client.hourly(lat: 82.8628, lon: 135.0000) expect(data).to be_a OpenWeather::Models::Forecast::Hourly expect(data.cnt).to eq 96 @@ -15,7 +15,32 @@ expect(data.list).to be_a Array data.list.first.tap do |forecast| expect(forecast).to be_a OpenWeather::Models::Forecast::Forecast - expect(forecast.dt).to eq Time.at(1661875200) + expect(forecast.dt).to be_a Time + expect(forecast.main).to be_a OpenWeather::Models::Main + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.clouds).to be_a OpenWeather::Models::Clouds + expect(forecast.wind).to be_a OpenWeather::Models::Wind + expect(forecast.rain).to be_nil + expect(forecast.snow).to be_nil + expect(forecast.visibility).to eq 2686 + expect(forecast.pop).to eq 0.0 + expect(forecast.sys).to be_a OpenWeather::Models::Sys + expect(forecast.dt_txt).to eq '2024-07-04 19:00:00' + end + end + + it 'hourly with rain', vcr: { cassette_name: 'forecast/hourly' } do + data = client.hourly(lat: 82.8628, lon: 135.0000) + + expect(data).to be_a OpenWeather::Models::Forecast::Hourly + expect(data.cnt).to eq 96 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list[64].tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::Forecast + expect(forecast.dt).to be_a Time expect(forecast.main).to be_a OpenWeather::Models::Main expect(forecast.weather).to be_a Array expect(forecast.weather.first).to be_a OpenWeather::Models::Weather @@ -24,9 +49,34 @@ expect(forecast.rain).to be_a OpenWeather::Models::Rain expect(forecast.snow).to be_nil expect(forecast.visibility).to eq 10000 - expect(forecast.pop).to eq 0.32 + expect(forecast.pop).to eq 0.69 + expect(forecast.sys).to be_a OpenWeather::Models::Sys + expect(forecast.dt_txt).to eq '2024-07-07 11:00:00' + end + end + + it 'hourly with snow', vcr: { cassette_name: 'forecast/hourly' } do + data = client.hourly(lat: -70.86960, lon: -75.11441) + + expect(data).to be_a OpenWeather::Models::Forecast::Hourly + expect(data.cnt).to eq 96 + expect(data.city).to be_a OpenWeather::Models::Forecast::City + + expect(data.list).to be_a Array + data.list[1].tap do |forecast| + expect(forecast).to be_a OpenWeather::Models::Forecast::Forecast + expect(forecast.dt).to be_a Time + expect(forecast.main).to be_a OpenWeather::Models::Main + expect(forecast.weather).to be_a Array + expect(forecast.weather.first).to be_a OpenWeather::Models::Weather + expect(forecast.clouds).to be_a OpenWeather::Models::Clouds + expect(forecast.wind).to be_a OpenWeather::Models::Wind + expect(forecast.rain).to be_nil + expect(forecast.snow).to be_a OpenWeather::Models::Snow + expect(forecast.visibility).to eq 105 + expect(forecast.pop).to eq 1.0 expect(forecast.sys).to be_a OpenWeather::Models::Sys - expect(forecast.dt_txt).to eq '2022-08-30 16:00:00' + expect(forecast.dt_txt).to eq '2024-07-04 20:00:00' end end end