1
mirror of https://github.com/home-assistant/core synced 2024-08-28 03:36:46 +02:00

Add AEMET library data to coordinator and use it for weather platform (#102954)

This commit is contained in:
Álvaro Fernández Rojas 2023-10-28 20:53:40 +02:00 committed by GitHub
parent 8703621c64
commit fb5d058885
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 336 additions and 175 deletions

View File

@ -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",
}

View 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)

View File

@ -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])

View File

@ -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

View File

@ -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,

View File

@ -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