diff --git a/README-fr.md b/README-fr.md index c937e9e..2c2e6b1 100644 --- a/README-fr.md +++ b/README-fr.md @@ -84,14 +84,15 @@ Ce composant personnalisé pour Home Assistant est une mise à niveau et est une > ![Nouveau](https://github.com/jmcollin78/versatile_thermostat/blob/main/images/new-icon.png?raw=true) _*Nouveautés*_ +> * **Release 5.4** : Ajout du pas de température [#311](https://github.com/jmcollin78/versatile_thermostat/issues/311). > * **Release 5.3** : Ajout d'une fonction de pilotage d'une chaudière centrale [#234](https://github.com/jmcollin78/versatile_thermostat/issues/234) - plus d'infos ici: [Le contrôle d'une chaudière centrale](#le-contrôle-dune-chaudière-centrale). Ajout de la possibilité de désactiver le mode sécurité pour le thermomètre extérieur [#343](https://github.com/jmcollin78/versatile_thermostat/issues/343) > * **Release 5.2** : Ajout d'un `central_mode` permettant de piloter tous les VTherms de façon centralisée [#158](https://github.com/jmcollin78/versatile_thermostat/issues/158). > * **Release 5.1** : Limitation des valeurs envoyées aux valves et au température envoyées au climate sous-jacent. > * **Release 5.0** : Ajout d'une configuration centrale permettant de mettre en commun les attributs qui peuvent l'être [#239](https://github.com/jmcollin78/versatile_thermostat/issues/239). -> * **Release 4.3** : Ajout d'un mode auto-fan pour le type `over_climate` permettant d'activer la ventilation si l'écart de température est important [#223](https://github.com/jmcollin78/versatile_thermostat/issues/223).
Autres versions +> * **Release 4.3** : Ajout d'un mode auto-fan pour le type `over_climate` permettant d'activer la ventilation si l'écart de température est important [#223](https://github.com/jmcollin78/versatile_thermostat/issues/223). > * **Release 4.2** : Le calcul de la pente de la courbe de température se fait maintenant en °/heure et non plus en °/min [#242](https://github.com/jmcollin78/versatile_thermostat/issues/242). Correction de la détection automatique des ouvertures par l'ajout d'un lissage de la courbe de température . > * **Release 4.1** : Ajout d'un mode de régulation **Expert** dans lequel l'utilisateur peut spécifier ses propres paramètres d'auto-régulation au lieu d'utiliser les pre-programmés [#194](https://github.com/jmcollin78/versatile_thermostat/issues/194). > * **Release 4.0** : Ajout de la prise en charge de la **Versatile Thermostat UI Card**. Voir [Versatile Thermostat UI Card](https://github.com/jmcollin78/versatile-thermostat-ui-card). Ajout d'un mode de régulation **Slow** pour les appareils de chauffage à latence lente [#168](https://github.com/jmcollin78/versatile_thermostat/issues/168). Changement de la façon dont **la puissance est calculée** dans le cas de VTherm avec des équipements multi-sous-jacents [#146](https://github.com/jmcollin78/versatile_thermostat/issues/146). Ajout de la prise en charge de AC et Heat pour VTherm via un interrupteur également [#144](https://github.com/jmcollin78/versatile_thermostat/pull/144) @@ -127,7 +128,7 @@ En conséquence toute la phase de paramètrage d'un VTherm a été profondemment **Note :** les copies d'écran de la configuration d'un VTherm n'ont pas été mises à jour. # Merci pour la bière [buymecoffee](https://www.buymeacoffee.com/jmcollin78) -Un grand merci à @salabur, @pvince83, @bergoglio, @EPicLURcher, @ecolorado66, @Kriss1670, @maia, @f.maymil, @moutte69, @Jerome, @Gunnar M, @Greg.o, @John Burgess, @abyssmal, @capinfo26, @Helge, @MattG @Mexx62, @Someone, @Lajull pour les bières. Ca fait très plaisir et ça m'encourage à continuer ! +Un grand merci à @salabur, @pvince83, @bergoglio, @EPicLURcher, @ecolorado66, @Kriss1670, @maia, @f.maymil, @moutte69, @Jerome, @Gunnar M, @Greg.o, @John Burgess, @abyssmal, @capinfo26, @Helge, @MattG @Mexx62, @Someone, @Lajull, @giopeco pour les bières. Ca fait très plaisir et ça m'encourage à continuer ! # Quand l'utiliser et ne pas l'utiliser diff --git a/README.md b/README.md index 2250230..c176c34 100644 --- a/README.md +++ b/README.md @@ -84,14 +84,15 @@ This custom component for Home Assistant is an upgrade and is a complete rewrite of the component "Awesome thermostat" (see [Github](https://github.com/dadge/awesome_thermostat)) with addition of features. >![New](https://github.com/jmcollin78/versatile_thermostat/blob/main/images/new-icon.png?raw=true) _*News*_ +> * **Release 5.4**: Added a temperature step [#311](https://github.com/jmcollin78/versatile_thermostat/issues/311). > * **Release 5.3**: Added a central boiler control function [#234](https://github.com/jmcollin78/versatile_thermostat/issues/234) - more information here: [Controlling a central boiler](#controlling-a-central-boiler). Added the ability to disable security mode for outdoor thermometer [#343](https://github.com/jmcollin78/versatile_thermostat/issues/343) > * **Release 5.2**: Added a `central_mode` allowing all VTherms to be controlled centrally [#158](https://github.com/jmcollin78/versatile_thermostat/issues/158). > * **Release 5.1**: Limitation of the values sent to the valves and the temperature sent to the underlying climate. > * **Release 5.0**: Added a central configuration allowing the sharing of attributes that can be shared [#239](https://github.com/jmcollin78/versatile_thermostat/issues/239). -> * **Release 4.3**: Added an auto-fan mode for the `over_climate` type allowing ventilation to be activated if the temperature difference is significant [#223](https://github.com/jmcollin78/versatile_thermostat/issues/223).
Others releases +> * **Release 4.3**: Added an auto-fan mode for the `over_climate` type allowing ventilation to be activated if the temperature difference is significant [#223](https://github.com/jmcollin78/versatile_thermostat/issues/223). > * **Release 4.2**: The calculation of the slope of the temperature curve is now done in °/hour and no longer in °/min [#242](https://github.com/jmcollin78/versatile_thermostat/issues/242). Correction of automatic detection of openings by adding smoothing of the temperature curve. > * **Release 4.1**: Added an **Expert** regulation mode in which the user can specify their own auto-regulation parameters instead of using the pre-programmed ones [#194]( https://github.com/jmcollin78/versatile_thermostat/issues/194). > * **Release 4.0**: Added the support of **Versatile Thermostat UI Card**. See [Versatile Thermostat UI Card](https://github.com/jmcollin78/versatile-thermostat-ui-card). Added a **Slow** regulation mode for slow latency heating devices [#168](https://github.com/jmcollin78/versatile_thermostat/issues/168). Change the way **the power is calculated** in case of VTherm with multi-underlying equipements [#146](https://github.com/jmcollin78/versatile_thermostat/issues/146). Added the support of AC and Heat for VTherm over switch alse [#144](https://github.com/jmcollin78/versatile_thermostat/pull/144) @@ -127,7 +128,7 @@ Consequently, the entire configuration phase of a VTherm has been profoundly mod **Note:** the VTherm configuration screenshots have not been updated. # Thanks for the beer [buymecoffee](https://www.buymeacoffee.com/jmcollin78) -Many thanks to @salabur, @pvince83, @bergoglio, @EPicLURcher, @ecolorado66, @Kriss1670, @maia, @f.maymil, @moutte69, @Jerome, @Gunnar M, @Greg.o, @John Burgess, @abyssmal, @capinfo26, @Helge, @MattG, @MattG, @Mexx62, @Someone, @Lajull for the beers. It's very nice and encourages me to continue! +Many thanks to @salabur, @pvince83, @bergoglio, @EPicLURcher, @ecolorado66, @Kriss1670, @maia, @f.maymil, @moutte69, @Jerome, @Gunnar M, @Greg.o, @John Burgess, @abyssmal, @capinfo26, @Helge, @MattG, @MattG, @Mexx62, @Someone, @Lajull, @giopeco for the beers. It's very nice and encourages me to continue! # When to use / not use This thermostat can control 3 types of equipment: diff --git a/custom_components/versatile_thermostat/base_thermostat.py b/custom_components/versatile_thermostat/base_thermostat.py index 55f9609..85f30eb 100644 --- a/custom_components/versatile_thermostat/base_thermostat.py +++ b/custom_components/versatile_thermostat/base_thermostat.py @@ -355,6 +355,8 @@ class BaseThermostat(ClimateEntity, RestoreEntity): self._ac_mode = entry_infos.get(CONF_AC_MODE) is True self._attr_max_temp = entry_infos.get(CONF_TEMP_MAX) self._attr_min_temp = entry_infos.get(CONF_TEMP_MIN) + if (step := entry_infos.get(CONF_STEP_TEMPERATURE)) is not None: + self._attr_target_temperature_step = step # convert entry_infos into usable attributes presets = {} @@ -400,8 +402,6 @@ class BaseThermostat(ClimateEntity, RestoreEntity): self._proportional_function = entry_infos.get(CONF_PROP_FUNCTION) self._temp_sensor_entity_id = entry_infos.get(CONF_TEMP_SENSOR) self._ext_temp_sensor_entity_id = entry_infos.get(CONF_EXTERNAL_TEMP_SENSOR) - # Default value not configurable - self._attr_target_temperature_step = 0.1 self._power_sensor_entity_id = entry_infos.get(CONF_POWER_SENSOR) self._max_power_sensor_entity_id = entry_infos.get(CONF_MAX_POWER_SENSOR) self._window_sensor_entity_id = entry_infos.get(CONF_WINDOW_SENSOR) diff --git a/custom_components/versatile_thermostat/config_schema.py b/custom_components/versatile_thermostat/config_schema.py index fc9562f..e449bcb 100644 --- a/custom_components/versatile_thermostat/config_schema.py +++ b/custom_components/versatile_thermostat/config_schema.py @@ -61,6 +61,7 @@ STEP_CENTRAL_MAIN_DATA_SCHEMA = vol.Schema( # pylint: disable=invalid-name ), vol.Required(CONF_TEMP_MIN, default=7): vol.Coerce(float), vol.Required(CONF_TEMP_MAX, default=35): vol.Coerce(float), + vol.Required(CONF_STEP_TEMPERATURE, default=0.1): vol.Coerce(float), vol.Required(CONF_ADD_CENTRAL_BOILER_CONTROL, default=False): cv.boolean, } ) @@ -72,6 +73,7 @@ STEP_CENTRAL_SPEC_MAIN_DATA_SCHEMA = vol.Schema( # pylint: disable=invalid-name ), vol.Required(CONF_TEMP_MIN, default=7): vol.Coerce(float), vol.Required(CONF_TEMP_MAX, default=35): vol.Coerce(float), + vol.Required(CONF_STEP_TEMPERATURE, default=0.1): vol.Coerce(float), } ) diff --git a/custom_components/versatile_thermostat/const.py b/custom_components/versatile_thermostat/const.py index b4dd513..3f3dc84 100644 --- a/custom_components/versatile_thermostat/const.py +++ b/custom_components/versatile_thermostat/const.py @@ -112,6 +112,7 @@ CONF_AUTO_FAN_LOW = "auto_fan_low" CONF_AUTO_FAN_MEDIUM = "auto_fan_medium" CONF_AUTO_FAN_HIGH = "auto_fan_high" CONF_AUTO_FAN_TURBO = "auto_fan_turbo" +CONF_STEP_TEMPERATURE = "step_temperature" # Global params into configuration.yaml CONF_SHORT_EMA_PARAMS = "short_ema_params" @@ -270,6 +271,7 @@ ALL_CONF = ( CONF_CENTRAL_BOILER_ACTIVATION_SRV, CONF_CENTRAL_BOILER_DEACTIVATION_SRV, CONF_WINDOW_ACTION, + CONF_STEP_TEMPERATURE, ] + CONF_PRESETS_VALUES + CONF_PRESETS_AWAY_VALUES diff --git a/custom_components/versatile_thermostat/manifest.json b/custom_components/versatile_thermostat/manifest.json index 037bf65..18949fa 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": "5.3.0", + "version": "5.4.0", "zeroconf": [] } \ No newline at end of file diff --git a/custom_components/versatile_thermostat/strings.json b/custom_components/versatile_thermostat/strings.json index 5cae3ba..e4e90a0 100644 --- a/custom_components/versatile_thermostat/strings.json +++ b/custom_components/versatile_thermostat/strings.json @@ -23,6 +23,7 @@ "cycle_min": "Cycle duration (minutes)", "temp_min": "Minimal temperature allowed", "temp_max": "Maximal temperature allowed", + "step_temperature": "Temperature step", "device_power": "Device power", "use_central_mode": "Enable the control by central entity (need central config). Check to enable the control of the VTherm with the select central_mode entities.", "use_window_feature": "Use window detection", @@ -257,6 +258,7 @@ "cycle_min": "Cycle duration (minutes)", "temp_min": "Minimal temperature allowed", "temp_max": "Maximal temperature allowed", + "step_temperature": "Temperature step", "device_power": "Device power", "use_central_mode": "Enable the control by central entity (need central config). Check to enable the control of the VTherm with the select central_mode entities.", "use_window_feature": "Use window detection", diff --git a/custom_components/versatile_thermostat/thermostat_climate.py b/custom_components/versatile_thermostat/thermostat_climate.py index 0a4d641..1807daa 100644 --- a/custom_components/versatile_thermostat/thermostat_climate.py +++ b/custom_components/versatile_thermostat/thermostat_climate.py @@ -850,13 +850,14 @@ class ThermostatOverClimate(BaseThermostat): return self._support_flags - @property - def target_temperature_step(self) -> float | None: - """Return the supported step of target temperature.""" - if self.underlying_entity(0): - return self.underlying_entity(0).target_temperature_step - - return None + # We keep the step configured for the VTherm and not the step of the underlying + # @property + # def target_temperature_step(self) -> float | None: + # """Return the supported step of target temperature.""" + # if self.underlying_entity(0): + # return self.underlying_entity(0).target_temperature_step + # + # return None @property def target_temperature_high(self) -> float | None: diff --git a/custom_components/versatile_thermostat/translations/en.json b/custom_components/versatile_thermostat/translations/en.json index 5cae3ba..e4e90a0 100644 --- a/custom_components/versatile_thermostat/translations/en.json +++ b/custom_components/versatile_thermostat/translations/en.json @@ -23,6 +23,7 @@ "cycle_min": "Cycle duration (minutes)", "temp_min": "Minimal temperature allowed", "temp_max": "Maximal temperature allowed", + "step_temperature": "Temperature step", "device_power": "Device power", "use_central_mode": "Enable the control by central entity (need central config). Check to enable the control of the VTherm with the select central_mode entities.", "use_window_feature": "Use window detection", @@ -257,6 +258,7 @@ "cycle_min": "Cycle duration (minutes)", "temp_min": "Minimal temperature allowed", "temp_max": "Maximal temperature allowed", + "step_temperature": "Temperature step", "device_power": "Device power", "use_central_mode": "Enable the control by central entity (need central config). Check to enable the control of the VTherm with the select central_mode entities.", "use_window_feature": "Use window detection", diff --git a/custom_components/versatile_thermostat/translations/fr.json b/custom_components/versatile_thermostat/translations/fr.json index eb6d894..6506b14 100644 --- a/custom_components/versatile_thermostat/translations/fr.json +++ b/custom_components/versatile_thermostat/translations/fr.json @@ -23,6 +23,7 @@ "cycle_min": "Durée du cycle (minutes)", "temp_min": "Température minimale permise", "temp_max": "Température maximale permise", + "step_temperature": "Pas de température", "device_power": "Puissance de l'équipement", "use_central_mode": "Autoriser le controle par une entity centrale ('nécessite une config. centrale`). Cochez pour autoriser le contrôle du VTherm par la liste déroulante 'central_mode' de l'entité configuration centrale.", "use_window_feature": "Avec détection des ouvertures", @@ -269,6 +270,7 @@ "cycle_min": "Durée du cycle (minutes)", "temp_min": "Température minimale permise", "temp_max": "Température maximale permise", + "step_temperature": "Pas de température", "device_power": "Puissance de l'équipement", "use_central_mode": "Autoriser le controle par une entity centrale ('nécessite une config. centrale`). Cochez pour autoriser le contrôle du VTherm par la liste déroulante 'central_mode' de l'entité configuration centrale.", "use_window_feature": "Avec détection des ouvertures", diff --git a/tests/commons.py b/tests/commons.py index 4401236..ccefd54 100644 --- a/tests/commons.py +++ b/tests/commons.py @@ -146,6 +146,7 @@ FULL_CENTRAL_CONFIG = { CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor", CONF_TEMP_MIN: 15, CONF_TEMP_MAX: 30, + CONF_STEP_TEMPERATURE: 0.1, CONF_TPI_COEF_INT: 0.5, CONF_TPI_COEF_EXT: 0.02, "frost_temp": 10, @@ -186,6 +187,7 @@ FULL_CENTRAL_CONFIG_WITH_BOILER = { CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor", CONF_TEMP_MIN: 15, CONF_TEMP_MAX: 30, + CONF_STEP_TEMPERATURE: 0.1, CONF_TPI_COEF_INT: 0.5, CONF_TPI_COEF_EXT: 0.02, "frost_temp": 10, @@ -263,6 +265,7 @@ class MockClimate(ClimateEntity): self._attr_target_temperature = 20 self._attr_current_temperature = 15 self._attr_hvac_action = hvac_action + self._attr_target_temperature_step = 0.2 self._fan_modes = fan_modes if fan_modes else None self._attr_fan_mode = None diff --git a/tests/const.py b/tests/const.py index 5fe3c40..71699fd 100644 --- a/tests/const.py +++ b/tests/const.py @@ -33,6 +33,7 @@ MOCK_TH_OVER_4SWITCH_USER_CONFIG = { CONF_CYCLE_MIN: 8, CONF_TEMP_MIN: 15, CONF_TEMP_MAX: 30, + CONF_STEP_TEMPERATURE: 0.1, CONF_DEVICE_POWER: 1, CONF_USE_WINDOW_FEATURE: True, CONF_USE_MOTION_FEATURE: True, @@ -59,6 +60,7 @@ MOCK_TH_OVER_CLIMATE_CENTRAL_MAIN_CONFIG = { CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor", CONF_TEMP_MIN: 15, CONF_TEMP_MAX: 30, + CONF_STEP_TEMPERATURE: 0.1, # Keep default values which are False } @@ -66,6 +68,7 @@ MOCK_TH_OVER_SWITCH_CENTRAL_MAIN_CONFIG = { CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor", CONF_TEMP_MIN: 15, CONF_TEMP_MAX: 30, + CONF_STEP_TEMPERATURE: 0.1, # Keep default values which are False } diff --git a/tests/test_bugs.py b/tests/test_bugs.py index acdf6e4..c5acb54 100644 --- a/tests/test_bugs.py +++ b/tests/test_bugs.py @@ -591,6 +591,7 @@ async def test_bug_272( domain=DOMAIN, title="TheOverClimateMockName", unique_id="uniqueId", + # default value are min 15°, max 30°, step 0.1 data=PARTIAL_CLIMATE_CONFIG, # 5 minutes security delay ) @@ -623,6 +624,8 @@ async def test_bug_272( assert entity.name == "TheOverClimateMockName" assert entity.is_over_climate is True assert entity.hvac_mode is HVACMode.OFF + # The VTherm value and not the underlying value + assert entity.target_temperature_step == 0.1 assert entity.target_temperature == entity.min_temp assert entity.is_regulated is True diff --git a/tests/test_central_boiler.py b/tests/test_central_boiler.py index 879bc14..369c4e4 100644 --- a/tests/test_central_boiler.py +++ b/tests/test_central_boiler.py @@ -760,7 +760,7 @@ async def test_update_central_boiler_state_simple_climate( climate1.set_hvac_action(HVACAction.HEATING) climate1.async_write_ha_state() # Wait for state event propagation - await asyncio.sleep(0.1) + await asyncio.sleep(0.5) assert entity.hvac_action == HVACAction.HEATING @@ -801,7 +801,7 @@ async def test_update_central_boiler_state_simple_climate( climate1.set_hvac_action(HVACAction.IDLE) climate1.async_write_ha_state() # Wait for state event propagation - await asyncio.sleep(0.1) + await asyncio.sleep(0.5) assert entity.hvac_action == HVACAction.IDLE diff --git a/tests/test_central_config.py b/tests/test_central_config.py index a772bd1..eaa8ce0 100644 --- a/tests/test_central_config.py +++ b/tests/test_central_config.py @@ -106,7 +106,7 @@ async def test_add_a_central_config(hass: HomeAssistant, skip_hass_states_is_sta # @pytest.mark.parametrize("expected_lingering_tasks", [True]) -# @pytest.mark.parametrize("expected_lingering_timers", [True]) +@pytest.mark.parametrize("expected_lingering_timers", [True]) async def test_minimal_over_switch_wo_central_config( hass: HomeAssistant, skip_hass_states_is_state, init_vtherm_api ): @@ -124,6 +124,7 @@ async def test_minimal_over_switch_wo_central_config( CONF_CYCLE_MIN: 5, CONF_TEMP_MIN: 8, CONF_TEMP_MAX: 18, + CONF_STEP_TEMPERATURE: 0.3, "frost_temp": 10, "eco_temp": 17, "comfort_temp": 18, @@ -165,8 +166,9 @@ async def test_minimal_over_switch_wo_central_config( assert entity._temp_sensor_entity_id == "sensor.mock_temp_sensor" assert entity._ext_temp_sensor_entity_id == "sensor.mock_ext_temp_sensor" assert entity._cycle_min == 5 - assert entity._attr_min_temp == 8 - assert entity._attr_max_temp == 18 + assert entity.min_temp == 8 + assert entity.max_temp == 18 + assert entity.target_temperature_step == 0.3 assert entity.preset_modes == ["none", "frost", "eco", "comfort", "boost"] assert entity.is_window_auto_enabled is False assert entity.nb_underlying_entities == 1 @@ -202,6 +204,7 @@ async def test_full_over_switch_wo_central_config( CONF_CYCLE_MIN: 5, CONF_TEMP_MIN: 8, CONF_TEMP_MAX: 18, + CONF_STEP_TEMPERATURE: 0.3, "frost_temp": 10, "eco_temp": 17, "comfort_temp": 18, @@ -257,8 +260,9 @@ async def test_full_over_switch_wo_central_config( assert entity._temp_sensor_entity_id == "sensor.mock_temp_sensor" assert entity._ext_temp_sensor_entity_id == "sensor.mock_ext_temp_sensor" assert entity._cycle_min == 5 - assert entity._attr_min_temp == 8 - assert entity._attr_max_temp == 18 + assert entity.min_temp == 8 + assert entity.max_temp == 18 + assert entity.target_temperature_step == 0.3 assert entity.preset_modes == [ "none", "frost", @@ -318,6 +322,7 @@ async def test_full_over_switch_with_central_config( CONF_CYCLE_MIN: 5, CONF_TEMP_MIN: 8, CONF_TEMP_MAX: 18, + CONF_STEP_TEMPERATURE: 0.3, "frost_temp": 10, "eco_temp": 17, "comfort_temp": 18, @@ -369,8 +374,9 @@ async def test_full_over_switch_with_central_config( assert entity._temp_sensor_entity_id == "sensor.mock_temp_sensor" assert entity._ext_temp_sensor_entity_id == "sensor.mock_ext_temp_sensor" assert entity._cycle_min == 5 - assert entity._attr_min_temp == 15 - assert entity._attr_max_temp == 30 + assert entity.min_temp == 15 + assert entity.max_temp == 30 + assert entity.target_temperature_step == 0.1 assert entity.preset_modes == [ "none", "frost",