From 851dc4cdf48eab59c8179b60d1e5d114de6b00ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Tue, 12 Sep 2023 05:26:58 +0900 Subject: [PATCH] Use library for condition/wind direction conversions (#100117) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Álvaro Fernández Rojas --- homeassistant/components/aemet/const.py | 124 ++++-------------- .../aemet/weather_update_coordinator.py | 19 +-- 2 files changed, 28 insertions(+), 115 deletions(-) diff --git a/homeassistant/components/aemet/const.py b/homeassistant/components/aemet/const.py index c6c4a9c1628..7940ff92f72 100644 --- a/homeassistant/components/aemet/const.py +++ b/homeassistant/components/aemet/const.py @@ -1,6 +1,19 @@ """Constant values for the AEMET OpenData component.""" from __future__ import annotations +from aemet_opendata.const import ( + AOD_COND_CLEAR_NIGHT, + AOD_COND_CLOUDY, + AOD_COND_FOG, + AOD_COND_LIGHTNING, + AOD_COND_LIGHTNING_RAINY, + AOD_COND_PARTLY_CLODUY, + AOD_COND_POURING, + AOD_COND_RAINY, + AOD_COND_SNOWY, + AOD_COND_SUNNY, +) + from homeassistant.components.weather import ( ATTR_CONDITION_CLEAR_NIGHT, ATTR_CONDITION_CLOUDY, @@ -55,94 +68,16 @@ ATTR_API_WIND_MAX_SPEED = "wind-max-speed" ATTR_API_WIND_SPEED = "wind-speed" CONDITIONS_MAP = { - ATTR_CONDITION_CLEAR_NIGHT: { - "11n", # Despejado (de noche) - }, - ATTR_CONDITION_CLOUDY: { - "14", # Nuboso - "14n", # Nuboso (de noche) - "15", # Muy nuboso - "15n", # Muy nuboso (de noche) - "16", # Cubierto - "16n", # Cubierto (de noche) - "17", # Nubes altas - "17n", # Nubes altas (de noche) - }, - ATTR_CONDITION_FOG: { - "81", # Niebla - "81n", # Niebla (de noche) - "82", # Bruma - Neblina - "82n", # Bruma - Neblina (de noche) - }, - ATTR_CONDITION_LIGHTNING: { - "51", # Intervalos nubosos con tormenta - "51n", # Intervalos nubosos con tormenta (de noche) - "52", # Nuboso con tormenta - "52n", # Nuboso con tormenta (de noche) - "53", # Muy nuboso con tormenta - "53n", # Muy nuboso con tormenta (de noche) - "54", # Cubierto con tormenta - "54n", # Cubierto con tormenta (de noche) - }, - ATTR_CONDITION_LIGHTNING_RAINY: { - "61", # Intervalos nubosos con tormenta y lluvia escasa - "61n", # Intervalos nubosos con tormenta y lluvia escasa (de noche) - "62", # Nuboso con tormenta y lluvia escasa - "62n", # Nuboso con tormenta y lluvia escasa (de noche) - "63", # Muy nuboso con tormenta y lluvia escasa - "63n", # Muy nuboso con tormenta y lluvia escasa (de noche) - "64", # Cubierto con tormenta y lluvia escasa - "64n", # Cubierto con tormenta y lluvia escasa (de noche) - }, - ATTR_CONDITION_PARTLYCLOUDY: { - "12", # Poco nuboso - "12n", # Poco nuboso (de noche) - "13", # Intervalos nubosos - "13n", # Intervalos nubosos (de noche) - }, - ATTR_CONDITION_POURING: { - "27", # Chubascos - "27n", # Chubascos (de noche) - }, - ATTR_CONDITION_RAINY: { - "23", # Intervalos nubosos con lluvia - "23n", # Intervalos nubosos con lluvia (de noche) - "24", # Nuboso con lluvia - "24n", # Nuboso con lluvia (de noche) - "25", # Muy nuboso con lluvia - "25n", # Muy nuboso con lluvia (de noche) - "26", # Cubierto con lluvia - "26n", # Cubierto con lluvia (de noche) - "43", # Intervalos nubosos con lluvia escasa - "43n", # Intervalos nubosos con lluvia escasa (de noche) - "44", # Nuboso con lluvia escasa - "44n", # Nuboso con lluvia escasa (de noche) - "45", # Muy nuboso con lluvia escasa - "45n", # Muy nuboso con lluvia escasa (de noche) - "46", # Cubierto con lluvia escasa - "46n", # Cubierto con lluvia escasa (de noche) - }, - ATTR_CONDITION_SNOWY: { - "33", # Intervalos nubosos con nieve - "33n", # Intervalos nubosos con nieve (de noche) - "34", # Nuboso con nieve - "34n", # Nuboso con nieve (de noche) - "35", # Muy nuboso con nieve - "35n", # Muy nuboso con nieve (de noche) - "36", # Cubierto con nieve - "36n", # Cubierto con nieve (de noche) - "71", # Intervalos nubosos con nieve escasa - "71n", # Intervalos nubosos con nieve escasa (de noche) - "72", # Nuboso con nieve escasa - "72n", # Nuboso con nieve escasa (de noche) - "73", # Muy nuboso con nieve escasa - "73n", # Muy nuboso con nieve escasa (de noche) - "74", # Cubierto con nieve escasa - "74n", # Cubierto con nieve escasa (de noche) - }, - ATTR_CONDITION_SUNNY: { - "11", # Despejado - }, + AOD_COND_CLEAR_NIGHT: ATTR_CONDITION_CLEAR_NIGHT, + AOD_COND_CLOUDY: ATTR_CONDITION_CLOUDY, + AOD_COND_FOG: ATTR_CONDITION_FOG, + AOD_COND_LIGHTNING: ATTR_CONDITION_LIGHTNING, + AOD_COND_LIGHTNING_RAINY: ATTR_CONDITION_LIGHTNING_RAINY, + AOD_COND_PARTLY_CLODUY: ATTR_CONDITION_PARTLYCLOUDY, + AOD_COND_POURING: ATTR_CONDITION_POURING, + AOD_COND_RAINY: ATTR_CONDITION_RAINY, + AOD_COND_SNOWY: ATTR_CONDITION_SNOWY, + AOD_COND_SUNNY: ATTR_CONDITION_SUNNY, } FORECAST_MONITORED_CONDITIONS = [ @@ -187,16 +122,3 @@ FORECAST_MODE_ATTR_API = { FORECAST_MODE_DAILY: ATTR_API_FORECAST_DAILY, FORECAST_MODE_HOURLY: ATTR_API_FORECAST_HOURLY, } - - -WIND_BEARING_MAP = { - "C": None, - "N": 0.0, - "NE": 45.0, - "E": 90.0, - "SE": 135.0, - "S": 180.0, - "SO": 225.0, - "O": 270.0, - "NO": 315.0, -} diff --git a/homeassistant/components/aemet/weather_update_coordinator.py b/homeassistant/components/aemet/weather_update_coordinator.py index c6e27374f8f..01c2502fb37 100644 --- a/homeassistant/components/aemet/weather_update_coordinator.py +++ b/homeassistant/components/aemet/weather_update_coordinator.py @@ -34,6 +34,7 @@ from aemet_opendata.const import ( ATTR_DATA, ) from aemet_opendata.exceptions import AemetError +from aemet_opendata.forecast import ForecastValue from aemet_opendata.helpers import ( get_forecast_day_value, get_forecast_hour_value, @@ -78,7 +79,6 @@ from .const import ( ATTR_API_WIND_SPEED, CONDITIONS_MAP, DOMAIN, - WIND_BEARING_MAP, ) _LOGGER = logging.getLogger(__name__) @@ -90,11 +90,8 @@ WEATHER_UPDATE_INTERVAL = timedelta(minutes=10) def format_condition(condition: str) -> str: """Return condition from dict CONDITIONS_MAP.""" - for key, value in CONDITIONS_MAP.items(): - if condition in value: - return key - _LOGGER.error('Condition "%s" not found in CONDITIONS_MAP', condition) - return condition + val = ForecastValue.parse_condition(condition) + return CONDITIONS_MAP.get(val, val) def format_float(value) -> float | None: @@ -489,10 +486,7 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator): val = get_forecast_hour_value( day_data[AEMET_ATTR_WIND_GUST], hour, key=AEMET_ATTR_DIRECTION )[0] - if val in WIND_BEARING_MAP: - return WIND_BEARING_MAP[val] - _LOGGER.error("%s not found in Wind Bearing map", val) - return None + return ForecastValue.parse_wind_direction(val) @staticmethod def _get_wind_bearing_day(day_data): @@ -500,10 +494,7 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator): val = get_forecast_day_value( day_data[AEMET_ATTR_WIND], key=AEMET_ATTR_DIRECTION ) - if val in WIND_BEARING_MAP: - return WIND_BEARING_MAP[val] - _LOGGER.error("%s not found in Wind Bearing map", val) - return None + return ForecastValue.parse_wind_direction(val) @staticmethod def _get_wind_max_speed(day_data, hour):