Compare commits
7 Commits
7.2.1
...
jmcollin78
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4a719a660 | ||
|
|
ea0d66f0c6 | ||
|
|
641801084d | ||
|
|
1576e9c189 | ||
|
|
313fa26160 | ||
|
|
832ea78a12 | ||
|
|
5f167af331 |
@@ -44,7 +44,6 @@ class FeatureWindowManager(BaseFeatureManager):
|
|||||||
{
|
{
|
||||||
"window_sensor_entity_id",
|
"window_sensor_entity_id",
|
||||||
"is_window_configured",
|
"is_window_configured",
|
||||||
"is_window_bypass",
|
|
||||||
"window_delay_sec",
|
"window_delay_sec",
|
||||||
"window_off_delay_sec",
|
"window_off_delay_sec",
|
||||||
"window_auto_configured",
|
"window_auto_configured",
|
||||||
@@ -130,6 +129,11 @@ class FeatureWindowManager(BaseFeatureManager):
|
|||||||
@overrides
|
@overrides
|
||||||
async def start_listening(self):
|
async def start_listening(self):
|
||||||
"""Start listening the underlying entity"""
|
"""Start listening the underlying entity"""
|
||||||
|
|
||||||
|
# Try to get last window bypass state
|
||||||
|
old_state = await self._vtherm.async_get_last_state()
|
||||||
|
self._is_window_bypass = True if old_state and old_state.attributes and old_state.attributes.get("is_window_bypass") is True else False
|
||||||
|
|
||||||
if self._is_configured:
|
if self._is_configured:
|
||||||
self.stop_listening()
|
self.stop_listening()
|
||||||
if self._window_sensor_entity_id:
|
if self._window_sensor_entity_id:
|
||||||
@@ -449,22 +453,23 @@ class FeatureWindowManager(BaseFeatureManager):
|
|||||||
"""Set the window bypass flag
|
"""Set the window bypass flag
|
||||||
Return True if state have been changed"""
|
Return True if state have been changed"""
|
||||||
self._is_window_bypass = window_bypass
|
self._is_window_bypass = window_bypass
|
||||||
if not self._is_window_bypass and self._window_state:
|
|
||||||
_LOGGER.info(
|
|
||||||
"%s - Last window state was open & ByPass is now off. Set hvac_mode to '%s'",
|
|
||||||
self,
|
|
||||||
HVACMode.OFF,
|
|
||||||
)
|
|
||||||
self._vtherm.save_hvac_mode()
|
|
||||||
await self._vtherm.async_set_hvac_mode(HVACMode.OFF)
|
|
||||||
return True
|
|
||||||
|
|
||||||
if self._is_window_bypass and self._window_state:
|
if self._window_state == STATE_ON:
|
||||||
_LOGGER.info(
|
if not self._is_window_bypass:
|
||||||
"%s - Last window state was open & ByPass is now on. Set hvac_mode to last available mode",
|
_LOGGER.info(
|
||||||
self,
|
"%s - Last window state was open & ByPass is now off. Set hvac_mode to '%s'",
|
||||||
)
|
self,
|
||||||
await self._vtherm.restore_hvac_mode(True)
|
HVACMode.OFF,
|
||||||
|
)
|
||||||
|
self._vtherm.save_hvac_mode()
|
||||||
|
await self._vtherm.async_set_hvac_mode(HVACMode.OFF)
|
||||||
|
|
||||||
|
if self._is_window_bypass:
|
||||||
|
_LOGGER.info(
|
||||||
|
"%s - Last window state was open & ByPass is now on. Set hvac_mode to last available mode",
|
||||||
|
self,
|
||||||
|
)
|
||||||
|
await self._vtherm.restore_hvac_mode(True)
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -504,10 +509,10 @@ class FeatureWindowManager(BaseFeatureManager):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def is_window_detected(self) -> bool:
|
def is_window_detected(self) -> bool:
|
||||||
"""Return true if the presence is configured and presence sensor is OFF"""
|
"""Return true if the window is configured and open and bypass is not ON"""
|
||||||
return self._is_configured and (
|
return self._is_configured and (
|
||||||
self._window_state == STATE_ON or self._window_auto_state == STATE_ON
|
self._window_state == STATE_ON or self._window_auto_state == STATE_ON
|
||||||
)
|
) and not self._is_window_bypass
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def window_sensor_entity_id(self) -> bool:
|
def window_sensor_entity_id(self) -> bool:
|
||||||
|
|||||||
@@ -625,6 +625,10 @@ class ThermostatOverClimate(BaseThermostat[UnderlyingClimate]):
|
|||||||
changes = False
|
changes = False
|
||||||
new_hvac_mode = new_state.state
|
new_hvac_mode = new_state.state
|
||||||
|
|
||||||
|
# Issue #903 - patch AUTO mode
|
||||||
|
if new_hvac_mode == HVACMode.AUTO:
|
||||||
|
new_hvac_mode = HVACMode.HEAT if not self.ac_mode else HVACMode.COOL
|
||||||
|
|
||||||
old_state = event.data.get("old_state")
|
old_state = event.data.get("old_state")
|
||||||
|
|
||||||
# Issue #829 - refresh underlying command if it comes back to life
|
# Issue #829 - refresh underlying command if it comes back to life
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ The available commands depend on the type of underlying device:
|
|||||||
| Underlying Device Type | Possible On Commands | Possible Off Commands | Applies To |
|
| Underlying Device Type | Possible On Commands | Possible Off Commands | Applies To |
|
||||||
| --------------------------- | ------------------------------------- | ---------------------------------------------- | ----------------------------- |
|
| --------------------------- | ------------------------------------- | ---------------------------------------------- | ----------------------------- |
|
||||||
| `switch` or `input_boolean` | `turn_on` | `turn_off` | All switches |
|
| `switch` or `input_boolean` | `turn_on` | `turn_off` | All switches |
|
||||||
| `select` or `input_select` | `select_option/option:comfort` | `set_option/option:frost_protection` | Nodon SIN-4-FP-21 and similar |
|
| `select` or `input_select` | `select_option/option:comfort` | `select_option/option:frost_protection` | Nodon SIN-4-FP-21 and similar |
|
||||||
| `climate` (hvac_mode) | `set_hvac_mode/hvac_mode:heat` | `set_hvac_mode/hvac_mode:off` | eCosy (via Tuya Local) |
|
| `climate` (hvac_mode) | `set_hvac_mode/hvac_mode:heat` | `set_hvac_mode/hvac_mode:off` | eCosy (via Tuya Local) |
|
||||||
| `climate` (preset) | `set_preset_mode/preset_mode:comfort` | `set_preset_mode/preset_mode:frost_protection` | Heatzy |
|
| `climate` (preset) | `set_preset_mode/preset_mode:comfort` | `set_preset_mode/preset_mode:frost_protection` | Heatzy |
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ Les commandes possibles dépendent du type de sous-jacents :
|
|||||||
| type de sous-jacent | commandes d'allumage possibles | commandes d'extinction possibles | S'applique à |
|
| type de sous-jacent | commandes d'allumage possibles | commandes d'extinction possibles | S'applique à |
|
||||||
| --------------------------- | ------------------------------------- | ---------------------------------------------- | ------------------------------ |
|
| --------------------------- | ------------------------------------- | ---------------------------------------------- | ------------------------------ |
|
||||||
| `switch` ou `input_boolean` | `turn_on` | `turn_off` | tous les switchs |
|
| `switch` ou `input_boolean` | `turn_on` | `turn_off` | tous les switchs |
|
||||||
| `select` ou `input_select` | `select_option/option:comfort` | `set_option/option:frost_protection` | Nodon SIN-4-FP-21 et assimilés |
|
| `select` ou `input_select` | `select_option/option:comfort` | `select_option/option:frost_protection` | Nodon SIN-4-FP-21 et assimilés |
|
||||||
| `climate` (hvac_mode) | `set_hvac_mode/hvac_mode:heat` | `set_hvac_mode/hvac_mode:off` | eCosy (via Tuya Local) |
|
| `climate` (hvac_mode) | `set_hvac_mode/hvac_mode:heat` | `set_hvac_mode/hvac_mode:off` | eCosy (via Tuya Local) |
|
||||||
| `climate` (preset) | `set_preset_mode/preset_mode:comfort` | `set_preset_mode/preset_mode:frost_protection` | Heatzy |
|
| `climate` (preset) | `set_preset_mode/preset_mode:comfort` | `set_preset_mode/preset_mode:frost_protection` | Heatzy |
|
||||||
|
|
||||||
@@ -90,4 +90,4 @@ Si l'erreur suivante se produit :
|
|||||||
Cela signifie que une des commandes saisies est invalide. Les règles à respecter sont les suivantes :
|
Cela signifie que une des commandes saisies est invalide. Les règles à respecter sont les suivantes :
|
||||||
1. chaque commande doit avoir le format `commande[/attribut[:valeur]]` (ex: `select_option/option:comfort` ou `turn_on`) sans blanc et sans caractères spéciaux sauf '_',
|
1. chaque commande doit avoir le format `commande[/attribut[:valeur]]` (ex: `select_option/option:comfort` ou `turn_on`) sans blanc et sans caractères spéciaux sauf '_',
|
||||||
2. il doit y avoir autant de commandes qu'il y a de sous-jacents déclarés sauf si tous les sous-jacents sont des `switchs` auquel cas il n'est pas nécessaire de paramétrer les commandes,
|
2. il doit y avoir autant de commandes qu'il y a de sous-jacents déclarés sauf si tous les sous-jacents sont des `switchs` auquel cas il n'est pas nécessaire de paramétrer les commandes,
|
||||||
3. si plusieurs sous-jacents sont configurés, les commandes doivent être dans le même ordre. Le nombre de commandes d'allumage doit être égal au nombre de commandes d'extinction et de sous-jacents (dans l'ordre donc). Il est possible de mettre des sous-jacents de type différent. À partir du moment où un sous-jacent n'est pas un `switch`, il faut paramétrer toutes les commandes de tous les sous-jacents y compris des éventuels switchs.
|
3. si plusieurs sous-jacents sont configurés, les commandes doivent être dans le même ordre. Le nombre de commandes d'allumage doit être égal au nombre de commandes d'extinction et de sous-jacents (dans l'ordre donc). Il est possible de mettre des sous-jacents de type différent. À partir du moment où un sous-jacent n'est pas un `switch`, il faut paramétrer toutes les commandes de tous les sous-jacents y compris des éventuels switchs.
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
homeassistant==2025.2.1
|
homeassistant==2025.1.4
|
||||||
|
|||||||
@@ -700,7 +700,7 @@ async def test_add_number_for_over_switch_use_central_presets_and_restore(
|
|||||||
assert vtherm.use_central_config_temperature is True
|
assert vtherm.use_central_config_temperature is True
|
||||||
|
|
||||||
# We should try to restore all 4 temp entities and the VTherm itself
|
# We should try to restore all 4 temp entities and the VTherm itself
|
||||||
assert mock_restore_state.call_count == 4 + 1
|
assert mock_restore_state.call_count == 4 + 2
|
||||||
|
|
||||||
# 1. We search for NumberEntities
|
# 1. We search for NumberEntities
|
||||||
for preset_name, value in temps.items():
|
for preset_name, value in temps.items():
|
||||||
|
|||||||
Reference in New Issue
Block a user