mirror of https://github.com/home-assistant/core
88 lines
2.8 KiB
Python
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()
|