mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 09:17:10 +00:00
Use library for condition/wind direction conversions (#100117)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
parent
c347c78b6d
commit
851dc4cdf4
@ -1,6 +1,19 @@
|
|||||||
"""Constant values for the AEMET OpenData component."""
|
"""Constant values for the AEMET OpenData component."""
|
||||||
from __future__ import annotations
|
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 (
|
from homeassistant.components.weather import (
|
||||||
ATTR_CONDITION_CLEAR_NIGHT,
|
ATTR_CONDITION_CLEAR_NIGHT,
|
||||||
ATTR_CONDITION_CLOUDY,
|
ATTR_CONDITION_CLOUDY,
|
||||||
@ -55,94 +68,16 @@ ATTR_API_WIND_MAX_SPEED = "wind-max-speed"
|
|||||||
ATTR_API_WIND_SPEED = "wind-speed"
|
ATTR_API_WIND_SPEED = "wind-speed"
|
||||||
|
|
||||||
CONDITIONS_MAP = {
|
CONDITIONS_MAP = {
|
||||||
ATTR_CONDITION_CLEAR_NIGHT: {
|
AOD_COND_CLEAR_NIGHT: ATTR_CONDITION_CLEAR_NIGHT,
|
||||||
"11n", # Despejado (de noche)
|
AOD_COND_CLOUDY: ATTR_CONDITION_CLOUDY,
|
||||||
},
|
AOD_COND_FOG: ATTR_CONDITION_FOG,
|
||||||
ATTR_CONDITION_CLOUDY: {
|
AOD_COND_LIGHTNING: ATTR_CONDITION_LIGHTNING,
|
||||||
"14", # Nuboso
|
AOD_COND_LIGHTNING_RAINY: ATTR_CONDITION_LIGHTNING_RAINY,
|
||||||
"14n", # Nuboso (de noche)
|
AOD_COND_PARTLY_CLODUY: ATTR_CONDITION_PARTLYCLOUDY,
|
||||||
"15", # Muy nuboso
|
AOD_COND_POURING: ATTR_CONDITION_POURING,
|
||||||
"15n", # Muy nuboso (de noche)
|
AOD_COND_RAINY: ATTR_CONDITION_RAINY,
|
||||||
"16", # Cubierto
|
AOD_COND_SNOWY: ATTR_CONDITION_SNOWY,
|
||||||
"16n", # Cubierto (de noche)
|
AOD_COND_SUNNY: ATTR_CONDITION_SUNNY,
|
||||||
"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
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FORECAST_MONITORED_CONDITIONS = [
|
FORECAST_MONITORED_CONDITIONS = [
|
||||||
@ -187,16 +122,3 @@ FORECAST_MODE_ATTR_API = {
|
|||||||
FORECAST_MODE_DAILY: ATTR_API_FORECAST_DAILY,
|
FORECAST_MODE_DAILY: ATTR_API_FORECAST_DAILY,
|
||||||
FORECAST_MODE_HOURLY: ATTR_API_FORECAST_HOURLY,
|
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,
|
|
||||||
}
|
|
||||||
|
@ -34,6 +34,7 @@ from aemet_opendata.const import (
|
|||||||
ATTR_DATA,
|
ATTR_DATA,
|
||||||
)
|
)
|
||||||
from aemet_opendata.exceptions import AemetError
|
from aemet_opendata.exceptions import AemetError
|
||||||
|
from aemet_opendata.forecast import ForecastValue
|
||||||
from aemet_opendata.helpers import (
|
from aemet_opendata.helpers import (
|
||||||
get_forecast_day_value,
|
get_forecast_day_value,
|
||||||
get_forecast_hour_value,
|
get_forecast_hour_value,
|
||||||
@ -78,7 +79,6 @@ from .const import (
|
|||||||
ATTR_API_WIND_SPEED,
|
ATTR_API_WIND_SPEED,
|
||||||
CONDITIONS_MAP,
|
CONDITIONS_MAP,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
WIND_BEARING_MAP,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -90,11 +90,8 @@ WEATHER_UPDATE_INTERVAL = timedelta(minutes=10)
|
|||||||
|
|
||||||
def format_condition(condition: str) -> str:
|
def format_condition(condition: str) -> str:
|
||||||
"""Return condition from dict CONDITIONS_MAP."""
|
"""Return condition from dict CONDITIONS_MAP."""
|
||||||
for key, value in CONDITIONS_MAP.items():
|
val = ForecastValue.parse_condition(condition)
|
||||||
if condition in value:
|
return CONDITIONS_MAP.get(val, val)
|
||||||
return key
|
|
||||||
_LOGGER.error('Condition "%s" not found in CONDITIONS_MAP', condition)
|
|
||||||
return condition
|
|
||||||
|
|
||||||
|
|
||||||
def format_float(value) -> float | None:
|
def format_float(value) -> float | None:
|
||||||
@ -489,10 +486,7 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
val = get_forecast_hour_value(
|
val = get_forecast_hour_value(
|
||||||
day_data[AEMET_ATTR_WIND_GUST], hour, key=AEMET_ATTR_DIRECTION
|
day_data[AEMET_ATTR_WIND_GUST], hour, key=AEMET_ATTR_DIRECTION
|
||||||
)[0]
|
)[0]
|
||||||
if val in WIND_BEARING_MAP:
|
return ForecastValue.parse_wind_direction(val)
|
||||||
return WIND_BEARING_MAP[val]
|
|
||||||
_LOGGER.error("%s not found in Wind Bearing map", val)
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_wind_bearing_day(day_data):
|
def _get_wind_bearing_day(day_data):
|
||||||
@ -500,10 +494,7 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
val = get_forecast_day_value(
|
val = get_forecast_day_value(
|
||||||
day_data[AEMET_ATTR_WIND], key=AEMET_ATTR_DIRECTION
|
day_data[AEMET_ATTR_WIND], key=AEMET_ATTR_DIRECTION
|
||||||
)
|
)
|
||||||
if val in WIND_BEARING_MAP:
|
return ForecastValue.parse_wind_direction(val)
|
||||||
return WIND_BEARING_MAP[val]
|
|
||||||
_LOGGER.error("%s not found in Wind Bearing map", val)
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_wind_max_speed(day_data, hour):
|
def _get_wind_max_speed(day_data, hour):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user