Files
MagicMirror/tests/mocks/weather_owm_onecall.json
Kristjan ESPERANTO 8ce0cda7bf [weather] refactor: migrate to server-side providers with centralized HTTPFetcher (#4032)
This migrates the Weather module from client-side fetching to use the
server-side centralized HTTPFetcher (introduced in #4016), following the
same pattern as the Calendar and Newsfeed modules.

## Motivation

This brings consistent error handling and better maintainability and
completes the refactoring effort to centralize HTTP error handling
across all default modules.

Migrating to server-side providers with HTTPFetcher brings:
- **Centralized error handling**: Inherits smart retry strategies
(401/403, 429, 5xx backoff) and timeout handling (30s)
- **Consistency**: Same architecture as Calendar and Newsfeed modules
- **Security**: Possibility to hide API keys/secrets from client-side
- **Performance**: Reduced API calls in multi-client setups - one server
fetch instead of one per client
- **Enabling possible future features**: e.g. server-side caching, rate
limit monitoring, and data sharing with third-party modules

## Changes

- All 10 weather providers now use HTTPFetcher for server-side fetching
- Consistent error handling like Calendar and Newsfeed modules

## Breaking Changes

None. Existing configurations continue to work.

## Testing

To ensure proper functionality, I obtained API keys and credentials for
all providers that require them. I configured all 10 providers in a
carousel setup and tested each one individually. Screenshots for each
provider are attached below demonstrating their working state.

I even requested developer access from the Tempest/WeatherFlow team to
properly test this provider.

**Comprehensive test coverage**: A major advantage of the server-side
architecture is the ability to thoroughly test providers with unit tests
using real API response snapshots. Don't be alarmed by the many lines
added in this PR - they are primarily test files and real-data mocks
that ensure provider reliability.

## Review Notes

I know this is an enormous change - I've been working on this for quite
some time. Unfortunately, breaking it into smaller incremental PRs
wasn't feasible due to the interdependencies between providers and the
shared architecture.

Given the scope, it's nearly impossible to manually review every change.
To ensure quality, I've used both CodeRabbit and GitHub Copilot to
review the code multiple times in my fork, and both provided extensive
and valuable feedback. Most importantly, my test setup with all 10
providers working successfully is very encouraging.

## Related

Part of the HTTPFetcher migration #4016.

## Screenshots

<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-06-54"
src="https://github.com/user-attachments/assets/2139f4d2-2a9b-4e49-8d0a-e4436983ed6e"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-02"
src="https://github.com/user-attachments/assets/880f7ce2-4e44-42d5-bfe4-5ce475cca7c2"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-07"
src="https://github.com/user-attachments/assets/abd89933-fe03-40ab-8a7c-41ae1ff99255"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-12"
src="https://github.com/user-attachments/assets/22225852-f0a9-4d33-87ab-0733ba30fad3"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-17"
src="https://github.com/user-attachments/assets/7a7192a5-f237-4060-85d7-6f50b9bef5af"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-22"
src="https://github.com/user-attachments/assets/df84d9f1-e531-4995-8da8-d6f2601b6a08"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-27"
src="https://github.com/user-attachments/assets/4cf391ac-db43-4b52-95f4-f5eadc5ea34d"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-32"
src="https://github.com/user-attachments/assets/8dd8e688-d47f-4815-87f6-7f2630f15d58"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-37"
src="https://github.com/user-attachments/assets/ee84a8bc-6b35-405a-b311-88658d9268dd"
/>
<img width="1920" height="1080" alt="Ekrankopio de 2026-02-08 13-07-42"
src="https://github.com/user-attachments/assets/f941f341-453f-4d4d-a8d9-6b9158eb2681"
/>

Provider "Weather API" added later:

<img width="1910" height="1080" alt="Ekrankopio de 2026-02-15 19-39-06"
src="https://github.com/user-attachments/assets/3f0c8ba3-105c-4f90-8b2e-3a1be543d3d2"
/>
2026-02-23 10:27:29 +01:00

971 lines
23 KiB
JSON

{
"lat": 40.7767,
"lon": -73.9713,
"timezone": "America/New_York",
"timezone_offset": -18000,
"current": {
"dt": 1770414297,
"sunrise": 1770379257,
"sunset": 1770416341,
"temp": -0.27,
"feels_like": -3.9,
"pressure": 1004,
"humidity": 54,
"dew_point": -7.54,
"uvi": 0,
"clouds": 75,
"visibility": 10000,
"wind_speed": 3.09,
"wind_deg": 220,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }]
},
"hourly": [
{
"dt": 1770411600,
"temp": -0.66,
"feels_like": -3.52,
"pressure": 1004,
"humidity": 61,
"dew_point": -6.5,
"uvi": 0.18,
"clouds": 80,
"visibility": 10000,
"wind_speed": 2.24,
"wind_deg": 187,
"wind_gust": 3.73,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770415200,
"temp": -0.27,
"feels_like": -2.6,
"pressure": 1004,
"humidity": 54,
"dew_point": -7.54,
"uvi": 0,
"clouds": 75,
"visibility": 10000,
"wind_speed": 1.87,
"wind_deg": 169,
"wind_gust": 3.26,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770418800,
"temp": -1.03,
"feels_like": -3.4,
"pressure": 1004,
"humidity": 62,
"dew_point": -6.67,
"uvi": 0,
"clouds": 80,
"visibility": 10000,
"wind_speed": 1.81,
"wind_deg": 190,
"wind_gust": 3.93,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770422400,
"temp": -1.54,
"feels_like": -5.39,
"pressure": 1004,
"humidity": 71,
"dew_point": -5.59,
"uvi": 0,
"clouds": 85,
"wind_speed": 3.04,
"wind_deg": 232,
"wind_gust": 6.25,
"weather": [{ "id": 600, "main": "Snow", "description": "light snow", "icon": "13n" }],
"pop": 0.2,
"snow": { "1h": 0.13 }
},
{
"dt": 1770426000,
"temp": -2.25,
"feels_like": -5.2,
"pressure": 1004,
"humidity": 80,
"dew_point": -4.89,
"uvi": 0,
"clouds": 90,
"visibility": 235,
"wind_speed": 2.09,
"wind_deg": 224,
"wind_gust": 6.04,
"weather": [{ "id": 600, "main": "Snow", "description": "light snow", "icon": "13n" }],
"pop": 1,
"snow": { "1h": 0.18 }
},
{
"dt": 1770429600,
"temp": -2.79,
"feels_like": -6.29,
"pressure": 1003,
"humidity": 89,
"dew_point": -4.17,
"uvi": 0,
"clouds": 95,
"visibility": 177,
"wind_speed": 2.47,
"wind_deg": 217,
"wind_gust": 6.99,
"weather": [{ "id": 600, "main": "Snow", "description": "light snow", "icon": "13n" }],
"pop": 1,
"snow": { "1h": 0.19 }
},
{
"dt": 1770433200,
"temp": -3.46,
"feels_like": -7.71,
"pressure": 1002,
"humidity": 96,
"dew_point": -4.21,
"uvi": 0,
"clouds": 100,
"visibility": 501,
"wind_speed": 3.05,
"wind_deg": 236,
"wind_gust": 7.82,
"weather": [{ "id": 600, "main": "Snow", "description": "light snow", "icon": "13n" }],
"pop": 1,
"snow": { "1h": 0.19 }
},
{
"dt": 1770436800,
"temp": -3.88,
"feels_like": -7.67,
"pressure": 1001,
"humidity": 97,
"dew_point": -4.47,
"uvi": 0,
"clouds": 100,
"visibility": 424,
"wind_speed": 2.54,
"wind_deg": 234,
"wind_gust": 7.49,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0.8
},
{
"dt": 1770440400,
"temp": -3.78,
"feels_like": -7.68,
"pressure": 1001,
"humidity": 96,
"dew_point": -4.57,
"uvi": 0,
"clouds": 100,
"visibility": 2576,
"wind_speed": 2.66,
"wind_deg": 231,
"wind_gust": 7.51,
"weather": [{ "id": 600, "main": "Snow", "description": "light snow", "icon": "13n" }],
"pop": 1,
"snow": { "1h": 0.14 }
},
{
"dt": 1770444000,
"temp": -4.1,
"feels_like": -8.05,
"pressure": 1000,
"humidity": 96,
"dew_point": -4.92,
"uvi": 0,
"clouds": 100,
"visibility": 305,
"wind_speed": 2.65,
"wind_deg": 237,
"wind_gust": 7.6,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0.8
},
{
"dt": 1770447600,
"temp": -4.12,
"feels_like": -8.44,
"pressure": 1000,
"humidity": 95,
"dew_point": -4.97,
"uvi": 0,
"clouds": 100,
"visibility": 10000,
"wind_speed": 2.99,
"wind_deg": 247,
"wind_gust": 7.23,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770451200,
"temp": -4.9,
"feels_like": -9.33,
"pressure": 999,
"humidity": 95,
"dew_point": -5.82,
"uvi": 0,
"clouds": 100,
"visibility": 10000,
"wind_speed": 2.95,
"wind_deg": 256,
"wind_gust": 7.85,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770454800,
"temp": -4.84,
"feels_like": -9.36,
"pressure": 999,
"humidity": 94,
"dew_point": -5.93,
"uvi": 0,
"clouds": 100,
"visibility": 4481,
"wind_speed": 3.04,
"wind_deg": 273,
"wind_gust": 10.32,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770458400,
"temp": -5.46,
"feels_like": -12.46,
"pressure": 1000,
"humidity": 85,
"dew_point": -7.96,
"uvi": 0,
"clouds": 100,
"visibility": 9905,
"wind_speed": 7.66,
"wind_deg": 316,
"wind_gust": 11.92,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770462000,
"temp": -9.55,
"feels_like": -16.55,
"pressure": 1001,
"humidity": 76,
"dew_point": -13.6,
"uvi": 0,
"clouds": 100,
"visibility": 10000,
"wind_speed": 8.25,
"wind_deg": 315,
"wind_gust": 15.03,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770465600,
"temp": -12.37,
"feels_like": -19.37,
"pressure": 1002,
"humidity": 76,
"dew_point": -16.71,
"uvi": 0,
"clouds": 100,
"visibility": 10000,
"wind_speed": 8.55,
"wind_deg": 309,
"wind_gust": 15.72,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770469200,
"temp": -14.13,
"feels_like": -21.13,
"pressure": 1003,
"humidity": 76,
"dew_point": -18.65,
"uvi": 0.27,
"clouds": 100,
"visibility": 10000,
"wind_speed": 8.44,
"wind_deg": 308,
"wind_gust": 16.05,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770472800,
"temp": -13.41,
"feels_like": -20.41,
"pressure": 1004,
"humidity": 76,
"dew_point": -17.82,
"uvi": 0.72,
"clouds": 56,
"visibility": 10000,
"wind_speed": 8.4,
"wind_deg": 311,
"wind_gust": 16,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770476400,
"temp": -12.76,
"feels_like": -19.76,
"pressure": 1004,
"humidity": 78,
"dew_point": -16.79,
"uvi": 1.2,
"clouds": 52,
"visibility": 10000,
"wind_speed": 8.67,
"wind_deg": 317,
"wind_gust": 15.12,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770480000,
"temp": -12.33,
"feels_like": -19.33,
"pressure": 1005,
"humidity": 83,
"dew_point": -15.61,
"uvi": 1.56,
"clouds": 64,
"visibility": 3083,
"wind_speed": 8.8,
"wind_deg": 321,
"wind_gust": 15.19,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770483600,
"temp": -11.87,
"feels_like": -18.87,
"pressure": 1004,
"humidity": 82,
"dew_point": -15.28,
"uvi": 1.56,
"clouds": 71,
"visibility": 8917,
"wind_speed": 8.88,
"wind_deg": 322,
"wind_gust": 15.55,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770487200,
"temp": -11.69,
"feels_like": -18.69,
"pressure": 1005,
"humidity": 79,
"dew_point": -15.5,
"uvi": 1.57,
"clouds": 76,
"visibility": 10000,
"wind_speed": 9.46,
"wind_deg": 324,
"wind_gust": 16.31,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770490800,
"temp": -11.62,
"feels_like": -18.62,
"pressure": 1005,
"humidity": 77,
"dew_point": -15.73,
"uvi": 1.11,
"clouds": 100,
"visibility": 10000,
"wind_speed": 9.8,
"wind_deg": 327,
"wind_gust": 16.18,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770494400,
"temp": -12,
"feels_like": -19,
"pressure": 1006,
"humidity": 75,
"dew_point": -16.48,
"uvi": 0.59,
"clouds": 100,
"visibility": 10000,
"wind_speed": 9.97,
"wind_deg": 328,
"wind_gust": 16.89,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770498000,
"temp": -12.71,
"feels_like": -19.71,
"pressure": 1007,
"humidity": 74,
"dew_point": -17.39,
"uvi": 0.19,
"clouds": 100,
"visibility": 10000,
"wind_speed": 10.12,
"wind_deg": 328,
"wind_gust": 17.9,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770501600,
"temp": -13.43,
"feels_like": -20.43,
"pressure": 1009,
"humidity": 72,
"dew_point": -18.44,
"uvi": 0,
"clouds": 100,
"visibility": 10000,
"wind_speed": 10.09,
"wind_deg": 329,
"wind_gust": 18.24,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770505200,
"temp": -14.05,
"feels_like": -21.05,
"pressure": 1011,
"humidity": 72,
"dew_point": -19.28,
"uvi": 0,
"clouds": 99,
"visibility": 10000,
"wind_speed": 10.11,
"wind_deg": 329,
"wind_gust": 18.4,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770508800,
"temp": -14.31,
"feels_like": -21.31,
"pressure": 1013,
"humidity": 72,
"dew_point": -19.61,
"uvi": 0,
"clouds": 97,
"visibility": 10000,
"wind_speed": 10.18,
"wind_deg": 328,
"wind_gust": 18.77,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770512400,
"temp": -14.29,
"feels_like": -21.29,
"pressure": 1014,
"humidity": 72,
"dew_point": -19.51,
"uvi": 0,
"clouds": 97,
"visibility": 10000,
"wind_speed": 9.7,
"wind_deg": 330,
"wind_gust": 18.29,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770516000,
"temp": -14.14,
"feels_like": -21.14,
"pressure": 1015,
"humidity": 72,
"dew_point": -19.28,
"uvi": 0,
"clouds": 98,
"visibility": 10000,
"wind_speed": 9.38,
"wind_deg": 330,
"wind_gust": 17.25,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770519600,
"temp": -14.08,
"feels_like": -21.08,
"pressure": 1016,
"humidity": 73,
"dew_point": -19.05,
"uvi": 0,
"clouds": 99,
"visibility": 10000,
"wind_speed": 8.71,
"wind_deg": 329,
"wind_gust": 16.58,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770523200,
"temp": -14.19,
"feels_like": -21.19,
"pressure": 1016,
"humidity": 74,
"dew_point": -19.05,
"uvi": 0,
"clouds": 99,
"visibility": 10000,
"wind_speed": 8.24,
"wind_deg": 328,
"wind_gust": 15.71,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770526800,
"temp": -14.38,
"feels_like": -21.38,
"pressure": 1017,
"humidity": 74,
"dew_point": -19.34,
"uvi": 0,
"clouds": 99,
"visibility": 10000,
"wind_speed": 8.08,
"wind_deg": 326,
"wind_gust": 15.77,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770530400,
"temp": -14.74,
"feels_like": -21.74,
"pressure": 1018,
"humidity": 74,
"dew_point": -19.74,
"uvi": 0,
"clouds": 99,
"visibility": 10000,
"wind_speed": 7.81,
"wind_deg": 324,
"wind_gust": 15.4,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770534000,
"temp": -15.13,
"feels_like": -22.13,
"pressure": 1019,
"humidity": 73,
"dew_point": -20.25,
"uvi": 0,
"clouds": 93,
"visibility": 10000,
"wind_speed": 7.57,
"wind_deg": 325,
"wind_gust": 15.39,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770537600,
"temp": -15.57,
"feels_like": -22.57,
"pressure": 1019,
"humidity": 73,
"dew_point": -20.69,
"uvi": 0,
"clouds": 94,
"visibility": 10000,
"wind_speed": 7.36,
"wind_deg": 323,
"wind_gust": 15.29,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770541200,
"temp": -15.98,
"feels_like": -22.98,
"pressure": 1019,
"humidity": 73,
"dew_point": -21.2,
"uvi": 0,
"clouds": 88,
"visibility": 10000,
"wind_speed": 7.37,
"wind_deg": 321,
"wind_gust": 15.7,
"weather": [{ "id": 804, "main": "Clouds", "description": "overcast clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770544800,
"temp": -16.36,
"feels_like": -23.36,
"pressure": 1020,
"humidity": 73,
"dew_point": -21.64,
"uvi": 0,
"clouds": 69,
"visibility": 10000,
"wind_speed": 7.62,
"wind_deg": 322,
"wind_gust": 16.29,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770548400,
"temp": -16.63,
"feels_like": -23.63,
"pressure": 1021,
"humidity": 74,
"dew_point": -21.86,
"uvi": 0,
"clouds": 57,
"visibility": 10000,
"wind_speed": 7.52,
"wind_deg": 323,
"wind_gust": 16.46,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04n" }],
"pop": 0
},
{
"dt": 1770552000,
"temp": -16.84,
"feels_like": -23.84,
"pressure": 1022,
"humidity": 74,
"dew_point": -22.06,
"uvi": 0,
"clouds": 48,
"visibility": 10000,
"wind_speed": 7.59,
"wind_deg": 324,
"wind_gust": 16.2,
"weather": [{ "id": 802, "main": "Clouds", "description": "scattered clouds", "icon": "03d" }],
"pop": 0
},
{
"dt": 1770555600,
"temp": -16.57,
"feels_like": -23.57,
"pressure": 1023,
"humidity": 74,
"dew_point": -21.63,
"uvi": 0.3,
"clouds": 2,
"visibility": 10000,
"wind_speed": 7.27,
"wind_deg": 325,
"wind_gust": 14.68,
"weather": [{ "id": 800, "main": "Clear", "description": "clear sky", "icon": "01d" }],
"pop": 0
},
{
"dt": 1770559200,
"temp": -15.7,
"feels_like": -22.7,
"pressure": 1023,
"humidity": 76,
"dew_point": -20.43,
"uvi": 0.77,
"clouds": 4,
"visibility": 10000,
"wind_speed": 7.26,
"wind_deg": 324,
"wind_gust": 13.65,
"weather": [{ "id": 800, "main": "Clear", "description": "clear sky", "icon": "01d" }],
"pop": 0
},
{
"dt": 1770562800,
"temp": -14.48,
"feels_like": -21.48,
"pressure": 1023,
"humidity": 77,
"dew_point": -18.94,
"uvi": 1.42,
"clouds": 5,
"visibility": 10000,
"wind_speed": 6.7,
"wind_deg": 324,
"wind_gust": 12.19,
"weather": [{ "id": 800, "main": "Clear", "description": "clear sky", "icon": "01d" }],
"pop": 0
},
{
"dt": 1770566400,
"temp": -13.34,
"feels_like": -20.34,
"pressure": 1023,
"humidity": 73,
"dew_point": -18.23,
"uvi": 1.98,
"clouds": 5,
"visibility": 10000,
"wind_speed": 6.59,
"wind_deg": 327,
"wind_gust": 10.06,
"weather": [{ "id": 800, "main": "Clear", "description": "clear sky", "icon": "01d" }],
"pop": 0
},
{
"dt": 1770570000,
"temp": -11.94,
"feels_like": -18.94,
"pressure": 1022,
"humidity": 74,
"dew_point": -16.63,
"uvi": 2.19,
"clouds": 6,
"visibility": 10000,
"wind_speed": 6.3,
"wind_deg": 325,
"wind_gust": 9.29,
"weather": [{ "id": 800, "main": "Clear", "description": "clear sky", "icon": "01d" }],
"pop": 0
},
{
"dt": 1770573600,
"temp": -10.51,
"feels_like": -17.51,
"pressure": 1022,
"humidity": 75,
"dew_point": -14.88,
"uvi": 1.95,
"clouds": 7,
"visibility": 10000,
"wind_speed": 5.98,
"wind_deg": 321,
"wind_gust": 8.89,
"weather": [{ "id": 800, "main": "Clear", "description": "clear sky", "icon": "01d" }],
"pop": 0
},
{
"dt": 1770577200,
"temp": -9.42,
"feels_like": -16.42,
"pressure": 1022,
"humidity": 75,
"dew_point": -13.63,
"uvi": 1.39,
"clouds": 72,
"visibility": 10000,
"wind_speed": 5.92,
"wind_deg": 317,
"wind_gust": 8.77,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
},
{
"dt": 1770580800,
"temp": -8.96,
"feels_like": -15.96,
"pressure": 1023,
"humidity": 79,
"dew_point": -12.4,
"uvi": 0.73,
"clouds": 80,
"visibility": 10000,
"wind_speed": 6.03,
"wind_deg": 312,
"wind_gust": 10.13,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"pop": 0
}
],
"daily": [
{
"dt": 1770397200,
"sunrise": 1770379257,
"sunset": 1770416341,
"moonrise": 1770435960,
"moonset": 1770386880,
"moon_phase": 0.66,
"summary": "Expect a day of partly cloudy with snow",
"temp": { "day": -2.5, "min": -11.86, "max": -0.27, "night": -3.88, "eve": -1.03, "morn": -10.39 },
"feels_like": { "day": -2.5, "night": -7.67, "eve": -3.4, "morn": -14.33 },
"pressure": 1006,
"humidity": 88,
"dew_point": -4.3,
"wind_speed": 3.05,
"wind_deg": 236,
"wind_gust": 7.82,
"weather": [{ "id": 600, "main": "Snow", "description": "light snow", "icon": "13d" }],
"clouds": 95,
"pop": 1,
"snow": 0.69,
"uvi": 2.22
},
{
"dt": 1770483600,
"sunrise": 1770465590,
"sunset": 1770502816,
"moonrise": 1770526200,
"moonset": 1770474600,
"moon_phase": 0.69,
"summary": "There will be snow until morning, then partly cloudy",
"temp": { "day": -11.87, "min": -14.31, "max": -3.78, "night": -14.19, "eve": -14.05, "morn": -9.55 },
"feels_like": { "day": -18.87, "night": -21.19, "eve": -21.05, "morn": -16.55 },
"pressure": 1004,
"humidity": 82,
"dew_point": -15.28,
"wind_speed": 10.18,
"wind_deg": 328,
"wind_gust": 18.77,
"weather": [{ "id": 600, "main": "Snow", "description": "light snow", "icon": "13d" }],
"clouds": 71,
"pop": 1,
"snow": 0.14,
"uvi": 1.57
},
{
"dt": 1770570000,
"sunrise": 1770551923,
"sunset": 1770589291,
"moonrise": 0,
"moonset": 1770562440,
"moon_phase": 0.72,
"summary": "Expect a day of partly cloudy with clear spells",
"temp": { "day": -11.94, "min": -16.84, "max": -8.96, "night": -13.75, "eve": -11.11, "morn": -16.63 },
"feels_like": { "day": -18.94, "night": -20.33, "eve": -18.11, "morn": -23.63 },
"pressure": 1022,
"humidity": 74,
"dew_point": -16.63,
"wind_speed": 8.08,
"wind_deg": 326,
"wind_gust": 16.46,
"weather": [{ "id": 800, "main": "Clear", "description": "clear sky", "icon": "01d" }],
"clouds": 6,
"pop": 0,
"uvi": 2.19
},
{
"dt": 1770656400,
"sunrise": 1770638253,
"sunset": 1770675765,
"moonrise": 1770616380,
"moonset": 1770650520,
"moon_phase": 0.75,
"summary": "The day will start with clear sky through the late morning hours, transitioning to partly cloudy",
"temp": { "day": -6.9, "min": -17.11, "max": -3.39, "night": -5.77, "eve": -7.87, "morn": -16.94 },
"feels_like": { "day": -10.1, "night": -5.77, "eve": -7.87, "morn": -16.94 },
"pressure": 1024,
"humidity": 78,
"dew_point": -10.38,
"wind_speed": 2.5,
"wind_deg": 319,
"wind_gust": 7.03,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"clouds": 83,
"pop": 0,
"uvi": 2.7
},
{
"dt": 1770742800,
"sunrise": 1770724583,
"sunset": 1770762240,
"moonrise": 1770706560,
"moonset": 1770739020,
"moon_phase": 0.79,
"summary": "There will be partly cloudy today",
"temp": { "day": -1.46, "min": -10, "max": -0.51, "night": -3.8, "eve": -1.57, "morn": -10 },
"feels_like": { "day": -1.46, "night": -6.36, "eve": -3.98, "morn": -13.81 },
"pressure": 1020,
"humidity": 94,
"dew_point": -2.47,
"wind_speed": 1.83,
"wind_deg": 2,
"wind_gust": 2.92,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"clouds": 56,
"pop": 0,
"uvi": 3.1
},
{
"dt": 1770829200,
"sunrise": 1770810911,
"sunset": 1770848714,
"moonrise": 1770796620,
"moonset": 1770827880,
"moon_phase": 0.82,
"summary": "The day will start with partly cloudy with snow through the late morning hours, transitioning to partly cloudy with rain",
"temp": { "day": 0.7, "min": -4.02, "max": 2.06, "night": -0.6, "eve": 2.06, "morn": -0.03 },
"feels_like": { "day": 0.7, "night": -5, "eve": -2, "morn": -3.1 },
"pressure": 1009,
"humidity": 100,
"dew_point": 0.64,
"wind_speed": 4.4,
"wind_deg": 311,
"wind_gust": 11.56,
"weather": [{ "id": 616, "main": "Snow", "description": "rain and snow", "icon": "13d" }],
"clouds": 100,
"pop": 1,
"rain": 4.38,
"snow": 2.17,
"uvi": 4
},
{
"dt": 1770915600,
"sunrise": 1770897237,
"sunset": 1770935188,
"moonrise": 1770886440,
"moonset": 1770917220,
"moon_phase": 0.85,
"summary": "There will be partly cloudy today",
"temp": { "day": 0.2, "min": -4.63, "max": 0.2, "night": -4.63, "eve": -2.9, "morn": -3.67 },
"feels_like": { "day": -4.8, "night": -10.67, "eve": -8.49, "morn": -8.22 },
"pressure": 1012,
"humidity": 81,
"dew_point": -2.81,
"wind_speed": 5.52,
"wind_deg": 301,
"wind_gust": 12.97,
"weather": [{ "id": 802, "main": "Clouds", "description": "scattered clouds", "icon": "03d" }],
"clouds": 50,
"pop": 0,
"uvi": 4
},
{
"dt": 1771002000,
"sunrise": 1770983562,
"sunset": 1771021662,
"moonrise": 1770975780,
"moonset": 1771007160,
"moon_phase": 0.88,
"summary": "Expect a day of partly cloudy with clear spells",
"temp": { "day": 0.38, "min": -6.39, "max": 0.95, "night": -1.17, "eve": -0.91, "morn": -6.39 },
"feels_like": { "day": -3.92, "night": -6.3, "eve": -5.42, "morn": -12.89 },
"pressure": 1017,
"humidity": 80,
"dew_point": -2.71,
"wind_speed": 5.27,
"wind_deg": 298,
"wind_gust": 14.69,
"weather": [{ "id": 803, "main": "Clouds", "description": "broken clouds", "icon": "04d" }],
"clouds": 74,
"pop": 0,
"uvi": 4
}
]
}