1 """Support for Meteo-France weather data."""
3 from datetime
import timedelta
6 from meteofrance_api.client
import MeteoFranceClient
7 from meteofrance_api.helpers
import is_valid_warning_department
8 from meteofrance_api.model
import CurrentPhenomenons, Forecast, Rain
9 import voluptuous
as vol
28 _LOGGER = logging.getLogger(__name__)
34 CITY_SCHEMA = vol.Schema({vol.Required(CONF_CITY): cv.string})
38 """Set up an Meteo-France account from a config entry."""
39 hass.data.setdefault(DOMAIN, {})
41 client = MeteoFranceClient()
42 latitude = entry.data[CONF_LATITUDE]
43 longitude = entry.data[CONF_LONGITUDE]
45 async
def _async_update_data_forecast_forecast() -> Forecast:
46 """Fetch data from API endpoint."""
47 return await hass.async_add_executor_job(
48 client.get_forecast, latitude, longitude
51 async
def _async_update_data_rain() -> Rain:
52 """Fetch data from API endpoint."""
53 return await hass.async_add_executor_job(client.get_rain, latitude, longitude)
55 async
def _async_update_data_alert() -> CurrentPhenomenons:
56 """Fetch data from API endpoint."""
57 assert isinstance(department, str)
58 return await hass.async_add_executor_job(
59 client.get_warning_current_phenomenoms, department, 0,
True
65 name=f
"Météo-France forecast for city {entry.title}",
66 update_method=_async_update_data_forecast_forecast,
67 update_interval=SCAN_INTERVAL,
69 coordinator_rain =
None
70 coordinator_alert =
None
73 await coordinator_forecast.async_refresh()
75 if not coordinator_forecast.last_update_success:
76 raise ConfigEntryNotReady
82 name=f
"Météo-France rain for city {entry.title}",
83 update_method=_async_update_data_rain,
84 update_interval=SCAN_INTERVAL_RAIN,
86 await coordinator_rain.async_config_entry_first_refresh()
88 department = coordinator_forecast.data.position.get(
"dept")
90 "Department corresponding to %s is %s",
94 if department
is not None and is_valid_warning_department(department):
95 if not hass.data[DOMAIN].
get(department):
99 name=f
"Météo-France alert for department {department}",
100 update_method=_async_update_data_alert,
101 update_interval=SCAN_INTERVAL,
104 await coordinator_alert.async_refresh()
106 if coordinator_alert.last_update_success:
107 hass.data[DOMAIN][department] =
True
111 "Weather alert for department %s won't be added with city %s, as it"
112 " has already been added within another city"
120 "Weather alert not available: The city %s is not in metropolitan France"
126 undo_listener = entry.add_update_listener(_async_update_listener)
128 hass.data[DOMAIN][entry.entry_id] = {
129 UNDO_UPDATE_LISTENER: undo_listener,
130 COORDINATOR_FORECAST: coordinator_forecast,
131 COORDINATOR_RAIN: coordinator_rain,
133 if coordinator_alert
and coordinator_alert.last_update_success:
134 hass.data[DOMAIN][entry.entry_id][COORDINATOR_ALERT] = coordinator_alert
136 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
142 """Unload a config entry."""
143 if hass.data[DOMAIN][entry.entry_id][COORDINATOR_ALERT]:
144 department = hass.data[DOMAIN][entry.entry_id][
146 ].data.position.get(
"dept")
147 hass.data[DOMAIN][department] =
False
150 "Weather alert for depatment %s unloaded and released. It can be added"
151 " now by another city"
156 unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
158 hass.data[DOMAIN][entry.entry_id][UNDO_UPDATE_LISTENER]()
159 hass.data[DOMAIN].pop(entry.entry_id)
160 if not hass.data[DOMAIN]:
161 hass.data.pop(DOMAIN)
167 """Handle options update."""
168 await hass.config_entries.async_reload(entry.entry_id)
web.Response get(self, web.Request request, str config_key)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
None _async_update_listener(HomeAssistant hass, ConfigEntry entry)