From fb5d058885ade9b6a8214d880911001ff688580f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Sat, 28 Oct 2023 20:53:40 +0200 Subject: [PATCH] Add AEMET library data to coordinator and use it for weather platform (#102954) --- homeassistant/components/aemet/const.py | 48 ++++ homeassistant/components/aemet/entity.py | 23 ++ homeassistant/components/aemet/weather.py | 120 +++------- .../aemet/weather_update_coordinator.py | 37 ++- .../aemet/snapshots/test_weather.ambr | 219 +++++++++++++----- tests/components/aemet/test_weather.py | 64 ++--- 6 files changed, 336 insertions(+), 175 deletions(-) create mode 100644 homeassistant/components/aemet/entity.py diff --git a/homeassistant/components/aemet/const.py b/homeassistant/components/aemet/const.py index 7940ff92f72..c3328fc1b5d 100644 --- a/homeassistant/components/aemet/const.py +++ b/homeassistant/components/aemet/const.py @@ -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", +} diff --git a/homeassistant/components/aemet/entity.py b/homeassistant/components/aemet/entity.py new file mode 100644 index 00000000000..527ff046104 --- /dev/null +++ b/homeassistant/components/aemet/entity.py @@ -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) diff --git a/homeassistant/components/aemet/weather.py b/homeassistant/components/aemet/weather.py index 03f91a74740..b7b3c31ab5b 100644 --- a/homeassistant/components/aemet/weather.py +++ b/homeassistant/components/aemet/weather.py @@ -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]) diff --git a/homeassistant/components/aemet/weather_update_coordinator.py b/homeassistant/components/aemet/weather_update_coordinator.py index 01c2502fb37..cd95a8e0854 100644 --- a/homeassistant/components/aemet/weather_update_coordinator.py +++ b/homeassistant/components/aemet/weather_update_coordinator.py @@ -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 diff --git a/tests/components/aemet/snapshots/test_weather.ambr b/tests/components/aemet/snapshots/test_weather.ambr index 3078cab4480..08cc379267d 100644 --- a/tests/components/aemet/snapshots/test_weather.ambr +++ b/tests/components/aemet/snapshots/test_weather.ambr @@ -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, diff --git a/tests/components/aemet/test_weather.py b/tests/components/aemet/test_weather.py index d0042faaaa0..67cdbe7805d 100644 --- a/tests/components/aemet/test_weather.py +++ b/tests/components/aemet/test_weather.py @@ -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