core/homeassistant/components/qbus/__init__.py

88 lines
2.8 KiB
Python

"""The Qbus integration."""
import logging
from homeassistant.components.mqtt import async_wait_for_mqtt_client
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.typing import ConfigType
from .const import DOMAIN, PLATFORMS
from .coordinator import (
QBUS_KEY,
QbusConfigCoordinator,
QbusConfigEntry,
QbusControllerCoordinator,
)
_LOGGER = logging.getLogger(__name__)
CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the Qbus integration.
We set up a single coordinator for managing Qbus config updates. The
config update contains the configuration for all controllers (and
config entries). This avoids having each device requesting and managing
the config on its own.
"""
_LOGGER.debug("Loading integration")
if not await async_wait_for_mqtt_client(hass):
_LOGGER.error("MQTT integration not available")
return False
config_coordinator = QbusConfigCoordinator.get_or_create(hass)
await config_coordinator.async_subscribe_to_config()
return True
async def async_setup_entry(hass: HomeAssistant, entry: QbusConfigEntry) -> bool:
"""Set up Qbus from a config entry."""
_LOGGER.debug("%s - Loading entry", entry.unique_id)
if not await async_wait_for_mqtt_client(hass):
_LOGGER.error("MQTT integration not available")
raise ConfigEntryNotReady("MQTT integration not available")
coordinator = QbusControllerCoordinator(hass, entry)
entry.runtime_data = coordinator
await coordinator.async_config_entry_first_refresh()
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
# Get current config
config = await QbusConfigCoordinator.get_or_create(
hass
).async_get_or_request_config()
# Update the controller config
if config:
await coordinator.async_update_controller_config(config)
return True
async def async_unload_entry(hass: HomeAssistant, entry: QbusConfigEntry) -> bool:
"""Unload a config entry."""
_LOGGER.debug("%s - Unloading entry", entry.unique_id)
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
entry.runtime_data.shutdown()
cleanup(hass, entry)
return unload_ok
def cleanup(hass: HomeAssistant, entry: QbusConfigEntry) -> None:
"""Shutdown if no more entries are loaded."""
entries = hass.config_entries.async_loaded_entries(DOMAIN)
count = len(entries)
# During unloading of the entry, it is not marked as unloaded yet. So
# count can be 1 if it is the last one.
if count <= 1 and (config_coordinator := hass.data.get(QBUS_KEY)):
config_coordinator.shutdown()