async def async_step_user(self, user_input=None): """Handle a flow initiated by the user.""" errors = {} if user_input is None: return self._show_setup_form(user_input, errors) city = user_input[CONF_CITY] # Might be a city name or a postal code latitude = user_input.get(CONF_LATITUDE) longitude = user_input.get(CONF_LONGITUDE) if not latitude: client = MeteoFranceClient() self.places = await self.opp.async_add_executor_job( client.search_places, city ) _LOGGER.debug("Places search result: %s", self.places) if not self.places: errors[CONF_CITY] = "empty" return self._show_setup_form(user_input, errors) return await self.async_step_cities() # Check if already configured await self.async_set_unique_id(f"{latitude}, {longitude}") self._abort_if_unique_id_configured() return self.async_create_entry( title=city, data={CONF_LATITUDE: latitude, CONF_LONGITUDE: longitude}, )
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up an Meteo-France account from a config entry.""" hass.data.setdefault(DOMAIN, {}) client = MeteoFranceClient() latitude = entry.data[CONF_LATITUDE] longitude = entry.data[CONF_LONGITUDE] async def _async_update_data_forecast_forecast(): """Fetch data from API endpoint.""" return await hass.async_add_executor_job(client.get_forecast, latitude, longitude) async def _async_update_data_rain(): """Fetch data from API endpoint.""" return await hass.async_add_executor_job(client.get_rain, latitude, longitude) async def _async_update_data_alert(): """Fetch data from API endpoint.""" return await hass.async_add_executor_job( client.get_warning_current_phenomenoms, department, 0, True) coordinator_forecast = DataUpdateCoordinator( hass, _LOGGER, name=f"Météo-France forecast for city {entry.title}", update_method=_async_update_data_forecast_forecast, update_interval=SCAN_INTERVAL, ) coordinator_rain = None coordinator_alert = None # Fetch initial data so we have data when entities subscribe await coordinator_forecast.async_refresh() if not coordinator_forecast.last_update_success: raise ConfigEntryNotReady # Check if rain forecast is available. if coordinator_forecast.data.position.get("rain_product_available") == 1: coordinator_rain = DataUpdateCoordinator( hass, _LOGGER, name=f"Météo-France rain for city {entry.title}", update_method=_async_update_data_rain, update_interval=SCAN_INTERVAL_RAIN, ) await coordinator_rain.async_refresh() if not coordinator_rain.last_update_success: raise ConfigEntryNotReady else: _LOGGER.warning( "1 hour rain forecast not available. %s is not in covered zone", entry.title, ) department = coordinator_forecast.data.position.get("dept") _LOGGER.debug( "Department corresponding to %s is %s", entry.title, department, ) if is_valid_warning_department(department): if not hass.data[DOMAIN].get(department): coordinator_alert = DataUpdateCoordinator( hass, _LOGGER, name=f"Météo-France alert for department {department}", update_method=_async_update_data_alert, update_interval=SCAN_INTERVAL, ) await coordinator_alert.async_refresh() if not coordinator_alert.last_update_success: raise ConfigEntryNotReady hass.data[DOMAIN][department] = True else: _LOGGER.warning( "Weather alert for department %s won't be added with city %s, as it has already been added within another city", department, entry.title, ) else: _LOGGER.warning( "Weather alert not available: The city %s is not in metropolitan France or Andorre", entry.title, ) undo_listener = entry.add_update_listener(_async_update_listener) hass.data[DOMAIN][entry.entry_id] = { COORDINATOR_FORECAST: coordinator_forecast, COORDINATOR_RAIN: coordinator_rain, COORDINATOR_ALERT: coordinator_alert, UNDO_UPDATE_LISTENER: undo_listener, } hass.config_entries.async_setup_platforms(entry, PLATFORMS) return True