issue #11 - Rename coeff_c and coeff_t to coeff_int et coeff_ext
issue #10 - Add a service to force the presence or non presence issue #07 - Make external temperature sensor mandatory for TPI mode issue #06 - Use person.xxx as presence detector directly issue #02 - Limits the usable presets issue #01 - Add a temperature configuration for present / not present for each preset
This commit is contained in:
@@ -4,6 +4,8 @@ import logging
|
|||||||
from datetime import timedelta, datetime
|
from datetime import timedelta, datetime
|
||||||
from typing import Any, Mapping
|
from typing import Any, Mapping
|
||||||
|
|
||||||
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.core import (
|
from homeassistant.core import (
|
||||||
HomeAssistant,
|
HomeAssistant,
|
||||||
callback,
|
callback,
|
||||||
@@ -23,7 +25,7 @@ from homeassistant.helpers.event import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from homeassistant.exceptions import ConditionError
|
from homeassistant.exceptions import ConditionError
|
||||||
from homeassistant.helpers import condition
|
from homeassistant.helpers import condition, entity_platform, config_validation as cv
|
||||||
|
|
||||||
from homeassistant.components.climate.const import (
|
from homeassistant.components.climate.const import (
|
||||||
ATTR_PRESET_MODE,
|
ATTR_PRESET_MODE,
|
||||||
@@ -62,6 +64,8 @@ from homeassistant.const import (
|
|||||||
ATTR_ENTITY_ID,
|
ATTR_ENTITY_ID,
|
||||||
SERVICE_TURN_OFF,
|
SERVICE_TURN_OFF,
|
||||||
SERVICE_TURN_ON,
|
SERVICE_TURN_ON,
|
||||||
|
STATE_HOME,
|
||||||
|
STATE_NOT_HOME,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
@@ -79,17 +83,17 @@ from .const import (
|
|||||||
CONF_NO_MOTION_PRESET,
|
CONF_NO_MOTION_PRESET,
|
||||||
CONF_DEVICE_POWER,
|
CONF_DEVICE_POWER,
|
||||||
CONF_PRESETS,
|
CONF_PRESETS,
|
||||||
|
CONF_PRESETS_AWAY,
|
||||||
CONF_CYCLE_MIN,
|
CONF_CYCLE_MIN,
|
||||||
CONF_PROP_FUNCTION,
|
CONF_PROP_FUNCTION,
|
||||||
CONF_PROP_BIAS,
|
CONF_TPI_COEF_INT,
|
||||||
CONF_TPI_COEF_C,
|
CONF_TPI_COEF_EXT,
|
||||||
CONF_TPI_COEF_T,
|
|
||||||
CONF_PRESENCE_SENSOR,
|
CONF_PRESENCE_SENSOR,
|
||||||
CONF_NO_PRESENCE_PRESET,
|
CONF_PRESET_POWER,
|
||||||
CONF_NO_PRESENCE_TEMP_OFFSET,
|
|
||||||
SUPPORT_FLAGS,
|
SUPPORT_FLAGS,
|
||||||
PRESET_POWER,
|
PRESET_POWER,
|
||||||
PROPORTIONAL_FUNCTION_TPI,
|
PROPORTIONAL_FUNCTION_TPI,
|
||||||
|
SERVICE_SET_PRESENCE,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .prop_algorithm import PropAlgorithm
|
from .prop_algorithm import PropAlgorithm
|
||||||
@@ -112,7 +116,6 @@ async def async_setup_entry(
|
|||||||
heater_entity_id = entry.data.get(CONF_HEATER)
|
heater_entity_id = entry.data.get(CONF_HEATER)
|
||||||
cycle_min = entry.data.get(CONF_CYCLE_MIN)
|
cycle_min = entry.data.get(CONF_CYCLE_MIN)
|
||||||
proportional_function = entry.data.get(CONF_PROP_FUNCTION)
|
proportional_function = entry.data.get(CONF_PROP_FUNCTION)
|
||||||
proportional_bias = entry.data.get(CONF_PROP_BIAS)
|
|
||||||
temp_sensor_entity_id = entry.data.get(CONF_TEMP_SENSOR)
|
temp_sensor_entity_id = entry.data.get(CONF_TEMP_SENSOR)
|
||||||
ext_temp_sensor_entity_id = entry.data.get(CONF_EXTERNAL_TEMP_SENSOR)
|
ext_temp_sensor_entity_id = entry.data.get(CONF_EXTERNAL_TEMP_SENSOR)
|
||||||
power_sensor_entity_id = entry.data.get(CONF_POWER_SENSOR)
|
power_sensor_entity_id = entry.data.get(CONF_POWER_SENSOR)
|
||||||
@@ -124,11 +127,10 @@ async def async_setup_entry(
|
|||||||
motion_preset = entry.data.get(CONF_MOTION_PRESET)
|
motion_preset = entry.data.get(CONF_MOTION_PRESET)
|
||||||
no_motion_preset = entry.data.get(CONF_NO_MOTION_PRESET)
|
no_motion_preset = entry.data.get(CONF_NO_MOTION_PRESET)
|
||||||
device_power = entry.data.get(CONF_DEVICE_POWER)
|
device_power = entry.data.get(CONF_DEVICE_POWER)
|
||||||
tpi_coefc = entry.data.get(CONF_TPI_COEF_C)
|
tpi_coef_int = entry.data.get(CONF_TPI_COEF_INT)
|
||||||
tpi_coeft = entry.data.get(CONF_TPI_COEF_T)
|
tpi_coef_ext = entry.data.get(CONF_TPI_COEF_EXT)
|
||||||
presence_sensor_entity_id = entry.data.get(CONF_PRESENCE_SENSOR)
|
presence_sensor_entity_id = entry.data.get(CONF_PRESENCE_SENSOR)
|
||||||
no_presence_preset = entry.data.get(CONF_NO_PRESENCE_PRESET)
|
power_temp = entry.data.get(CONF_PRESET_POWER)
|
||||||
no_presence_offset = entry.data.get(CONF_NO_PRESENCE_TEMP_OFFSET)
|
|
||||||
|
|
||||||
presets = {}
|
presets = {}
|
||||||
for (key, value) in CONF_PRESETS.items():
|
for (key, value) in CONF_PRESETS.items():
|
||||||
@@ -138,6 +140,14 @@ async def async_setup_entry(
|
|||||||
else:
|
else:
|
||||||
_LOGGER.debug("value %s not found in Entry", value)
|
_LOGGER.debug("value %s not found in Entry", value)
|
||||||
|
|
||||||
|
presets_away = {}
|
||||||
|
for (key, value) in CONF_PRESETS_AWAY.items():
|
||||||
|
_LOGGER.debug("looking for key=%s, value=%s", key, value)
|
||||||
|
if value in entry.data:
|
||||||
|
presets_away[key] = entry.data.get(value)
|
||||||
|
else:
|
||||||
|
_LOGGER.debug("value %s not found in Entry", value)
|
||||||
|
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
[
|
[
|
||||||
VersatileThermostat(
|
VersatileThermostat(
|
||||||
@@ -147,7 +157,6 @@ async def async_setup_entry(
|
|||||||
heater_entity_id,
|
heater_entity_id,
|
||||||
cycle_min,
|
cycle_min,
|
||||||
proportional_function,
|
proportional_function,
|
||||||
proportional_bias,
|
|
||||||
temp_sensor_entity_id,
|
temp_sensor_entity_id,
|
||||||
ext_temp_sensor_entity_id,
|
ext_temp_sensor_entity_id,
|
||||||
power_sensor_entity_id,
|
power_sensor_entity_id,
|
||||||
@@ -159,17 +168,29 @@ async def async_setup_entry(
|
|||||||
motion_preset,
|
motion_preset,
|
||||||
no_motion_preset,
|
no_motion_preset,
|
||||||
presets,
|
presets,
|
||||||
|
presets_away,
|
||||||
device_power,
|
device_power,
|
||||||
tpi_coefc,
|
tpi_coef_int,
|
||||||
tpi_coeft,
|
tpi_coef_ext,
|
||||||
presence_sensor_entity_id,
|
presence_sensor_entity_id,
|
||||||
no_presence_preset,
|
power_temp,
|
||||||
no_presence_offset,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
True,
|
True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Add services
|
||||||
|
platform = entity_platform.async_get_current_platform()
|
||||||
|
platform.async_register_entity_service(
|
||||||
|
SERVICE_SET_PRESENCE,
|
||||||
|
{
|
||||||
|
vol.Required("presence"): vol.In(
|
||||||
|
[STATE_ON, STATE_OFF, STATE_HOME, STATE_NOT_HOME]
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"service_set_presence",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class VersatileThermostat(ClimateEntity, RestoreEntity):
|
class VersatileThermostat(ClimateEntity, RestoreEntity):
|
||||||
"""Representation of a Versatile Thermostat device."""
|
"""Representation of a Versatile Thermostat device."""
|
||||||
@@ -187,7 +208,6 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
heater_entity_id,
|
heater_entity_id,
|
||||||
cycle_min,
|
cycle_min,
|
||||||
proportional_function,
|
proportional_function,
|
||||||
proportional_bias,
|
|
||||||
temp_sensor_entity_id,
|
temp_sensor_entity_id,
|
||||||
ext_temp_sensor_entity_id,
|
ext_temp_sensor_entity_id,
|
||||||
power_sensor_entity_id,
|
power_sensor_entity_id,
|
||||||
@@ -199,12 +219,12 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
motion_preset,
|
motion_preset,
|
||||||
no_motion_preset,
|
no_motion_preset,
|
||||||
presets,
|
presets,
|
||||||
|
presets_away,
|
||||||
device_power,
|
device_power,
|
||||||
tpi_coefc,
|
tpi_coef_int,
|
||||||
tpi_coeft,
|
tpi_coef_ext,
|
||||||
presence_sensor_entity_id,
|
presence_sensor_entity_id,
|
||||||
no_presence_preset,
|
power_temp,
|
||||||
no_presence_offset,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize the thermostat."""
|
"""Initialize the thermostat."""
|
||||||
|
|
||||||
@@ -218,7 +238,6 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
self._heater_entity_id = heater_entity_id
|
self._heater_entity_id = heater_entity_id
|
||||||
self._cycle_min = cycle_min
|
self._cycle_min = cycle_min
|
||||||
self._proportional_function = proportional_function
|
self._proportional_function = proportional_function
|
||||||
self._proportional_bias = proportional_bias
|
|
||||||
self._temp_sensor_entity_id = temp_sensor_entity_id
|
self._temp_sensor_entity_id = temp_sensor_entity_id
|
||||||
self._ext_temp_sensor_entity_id = ext_temp_sensor_entity_id
|
self._ext_temp_sensor_entity_id = ext_temp_sensor_entity_id
|
||||||
self._power_sensor_entity_id = power_sensor_entity_id
|
self._power_sensor_entity_id = power_sensor_entity_id
|
||||||
@@ -230,22 +249,12 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
self._motion_delay_sec = motion_delay_sec
|
self._motion_delay_sec = motion_delay_sec
|
||||||
self._motion_preset = motion_preset
|
self._motion_preset = motion_preset
|
||||||
self._no_motion_preset = no_motion_preset
|
self._no_motion_preset = no_motion_preset
|
||||||
self._tpi_coefc = tpi_coefc
|
self._tpi_coef_int = tpi_coef_int
|
||||||
self._tpi_coeft = tpi_coeft
|
self._tpi_coef_ext = tpi_coef_ext
|
||||||
self._presence_sensor_entity_id = presence_sensor_entity_id
|
self._presence_sensor_entity_id = presence_sensor_entity_id
|
||||||
self._no_presence_preset = no_presence_preset
|
self._power_temp = power_temp
|
||||||
self._no_presence_offset = no_presence_offset
|
|
||||||
|
|
||||||
self._presence_on = self._presence_sensor_entity_id and (
|
self._presence_on = self._presence_sensor_entity_id != None
|
||||||
self._no_presence_preset is not None or self._no_presence_offset is not None
|
|
||||||
)
|
|
||||||
if self._presence_on:
|
|
||||||
if self._no_presence_preset is not None:
|
|
||||||
self._no_presence_offset = 0
|
|
||||||
else:
|
|
||||||
self._no_presence_preset = None
|
|
||||||
self._no_presence_offset = 0
|
|
||||||
_LOGGER.info("%s - Presence management is not fully configured.", self)
|
|
||||||
|
|
||||||
# TODO if self.ac_mode:
|
# TODO if self.ac_mode:
|
||||||
# self.hvac_list = [HVAC_MODE_COOL, HVAC_MODE_OFF]
|
# self.hvac_list = [HVAC_MODE_COOL, HVAC_MODE_OFF]
|
||||||
@@ -267,7 +276,14 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
_LOGGER.debug("No preset_modes")
|
_LOGGER.debug("No preset_modes")
|
||||||
self._attr_preset_modes = [PRESET_NONE]
|
self._attr_preset_modes = [PRESET_NONE]
|
||||||
self._presets = presets
|
self._presets = presets
|
||||||
_LOGGER.debug("%s - presets are set to: %s", self, self._presets)
|
self._presets_away = presets_away
|
||||||
|
|
||||||
|
_LOGGER.debug(
|
||||||
|
"%s - presets are set to: %s, away: %s",
|
||||||
|
self,
|
||||||
|
self._presets,
|
||||||
|
self._presets_away,
|
||||||
|
)
|
||||||
# Will be restored if possible
|
# Will be restored if possible
|
||||||
self._attr_preset_mode = None
|
self._attr_preset_mode = None
|
||||||
self._saved_preset_mode = None
|
self._saved_preset_mode = None
|
||||||
@@ -306,14 +322,13 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Using TPI function but not external temperature sensor is set. Removing the delta temp ext factor. Thermostat will not be fully operationnal" # pylint: disable=line-too-long
|
"Using TPI function but not external temperature sensor is set. Removing the delta temp ext factor. Thermostat will not be fully operationnal" # pylint: disable=line-too-long
|
||||||
)
|
)
|
||||||
self._tpi_coeft = 0
|
self._tpi_coef_ext = 0
|
||||||
|
|
||||||
# Initiate the ProportionalAlgorithm
|
# Initiate the ProportionalAlgorithm
|
||||||
self._prop_algorithm = PropAlgorithm(
|
self._prop_algorithm = PropAlgorithm(
|
||||||
self._proportional_function,
|
self._proportional_function,
|
||||||
self._proportional_bias,
|
self._tpi_coef_int,
|
||||||
self._tpi_coefc,
|
self._tpi_coef_ext,
|
||||||
self._tpi_coeft,
|
|
||||||
self._cycle_min,
|
self._cycle_min,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -452,9 +467,7 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
self._target_temp = self._presets[preset_mode]
|
self._target_temp = self._presets[preset_mode]
|
||||||
|
|
||||||
# Don't saved preset_mode if we are in POWER mode or in Away mode and presence detection is on
|
# Don't saved preset_mode if we are in POWER mode or in Away mode and presence detection is on
|
||||||
if preset_mode != PRESET_POWER and (
|
if preset_mode != PRESET_POWER:
|
||||||
not self._presence_on or preset_mode != self._no_presence_preset
|
|
||||||
):
|
|
||||||
self._saved_preset_mode = self._attr_preset_mode
|
self._saved_preset_mode = self._attr_preset_mode
|
||||||
|
|
||||||
self.recalculate()
|
self.recalculate()
|
||||||
@@ -1049,64 +1062,41 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
self._presence_state = new_state
|
self._presence_state = new_state
|
||||||
if self._attr_preset_mode == PRESET_POWER or self._presence_on is False:
|
if self._attr_preset_mode == PRESET_POWER or self._presence_on is False:
|
||||||
return
|
return
|
||||||
if new_state is None or new_state not in (STATE_OFF, STATE_ON):
|
if new_state is None or new_state not in (
|
||||||
|
STATE_OFF,
|
||||||
|
STATE_ON,
|
||||||
|
STATE_HOME,
|
||||||
|
STATE_NOT_HOME,
|
||||||
|
):
|
||||||
|
return
|
||||||
|
if self._attr_preset_mode not in [PRESET_BOOST, PRESET_COMFORT, PRESET_ECO]:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Change temperature or preset
|
# Change temperature with preset named _way
|
||||||
if self._no_presence_preset:
|
new_temp = None
|
||||||
_LOGGER.debug("%s - presence change in preset mode", self)
|
if new_state == STATE_ON or new_state == STATE_HOME:
|
||||||
new_preset = None
|
new_temp = self._presets[self._attr_preset_mode]
|
||||||
no_presence_preset = self._no_presence_preset
|
_LOGGER.info(
|
||||||
if new_state == STATE_OFF:
|
"%s - Someone is back home. Restoring temperature to %.2f",
|
||||||
new_preset = no_presence_preset
|
self,
|
||||||
self._saved_preset_mode = self._attr_preset_mode
|
new_temp,
|
||||||
_LOGGER.info(
|
)
|
||||||
"%s - No one is at home. Set to preset %s (saved_preset is %s)",
|
|
||||||
self,
|
|
||||||
new_preset,
|
|
||||||
self._saved_preset_mode,
|
|
||||||
)
|
|
||||||
elif self._attr_preset_mode == no_presence_preset:
|
|
||||||
new_preset = self._saved_preset_mode
|
|
||||||
_LOGGER.info(
|
|
||||||
"%s - Someone is back home. Restoring preset to %s",
|
|
||||||
self,
|
|
||||||
new_preset,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
_LOGGER.debug(
|
|
||||||
"%s - presence change ignored (not in %s preset or not ON)",
|
|
||||||
self,
|
|
||||||
no_presence_preset,
|
|
||||||
)
|
|
||||||
if new_preset:
|
|
||||||
self.hass.create_task(self.async_set_preset_mode(new_preset))
|
|
||||||
else:
|
else:
|
||||||
new_temp = None
|
new_temp = self._presets_away[self._attr_preset_mode + "_away"]
|
||||||
if new_state == STATE_OFF:
|
_LOGGER.info(
|
||||||
self._saved_target_temp = self._target_temp
|
"%s - No one is at home. Apply temperature %.2f",
|
||||||
_LOGGER.info(
|
self,
|
||||||
"%s - No one is at home. Apply offset to temperature %.2f (saved_target_temp is %.2f)",
|
new_temp,
|
||||||
self,
|
)
|
||||||
self._no_presence_offset,
|
|
||||||
self._saved_target_temp,
|
if new_temp is not None:
|
||||||
)
|
_LOGGER.debug(
|
||||||
new_temp = self._target_temp + self._no_presence_offset
|
"%s - presence change in temperature mode new_temp will be: %.2f",
|
||||||
else:
|
self,
|
||||||
new_temp = self._saved_target_temp
|
new_temp,
|
||||||
_LOGGER.info(
|
)
|
||||||
"%s - Someone is back home. Restoring temperature to %.2f",
|
self._target_temp = new_temp
|
||||||
self,
|
self.recalculate()
|
||||||
self._saved_target_temp,
|
|
||||||
)
|
|
||||||
if new_temp is not None:
|
|
||||||
_LOGGER.debug(
|
|
||||||
"%s - presence change in temperature mode new_temp will be: %.2f",
|
|
||||||
self,
|
|
||||||
new_temp,
|
|
||||||
)
|
|
||||||
self._target_temp = new_temp
|
|
||||||
self.recalculate()
|
|
||||||
|
|
||||||
def _update_motion_temp(self):
|
def _update_motion_temp(self):
|
||||||
"""Update the temperature considering the ACTIVITY preset and current motion state"""
|
"""Update the temperature considering the ACTIVITY preset and current motion state"""
|
||||||
@@ -1284,11 +1274,13 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
"""Update the custom extra attributes for the entity"""
|
"""Update the custom extra attributes for the entity"""
|
||||||
|
|
||||||
self._attr_extra_state_attributes = {
|
self._attr_extra_state_attributes = {
|
||||||
"away_temp": self._presets[PRESET_AWAY],
|
|
||||||
"eco_temp": self._presets[PRESET_ECO],
|
"eco_temp": self._presets[PRESET_ECO],
|
||||||
"boost_temp": self._presets[PRESET_BOOST],
|
"boost_temp": self._presets[PRESET_BOOST],
|
||||||
"comfort_temp": self._presets[PRESET_COMFORT],
|
"comfort_temp": self._presets[PRESET_COMFORT],
|
||||||
"power_temp": self._presets[PRESET_POWER],
|
"eco_away_temp": self._presets_away[PRESET_ECO + "_away"],
|
||||||
|
"boost_away_temp": self._presets_away[PRESET_BOOST + "_away"],
|
||||||
|
"comfort_away_temp": self._presets_away[PRESET_COMFORT + "_away"],
|
||||||
|
"power_temp": self._power_temp,
|
||||||
"on_percent": self._prop_algorithm.on_percent,
|
"on_percent": self._prop_algorithm.on_percent,
|
||||||
"on_time_sec": self._prop_algorithm.on_time_sec,
|
"on_time_sec": self._prop_algorithm.on_time_sec,
|
||||||
"off_time_sec": self._prop_algorithm.off_time_sec,
|
"off_time_sec": self._prop_algorithm.off_time_sec,
|
||||||
@@ -1296,18 +1288,11 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
"current_power": self._current_power,
|
"current_power": self._current_power,
|
||||||
"current_power_max": self._current_power_max,
|
"current_power_max": self._current_power_max,
|
||||||
"cycle_min": self._cycle_min,
|
"cycle_min": self._cycle_min,
|
||||||
"bias": self._proportional_bias,
|
|
||||||
"function": self._proportional_function,
|
"function": self._proportional_function,
|
||||||
"tpi_coefc": self._tpi_coefc,
|
"tpi_coef_int": self._tpi_coef_int,
|
||||||
"tpi_coeft": self._tpi_coeft,
|
"tpi_coef_ext": self._tpi_coef_ext,
|
||||||
"saved_preset_mode": self._saved_preset_mode,
|
"saved_preset_mode": self._saved_preset_mode,
|
||||||
"saved_target_temp": self._saved_target_temp,
|
"saved_target_temp": self._saved_target_temp,
|
||||||
"no_presence_preset": self._no_presence_preset
|
|
||||||
if self._presence_on
|
|
||||||
else None,
|
|
||||||
"no_presence_offset": self._no_presence_offset
|
|
||||||
if self._presence_on
|
|
||||||
else None,
|
|
||||||
"window_state": self._window_state,
|
"window_state": self._window_state,
|
||||||
"motion_state": self._motion_state,
|
"motion_state": self._motion_state,
|
||||||
"overpowering_state": self._overpowering_state,
|
"overpowering_state": self._overpowering_state,
|
||||||
@@ -1327,3 +1312,15 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
|||||||
Note: this don't work either
|
Note: this don't work either
|
||||||
"""
|
"""
|
||||||
_LOGGER.info("%s - The config entry have been updated.")
|
_LOGGER.info("%s - The config entry have been updated.")
|
||||||
|
|
||||||
|
async def service_set_presence(self, presence):
|
||||||
|
"""Called by a service call:
|
||||||
|
service: versatile_thermostat.set_presence
|
||||||
|
entity_id: climate.xxxxxx
|
||||||
|
data: {
|
||||||
|
presence: 'on'
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
_LOGGER.info("%s - Calling service_set_presence, presence: %s", self, presence)
|
||||||
|
# Do something
|
||||||
|
self._update_presence(presence)
|
||||||
|
|||||||
@@ -33,17 +33,14 @@ from .const import (
|
|||||||
CONF_NO_MOTION_PRESET,
|
CONF_NO_MOTION_PRESET,
|
||||||
CONF_DEVICE_POWER,
|
CONF_DEVICE_POWER,
|
||||||
CONF_CYCLE_MIN,
|
CONF_CYCLE_MIN,
|
||||||
|
CONF_PRESET_POWER,
|
||||||
CONF_PRESETS,
|
CONF_PRESETS,
|
||||||
|
CONF_PRESETS_AWAY,
|
||||||
CONF_PRESETS_SELECTIONABLE,
|
CONF_PRESETS_SELECTIONABLE,
|
||||||
CONF_PROP_FUNCTION,
|
CONF_PROP_FUNCTION,
|
||||||
CONF_PROP_BIAS,
|
CONF_TPI_COEF_EXT,
|
||||||
CONF_TPI_COEF_T,
|
CONF_TPI_COEF_INT,
|
||||||
CONF_TPI_COEF_C,
|
|
||||||
CONF_PRESENCE_SENSOR,
|
CONF_PRESENCE_SENSOR,
|
||||||
CONF_NO_PRESENCE_PRESET,
|
|
||||||
CONF_NO_PRESENCE_TEMP_OFFSET,
|
|
||||||
PROPORTIONAL_FUNCTION_ATAN,
|
|
||||||
PROPORTIONAL_FUNCTION_LINEAR,
|
|
||||||
PROPORTIONAL_FUNCTION_TPI,
|
PROPORTIONAL_FUNCTION_TPI,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -56,51 +53,26 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
|
|||||||
vol.Required(CONF_NAME): cv.string,
|
vol.Required(CONF_NAME): cv.string,
|
||||||
vol.Required(CONF_HEATER): cv.string,
|
vol.Required(CONF_HEATER): cv.string,
|
||||||
vol.Required(CONF_TEMP_SENSOR): cv.string,
|
vol.Required(CONF_TEMP_SENSOR): cv.string,
|
||||||
|
vol.Required(CONF_EXTERNAL_TEMP_SENSOR): cv.string,
|
||||||
vol.Required(CONF_CYCLE_MIN, default=5): cv.positive_int,
|
vol.Required(CONF_CYCLE_MIN, default=5): cv.positive_int,
|
||||||
vol.Required(CONF_PROP_FUNCTION, default=PROPORTIONAL_FUNCTION_LINEAR): vol.In(
|
vol.Required(CONF_PROP_FUNCTION, default=PROPORTIONAL_FUNCTION_TPI): vol.In(
|
||||||
[
|
[
|
||||||
PROPORTIONAL_FUNCTION_TPI,
|
PROPORTIONAL_FUNCTION_TPI,
|
||||||
PROPORTIONAL_FUNCTION_LINEAR,
|
|
||||||
PROPORTIONAL_FUNCTION_ATAN,
|
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# USER_DATA_CONF = [
|
|
||||||
# CONF_NAME,
|
|
||||||
# CONF_HEATER,
|
|
||||||
# CONF_TEMP_SENSOR,
|
|
||||||
# CONF_EXTERNAL_TEMP_SENSOR,
|
|
||||||
# CONF_CYCLE_MIN,
|
|
||||||
# CONF_PROP_FUNCTION,
|
|
||||||
# ]
|
|
||||||
|
|
||||||
STEP_P_DATA_SCHEMA = vol.Schema(
|
|
||||||
{
|
|
||||||
vol.Required(CONF_PROP_BIAS, default=0.25): vol.Coerce(float),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
# P_DATA_CONF = [
|
|
||||||
# CONF_PROP_BIAS,
|
|
||||||
# ]
|
|
||||||
|
|
||||||
STEP_TPI_DATA_SCHEMA = vol.Schema(
|
STEP_TPI_DATA_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Required(CONF_EXTERNAL_TEMP_SENSOR): cv.string,
|
vol.Required(CONF_TPI_COEF_INT, default=0.6): vol.Coerce(float),
|
||||||
vol.Required(CONF_TPI_COEF_C, default=0.6): vol.Coerce(float),
|
vol.Required(CONF_TPI_COEF_EXT, default=0.01): vol.Coerce(float),
|
||||||
vol.Required(CONF_TPI_COEF_T, default=0.01): vol.Coerce(float),
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# TPI_DATA_CONF = [
|
|
||||||
# CONF_EXTERNAL_TEMP_SENSOR,
|
|
||||||
# CONF_TPI_COEF_C,
|
|
||||||
# CONF_TPI_COEF_T,
|
|
||||||
# ]
|
|
||||||
|
|
||||||
STEP_PRESETS_DATA_SCHEMA = vol.Schema(
|
STEP_PRESETS_DATA_SCHEMA = vol.Schema(
|
||||||
{vol.Optional(v, default=17): vol.Coerce(float) for (k, v) in CONF_PRESETS.items()}
|
{vol.Optional(v, default=17): vol.Coerce(float) for (k, v) in CONF_PRESETS.items()}
|
||||||
)
|
)
|
||||||
# PRESETS_DATA_CONF = [v for (_, v) in CONF_PRESETS.items()]
|
|
||||||
|
|
||||||
STEP_WINDOW_DATA_SCHEMA = vol.Schema(
|
STEP_WINDOW_DATA_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
@@ -108,7 +80,6 @@ STEP_WINDOW_DATA_SCHEMA = vol.Schema(
|
|||||||
vol.Optional(CONF_WINDOW_DELAY, default=30): cv.positive_int,
|
vol.Optional(CONF_WINDOW_DELAY, default=30): cv.positive_int,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# WINDOW_DATA_CONF = [CONF_WINDOW_SENSOR, CONF_WINDOW_DELAY]
|
|
||||||
|
|
||||||
STEP_MOTION_DATA_SCHEMA = vol.Schema(
|
STEP_MOTION_DATA_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
@@ -122,30 +93,26 @@ STEP_MOTION_DATA_SCHEMA = vol.Schema(
|
|||||||
),
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# MOTION_DATA_CONF = [
|
|
||||||
# CONF_MOTION_SENSOR,
|
|
||||||
# CONF_MOTION_DELAY,
|
|
||||||
# CONF_MOTION_PRESET,
|
|
||||||
# CONF_NO_MOTION_PRESET,
|
|
||||||
# ]
|
|
||||||
|
|
||||||
STEP_POWER_DATA_SCHEMA = vol.Schema(
|
STEP_POWER_DATA_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Optional(CONF_POWER_SENSOR): cv.string,
|
vol.Optional(CONF_POWER_SENSOR): cv.string,
|
||||||
vol.Optional(CONF_MAX_POWER_SENSOR): cv.string,
|
vol.Optional(CONF_MAX_POWER_SENSOR): cv.string,
|
||||||
vol.Optional(CONF_DEVICE_POWER): vol.Coerce(float),
|
vol.Optional(CONF_DEVICE_POWER): vol.Coerce(float),
|
||||||
|
vol.Optional(CONF_PRESET_POWER): vol.Coerce(float),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# POWER_DATA_CONF = [CONF_POWER_SENSOR, CONF_MAX_POWER_SENSOR, CONF_DEVICE_POWER]
|
|
||||||
|
|
||||||
STEP_PRESENCE_DATA_SCHEMA = vol.Schema(
|
STEP_PRESENCE_DATA_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Optional(CONF_PRESENCE_SENSOR): cv.string,
|
vol.Optional(CONF_PRESENCE_SENSOR): cv.string,
|
||||||
vol.Optional(CONF_NO_PRESENCE_PRESET): vol.In(CONF_PRESETS_SELECTIONABLE),
|
}
|
||||||
vol.Optional(CONF_NO_PRESENCE_TEMP_OFFSET): vol.Coerce(float),
|
).extend(
|
||||||
|
{
|
||||||
|
vol.Optional(v, default=17): vol.Coerce(float)
|
||||||
|
for (k, v) in CONF_PRESETS_AWAY.items()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# PRESENCE_DATA_CONF = [CONF_PRESENCE_SENSOR, CONF_NO_PRESENCE_PRESET, CONF_NO_PRESENCE_TEMP_OFFSET]
|
|
||||||
|
|
||||||
|
|
||||||
def schema_defaults(schema, **defaults):
|
def schema_defaults(schema, **defaults):
|
||||||
@@ -235,24 +202,8 @@ class VersatileThermostatBaseConfigFlow(FlowHandler):
|
|||||||
"""Handle the flow steps"""
|
"""Handle the flow steps"""
|
||||||
_LOGGER.debug("Into ConfigFlow.async_step_user user_input=%s", user_input)
|
_LOGGER.debug("Into ConfigFlow.async_step_user user_input=%s", user_input)
|
||||||
|
|
||||||
async def choose_next_step():
|
|
||||||
"""Choose next configuration flow"""
|
|
||||||
_LOGGER.debug("function is %s", self._infos.get(CONF_PROP_FUNCTION, None))
|
|
||||||
if self._infos.get(CONF_PROP_FUNCTION, None) == PROPORTIONAL_FUNCTION_TPI:
|
|
||||||
return await self.async_step_tpi()
|
|
||||||
else:
|
|
||||||
return await self.async_step_p()
|
|
||||||
|
|
||||||
return await self.generic_step(
|
return await self.generic_step(
|
||||||
"user", STEP_USER_DATA_SCHEMA, user_input, choose_next_step
|
"user", STEP_USER_DATA_SCHEMA, user_input, self.async_step_tpi
|
||||||
)
|
|
||||||
|
|
||||||
async def async_step_p(self, user_input: dict | None = None) -> FlowResult:
|
|
||||||
"""Handle the flow steps"""
|
|
||||||
_LOGGER.debug("Into ConfigFlow.async_step_p user_input=%s", user_input)
|
|
||||||
|
|
||||||
return await self.generic_step(
|
|
||||||
"p", STEP_P_DATA_SCHEMA, user_input, self.async_step_presets
|
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_step_tpi(self, user_input: dict | None = None) -> FlowResult:
|
async def async_step_tpi(self, user_input: dict | None = None) -> FlowResult:
|
||||||
@@ -366,24 +317,8 @@ class VersatileThermostatOptionsFlowHandler(
|
|||||||
"Into OptionsFlowHandler.async_step_user user_input=%s", user_input
|
"Into OptionsFlowHandler.async_step_user user_input=%s", user_input
|
||||||
)
|
)
|
||||||
|
|
||||||
async def choose_next_step():
|
|
||||||
"""Choose next configuration flow"""
|
|
||||||
_LOGGER.debug("function is %s", self._infos.get(CONF_PROP_FUNCTION, None))
|
|
||||||
if self._infos.get(CONF_PROP_FUNCTION, None) == PROPORTIONAL_FUNCTION_TPI:
|
|
||||||
return await self.async_step_tpi()
|
|
||||||
else:
|
|
||||||
return await self.async_step_p()
|
|
||||||
|
|
||||||
return await self.generic_step(
|
return await self.generic_step(
|
||||||
"user", STEP_USER_DATA_SCHEMA, user_input, choose_next_step
|
"user", STEP_USER_DATA_SCHEMA, user_input, self.async_step_tpi
|
||||||
)
|
|
||||||
|
|
||||||
async def async_step_p(self, user_input: dict | None = None) -> FlowResult:
|
|
||||||
"""Handle the p flow steps"""
|
|
||||||
_LOGGER.debug("Into OptionsFlowHandler.async_step_p user_input=%s", user_input)
|
|
||||||
|
|
||||||
return await self.generic_step(
|
|
||||||
"p", STEP_P_DATA_SCHEMA, user_input, self.async_step_presets
|
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_step_tpi(self, user_input: dict | None = None) -> FlowResult:
|
async def async_step_tpi(self, user_input: dict | None = None) -> FlowResult:
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
from homeassistant.const import CONF_NAME
|
from homeassistant.const import CONF_NAME
|
||||||
from homeassistant.components.climate.const import (
|
from homeassistant.components.climate.const import (
|
||||||
# PRESET_ACTIVITY,
|
# PRESET_ACTIVITY,
|
||||||
PRESET_AWAY,
|
|
||||||
PRESET_BOOST,
|
PRESET_BOOST,
|
||||||
PRESET_COMFORT,
|
PRESET_COMFORT,
|
||||||
PRESET_ECO,
|
PRESET_ECO,
|
||||||
@@ -11,8 +10,6 @@ from homeassistant.components.climate.const import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from .prop_algorithm import (
|
from .prop_algorithm import (
|
||||||
PROPORTIONAL_FUNCTION_ATAN,
|
|
||||||
PROPORTIONAL_FUNCTION_LINEAR,
|
|
||||||
PROPORTIONAL_FUNCTION_TPI,
|
PROPORTIONAL_FUNCTION_TPI,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -30,31 +27,37 @@ CONF_MOTION_SENSOR = "motion_sensor_entity_id"
|
|||||||
CONF_DEVICE_POWER = "device_power"
|
CONF_DEVICE_POWER = "device_power"
|
||||||
CONF_CYCLE_MIN = "cycle_min"
|
CONF_CYCLE_MIN = "cycle_min"
|
||||||
CONF_PROP_FUNCTION = "proportional_function"
|
CONF_PROP_FUNCTION = "proportional_function"
|
||||||
CONF_PROP_BIAS = "proportional_bias"
|
|
||||||
CONF_WINDOW_DELAY = "window_delay"
|
CONF_WINDOW_DELAY = "window_delay"
|
||||||
CONF_MOTION_DELAY = "motion_delay"
|
CONF_MOTION_DELAY = "motion_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_C = "tpi_coefc"
|
CONF_TPI_COEF_INT = "tpi_coef_int"
|
||||||
CONF_TPI_COEF_T = "tpi_coeft"
|
CONF_TPI_COEF_EXT = "tpi_coef_ext"
|
||||||
CONF_PRESENCE_SENSOR = "presence_sensor_entity_id"
|
CONF_PRESENCE_SENSOR = "presence_sensor_entity_id"
|
||||||
CONF_NO_PRESENCE_PRESET = "no_presence_preset"
|
CONF_PRESET_POWER = "power_temp"
|
||||||
CONF_NO_PRESENCE_TEMP_OFFSET = "no_presence_temp_offset"
|
|
||||||
|
|
||||||
CONF_PRESETS = {
|
CONF_PRESETS = {
|
||||||
p: f"{p}_temp"
|
p: f"{p}_temp"
|
||||||
for p in (
|
for p in (
|
||||||
PRESET_ECO,
|
PRESET_ECO,
|
||||||
PRESET_AWAY,
|
|
||||||
PRESET_BOOST,
|
|
||||||
PRESET_COMFORT,
|
PRESET_COMFORT,
|
||||||
PRESET_POWER,
|
PRESET_BOOST,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
CONF_PRESETS_SELECTIONABLE = [PRESET_ECO, PRESET_COMFORT, PRESET_AWAY, PRESET_BOOST]
|
CONF_PRESETS_AWAY = {
|
||||||
|
p: f"{p}_temp"
|
||||||
|
for p in (
|
||||||
|
PRESET_ECO + "_away",
|
||||||
|
PRESET_BOOST + "_away",
|
||||||
|
PRESET_COMFORT + "_away",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
CONF_PRESETS_SELECTIONABLE = [PRESET_ECO, PRESET_COMFORT, PRESET_BOOST]
|
||||||
|
|
||||||
CONF_PRESETS_VALUES = list(CONF_PRESETS.values())
|
CONF_PRESETS_VALUES = list(CONF_PRESETS.values())
|
||||||
|
CONF_PRESETS_AWAY_VALUES = list(CONF_PRESETS_AWAY.values())
|
||||||
|
|
||||||
ALL_CONF = (
|
ALL_CONF = (
|
||||||
[
|
[
|
||||||
@@ -73,20 +76,18 @@ ALL_CONF = (
|
|||||||
CONF_DEVICE_POWER,
|
CONF_DEVICE_POWER,
|
||||||
CONF_CYCLE_MIN,
|
CONF_CYCLE_MIN,
|
||||||
CONF_PROP_FUNCTION,
|
CONF_PROP_FUNCTION,
|
||||||
CONF_PROP_BIAS,
|
CONF_TPI_COEF_INT,
|
||||||
CONF_TPI_COEF_C,
|
CONF_TPI_COEF_EXT,
|
||||||
CONF_TPI_COEF_T,
|
|
||||||
CONF_PRESENCE_SENSOR,
|
CONF_PRESENCE_SENSOR,
|
||||||
CONF_NO_PRESENCE_PRESET,
|
|
||||||
CONF_NO_PRESENCE_TEMP_OFFSET,
|
|
||||||
]
|
]
|
||||||
+ CONF_PRESETS_VALUES,
|
+ CONF_PRESETS_VALUES
|
||||||
|
+ CONF_PRESETS_AWAY_VALUES,
|
||||||
)
|
)
|
||||||
|
|
||||||
CONF_FUNCTIONS = [
|
CONF_FUNCTIONS = [
|
||||||
PROPORTIONAL_FUNCTION_LINEAR,
|
|
||||||
PROPORTIONAL_FUNCTION_ATAN,
|
|
||||||
PROPORTIONAL_FUNCTION_TPI,
|
PROPORTIONAL_FUNCTION_TPI,
|
||||||
]
|
]
|
||||||
|
|
||||||
SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE
|
SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE
|
||||||
|
|
||||||
|
SERVICE_SET_PRESENCE = "set_presence"
|
||||||
|
|||||||
@@ -16,22 +16,24 @@ class PropAlgorithm:
|
|||||||
"""This class aims to do all calculation of the Proportional alogorithm"""
|
"""This class aims to do all calculation of the Proportional alogorithm"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, function_type: str, bias: float, tpi_coefc, tpi_coeft, cycle_min: int
|
self,
|
||||||
|
function_type: str,
|
||||||
|
tpi_coef_int,
|
||||||
|
tpi_coef_ext,
|
||||||
|
cycle_min: int,
|
||||||
):
|
):
|
||||||
"""Initialisation of the Proportional Algorithm"""
|
"""Initialisation of the Proportional Algorithm"""
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Creation new PropAlgorithm function_type: %s, bias: %s, tpi_coefc: %s, tpi_coeft: %s, cycle_min:%d",
|
"Creation new PropAlgorithm function_type: %s, tpi_coef_int: %s, tpi_coef_ext: %s, cycle_min:%d",
|
||||||
function_type,
|
function_type,
|
||||||
bias,
|
tpi_coef_int,
|
||||||
tpi_coefc,
|
tpi_coef_ext,
|
||||||
tpi_coeft,
|
|
||||||
cycle_min,
|
cycle_min,
|
||||||
)
|
)
|
||||||
# TODO test function_type, bias, cycle_min
|
# TODO test function_type, bias, cycle_min
|
||||||
self._function = function_type
|
self._function = function_type
|
||||||
self._bias = bias
|
self._tpi_coef_int = tpi_coef_int
|
||||||
self._tpi_coefc = tpi_coefc
|
self._tpi_coef_ext = tpi_coef_ext
|
||||||
self._tpi_coeft = tpi_coeft
|
|
||||||
self._cycle_min = cycle_min
|
self._cycle_min = cycle_min
|
||||||
self._on_percent = 0
|
self._on_percent = 0
|
||||||
self._on_time_sec = 0
|
self._on_time_sec = 0
|
||||||
@@ -52,13 +54,10 @@ class PropAlgorithm:
|
|||||||
target_temp - ext_current_temp if ext_current_temp is not None else 0
|
target_temp - ext_current_temp if ext_current_temp is not None else 0
|
||||||
)
|
)
|
||||||
|
|
||||||
if self._function == PROPORTIONAL_FUNCTION_LINEAR:
|
if self._function == PROPORTIONAL_FUNCTION_TPI:
|
||||||
self._on_percent = 0.25 * delta_temp + self._bias
|
|
||||||
elif self._function == PROPORTIONAL_FUNCTION_ATAN:
|
|
||||||
self._on_percent = math.atan(delta_temp + self._bias) / 1.4
|
|
||||||
elif self._function == PROPORTIONAL_FUNCTION_TPI:
|
|
||||||
self._on_percent = (
|
self._on_percent = (
|
||||||
self._tpi_coefc * delta_temp + self._tpi_coeft * delta_ext_temp
|
self._tpi_coef_int * delta_temp
|
||||||
|
+ self._tpi_coef_ext * delta_ext_temp
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
|
|||||||
@@ -10,24 +10,17 @@
|
|||||||
"name": "Name",
|
"name": "Name",
|
||||||
"heater_entity_id": "Heater entity id",
|
"heater_entity_id": "Heater entity id",
|
||||||
"temperature_sensor_entity_id": "Temperature sensor entity id",
|
"temperature_sensor_entity_id": "Temperature sensor entity id",
|
||||||
|
"external_temperature_sensor_entity_id": "External temperature sensor entity id",
|
||||||
"cycle_min": "Cycle duration (minutes)",
|
"cycle_min": "Cycle duration (minutes)",
|
||||||
"proportional_function": "Function to use (linear is less aggressive)"
|
"proportional_function": "Algorithm to use (TPI is the only one for now)"
|
||||||
}
|
|
||||||
},
|
|
||||||
"p": {
|
|
||||||
"title": "Proportional",
|
|
||||||
"description": "Proportional attributes",
|
|
||||||
"data": {
|
|
||||||
"proportional_bias": "A bias to use in proportional algorithm"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tpi": {
|
"tpi": {
|
||||||
"title": "TPI",
|
"title": "TPI",
|
||||||
"description": "Time Proportional Integral attributes",
|
"description": "Time Proportional Integral attributes",
|
||||||
"data": {
|
"data": {
|
||||||
"external_temperature_sensor_entity_id": "External temperature sensor entity id",
|
"tpi_coef_int": "Coefficient to use for internal temperature delta",
|
||||||
"tpi_coefc": "Coefficient to use for internal temperature delta",
|
"tpi_coef_ext": "Coefficient to use for external temperature delta"
|
||||||
"tpi_coeft": "Coefficient to use for external temperature delta"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presets": {
|
"presets": {
|
||||||
@@ -35,10 +28,8 @@
|
|||||||
"description": "For each presets, give the target temperature",
|
"description": "For each presets, give the target temperature",
|
||||||
"data": {
|
"data": {
|
||||||
"eco_temp": "Temperature in Eco preset",
|
"eco_temp": "Temperature in Eco preset",
|
||||||
"away_temp": "Temperature in Away preset",
|
|
||||||
"comfort_temp": "Temperature in Comfort preset",
|
"comfort_temp": "Temperature in Comfort preset",
|
||||||
"boost_temp": "Temperature in Boost preset",
|
"boost_temp": "Temperature in Boost preset"
|
||||||
"power_temp": "Temperature in Power (overpowering) preset"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
@@ -65,7 +56,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"power_sensor_entity_id": "Power sensor entity id",
|
"power_sensor_entity_id": "Power sensor entity id",
|
||||||
"max_power_sensor_entity_id": "Max power sensor entity id",
|
"max_power_sensor_entity_id": "Max power sensor entity id",
|
||||||
"device_power": "Device power (kW)"
|
"device_power": "Device power (kW)",
|
||||||
|
"power_temp": "Temperature for Power shedding"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presence": {
|
"presence": {
|
||||||
@@ -73,8 +65,9 @@
|
|||||||
"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 (true is present)",
|
||||||
"no_presence_preset": "Preset to use when no one is present",
|
"eco_away_temp": "Temperature in Eco preset when no presence",
|
||||||
"no_presence_offset": "Temperature offset to apply to current temperature is no one is present"
|
"comfort_away_temp": "Temperature in Comfort preset when no presence",
|
||||||
|
"boost_away_temp": "Temperature in Boost preset when no presence"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -96,24 +89,17 @@
|
|||||||
"name": "Name",
|
"name": "Name",
|
||||||
"heater_entity_id": "Heater entity id",
|
"heater_entity_id": "Heater entity id",
|
||||||
"temperature_sensor_entity_id": "Temperature sensor entity id",
|
"temperature_sensor_entity_id": "Temperature sensor entity id",
|
||||||
|
"external_temperature_sensor_entity_id": "External temperature sensor entity id",
|
||||||
"cycle_min": "Cycle duration (minutes)",
|
"cycle_min": "Cycle duration (minutes)",
|
||||||
"proportional_function": "Function to use (linear is less aggressive)"
|
"proportional_function": "Algorithm to use (TPI is the only one for now)"
|
||||||
}
|
|
||||||
},
|
|
||||||
"p": {
|
|
||||||
"title": "Proportional",
|
|
||||||
"description": "Proportional attributes",
|
|
||||||
"data": {
|
|
||||||
"proportional_bias": "A bias to use in proportional algorithm"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tpi": {
|
"tpi": {
|
||||||
"title": "TPI",
|
"title": "TPI",
|
||||||
"description": "Time Proportional Integral attributes",
|
"description": "Time Proportional Integral attributes",
|
||||||
"data": {
|
"data": {
|
||||||
"external_temperature_sensor_entity_id": "External temperature sensor entity id",
|
"tpi_coef_int": "Coefficient to use for internal temperature delta",
|
||||||
"tpi_coefc": "Coefficient to use for internal temperature delta",
|
"tpi_coef_ext": "Coefficient to use for external temperature delta"
|
||||||
"tpi_coeft": "Coefficient to use for external temperature delta"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presets": {
|
"presets": {
|
||||||
@@ -121,10 +107,8 @@
|
|||||||
"description": "For each presets, give the target temperature",
|
"description": "For each presets, give the target temperature",
|
||||||
"data": {
|
"data": {
|
||||||
"eco_temp": "Temperature in Eco preset",
|
"eco_temp": "Temperature in Eco preset",
|
||||||
"away_temp": "Temperature in Away preset",
|
|
||||||
"comfort_temp": "Temperature in Comfort preset",
|
"comfort_temp": "Temperature in Comfort preset",
|
||||||
"boost_temp": "Temperature in Boost preset",
|
"boost_temp": "Temperature in Boost preset"
|
||||||
"power_temp": "Temperature in Power (overpowering) preset"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
@@ -151,7 +135,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"power_sensor_entity_id": "Power sensor entity id",
|
"power_sensor_entity_id": "Power sensor entity id",
|
||||||
"max_power_sensor_entity_id": "Max power sensor entity id",
|
"max_power_sensor_entity_id": "Max power sensor entity id",
|
||||||
"device_power": "Device power (kW)"
|
"device_power": "Device power (kW)",
|
||||||
|
"power_temp": "Temperature for Power shedding"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presence": {
|
"presence": {
|
||||||
@@ -159,8 +144,9 @@
|
|||||||
"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 (true is present)",
|
||||||
"no_presence_preset": "Preset to use when no one is present",
|
"eco_away_temp": "Temperature in Eco preset when no presence",
|
||||||
"no_presence_offset": "Temperature offset to apply to current temperature is no one is present"
|
"comfort_away_temp": "Temperature in Comfort preset when no presence",
|
||||||
|
"boost_away_temp": "Temperature in Boost preset when no presence"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -10,24 +10,17 @@
|
|||||||
"name": "Name",
|
"name": "Name",
|
||||||
"heater_entity_id": "Heater entity id",
|
"heater_entity_id": "Heater entity id",
|
||||||
"temperature_sensor_entity_id": "Temperature sensor entity id",
|
"temperature_sensor_entity_id": "Temperature sensor entity id",
|
||||||
|
"external_temperature_sensor_entity_id": "External temperature sensor entity id",
|
||||||
"cycle_min": "Cycle duration (minutes)",
|
"cycle_min": "Cycle duration (minutes)",
|
||||||
"proportional_function": "Function to use (linear is less aggressive)"
|
"proportional_function": "Algorithm to use (TPI is the only one for now)"
|
||||||
}
|
|
||||||
},
|
|
||||||
"p": {
|
|
||||||
"title": "Proportional",
|
|
||||||
"description": "Proportional attributes",
|
|
||||||
"data": {
|
|
||||||
"proportional_bias": "A bias to use in proportional algorithm"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tpi": {
|
"tpi": {
|
||||||
"title": "TPI",
|
"title": "TPI",
|
||||||
"description": "Time Proportional Integral attributes",
|
"description": "Time Proportional Integral attributes",
|
||||||
"data": {
|
"data": {
|
||||||
"external_temperature_sensor_entity_id": "External temperature sensor entity id",
|
"tpi_coef_int": "Coefficient to use for internal temperature delta",
|
||||||
"tpi_coefc": "Coefficient to use for internal temperature delta",
|
"tpi_coef_ext": "Coefficient to use for external temperature delta"
|
||||||
"tpi_coeft": "Coefficient to use for external temperature delta"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presets": {
|
"presets": {
|
||||||
@@ -35,10 +28,8 @@
|
|||||||
"description": "For each presets, give the target temperature",
|
"description": "For each presets, give the target temperature",
|
||||||
"data": {
|
"data": {
|
||||||
"eco_temp": "Temperature in Eco preset",
|
"eco_temp": "Temperature in Eco preset",
|
||||||
"away_temp": "Temperature in Away preset",
|
|
||||||
"comfort_temp": "Temperature in Comfort preset",
|
"comfort_temp": "Temperature in Comfort preset",
|
||||||
"boost_temp": "Temperature in Boost preset",
|
"boost_temp": "Temperature in Boost preset"
|
||||||
"power_temp": "Temperature in Power (overpowering) preset"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
@@ -65,7 +56,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"power_sensor_entity_id": "Power sensor entity id",
|
"power_sensor_entity_id": "Power sensor entity id",
|
||||||
"max_power_sensor_entity_id": "Max power sensor entity id",
|
"max_power_sensor_entity_id": "Max power sensor entity id",
|
||||||
"device_power": "Device power (kW)"
|
"device_power": "Device power (kW)",
|
||||||
|
"power_temp": "Temperature for Power shedding"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presence": {
|
"presence": {
|
||||||
@@ -73,8 +65,9 @@
|
|||||||
"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 (true is present)",
|
||||||
"no_presence_preset": "Preset to use when no one is present",
|
"eco_away_temp": "Temperature in Eco preset when no presence",
|
||||||
"no_presence_offset": "Temperature offset to apply to current temperature is no one is present"
|
"comfort_away_temp": "Temperature in Comfort preset when no presence",
|
||||||
|
"boost_away_temp": "Temperature in Boost preset when no presence"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -96,24 +89,17 @@
|
|||||||
"name": "Name",
|
"name": "Name",
|
||||||
"heater_entity_id": "Heater entity id",
|
"heater_entity_id": "Heater entity id",
|
||||||
"temperature_sensor_entity_id": "Temperature sensor entity id",
|
"temperature_sensor_entity_id": "Temperature sensor entity id",
|
||||||
|
"external_temperature_sensor_entity_id": "External temperature sensor entity id",
|
||||||
"cycle_min": "Cycle duration (minutes)",
|
"cycle_min": "Cycle duration (minutes)",
|
||||||
"proportional_function": "Function to use (linear is less aggressive)"
|
"proportional_function": "Algorithm to use (TPI is the only one for now)"
|
||||||
}
|
|
||||||
},
|
|
||||||
"p": {
|
|
||||||
"title": "Proportional",
|
|
||||||
"description": "Proportional attributes",
|
|
||||||
"data": {
|
|
||||||
"proportional_bias": "A bias to use in proportional algorithm"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tpi": {
|
"tpi": {
|
||||||
"title": "TPI",
|
"title": "TPI",
|
||||||
"description": "Time Proportional Integral attributes",
|
"description": "Time Proportional Integral attributes",
|
||||||
"data": {
|
"data": {
|
||||||
"external_temperature_sensor_entity_id": "External temperature sensor entity id",
|
"tpi_coef_int": "Coefficient to use for internal temperature delta",
|
||||||
"tpi_coefc": "Coefficient to use for internal temperature delta",
|
"tpi_coef_ext": "Coefficient to use for external temperature delta"
|
||||||
"tpi_coeft": "Coefficient to use for external temperature delta"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presets": {
|
"presets": {
|
||||||
@@ -121,10 +107,8 @@
|
|||||||
"description": "For each presets, give the target temperature",
|
"description": "For each presets, give the target temperature",
|
||||||
"data": {
|
"data": {
|
||||||
"eco_temp": "Temperature in Eco preset",
|
"eco_temp": "Temperature in Eco preset",
|
||||||
"away_temp": "Temperature in Away preset",
|
|
||||||
"comfort_temp": "Temperature in Comfort preset",
|
"comfort_temp": "Temperature in Comfort preset",
|
||||||
"boost_temp": "Temperature in Boost preset",
|
"boost_temp": "Temperature in Boost preset"
|
||||||
"power_temp": "Temperature in Power (overpowering) preset"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
@@ -151,7 +135,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"power_sensor_entity_id": "Power sensor entity id",
|
"power_sensor_entity_id": "Power sensor entity id",
|
||||||
"max_power_sensor_entity_id": "Max power sensor entity id",
|
"max_power_sensor_entity_id": "Max power sensor entity id",
|
||||||
"device_power": "Device power (kW)"
|
"device_power": "Device power (kW)",
|
||||||
|
"power_temp": "Temperature for Power shedding"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presence": {
|
"presence": {
|
||||||
@@ -159,8 +144,9 @@
|
|||||||
"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 (true is present)",
|
||||||
"no_presence_preset": "Preset to use when no one is present",
|
"eco_away_temp": "Temperature in Eco preset when no presence",
|
||||||
"no_presence_offset": "Temperature offset to apply to current temperature is no one is present"
|
"comfort_away_temp": "Temperature in Comfort preset when no presence",
|
||||||
|
"boost_away_temp": "Temperature in Boost preset when no presence"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -10,24 +10,17 @@
|
|||||||
"name": "Nom",
|
"name": "Nom",
|
||||||
"heater_entity_id": "Radiateur entity id",
|
"heater_entity_id": "Radiateur entity id",
|
||||||
"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",
|
||||||
"cycle_min": "Durée du cycle (minutes)",
|
"cycle_min": "Durée du cycle (minutes)",
|
||||||
"proportional_function": "Fonction de l'algorithm proportionnel à utiliser (linear est moins aggressive)"
|
"proportional_function": "Algorithm à utiliser (Seul TPI est disponible pour l'instant)"
|
||||||
}
|
|
||||||
},
|
|
||||||
"p": {
|
|
||||||
"title": "Proportional",
|
|
||||||
"description": "Attributs des algos Proportionnel",
|
|
||||||
"data": {
|
|
||||||
"proportional_bias": "Un biais à utiliser dans l'algorithm proportionnel"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tpi": {
|
"tpi": {
|
||||||
"title": "TPI",
|
"title": "TPI",
|
||||||
"description": "Attributs de l'algo Time Proportional Integral",
|
"description": "Attributs de l'algo Time Proportional Integral",
|
||||||
"data": {
|
"data": {
|
||||||
"external_temperature_sensor_entity_id": "Temperature exterieure sensor entity id",
|
"tpi_coef_int": "coeff_int : Coefficient à utiliser pour le delta de température interne",
|
||||||
"tpi_coefc": "coeff_c : Coefficient à utiliser pour le delta de température interne",
|
"tpi_coef_ext": "coeff_ext : Coefficient à utiliser pour le delta de température externe"
|
||||||
"tpi_coeft": "coeff_t : Coefficient à utiliser pour le delta de température externe"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presets": {
|
"presets": {
|
||||||
@@ -35,10 +28,8 @@
|
|||||||
"description": "Pour chaque preset, donnez la température cible",
|
"description": "Pour chaque preset, donnez la température cible",
|
||||||
"data": {
|
"data": {
|
||||||
"eco_temp": "Température en preset Eco",
|
"eco_temp": "Température en preset Eco",
|
||||||
"away_temp": "Température en preset Away",
|
|
||||||
"comfort_temp": "Température en preset Comfort",
|
"comfort_temp": "Température en preset Comfort",
|
||||||
"boost_temp": "Température en preset Boost",
|
"boost_temp": "Température en preset Boost"
|
||||||
"power_temp": "Température en preset Power (overpowering)"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
@@ -65,7 +56,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"power_sensor_entity_id": "Capteur de puissance totale (entity id)",
|
"power_sensor_entity_id": "Capteur de puissance totale (entity id)",
|
||||||
"max_power_sensor_entity_id": "Capteur de puissance Max (entity id)",
|
"max_power_sensor_entity_id": "Capteur de puissance Max (entity id)",
|
||||||
"device_power": "Puissance de l'équipement"
|
"device_power": "Puissance de l'équipement",
|
||||||
|
"power_temp": "Température si délestaqe"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presence": {
|
"presence": {
|
||||||
@@ -73,8 +65,9 @@
|
|||||||
"description": "Donnez un capteur de présence (true si quelqu'un est présent).\nEnsuite spécifiez soit un preset à utiliser, soit un offset de température à appliquer lorsque personne n'est présent.\nSi le préset est utilisé, l'offset ne sera pas pris en compte.\nLaissez l'entity id vide si la gestion de la présence est non utilisée.",
|
"description": "Donnez un capteur de présence (true si quelqu'un est présent).\nEnsuite spécifiez soit un preset à utiliser, soit un offset de température à appliquer lorsque personne n'est présent.\nSi le préset est utilisé, l'offset ne sera pas pris en compte.\nLaissez l'entity id vide si la gestion de la présence est non utilisée.",
|
||||||
"data": {
|
"data": {
|
||||||
"presence_sensor_entity_id": "Capteur de présence entity id (true si quelqu'un est présent)",
|
"presence_sensor_entity_id": "Capteur de présence entity id (true si quelqu'un est présent)",
|
||||||
"no_presence_preset": "Preset à utiliser si personne n'est présent",
|
"eco_away_temp": "Température en preset Eco en cas d'absence",
|
||||||
"no_presence_offset": "Offset de température à utiliser si personne n'est présent"
|
"comfort_away_temp": "Température en preset Comfort en cas d'absence",
|
||||||
|
"boost_away_temp": "Température en preset Boost en cas d'absence"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -96,24 +89,17 @@
|
|||||||
"name": "Nom",
|
"name": "Nom",
|
||||||
"heater_entity_id": "Radiateur entity id",
|
"heater_entity_id": "Radiateur entity id",
|
||||||
"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",
|
||||||
"cycle_min": "Durée du cycle (minutes)",
|
"cycle_min": "Durée du cycle (minutes)",
|
||||||
"proportional_function": "Fonction de l'algorithm proportionnel à utiliser (linear est moins aggressive)"
|
"proportional_function": "Algorithm à utiliser (Seul TPI est disponible pour l'instant)"
|
||||||
}
|
|
||||||
},
|
|
||||||
"p": {
|
|
||||||
"title": "Proportional",
|
|
||||||
"description": "Attributs des algos Proportionnel",
|
|
||||||
"data": {
|
|
||||||
"proportional_bias": "Un biais à utiliser dans l'algorithm proportionnel"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tpi": {
|
"tpi": {
|
||||||
"title": "TPI",
|
"title": "TPI",
|
||||||
"description": "Attributs de l'algo Time Proportional Integral",
|
"description": "Attributs de l'algo Time Proportional Integral",
|
||||||
"data": {
|
"data": {
|
||||||
"external_temperature_sensor_entity_id": "Temperature exterieure sensor entity id",
|
"tpi_coef_int": "coeff_int : Coefficient à utiliser pour le delta de température interne",
|
||||||
"tpi_coefc": "coeff_c : Coefficient à utiliser pour le delta de température interne",
|
"tpi_coef_ext": "coeff_ext : Coefficient à utiliser pour le delta de température externe"
|
||||||
"tpi_coeft": "coeff_t : Coefficient à utiliser pour le delta de température externe"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presets": {
|
"presets": {
|
||||||
@@ -121,10 +107,8 @@
|
|||||||
"description": "Pour chaque preset, donnez la température cible",
|
"description": "Pour chaque preset, donnez la température cible",
|
||||||
"data": {
|
"data": {
|
||||||
"eco_temp": "Température en preset Eco",
|
"eco_temp": "Température en preset Eco",
|
||||||
"away_temp": "Température en preset Away",
|
|
||||||
"comfort_temp": "Température en preset Comfort",
|
"comfort_temp": "Température en preset Comfort",
|
||||||
"boost_temp": "Température en preset Boost",
|
"boost_temp": "Température en preset Boost"
|
||||||
"power_temp": "Température en preset Power (overpowering)"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
@@ -151,7 +135,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"power_sensor_entity_id": "Capteur de puissance totale (entity id)",
|
"power_sensor_entity_id": "Capteur de puissance totale (entity id)",
|
||||||
"max_power_sensor_entity_id": "Capteur de puissance Max (entity id)",
|
"max_power_sensor_entity_id": "Capteur de puissance Max (entity id)",
|
||||||
"device_power": "Puissance de l'équipement"
|
"device_power": "Puissance de l'équipement",
|
||||||
|
"power_temp": "Température si délestaqe"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"presence": {
|
"presence": {
|
||||||
@@ -159,8 +144,9 @@
|
|||||||
"description": "Donnez un capteur de présence (true si quelqu'un est présent).\nEnsuite spécifiez soit un preset à utiliser, soit un offset de température à appliquer lorsque personne n'est présent.\nSi le préset est utilisé, l'offset ne sera pas pris en compte.\nLaissez l'entity id vide si la gestion de la présence est non utilisée.",
|
"description": "Donnez un capteur de présence (true si quelqu'un est présent).\nEnsuite spécifiez soit un preset à utiliser, soit un offset de température à appliquer lorsque personne n'est présent.\nSi le préset est utilisé, l'offset ne sera pas pris en compte.\nLaissez l'entity id vide si la gestion de la présence est non utilisée.",
|
||||||
"data": {
|
"data": {
|
||||||
"presence_sensor_entity_id": "Capteur de présence entity id (true si quelqu'un est présent)",
|
"presence_sensor_entity_id": "Capteur de présence entity id (true si quelqu'un est présent)",
|
||||||
"no_presence_preset": "Preset à utiliser si personne n'est présent",
|
"eco_away_temp": "Température en preset Eco en cas d'absence",
|
||||||
"no_presence_offset": "Offset de température à utiliser si personne n'est présent"
|
"comfort_away_temp": "Température en preset Comfort en cas d'absence",
|
||||||
|
"boost_away_temp": "Température en preset Boost en cas d'absence"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user