Skip to content

Commit 239deb8

Browse files
jmcollin78Jean-Marc Collin
andauthored
Switching preset modes back to none/manual keeps previous preset temperature (#1436)
Fixes #1379 Co-authored-by: Jean-Marc Collin <jean-marc.collin-extern@renault.com>
1 parent 8d90bdf commit 239deb8

2 files changed

Lines changed: 62 additions & 2 deletions

File tree

custom_components/versatile_thermostat/state_manager.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,9 @@ async def calculate_current_target_temperature(self, vtherm: "BaseThermostat") -
251251
self.update_current_temp_from_requested(vtherm)
252252

253253
# update requested state temperature to set it in concordance with preset
254-
if self._requested_state.preset != VThermPreset.NONE:
255-
self._requested_state.set_target_temperature(vtherm.find_preset_temp(self._requested_state.preset))
254+
# 1379 - do not overwrite requested_target_temp to keep the last manual tempe.
255+
# if self._requested_state.preset != VThermPreset.NONE:
256+
# self._requested_state.set_target_temperature(vtherm.find_preset_temp(self._requested_state.preset))
256257

257258
return self._current_state.is_target_temperature_changed
258259

tests/test_bugs.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,3 +768,62 @@ async def test_bug_1220(hass: HomeAssistant, skip_hass_states_is_state):
768768
# No changes on hvac_mode (but only on temperature or hvac_action)
769769
assert vtherm.hvac_mode == HVACMode.OFF
770770
assert vtherm.vtherm_hvac_mode == VThermHvacMode_OFF
771+
772+
773+
async def test_bug_1379(
774+
hass: HomeAssistant,
775+
skip_hass_states_is_state,
776+
skip_turn_on_off_heater,
777+
skip_send_event,
778+
):
779+
"""Test that switching from preset mode to no preset mode conserve the last target temperature set manually"""
780+
781+
tz = get_tz(hass) # pylint: disable=invalid-name
782+
now: datetime = datetime.now(tz=tz)
783+
784+
entry = MockConfigEntry(
785+
domain=DOMAIN,
786+
title="TheOverClimateMockName",
787+
unique_id="uniqueId",
788+
# default value are min 15°, max 30°, step 0.1
789+
data=PARTIAL_CLIMATE_CONFIG, # 5 minutes security delay
790+
)
791+
792+
# Min_temp is 15 and max_temp is 19
793+
fake_underlying_climate = MagicMockClimate()
794+
795+
# fmt:off
796+
with patch("custom_components.versatile_thermostat.base_thermostat.BaseThermostat.send_event"), \
797+
patch("custom_components.versatile_thermostat.underlyings.UnderlyingClimate.find_underlying_climate", return_value=fake_underlying_climate):
798+
# fmt:on
799+
entity = await create_thermostat(hass, entry, "climate.theoverclimatemockname", temps=default_temperatures)
800+
assert entity
801+
802+
assert entity.name == "TheOverClimateMockName"
803+
assert entity.is_over_climate is True
804+
assert entity.vtherm_hvac_mode is VThermHvacMode_OFF
805+
806+
# 1. Set a manual temperature first (no preset)
807+
await entity.async_set_temperature(temperature=17.5)
808+
809+
# check that the requested temperature is set
810+
assert entity.target_temperature == 17.5
811+
assert entity.requested_state.target_temperature == 17.5
812+
813+
# 2. Set preset to Comfort
814+
await entity.async_set_preset_mode(VThermPreset.COMFORT)
815+
assert entity.preset_mode == VThermPreset.COMFORT
816+
# target temperature should be the comfort temperature
817+
assert entity.target_temperature == 19
818+
assert entity.requested_state.target_temperature == 17.5
819+
assert entity.current_state.target_temperature == 19
820+
821+
# 3. set back to manual mode (no preset)
822+
await entity.async_set_preset_mode(VThermPreset.NONE)
823+
assert entity.preset_mode == VThermPreset.NONE
824+
# target temperature should be the last manual temperature
825+
assert entity.target_temperature == 17.5
826+
assert entity.requested_state.target_temperature == 17.5
827+
assert entity.current_state.target_temperature == 17.5
828+
829+
entity.remove_thermostat()

0 commit comments

Comments
 (0)