"""The denonavr component.""" import logging from denonavr.exceptions import AvrNetworkError, AvrTimoutError from homeassistant import config_entries, core from homeassistant.const import CONF_HOST from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import entity_registry as er from homeassistant.helpers.httpx_client import get_async_client from .config_flow import ( CONF_SHOW_ALL_SOURCES, CONF_UPDATE_AUDYSSEY, CONF_ZONE2, CONF_ZONE3, DEFAULT_SHOW_SOURCES, DEFAULT_TIMEOUT, DEFAULT_UPDATE_AUDYSSEY, DEFAULT_ZONE2, DEFAULT_ZONE3, DOMAIN, ) from .receiver import ConnectDenonAVR CONF_RECEIVER = "receiver" UNDO_UPDATE_LISTENER = "undo_update_listener" _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: core.HomeAssistant, entry: config_entries.ConfigEntry ): """Set up the denonavr components from a config entry.""" hass.data.setdefault(DOMAIN, {}) # Connect to receiver connect_denonavr = ConnectDenonAVR( entry.data[CONF_HOST], DEFAULT_TIMEOUT, entry.options.get(CONF_SHOW_ALL_SOURCES, DEFAULT_SHOW_SOURCES), entry.options.get(CONF_ZONE2, DEFAULT_ZONE2), entry.options.get(CONF_ZONE3, DEFAULT_ZONE3), lambda: get_async_client(hass), entry.state, ) try: await connect_denonavr.async_connect_receiver() except (AvrNetworkError, AvrTimoutError) as ex: raise ConfigEntryNotReady from ex receiver = connect_denonavr.receiver undo_listener = entry.add_update_listener(update_listener) hass.data[DOMAIN][entry.entry_id] = { CONF_RECEIVER: receiver, CONF_UPDATE_AUDYSSEY: entry.options.get( CONF_UPDATE_AUDYSSEY, DEFAULT_UPDATE_AUDYSSEY ), UNDO_UPDATE_LISTENER: undo_listener, } hass.async_create_task( hass.config_entries.async_forward_entry_setup(entry, "media_player") ) return True async def async_unload_entry( hass: core.HomeAssistant, config_entry: config_entries.ConfigEntry ): """Unload a config entry.""" unload_ok = await hass.config_entries.async_forward_entry_unload( config_entry, "media_player" ) hass.data[DOMAIN][config_entry.entry_id][UNDO_UPDATE_LISTENER]() # Remove zone2 and zone3 entities if needed entity_registry = await er.async_get_registry(hass) entries = er.async_entries_for_config_entry(entity_registry, config_entry.entry_id) unique_id = config_entry.unique_id or config_entry.entry_id zone2_id = f"{unique_id}-Zone2" zone3_id = f"{unique_id}-Zone3" for entry in entries: if entry.unique_id == zone2_id and not config_entry.options.get(CONF_ZONE2): entity_registry.async_remove(entry.entity_id) _LOGGER.debug("Removing zone2 from DenonAvr") if entry.unique_id == zone3_id and not config_entry.options.get(CONF_ZONE3): entity_registry.async_remove(entry.entity_id) _LOGGER.debug("Removing zone3 from DenonAvr") if unload_ok: hass.data[DOMAIN].pop(config_entry.entry_id) return unload_ok async def update_listener( hass: core.HomeAssistant, config_entry: config_entries.ConfigEntry ): """Handle options update.""" await hass.config_entries.async_reload(config_entry.entry_id)