"""The Powercalc constants.""" from __future__ import annotations from enum import StrEnum from typing import Literal from homeassistant.components import cover, device_tracker from homeassistant.components.utility_meter.const import DAILY, MONTHLY, WEEKLY from homeassistant.const import ( STATE_CLOSED, STATE_NOT_HOME, STATE_OFF, STATE_OPEN, STATE_STANDBY, STATE_UNAVAILABLE, EntityCategory, ) MIN_HA_VERSION = "2026.1" BUILT_IN_LIBRARY_DIR = "powercalc_profiles" DOMAIN = "powercalc" DOMAIN_CONFIG = "config" DATA_CONFIGURED_ENTITIES = "configured_entities" DATA_DISCOVERY_MANAGER = "discovery_manager" DATA_DOMAIN_ENTITIES = "domain_entities" DATA_ENTITIES = "entities" DATA_GROUP_ENTITIES = "group_entities" DATA_USED_UNIQUE_IDS = "used_unique_ids" DATA_STANDBY_POWER_SENSORS = "standby_power_sensors" DATA_ANALYTICS = "analytics" DATA_ANALYTICS_SEEN_ENTRIES = "analytics_seen_entries" DATA_POWER_PROFILES: Literal["power_profiles"] = "power_profiles" DATA_SENSOR_TYPES: Literal["sensor_types"] = "sensor_types" DATA_CONFIG_TYPES: Literal["config_types"] = "config_types" DATA_SOURCE_DOMAINS: Literal["source_domains"] = "source_domains" DATA_GROUP_TYPES: Literal["group_types"] = "group_types" DATA_ENTITY_TYPES: Literal["entity_types"] = "entity_types" DATA_STRATEGIES: Literal["strategies"] = "strategies" DATA_GROUP_SIZES: Literal["group_sizes"] = "group_sizes" DATA_HAS_GROUP_INCLUDE: Literal["has_group_include"] = "has_group_include" DATA_POWER_PROFILE_SOURCES: Literal["power_profile_sources"] = "power_profile_sources" ENTRY_DATA_ENERGY_ENTITY = "_energy_entity" ENTRY_DATA_POWER_ENTITY = "_power_entity" ENTRY_GLOBAL_CONFIG_UNIQUE_ID = "powercalc_global_configuration" PLACEHOLDER_ENTITY_BY_DEVICE_CLASS = "entity_by_device_class:" PLACEHOLDER_ENTITY_BY_TRANSLATION_KEY = "entity_by_translation_key:" DUMMY_ENTITY_ID = "sensor.dummy" CONF_ALL = "all" CONF_AND = "and" CONF_ENABLE_ANALYTICS = "enable_analytics" CONF_AREA = "area" CONF_AUTOSTART = "autostart" CONF_AVAILABILITY_ENTITY = "availability_entity" CONF_CALCULATION_ENABLED_CONDITION = "calculation_enabled_condition" CONF_CALIBRATE = "calibrate" CONF_CATEGORY = "category" CONF_COMPOSITE = "composite" CONF_CREATE_DOMAIN_GROUPS = "create_domain_groups" CONF_CREATE_ENERGY_SENSOR = "create_energy_sensor" CONF_CREATE_ENERGY_SENSORS = "create_energy_sensors" CONF_CREATE_GROUP = "create_group" CONF_CREATE_STANDBY_GROUP = "create_standby_group" CONF_CREATE_UTILITY_METERS = "create_utility_meters" CONF_CUSTOM_MODEL_DIRECTORY = "custom_model_directory" CONF_DAILY_FIXED_ENERGY = "daily_fixed_energy" CONF_DELAY = "delay" CONF_DISABLE_EXTENDED_ATTRIBUTES = "disable_extended_attributes" CONF_DISABLE_LIBRARY_DOWNLOAD = "disable_library_download" CONF_DISABLE_STANDBY_POWER = "disable_standby_power" CONF_DISCOVERY: str = "discovery" CONF_EXCLUDE_DEVICE_TYPES = "exclude_device_types" CONF_EXCLUDE_SELF_USAGE = "exclude_self_usage" # Deprecated configuration keys CONF_DISCOVERY_EXCLUDE_DEVICE_TYPES_DEPRECATED = "discovery_exclude_device_types" CONF_DISCOVERY_EXCLUDE_SELF_USAGE_DEPRECATED = "discovery_exclude_self_usage" CONF_ENABLE_AUTODISCOVERY_DEPRECATED = "enable_autodiscovery" CONF_GROUP_UPDATE_INTERVAL_DEPRECATED = "group_update_interval" CONF_FORCE_UPDATE_FREQUENCY_DEPRECATED = "force_update_frequency" CONF_ENERGY_INTEGRATION_METHOD = "energy_integration_method" CONF_ENERGY_SENSOR_CATEGORY = "energy_sensor_category" CONF_ENERGY_SENSOR_FRIENDLY_NAMING = "energy_sensor_friendly_naming" CONF_ENERGY_SENSOR_ID = "energy_sensor_id" CONF_ENERGY_SENSOR_NAMING = "energy_sensor_naming" CONF_ENERGY_SENSOR_PRECISION = "energy_sensor_precision" CONF_ENERGY_SENSOR_UNIT_PREFIX = "energy_sensor_unit_prefix" CONF_ENERGY_UPDATE_INTERVAL = "energy_update_interval" CONF_ENERGY_FILTER_OUTLIER_ENABLED = "energy_filter_outlier_enabled" CONF_ENERGY_FILTER_OUTLIER_MAX = "energy_filter_outlier_max_step" CONF_EXCLUDE_ENTITIES = "exclude_entities" CONF_FILTER = "filter" CONF_FIXED = "fixed" CONF_FLOOR = "floor" CONF_FORCE_CALCULATE_GROUP_ENERGY = "force_calculate_group_energy" CONF_FORCE_ENERGY_SENSOR_CREATION = "force_energy_sensor_creation" CONF_GAMMA_CURVE = "gamma_curve" CONF_GROUP = "group" CONF_GROUP_ENERGY_ENTITIES = "group_energy_entities" CONF_GROUP_ENERGY_START_AT_ZERO = "group_energy_start_at_zero" CONF_GROUP_ENERGY_UPDATE_INTERVAL = "group_energy_update_interval" CONF_GROUP_MEMBER_DEVICES = "group_member_devices" CONF_GROUP_MEMBER_SENSORS = "group_member_sensors" CONF_GROUP_POWER_ENTITIES = "group_power_entities" CONF_GROUP_POWER_UPDATE_INTERVAL = "group_power_update_interval" CONF_GROUP_TRACKED_AUTO = "group_tracked_auto" CONF_GROUP_TRACKED_POWER_ENTITIES = "group_tracked_entities" CONF_GROUP_TYPE = "group_type" CONF_HIDE_MEMBERS = "hide_members" CONF_IGNORE_UNAVAILABLE_STATE = "ignore_unavailable_state" CONF_INCLUDE = "include" CONF_INCLUDE_NON_POWERCALC_SENSORS = "include_non_powercalc_sensors" CONF_LABEL = "label" CONF_LINEAR = "linear" CONF_LUT = "lut" CONF_MAIN_POWER_SENSOR = "main_power_sensor" CONF_MANUFACTURER = "manufacturer" CONF_MAX_POWER = "max_power" CONF_MIN_POWER = "min_power" CONF_MODEL = "model" CONF_MODE = "mode" CONF_MULTI_SWITCH = "multi_switch" CONF_MULTIPLY_FACTOR = "multiply_factor" CONF_MULTIPLY_FACTOR_STANDBY = "multiply_factor_standby" CONF_NEW_GROUP = "new_group" CONF_NOT = "not" CONF_ON_TIME = "on_time" CONF_OR = "or" CONF_PLAYBOOK = "playbook" CONF_PLAYBOOKS = "playbooks" CONF_POWER = "power" CONF_POWER_FACTOR = "power_factor" CONF_POWER_OFF = "power_off" CONF_POWER_SENSOR_CATEGORY = "power_sensor_category" CONF_POWER_SENSOR_FRIENDLY_NAMING = "power_sensor_friendly_naming" CONF_POWER_SENSOR_ID = "power_sensor_id" CONF_POWER_SENSOR_NAMING = "power_sensor_naming" CONF_POWER_SENSOR_PRECISION = "power_sensor_precision" CONF_POWER_TEMPLATE = "power_template" CONF_POWER_UPDATE_INTERVAL = "power_update_interval" CONF_REPEAT = "repeat" CONF_SELF_USAGE_INCLUDED = "self_usage_included" CONF_SENSOR_TYPE = "sensor_type" CONF_SENSORS = "sensors" CONF_SLEEP_POWER = "sleep_power" CONF_STANDBY_POWER = "standby_power" CONF_START_TIME = "start_time" CONF_STATE = "state" CONF_STATES_POWER = "states_power" CONF_STATE_TRIGGER = "state_trigger" CONF_STATES_TRIGGER = "states_trigger" CONF_STRATEGIES = "strategies" CONF_SUB_GROUPS = "sub_groups" CONF_SUB_PROFILE = "sub_profile" CONF_SUBTRACT_ENTITIES = "subtract_entities" CONF_TEMPLATE = "template" CONF_UNAVAILABLE_POWER = "unavailable_power" CONF_UPDATE_FREQUENCY = "update_frequency" CONF_UTILITY_METER_NET_CONSUMPTION = "utility_meter_net_consumption" CONF_UTILITY_METER_OFFSET = "utility_meter_offset" CONF_UTILITY_METER_TARIFFS = "utility_meter_tariffs" CONF_UTILITY_METER_TYPES = "utility_meter_types" CONF_VALUE = "value" CONF_VALUE_TEMPLATE = "value_template" # Wrapper keys for ChooseSelector config flow forms (not stored in config entries). CONF_FIXED_VALUE = "fixed_value" CONF_DAILY_ENERGY_VALUE = "daily_energy_value" CONF_PLAYBOOK_ID = "playbook_id" CONF_VARIABLES = "variables" CONF_VOLTAGE = "voltage" CONF_WILDCARD = "wildcard" CONF_WLED = "wled" # Redefine constants from integration component. # Has been refactored in HA 2022.4, we need to support older HA versions as well. ENERGY_INTEGRATION_METHOD_LEFT = "left" ENERGY_INTEGRATION_METHOD_RIGHT = "right" ENERGY_INTEGRATION_METHOD_TRAPEZODIAL = "trapezoidal" ENERGY_INTEGRATION_METHODS = [ ENERGY_INTEGRATION_METHOD_LEFT, ENERGY_INTEGRATION_METHOD_RIGHT, ENERGY_INTEGRATION_METHOD_TRAPEZODIAL, ] class UnitPrefix(StrEnum): """Allowed unit prefixes.""" NONE = "none" KILO = "k" MEGA = "M" GIGA = "G" TERA = "T" ENTITY_CATEGORIES = [ EntityCategory.DIAGNOSTIC, None, ] DEFAULT_GROUP_POWER_UPDATE_INTERVAL = 2 DEFAULT_GROUP_ENERGY_UPDATE_INTERVAL = 60 DEFAULT_POWER_NAME_PATTERN = "{} power" DEFAULT_SELF_USAGE_POWER_NAME_PATTERN = "{} Device Power" DEFAULT_POWER_SENSOR_PRECISION = 2 DEFAULT_ENERGY_UPDATE_INTERVAL = 600 DEFAULT_ENERGY_INTEGRATION_METHOD = ENERGY_INTEGRATION_METHOD_LEFT DEFAULT_ENERGY_NAME_PATTERN = "{} energy" DEFAULT_SELF_USAGE_ENERGY_NAME_PATTERN = "{} Device Energy" DEFAULT_ENERGY_SENSOR_PRECISION = 4 DEFAULT_ENERGY_UNIT_PREFIX = UnitPrefix.KILO DEFAULT_ENTITY_CATEGORY: str | None = None DEFAULT_UTILITY_METER_TYPES = [DAILY, WEEKLY, MONTHLY] DISCOVERY_SOURCE_ENTITY = "source_entity" DISCOVERY_POWER_PROFILES = "power_profiles" DISCOVERY_TYPE = "discovery_type" LIBRARY_URL = "https://library.powercalc.nl" API_URL = "https://api.powercalc.nl" MANUFACTURER_WLED = "WLED" ATTR_CALCULATION_MODE = "calculation_mode" ATTR_MEMBERS = "members" ATTR_ENERGY_SENSOR_ENTITY_ID = "energy_sensor_entity_id" ATTR_ENTITIES = "entities" ATTR_INTEGRATION = "integration" ATTR_IS_GROUP = "is_group" ATTR_STATE = "state" ATTR_SOURCE_ENTITY = "source_entity" ATTR_SOURCE_DOMAIN = "source_domain" SERVICE_ACTIVATE_PLAYBOOK = "activate_playbook" SERVICE_CALIBRATE_UTILITY_METER = "calibrate_utility_meter" SERVICE_CALIBRATE_ENERGY = "calibrate_energy" SERVICE_CHANGE_GUI_CONFIGURATION = "change_gui_config" SERVICE_DEBUG_GROUP = "debug_group" SERVICE_GET_ACTIVE_PLAYBOOK = "get_active_playbook" SERVICE_GET_GROUP_ENTITIES = "get_group_entities" SERVICE_INCREASE_DAILY_ENERGY = "increase_daily_energy" SERVICE_RESET_ENERGY = "reset_energy" SERVICE_STOP_PLAYBOOK = "stop_playbook" SERVICE_SWITCH_SUB_PROFILE = "switch_sub_profile" SERVICE_UPDATE_LIBRARY = "update_library" SERVICE_RELOAD = "reload" SIGNAL_POWER_SENSOR_STATE_CHANGE = "powercalc_power_sensor_state_change" OFF_STATES = {STATE_OFF, STATE_STANDBY, STATE_UNAVAILABLE} OFF_STATES_BY_DOMAIN: dict[str, set[str]] = { cover.DOMAIN: {STATE_CLOSED, STATE_OPEN}, device_tracker.DOMAIN: {STATE_NOT_HOME}, } DOCS_URI = "https://docs.powercalc.nl/configuration/global-configuration/" class CalculationStrategy(StrEnum): """Possible virtual power calculation strategies.""" COMPOSITE = "composite" LUT = "lut" LINEAR = "linear" MULTI_SWITCH = "multi_switch" FIXED = "fixed" PLAYBOOK = "playbook" WLED = "wled" CALCULATION_STRATEGY_CONF_KEYS: list[str] = [strategy.value for strategy in CalculationStrategy] class SensorType(StrEnum): """Possible modes for a number selector.""" DAILY_ENERGY = "daily_energy" VIRTUAL_POWER = "virtual_power" GROUP = "group" REAL_POWER = "real_power" class PowercalcDiscoveryType(StrEnum): DOMAIN_GROUP = "domain_group" STANDBY_GROUP = "standby_group" LIBRARY = "library" USER_YAML = "user_yaml" class GroupType(StrEnum): """Possible group types.""" CUSTOM = "custom" DOMAIN = "domain" STANDBY = "standby" SUBTRACT = "subtract" TRACKED_UNTRACKED = "tracked_untracked" class EntityType(StrEnum): """Possible powercalc entity types.""" POWER_SENSOR = "power_sensor" ENERGY_SENSOR = "energy_sensor" UTILITY_METER = "utility_meter" TARIFF_SELECT = "tariff_select" UNKNOWN = "unknown" class PowerProfileSource(StrEnum): """Possible power profile sources.""" MANUAL = "manual" LIBRARY_BUILTIN = "library_builtin" LIBRARY_CUSTOM = "library_custom"