186 files

This commit is contained in:
Home Assistant Version Control
2026-09-14 12:56:59 +00:00
parent 6be1e92941
commit bd8280defe
186 changed files with 14904 additions and 1087 deletions
@@ -8,7 +8,7 @@ from typing import Literal
from datetime import datetime
from enum import Enum
from homeassistant.const import STATE_UNKNOWN, STATE_UNAVAILABLE
from homeassistant.const import STATE_UNKNOWN, STATE_UNAVAILABLE, UnitOfPower
from homeassistant.core import HomeAssistant
from homeassistant.const import CONF_NAME, Platform
@@ -41,7 +41,7 @@ from .vtherm_state import VThermState # pylint: disable=unused-import
_LOGGER = get_vtherm_logger(__name__)
CONFIG_VERSION = 2
CONFIG_MINOR_VERSION = 3
CONFIG_MINOR_VERSION = 4
DEVICE_MANUFACTURER = "JMCOLLIN"
DEVICE_MODEL = "Versatile Thermostat"
@@ -70,6 +70,21 @@ CONF_MAX_POWER_SENSOR = "max_power_sensor_entity_id"
CONF_WINDOW_SENSOR = "window_sensor_entity_id"
CONF_MOTION_SENSOR = "motion_sensor_entity_id"
CONF_DEVICE_POWER = "device_power"
CONF_POWER_UNIT = "power_unit"
# Power unit values used by configuration selector translation keys.
# Convert them to Home Assistant's "W" / "kW" values only at entity boundaries.
POWER_UNIT_WATT = "w"
POWER_UNIT_KILO_WATT = "kw"
POWER_UNIT_MEGA_WATT = "mw"
POWER_UNIT_AUTO = "auto"
# Selector options
CONF_POWER_UNITS = [POWER_UNIT_WATT, POWER_UNIT_KILO_WATT]
CONF_CENTRAL_POWER_UNITS = [POWER_UNIT_WATT, POWER_UNIT_KILO_WATT, POWER_UNIT_AUTO]
# Threshold used by the legacy unit heuristic and by the config migration
THRESHOLD_POWER_WATT_KILO = 100
CONF_CYCLE_MIN = "cycle_min"
CONF_PROP_FUNCTION = "proportional_function"
CONF_WINDOW_DELAY = "window_delay"
@@ -360,6 +375,7 @@ ALL_CONF = (
CONF_MOTION_PRESET,
CONF_NO_MOTION_PRESET,
CONF_DEVICE_POWER,
CONF_POWER_UNIT,
CONF_CYCLE_MIN,
CONF_PROP_FUNCTION,
CONF_TPI_COEF_INT,
@@ -520,6 +536,7 @@ DEFAULT_HEATING_FAILURE_DETECTION_DELAY = 15 # 15 minutes
DEFAULT_TEMPERATURE_CHANGE_TOLERANCE = 0.5 # 0.5°C
ATTR_TOTAL_ENERGY = "total_energy"
ATTR_TOTAL_ENERGY_UNIT = "total_energy_unit"
ATTR_MEAN_POWER_CYCLE = "mean_cycle_power"
AUTO_FAN_DTEMP_THRESHOLD = 2
@@ -649,6 +666,54 @@ def get_safe_float_value(value):
return None
def power_to_watts(value: float | None, unit: str | None) -> float | None:
"""Normalize a power (or energy) magnitude to Watts (or Watt-hours).
The conversion accepts internal selector keys and Home Assistant units."""
if value is None:
return None
if to_internal_power_unit(unit) == POWER_UNIT_KILO_WATT:
return value * 1000.0
return value
def power_from_watts(value_w: float | None, unit: str | None) -> float | None:
"""Convert a Watts (or Watt-hours) magnitude to the target power unit.
The conversion accepts internal selector keys and Home Assistant units.
"""
if value_w is None:
return None
if to_internal_power_unit(unit) == POWER_UNIT_KILO_WATT:
return value_w / 1000.0
return value_w
def to_internal_power_unit(power_unit: str | None) -> str | None:
"""Map a selector key or Home Assistant power unit to its internal key."""
power_unit_mapping = {
POWER_UNIT_WATT: POWER_UNIT_WATT,
UnitOfPower.WATT: POWER_UNIT_WATT,
POWER_UNIT_KILO_WATT: POWER_UNIT_KILO_WATT,
UnitOfPower.KILO_WATT: POWER_UNIT_KILO_WATT,
POWER_UNIT_MEGA_WATT: POWER_UNIT_MEGA_WATT,
UnitOfPower.MEGA_WATT: POWER_UNIT_MEGA_WATT,
}
return power_unit_mapping.get(power_unit, power_unit)
def to_legal_power_unit(power_unit: str) -> str:
"""Map the power unit from the thermostat to Home Assistant's expected unit."""
power_unit_mapping: dict[str, str] = {
POWER_UNIT_WATT: UnitOfPower.WATT,
POWER_UNIT_KILO_WATT: UnitOfPower.KILO_WATT,
POWER_UNIT_MEGA_WATT: UnitOfPower.MEGA_WATT,
}
internal_power_unit = to_internal_power_unit(power_unit) or power_unit
return power_unit_mapping.get(internal_power_unit, power_unit)
class UnknownEntity(HomeAssistantError):
"""Error to indicate there is an unknown entity_id given."""