117 lines
4.7 KiB
Python
117 lines
4.7 KiB
Python
from datetime import timedelta
|
|
import logging
|
|
|
|
from homeassistant.components.utility_meter import DEFAULT_OFFSET
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.const import CONF_ENABLED, EntityCategory
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.typing import ConfigType
|
|
|
|
from custom_components.powercalc.const import (
|
|
CONF_CREATE_DOMAIN_GROUPS,
|
|
CONF_CREATE_ENERGY_SENSORS,
|
|
CONF_CREATE_STANDBY_GROUP,
|
|
CONF_CREATE_UTILITY_METERS,
|
|
CONF_DISABLE_EXTENDED_ATTRIBUTES,
|
|
CONF_DISCOVERY,
|
|
CONF_ENABLE_ANALYTICS,
|
|
CONF_ENERGY_INTEGRATION_METHOD,
|
|
CONF_ENERGY_SENSOR_CATEGORY,
|
|
CONF_ENERGY_SENSOR_NAMING,
|
|
CONF_ENERGY_SENSOR_PRECISION,
|
|
CONF_ENERGY_SENSOR_UNIT_PREFIX,
|
|
CONF_ENERGY_UPDATE_INTERVAL,
|
|
CONF_EXCLUDE_DEVICE_TYPES,
|
|
CONF_EXCLUDE_SELF_USAGE,
|
|
CONF_GROUP_ENERGY_UPDATE_INTERVAL,
|
|
CONF_GROUP_POWER_UPDATE_INTERVAL,
|
|
CONF_IGNORE_UNAVAILABLE_STATE,
|
|
CONF_INCLUDE_NON_POWERCALC_SENSORS,
|
|
CONF_POWER_SENSOR_CATEGORY,
|
|
CONF_POWER_SENSOR_NAMING,
|
|
CONF_POWER_SENSOR_PRECISION,
|
|
CONF_UTILITY_METER_OFFSET,
|
|
CONF_UTILITY_METER_TYPES,
|
|
DEFAULT_ENERGY_INTEGRATION_METHOD,
|
|
DEFAULT_ENERGY_NAME_PATTERN,
|
|
DEFAULT_ENERGY_SENSOR_PRECISION,
|
|
DEFAULT_ENERGY_UNIT_PREFIX,
|
|
DEFAULT_ENERGY_UPDATE_INTERVAL,
|
|
DEFAULT_ENTITY_CATEGORY,
|
|
DEFAULT_GROUP_ENERGY_UPDATE_INTERVAL,
|
|
DEFAULT_GROUP_POWER_UPDATE_INTERVAL,
|
|
DEFAULT_POWER_NAME_PATTERN,
|
|
DEFAULT_POWER_SENSOR_PRECISION,
|
|
DEFAULT_UTILITY_METER_TYPES,
|
|
DOMAIN,
|
|
ENTRY_GLOBAL_CONFIG_UNIQUE_ID,
|
|
)
|
|
from custom_components.powercalc.migrate import handle_legacy_discovery_config, handle_legacy_update_interval_config
|
|
|
|
FLAG_HAS_GLOBAL_GUI_CONFIG = "has_global_gui_config"
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def get_global_configuration(hass: HomeAssistant, config: ConfigType) -> ConfigType:
|
|
# Default configuration values
|
|
default_config = {
|
|
CONF_ENABLE_ANALYTICS: False,
|
|
CONF_POWER_SENSOR_NAMING: DEFAULT_POWER_NAME_PATTERN,
|
|
CONF_POWER_SENSOR_PRECISION: DEFAULT_POWER_SENSOR_PRECISION,
|
|
CONF_POWER_SENSOR_CATEGORY: DEFAULT_ENTITY_CATEGORY,
|
|
CONF_ENERGY_INTEGRATION_METHOD: DEFAULT_ENERGY_INTEGRATION_METHOD,
|
|
CONF_ENERGY_SENSOR_NAMING: DEFAULT_ENERGY_NAME_PATTERN,
|
|
CONF_ENERGY_SENSOR_PRECISION: DEFAULT_ENERGY_SENSOR_PRECISION,
|
|
CONF_ENERGY_SENSOR_CATEGORY: DEFAULT_ENTITY_CATEGORY,
|
|
CONF_ENERGY_SENSOR_UNIT_PREFIX: DEFAULT_ENERGY_UNIT_PREFIX,
|
|
CONF_GROUP_ENERGY_UPDATE_INTERVAL: DEFAULT_GROUP_ENERGY_UPDATE_INTERVAL,
|
|
CONF_GROUP_POWER_UPDATE_INTERVAL: DEFAULT_GROUP_POWER_UPDATE_INTERVAL,
|
|
CONF_ENERGY_UPDATE_INTERVAL: DEFAULT_ENERGY_UPDATE_INTERVAL,
|
|
CONF_DISABLE_EXTENDED_ATTRIBUTES: False,
|
|
CONF_IGNORE_UNAVAILABLE_STATE: False,
|
|
CONF_CREATE_DOMAIN_GROUPS: [],
|
|
CONF_CREATE_ENERGY_SENSORS: True,
|
|
CONF_CREATE_STANDBY_GROUP: True,
|
|
CONF_CREATE_UTILITY_METERS: False,
|
|
CONF_DISCOVERY: {
|
|
CONF_ENABLED: True,
|
|
CONF_EXCLUDE_SELF_USAGE: False,
|
|
CONF_EXCLUDE_DEVICE_TYPES: [],
|
|
},
|
|
CONF_UTILITY_METER_OFFSET: DEFAULT_OFFSET,
|
|
CONF_UTILITY_METER_TYPES: DEFAULT_UTILITY_METER_TYPES,
|
|
CONF_INCLUDE_NON_POWERCALC_SENSORS: True,
|
|
}
|
|
|
|
# First load GUI configuration if available
|
|
global_config = dict(default_config)
|
|
global_config_entry = hass.config_entries.async_entry_for_domain_unique_id(DOMAIN, ENTRY_GLOBAL_CONFIG_UNIQUE_ID)
|
|
if global_config_entry:
|
|
_LOGGER.debug("Found global configuration entry: %s", global_config_entry.data)
|
|
global_config.update(get_global_gui_configuration(global_config_entry))
|
|
|
|
# Then override with YAML configuration if available
|
|
yaml_config: dict = config.get(DOMAIN, {})
|
|
if yaml_config:
|
|
global_config.update(yaml_config)
|
|
|
|
handle_legacy_discovery_config(hass, global_config, yaml_config)
|
|
handle_legacy_update_interval_config(hass, global_config, yaml_config)
|
|
|
|
return global_config
|
|
|
|
|
|
def get_global_gui_configuration(config_entry: ConfigEntry) -> ConfigType:
|
|
global_config = dict(config_entry.data)
|
|
if CONF_UTILITY_METER_OFFSET in global_config:
|
|
global_config[CONF_UTILITY_METER_OFFSET] = timedelta(days=global_config[CONF_UTILITY_METER_OFFSET])
|
|
if global_config.get(CONF_ENERGY_SENSOR_CATEGORY):
|
|
global_config[CONF_ENERGY_SENSOR_CATEGORY] = EntityCategory(global_config[CONF_ENERGY_SENSOR_CATEGORY])
|
|
if global_config.get(CONF_POWER_SENSOR_CATEGORY):
|
|
global_config[CONF_POWER_SENSOR_CATEGORY] = EntityCategory(global_config[CONF_POWER_SENSOR_CATEGORY])
|
|
|
|
global_config[FLAG_HAS_GLOBAL_GUI_CONFIG] = True
|
|
|
|
return global_config
|