diff --git a/custom_components/versatile_thermostat/manifest.json b/custom_components/versatile_thermostat/manifest.json index a61cc21..d4c7b57 100644 --- a/custom_components/versatile_thermostat/manifest.json +++ b/custom_components/versatile_thermostat/manifest.json @@ -14,6 +14,6 @@ "quality_scale": "silver", "requirements": [], "ssdp": [], - "version": "6.2.2", + "version": "6.2.3", "zeroconf": [] } \ No newline at end of file diff --git a/custom_components/versatile_thermostat/number.py b/custom_components/versatile_thermostat/number.py index b2bc336..117a607 100644 --- a/custom_components/versatile_thermostat/number.py +++ b/custom_components/versatile_thermostat/number.py @@ -11,6 +11,9 @@ from homeassistant.components.number import ( NumberMode, NumberDeviceClass, DOMAIN as NUMBER_DOMAIN, + DEFAULT_MAX_VALUE, + DEFAULT_MIN_VALUE, + DEFAULT_STEP, ) from homeassistant.components.climate import ( PRESET_BOOST, @@ -53,6 +56,7 @@ from .const import ( CONF_USE_PRESENCE_FEATURE, CONF_USE_CENTRAL_BOILER_FEATURE, overrides, + CONF_USE_MAIN_CENTRAL_CONFIG, ) PRESET_ICON_MAPPING = { @@ -341,7 +345,10 @@ class CentralConfigTemperatureNumber( async def async_set_native_value(self, value: float) -> None: """The value have change from the Number Entity in UI""" float_value = float(value) - old_value = float(self._attr_native_value) + old_value = ( + None if self._attr_native_value is None else float(self._attr_native_value) + ) + if float_value == old_value: return @@ -395,9 +402,11 @@ class TemperatureNumber( # pylint: disable=abstract-method self._attr_device_class = NumberDeviceClass.TEMPERATURE self._attr_native_unit_of_measurement = UnitOfTemperature.CELSIUS - self._attr_native_step = entry_infos.get(CONF_STEP_TEMPERATURE, 0.5) - self._attr_native_min_value = entry_infos.get(CONF_TEMP_MIN) - self._attr_native_max_value = entry_infos.get(CONF_TEMP_MAX) + self._has_central_main_attributes = entry_infos.get( + CONF_USE_MAIN_CENTRAL_CONFIG, False + ) + + self.init_min_max_step(entry_infos) # Initialize the values if included into the entry_infos. This will do # the temperature migration. @@ -459,7 +468,9 @@ class TemperatureNumber( # pylint: disable=abstract-method return float_value = float(value) - old_value = float(self._attr_native_value) + old_value = ( + None if self._attr_native_value is None else float(self._attr_native_value) + ) if float_value == old_value: return @@ -476,6 +487,10 @@ class TemperatureNumber( # pylint: disable=abstract-method ) ) + # We set the min, max and step from central config if relevant because it is possible that central config + # was not loaded at startup + self.init_min_max_step() + def __str__(self): return f"VersatileThermostat-{self.name}" @@ -485,3 +500,26 @@ class TemperatureNumber( # pylint: disable=abstract-method if not self.my_climate: return UnitOfTemperature.CELSIUS return self.my_climate.temperature_unit + + def init_min_max_step(self, entry_infos=None): + """Initialize min, max and step value from config or from central config""" + if self._has_central_main_attributes: + vthermapi: VersatileThermostatAPI = VersatileThermostatAPI.get_vtherm_api() + central_config = vthermapi.find_central_configuration() + if central_config: + self._attr_native_step = central_config.data.get(CONF_STEP_TEMPERATURE) + self._attr_native_min_value = central_config.data.get(CONF_TEMP_MIN) + self._attr_native_max_value = central_config.data.get(CONF_TEMP_MAX) + + return + + if entry_infos: + self._attr_native_step = entry_infos.get( + CONF_STEP_TEMPERATURE, DEFAULT_STEP + ) + self._attr_native_min_value = entry_infos.get( + CONF_TEMP_MIN, DEFAULT_MIN_VALUE + ) + self._attr_native_max_value = entry_infos.get( + CONF_TEMP_MAX, DEFAULT_MAX_VALUE + )