From 539ec4a6bd5bb52c0ff7b11cfe1b790e33e65861 Mon Sep 17 00:00:00 2001 From: Jean-Marc Collin Date: Sun, 2 Apr 2023 16:44:57 +0200 Subject: [PATCH] Isseu #70. Build release. --- README-fr.md | 13 +- README.md | 4 + .../versatile_thermostat/climate.py | 18 +- .../tests/test_movement.py | 401 ++++++++++++++++++ .../versatile_thermostat/tests/test_window.py | 82 ++-- .../versatile_thermostat/underlyings.py | 7 +- images/config-linked-entity.png | Bin 13105 -> 37476 bytes images/multi-switch-activation.png | Bin 0 -> 22408 bytes 8 files changed, 487 insertions(+), 38 deletions(-) create mode 100644 custom_components/versatile_thermostat/tests/test_movement.py create mode 100644 images/multi-switch-activation.png diff --git a/README-fr.md b/README-fr.md index 0259ee3..598577a 100644 --- a/README-fr.md +++ b/README-fr.md @@ -15,7 +15,7 @@ - [Installation manuelle](#installation-manuelle) - [Configuration](#configuration) - [Choix des attributs de base](#choix-des-attributs-de-base) - - [Sélectionnez l'entité pilotée](#sélectionnez-lentité-pilotée) + - [Sélectionnez des entités pilotées](#sélectionnez-des-entités-pilotées) - [Configurez les coefficients de l'algorithme TPI](#configurez-les-coefficients-de-lalgorithme-tpi) - [Configurer la température préréglée](#configurer-la-température-préréglée) - [Configurer les portes/fenêtres en allumant/éteignant les thermostats](#configurer-les-portesfenêtres-en-allumantéteignant-les-thermostats) @@ -53,6 +53,7 @@ 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 3.2** : ajout de la possibilité de commander plusieurs switch à partir du même thermostat. Dans ce mode, les switchs sont déclenchés avec un délai pour minimiser la puisssance nécessaire à un instant (on minimise les périodes de recouvrement). Voir [Configuration](#sélectionnez-des-entités-pilotées) > * **Release 3.1** : ajout d'une détection de fenêtres/portes ouvertes par chute de température. Cette nouvelle fonction permet de stopper automatiquement un radiateur lorsque la température chute brutalement. Voir [Le mode auto](#le-mode-auto) > * **Release majeure 3.0** : ajout d'un équipement thermostat et de capteurs (binaires et non binaires) associés. Beaucoup plus proche de la philosphie Home Assistant, vous avez maintenant un accès direct à l'énergie consommée par le radiateur piloté par le thermostat et à plein d'autres capteurs qui seront utiles dans vos automatisations et dashboard. > * **release 2.3** : ajout de la mesure de puissance et d'énergie du radiateur piloté par le thermostat. @@ -139,12 +140,16 @@ Donnez les principaux attributs obligatoires : 1. avec le type ```thermostat_over_swutch```, les calculs sont effectués à chaque cycle. Donc en cas de changement de conditions, il faudra attendre le prochain cycle pour voir un changement. Pour cette raison, le cycle ne doit pas être trop long. **5 min est une bonne valeur**, 2. si le cycle est trop court, le radiateur ne pourra jamais atteindre la température cible en effet pour le radiateur à accumulation et il sera sollicité inutilement -## Sélectionnez l'entité pilotée -En fonction de votre choix sur le type de thermostat, vous devrez choisir une entité de type switch ou une entité de type climate. Seules les entités compatibles sont présentées. +## Sélectionnez des entités pilotées +En fonction de votre choix sur le type de thermostat, vous devrez choisir une ou plusieurs entités de type switch ou une entité de type climate. Seules les entités compatibles sont présentées. Pour un thermostat de type ```thermostat_over_switch```: ![image](https://github.com/jmcollin78/versatile_thermostat/blob/main/images/config-linked-entity.png?raw=true) -L'algorithme à utiliser est aujourd'hui limité à TPI est disponible. Voir [algorithme](#algorithme) +L'algorithme à utiliser est aujourd'hui limité à TPI est disponible. Voir [algorithme](#algorithme). +Si plusieurs entités de type sont configurées, la thermostat décale les activations afin de minimiser le nombre de switch actif à un instant t. Ca permet une meilleure répartition de la puissance puisque chaque radiateur va s'allumer à son tour. +Exemple de déclenchement synchronisé : +![image](https://github.com/jmcollin78/versatile_thermostat/blob/main/images/multi-switch-activation.png?raw=true) + Pour un thermostat de type ```thermostat_over_climate```: ![image](https://github.com/jmcollin78/versatile_thermostat/blob/main/images/config-linked-entity2.png?raw=true) diff --git a/README.md b/README.md index caf3cf4..9cece77 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ 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 3.2**: added the ability to control multiple switches from the same thermostat. In this mode, the switches are triggered with a delay to minimize the power required at one time (we minimize the recovery periods). See [Configuration](#select-the-driven-entity) > * **Release 3.1**: added detection of open windows/doors by temperature drop. This new function makes it possible to automatically stop a radiator when the temperature drops suddenly. See [Auto mode](#auto-mode) > * **Major release 3.0**: addition of thermostat equipment and associated sensors (binary and non-binary). Much closer to the Home Assistant philosophy, you now have direct access to the energy consumed by the radiator controlled by the thermostat and many other sensors that will be useful in your automations and dashboard. > * **release 2.3**: addition of the power and energy measurement of the radiator controlled by the thermostat. @@ -141,6 +142,9 @@ Depending on your choice on the type of thermostat, you will have to choose a sw For a ```thermostat_over_switch``` thermostat: ![image](https://github.com/jmcollin78/versatile_thermostat/blob/main/images/config-linked-entity.png?raw=true) The algorithm to be used today is limited to TPI is available. See [algorithm](#algorithm) +If several type entities are configured, the thermostat staggers the activations in order to minimize the number of active switches at a time t. This allows a better distribution of power since each radiator will turn on in turn. +Example of synchronized triggering: +![image](https://github.com/jmcollin78/versatile_thermostat/blob/main/images/multi-switch-activation.png?raw=true) For a ```thermostat_over_climate``` thermostat: ![image](https://github.com/jmcollin78/versatile_thermostat/blob/main/images/config-linked-entity2.png?raw=true) diff --git a/custom_components/versatile_thermostat/climate.py b/custom_components/versatile_thermostat/climate.py index ad940b9..0aed65e 100644 --- a/custom_components/versatile_thermostat/climate.py +++ b/custom_components/versatile_thermostat/climate.py @@ -1198,12 +1198,18 @@ class VersatileThermostat(ClimateEntity, RestoreEntity): if hvac_mode is None: return - # Delegate to all underlying - for under in self._underlyings: - await under.set_hvac_mode(hvac_mode) - self._hvac_mode = hvac_mode + # Delegate to all underlying + need_control_heating = False + for under in self._underlyings: + need_control_heating = ( + await under.set_hvac_mode(hvac_mode) or need_control_heating + ) + + if need_control_heating: + await self._async_control_heating(force=True) + # Ensure we update the current operation after changing the mode self.reset_last_temperature_time() @@ -1514,7 +1520,8 @@ class VersatileThermostat(ClimateEntity, RestoreEntity): new_preset, ) # We do not change the preset which is kept to ACTIVITY but only the target_temperature - await self._async_internal_set_temperature(self._presets[new_preset]) + # We take the presence into account + await self._async_internal_set_temperature(self.find_preset_temp(new_preset)) self.recalculate() await self._async_control_heating(force=True) @@ -2214,6 +2221,7 @@ class VersatileThermostat(ClimateEntity, RestoreEntity): # Stop here if we are off if self._hvac_mode == HVACMode.OFF: _LOGGER.debug("%s - End of cycle (HVAC_MODE_OFF)", self) + # A security to force stop heater if still active if self._is_device_active: await self._async_underlying_entity_turn_off() return diff --git a/custom_components/versatile_thermostat/tests/test_movement.py b/custom_components/versatile_thermostat/tests/test_movement.py new file mode 100644 index 0000000..e86483e --- /dev/null +++ b/custom_components/versatile_thermostat/tests/test_movement.py @@ -0,0 +1,401 @@ +""" Test the Window management """ +import asyncio +from unittest.mock import patch, call, PropertyMock +from .commons import * # pylint: disable=wildcard-import, unused-wildcard-import +from datetime import datetime, timedelta + +import logging + +logging.getLogger().setLevel(logging.DEBUG) + + +async def test_movement_management_time_not_enough( + hass: HomeAssistant, skip_hass_states_is_state +): + """Test the Presence management when time is not enough""" + + entry = MockConfigEntry( + domain=DOMAIN, + title="TheOverSwitchMockName", + unique_id="uniqueId", + data={ + CONF_NAME: "TheOverSwitchMockName", + CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH, + CONF_TEMP_SENSOR: "sensor.mock_temp_sensor", + CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor", + CONF_CYCLE_MIN: 5, + CONF_TEMP_MIN: 15, + CONF_TEMP_MAX: 30, + "eco_temp": 17, + "comfort_temp": 18, + "boost_temp": 19, + "eco_away_temp": 17, + "comfort_away_temp": 18, + "boost_away_temp": 19, + CONF_USE_WINDOW_FEATURE: False, + CONF_USE_MOTION_FEATURE: True, + CONF_USE_POWER_FEATURE: False, + CONF_USE_PRESENCE_FEATURE: True, + CONF_HEATER: "switch.mock_switch", + CONF_PROP_FUNCTION: PROPORTIONAL_FUNCTION_TPI, + CONF_TPI_COEF_INT: 0.3, + CONF_TPI_COEF_EXT: 0.01, + CONF_MINIMAL_ACTIVATION_DELAY: 30, + CONF_SECURITY_DELAY_MIN: 5, + CONF_SECURITY_MIN_ON_PERCENT: 0.3, + CONF_MOTION_SENSOR: "binary_sensor.mock_motion_sensor", + CONF_MOTION_DELAY: 0, # important to not been obliged to wait + CONF_MOTION_PRESET: "boost", + CONF_NO_MOTION_PRESET: "comfort", + CONF_PRESENCE_SENSOR: "binary_sensor.mock_presence_sensor", + }, + ) + + entity: VersatileThermostat = await create_thermostat( + hass, entry, "climate.theoverswitchmockname" + ) + assert entity + + tz = get_tz(hass) # pylint: disable=invalid-name + now: datetime = datetime.now(tz=tz) + + # start heating, in boost mode. We block the control_heating to avoid running a cycle + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat._async_control_heating" + ): + await entity.async_set_hvac_mode(HVACMode.HEAT) + await entity.async_set_preset_mode(PRESET_ACTIVITY) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because no motion is detected yet + assert entity.target_temperature == 18 + assert entity.motion_state is None + assert entity.presence_state is None + + event_timestamp = now - timedelta(minutes=4) + await send_temperature_change_event(entity, 18, event_timestamp) + await send_ext_temperature_change_event(entity, 10, event_timestamp) + + await send_presence_change_event(entity, True, False, event_timestamp) + assert entity.presence_state is "on" + + # starts detecting motion + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" + ) as mock_send_event, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_on" + ) as mock_heater_on, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" + ) as mock_heater_off, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", + return_value=True, + ), patch( + "homeassistant.helpers.condition.state", return_value=False + ): + event_timestamp = now - timedelta(minutes=3) + await send_motion_change_event(entity, True, False, event_timestamp) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because no motion is detected yet + assert entity.target_temperature == 18 + assert entity.motion_state is None + assert entity.presence_state is "on" + + assert mock_send_event.call_count == 0 + # Change is not confirmed + assert mock_heater_on.call_count == 0 + assert mock_heater_off.call_count == 0 + assert mock_send_event.call_count == 0 + + # stop detecting motion with confirmation of stop + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" + ) as mock_send_event, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_on" + ) as mock_heater_on, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" + ) as mock_heater_off, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", + return_value=True, + ) as mock_device_active, patch( + "homeassistant.helpers.condition.state", return_value=True + ) as mock_condition: + event_timestamp = now - timedelta(minutes=2) + await send_motion_change_event(entity, False, True, event_timestamp) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because no motion is detected yet + assert entity.target_temperature == 18 + assert entity.motion_state is "off" + assert entity.presence_state is "on" + + assert mock_send_event.call_count == 0 + # Change is not confirmed + assert mock_heater_on.call_count == 0 + # Because device is active + assert mock_heater_off.call_count == 1 + assert mock_send_event.call_count == 0 + + +async def test_movement_management_time_enough_and_presence( + hass: HomeAssistant, skip_hass_states_is_state +): + """Test the Presence management when time is not enough""" + + entry = MockConfigEntry( + domain=DOMAIN, + title="TheOverSwitchMockName", + unique_id="uniqueId", + data={ + CONF_NAME: "TheOverSwitchMockName", + CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH, + CONF_TEMP_SENSOR: "sensor.mock_temp_sensor", + CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor", + CONF_CYCLE_MIN: 5, + CONF_TEMP_MIN: 15, + CONF_TEMP_MAX: 30, + "eco_temp": 17, + "comfort_temp": 18, + "boost_temp": 19, + "eco_away_temp": 17, + "comfort_away_temp": 18, + "boost_away_temp": 19, + CONF_USE_WINDOW_FEATURE: False, + CONF_USE_MOTION_FEATURE: True, + CONF_USE_POWER_FEATURE: False, + CONF_USE_PRESENCE_FEATURE: True, + CONF_HEATER: "switch.mock_switch", + CONF_PROP_FUNCTION: PROPORTIONAL_FUNCTION_TPI, + CONF_TPI_COEF_INT: 0.3, + CONF_TPI_COEF_EXT: 0.01, + CONF_MINIMAL_ACTIVATION_DELAY: 30, + CONF_SECURITY_DELAY_MIN: 5, + CONF_SECURITY_MIN_ON_PERCENT: 0.3, + CONF_MOTION_SENSOR: "binary_sensor.mock_motion_sensor", + CONF_MOTION_DELAY: 0, # important to not been obliged to wait + CONF_MOTION_PRESET: "boost", + CONF_NO_MOTION_PRESET: "comfort", + CONF_PRESENCE_SENSOR: "binary_sensor.mock_presence_sensor", + }, + ) + + entity: VersatileThermostat = await create_thermostat( + hass, entry, "climate.theoverswitchmockname" + ) + assert entity + + tz = get_tz(hass) # pylint: disable=invalid-name + now: datetime = datetime.now(tz=tz) + + # start heating, in boost mode. We block the control_heating to avoid running a cycle + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat._async_control_heating" + ): + await entity.async_set_hvac_mode(HVACMode.HEAT) + await entity.async_set_preset_mode(PRESET_ACTIVITY) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because no motion is detected yet + assert entity.target_temperature == 18 + assert entity.motion_state is None + assert entity.presence_state is None + + event_timestamp = now - timedelta(minutes=4) + await send_temperature_change_event(entity, 18, event_timestamp) + await send_ext_temperature_change_event(entity, 10, event_timestamp) + + await send_presence_change_event(entity, True, False, event_timestamp) + assert entity.presence_state is "on" + + # starts detecting motion + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" + ) as mock_send_event, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_on" + ) as mock_heater_on, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" + ) as mock_heater_off, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", + return_value=False, + ), patch( + "homeassistant.helpers.condition.state", return_value=True + ): + event_timestamp = now - timedelta(minutes=3) + await send_motion_change_event(entity, True, False, event_timestamp) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because motion is detected yet -> switch to Boost mode + assert entity.target_temperature == 19 + assert entity.motion_state is "on" + assert entity.presence_state is "on" + + assert mock_send_event.call_count == 0 + # Change is confirmed. Heater should be started + assert mock_heater_on.call_count == 1 + assert mock_heater_off.call_count == 0 + assert mock_send_event.call_count == 0 + + # stop detecting motion with confirmation of stop + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" + ) as mock_send_event, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_on" + ) as mock_heater_on, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" + ) as mock_heater_off, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", + return_value=True, + ), patch( + "homeassistant.helpers.condition.state", return_value=True + ): + event_timestamp = now - timedelta(minutes=2) + await send_motion_change_event(entity, False, True, event_timestamp) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because no motion is detected yet + assert entity.target_temperature == 18 + assert entity.motion_state is "off" + assert entity.presence_state is "on" + + assert mock_send_event.call_count == 0 + assert mock_heater_on.call_count == 0 + # Because heating is no more necessary + assert mock_heater_off.call_count == 1 + assert mock_send_event.call_count == 0 + + +async def test_movement_management_time_enoughand_not_presence( + hass: HomeAssistant, skip_hass_states_is_state +): + """Test the Presence management when time is not enough""" + + entry = MockConfigEntry( + domain=DOMAIN, + title="TheOverSwitchMockName", + unique_id="uniqueId", + data={ + CONF_NAME: "TheOverSwitchMockName", + CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH, + CONF_TEMP_SENSOR: "sensor.mock_temp_sensor", + CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor", + CONF_CYCLE_MIN: 5, + CONF_TEMP_MIN: 15, + CONF_TEMP_MAX: 30, + "eco_temp": 17, + "comfort_temp": 18, + "boost_temp": 19, + "eco_away_temp": 17.1, + "comfort_away_temp": 18.1, + "boost_away_temp": 19.1, + CONF_USE_WINDOW_FEATURE: False, + CONF_USE_MOTION_FEATURE: True, + CONF_USE_POWER_FEATURE: False, + CONF_USE_PRESENCE_FEATURE: True, + CONF_HEATER: "switch.mock_switch", + CONF_PROP_FUNCTION: PROPORTIONAL_FUNCTION_TPI, + CONF_TPI_COEF_INT: 0.3, + CONF_TPI_COEF_EXT: 0.01, + CONF_MINIMAL_ACTIVATION_DELAY: 30, + CONF_SECURITY_DELAY_MIN: 5, + CONF_SECURITY_MIN_ON_PERCENT: 0.3, + CONF_MOTION_SENSOR: "binary_sensor.mock_motion_sensor", + CONF_MOTION_DELAY: 0, # important to not been obliged to wait + CONF_MOTION_PRESET: "boost", + CONF_NO_MOTION_PRESET: "comfort", + CONF_PRESENCE_SENSOR: "binary_sensor.mock_presence_sensor", + }, + ) + + entity: VersatileThermostat = await create_thermostat( + hass, entry, "climate.theoverswitchmockname" + ) + assert entity + + tz = get_tz(hass) # pylint: disable=invalid-name + now: datetime = datetime.now(tz=tz) + + # start heating, in boost mode. We block the control_heating to avoid running a cycle + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat._async_control_heating" + ): + await entity.async_set_hvac_mode(HVACMode.HEAT) + await entity.async_set_preset_mode(PRESET_ACTIVITY) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because no motion is detected yet and presence is unknown + assert entity.target_temperature == 18 + assert entity.motion_state is None + assert entity.presence_state is None + + event_timestamp = now - timedelta(minutes=4) + await send_temperature_change_event(entity, 18, event_timestamp) + await send_ext_temperature_change_event(entity, 10, event_timestamp) + + await send_presence_change_event(entity, False, True, event_timestamp) + assert entity.presence_state is "off" + + # starts detecting motion + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" + ) as mock_send_event, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_on" + ) as mock_heater_on, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" + ) as mock_heater_off, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", + return_value=False, + ), patch( + "homeassistant.helpers.condition.state", return_value=True + ): + event_timestamp = now - timedelta(minutes=3) + await send_motion_change_event(entity, True, False, event_timestamp) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because motion is detected yet -> switch to Boost away mode + assert entity.target_temperature == 19.1 + assert entity.motion_state is "on" + assert entity.presence_state is "off" + + assert mock_send_event.call_count == 0 + # Change is confirmed. Heater should be started + assert mock_heater_on.call_count == 1 + assert mock_heater_off.call_count == 0 + assert mock_send_event.call_count == 0 + + # stop detecting motion with confirmation of stop + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" + ) as mock_send_event, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_on" + ) as mock_heater_on, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" + ) as mock_heater_off, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", + return_value=True, + ), patch( + "homeassistant.helpers.condition.state", return_value=True + ): + event_timestamp = now - timedelta(minutes=2) + await send_motion_change_event(entity, False, True, event_timestamp) + + assert entity.hvac_mode is HVACMode.HEAT + assert entity.preset_mode is PRESET_ACTIVITY + # because no motion is detected yet + assert entity.target_temperature == 18.1 + assert entity.motion_state is "off" + assert entity.presence_state is "off" + + assert mock_send_event.call_count == 0 + # 18.1 starts heating with a low on_percent + assert mock_heater_on.call_count == 1 + assert entity.proportional_algorithm.on_percent == 0.11 + assert mock_heater_off.call_count == 0 + assert mock_send_event.call_count == 0 diff --git a/custom_components/versatile_thermostat/tests/test_window.py b/custom_components/versatile_thermostat/tests/test_window.py index 577ff0f..cf60834 100644 --- a/custom_components/versatile_thermostat/tests/test_window.py +++ b/custom_components/versatile_thermostat/tests/test_window.py @@ -146,7 +146,25 @@ async def test_window_management_time_enough( assert entity.window_state is None - # Open the window, but condition of time is not satisfied and check the thermostat don't turns off + # change temperature to force turning on the heater + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" + ) as mock_send_event, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_on" + ) as mock_heater_on, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" + ) as mock_heater_off, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", + return_value=False, + ): + await send_temperature_change_event(entity, 15, datetime.now()) + + # Heater shoud turn-on + assert mock_heater_on.call_count >= 1 + assert mock_heater_off.call_count == 0 + assert mock_send_event.call_count == 0 + + # Open the window, condition of time is satisfied, check the thermostat and heater turns off with patch( "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" ) as mock_send_event, patch( @@ -156,10 +174,9 @@ async def test_window_management_time_enough( ) as mock_heater_off, patch( "homeassistant.helpers.condition.state", return_value=True ) as mock_condition, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", return_value=True, ): - await send_temperature_change_event(entity, 15, datetime.now()) await send_window_change_event(entity, True, False, datetime.now()) assert mock_send_event.call_count == 1 @@ -167,26 +184,41 @@ async def test_window_management_time_enough( [call.send_event(EventType.HVAC_MODE_EVENT, {"hvac_mode": HVACMode.OFF})] ) - # TODO should be == 1 - assert mock_heater_on.call_count >= 1 - # One call in turn_oiff and one call in the control_heating - assert mock_heater_off.call_count == 1 + # Heater should not be on + assert mock_heater_on.call_count == 0 + # One call in set_hvac_mode turn_off and one call in the control_heating for security + assert mock_heater_off.call_count == 2 assert mock_condition.call_count == 1 - + assert entity.hvac_mode is HVACMode.OFF assert entity.window_state == STATE_ON - # Close the window - try_window_condition = await send_window_change_event( - entity, False, True, datetime.now() + # Close the window + with patch( + "custom_components.versatile_thermostat.climate.VersatileThermostat.send_event" + ) as mock_send_event, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_on" + ) as mock_heater_on, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" + ) as mock_heater_off, patch( + "homeassistant.helpers.condition.state", return_value=True + ) as mock_condition, patch( + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", + return_value=False, + ): + try_function = await send_window_change_event( + entity, False, True, datetime.now(), sleep=False ) - # simulate the call to try_window_condition - await try_window_condition(None) + + await try_function(None) + + # Wait for initial delay of heater + await asyncio.sleep(0.3) + assert entity.window_state == STATE_OFF - assert mock_heater_on.call_count == 2 - assert mock_send_event.call_count == 2 + assert mock_heater_on.call_count == 1 + assert mock_send_event.call_count == 1 mock_send_event.assert_has_calls( [ - call.send_event(EventType.HVAC_MODE_EVENT, {"hvac_mode": HVACMode.OFF}), call.send_event( EventType.HVAC_MODE_EVENT, {"hvac_mode": HVACMode.HEAT} ), @@ -259,7 +291,7 @@ async def test_window_auto_fast(hass: HomeAssistant, skip_hass_states_is_state): ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", return_value=True, ): event_timestamp = now - timedelta(minutes=4) @@ -281,7 +313,7 @@ async def test_window_auto_fast(hass: HomeAssistant, skip_hass_states_is_state): ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", return_value=True, ): event_timestamp = now - timedelta(minutes=3) @@ -316,7 +348,7 @@ async def test_window_auto_fast(hass: HomeAssistant, skip_hass_states_is_state): ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", new_callable=PropertyMock, return_value=False, ): @@ -341,7 +373,7 @@ async def test_window_auto_fast(hass: HomeAssistant, skip_hass_states_is_state): ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", new_callable=PropertyMock, return_value=False, ): @@ -438,7 +470,7 @@ async def test_window_auto_auto_stop(hass: HomeAssistant, skip_hass_states_is_st ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", return_value=True, ): event_timestamp = now - timedelta(minutes=4) @@ -459,7 +491,7 @@ async def test_window_auto_auto_stop(hass: HomeAssistant, skip_hass_states_is_st ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", return_value=True, ): event_timestamp = now - timedelta(minutes=3) @@ -497,7 +529,7 @@ async def test_window_auto_auto_stop(hass: HomeAssistant, skip_hass_states_is_st ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", return_value=False, ): await asyncio.sleep(0.3) @@ -578,7 +610,7 @@ async def test_window_auto_no_on_percent( ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", return_value=True, ): event_timestamp = now - timedelta(minutes=4) @@ -600,7 +632,7 @@ async def test_window_auto_no_on_percent( ) as mock_heater_on, patch( "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off" ) as mock_heater_off, patch( - "custom_components.versatile_thermostat.climate.VersatileThermostat._is_device_active", + "custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active", return_value=True, ): event_timestamp = now - timedelta(minutes=3) diff --git a/custom_components/versatile_thermostat/underlyings.py b/custom_components/versatile_thermostat/underlyings.py index 378f7c2..210a9eb 100644 --- a/custom_components/versatile_thermostat/underlyings.py +++ b/custom_components/versatile_thermostat/underlyings.py @@ -173,13 +173,12 @@ class UnderlyingSwitch(UnderlyingEntity): """The initial delay for this class""" return self._initial_delay_sec - async def set_hvac_mode(self, hvac_mode: HVACMode): - """Set the HVACmode""" + async def set_hvac_mode(self, hvac_mode: HVACMode) -> bool: + """Set the HVACmode. Returns true if we need to redo a control_heating""" if hvac_mode == HVACMode.OFF: if self.is_device_active: await self.turn_off() - await self._thermostat._async_control_heating(force=True) - return + return True @property def is_device_active(self): diff --git a/images/config-linked-entity.png b/images/config-linked-entity.png index b61ae58c5ba1fc63afd2429ffcb6cf6107579a05..dfd5a302a42effdd129f96c1570e6f4b9a2eca66 100644 GIT binary patch literal 37476 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 diff --git a/images/multi-switch-activation.png b/images/multi-switch-activation.png new file mode 100644 index 0000000000000000000000000000000000000000..58ffbd9a568274f9fdd159c20fc4b1aafa501a4d GIT binary patch literal 22408 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

5Pz;5eI&Pl{T!Io*&EA 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