"""The Enphase Envoy integration.""" from __future__ import annotations from datetime import timedelta import logging import async_timeout from envoy_reader.envoy_reader import EnvoyReader import httpx from homeassistant.components.enphase_envoy.config_flow import CONF_SERIAL from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( CONF_EMAIL, CONF_HOST, CONF_ID, CONF_NAME, CONF_PASSWORD, CONF_USERNAME, ) from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.helpers.httpx_client import get_async_client from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from .const import ( CONNECTION_TYPE, COORDINATOR, DOMAIN, ENLIGHTEN_PASSWORD, HTTPS_FLAG, NAME, PLATFORMS, SENSORS, ) SCAN_INTERVAL = timedelta(seconds=60) _LOGGER = logging.getLogger(__name__) async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up Enphase Envoy from a config entry.""" config = entry.data name = config[CONF_NAME] envoy_reader = EnvoyReader( host=config[CONF_HOST], username=config[CONF_USERNAME], password=config[CONF_PASSWORD], inverters=True, async_client=get_async_client(hass, verify_ssl=False), enlighten_user=config[CONF_EMAIL], enlighten_pass=config[ENLIGHTEN_PASSWORD], commissioned=config[CONNECTION_TYPE], enlighten_site_id=config[CONF_ID], enlighten_serial_num=config[CONF_SERIAL], https_flag=config[HTTPS_FLAG], ) _LOGGER.debug("Creating EnvoyReader object ...") async def async_update_data(): """Fetch data from API endpoint.""" data = {} async with async_timeout.timeout(30): try: await envoy_reader.getData() except httpx.HTTPStatusError as err: raise ConfigEntryAuthFailed from err except httpx.HTTPError as err: raise UpdateFailed(f"Error communicating with API: {err}") from err for description in SENSORS: if description.key != "inverters": data[description.key] = await getattr( envoy_reader, description.key )() else: data[ "inverters_production" ] = await envoy_reader.inverters_production() _LOGGER.debug("Retrieved data from API: %s", data) return data coordinator = DataUpdateCoordinator( hass, _LOGGER, name=f"envoy {name}", update_method=async_update_data, update_interval=SCAN_INTERVAL, ) try: await coordinator.async_config_entry_first_refresh() except ConfigEntryAuthFailed: envoy_reader.get_inverters = False await coordinator.async_config_entry_first_refresh() if not entry.unique_id: try: serial = await envoy_reader.get_full_serial_number() except httpx.HTTPError: pass else: hass.config_entries.async_update_entry(entry, unique_id=serial) hass.data.setdefault(DOMAIN, {})[entry.entry_id] = { COORDINATOR: coordinator, NAME: name, } hass.config_entries.async_setup_platforms(entry, PLATFORMS) return True async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) if unload_ok: hass.data[DOMAIN].pop(entry.entry_id) return unload_ok