Compare commits
5 Commits
3.5.4alpha
...
3.6.0.beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75744675a7 | ||
|
|
7e4e407732 | ||
|
|
81900ceeea | ||
|
|
66297c6044 | ||
|
|
f384225b0f |
93
README-fr.md
93
README-fr.md
@@ -26,6 +26,7 @@
|
|||||||
- [Configurer la gestion de la puissance](#configurer-la-gestion-de-la-puissance)
|
- [Configurer la gestion de la puissance](#configurer-la-gestion-de-la-puissance)
|
||||||
- [Configurer la présence ou l'occupation](#configurer-la-présence-ou-loccupation)
|
- [Configurer la présence ou l'occupation](#configurer-la-présence-ou-loccupation)
|
||||||
- [Configuration avancée](#configuration-avancée)
|
- [Configuration avancée](#configuration-avancée)
|
||||||
|
- [Synthèse des paramètres](#synthèse-des-paramètres)
|
||||||
- [Exemples de réglage](#exemples-de-réglage)
|
- [Exemples de réglage](#exemples-de-réglage)
|
||||||
- [Chauffage électrique](#chauffage-électrique)
|
- [Chauffage électrique](#chauffage-électrique)
|
||||||
- [Chauffage central (chauffage gaz ou fuel)](#chauffage-central-chauffage-gaz-ou-fuel)
|
- [Chauffage central (chauffage gaz ou fuel)](#chauffage-central-chauffage-gaz-ou-fuel)
|
||||||
@@ -54,6 +55,7 @@ Ce composant personnalisé pour Home Assistant est une mise à niveau et est une
|
|||||||
|
|
||||||
|
|
||||||
>  _*Nouveautés*_
|
>  _*Nouveautés*_
|
||||||
|
> * **Release 3.6**: Ajout du paramètre `motion_off_delay` pour la gestion de l'activité.
|
||||||
> * **Release 3.5**: Plusieurs thermostats sont possibles en "thermostat over climate" mode [#113](https://github.com/jmcollin78/versatile_thermostat/issues/113)
|
> * **Release 3.5**: Plusieurs thermostats sont possibles en "thermostat over climate" mode [#113](https://github.com/jmcollin78/versatile_thermostat/issues/113)
|
||||||
> * **Release 3.4**: bug fix et exposition des preset temperatures pour le mode AC [#103](https://github.com/jmcollin78/versatile_thermostat/issues/103)
|
> * **Release 3.4**: bug fix et exposition des preset temperatures pour le mode AC [#103](https://github.com/jmcollin78/versatile_thermostat/issues/103)
|
||||||
> * **Release 3.3**: ajout du mode Air Conditionné (AC). Cette fonction vous permet d'utiliser le mode AC de votre thermostat sous-jacent. Pour l'utiliser, vous devez cocher l'option "Uitliser le mode AC" et définir les valeurs de température pour les presets et pour les presets en cas d'absence
|
> * **Release 3.3**: ajout du mode Air Conditionné (AC). Cette fonction vous permet d'utiliser le mode AC de votre thermostat sous-jacent. Pour l'utiliser, vous devez cocher l'option "Uitliser le mode AC" et définir les valeurs de température pour les presets et pour les presets en cas d'absence
|
||||||
@@ -65,7 +67,7 @@ Ce composant personnalisé pour Home Assistant est une mise à niveau et est une
|
|||||||
> * **release majeure 2.0** : ajout du thermostat "over climate" permettant de transformer n'importe quel thermostat en Versatile Thermostat et lui ajouter toutes les fonctions de ce dernier.
|
> * **release majeure 2.0** : ajout du thermostat "over climate" permettant de transformer n'importe quel thermostat en Versatile Thermostat et lui ajouter toutes les fonctions de ce dernier.
|
||||||
|
|
||||||
# Merci pour la bière [buymecoffee](https://www.buymeacoffee.com/jmcollin78)
|
# Merci pour la bière [buymecoffee](https://www.buymeacoffee.com/jmcollin78)
|
||||||
Un grand merci à @salabur, @pvince83 and @bergoglio pour les bières. Ca fait très plaisir.
|
Un grand merci à @salabur, @pvince83, @bergoglio, @EPicLURcher, @Kriss1670, @maia pour les bières. Ca fait très plaisir.
|
||||||
|
|
||||||
|
|
||||||
# Quand l'utiliser et ne pas l'utiliser
|
# Quand l'utiliser et ne pas l'utiliser
|
||||||
@@ -75,9 +77,7 @@ Ce thermostat peut piloter 2 types d'équipement:
|
|||||||
b. une sonde de température pour la pièce (ou un input_number),
|
b. une sonde de température pour la pièce (ou un input_number),
|
||||||
c. un capteur de température externe (pensez à l'intégration météo si vous n'en avez pas)
|
c. un capteur de température externe (pensez à l'intégration météo si vous n'en avez pas)
|
||||||
2. un autre thermostat qui a ses propres modes de fonctionnement (nommé ```thermostat_over_climate```). Pour ce type de thermostat la configuration minimale nécessite :
|
2. un autre thermostat qui a ses propres modes de fonctionnement (nommé ```thermostat_over_climate```). Pour ce type de thermostat la configuration minimale nécessite :
|
||||||
a. un équipement comme une climatisation qui est pilotée par sa propre entity de type ```climate```,
|
a. un équipement - comme une climatisation une valve thermostatique - qui est pilotée par sa propre entity de type ```climate```,
|
||||||
b. une sonde de température pour la pièce (ou un input_number),
|
|
||||||
c. un capteur de température externe (pensez à l'intégration météo si vous n'en avez pas)
|
|
||||||
|
|
||||||
Le type ```thermostat_over_climate``` permet d'ajouter à votre équipement existant toutes les fonctionnalités fournies par VersatileThermostat. L'entité climate VersatileThermostat pilotera votre entité climate, en la coupant si les fenêtres sont ouvertes, la passant en mode Eco si personne n'est présent, etc. Cf. [ici](#pourquoi-une-nouvelle-implémentation-du-thermostat). Pour ce type de thermostat, les cycles éventuels de chauffe sont pilotés par l'entité climate sous-jacente et pas par le Versatile Thermostat lui-même.
|
Le type ```thermostat_over_climate``` permet d'ajouter à votre équipement existant toutes les fonctionnalités fournies par VersatileThermostat. L'entité climate VersatileThermostat pilotera votre entité climate, en la coupant si les fenêtres sont ouvertes, la passant en mode Eco si personne n'est présent, etc. Cf. [ici](#pourquoi-une-nouvelle-implémentation-du-thermostat). Pour ce type de thermostat, les cycles éventuels de chauffe sont pilotés par l'entité climate sous-jacente et pas par le Versatile Thermostat lui-même.
|
||||||
|
|
||||||
@@ -243,17 +243,20 @@ Si vous avez choisi la fonctionnalité ```Avec détection de mouvement```, cliqu
|
|||||||
Nous allons maintenant voir comment configurer le nouveau mode Activité.
|
Nous allons maintenant voir comment configurer le nouveau mode Activité.
|
||||||
Ce dont nous avons besoin:
|
Ce dont nous avons besoin:
|
||||||
- un **capteur de mouvement**. ID d'entité d'un capteur de mouvement. Les états du capteur de mouvement doivent être « on » (mouvement détecté) ou « off » (aucun mouvement détecté)
|
- un **capteur de mouvement**. ID d'entité d'un capteur de mouvement. Les états du capteur de mouvement doivent être « on » (mouvement détecté) ou « off » (aucun mouvement détecté)
|
||||||
- une durée de **délai de mouvement** (en secondes) définissant combien de temps nous attendons la confirmation du mouvement avant de considérer le mouvement
|
- une durée de **délai de mouvement** (en secondes) définissant combien de temps nous attendons la confirmation du mouvement avant de considérer le mouvement. Ce paramètre peut être supérieur à la temporision de votre détecteur de mouvement, sinon la détection se fera à chaque mouvement signalé par le détecteur,
|
||||||
|
- une durée de fin **délai de mouvement** (en secondes) définissant combien de temps nous attendons la confirmation d'une fin de mouvement avant de ne plus considérer le mouvement.
|
||||||
- un **préréglage de "mouvement" **. Nous utiliserons la température de ce préréglage lorsqu'une activité sera détectée.
|
- un **préréglage de "mouvement" **. Nous utiliserons la température de ce préréglage lorsqu'une activité sera détectée.
|
||||||
- un **préréglage "pas de mouvement"**. Nous utiliserons la température de ce deuxième préréglage lorsqu'aucune activité n'est détectée.
|
- un **préréglage "pas de mouvement"**. Nous utiliserons la température de ce deuxième préréglage lorsqu'aucune activité n'est détectée.
|
||||||
|
|
||||||
Alors imaginons que nous voulions avoir le comportement suivant :
|
Alors imaginons que nous voulions avoir le comportement suivant :
|
||||||
- nous avons une pièce avec un thermostat réglé en mode activité, le mode "mouvement" choisi est confort (21.5C), le mode "pas de mouvement" choisi est Eco (18.5C) et la temporisation du mouvement est de 5 min.
|
- nous avons une pièce avec un thermostat réglé en mode activité, le mode "mouvement" choisi est confort (21,5°C), le mode "pas de mouvement" choisi est Eco (18.5°C) et la temporisation du mouvement est de 30 sec lors de la détection et de 5 minutes sur fin de détection.
|
||||||
- la pièce est vide depuis un moment (aucune activité détectée), la température de cette pièce est de 18,5 C
|
- la pièce est vide depuis un moment (aucune activité détectée), la température de cette pièce est de 18,5°
|
||||||
- quelqu'un entre dans la pièce, une activité est détectée la température est fixée à 21,5 C
|
- quelqu'un entre dans la pièce, une activité est détectée si le mouvement est présent pendant au moins 30 sec. La température passe alors à 21,5°
|
||||||
- la personne quitte la chambre, au bout de 5 min la température est ramenée à 18,5 C
|
- si le mouvement est présent pendant moins de 30 sec (passage rapide), la température reste sur 18,5°,
|
||||||
|
- imaginons que la température soit passée sur 21,5°, lorsque la personne quitte la pièce, au bout de 5 min la température est ramenée à 18,5°.
|
||||||
|
- si la personne revient avant les 5 minutes, la température reste sur 21,5°
|
||||||
|
|
||||||
Pour que cela fonctionne, le thermostat climatique doit être en mode préréglé « Activité ».
|
Pour que cela fonctionne, le thermostat doit être en mode préréglé « Activité ».
|
||||||
|
|
||||||
>  _*Notes*_
|
>  _*Notes*_
|
||||||
1. Sachez que comme pour les autres modes prédéfinis, ``Activity`` ne sera proposé que s'il est correctement configuré. En d'autres termes, les 4 clés de configuration doivent être définies si vous souhaitez voir l'activité dans l'interface de l'assistant domestique
|
1. Sachez que comme pour les autres modes prédéfinis, ``Activity`` ne sera proposé que s'il est correctement configuré. En d'autres termes, les 4 clés de configuration doivent être définies si vous souhaitez voir l'activité dans l'interface de l'assistant domestique
|
||||||
@@ -315,6 +318,65 @@ Voir [exemple de réglages](#examples-tuning) pour avoir des exemples de réglag
|
|||||||
5. Pour un usage naturel, le ``security_default_on_percent`` doit être inférieur à ``security_min_on_percent``,
|
5. Pour un usage naturel, le ``security_default_on_percent`` doit être inférieur à ``security_min_on_percent``,
|
||||||
6. Lorsqu'un thermostat de type ``thermostat_over_climate`` passe en mode ``security`` il est éteint. Les paramètres ``security_min_on_percent`` et ``security_default_on_percent`` ne sont alors pas utilisés.
|
6. Lorsqu'un thermostat de type ``thermostat_over_climate`` passe en mode ``security`` il est éteint. Les paramètres ``security_min_on_percent`` et ``security_default_on_percent`` ne sont alors pas utilisés.
|
||||||
|
|
||||||
|
## Synthèse des paramètres
|
||||||
|
|
||||||
|
| Paramètre | Libellé | "over switch" | "over climate" |
|
||||||
|
| ----------| --------| --- | ---|
|
||||||
|
| ``name`` | Nom | X | X |
|
||||||
|
| ``thermostat_type`` | Type de thermostat | X | X |
|
||||||
|
| ``temperature_sensor_entity_id`` | Temperature sensor entity id | X | - |
|
||||||
|
| ``external_temperature_sensor_entity_id`` | Température exterieure sensor entity id | X | - |
|
||||||
|
| ``cycle_min`` | Durée du cycle (minutes) | X | X |
|
||||||
|
| ``temp_min`` | Température minimale permise | X | X |
|
||||||
|
| ``temp_max`` | Température maximale permise | X | X |
|
||||||
|
| ``device_power`` | Puissance de l'équipement | X | X |
|
||||||
|
| ``use_window_feature`` | Avec détection des ouvertures | X | X |
|
||||||
|
| ``use_motion_feature`` | Avec détection de mouvement | X | X |
|
||||||
|
| ``use_power_feature`` | Avec gestion de la puissance | X | X |
|
||||||
|
| ``use_presence_feature`` | Avec détection de présence | X | X |
|
||||||
|
| ``heater_entity1_id`` | 1er radiateur | X | - |
|
||||||
|
| ``heater_entity2_id`` | 2ème radiateur | X | - |
|
||||||
|
| ``heater_entity3_id`` | 3ème radiateur | X | - |
|
||||||
|
| ``heater_entity4_id`` | 4ème radiateur | X | - |
|
||||||
|
| ``proportional_function`` | Algorithme | X | - |
|
||||||
|
| ``climate_entity1_id`` | Thermostat sous-jacent | - | X |
|
||||||
|
| ``climate_entity2_id`` | 2ème thermostat sous-jacent | - | X |
|
||||||
|
| ``climate_entity3_id`` | 3ème thermostat sous-jacent | - | X |
|
||||||
|
| ``climate_entity4_id`` | 4ème thermostat sous-jacent | - | X |
|
||||||
|
| ``ac_mode`` | utilisation de l'air conditionné (AC) ? | - | X |
|
||||||
|
| ``tpi_coef_int`` | Coefficient à utiliser pour le delta de température interne | X | - |
|
||||||
|
| ``tpi_coef_ext`` | Coefficient à utiliser pour le delta de température externe | X | - |
|
||||||
|
| ``eco_temp`` | Température en preset Eco | X | X |
|
||||||
|
| ``comfort_temp`` | Température en preset Confort | X | X |
|
||||||
|
| ``boost_temp`` | Température en preset Boost | X | X |
|
||||||
|
| ``eco_ac_temp`` | Température en preset Eco en mode AC | X | X |
|
||||||
|
| ``comfort_ac_temp`` | Température en preset Confort en mode AC | X | X |
|
||||||
|
| ``boost_ac_temp`` | Température en preset Boost en mode AC | X | X |
|
||||||
|
| ``window_sensor_entity_id`` | Détecteur d'ouverture (entity id) | X | X |
|
||||||
|
| ``window_delay`` | Délai avant extinction (secondes) | X | X |
|
||||||
|
| ``window_auto_open_threshold`` | Seuil haut de chute de température pour la détection automatique (en °/min) | X | X |
|
||||||
|
| ``window_auto_close_threshold`` | Seuil bas de chute de température pour la fin de détection automatique (en °/min) | X | X |
|
||||||
|
| ``window_auto_max_duration`` | Durée maximum d'une extinction automatique (en min) | X | X |
|
||||||
|
| ``motion_sensor_entity_id`` | Détecteur de mouvement entity id | X | X |
|
||||||
|
| ``motion_delay`` | Délai avant prise en compte du mouvement (seconds) | X | X |
|
||||||
|
| ``motion_off_delay`` | Délai avant prise en compte de la fin de mouvement (seconds) | X | X |
|
||||||
|
| ``motion_preset`` | Preset à utiliser si mouvement détecté | X | X |
|
||||||
|
| ``no_motion_preset`` | Preset à utiliser si pas de mouvement détecté | X | X |
|
||||||
|
| ``power_sensor_entity_id`` | Capteur de puissance totale (entity id) | X | X |
|
||||||
|
| ``max_power_sensor_entity_id`` | Capteur de puissance Max (entity id) | X | X |
|
||||||
|
| ``power_temp`` | Température si délestaqe | X | X |
|
||||||
|
| ``presence_sensor_entity_id`` | Capteur de présence entity id (true si quelqu'un est présent) | X | X |
|
||||||
|
| ``eco_away_temp`` | Température en preset Eco en cas d'absence | X | X |
|
||||||
|
| ``comfort_away_temp`` | Température en preset Comfort en cas d'absence | X | X |
|
||||||
|
| ``boost_away_temp`` | Température en preset Boost en cas d'absence | X | X |
|
||||||
|
| ``eco_ac_away_temp`` | Température en preset Eco en cas d'absence en mode AC | X | X |
|
||||||
|
| ``comfort_ac_away_temp`` | Température en preset Comfort en cas d'absence en mode AC | X | X |
|
||||||
|
| ``boost_ac_away_temp`` | Température en preset Boost en cas d'absence en mode AC | X | X |
|
||||||
|
| ``minimal_activation_delay`` | Délai minimal d'activation | X | - |
|
||||||
|
| ``security_delay_min`` | Délai maximal entre 2 mesures de températures | X | - |
|
||||||
|
| ``security_min_on_percent`` | Pourcentage minimal de puissance pour passer en mode sécurité | X | - |
|
||||||
|
| ``security_default_on_percent`` | Pourcentage de puissance a utiliser en mode securité | X | - |
|
||||||
|
|
||||||
# Exemples de réglage
|
# Exemples de réglage
|
||||||
|
|
||||||
## Chauffage électrique
|
## Chauffage électrique
|
||||||
@@ -451,6 +513,17 @@ target:
|
|||||||
entity_id : climate.my_thermostat
|
entity_id : climate.my_thermostat
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Ou pour changer le pré-réglage du mode Air Conditionné (AC) ajoutez un préfixe `_ac`` au nom du preset comme ceci :
|
||||||
|
```
|
||||||
|
service: versatile_thermostat.set_preset_temperature
|
||||||
|
data:
|
||||||
|
preset: boost_ac
|
||||||
|
temperature: 25
|
||||||
|
temperature_away: 30
|
||||||
|
target:
|
||||||
|
entity_id: climate.my_thermostat
|
||||||
|
```
|
||||||
|
|
||||||
>  _*Notes*_
|
>  _*Notes*_
|
||||||
- après un redémarrage, les préréglages sont réinitialisés à la température configurée. Si vous souhaitez que votre changement soit permanent, vous devez modifier le préréglage de la température dans la configuration de l'intégration.
|
- après un redémarrage, les préréglages sont réinitialisés à la température configurée. Si vous souhaitez que votre changement soit permanent, vous devez modifier le préréglage de la température dans la configuration de l'intégration.
|
||||||
|
|
||||||
|
|||||||
96
README.md
96
README.md
@@ -26,6 +26,7 @@
|
|||||||
- [Configure the power management](#configure-the-power-management)
|
- [Configure the power management](#configure-the-power-management)
|
||||||
- [Configure the presence or occupancy](#configure-the-presence-or-occupancy)
|
- [Configure the presence or occupancy](#configure-the-presence-or-occupancy)
|
||||||
- [Advanced configuration](#advanced-configuration)
|
- [Advanced configuration](#advanced-configuration)
|
||||||
|
- [Parameters synthesis](#parameters-synthesis)
|
||||||
- [Examples tuning](#examples-tuning)
|
- [Examples tuning](#examples-tuning)
|
||||||
- [Electrical heater](#electrical-heater)
|
- [Electrical heater](#electrical-heater)
|
||||||
- [Central heating (gaz or fuel heating system)](#central-heating-gaz-or-fuel-heating-system)
|
- [Central heating (gaz or fuel heating system)](#central-heating-gaz-or-fuel-heating-system)
|
||||||
@@ -53,6 +54,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.
|
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.
|
||||||
|
|
||||||
> _*News*_
|
> _*News*_
|
||||||
|
> * **Release 3.6**: Add a `motion_off_delay` parameter for activity management,
|
||||||
> * **Release 3.5**: Multiple thermostats when using "thermostat over another thermostat" mode [#113](https://github.com/jmcollin78/versatile_thermostat/issues/113)
|
> * **Release 3.5**: Multiple thermostats when using "thermostat over another thermostat" mode [#113](https://github.com/jmcollin78/versatile_thermostat/issues/113)
|
||||||
> * **Release 3.4**: bug fixes and expose preset temperatures for AC mode [#103](https://github.com/jmcollin78/versatile_thermostat/issues/103)
|
> * **Release 3.4**: bug fixes and expose preset temperatures for AC mode [#103](https://github.com/jmcollin78/versatile_thermostat/issues/103)
|
||||||
> * **Release 3.3**: add the Air Conditionned mode (AC). This feature allow to use the eventual AC mode of your underlying climate entity. You have to check the "Use AC mode" checkbox in configuration and give preset temperature value for AC mode and AC mode when absent if absence is configured
|
> * **Release 3.3**: add the Air Conditionned mode (AC). This feature allow to use the eventual AC mode of your underlying climate entity. You have to check the "Use AC mode" checkbox in configuration and give preset temperature value for AC mode and AC mode when absent if absence is configured
|
||||||
@@ -64,19 +66,17 @@ This custom component for Home Assistant is an upgrade and is a complete rewrite
|
|||||||
> * **major release 2.0**: addition of the "over climate" thermostat allowing you to transform any thermostat into a Versatile Thermostat and add all the functions of the latter.
|
> * **major release 2.0**: addition of the "over climate" thermostat allowing you to transform any thermostat into a Versatile Thermostat and add all the functions of the latter.
|
||||||
|
|
||||||
# Thanks for the beer [buymecoffee](https://www.buymeacoffee.com/jmcollin78)
|
# Thanks for the beer [buymecoffee](https://www.buymeacoffee.com/jmcollin78)
|
||||||
Many thanks to @salabur, @pvince83 and @bergoglio for the beers. It's very pleasing.
|
Many thanks to @@salabur, @pvince83, @bergoglio, @EPicLURcher, @Kriss1670, @maia for the beers. It's very pleasing.
|
||||||
|
|
||||||
|
|
||||||
# When to use / not use
|
# When to use / not use
|
||||||
This thermostat can control 2 types of equipment:
|
This thermostat can control 2 types of equipment:
|
||||||
1. a heater that only works in on/off mode (named ```thermostat_over_switch```). The minimum configuration required to use this type of thermostat is:
|
1. a heater that only works in on/off mode (named ```thermostat_over_switch```). Versatile Thermostat will regulate the length of a heating cycle and the pauses in-between by controlling a binary on/off switch. This mode is e.g. suitable for an electrical radiator controlled by a switch. The minimum configuration required to use this type of thermostat is:
|
||||||
- an equipment such as a radiator (a ```switch``` or equivalent),
|
- an equipment such as a radiator (a ```switch``` or equivalent),
|
||||||
- a temperature probe for the room (or an input_number),
|
- a temperature probe for the room (or an input_number),
|
||||||
- an external temperature sensor (think about weather integration if you don't have one)
|
- an external temperature sensor (think about weather integration if you don't have one)
|
||||||
2. another thermostat that has its own operating modes (named ```thermostat_over_climate```). For this type of thermostat, the minimum configuration requires:
|
2. another thermostat that has its own operating modes (named ```thermostat_over_climate```). Versatile Thermostat will regulate the target temperature of a climate entity. Common examples for this mode are the control of thermostatic radiator valves (TRV), air-conditions (AC), floor heating systems and pellet heating. For this type of thermostat, the minimum configuration requires:
|
||||||
- an equipment such as air conditioning which is controlled by its own ```climate``` type entity,
|
- an equipment such as air conditioning or thermostatic valve (TRV) which is controlled by its own ```climate``` type entity,
|
||||||
- a temperature probe for the room (or an input_number),
|
|
||||||
- an external temperature sensor (think about weather integration if you don't have one)
|
|
||||||
|
|
||||||
The ```thermostat_over_climate``` type allows you to add all the functionality provided by VersatileThermostat to your existing equipment. The climate VersatileThermostat entity will control your existing climate entity, turning it off if the windows are open, switching it to Eco mode if no one is present, etc. See [here](#why-a-new-implementation-of-the-thermostat). For this type of thermostat, any heating cycles are controlled by the underlying climate entity and not by the Versatile Thermostat itself.
|
The ```thermostat_over_climate``` type allows you to add all the functionality provided by VersatileThermostat to your existing equipment. The climate VersatileThermostat entity will control your existing climate entity, turning it off if the windows are open, switching it to Eco mode if no one is present, etc. See [here](#why-a-new-implementation-of-the-thermostat). For this type of thermostat, any heating cycles are controlled by the underlying climate entity and not by the Versatile Thermostat itself.
|
||||||
|
|
||||||
@@ -229,15 +229,17 @@ We will now see how to configure the new Activity mode.
|
|||||||
What we need:
|
What we need:
|
||||||
- a **motion sensor**. The entity id of a motion sensor. Motion sensor states should be 'on' (motion detected) or 'off' (no motion detected)
|
- a **motion sensor**. The entity id of a motion sensor. Motion sensor states should be 'on' (motion detected) or 'off' (no motion detected)
|
||||||
- a **motion delay** (in seconds) duration defining how long we wait for motion confirmation before considering the motion
|
- a **motion delay** (in seconds) duration defining how long we wait for motion confirmation before considering the motion
|
||||||
|
- a **end of motion delay** (in seconds) duration defining how long we wait for end of motion confirmation before considering the end of motion
|
||||||
- a **target "motion" preset**. We will used the temperature of this preset when an activity is detected.
|
- a **target "motion" preset**. We will used the temperature of this preset when an activity is detected.
|
||||||
- a **target "no motion" preset**. We will used the temperature of this second preset when no activity is detected.
|
- a **target "no motion" preset**. We will used the temperature of this second preset when no activity is detected.
|
||||||
|
|
||||||
So imagine we want to have the following behavior :
|
- we have a room with a thermostat set to activity mode, the "movement" mode chosen is comfort (21.5°C), the "no movement" mode chosen is Eco (18.5°C) and the movement delay is 30 sec during detection and 5 minutes at the end of detection.
|
||||||
- we have room with a thermostat set in activity mode, the "motion" mode chosen is comfort (21.5C), the "no motion" mode chosen is Eco (18.5 C) and the motion delay is 5 min.
|
- the room has been empty for a while (no activity detected), the temperature of this room is 18.5°
|
||||||
- the room is empty for a while (no activity detected), the temperature of this room is 18.5 C
|
- someone enters the room, activity is detected if movement is present for at least 30 seconds. The temperature then rises to 21.5°
|
||||||
- somebody enters into the room, an activity is detected the temperature is set to 21.5 C
|
- if the movement is present for less than 30 seconds (rapid passage), the temperature remains at 18.5°,
|
||||||
- the person leaves the room, after 5 min the temperature is set back to 18.5 C
|
- imagine that the temperature has risen to 21.5°, when the person leaves the room, after 5 minutes the temperature is reduced to 18.5°.
|
||||||
|
- if the person returns before 5 minutes, the temperature remains at 21.5°
|
||||||
|
|
||||||
For this to work, the climate thermostat should be in ``Activity`` preset mode.
|
For this to work, the climate thermostat should be in ``Activity`` preset mode.
|
||||||
|
|
||||||
>  _*Notes*_
|
>  _*Notes*_
|
||||||
@@ -300,6 +302,65 @@ See [example tuning](#examples-tuning) for common tuning examples
|
|||||||
5. For natural usage, the ``security_default_on_percent`` should be less than ``security_min_on_percent``,
|
5. For natural usage, the ``security_default_on_percent`` should be less than ``security_min_on_percent``,
|
||||||
6. When a ``thermostat_over_climate`` type thermostat goes into ``security`` mode it is turned off. The ``security_min_on_percent`` and ``security_default_on_percent`` parameters are then not used.
|
6. When a ``thermostat_over_climate`` type thermostat goes into ``security`` mode it is turned off. The ``security_min_on_percent`` and ``security_default_on_percent`` parameters are then not used.
|
||||||
|
|
||||||
|
## Parameters synthesis
|
||||||
|
|
||||||
|
| Paramètre | Libellé | "over switch" | "over climate" |
|
||||||
|
| ----------| --------| --- | --- |
|
||||||
|
| ``name`` | Name | X | X |
|
||||||
|
| ``thermostat_type`` | Thermostat type | X | X |
|
||||||
|
| ``temperature_sensor_entity_id`` | Temperature sensor entity id | X | - |
|
||||||
|
| ``external_temperature_sensor_entity_id`` | External temperature sensor entity id | X | - |
|
||||||
|
| ``cycle_min`` | Cycle duration (minutes) | X | X |
|
||||||
|
| ``temp_min`` | Minimal temperature allowed | X | X |
|
||||||
|
| ``temp_max`` | Maximal temperature allowed | X | X |
|
||||||
|
| ``device_power`` | Device power | X | X |
|
||||||
|
| ``use_window_feature`` | Use window detection | X | X |
|
||||||
|
| ``use_motion_feature`` | Use motion detection | X | X |
|
||||||
|
| ``use_power_feature`` | Use power management | X | X |
|
||||||
|
| ``use_presence_feature`` | Use presence detection | X | X |
|
||||||
|
| ``heater_entity1_id`` | 1rst heater switch | X | - |
|
||||||
|
| ``heater_entity2_id`` | 2nd heater switch | X | - |
|
||||||
|
| ``heater_entity3_id`` | 3rd heater switch | X | - |
|
||||||
|
| ``heater_entity4_id`` | 4th heater switch | X | - |
|
||||||
|
| ``proportional_function`` | Algorithm | X | - |
|
||||||
|
| ``climate_entity1_id`` | 1rst underlying climate | - | X |
|
||||||
|
| ``climate_entity2_id`` | 2nd underlying climate | - | X |
|
||||||
|
| ``climate_entity3_id`` | 3rd underlying climate | - | X |
|
||||||
|
| ``climate_entity4_id`` | 4th underlying climate | - | X |
|
||||||
|
| ``ac_mode`` | Use the Air Conditioning (AC) mode | - | X |
|
||||||
|
| ``tpi_coef_int`` | Coefficient to use for internal temperature delta | X | - |
|
||||||
|
| ``tpi_coef_ext`` | Coefficient to use for external temperature delta | X | - |
|
||||||
|
| ``eco_temp`` | Temperature in Eco preset | X | X |
|
||||||
|
| ``comfort_temp`` | Temperature in Comfort preset | X | X |
|
||||||
|
| ``boost_temp`` | Temperature in Boost preset | X | X |
|
||||||
|
| ``eco_ac_temp`` | Temperature in Eco preset for AC mode | X | X |
|
||||||
|
| ``comfort_ac_temp`` | Temperature in Comfort preset for AC mode | X | X |
|
||||||
|
| ``boost_ac_temp`` | Temperature in Boost preset for AC mode | X | X |
|
||||||
|
| ``window_sensor_entity_id`` | Window sensor entity id | X | X |
|
||||||
|
| ``window_delay`` | Window sensor delay (seconds) | X | X |
|
||||||
|
| ``window_auto_open_threshold`` | Temperature decrease threshold for automatic window open detection (in °/min) | X | X |
|
||||||
|
| ``window_auto_close_threshold`` | Temperature increase threshold for end of automatic detection (in °/min) | X | X |
|
||||||
|
| ``window_auto_max_duration`` | Maximum duration of automatic window open detection (in min) | X | X |
|
||||||
|
| ``motion_sensor_entity_id`` | Motion sensor entity id | X | X |
|
||||||
|
| ``motion_delay`` | Delay before considering the motion (seconds) | X | X |
|
||||||
|
| ``motion_off_delay`` | Delay before considering the end of motion (seconds) | X | X |
|
||||||
|
| ``motion_preset`` | Preset to use when motion is detected | X | X |
|
||||||
|
| ``no_motion_preset`` | Preset to use when no motion is detected | X | X |
|
||||||
|
| ``power_sensor_entity_id`` | Power sensor entity id | X | X |
|
||||||
|
| ``max_power_sensor_entity_id`` | Max power sensor entity id | X | X |
|
||||||
|
| ``power_temp`` | Temperature for Power shedding | X | X |
|
||||||
|
| ``presence_sensor_entity_id`` | Presence sensor entity id | X | X |
|
||||||
|
| ``eco_away_temp`` | Temperature in Eco preset when no presence | X | X |
|
||||||
|
| ``comfort_away_temp`` | Temperature in Comfort preset when no presence | X | X |
|
||||||
|
| ``boost_away_temp`` | Temperature in Boost preset when no presence | X | X |
|
||||||
|
| ``eco_ac_away_temp`` | Temperature in Eco preset when no presence in AC mode | X | X |
|
||||||
|
| ``comfort_ac_away_temp`` | Temperature in Comfort preset when no presence in AC mode | X | X |
|
||||||
|
| ``boost_ac_away_temp`` | Temperature in Boost preset when no presence in AC mode | X | X |
|
||||||
|
| ``minimal_activation_delay`` | Minimal activation delay | X | - |
|
||||||
|
| ``security_delay_min`` | Security delay (in minutes) | X | X |
|
||||||
|
| ``security_min_on_percent`` | Minimal power percent to enable security mode | X | X |
|
||||||
|
| ``security_default_on_percent`` | Power percent to use in security mode | X | X |
|
||||||
|
|
||||||
# Examples tuning
|
# Examples tuning
|
||||||
|
|
||||||
## Electrical heater
|
## Electrical heater
|
||||||
@@ -436,6 +497,17 @@ target:
|
|||||||
entity_id: climate.my_thermostat
|
entity_id: climate.my_thermostat
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Or to change the preset of the AC mode, add _ac to the preset name like this:
|
||||||
|
```
|
||||||
|
service: versatile_thermostat.set_preset_temperature
|
||||||
|
data:
|
||||||
|
preset: boost_ac
|
||||||
|
temperature: 25
|
||||||
|
temperature_away: 30
|
||||||
|
target:
|
||||||
|
entity_id: climate.my_thermostat
|
||||||
|
```
|
||||||
|
|
||||||
>  _*Notes*_
|
>  _*Notes*_
|
||||||
- after a restart the preset are resetted to the configured temperature. If you want your change to be permanent you should modify the temperature preset into the confguration of the integration.
|
- after a restart the preset are resetted to the configured temperature. If you want your change to be permanent you should modify the temperature preset into the confguration of the integration.
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import logging
|
|||||||
|
|
||||||
from homeassistant.core import HomeAssistant, callback, Event
|
from homeassistant.core import HomeAssistant, callback, Event
|
||||||
|
|
||||||
from homeassistant.const import STATE_ON
|
from homeassistant.const import STATE_ON, STATE_OFF
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
BinarySensorEntity,
|
BinarySensorEntity,
|
||||||
@@ -133,12 +133,14 @@ class WindowBinarySensor(VersatileThermostatBaseEntity, BinarySensorEntity):
|
|||||||
_LOGGER.debug("%s - climate state change", self._attr_unique_id)
|
_LOGGER.debug("%s - climate state change", self._attr_unique_id)
|
||||||
|
|
||||||
old_state = self._attr_is_on
|
old_state = self._attr_is_on
|
||||||
self._attr_is_on = (
|
# Issue 120 - only take defined presence value
|
||||||
self.my_climate.window_state == STATE_ON
|
if self.my_climate.window_state in [STATE_ON, STATE_OFF] or self.my_climate.window_auto_state in [STATE_ON, STATE_OFF]:
|
||||||
or self.my_climate.window_auto_state == STATE_ON
|
self._attr_is_on = (
|
||||||
)
|
self.my_climate.window_state == STATE_ON
|
||||||
if old_state != self._attr_is_on:
|
or self.my_climate.window_auto_state == STATE_ON
|
||||||
self.async_write_ha_state()
|
)
|
||||||
|
if old_state != self._attr_is_on:
|
||||||
|
self.async_write_ha_state()
|
||||||
return
|
return
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -171,9 +173,11 @@ class MotionBinarySensor(VersatileThermostatBaseEntity, BinarySensorEntity):
|
|||||||
"""Called when my climate have change"""
|
"""Called when my climate have change"""
|
||||||
_LOGGER.debug("%s - climate state change", self._attr_unique_id)
|
_LOGGER.debug("%s - climate state change", self._attr_unique_id)
|
||||||
old_state = self._attr_is_on
|
old_state = self._attr_is_on
|
||||||
self._attr_is_on = self.my_climate.motion_state == STATE_ON
|
# Issue 120 - only take defined presence value
|
||||||
if old_state != self._attr_is_on:
|
if self.my_climate.motion_state in [STATE_ON, STATE_OFF]:
|
||||||
self.async_write_ha_state()
|
self._attr_is_on = self.my_climate.motion_state == STATE_ON
|
||||||
|
if old_state != self._attr_is_on:
|
||||||
|
self.async_write_ha_state()
|
||||||
return
|
return
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -204,9 +208,11 @@ class PresenceBinarySensor(VersatileThermostatBaseEntity, BinarySensorEntity):
|
|||||||
|
|
||||||
_LOGGER.debug("%s - climate state change", self._attr_unique_id)
|
_LOGGER.debug("%s - climate state change", self._attr_unique_id)
|
||||||
old_state = self._attr_is_on
|
old_state = self._attr_is_on
|
||||||
self._attr_is_on = self.my_climate.presence_state == STATE_ON
|
# Issue 120 - only take defined presence value
|
||||||
if old_state != self._attr_is_on:
|
if self.my_climate.presence_state in [STATE_ON, STATE_OFF]:
|
||||||
self.async_write_ha_state()
|
self._attr_is_on = self.my_climate.presence_state == STATE_ON
|
||||||
|
if old_state != self._attr_is_on:
|
||||||
|
self.async_write_ha_state()
|
||||||
return
|
return
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ from .const import (
|
|||||||
CONF_WINDOW_AUTO_MAX_DURATION,
|
CONF_WINDOW_AUTO_MAX_DURATION,
|
||||||
CONF_MOTION_SENSOR,
|
CONF_MOTION_SENSOR,
|
||||||
CONF_MOTION_DELAY,
|
CONF_MOTION_DELAY,
|
||||||
|
CONF_MOTION_OFF_DELAY,
|
||||||
CONF_MOTION_PRESET,
|
CONF_MOTION_PRESET,
|
||||||
CONF_NO_MOTION_PRESET,
|
CONF_NO_MOTION_PRESET,
|
||||||
CONF_DEVICE_POWER,
|
CONF_DEVICE_POWER,
|
||||||
@@ -399,6 +400,10 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
|
|
||||||
self._motion_sensor_entity_id = entry_infos.get(CONF_MOTION_SENSOR)
|
self._motion_sensor_entity_id = entry_infos.get(CONF_MOTION_SENSOR)
|
||||||
self._motion_delay_sec = entry_infos.get(CONF_MOTION_DELAY)
|
self._motion_delay_sec = entry_infos.get(CONF_MOTION_DELAY)
|
||||||
|
self._motion_off_delay_sec = entry_infos.get(CONF_MOTION_OFF_DELAY)
|
||||||
|
if not self._motion_off_delay_sec:
|
||||||
|
self._motion_off_delay_sec = self._motion_delay_sec
|
||||||
|
|
||||||
self._motion_preset = entry_infos.get(CONF_MOTION_PRESET)
|
self._motion_preset = entry_infos.get(CONF_MOTION_PRESET)
|
||||||
self._no_motion_preset = entry_infos.get(CONF_NO_MOTION_PRESET)
|
self._no_motion_preset = entry_infos.get(CONF_NO_MOTION_PRESET)
|
||||||
self._motion_on = (
|
self._motion_on = (
|
||||||
@@ -1532,7 +1537,7 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
self.hass,
|
self.hass,
|
||||||
self._motion_sensor_entity_id,
|
self._motion_sensor_entity_id,
|
||||||
new_state.state,
|
new_state.state,
|
||||||
timedelta(seconds=self._motion_delay_sec),
|
timedelta(seconds=delay),
|
||||||
)
|
)
|
||||||
except ConditionError:
|
except ConditionError:
|
||||||
long_enough = False
|
long_enough = False
|
||||||
@@ -1567,8 +1572,11 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
if self._motion_call_cancel:
|
if self._motion_call_cancel:
|
||||||
self._motion_call_cancel()
|
self._motion_call_cancel()
|
||||||
self._motion_call_cancel = None
|
self._motion_call_cancel = None
|
||||||
|
|
||||||
|
# Delay
|
||||||
|
delay = self._motion_delay_sec if new_state.state == STATE_ON else self._motion_off_delay_sec
|
||||||
self._motion_call_cancel = async_call_later(
|
self._motion_call_cancel = async_call_later(
|
||||||
self.hass, timedelta(seconds=self._motion_delay_sec), try_motion_condition
|
self.hass, timedelta(seconds=delay), try_motion_condition
|
||||||
)
|
)
|
||||||
|
|
||||||
# For testing purpose we need to access the inner function
|
# For testing purpose we need to access the inner function
|
||||||
@@ -2299,21 +2307,21 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
under.startup()
|
under.startup()
|
||||||
except UnknownEntity as err:
|
except UnknownEntity:
|
||||||
# still not found, we an stop here
|
# still not found, we an stop here
|
||||||
raise err
|
return False
|
||||||
|
|
||||||
# Check overpowering condition
|
# Check overpowering condition
|
||||||
# Not necessary for switch because each switch is checking at startup
|
# Not necessary for switch because each switch is checking at startup
|
||||||
overpowering: bool = await self.check_overpowering()
|
overpowering: bool = await self.check_overpowering()
|
||||||
if overpowering:
|
if overpowering:
|
||||||
_LOGGER.debug("%s - End of cycle (overpowering)", self)
|
_LOGGER.debug("%s - End of cycle (overpowering)", self)
|
||||||
return
|
return True
|
||||||
|
|
||||||
security: bool = await self.check_security()
|
security: bool = await self.check_security()
|
||||||
if security and self._is_over_climate:
|
if security and self._is_over_climate:
|
||||||
_LOGGER.debug("%s - End of cycle (security and over climate)", self)
|
_LOGGER.debug("%s - End of cycle (security and over climate)", self)
|
||||||
return
|
return True
|
||||||
|
|
||||||
# Stop here if we are off
|
# Stop here if we are off
|
||||||
if self._hvac_mode == HVACMode.OFF:
|
if self._hvac_mode == HVACMode.OFF:
|
||||||
@@ -2321,7 +2329,7 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
# A security to force stop heater if still active
|
# A security to force stop heater if still active
|
||||||
if self._is_device_active:
|
if self._is_device_active:
|
||||||
await self._async_underlying_entity_turn_off()
|
await self._async_underlying_entity_turn_off()
|
||||||
return
|
return True
|
||||||
|
|
||||||
if not self._is_over_climate:
|
if not self._is_over_climate:
|
||||||
for under in self._underlyings:
|
for under in self._underlyings:
|
||||||
@@ -2333,6 +2341,7 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.update_custom_attributes()
|
self.update_custom_attributes()
|
||||||
|
return True
|
||||||
|
|
||||||
def recalculate(self):
|
def recalculate(self):
|
||||||
"""A utility function to force the calculation of a the algo and
|
"""A utility function to force the calculation of a the algo and
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ from .const import (
|
|||||||
CONF_WINDOW_AUTO_OPEN_THRESHOLD,
|
CONF_WINDOW_AUTO_OPEN_THRESHOLD,
|
||||||
CONF_MOTION_SENSOR,
|
CONF_MOTION_SENSOR,
|
||||||
CONF_MOTION_DELAY,
|
CONF_MOTION_DELAY,
|
||||||
|
CONF_MOTION_OFF_DELAY,
|
||||||
CONF_MOTION_PRESET,
|
CONF_MOTION_PRESET,
|
||||||
CONF_NO_MOTION_PRESET,
|
CONF_NO_MOTION_PRESET,
|
||||||
CONF_DEVICE_POWER,
|
CONF_DEVICE_POWER,
|
||||||
@@ -292,6 +293,7 @@ class VersatileThermostatBaseConfigFlow(FlowHandler):
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
vol.Optional(CONF_MOTION_DELAY, default=30): cv.positive_int,
|
vol.Optional(CONF_MOTION_DELAY, default=30): cv.positive_int,
|
||||||
|
vol.Optional(CONF_MOTION_OFF_DELAY, default=300): cv.positive_int,
|
||||||
vol.Optional(CONF_MOTION_PRESET, default="comfort"): vol.In(
|
vol.Optional(CONF_MOTION_PRESET, default="comfort"): vol.In(
|
||||||
CONF_PRESETS_SELECTIONABLE
|
CONF_PRESETS_SELECTIONABLE
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ CONF_CYCLE_MIN = "cycle_min"
|
|||||||
CONF_PROP_FUNCTION = "proportional_function"
|
CONF_PROP_FUNCTION = "proportional_function"
|
||||||
CONF_WINDOW_DELAY = "window_delay"
|
CONF_WINDOW_DELAY = "window_delay"
|
||||||
CONF_MOTION_DELAY = "motion_delay"
|
CONF_MOTION_DELAY = "motion_delay"
|
||||||
|
CONF_MOTION_OFF_DELAY = "motion_off_delay"
|
||||||
CONF_MOTION_PRESET = "motion_preset"
|
CONF_MOTION_PRESET = "motion_preset"
|
||||||
CONF_NO_MOTION_PRESET = "no_motion_preset"
|
CONF_NO_MOTION_PRESET = "no_motion_preset"
|
||||||
CONF_TPI_COEF_INT = "tpi_coef_int"
|
CONF_TPI_COEF_INT = "tpi_coef_int"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
"cycle_min": "Cycle duration (minutes)",
|
"cycle_min": "Cycle duration (minutes)",
|
||||||
"temp_min": "Minimal temperature allowed",
|
"temp_min": "Minimal temperature allowed",
|
||||||
"temp_max": "Maximal temperature allowed",
|
"temp_max": "Maximal temperature allowed",
|
||||||
"device_power": "Device power (kW)",
|
"device_power": "Device power",
|
||||||
"use_window_feature": "Use window detection",
|
"use_window_feature": "Use window detection",
|
||||||
"use_motion_feature": "Use motion detection",
|
"use_motion_feature": "Use motion detection",
|
||||||
"use_power_feature": "Use power management",
|
"use_power_feature": "Use power management",
|
||||||
@@ -25,12 +25,12 @@
|
|||||||
"title": "Linked entities",
|
"title": "Linked entities",
|
||||||
"description": "Linked entities attributes",
|
"description": "Linked entities attributes",
|
||||||
"data": {
|
"data": {
|
||||||
"heater_entity_id": "Heater switch",
|
"heater_entity_id": "1rst heater switch",
|
||||||
"heater_entity2_id": "2nd heater switch",
|
"heater_entity2_id": "2nd heater switch",
|
||||||
"heater_entity3_id": "3rd heater switch",
|
"heater_entity3_id": "3rd heater switch",
|
||||||
"heater_entity4_id": "4th heater switch",
|
"heater_entity4_id": "4th heater switch",
|
||||||
"proportional_function": "Algorithm",
|
"proportional_function": "Algorithm",
|
||||||
"climate_entity_id": "Underlying climate",
|
"climate_entity_id": "1rst underlying climate",
|
||||||
"climate_entity2_id": "2nd underlying climate",
|
"climate_entity2_id": "2nd underlying climate",
|
||||||
"climate_entity3_id": "3rd underlying climate",
|
"climate_entity3_id": "3rd underlying climate",
|
||||||
"climate_entity4_id": "4th underlying climate",
|
"climate_entity4_id": "4th underlying climate",
|
||||||
@@ -92,7 +92,15 @@
|
|||||||
"description": "Motion sensor management. Preset can switch automatically depending of a motion detection\nLeave corresponding entity_id empty if not used.\nmotion_preset and no_motion_preset should be set to the corresponding preset name",
|
"description": "Motion sensor management. Preset can switch automatically depending of a motion detection\nLeave corresponding entity_id empty if not used.\nmotion_preset and no_motion_preset should be set to the corresponding preset name",
|
||||||
"data": {
|
"data": {
|
||||||
"motion_sensor_entity_id": "Motion sensor entity id",
|
"motion_sensor_entity_id": "Motion sensor entity id",
|
||||||
"motion_delay": "Motion delay (seconds)",
|
"motion_delay": "Activation delay",
|
||||||
|
"motion_off_delay": "Deactivation delay",
|
||||||
|
"motion_preset": "Motion preset",
|
||||||
|
"no_motion_preset": "No motion preset"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
|
"motion_sensor_entity_id": "The entity id of the motion sensor",
|
||||||
|
"motion_delay": "Motion activation activation delay (seconds)",
|
||||||
|
"motion_off_delay": "Motion deactivation delay (seconds)",
|
||||||
"motion_preset": "Preset to use when motion is detected",
|
"motion_preset": "Preset to use when motion is detected",
|
||||||
"no_motion_preset": "Preset to use when no motion is detected"
|
"no_motion_preset": "Preset to use when no motion is detected"
|
||||||
}
|
}
|
||||||
@@ -110,7 +118,7 @@
|
|||||||
"title": "Presence management",
|
"title": "Presence management",
|
||||||
"description": "Presence management attributes.\nGives the a presence sensor of your home (true is someone is present).\nThen specify either the preset to use when presence sensor is false or the offset in temperature to apply.\nIf preset is given, the offset will not be used.\nLeave corresponding entity_id empty if not used.",
|
"description": "Presence management attributes.\nGives the a presence sensor of your home (true is someone is present).\nThen specify either the preset to use when presence sensor is false or the offset in temperature to apply.\nIf preset is given, the offset will not be used.\nLeave corresponding entity_id empty if not used.",
|
||||||
"data": {
|
"data": {
|
||||||
"presence_sensor_entity_id": "Presence sensor entity id (true is present)",
|
"presence_sensor_entity_id": "Presence sensor entity id",
|
||||||
"eco_away_temp": "Temperature in Eco preset when no presence",
|
"eco_away_temp": "Temperature in Eco preset when no presence",
|
||||||
"comfort_away_temp": "Temperature in Comfort preset when no presence",
|
"comfort_away_temp": "Temperature in Comfort preset when no presence",
|
||||||
"boost_away_temp": "Temperature in Boost preset when no presence",
|
"boost_away_temp": "Temperature in Boost preset when no presence",
|
||||||
@@ -125,7 +133,7 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"minimal_activation_delay": "Minimal activation delay",
|
"minimal_activation_delay": "Minimal activation delay",
|
||||||
"security_delay_min": "Security delay (in minutes)",
|
"security_delay_min": "Security delay (in minutes)",
|
||||||
"security_min_on_percent": "Minimal power percent for security mode",
|
"security_min_on_percent": "Minimal power percent to enable security mode",
|
||||||
"security_default_on_percent": "Power percent to use in security mode"
|
"security_default_on_percent": "Power percent to use in security mode"
|
||||||
},
|
},
|
||||||
"data_description": {
|
"data_description": {
|
||||||
@@ -237,7 +245,15 @@
|
|||||||
"description": "Motion sensor management. Preset can switch automatically depending of a motion detection\nLeave corresponding entity_id empty if not used.\nmotion_preset and no_motion_preset should be set to the corresponding preset name",
|
"description": "Motion sensor management. Preset can switch automatically depending of a motion detection\nLeave corresponding entity_id empty if not used.\nmotion_preset and no_motion_preset should be set to the corresponding preset name",
|
||||||
"data": {
|
"data": {
|
||||||
"motion_sensor_entity_id": "Motion sensor entity id",
|
"motion_sensor_entity_id": "Motion sensor entity id",
|
||||||
"motion_delay": "Motion delay (seconds)",
|
"motion_delay": "Activation delay",
|
||||||
|
"motion_off_delay": "Deactivation delay",
|
||||||
|
"motion_preset": "Motion preset",
|
||||||
|
"no_motion_preset": "No motion preset"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
|
"motion_sensor_entity_id": "The entity id of the motion sensor",
|
||||||
|
"motion_delay": "Motion activation activation delay (seconds)",
|
||||||
|
"motion_off_delay": "Motion deactivation delay (seconds)",
|
||||||
"motion_preset": "Preset to use when motion is detected",
|
"motion_preset": "Preset to use when motion is detected",
|
||||||
"no_motion_preset": "Preset to use when no motion is detected"
|
"no_motion_preset": "Preset to use when no motion is detected"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ from custom_components.versatile_thermostat.const import (
|
|||||||
CONF_WINDOW_AUTO_MAX_DURATION,
|
CONF_WINDOW_AUTO_MAX_DURATION,
|
||||||
CONF_MOTION_SENSOR,
|
CONF_MOTION_SENSOR,
|
||||||
CONF_MOTION_DELAY,
|
CONF_MOTION_DELAY,
|
||||||
|
CONF_MOTION_OFF_DELAY,
|
||||||
CONF_MOTION_PRESET,
|
CONF_MOTION_PRESET,
|
||||||
CONF_NO_MOTION_PRESET,
|
CONF_NO_MOTION_PRESET,
|
||||||
CONF_POWER_SENSOR,
|
CONF_POWER_SENSOR,
|
||||||
@@ -136,6 +137,7 @@ MOCK_WINDOW_AUTO_CONFIG = {
|
|||||||
MOCK_MOTION_CONFIG = {
|
MOCK_MOTION_CONFIG = {
|
||||||
CONF_MOTION_SENSOR: "input_boolean.motion_sensor",
|
CONF_MOTION_SENSOR: "input_boolean.motion_sensor",
|
||||||
CONF_MOTION_DELAY: 10,
|
CONF_MOTION_DELAY: 10,
|
||||||
|
CONF_MOTION_OFF_DELAY: 30,
|
||||||
CONF_MOTION_PRESET: PRESET_COMFORT,
|
CONF_MOTION_PRESET: PRESET_COMFORT,
|
||||||
CONF_NO_MOTION_PRESET: PRESET_ECO,
|
CONF_NO_MOTION_PRESET: PRESET_ECO,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,11 +62,9 @@ async def test_bug_56(
|
|||||||
|
|
||||||
# try to call _async_control_heating
|
# try to call _async_control_heating
|
||||||
try:
|
try:
|
||||||
await entity._async_control_heating()
|
ret = await entity._async_control_heating()
|
||||||
# an exception should be send
|
# an exception should be send
|
||||||
assert False
|
assert ret is False
|
||||||
except UnknownEntity:
|
|
||||||
pass
|
|
||||||
except Exception: # pylint: disable=broad-exception-caught
|
except Exception: # pylint: disable=broad-exception-caught
|
||||||
assert False
|
assert False
|
||||||
|
|
||||||
|
|||||||
@@ -157,38 +157,6 @@ async def test_user_config_flow_over_climate(hass: HomeAssistant, skip_hass_stat
|
|||||||
result["flow_id"], user_input=MOCK_PRESETS_CONFIG
|
result["flow_id"], user_input=MOCK_PRESETS_CONFIG
|
||||||
)
|
)
|
||||||
|
|
||||||
# assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
|
||||||
# assert result["step_id"] == "window"
|
|
||||||
# assert result["errors"] == {}
|
|
||||||
|
|
||||||
# result = await hass.config_entries.flow.async_configure(
|
|
||||||
# result["flow_id"], user_input=MOCK_WINDOW_CONFIG
|
|
||||||
# )
|
|
||||||
|
|
||||||
# assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
|
||||||
# assert result["step_id"] == "motion"
|
|
||||||
# assert result["errors"] == {}
|
|
||||||
|
|
||||||
# result = await hass.config_entries.flow.async_configure(
|
|
||||||
# result["flow_id"], user_input=MOCK_MOTION_CONFIG
|
|
||||||
# )
|
|
||||||
|
|
||||||
# assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
|
||||||
# assert result["step_id"] == "power"
|
|
||||||
# assert result["errors"] == {}
|
|
||||||
|
|
||||||
# result = await hass.config_entries.flow.async_configure(
|
|
||||||
# result["flow_id"], user_input=MOCK_POWER_CONFIG
|
|
||||||
# )
|
|
||||||
|
|
||||||
# assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
|
||||||
# assert result["step_id"] == "presence"
|
|
||||||
# assert result["errors"] == {}
|
|
||||||
|
|
||||||
# result = await hass.config_entries.flow.async_configure(
|
|
||||||
# result["flow_id"], user_input=MOCK_PRESENCE_CONFIG
|
|
||||||
# )
|
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||||
assert result["step_id"] == "advanced"
|
assert result["step_id"] == "advanced"
|
||||||
assert result["errors"] == {}
|
assert result["errors"] == {}
|
||||||
|
|||||||
@@ -43,10 +43,11 @@ async def test_movement_management_time_not_enough(
|
|||||||
CONF_TPI_COEF_INT: 0.3,
|
CONF_TPI_COEF_INT: 0.3,
|
||||||
CONF_TPI_COEF_EXT: 0.01,
|
CONF_TPI_COEF_EXT: 0.01,
|
||||||
CONF_MINIMAL_ACTIVATION_DELAY: 30,
|
CONF_MINIMAL_ACTIVATION_DELAY: 30,
|
||||||
CONF_SECURITY_DELAY_MIN: 5,
|
CONF_SECURITY_DELAY_MIN: 10,
|
||||||
CONF_SECURITY_MIN_ON_PERCENT: 0.3,
|
CONF_SECURITY_MIN_ON_PERCENT: 0.3,
|
||||||
CONF_MOTION_SENSOR: "binary_sensor.mock_motion_sensor",
|
CONF_MOTION_SENSOR: "binary_sensor.mock_motion_sensor",
|
||||||
CONF_MOTION_DELAY: 0, # important to not been obliged to wait
|
CONF_MOTION_DELAY: 10, # important to not been obliged to wait
|
||||||
|
CONF_MOTION_OFF_DELAY: 30,
|
||||||
CONF_MOTION_PRESET: "boost",
|
CONF_MOTION_PRESET: "boost",
|
||||||
CONF_NO_MOTION_PRESET: "comfort",
|
CONF_NO_MOTION_PRESET: "comfort",
|
||||||
CONF_PRESENCE_SENSOR: "binary_sensor.mock_presence_sensor",
|
CONF_PRESENCE_SENSOR: "binary_sensor.mock_presence_sensor",
|
||||||
@@ -61,7 +62,7 @@ async def test_movement_management_time_not_enough(
|
|||||||
tz = get_tz(hass) # pylint: disable=invalid-name
|
tz = get_tz(hass) # pylint: disable=invalid-name
|
||||||
now: datetime = datetime.now(tz=tz)
|
now: datetime = datetime.now(tz=tz)
|
||||||
|
|
||||||
# start heating, in boost mode. We block the control_heating to avoid running a cycle
|
# start heating, in boost mode, when someone is present. We block the control_heating to avoid running a cycle
|
||||||
with patch(
|
with patch(
|
||||||
"custom_components.versatile_thermostat.climate.VersatileThermostat._async_control_heating"
|
"custom_components.versatile_thermostat.climate.VersatileThermostat._async_control_heating"
|
||||||
):
|
):
|
||||||
@@ -75,14 +76,14 @@ async def test_movement_management_time_not_enough(
|
|||||||
assert entity.motion_state is None
|
assert entity.motion_state is None
|
||||||
assert entity.presence_state is None
|
assert entity.presence_state is None
|
||||||
|
|
||||||
event_timestamp = now - timedelta(minutes=4)
|
event_timestamp = now - timedelta(minutes=5)
|
||||||
await send_temperature_change_event(entity, 18, event_timestamp)
|
await send_temperature_change_event(entity, 18, event_timestamp)
|
||||||
await send_ext_temperature_change_event(entity, 10, event_timestamp)
|
await send_ext_temperature_change_event(entity, 10, event_timestamp)
|
||||||
|
|
||||||
await send_presence_change_event(entity, True, False, event_timestamp)
|
await send_presence_change_event(entity, True, False, event_timestamp)
|
||||||
assert entity.presence_state is "on"
|
assert entity.presence_state is "on"
|
||||||
|
|
||||||
# starts detecting motion
|
# starts detecting motion with time not enough
|
||||||
with patch(
|
with patch(
|
||||||
"custom_components.versatile_thermostat.climate.VersatileThermostat.send_event"
|
"custom_components.versatile_thermostat.climate.VersatileThermostat.send_event"
|
||||||
) as mock_send_event, patch(
|
) as mock_send_event, patch(
|
||||||
@@ -91,17 +92,21 @@ async def test_movement_management_time_not_enough(
|
|||||||
"custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off"
|
"custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.turn_off"
|
||||||
) as mock_heater_off, patch(
|
) as mock_heater_off, patch(
|
||||||
"custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active",
|
"custom_components.versatile_thermostat.underlyings.UnderlyingSwitch.is_device_active",
|
||||||
return_value=True,
|
return_value=False,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.helpers.condition.state", return_value=False
|
"homeassistant.helpers.condition.state", return_value=False
|
||||||
):
|
) as mock_condition:
|
||||||
event_timestamp = now - timedelta(minutes=3)
|
event_timestamp = now - timedelta(minutes=4)
|
||||||
await send_motion_change_event(entity, True, False, event_timestamp)
|
try_condition = await send_motion_change_event(entity, True, False, event_timestamp)
|
||||||
|
|
||||||
|
# Will return False -> we will stay on movement False
|
||||||
|
await try_condition(None)
|
||||||
|
|
||||||
assert entity.hvac_mode is HVACMode.HEAT
|
assert entity.hvac_mode is HVACMode.HEAT
|
||||||
assert entity.preset_mode is PRESET_ACTIVITY
|
assert entity.preset_mode is PRESET_ACTIVITY
|
||||||
# because no motion is detected yet
|
# because no motion is detected yet
|
||||||
assert entity.target_temperature == 18
|
assert entity.target_temperature == 18
|
||||||
|
# state is not changed if time is not enough
|
||||||
assert entity.motion_state is None
|
assert entity.motion_state is None
|
||||||
assert entity.presence_state is "on"
|
assert entity.presence_state is "on"
|
||||||
|
|
||||||
@@ -111,7 +116,65 @@ async def test_movement_management_time_not_enough(
|
|||||||
assert mock_heater_off.call_count == 0
|
assert mock_heater_off.call_count == 0
|
||||||
assert mock_send_event.call_count == 0
|
assert mock_send_event.call_count == 0
|
||||||
|
|
||||||
# stop detecting motion with confirmation of stop
|
# starts detecting motion with time enough this time
|
||||||
|
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
|
||||||
|
) as mock_condition:
|
||||||
|
event_timestamp = now - timedelta(minutes=3)
|
||||||
|
try_condition = await send_motion_change_event(entity, True, False, event_timestamp)
|
||||||
|
|
||||||
|
# Will return True -> we will switch to movement On
|
||||||
|
await try_condition(None)
|
||||||
|
|
||||||
|
assert entity.hvac_mode is HVACMode.HEAT
|
||||||
|
assert entity.preset_mode is PRESET_ACTIVITY
|
||||||
|
# because motion is detected yet
|
||||||
|
assert entity.target_temperature == 19
|
||||||
|
assert entity.motion_state is "on"
|
||||||
|
assert entity.presence_state is "on"
|
||||||
|
|
||||||
|
# stop detecting motion with off delay too low
|
||||||
|
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=False
|
||||||
|
) as mock_condition:
|
||||||
|
event_timestamp = now - timedelta(minutes=2)
|
||||||
|
try_condition = await send_motion_change_event(entity, False, True, event_timestamp)
|
||||||
|
|
||||||
|
# Will return False -> we will stay to movement On
|
||||||
|
await try_condition(None)
|
||||||
|
|
||||||
|
assert entity.hvac_mode is HVACMode.HEAT
|
||||||
|
assert entity.preset_mode is PRESET_ACTIVITY
|
||||||
|
# because no motion is detected yet
|
||||||
|
assert entity.target_temperature == 19
|
||||||
|
assert entity.motion_state is "on"
|
||||||
|
assert entity.presence_state is "on"
|
||||||
|
|
||||||
|
assert mock_send_event.call_count == 0
|
||||||
|
# The heater must heat now
|
||||||
|
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 off delay enough long
|
||||||
with patch(
|
with patch(
|
||||||
"custom_components.versatile_thermostat.climate.VersatileThermostat.send_event"
|
"custom_components.versatile_thermostat.climate.VersatileThermostat.send_event"
|
||||||
) as mock_send_event, patch(
|
) as mock_send_event, patch(
|
||||||
@@ -124,8 +187,11 @@ async def test_movement_management_time_not_enough(
|
|||||||
) as mock_device_active, patch(
|
) as mock_device_active, patch(
|
||||||
"homeassistant.helpers.condition.state", return_value=True
|
"homeassistant.helpers.condition.state", return_value=True
|
||||||
) as mock_condition:
|
) as mock_condition:
|
||||||
event_timestamp = now - timedelta(minutes=2)
|
event_timestamp = now - timedelta(minutes=1)
|
||||||
await send_motion_change_event(entity, False, True, event_timestamp)
|
try_condition = await send_motion_change_event(entity, False, True, event_timestamp)
|
||||||
|
|
||||||
|
# Will return True -> we will switch to movement Off
|
||||||
|
await try_condition(None)
|
||||||
|
|
||||||
assert entity.hvac_mode is HVACMode.HEAT
|
assert entity.hvac_mode is HVACMode.HEAT
|
||||||
assert entity.preset_mode is PRESET_ACTIVITY
|
assert entity.preset_mode is PRESET_ACTIVITY
|
||||||
@@ -135,9 +201,8 @@ async def test_movement_management_time_not_enough(
|
|||||||
assert entity.presence_state is "on"
|
assert entity.presence_state is "on"
|
||||||
|
|
||||||
assert mock_send_event.call_count == 0
|
assert mock_send_event.call_count == 0
|
||||||
# Change is not confirmed
|
# The heater must stop heating now
|
||||||
assert mock_heater_on.call_count == 0
|
assert mock_heater_on.call_count == 0
|
||||||
# Because device is active
|
|
||||||
assert mock_heater_off.call_count == 1
|
assert mock_heater_off.call_count == 1
|
||||||
assert mock_send_event.call_count == 0
|
assert mock_send_event.call_count == 0
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
"cycle_min": "Cycle duration (minutes)",
|
"cycle_min": "Cycle duration (minutes)",
|
||||||
"temp_min": "Minimal temperature allowed",
|
"temp_min": "Minimal temperature allowed",
|
||||||
"temp_max": "Maximal temperature allowed",
|
"temp_max": "Maximal temperature allowed",
|
||||||
"device_power": "Device power (kW)",
|
"device_power": "Device power",
|
||||||
"use_window_feature": "Use window detection",
|
"use_window_feature": "Use window detection",
|
||||||
"use_motion_feature": "Use motion detection",
|
"use_motion_feature": "Use motion detection",
|
||||||
"use_power_feature": "Use power management",
|
"use_power_feature": "Use power management",
|
||||||
@@ -25,12 +25,12 @@
|
|||||||
"title": "Linked entities",
|
"title": "Linked entities",
|
||||||
"description": "Linked entities attributes",
|
"description": "Linked entities attributes",
|
||||||
"data": {
|
"data": {
|
||||||
"heater_entity_id": "Heater switch",
|
"heater_entity_id": "1rst heater switch",
|
||||||
"heater_entity2_id": "2nd heater switch",
|
"heater_entity2_id": "2nd heater switch",
|
||||||
"heater_entity3_id": "3rd heater switch",
|
"heater_entity3_id": "3rd heater switch",
|
||||||
"heater_entity4_id": "4th heater switch",
|
"heater_entity4_id": "4th heater switch",
|
||||||
"proportional_function": "Algorithm",
|
"proportional_function": "Algorithm",
|
||||||
"climate_entity_id": "Underlying climate",
|
"climate_entity_id": "1rst underlying climate",
|
||||||
"climate_entity2_id": "2nd underlying climate",
|
"climate_entity2_id": "2nd underlying climate",
|
||||||
"climate_entity3_id": "3rd underlying climate",
|
"climate_entity3_id": "3rd underlying climate",
|
||||||
"climate_entity4_id": "4th underlying climate",
|
"climate_entity4_id": "4th underlying climate",
|
||||||
@@ -92,7 +92,15 @@
|
|||||||
"description": "Motion sensor management. Preset can switch automatically depending of a motion detection\nLeave corresponding entity_id empty if not used.\nmotion_preset and no_motion_preset should be set to the corresponding preset name",
|
"description": "Motion sensor management. Preset can switch automatically depending of a motion detection\nLeave corresponding entity_id empty if not used.\nmotion_preset and no_motion_preset should be set to the corresponding preset name",
|
||||||
"data": {
|
"data": {
|
||||||
"motion_sensor_entity_id": "Motion sensor entity id",
|
"motion_sensor_entity_id": "Motion sensor entity id",
|
||||||
"motion_delay": "Motion delay (seconds)",
|
"motion_delay": "Activation delay",
|
||||||
|
"motion_off_delay": "Deactivation delay",
|
||||||
|
"motion_preset": "Motion preset",
|
||||||
|
"no_motion_preset": "No motion preset"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
|
"motion_sensor_entity_id": "The entity id of the motion sensor",
|
||||||
|
"motion_delay": "Motion activation activation delay (seconds)",
|
||||||
|
"motion_off_delay": "Motion deactivation delay (seconds)",
|
||||||
"motion_preset": "Preset to use when motion is detected",
|
"motion_preset": "Preset to use when motion is detected",
|
||||||
"no_motion_preset": "Preset to use when no motion is detected"
|
"no_motion_preset": "Preset to use when no motion is detected"
|
||||||
}
|
}
|
||||||
@@ -110,7 +118,7 @@
|
|||||||
"title": "Presence management",
|
"title": "Presence management",
|
||||||
"description": "Presence management attributes.\nGives the a presence sensor of your home (true is someone is present).\nThen specify either the preset to use when presence sensor is false or the offset in temperature to apply.\nIf preset is given, the offset will not be used.\nLeave corresponding entity_id empty if not used.",
|
"description": "Presence management attributes.\nGives the a presence sensor of your home (true is someone is present).\nThen specify either the preset to use when presence sensor is false or the offset in temperature to apply.\nIf preset is given, the offset will not be used.\nLeave corresponding entity_id empty if not used.",
|
||||||
"data": {
|
"data": {
|
||||||
"presence_sensor_entity_id": "Presence sensor entity id (true is present)",
|
"presence_sensor_entity_id": "Presence sensor entity id",
|
||||||
"eco_away_temp": "Temperature in Eco preset when no presence",
|
"eco_away_temp": "Temperature in Eco preset when no presence",
|
||||||
"comfort_away_temp": "Temperature in Comfort preset when no presence",
|
"comfort_away_temp": "Temperature in Comfort preset when no presence",
|
||||||
"boost_away_temp": "Temperature in Boost preset when no presence",
|
"boost_away_temp": "Temperature in Boost preset when no presence",
|
||||||
@@ -125,7 +133,7 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"minimal_activation_delay": "Minimal activation delay",
|
"minimal_activation_delay": "Minimal activation delay",
|
||||||
"security_delay_min": "Security delay (in minutes)",
|
"security_delay_min": "Security delay (in minutes)",
|
||||||
"security_min_on_percent": "Minimal power percent for security mode",
|
"security_min_on_percent": "Minimal power percent to enable security mode",
|
||||||
"security_default_on_percent": "Power percent to use in security mode"
|
"security_default_on_percent": "Power percent to use in security mode"
|
||||||
},
|
},
|
||||||
"data_description": {
|
"data_description": {
|
||||||
@@ -237,7 +245,15 @@
|
|||||||
"description": "Motion sensor management. Preset can switch automatically depending of a motion detection\nLeave corresponding entity_id empty if not used.\nmotion_preset and no_motion_preset should be set to the corresponding preset name",
|
"description": "Motion sensor management. Preset can switch automatically depending of a motion detection\nLeave corresponding entity_id empty if not used.\nmotion_preset and no_motion_preset should be set to the corresponding preset name",
|
||||||
"data": {
|
"data": {
|
||||||
"motion_sensor_entity_id": "Motion sensor entity id",
|
"motion_sensor_entity_id": "Motion sensor entity id",
|
||||||
"motion_delay": "Motion delay (seconds)",
|
"motion_delay": "Activation delay",
|
||||||
|
"motion_off_delay": "Deactivation delay",
|
||||||
|
"motion_preset": "Motion preset",
|
||||||
|
"no_motion_preset": "No motion preset"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
|
"motion_sensor_entity_id": "The entity id of the motion sensor",
|
||||||
|
"motion_delay": "Motion activation activation delay (seconds)",
|
||||||
|
"motion_off_delay": "Motion deactivation delay (seconds)",
|
||||||
"motion_preset": "Preset to use when motion is detected",
|
"motion_preset": "Preset to use when motion is detected",
|
||||||
"no_motion_preset": "Preset to use when no motion is detected"
|
"no_motion_preset": "Preset to use when no motion is detected"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,9 @@
|
|||||||
"description": "Principaux attributs obligatoires",
|
"description": "Principaux attributs obligatoires",
|
||||||
"data": {
|
"data": {
|
||||||
"name": "Nom",
|
"name": "Nom",
|
||||||
|
"thermostat_type": "Type de thermostat",
|
||||||
"temperature_sensor_entity_id": "Température sensor entity id",
|
"temperature_sensor_entity_id": "Température sensor entity id",
|
||||||
"external_temperature_sensor_entity_id": "Temperature exterieure sensor entity id",
|
"external_temperature_sensor_entity_id": "Température exterieure sensor entity id",
|
||||||
"cycle_min": "Durée du cycle (minutes)",
|
"cycle_min": "Durée du cycle (minutes)",
|
||||||
"temp_min": "Température minimale permise",
|
"temp_min": "Température minimale permise",
|
||||||
"temp_max": "Température maximale permise",
|
"temp_max": "Température maximale permise",
|
||||||
@@ -74,7 +75,7 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"window_sensor_entity_id": "Détecteur d'ouverture (entity id)",
|
"window_sensor_entity_id": "Détecteur d'ouverture (entity id)",
|
||||||
"window_delay": "Délai avant extinction (secondes)",
|
"window_delay": "Délai avant extinction (secondes)",
|
||||||
"window_auto_open_threshold": "seuil haut de chute de température pour la détection automatique (en °/min)",
|
"window_auto_open_threshold": "Seuil haut de chute de température pour la détection automatique (en °/min)",
|
||||||
"window_auto_close_threshold": "Seuil bas de chute de température pour la fin de détection automatique (en °/min)",
|
"window_auto_close_threshold": "Seuil bas de chute de température pour la fin de détection automatique (en °/min)",
|
||||||
"window_auto_max_duration": "Durée maximum d'une extinction automatique (en min)"
|
"window_auto_max_duration": "Durée maximum d'une extinction automatique (en min)"
|
||||||
},
|
},
|
||||||
@@ -90,8 +91,16 @@
|
|||||||
"title": "Gestion de la détection de mouvement",
|
"title": "Gestion de la détection de mouvement",
|
||||||
"description": "Le preset s'ajuste automatiquement si un mouvement est détecté\nLaissez l'entity id vide si non utilisé.\n'Preset mouvement' et 'Preset sans mouvement' doivent être choisis avec les preset à utiliser.",
|
"description": "Le preset s'ajuste automatiquement si un mouvement est détecté\nLaissez l'entity id vide si non utilisé.\n'Preset mouvement' et 'Preset sans mouvement' doivent être choisis avec les preset à utiliser.",
|
||||||
"data": {
|
"data": {
|
||||||
|
"motion_sensor_entity_id": "Détecteur de mouvement",
|
||||||
|
"motion_delay": "Délai d'activation",
|
||||||
|
"motion_off_delay": "Délai de désactivation",
|
||||||
|
"motion_preset": "Preset si mouvement",
|
||||||
|
"no_motion_preset": "Preset si pas de mouvement"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
"motion_sensor_entity_id": "Détecteur de mouvement entity id",
|
"motion_sensor_entity_id": "Détecteur de mouvement entity id",
|
||||||
"motion_delay": "Délai avant changement (seconds)",
|
"motion_delay": "Délai avant activation lorsqu'un mouvement est détecté (secondss)",
|
||||||
|
"motion_off_delai": "Délai avant désactivation lorsqu'aucun mouvement n'est détecté (secondes)",
|
||||||
"motion_preset": "Preset à utiliser si mouvement détecté",
|
"motion_preset": "Preset à utiliser si mouvement détecté",
|
||||||
"no_motion_preset": "Preset à utiliser si pas de mouvement détecté"
|
"no_motion_preset": "Preset à utiliser si pas de mouvement détecté"
|
||||||
}
|
}
|
||||||
@@ -236,8 +245,16 @@
|
|||||||
"title": "Gestion de la détection de mouvement",
|
"title": "Gestion de la détection de mouvement",
|
||||||
"description": "Le preset s'ajuste automatiquement si un mouvement est détecté\nLaissez l'entity id vide si non utilisé.\n'Preset mouvement' et 'Preset sans mouvement' doivent être choisis avec les preset à utiliser.",
|
"description": "Le preset s'ajuste automatiquement si un mouvement est détecté\nLaissez l'entity id vide si non utilisé.\n'Preset mouvement' et 'Preset sans mouvement' doivent être choisis avec les preset à utiliser.",
|
||||||
"data": {
|
"data": {
|
||||||
|
"motion_sensor_entity_id": "Détecteur de mouvement",
|
||||||
|
"motion_delay": "Délai d'activation",
|
||||||
|
"motion_off_delay": "Délai de désactivation",
|
||||||
|
"motion_preset": "Preset si mouvement",
|
||||||
|
"no_motion_preset": "Preset si pas de mouvement"
|
||||||
|
},
|
||||||
|
"data_description": {
|
||||||
"motion_sensor_entity_id": "Détecteur de mouvement entity id",
|
"motion_sensor_entity_id": "Détecteur de mouvement entity id",
|
||||||
"motion_delay": "Délai avant changement (seconds)",
|
"motion_delay": "Délai avant activation lorsqu'un mouvement est détecté (secondss)",
|
||||||
|
"motion_off_delai": "Délai avant désactivation lorsqu'aucun mouvement n'est détecté (secondes)",
|
||||||
"motion_preset": "Preset à utiliser si mouvement détecté",
|
"motion_preset": "Preset à utiliser si mouvement détecté",
|
||||||
"no_motion_preset": "Preset à utiliser si pas de mouvement détecté"
|
"no_motion_preset": "Preset à utiliser si pas de mouvement détecté"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,6 +93,7 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"motion_sensor_entity_id": "Entity id sensore di movimento",
|
"motion_sensor_entity_id": "Entity id sensore di movimento",
|
||||||
"motion_delay": "Ritardo in secondi prima che il rilevamento del sensore sia preso in considerazione",
|
"motion_delay": "Ritardo in secondi prima che il rilevamento del sensore sia preso in considerazione",
|
||||||
|
"motion_off_delay": "Ritardo in secondi di disattivazione prima che del sensore sia preso in considerazione",
|
||||||
"motion_preset": "Preset da utilizzare quando viene rilevato il movimento",
|
"motion_preset": "Preset da utilizzare quando viene rilevato il movimento",
|
||||||
"no_motion_preset": "Preset da utilizzare quando non viene rilevato il movimento"
|
"no_motion_preset": "Preset da utilizzare quando non viene rilevato il movimento"
|
||||||
}
|
}
|
||||||
@@ -238,6 +239,7 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"motion_sensor_entity_id": "Entity id sensore di movimento",
|
"motion_sensor_entity_id": "Entity id sensore di movimento",
|
||||||
"motion_delay": "Ritardo in secondi prima che il rilevamento del sensore sia preso in considerazione",
|
"motion_delay": "Ritardo in secondi prima che il rilevamento del sensore sia preso in considerazione",
|
||||||
|
"motion_off_delay": "Ritardo in secondi di disattivazione prima che del sensore sia preso in considerazione",
|
||||||
"motion_preset": "Preset da utilizzare quando viene rilevato il movimento",
|
"motion_preset": "Preset da utilizzare quando viene rilevato il movimento",
|
||||||
"no_motion_preset": "Preset da utilizzare quando non viene rilevato il movimento"
|
"no_motion_preset": "Preset da utilizzare quando non viene rilevato il movimento"
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 46 KiB |
Reference in New Issue
Block a user