Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f970c18eaf | |||
| af51ef62e0 | |||
| b38fbd9d78 | |||
| 6e8e72e343 |
@@ -18,7 +18,7 @@ from homeassistant.core import (
|
|||||||
from homeassistant.components.climate import ClimateEntity
|
from homeassistant.components.climate import ClimateEntity
|
||||||
from homeassistant.helpers.restore_state import RestoreEntity
|
from homeassistant.helpers.restore_state import RestoreEntity
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.helpers.entity import DeviceInfo, DeviceEntryType
|
from homeassistant.helpers.device_registry import DeviceInfo, DeviceEntryType
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.reload import async_setup_reload_service
|
from homeassistant.helpers.reload import async_setup_reload_service
|
||||||
@@ -505,7 +505,7 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
if len(presets):
|
if len(presets):
|
||||||
self._support_flags = SUPPORT_FLAGS | ClimateEntityFeature.PRESET_MODE
|
self._support_flags = SUPPORT_FLAGS | ClimateEntityFeature.PRESET_MODE
|
||||||
|
|
||||||
for key, val in CONF_PRESETS.items(): # TODO before presets.items():
|
for key, val in CONF_PRESETS.items():
|
||||||
if val != 0.0:
|
if val != 0.0:
|
||||||
self._attr_preset_modes.append(key)
|
self._attr_preset_modes.append(key)
|
||||||
|
|
||||||
@@ -1582,6 +1582,8 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
if not new_state:
|
if not new_state:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
new_hvac_mode = new_state.state
|
||||||
|
|
||||||
old_state = event.data.get("old_state")
|
old_state = event.data.get("old_state")
|
||||||
old_hvac_action = (
|
old_hvac_action = (
|
||||||
old_state.attributes.get("hvac_action")
|
old_state.attributes.get("hvac_action")
|
||||||
@@ -1594,16 +1596,21 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Issue 99 - some AC turn hvac_mode=cool and hvac_action=idle when sending a HVACMode_OFF command
|
||||||
|
if self._hvac_mode == HVACMode.OFF and new_hvac_action == HVACAction.IDLE:
|
||||||
|
_LOGGER.debug("The underlying switch to idle instead of OFF. We will consider it as OFF")
|
||||||
|
new_hvac_mode = HVACMode.OFF
|
||||||
|
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"%s - Underlying climate changed. Event.new_state is %s, current_hvac_mode=%s, new_hvac_action=%s, old_hvac_action=%s",
|
"%s - Underlying climate changed. Event.new_hvac_mode is %s, current_hvac_mode=%s, new_hvac_action=%s, old_hvac_action=%s",
|
||||||
self,
|
self,
|
||||||
new_state,
|
new_hvac_mode,
|
||||||
self._hvac_mode,
|
self._hvac_mode,
|
||||||
new_hvac_action,
|
new_hvac_action,
|
||||||
old_hvac_action,
|
old_hvac_action,
|
||||||
)
|
)
|
||||||
|
|
||||||
if new_state.state in [
|
if new_hvac_mode in [
|
||||||
HVACMode.OFF,
|
HVACMode.OFF,
|
||||||
HVACMode.HEAT,
|
HVACMode.HEAT,
|
||||||
HVACMode.COOL,
|
HVACMode.COOL,
|
||||||
@@ -1613,7 +1620,7 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
HVACMode.FAN_ONLY,
|
HVACMode.FAN_ONLY,
|
||||||
None
|
None
|
||||||
]:
|
]:
|
||||||
self._hvac_mode = new_state.state
|
self._hvac_mode = new_hvac_mode
|
||||||
|
|
||||||
# Interpretation of hvac
|
# Interpretation of hvac
|
||||||
HVAC_ACTION_ON = [ # pylint: disable=invalid-name
|
HVAC_ACTION_ON = [ # pylint: disable=invalid-name
|
||||||
@@ -2099,7 +2106,8 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
switch_cond,
|
switch_cond,
|
||||||
)
|
)
|
||||||
|
|
||||||
shouldClimateBeInSecurity = temp_cond and climate_cond
|
# Issue 99 - a climate is regulated by the device itself and not by VTherm. So a VTherm should never be in security !
|
||||||
|
shouldClimateBeInSecurity = False # temp_cond and climate_cond
|
||||||
shouldSwitchBeInSecurity = temp_cond and switch_cond
|
shouldSwitchBeInSecurity = temp_cond and switch_cond
|
||||||
shouldBeInSecurity = shouldClimateBeInSecurity or shouldSwitchBeInSecurity
|
shouldBeInSecurity = shouldClimateBeInSecurity or shouldSwitchBeInSecurity
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ from datetime import timedelta
|
|||||||
from homeassistant.core import HomeAssistant, callback, Event
|
from homeassistant.core import HomeAssistant, callback, Event
|
||||||
from homeassistant.components.climate import ClimateEntity, DOMAIN as CLIMATE_DOMAIN
|
from homeassistant.components.climate import ClimateEntity, DOMAIN as CLIMATE_DOMAIN
|
||||||
from homeassistant.helpers.entity_component import EntityComponent
|
from homeassistant.helpers.entity_component import EntityComponent
|
||||||
from homeassistant.helpers.entity import Entity, DeviceInfo, DeviceEntryType
|
from homeassistant.helpers.entity import Entity
|
||||||
|
from homeassistant.helpers.device_registry import DeviceInfo, DeviceEntryType
|
||||||
from homeassistant.helpers.event import async_track_state_change_event, async_call_later
|
from homeassistant.helpers.event import async_track_state_change_event, async_call_later
|
||||||
|
|
||||||
from .climate import VersatileThermostat
|
from .climate import VersatileThermostat
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
homeassistant
|
homeassistant==2023.9.0
|
||||||
ffmpeg
|
ffmpeg
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# -r requirements_dev.txt
|
-r requirements_dev.txt
|
||||||
# aiodiscover
|
# aiodiscover
|
||||||
ulid_transform
|
ulid_transform
|
||||||
pytest-homeassistant-custom-component
|
pytest-homeassistant-custom-component
|
||||||
@@ -1,120 +1,121 @@
|
|||||||
reload:
|
reload:
|
||||||
description: Reload all Versatile Thermostat entities.
|
name: Reload
|
||||||
|
description: Reload all Versatile Thermostat entities.
|
||||||
|
|
||||||
set_presence:
|
set_presence:
|
||||||
name: Set presence
|
name: Set presence
|
||||||
description: Force the presence mode in thermostat
|
description: Force the presence mode in thermostat
|
||||||
target:
|
target:
|
||||||
entity:
|
entity:
|
||||||
integration: versatile_thermostat
|
integration: versatile_thermostat
|
||||||
fields:
|
fields:
|
||||||
presence:
|
presence:
|
||||||
name: Presence
|
name: Presence
|
||||||
description: Presence setting
|
description: Presence setting
|
||||||
required: true
|
required: true
|
||||||
advanced: false
|
advanced: false
|
||||||
example: "on"
|
example: "on"
|
||||||
default: "on"
|
default: "on"
|
||||||
selector:
|
selector:
|
||||||
select:
|
select:
|
||||||
options:
|
options:
|
||||||
- "on"
|
- "on"
|
||||||
- "off"
|
- "off"
|
||||||
- "home"
|
- "home"
|
||||||
- "not_home"
|
- "not_home"
|
||||||
|
|
||||||
set_preset_temperature:
|
set_preset_temperature:
|
||||||
name: Set temperature preset
|
name: Set temperature preset
|
||||||
description: Change the target temperature of a preset
|
description: Change the target temperature of a preset
|
||||||
target:
|
target:
|
||||||
entity:
|
entity:
|
||||||
integration: versatile_thermostat
|
integration: versatile_thermostat
|
||||||
fields:
|
fields:
|
||||||
preset:
|
preset:
|
||||||
name: Preset
|
name: Preset
|
||||||
description: Preset name
|
description: Preset name
|
||||||
required: true
|
required: true
|
||||||
advanced: false
|
advanced: false
|
||||||
example: "comfort"
|
example: "comfort"
|
||||||
selector:
|
selector:
|
||||||
select:
|
select:
|
||||||
options:
|
options:
|
||||||
- "eco"
|
- "eco"
|
||||||
- "comfort"
|
- "comfort"
|
||||||
- "boost"
|
- "boost"
|
||||||
temperature:
|
temperature:
|
||||||
name: Temperature when present
|
name: Temperature when present
|
||||||
description: Target temperature for the preset when present
|
description: Target temperature for the preset when present
|
||||||
required: false
|
required: false
|
||||||
advanced: false
|
advanced: false
|
||||||
example: "19.5"
|
example: "19.5"
|
||||||
default: "17"
|
default: "17"
|
||||||
selector:
|
selector:
|
||||||
number:
|
number:
|
||||||
min: 7
|
min: 7
|
||||||
max: 35
|
max: 35
|
||||||
step: 0.1
|
step: 0.1
|
||||||
unit_of_measurement: °
|
unit_of_measurement: °
|
||||||
mode: slider
|
mode: slider
|
||||||
temperature_away:
|
temperature_away:
|
||||||
name: Temperature when not present
|
name: Temperature when not present
|
||||||
description: Target temperature for the preset when not present
|
description: Target temperature for the preset when not present
|
||||||
required: false
|
required: false
|
||||||
advanced: false
|
advanced: false
|
||||||
example: "17"
|
example: "17"
|
||||||
default: "15"
|
default: "15"
|
||||||
selector:
|
selector:
|
||||||
number:
|
number:
|
||||||
min: 7
|
min: 7
|
||||||
max: 35
|
max: 35
|
||||||
step: 0.1
|
step: 0.1
|
||||||
unit_of_measurement: °
|
unit_of_measurement: °
|
||||||
mode: slider
|
mode: slider
|
||||||
|
|
||||||
set_security:
|
set_security:
|
||||||
name: Set security
|
name: Set security
|
||||||
description: Change the security parameters
|
description: Change the security parameters
|
||||||
target:
|
target:
|
||||||
entity:
|
entity:
|
||||||
integration: versatile_thermostat
|
integration: versatile_thermostat
|
||||||
fields:
|
fields:
|
||||||
delay_min:
|
delay_min:
|
||||||
name: Delay in minutes
|
name: Delay in minutes
|
||||||
description: Maximum allowed delay in minutes between two temperature mesures
|
description: Maximum allowed delay in minutes between two temperature mesures
|
||||||
required: false
|
required: false
|
||||||
advanced: false
|
advanced: false
|
||||||
example: "30"
|
example: "30"
|
||||||
selector:
|
selector:
|
||||||
number:
|
number:
|
||||||
min: 0
|
min: 0
|
||||||
max: 9999
|
max: 9999
|
||||||
unit_of_measurement: "min"
|
unit_of_measurement: "min"
|
||||||
mode: box
|
mode: box
|
||||||
min_on_percent:
|
min_on_percent:
|
||||||
name: Minimal on_percent
|
name: Minimal on_percent
|
||||||
description: Minimal heating percent value for security preset activation
|
description: Minimal heating percent value for security preset activation
|
||||||
required: false
|
required: false
|
||||||
advanced: false
|
advanced: false
|
||||||
example: "0.5"
|
example: "0.5"
|
||||||
default: "0.5"
|
default: "0.5"
|
||||||
selector:
|
selector:
|
||||||
number:
|
number:
|
||||||
min: 0
|
min: 0
|
||||||
max: 1
|
max: 1
|
||||||
step: 0.05
|
step: 0.05
|
||||||
unit_of_measurement: "%"
|
unit_of_measurement: "%"
|
||||||
mode: slider
|
mode: slider
|
||||||
default_on_percent:
|
default_on_percent:
|
||||||
name: on_percent used in security mode
|
name: on_percent used in security mode
|
||||||
description: The default heating percent value in security preset
|
description: The default heating percent value in security preset
|
||||||
required: false
|
required: false
|
||||||
advanced: false
|
advanced: false
|
||||||
example: "0.1"
|
example: "0.1"
|
||||||
default: "0.1"
|
default: "0.1"
|
||||||
selector:
|
selector:
|
||||||
number:
|
number:
|
||||||
min: 0
|
min: 0
|
||||||
max: 1
|
max: 1
|
||||||
step: 0.05
|
step: 0.05
|
||||||
unit_of_measurement: "%"
|
unit_of_measurement: "%"
|
||||||
mode: slider
|
mode: slider
|
||||||
|
|||||||
Reference in New Issue
Block a user