Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Environment Canada (EC) component."""
2 
3 from datetime import timedelta
4 import logging
5 
6 from env_canada import ECAirQuality, ECRadar, ECWeather
7 
8 from homeassistant.config_entries import ConfigEntry
9 from homeassistant.const import CONF_LANGUAGE, CONF_LATITUDE, CONF_LONGITUDE, Platform
10 from homeassistant.core import HomeAssistant
11 from homeassistant.exceptions import ConfigEntryNotReady
12 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
13 
14 from .const import CONF_STATION, DOMAIN
15 from .coordinator import ECDataUpdateCoordinator
16 
17 DEFAULT_RADAR_UPDATE_INTERVAL = timedelta(minutes=5)
18 DEFAULT_WEATHER_UPDATE_INTERVAL = timedelta(minutes=5)
19 
20 PLATFORMS = [Platform.CAMERA, Platform.SENSOR, Platform.WEATHER]
21 
22 _LOGGER = logging.getLogger(__name__)
23 
24 
25 async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
26  """Set up EC as config entry."""
27  lat = config_entry.data.get(CONF_LATITUDE)
28  lon = config_entry.data.get(CONF_LONGITUDE)
29  station = config_entry.data.get(CONF_STATION)
30  lang = config_entry.data.get(CONF_LANGUAGE, "English")
31 
32  coordinators = {}
33  errors = 0
34 
35  weather_data = ECWeather(
36  station_id=station,
37  coordinates=(lat, lon),
38  language=lang.lower(),
39  )
40  coordinators["weather_coordinator"] = ECDataUpdateCoordinator(
41  hass, weather_data, "weather", DEFAULT_WEATHER_UPDATE_INTERVAL
42  )
43  try:
44  await coordinators["weather_coordinator"].async_config_entry_first_refresh()
45  except ConfigEntryNotReady:
46  errors = errors + 1
47  _LOGGER.warning("Unable to retrieve Environment Canada weather")
48 
49  radar_data = ECRadar(coordinates=(lat, lon))
50  coordinators["radar_coordinator"] = ECDataUpdateCoordinator(
51  hass, radar_data, "radar", DEFAULT_RADAR_UPDATE_INTERVAL
52  )
53  try:
54  await coordinators["radar_coordinator"].async_config_entry_first_refresh()
55  except ConfigEntryNotReady:
56  errors = errors + 1
57  _LOGGER.warning("Unable to retrieve Environment Canada radar")
58 
59  aqhi_data = ECAirQuality(coordinates=(lat, lon))
60  coordinators["aqhi_coordinator"] = ECDataUpdateCoordinator(
61  hass, aqhi_data, "AQHI", DEFAULT_WEATHER_UPDATE_INTERVAL
62  )
63  try:
64  await coordinators["aqhi_coordinator"].async_config_entry_first_refresh()
65  except ConfigEntryNotReady:
66  errors = errors + 1
67  _LOGGER.warning("Unable to retrieve Environment Canada AQHI")
68 
69  if errors == 3:
70  raise ConfigEntryNotReady
71 
72  hass.data.setdefault(DOMAIN, {})
73  hass.data[DOMAIN][config_entry.entry_id] = coordinators
74 
75  await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
76 
77  return True
78 
79 
80 async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
81  """Unload a config entry."""
82  unload_ok = await hass.config_entries.async_unload_platforms(
83  config_entry, PLATFORMS
84  )
85 
86  hass.data[DOMAIN].pop(config_entry.entry_id)
87 
88  return unload_ok
89 
90 
91 def device_info(config_entry: ConfigEntry) -> DeviceInfo:
92  """Build and return the device info for EC."""
93  return DeviceInfo(
94  entry_type=DeviceEntryType.SERVICE,
95  identifiers={(DOMAIN, config_entry.entry_id)},
96  manufacturer="Environment Canada",
97  name=config_entry.title,
98  configuration_url="https://weather.gc.ca/",
99  )
bool async_unload_entry(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:80
DeviceInfo device_info(ConfigEntry config_entry)
Definition: __init__.py:91
bool async_setup_entry(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:25