1 """Support for IQVIA."""
3 from __future__
import annotations
6 from collections.abc
import Callable, Coroutine
7 from datetime
import timedelta
8 from functools
import partial
11 from pyiqvia
import Client
12 from pyiqvia.errors
import IQVIAError
25 TYPE_ALLERGY_FORECAST,
30 TYPE_DISEASE_FORECAST,
34 DEFAULT_ATTRIBUTION =
"Data provided by IQVIA™"
37 PLATFORMS = [Platform.SENSOR]
41 """Set up IQVIA as config entry."""
42 if not entry.unique_id:
44 hass.config_entries.async_update_entry(
45 entry, unique_id=entry.data[CONF_ZIP_CODE]
48 websession = aiohttp_client.async_get_clientsession(hass)
49 client = Client(entry.data[CONF_ZIP_CODE], session=websession)
53 client.disable_request_retries()
55 async
def async_get_data_from_api(
56 api_coro: Callable[[], Coroutine[Any, Any, dict[str, Any]]],
58 """Get data from a particular API coroutine."""
60 return await api_coro()
61 except IQVIAError
as err:
62 raise UpdateFailed
from err
65 init_data_update_tasks = []
67 for sensor_type, api_coro
in (
68 (TYPE_ALLERGY_FORECAST, client.allergens.extended),
69 (TYPE_ALLERGY_INDEX, client.allergens.current),
70 (TYPE_ALLERGY_OUTLOOK, client.allergens.outlook),
71 (TYPE_ASTHMA_FORECAST, client.asthma.extended),
72 (TYPE_ASTHMA_INDEX, client.asthma.current),
73 (TYPE_DISEASE_FORECAST, client.disease.extended),
74 (TYPE_DISEASE_INDEX, client.disease.current),
80 name=f
"{entry.data[CONF_ZIP_CODE]} {sensor_type}",
81 update_interval=DEFAULT_SCAN_INTERVAL,
82 update_method=partial(async_get_data_from_api, api_coro),
84 init_data_update_tasks.append(coordinator.async_refresh())
86 results = await asyncio.gather(*init_data_update_tasks, return_exceptions=
True)
87 if all(isinstance(result, Exception)
for result
in results):
91 raise ConfigEntryNotReady
94 client.enable_request_retries()
96 hass.data.setdefault(DOMAIN, {})
97 hass.data[DOMAIN][entry.entry_id] = coordinators
99 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
105 """Unload an OpenUV config entry."""
106 unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
108 hass.data[DOMAIN].pop(entry.entry_id)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)