mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Add AEMET library data to coordinator and use it for weather platform (#102954)
This commit is contained in:
parent
8703621c64
commit
fb5d058885
@ -12,6 +12,18 @@ from aemet_opendata.const import (
|
||||
AOD_COND_RAINY,
|
||||
AOD_COND_SNOWY,
|
||||
AOD_COND_SUNNY,
|
||||
AOD_CONDITION,
|
||||
AOD_FORECAST_DAILY,
|
||||
AOD_FORECAST_HOURLY,
|
||||
AOD_PRECIPITATION,
|
||||
AOD_PRECIPITATION_PROBABILITY,
|
||||
AOD_TEMP,
|
||||
AOD_TEMP_MAX,
|
||||
AOD_TEMP_MIN,
|
||||
AOD_TIMESTAMP,
|
||||
AOD_WIND_DIRECTION,
|
||||
AOD_WIND_SPEED,
|
||||
AOD_WIND_SPEED_MAX,
|
||||
)
|
||||
|
||||
from homeassistant.components.weather import (
|
||||
@ -25,6 +37,15 @@ from homeassistant.components.weather import (
|
||||
ATTR_CONDITION_RAINY,
|
||||
ATTR_CONDITION_SNOWY,
|
||||
ATTR_CONDITION_SUNNY,
|
||||
ATTR_FORECAST_CONDITION,
|
||||
ATTR_FORECAST_NATIVE_PRECIPITATION,
|
||||
ATTR_FORECAST_NATIVE_TEMP,
|
||||
ATTR_FORECAST_NATIVE_TEMP_LOW,
|
||||
ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
|
||||
ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||
ATTR_FORECAST_TIME,
|
||||
ATTR_FORECAST_WIND_BEARING,
|
||||
)
|
||||
from homeassistant.const import Platform
|
||||
|
||||
@ -122,3 +143,30 @@ FORECAST_MODE_ATTR_API = {
|
||||
FORECAST_MODE_DAILY: ATTR_API_FORECAST_DAILY,
|
||||
FORECAST_MODE_HOURLY: ATTR_API_FORECAST_HOURLY,
|
||||
}
|
||||
|
||||
FORECAST_MAP = {
|
||||
AOD_FORECAST_DAILY: {
|
||||
AOD_CONDITION: ATTR_FORECAST_CONDITION,
|
||||
AOD_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||
AOD_TEMP_MAX: ATTR_FORECAST_NATIVE_TEMP,
|
||||
AOD_TEMP_MIN: ATTR_FORECAST_NATIVE_TEMP_LOW,
|
||||
AOD_TIMESTAMP: ATTR_FORECAST_TIME,
|
||||
AOD_WIND_DIRECTION: ATTR_FORECAST_WIND_BEARING,
|
||||
AOD_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||
},
|
||||
AOD_FORECAST_HOURLY: {
|
||||
AOD_CONDITION: ATTR_FORECAST_CONDITION,
|
||||
AOD_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||
AOD_PRECIPITATION: ATTR_FORECAST_NATIVE_PRECIPITATION,
|
||||
AOD_TEMP: ATTR_FORECAST_NATIVE_TEMP,
|
||||
AOD_TIMESTAMP: ATTR_FORECAST_TIME,
|
||||
AOD_WIND_DIRECTION: ATTR_FORECAST_WIND_BEARING,
|
||||
AOD_WIND_SPEED_MAX: ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
|
||||
AOD_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||
},
|
||||
}
|
||||
|
||||
WEATHER_FORECAST_MODES = {
|
||||
AOD_FORECAST_DAILY: "daily",
|
||||
AOD_FORECAST_HOURLY: "hourly",
|
||||
}
|
||||
|
23
homeassistant/components/aemet/entity.py
Normal file
23
homeassistant/components/aemet/entity.py
Normal file
@ -0,0 +1,23 @@
|
||||
"""Entity classes for the AEMET OpenData integration."""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
from aemet_opendata.helpers import dict_nested_value
|
||||
|
||||
from homeassistant.components.weather import Forecast
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from .weather_update_coordinator import WeatherUpdateCoordinator
|
||||
|
||||
|
||||
class AemetEntity(CoordinatorEntity[WeatherUpdateCoordinator]):
|
||||
"""Define an AEMET entity."""
|
||||
|
||||
def get_aemet_forecast(self, forecast_mode: str) -> list[Forecast]:
|
||||
"""Return AEMET entity forecast by mode."""
|
||||
return self.coordinator.data["forecast"][forecast_mode]
|
||||
|
||||
def get_aemet_value(self, keys: list[str]) -> Any:
|
||||
"""Return AEMET entity value by keys."""
|
||||
return dict_nested_value(self.coordinator.data["lib"], keys)
|
@ -1,16 +1,19 @@
|
||||
"""Support for the AEMET OpenData service."""
|
||||
from typing import cast
|
||||
|
||||
from aemet_opendata.const import (
|
||||
AOD_CONDITION,
|
||||
AOD_FORECAST_DAILY,
|
||||
AOD_FORECAST_HOURLY,
|
||||
AOD_HUMIDITY,
|
||||
AOD_PRESSURE,
|
||||
AOD_TEMP,
|
||||
AOD_WEATHER,
|
||||
AOD_WIND_DIRECTION,
|
||||
AOD_WIND_SPEED,
|
||||
AOD_WIND_SPEED_MAX,
|
||||
)
|
||||
|
||||
from homeassistant.components.weather import (
|
||||
ATTR_FORECAST_CONDITION,
|
||||
ATTR_FORECAST_NATIVE_PRECIPITATION,
|
||||
ATTR_FORECAST_NATIVE_TEMP,
|
||||
ATTR_FORECAST_NATIVE_TEMP_LOW,
|
||||
ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
|
||||
ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||
ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||
ATTR_FORECAST_TIME,
|
||||
ATTR_FORECAST_WIND_BEARING,
|
||||
DOMAIN as WEATHER_DOMAIN,
|
||||
Forecast,
|
||||
SingleCoordinatorWeatherEntity,
|
||||
@ -28,55 +31,16 @@ from homeassistant.helpers import entity_registry as er
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
|
||||
from .const import (
|
||||
ATTR_API_CONDITION,
|
||||
ATTR_API_FORECAST_CONDITION,
|
||||
ATTR_API_FORECAST_PRECIPITATION,
|
||||
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY,
|
||||
ATTR_API_FORECAST_TEMP,
|
||||
ATTR_API_FORECAST_TEMP_LOW,
|
||||
ATTR_API_FORECAST_TIME,
|
||||
ATTR_API_FORECAST_WIND_BEARING,
|
||||
ATTR_API_FORECAST_WIND_MAX_SPEED,
|
||||
ATTR_API_FORECAST_WIND_SPEED,
|
||||
ATTR_API_HUMIDITY,
|
||||
ATTR_API_PRESSURE,
|
||||
ATTR_API_TEMPERATURE,
|
||||
ATTR_API_WIND_BEARING,
|
||||
ATTR_API_WIND_MAX_SPEED,
|
||||
ATTR_API_WIND_SPEED,
|
||||
ATTRIBUTION,
|
||||
CONDITIONS_MAP,
|
||||
DOMAIN,
|
||||
ENTRY_NAME,
|
||||
ENTRY_WEATHER_COORDINATOR,
|
||||
FORECAST_MODE_ATTR_API,
|
||||
FORECAST_MODE_DAILY,
|
||||
FORECAST_MODE_HOURLY,
|
||||
FORECAST_MODES,
|
||||
WEATHER_FORECAST_MODES,
|
||||
)
|
||||
from .entity import AemetEntity
|
||||
from .weather_update_coordinator import WeatherUpdateCoordinator
|
||||
|
||||
FORECAST_MAP = {
|
||||
FORECAST_MODE_DAILY: {
|
||||
ATTR_API_FORECAST_CONDITION: ATTR_FORECAST_CONDITION,
|
||||
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||
ATTR_API_FORECAST_TEMP_LOW: ATTR_FORECAST_NATIVE_TEMP_LOW,
|
||||
ATTR_API_FORECAST_TEMP: ATTR_FORECAST_NATIVE_TEMP,
|
||||
ATTR_API_FORECAST_TIME: ATTR_FORECAST_TIME,
|
||||
ATTR_API_FORECAST_WIND_BEARING: ATTR_FORECAST_WIND_BEARING,
|
||||
ATTR_API_FORECAST_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||
},
|
||||
FORECAST_MODE_HOURLY: {
|
||||
ATTR_API_FORECAST_CONDITION: ATTR_FORECAST_CONDITION,
|
||||
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
|
||||
ATTR_API_FORECAST_PRECIPITATION: ATTR_FORECAST_NATIVE_PRECIPITATION,
|
||||
ATTR_API_FORECAST_TEMP: ATTR_FORECAST_NATIVE_TEMP,
|
||||
ATTR_API_FORECAST_TIME: ATTR_FORECAST_TIME,
|
||||
ATTR_API_FORECAST_WIND_BEARING: ATTR_FORECAST_WIND_BEARING,
|
||||
ATTR_API_FORECAST_WIND_MAX_SPEED: ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
|
||||
ATTR_API_FORECAST_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
hass: HomeAssistant,
|
||||
@ -95,11 +59,11 @@ async def async_setup_entry(
|
||||
if entity_registry.async_get_entity_id(
|
||||
WEATHER_DOMAIN,
|
||||
DOMAIN,
|
||||
f"{config_entry.unique_id} {FORECAST_MODE_HOURLY}",
|
||||
f"{config_entry.unique_id} {WEATHER_FORECAST_MODES[AOD_FORECAST_HOURLY]}",
|
||||
):
|
||||
for mode in FORECAST_MODES:
|
||||
name = f"{domain_data[ENTRY_NAME]} {mode}"
|
||||
unique_id = f"{config_entry.unique_id} {mode}"
|
||||
for mode, mode_id in WEATHER_FORECAST_MODES.items():
|
||||
name = f"{domain_data[ENTRY_NAME]} {mode_id}"
|
||||
unique_id = f"{config_entry.unique_id} {mode_id}"
|
||||
entities.append(AemetWeather(name, unique_id, weather_coordinator, mode))
|
||||
else:
|
||||
entities.append(
|
||||
@ -107,15 +71,18 @@ async def async_setup_entry(
|
||||
domain_data[ENTRY_NAME],
|
||||
config_entry.unique_id,
|
||||
weather_coordinator,
|
||||
FORECAST_MODE_DAILY,
|
||||
AOD_FORECAST_DAILY,
|
||||
)
|
||||
)
|
||||
|
||||
async_add_entities(entities, False)
|
||||
|
||||
|
||||
class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
|
||||
"""Implementation of an AEMET OpenData sensor."""
|
||||
class AemetWeather(
|
||||
AemetEntity,
|
||||
SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator],
|
||||
):
|
||||
"""Implementation of an AEMET OpenData weather."""
|
||||
|
||||
_attr_attribution = ATTRIBUTION
|
||||
_attr_native_precipitation_unit = UnitOfPrecipitationDepth.MILLIMETERS
|
||||
@ -137,7 +104,7 @@ class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
|
||||
super().__init__(coordinator)
|
||||
self._forecast_mode = forecast_mode
|
||||
self._attr_entity_registry_enabled_default = (
|
||||
self._forecast_mode == FORECAST_MODE_DAILY
|
||||
self._forecast_mode == AOD_FORECAST_DAILY
|
||||
)
|
||||
self._attr_name = name
|
||||
self._attr_unique_id = unique_id
|
||||
@ -145,61 +112,50 @@ class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
|
||||
@property
|
||||
def condition(self):
|
||||
"""Return the current condition."""
|
||||
return self.coordinator.data[ATTR_API_CONDITION]
|
||||
|
||||
def _forecast(self, forecast_mode: str) -> list[Forecast]:
|
||||
"""Return the forecast array."""
|
||||
forecasts = self.coordinator.data[FORECAST_MODE_ATTR_API[forecast_mode]]
|
||||
forecast_map = FORECAST_MAP[forecast_mode]
|
||||
return cast(
|
||||
list[Forecast],
|
||||
[
|
||||
{ha_key: forecast[api_key] for api_key, ha_key in forecast_map.items()}
|
||||
for forecast in forecasts
|
||||
],
|
||||
)
|
||||
cond = self.get_aemet_value([AOD_WEATHER, AOD_CONDITION])
|
||||
return CONDITIONS_MAP.get(cond)
|
||||
|
||||
@property
|
||||
def forecast(self) -> list[Forecast]:
|
||||
"""Return the forecast array."""
|
||||
return self._forecast(self._forecast_mode)
|
||||
return self.get_aemet_forecast(self._forecast_mode)
|
||||
|
||||
@callback
|
||||
def _async_forecast_daily(self) -> list[Forecast]:
|
||||
"""Return the daily forecast in native units."""
|
||||
return self._forecast(FORECAST_MODE_DAILY)
|
||||
return self.get_aemet_forecast(AOD_FORECAST_DAILY)
|
||||
|
||||
@callback
|
||||
def _async_forecast_hourly(self) -> list[Forecast]:
|
||||
"""Return the hourly forecast in native units."""
|
||||
return self._forecast(FORECAST_MODE_HOURLY)
|
||||
return self.get_aemet_forecast(AOD_FORECAST_HOURLY)
|
||||
|
||||
@property
|
||||
def humidity(self):
|
||||
"""Return the humidity."""
|
||||
return self.coordinator.data[ATTR_API_HUMIDITY]
|
||||
return self.get_aemet_value([AOD_WEATHER, AOD_HUMIDITY])
|
||||
|
||||
@property
|
||||
def native_pressure(self):
|
||||
"""Return the pressure."""
|
||||
return self.coordinator.data[ATTR_API_PRESSURE]
|
||||
return self.get_aemet_value([AOD_WEATHER, AOD_PRESSURE])
|
||||
|
||||
@property
|
||||
def native_temperature(self):
|
||||
"""Return the temperature."""
|
||||
return self.coordinator.data[ATTR_API_TEMPERATURE]
|
||||
return self.get_aemet_value([AOD_WEATHER, AOD_TEMP])
|
||||
|
||||
@property
|
||||
def wind_bearing(self):
|
||||
"""Return the wind bearing."""
|
||||
return self.coordinator.data[ATTR_API_WIND_BEARING]
|
||||
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_DIRECTION])
|
||||
|
||||
@property
|
||||
def native_wind_gust_speed(self):
|
||||
"""Return the wind gust speed in native units."""
|
||||
return self.coordinator.data[ATTR_API_WIND_MAX_SPEED]
|
||||
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_SPEED_MAX])
|
||||
|
||||
@property
|
||||
def native_wind_speed(self):
|
||||
"""Return the wind speed."""
|
||||
return self.coordinator.data[ATTR_API_WIND_SPEED]
|
||||
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_SPEED])
|
||||
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
||||
from asyncio import timeout
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
from typing import Any, Final
|
||||
from typing import Any, Final, cast
|
||||
|
||||
from aemet_opendata.const import (
|
||||
AEMET_ATTR_DATE,
|
||||
@ -31,17 +31,24 @@ from aemet_opendata.const import (
|
||||
AEMET_ATTR_TEMPERATURE,
|
||||
AEMET_ATTR_WIND,
|
||||
AEMET_ATTR_WIND_GUST,
|
||||
AOD_CONDITION,
|
||||
AOD_FORECAST,
|
||||
AOD_FORECAST_DAILY,
|
||||
AOD_FORECAST_HOURLY,
|
||||
AOD_TOWN,
|
||||
ATTR_DATA,
|
||||
)
|
||||
from aemet_opendata.exceptions import AemetError
|
||||
from aemet_opendata.forecast import ForecastValue
|
||||
from aemet_opendata.helpers import (
|
||||
dict_nested_value,
|
||||
get_forecast_day_value,
|
||||
get_forecast_hour_value,
|
||||
get_forecast_interval_value,
|
||||
)
|
||||
from aemet_opendata.interface import AEMET
|
||||
|
||||
from homeassistant.components.weather import Forecast
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||
from homeassistant.util import dt as dt_util
|
||||
@ -79,6 +86,7 @@ from .const import (
|
||||
ATTR_API_WIND_SPEED,
|
||||
CONDITIONS_MAP,
|
||||
DOMAIN,
|
||||
FORECAST_MAP,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@ -239,6 +247,12 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
|
||||
weather_response, now
|
||||
)
|
||||
|
||||
data = self.aemet.data()
|
||||
forecasts: list[dict[str, Forecast]] = {
|
||||
AOD_FORECAST_DAILY: self.aemet_forecast(data, AOD_FORECAST_DAILY),
|
||||
AOD_FORECAST_HOURLY: self.aemet_forecast(data, AOD_FORECAST_HOURLY),
|
||||
}
|
||||
|
||||
return {
|
||||
ATTR_API_CONDITION: condition,
|
||||
ATTR_API_FORECAST_DAILY: forecast_daily,
|
||||
@ -261,8 +275,29 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
|
||||
ATTR_API_WIND_BEARING: wind_bearing,
|
||||
ATTR_API_WIND_MAX_SPEED: wind_max_speed,
|
||||
ATTR_API_WIND_SPEED: wind_speed,
|
||||
"forecast": forecasts,
|
||||
"lib": data,
|
||||
}
|
||||
|
||||
def aemet_forecast(
|
||||
self,
|
||||
data: dict[str, Any],
|
||||
forecast_mode: str,
|
||||
) -> list[Forecast]:
|
||||
"""Return the forecast array."""
|
||||
forecasts = dict_nested_value(data, [AOD_TOWN, forecast_mode, AOD_FORECAST])
|
||||
forecast_map = FORECAST_MAP[forecast_mode]
|
||||
forecast_list: list[dict[str, Any]] = []
|
||||
for forecast in forecasts:
|
||||
cur_forecast: dict[str, Any] = {}
|
||||
for api_key, ha_key in forecast_map.items():
|
||||
value = forecast[api_key]
|
||||
if api_key == AOD_CONDITION:
|
||||
value = CONDITIONS_MAP.get(value)
|
||||
cur_forecast[ha_key] = value
|
||||
forecast_list += [cur_forecast]
|
||||
return cast(list[Forecast], forecast_list)
|
||||
|
||||
def _get_daily_forecast_from_weather_response(self, weather_response, now):
|
||||
if weather_response.daily:
|
||||
parse = False
|
||||
|
@ -14,7 +14,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-11T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 3.0,
|
||||
'templow': -7.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -23,7 +23,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-12T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'templow': -13.0,
|
||||
'wind_bearing': None,
|
||||
@ -31,7 +31,7 @@
|
||||
dict({
|
||||
'condition': 'sunny',
|
||||
'datetime': '2021-01-13T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 6.0,
|
||||
'templow': -11.0,
|
||||
'wind_bearing': None,
|
||||
@ -39,7 +39,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-14T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 6.0,
|
||||
'templow': -7.0,
|
||||
'wind_bearing': None,
|
||||
@ -47,7 +47,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-15T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 5.0,
|
||||
'templow': -4.0,
|
||||
'wind_bearing': None,
|
||||
@ -151,6 +151,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-09T21:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 90.0,
|
||||
@ -160,6 +161,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-09T22:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -169,6 +171,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-09T23:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 90.0,
|
||||
@ -178,7 +181,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 12.0,
|
||||
@ -187,6 +191,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T01:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -196,6 +201,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T02:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -205,6 +211,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T03:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -214,6 +221,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T04:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -223,6 +231,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T05:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -232,7 +241,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T06:00:00+00:00',
|
||||
'precipitation_probability': 10,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 0.0,
|
||||
'wind_gust_speed': 13.0,
|
||||
@ -241,6 +251,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T07:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -250,6 +261,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T08:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -259,6 +271,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T09:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -268,6 +281,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T10:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -277,6 +291,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T11:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': 2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -286,7 +301,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T12:00:00+00:00',
|
||||
'precipitation_probability': 15,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 32.0,
|
||||
@ -295,6 +311,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T13:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -304,6 +321,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T14:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -313,6 +331,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T15:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 4.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -322,6 +341,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T16:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -331,6 +351,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T17:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -340,7 +361,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T18:00:00+00:00',
|
||||
'precipitation_probability': 5,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 24.0,
|
||||
@ -349,7 +371,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T19:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 25.0,
|
||||
@ -358,7 +381,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T20:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 25.0,
|
||||
@ -367,7 +391,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T21:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 24.0,
|
||||
@ -376,7 +401,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T22:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 27.0,
|
||||
@ -385,7 +411,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T23:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 30.0,
|
||||
@ -394,7 +421,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-11T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 30.0,
|
||||
@ -403,7 +431,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-11T01:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 27.0,
|
||||
@ -412,7 +441,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T02:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 22.0,
|
||||
@ -421,7 +451,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T03:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 17.0,
|
||||
@ -430,7 +461,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T04:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -3.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 15.0,
|
||||
@ -439,7 +471,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T05:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -4.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 15.0,
|
||||
@ -471,7 +504,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-11T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 3.0,
|
||||
'templow': -7.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -480,7 +513,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-12T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'templow': -13.0,
|
||||
'wind_bearing': None,
|
||||
@ -488,7 +521,7 @@
|
||||
dict({
|
||||
'condition': 'sunny',
|
||||
'datetime': '2021-01-13T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 6.0,
|
||||
'templow': -11.0,
|
||||
'wind_bearing': None,
|
||||
@ -496,7 +529,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-14T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 6.0,
|
||||
'templow': -7.0,
|
||||
'wind_bearing': None,
|
||||
@ -504,7 +537,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-15T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 5.0,
|
||||
'templow': -4.0,
|
||||
'wind_bearing': None,
|
||||
@ -525,7 +558,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-11T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 3.0,
|
||||
'templow': -7.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -534,7 +567,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-12T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'templow': -13.0,
|
||||
'wind_bearing': None,
|
||||
@ -542,7 +575,7 @@
|
||||
dict({
|
||||
'condition': 'sunny',
|
||||
'datetime': '2021-01-13T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 6.0,
|
||||
'templow': -11.0,
|
||||
'wind_bearing': None,
|
||||
@ -550,7 +583,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-14T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 6.0,
|
||||
'templow': -7.0,
|
||||
'wind_bearing': None,
|
||||
@ -558,7 +591,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-15T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 5.0,
|
||||
'templow': -4.0,
|
||||
'wind_bearing': None,
|
||||
@ -660,6 +693,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-09T21:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 90.0,
|
||||
@ -669,6 +703,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-09T22:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -678,6 +713,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-09T23:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 90.0,
|
||||
@ -687,7 +723,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 12.0,
|
||||
@ -696,6 +733,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T01:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -705,6 +743,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T02:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -714,6 +753,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T03:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -723,6 +763,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T04:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -732,6 +773,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T05:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -741,7 +783,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T06:00:00+00:00',
|
||||
'precipitation_probability': 10,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 0.0,
|
||||
'wind_gust_speed': 13.0,
|
||||
@ -750,6 +793,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T07:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -759,6 +803,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T08:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -768,6 +813,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T09:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -777,6 +823,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T10:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -786,6 +833,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T11:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': 2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -795,7 +843,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T12:00:00+00:00',
|
||||
'precipitation_probability': 15,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 32.0,
|
||||
@ -804,6 +853,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T13:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -813,6 +863,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T14:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -822,6 +873,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T15:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 4.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -831,6 +883,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T16:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -840,6 +893,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T17:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -849,7 +903,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T18:00:00+00:00',
|
||||
'precipitation_probability': 5,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 24.0,
|
||||
@ -858,7 +913,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T19:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 25.0,
|
||||
@ -867,7 +923,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T20:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 25.0,
|
||||
@ -876,7 +933,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T21:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 24.0,
|
||||
@ -885,7 +943,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T22:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 27.0,
|
||||
@ -894,7 +953,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T23:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 30.0,
|
||||
@ -903,7 +963,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-11T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 30.0,
|
||||
@ -912,7 +973,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-11T01:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 27.0,
|
||||
@ -921,7 +983,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T02:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 22.0,
|
||||
@ -930,7 +993,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T03:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 17.0,
|
||||
@ -939,7 +1003,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T04:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -3.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 15.0,
|
||||
@ -948,7 +1013,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T05:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -4.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 15.0,
|
||||
@ -1060,6 +1126,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-09T21:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 90.0,
|
||||
@ -1069,6 +1136,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-09T22:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1078,6 +1146,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-09T23:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 100,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 90.0,
|
||||
@ -1087,7 +1156,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 12.0,
|
||||
@ -1096,6 +1166,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T01:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1105,6 +1176,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T02:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -1114,6 +1186,7 @@
|
||||
dict({
|
||||
'condition': 'fog',
|
||||
'datetime': '2021-01-10T03:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -1123,6 +1196,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T04:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1132,6 +1206,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T05:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 10,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 0.0,
|
||||
@ -1141,7 +1216,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T06:00:00+00:00',
|
||||
'precipitation_probability': 10,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 0.0,
|
||||
'wind_gust_speed': 13.0,
|
||||
@ -1150,6 +1226,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T07:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1159,6 +1236,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T08:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1168,6 +1246,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T09:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1177,6 +1256,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T10:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1186,6 +1266,7 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T11:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 15,
|
||||
'temperature': 2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1195,7 +1276,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T12:00:00+00:00',
|
||||
'precipitation_probability': 15,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 32.0,
|
||||
@ -1204,6 +1286,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T13:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1213,6 +1296,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T14:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1222,6 +1306,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T15:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 4.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1231,6 +1316,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T16:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 3.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1240,6 +1326,7 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T17:00:00+00:00',
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 5,
|
||||
'temperature': 2.0,
|
||||
'wind_bearing': 45.0,
|
||||
@ -1249,7 +1336,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T18:00:00+00:00',
|
||||
'precipitation_probability': 5,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 24.0,
|
||||
@ -1258,7 +1346,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-10T19:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 25.0,
|
||||
@ -1267,7 +1356,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T20:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 25.0,
|
||||
@ -1276,7 +1366,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T21:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 24.0,
|
||||
@ -1285,7 +1376,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T22:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 27.0,
|
||||
@ -1294,7 +1386,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-10T23:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': 0.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 30.0,
|
||||
@ -1303,7 +1396,8 @@
|
||||
dict({
|
||||
'condition': 'cloudy',
|
||||
'datetime': '2021-01-11T00:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 30.0,
|
||||
@ -1312,7 +1406,8 @@
|
||||
dict({
|
||||
'condition': 'partlycloudy',
|
||||
'datetime': '2021-01-11T01:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -1.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 27.0,
|
||||
@ -1321,7 +1416,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T02:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 22.0,
|
||||
@ -1330,7 +1426,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T03:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -2.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 17.0,
|
||||
@ -1339,7 +1436,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T04:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -3.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 15.0,
|
||||
@ -1348,7 +1446,8 @@
|
||||
dict({
|
||||
'condition': 'clear-night',
|
||||
'datetime': '2021-01-11T05:00:00+00:00',
|
||||
'precipitation_probability': None,
|
||||
'precipitation': 0.0,
|
||||
'precipitation_probability': 0,
|
||||
'temperature': -4.0,
|
||||
'wind_bearing': 45.0,
|
||||
'wind_gust_speed': 15.0,
|
||||
|
@ -54,25 +54,25 @@ async def test_aemet_weather(
|
||||
state = hass.states.get("weather.aemet")
|
||||
assert state
|
||||
assert state.state == ATTR_CONDITION_SNOWY
|
||||
assert state.attributes.get(ATTR_ATTRIBUTION) == ATTRIBUTION
|
||||
assert state.attributes.get(ATTR_WEATHER_HUMIDITY) == 99.0
|
||||
assert state.attributes.get(ATTR_WEATHER_PRESSURE) == 1004.4 # 100440.0 Pa -> hPa
|
||||
assert state.attributes.get(ATTR_WEATHER_TEMPERATURE) == -0.7
|
||||
assert state.attributes.get(ATTR_WEATHER_WIND_BEARING) == 90.0
|
||||
assert state.attributes.get(ATTR_WEATHER_WIND_GUST_SPEED) == 24.0
|
||||
assert state.attributes.get(ATTR_WEATHER_WIND_SPEED) == 15.0 # 4.17 m/s -> km/h
|
||||
forecast = state.attributes.get(ATTR_FORECAST)[0]
|
||||
assert forecast.get(ATTR_FORECAST_CONDITION) == ATTR_CONDITION_PARTLYCLOUDY
|
||||
assert forecast.get(ATTR_FORECAST_PRECIPITATION) is None
|
||||
assert forecast.get(ATTR_FORECAST_PRECIPITATION_PROBABILITY) == 30
|
||||
assert forecast.get(ATTR_FORECAST_TEMP) == 4
|
||||
assert forecast.get(ATTR_FORECAST_TEMP_LOW) == -4
|
||||
assert state.attributes[ATTR_ATTRIBUTION] == ATTRIBUTION
|
||||
assert state.attributes[ATTR_WEATHER_HUMIDITY] == 99.0
|
||||
assert state.attributes[ATTR_WEATHER_PRESSURE] == 1004.4 # 100440.0 Pa -> hPa
|
||||
assert state.attributes[ATTR_WEATHER_TEMPERATURE] == -0.7
|
||||
assert state.attributes[ATTR_WEATHER_WIND_BEARING] == 122.0
|
||||
assert state.attributes[ATTR_WEATHER_WIND_GUST_SPEED] == 12.2
|
||||
assert state.attributes[ATTR_WEATHER_WIND_SPEED] == 3.2
|
||||
forecast = state.attributes[ATTR_FORECAST][0]
|
||||
assert forecast[ATTR_FORECAST_CONDITION] == ATTR_CONDITION_PARTLYCLOUDY
|
||||
assert ATTR_FORECAST_PRECIPITATION not in forecast
|
||||
assert forecast[ATTR_FORECAST_PRECIPITATION_PROBABILITY] == 30
|
||||
assert forecast[ATTR_FORECAST_TEMP] == 4
|
||||
assert forecast[ATTR_FORECAST_TEMP_LOW] == -4
|
||||
assert (
|
||||
forecast.get(ATTR_FORECAST_TIME)
|
||||
forecast[ATTR_FORECAST_TIME]
|
||||
== dt_util.parse_datetime("2021-01-10 00:00:00+00:00").isoformat()
|
||||
)
|
||||
assert forecast.get(ATTR_FORECAST_WIND_BEARING) == 45.0
|
||||
assert forecast.get(ATTR_FORECAST_WIND_SPEED) == 20.0 # 5.56 m/s -> km/h
|
||||
assert forecast[ATTR_FORECAST_WIND_BEARING] == 45.0
|
||||
assert forecast[ATTR_FORECAST_WIND_SPEED] == 20.0 # 5.56 m/s -> km/h
|
||||
|
||||
state = hass.states.get("weather.aemet_hourly")
|
||||
assert state is None
|
||||
@ -98,25 +98,25 @@ async def test_aemet_weather_legacy(
|
||||
state = hass.states.get("weather.aemet_daily")
|
||||
assert state
|
||||
assert state.state == ATTR_CONDITION_SNOWY
|
||||
assert state.attributes.get(ATTR_ATTRIBUTION) == ATTRIBUTION
|
||||
assert state.attributes.get(ATTR_WEATHER_HUMIDITY) == 99.0
|
||||
assert state.attributes.get(ATTR_WEATHER_PRESSURE) == 1004.4 # 100440.0 Pa -> hPa
|
||||
assert state.attributes.get(ATTR_WEATHER_TEMPERATURE) == -0.7
|
||||
assert state.attributes.get(ATTR_WEATHER_WIND_BEARING) == 90.0
|
||||
assert state.attributes.get(ATTR_WEATHER_WIND_GUST_SPEED) == 24.0
|
||||
assert state.attributes.get(ATTR_WEATHER_WIND_SPEED) == 15.0 # 4.17 m/s -> km/h
|
||||
forecast = state.attributes.get(ATTR_FORECAST)[0]
|
||||
assert forecast.get(ATTR_FORECAST_CONDITION) == ATTR_CONDITION_PARTLYCLOUDY
|
||||
assert forecast.get(ATTR_FORECAST_PRECIPITATION) is None
|
||||
assert forecast.get(ATTR_FORECAST_PRECIPITATION_PROBABILITY) == 30
|
||||
assert forecast.get(ATTR_FORECAST_TEMP) == 4
|
||||
assert forecast.get(ATTR_FORECAST_TEMP_LOW) == -4
|
||||
assert state.attributes[ATTR_ATTRIBUTION] == ATTRIBUTION
|
||||
assert state.attributes[ATTR_WEATHER_HUMIDITY] == 99.0
|
||||
assert state.attributes[ATTR_WEATHER_PRESSURE] == 1004.4 # 100440.0 Pa -> hPa
|
||||
assert state.attributes[ATTR_WEATHER_TEMPERATURE] == -0.7
|
||||
assert state.attributes[ATTR_WEATHER_WIND_BEARING] == 122.0
|
||||
assert state.attributes[ATTR_WEATHER_WIND_GUST_SPEED] == 12.2
|
||||
assert state.attributes[ATTR_WEATHER_WIND_SPEED] == 3.2
|
||||
forecast = state.attributes[ATTR_FORECAST][0]
|
||||
assert forecast[ATTR_FORECAST_CONDITION] == ATTR_CONDITION_PARTLYCLOUDY
|
||||
assert ATTR_FORECAST_PRECIPITATION not in forecast
|
||||
assert forecast[ATTR_FORECAST_PRECIPITATION_PROBABILITY] == 30
|
||||
assert forecast[ATTR_FORECAST_TEMP] == 4
|
||||
assert forecast[ATTR_FORECAST_TEMP_LOW] == -4
|
||||
assert (
|
||||
forecast.get(ATTR_FORECAST_TIME)
|
||||
forecast[ATTR_FORECAST_TIME]
|
||||
== dt_util.parse_datetime("2021-01-10 00:00:00+00:00").isoformat()
|
||||
)
|
||||
assert forecast.get(ATTR_FORECAST_WIND_BEARING) == 45.0
|
||||
assert forecast.get(ATTR_FORECAST_WIND_SPEED) == 20.0 # 5.56 m/s -> km/h
|
||||
assert forecast[ATTR_FORECAST_WIND_BEARING] == 45.0
|
||||
assert forecast[ATTR_FORECAST_WIND_SPEED] == 20.0 # 5.56 m/s -> km/h
|
||||
|
||||
state = hass.states.get("weather.aemet_hourly")
|
||||
assert state is None
|
||||
|
Loading…
x
Reference in New Issue
Block a user