diff --git a/README-fr.md b/README-fr.md index cffe0e3..b0a55d6 100644 --- a/README-fr.md +++ b/README-fr.md @@ -35,6 +35,12 @@ Un grand merci à tous mes fournisseurs de bières pour leurs dons et leurs enco _AC_ : Air conditionné. Un équipement est AC si il fait du froid. Les températures sont alors inversées : Eco est plus chaud que Confort qui est plus chaud que Boost. Les algorithmes tiennent compte de cette information. + _EMA_ : Exponential Moving Average. Utilisé pour lisser les mesures de températures de capteur. Elle correspond à une moyenne glissante de la température de la pièce. Elle est utilisée pour calculer la pente de la courbe de température (slope) qui serait trop instable sur la courbe brute. + + _slope_ : la pente de la courbe de température. Elle est mesurée en °(C ou K)/h. Elle est positive si la température augmente et négative si elle diminue. Cette pente est calculée sur l'_EMA_ + + _PAC_ : Pompe à chaleur + # Documentation La documentation est maintenant découpée en plusieurs pages pour faciliter la lecture et la recherche d'informations : diff --git a/README.md b/README.md index 5c5b471..8c7930d 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,12 @@ A big thank you to all my beer sponsors for their donations and encouragements. _AC_: Air Conditioning. An AC device cools instead of heats. Temperatures are reversed: Eco is warmer than Comfort, which is warmer than Boost. The algorithms take this information into account. + _EMA_: Exponential Moving Average. Used to smooth sensor temperature measurements. It represents a moving average of the room's temperature and is used to calculate the slope of the temperature curve, which would be too unstable on the raw data. + + _slope_: The slope of the temperature curve, measured in ° (C or K)/h. It is positive when the temperature increases and negative when it decreases. This slope is calculated based on the _EMA_. + + _PAC_ : Heat pump + # Documentation The documentation is now divided into several pages for easier reading and searching: diff --git a/custom_components/versatile_thermostat/config_flow.py b/custom_components/versatile_thermostat/config_flow.py index 4cbbe0a..2ba7621 100644 --- a/custom_components/versatile_thermostat/config_flow.py +++ b/custom_components/versatile_thermostat/config_flow.py @@ -318,9 +318,8 @@ class VersatileThermostatBaseConfigFlow(FlowHandler): ): return False - if infos.get(CONF_UNDERLYING_LIST, None) is not None and not infos.get( - CONF_UNDERLYING_LIST, None - ): + # checks that at least one underlying is set but not it central configuration + if len(infos.get(CONF_UNDERLYING_LIST, [])) < 1: return False if ( @@ -901,10 +900,42 @@ class VersatileThermostatBaseConfigFlow(FlowHandler): return await self.generic_step("advanced", schema, user_input, next_step) async def async_step_finalize(self, _): - """Should be implemented by Leaf classes""" - raise HomeAssistantError( - "async_finalize not implemented on VersatileThermostat sub-class" - ) + """Finalize the creation. Should be overriden by underlyings""" + if not self._infos[CONF_USE_WINDOW_FEATURE]: + self._infos[CONF_USE_WINDOW_CENTRAL_CONFIG] = False + if CONF_WINDOW_SENSOR in self._infos: + del self._infos[CONF_WINDOW_SENSOR] + if CONF_WINDOW_AUTO_CLOSE_THRESHOLD in self._infos: + del self._infos[CONF_WINDOW_AUTO_CLOSE_THRESHOLD] + if CONF_WINDOW_AUTO_OPEN_THRESHOLD in self._infos: + del self._infos[CONF_WINDOW_AUTO_OPEN_THRESHOLD] + if CONF_WINDOW_AUTO_MAX_DURATION in self._infos: + del self._infos[CONF_WINDOW_AUTO_MAX_DURATION] + if not self._infos[CONF_USE_MOTION_FEATURE]: + self._infos[CONF_USE_MOTION_CENTRAL_CONFIG] = False + if CONF_MOTION_SENSOR in self._infos: + del self._infos[CONF_MOTION_SENSOR] + if not self._infos[CONF_USE_POWER_FEATURE]: + self._infos[CONF_USE_POWER_CENTRAL_CONFIG] = False + if CONF_POWER_SENSOR in self._infos: + del self._infos[CONF_POWER_SENSOR] + if CONF_MAX_POWER_SENSOR in self._infos: + del self._infos[CONF_MAX_POWER_SENSOR] + if not self._infos[CONF_USE_PRESENCE_FEATURE]: + self._infos[CONF_USE_PRESENCE_CENTRAL_CONFIG] = False + if CONF_PRESENCE_SENSOR in self._infos: + del self._infos[CONF_PRESENCE_SENSOR] + if not self._infos[CONF_USE_CENTRAL_BOILER_FEATURE]: + if CONF_CENTRAL_BOILER_ACTIVATION_SRV in self._infos: + del self._infos[CONF_CENTRAL_BOILER_ACTIVATION_SRV] + if CONF_CENTRAL_BOILER_DEACTIVATION_SRV in self._infos: + del self._infos[CONF_CENTRAL_BOILER_DEACTIVATION_SRV] + if not self._infos[CONF_USE_AUTO_START_STOP_FEATURE]: + self._infos[CONF_AUTO_START_STOP_LEVEL] = AUTO_START_STOP_LEVEL_NONE + + # Removes temporary value + if COMES_FROM in self._infos: + del self._infos[COMES_FROM] class VersatileThermostatConfigFlow( # pylint: disable=abstract-method @@ -928,9 +959,8 @@ class VersatileThermostatConfigFlow( # pylint: disable=abstract-method async def async_step_finalize(self, _): """Finalization of the ConfigEntry creation""" _LOGGER.debug("ConfigFlow.async_finalize") - # Removes temporary value - if COMES_FROM in self._infos: - del self._infos[COMES_FROM] + await super().async_step_finalize(_) + return self.async_create_entry(title=self._infos[CONF_NAME], data=self._infos) @@ -968,37 +998,13 @@ class VersatileThermostatOptionsFlowHandler( async def async_step_finalize(self, _): """Finalization of the ConfigEntry creation""" - if not self._infos[CONF_USE_WINDOW_FEATURE]: - self._infos[CONF_USE_WINDOW_CENTRAL_CONFIG] = False - self._infos[CONF_WINDOW_SENSOR] = None - self._infos[CONF_WINDOW_AUTO_CLOSE_THRESHOLD] = None - self._infos[CONF_WINDOW_AUTO_OPEN_THRESHOLD] = None - self._infos[CONF_WINDOW_AUTO_MAX_DURATION] = None - if not self._infos[CONF_USE_MOTION_FEATURE]: - self._infos[CONF_USE_MOTION_CENTRAL_CONFIG] = False - self._infos[CONF_MOTION_SENSOR] = None - if not self._infos[CONF_USE_POWER_FEATURE]: - self._infos[CONF_USE_POWER_CENTRAL_CONFIG] = False - self._infos[CONF_POWER_SENSOR] = None - self._infos[CONF_MAX_POWER_SENSOR] = None - if not self._infos[CONF_USE_PRESENCE_FEATURE]: - self._infos[CONF_USE_PRESENCE_CENTRAL_CONFIG] = False - self._infos[CONF_PRESENCE_SENSOR] = None - if not self._infos[CONF_USE_CENTRAL_BOILER_FEATURE]: - self._infos[CONF_CENTRAL_BOILER_ACTIVATION_SRV] = None - self._infos[CONF_CENTRAL_BOILER_DEACTIVATION_SRV] = None - if not self._infos[CONF_USE_AUTO_START_STOP_FEATURE]: - self._infos[CONF_AUTO_START_STOP_LEVEL] = AUTO_START_STOP_LEVEL_NONE _LOGGER.info( "Recreating entry %s due to configuration change. New config is now: %s", self.config_entry.entry_id, self._infos, ) - - # Removes temporary value - if COMES_FROM in self._infos: - del self._infos[COMES_FROM] + await super().async_step_finalize(_) self.hass.config_entries.async_update_entry(self.config_entry, data=self._infos) return self.async_create_entry(title=None, data=None) diff --git a/documentation/en/images/card-trv-jeffodilo.png b/documentation/en/images/card-trv-jeffodilo.png new file mode 100644 index 0000000..4411cfb Binary files /dev/null and b/documentation/en/images/card-trv-jeffodilo.png differ diff --git a/documentation/en/presentation.md b/documentation/en/presentation.md index 421bd88..901b754 100644 --- a/documentation/en/presentation.md +++ b/documentation/en/presentation.md @@ -40,4 +40,5 @@ Some TRV type thermostats are known to be incompatible with Versatile Thermostat 5. TRVs like Aqara SRTS-A01 and MOES TV01-ZB, which lack the `hvac_action` state feedback to determine whether they are heating or not. Therefore, state feedback is inaccurate, but the rest seems functional. 6. Airwell air conditioners with the "Midea AC LAN" integration. If two VTherm commands are too close together, the air conditioner stops itself. 7. Climates based on the Overkiz integration do not work. It seems impossible to turn off or even change the temperature on these systems. +8. Heating systems based on Netatmo perform poorly. Netatmo schedules conflict with _VTherm_ programming. Netatmo devices constantly revert to `Auto` mode, which is poorly managed with _VTherm_. In this mode, _VTherm_ cannot determine whether the system is heating or cooling, making it impossible to select the correct algorithm. Some users have managed to make it work using a virtual switch between _VTherm_ and the underlying system, but stability is not guaranteed. An example is provided in the [troubleshooting](troubleshooting.md) section. diff --git a/documentation/en/troubleshooting.md b/documentation/en/troubleshooting.md index d96e75e..85b75f4 100644 --- a/documentation/en/troubleshooting.md +++ b/documentation/en/troubleshooting.md @@ -4,6 +4,7 @@ - [Troubleshooting](#troubleshooting) - [Using a Heatzy](#using-a-heatzy) - [Using a radiator with a pilot wire (Nodon SIN-4-FP-21)](#using-a-radiator-with-a-pilot-wire-nodon-sin-4-fp-21) + - [Using a Netatmo System](#using-a-netatmo-system) - [Only the first radiator heats](#only-the-first-radiator-heats) - [The radiator heats even though the setpoint temperature is exceeded, or it does not heat when the room temperature is well below the setpoint](#the-radiator-heats-even-though-the-setpoint-temperature-is-exceeded-or-it-does-not-heat-when-the-room-temperature-is-well-below-the-setpoint) - [Type `over_switch` or `over_valve`](#type-over_switch-or-over_valve) @@ -16,6 +17,7 @@ - [Using a Group of People as a Presence Sensor](#using-a-group-of-people-as-a-presence-sensor) - [Enable Logs for the Versatile Thermostat](#enable-logs-for-the-versatile-thermostat) - [VTherm does not track setpoint changes made directly on the underlying device (`over_climate`)](#vtherm-does-not-track-setpoint-changes-made-directly-on-the-underlying-device-over_climate) + - [VTherm Automatically Switches to 'Cooling' or 'Heating' Mode](#vtherm-automatically-switches-to-cooling-or-heating-mode) ## Using a Heatzy @@ -85,6 +87,17 @@ Example: Another more complex example is [here](https://github.com/jmcollin78/versatile_thermostat/discussions/431#discussioncomment-11393065) +## Using a Netatmo System + +The system based on Netatmo TRVs does not work well with _VTherm_. You can find a discussion about the specific behavior of Netatmo systems (in French) here: [https://forum.hacf.fr/t/vannes-netatmo-et-vtherm/56063](https://forum.hacf.fr/t/vannes-netatmo-et-vtherm/56063). + +However, some users have successfully integrated _VTherm_ with Netatmo by incorporating a virtual switch between _VTherm_ and the Netatmo `climate` entity, as follows: + +``` +TODO +``` + + ## Only the first radiator heats In `over_switch` mode, if multiple radiators are configured for the same VTherm, the heating will be triggered sequentially to smooth out the consumption peaks as much as possible. @@ -213,4 +226,10 @@ Be careful, in debug mode, Versatile Thermostat is very verbose and can quickly ## VTherm does not track setpoint changes made directly on the underlying device (`over_climate`) -See the details of this feature [here](over-climate.md#track-underlying-temperature-changes). \ No newline at end of file +See the details of this feature [here](over-climate.md#track-underlying-temperature-changes). + +## VTherm Automatically Switches to 'Cooling' or 'Heating' Mode + +Some reversible heat pumps have modes that allow the heat pump to decide whether to heat or cool. These modes are labeled as 'Auto' or 'Heat_cool' depending on the brand. These two modes should not be used with _VTherm_ because _VTherm_'s algorithms require explicit knowledge of whether the system is in heating or cooling mode, which these modes do not provide. + +You should only use the following modes: `Heat`, `Cool`, `Off`, or optionally `Fan` (although `Fan` has no practical purpose with _VTherm_). \ No newline at end of file diff --git a/documentation/fr/additions.md b/documentation/fr/additions.md index 71b4c61..f132471 100644 --- a/documentation/fr/additions.md +++ b/documentation/fr/additions.md @@ -5,6 +5,7 @@ - [Composant Scheduler !](#composant-scheduler-) - [Courbes de régulattion avec Plotly](#courbes-de-régulattion-avec-plotly) - [Les notification avec l'AappDaemon NOTIFIER](#les-notification-avec-laappdaemon-notifier) + - [Une très belle carte (merci @Jeffodilo)](#une-très-belle-carte-merci-jeffodilo) ## Versatile Thermostat UI Card @@ -213,4 +214,275 @@ action: mode: queued max: 30 ``` + + +## Une très belle carte (merci @Jeffodilo) + +@Jeffodilo a réalisé et partagé le code d'une très belle carte adaptée au TRV : + +![carte Jeffodilo](images/card-trv-jeffodilo.png) + +Cette carte n’utilise pas card_mod, elle utilise les cartes custom assez courante suivantes +On garde une partie de l’interface UI, sauf pour l’horizontale de la 2ème ligne +- custom:vertical-stack-in-card +- custom:stack-in-card +- custom:mini-graph-card +- custom:mushroom-template-card +- custom:button-card + +L'original est ici (En Français): [forum HACF](https://forum.hacf.fr/t/carte-mise-en-forme-vanne-avec-thermostant-versatile/56132) + +Evidemment, vous devez l'adapter à votre code. + +Le code: + +
+ +```yaml +type: vertical-stack +cards: + - type: heading + icon: mdi:bed-double + heading: Parents + heading_style: title + - type: custom:vertical-stack-in-card + cards: + - type: custom:mini-graph-card + entities: + - entity: sensor.sonde_parents_temperature + name: Température + state_adaptive_color: true + - entity: climate.valve_parents + name: Temp + attribute: current_temperature + unit: °C + state_adaptive_color: true + show_graph: false + show_state: true + hour24: true + hours_to_show: 24 + points_per_hour: 2 + font_size: 50 + show: + name: false + icon: false + legend: false + labels: true + extrema: false + color_thresholds: + - color: "#33ccff" + value: 19 + - color: "#00ffff" + value: 19.5 + - color: "#33ffcc" + value: 20 + - color: "#00ff99" + value: 20.5 + - color: "#ffff99" + value: 21 + - color: "#ffff33" + value: 21.5 + - color: "#ff9933" + value: 22 + - color: "#cc6633" + value: 24 + - color: "#ff6000" + value: 26 + - type: custom:stack-in-card + mode: horizontal + cards: + - type: custom:mushroom-template-card + secondary: "" + layout: horizontal + tap_action: + action: more-info + entity: sensor.sonde_parents_temperature + fill_container: false + multiline_secondary: false + primary: >- + {% if is_state_attr('climate.versatile_parents','hvac_action', + 'idle') %} + 🗜️ {{ states('number.valve_parents_valve_opening_degree', with_unit=True,)}} |🔋{{ states('sensor.valve_parents_battery') }} % | Inactif + {% elif is_state_attr('climate.versatile_parents','hvac_action', + 'heating') %} + 🗜️ {{ states('number.valve_parents_valve_opening_degree', with_unit=True,)}} |🔋{{ states('sensor.valve_parents_battery') }} % | Chauffe + {% else %} 🗜️ {{ + states('number.valve_parents_valve_opening_degree', + with_unit=True,)}} | 🔋{{ states('sensor.valve_parents_battery') + }} % | Off {% endif %} + icon: "" + - type: horizontal-stack + cards: + - type: custom:button-card + name: Conf. + entity: climate.versatile_parents + show_state: false + show_icon: true + show_name: false + icon: mdi:fire + size: 80% + styles: + icon: + - color: | + [[[ + if (states['climate.versatile_parents']) { + if (states['climate.versatile_parents'].attributes.preset_mode == 'comfort') + return 'darkorange'; + else + return 'white'; } + ]]] + name: + - color: white + - font-size: 60% + card: + - height: 40px + - width: 30px + tap_action: + action: perform-action + perform_action: climate.set_preset_mode + target: + entity_id: + - climate.versatile_parents + data: + preset_mode: comfort + - type: custom:button-card + name: Eco + entity: climate.versatile_parents + show_state: false + show_icon: true + show_name: false + icon: mdi:leaf + size: 80% + styles: + icon: + - color: | + [[[ + if (states['climate.versatile_parents']) { + if (states['climate.versatile_parents'].attributes.preset_mode == 'eco') + return 'lightgreen'; + else + return 'white'; } + ]]] + name: + - color: white + - font-size: 60% + card: + - height: 40px + - width: 30px + tap_action: + action: perform-action + perform_action: climate.set_preset_mode + target: + entity_id: + - climate.versatile_parents + data: + preset_mode: eco + - type: custom:button-card + name: Manu + entity: climate.versatile_parents + show_state: false + show_icon: true + show_name: false + icon: mdi:hand-back-left + size: 80% + styles: + icon: + - color: | + [[[ + if (states['climate.versatile_parents']) { + if (states['climate.versatile_parents'].attributes.preset_mode == 'none') + return 'indianred'; + else + return 'white'; } + ]]] + name: + - color: white + - font-size: 60% + card: + - height: 40px + - width: 30px + tap_action: + action: perform-action + perform_action: climate.set_preset_mode + target: + entity_id: + - climate.versatile_parents + data: + preset_mode: none + - type: custom:button-card + name: Abs. + entity: climate.versatile_parents + show_state: false + show_icon: true + show_name: false + icon: mdi:snowflake + size: 80% + styles: + icon: + - color: | + [[[ + if (states['climate.versatile_parents']) { + if (states['climate.versatile_parents'].attributes.preset_mode == 'frost') + return 'skyblue'; + else + return 'white'; } + ]]] + name: + - color: white + - font-size: 60% + card: + - height: 40px + - width: 30px + tap_action: + action: perform-action + perform_action: climate.set_preset_mode + target: + entity_id: + - climate.versatile_parents + data: + preset_mode: frost + - type: custom:button-card + name: Boost + entity: climate.versatile_parents + show_state: false + show_icon: true + show_name: false + icon: mdi:rocket-launch + size: 80% + styles: + icon: + - color: | + [[[ + if (states['climate.versatile_parents']) { + if (states['climate.versatile_parents'].attributes.preset_mode == 'boost') + return 'red'; + else + return 'white'; } + ]]] + name: + - color: white + - font-size: 60% + card: + - height: 40px + - width: 30px + tap_action: + action: perform-action + perform_action: climate.set_preset_mode + target: + entity_id: + - climate.versatile_parents + data: + preset_mode: boost + - type: custom:mushroom-climate-card + entity: climate.versatile_parents + show_temperature_control: true + hvac_modes: [] + tap_action: + action: more-info + primary_info: state + icon: mdi:radiator + secondary_info: last-updated + fill_container: false + layout: horizontal +```
\ No newline at end of file diff --git a/documentation/fr/images/card-trv-jeffodilo.png b/documentation/fr/images/card-trv-jeffodilo.png new file mode 100644 index 0000000..4411cfb Binary files /dev/null and b/documentation/fr/images/card-trv-jeffodilo.png differ diff --git a/documentation/fr/presentation.md b/documentation/fr/presentation.md index f07811c..3934da9 100644 --- a/documentation/fr/presentation.md +++ b/documentation/fr/presentation.md @@ -33,11 +33,12 @@ Toutes ces fonctions sont configurables de façon centralisée ou individuelle e ## Incompatibilités Certains thermostat de type TRV sont réputés incompatibles avec le Versatile Thermostat. C'est le cas des vannes suivantes : -1. les vannes POPP de Danfoss avec retour de température. Il est impossible d'éteindre cette vanne et elle s'auto-régule d'elle-même causant des conflits avec le VTherm, +1. les vannes POPP de Danfoss avec retour de température. Il est impossible d'éteindre cette vanne et elle s'auto-régule d'elle-même causant des conflits avec le _VTherm_, 2. Les thermostats « Homematic » (et éventuellement Homematic IP) sont connus pour rencontrer des problèmes avec le Versatile Thermostat en raison des limitations du protocole RF sous-jacent. Ce problème se produit particulièrement lorsque vous essayez de contrôler plusieurs thermostats Homematic à la fois dans une seule instance de VTherm. Afin de réduire la charge du cycle de service, vous pouvez par ex. regroupez les thermostats avec des procédures spécifiques à Homematic (par exemple en utilisant un thermostat mural) et laissez Versatile Thermostat contrôler uniquement le thermostat mural directement. Une autre option consiste à contrôler un seul thermostat et à propager les changements de mode CVC et de température par un automatisme, 3. les thermostats de type Heatzy qui ne supportent pas les commandes de type set_temperature 4. les thermostats de type Rointe ont tendance a se réveiller tout seul. Le reste fonctionne normalement. 5. les TRV de type Aqara SRTS-A01 et MOES TV01-ZB qui n'ont pas le retour d'état `hvac_action` permettant de savoir si elle chauffe ou pas. Donc les retours d'état sont faussés, le reste à l'air fonctionnel. 6. La clim Airwell avec l'intégration "Midea AC LAN". Si 2 commandes de VTherm sont trop rapprochées, la clim s'arrête d'elle même. 7. Les climates basés sur l'intégration Overkiz ne fonctionnent pas. Il parait impossible d'éteindre ni même de changer la température sur ces systèmes. +8. Les systèmes de chauffage basés sur Netatmo fonctionnent mal. Les plannings Netatmo viennent en concurrence de la programmation _VTherm_. Les sous-jacents Netatmo repasse en mode `Auto` tout le temps et ce mode est très mal géré avec _VTherm_ qui ne peut pas savoir si le sysème chauffe ou refroidit et donc quel algorithme choisir. Certains ont quand même réussi à le faire fonctionner avec un switch virtuel entre le _VTherm_ et le sous-jacent mais sans garantie de stabilité. Un exemple est donné dans la section [dépannage](troubleshooting.md) diff --git a/documentation/fr/troubleshooting.md b/documentation/fr/troubleshooting.md index 8eea2f7..9c5676a 100644 --- a/documentation/fr/troubleshooting.md +++ b/documentation/fr/troubleshooting.md @@ -4,6 +4,7 @@ - [Dépannages](#dépannages) - [Utilisation d'un Heatzy](#utilisation-dun-heatzy) - [Utilisation d'un radiateur avec un fil pilote (Nodon SIN-4-FP-21)](#utilisation-dun-radiateur-avec-un-fil-pilote-nodon-sin-4-fp-21) + - [Utilisation d'un système Netatmo](#utilisation-dun-système-netatmo) - [Seul le premier radiateur chauffe](#seul-le-premier-radiateur-chauffe) - [Le radiateur chauffe alors que la température de consigne est dépassée ou ne chauffe pas alors que la température de la pièce est bien en-dessous de la consigne](#le-radiateur-chauffe-alors-que-la-température-de-consigne-est-dépassée-ou-ne-chauffe-pas-alors-que-la-température-de-la-pièce-est-bien-en-dessous-de-la-consigne) - [Type `over_switch` ou `over_valve`](#type-over_switch-ou-over_valve) @@ -84,6 +85,15 @@ Exemple : ``` Un exemple plus complet est [ici](https://github.com/jmcollin78/versatile_thermostat/discussions/431#discussioncomment-11393065) +## Utilisation d'un système Netatmo +Le système à base de TRV Netatmo fonctionne mal avec _VTherm_. Vous avez ici une discussion sur le fonctionnement particulier des systèmes Netatmo (en Français) : https://forum.hacf.fr/t/vannes-netatmo-et-vtherm/56063 +Cependant certains ont réussi une intégration _VTerm_ Netatmo en intégrant un switch virtuel entre _VTherm_ et le `climate` Netatmo suivant : +``` +TODO add virtual switch code +``` + + + ## Seul le premier radiateur chauffe En mode `over_switch` si plusieurs radiateurs sont configurés pour un même VTherm, l'alllumage va se faire de façon séquentiel pour lisser au plus possible les pics de consommation. @@ -210,4 +220,9 @@ Attention, en mode debug Versatile Thermostat est très verbeux et peut vite ral ## VTherm ne suit pas les changements de consigne faits directement depuis le sous-jacents (`over_climate`) -Voir le détail de cette fonction [ici](over-climate.md#suivre-les-changements-de-température-du-sous-jacent). \ No newline at end of file +Voir le détail de cette fonction [ici](over-climate.md#suivre-les-changements-de-température-du-sous-jacent). + +## VTherm passe tout seul en mode 'clim' ou en mode 'chauffage' + +Certaine _PAC_ réversibles ont des modes qui permettent de laisser le choix à la _PAC_ de chauffer ou de réfroidir. Ces modes sont 'Auto' or 'Heat_cool' selon les marques. Ces 2 modes ne doivent pas être utilisés avec _VTherm_ car les algorithmes de _VTherm_ ont besoin de savoir si ils sont en mode chauffe ou refroidissement ce que ne permettent pas ces modes. +Vous devez donc utiliser uniquement les modes : `Heat`, `Cool`, `Off` ou `Fan` éventuellement (bien que fan n'a aucun sens avec _Vtherm) diff --git a/tests/test_config_flow.py b/tests/test_config_flow.py index 7e1f4d7..780ed1f 100644 --- a/tests/test_config_flow.py +++ b/tests/test_config_flow.py @@ -287,6 +287,7 @@ async def test_user_config_flow_over_switch( CONF_USE_POWER_FEATURE: True, CONF_USE_PRESENCE_FEATURE: True, CONF_USE_CENTRAL_BOILER_FEATURE: False, + CONF_AUTO_START_STOP_LEVEL: AUTO_START_STOP_LEVEL_NONE, } ) assert result["result"] @@ -492,9 +493,7 @@ async def test_user_config_flow_over_climate( ) assert result["type"] == FlowResultType.CREATE_ENTRY assert result.get("errors") is None - assert result[ - "data" - ] == MOCK_TH_OVER_CLIMATE_USER_CONFIG | MOCK_TH_OVER_CLIMATE_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_CENTRAL_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_TYPE_CONFIG | { + assert result["data"] == MOCK_TH_OVER_CLIMATE_USER_CONFIG | MOCK_TH_OVER_CLIMATE_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_CENTRAL_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_TYPE_CONFIG | { CONF_MINIMAL_ACTIVATION_DELAY: 10, CONF_SAFETY_DELAY_MIN: 5, CONF_SAFETY_MIN_ON_PERCENT: 0.4, @@ -517,6 +516,7 @@ async def test_user_config_flow_over_climate( CONF_USED_BY_CENTRAL_BOILER: False, CONF_USE_CENTRAL_MODE: False, CONF_AUTO_REGULATION_MODE: CONF_AUTO_REGULATION_STRONG, + CONF_AUTO_START_STOP_LEVEL: AUTO_START_STOP_LEVEL_NONE, } assert result["result"] assert result["result"].domain == DOMAIN @@ -1378,6 +1378,7 @@ async def test_user_config_flow_over_switch_bug_552_tpi( CONF_USE_POWER_FEATURE: False, CONF_USE_PRESENCE_FEATURE: False, CONF_USE_CENTRAL_BOILER_FEATURE: False, + CONF_AUTO_START_STOP_LEVEL: AUTO_START_STOP_LEVEL_NONE, } ) assert result["result"] @@ -1681,9 +1682,7 @@ async def test_user_config_flow_over_climate_valve( ) assert result["type"] == FlowResultType.CREATE_ENTRY assert result.get("errors") is None - assert result[ - "data" - ] == MOCK_TH_OVER_CLIMATE_USER_CONFIG | MOCK_TH_OVER_CLIMATE_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_CENTRAL_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_TYPE_CONFIG | { + assert result["data"] == MOCK_TH_OVER_CLIMATE_USER_CONFIG | MOCK_TH_OVER_CLIMATE_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_CENTRAL_MAIN_CONFIG | MOCK_TH_OVER_CLIMATE_TYPE_CONFIG | { CONF_MINIMAL_ACTIVATION_DELAY: 10, CONF_SAFETY_DELAY_MIN: 5, CONF_SAFETY_MIN_ON_PERCENT: 0.4, @@ -1717,6 +1716,7 @@ async def test_user_config_flow_over_climate_valve( CONF_TPI_COEF_INT: 0.3, CONF_TPI_COEF_EXT: 0.1, CONF_MIN_OPENING_DEGREES: "10, 20,0", + CONF_AUTO_START_STOP_LEVEL: AUTO_START_STOP_LEVEL_NONE, } assert result["result"] assert result["result"].domain == DOMAIN