Add idle hvac_action to KNX climate (#52006)
* add idle hvac_action and command_value extra_state_attribute * use class attribute for unitpull/51824/head^2
parent
a788b6ebc1
commit
89cdda9fe6
|
@ -28,6 +28,7 @@ from .const import CONTROLLER_MODES, CURRENT_HVAC_ACTIONS, DOMAIN, PRESET_MODES
|
|||
from .knx_entity import KnxEntity
|
||||
from .schema import ClimateSchema
|
||||
|
||||
ATTR_COMMAND_VALUE = "command_value"
|
||||
CONTROLLER_MODES_INV = {value: key for key, value in CONTROLLER_MODES.items()}
|
||||
PRESET_MODES_INV = {value: key for key, value in PRESET_MODES.items()}
|
||||
|
||||
|
@ -156,10 +157,14 @@ def _create_climate(xknx: XKNX, config: ConfigType) -> XknxClimate:
|
|||
temperature_step=config[ClimateSchema.CONF_TEMPERATURE_STEP],
|
||||
group_address_on_off=config.get(ClimateSchema.CONF_ON_OFF_ADDRESS),
|
||||
group_address_on_off_state=config.get(ClimateSchema.CONF_ON_OFF_STATE_ADDRESS),
|
||||
on_off_invert=config[ClimateSchema.CONF_ON_OFF_INVERT],
|
||||
group_address_active_state=config.get(ClimateSchema.CONF_ACTIVE_STATE_ADDRESS),
|
||||
group_address_command_value_state=config.get(
|
||||
ClimateSchema.CONF_COMMAND_VALUE_STATE_ADDRESS
|
||||
),
|
||||
min_temp=config.get(ClimateSchema.CONF_MIN_TEMP),
|
||||
max_temp=config.get(ClimateSchema.CONF_MAX_TEMP),
|
||||
mode=climate_mode,
|
||||
on_off_invert=config[ClimateSchema.CONF_ON_OFF_INVERT],
|
||||
)
|
||||
|
||||
|
||||
|
@ -256,6 +261,8 @@ class KNXClimate(KnxEntity, ClimateEntity):
|
|||
"""
|
||||
if self._device.supports_on_off and not self._device.is_on:
|
||||
return CURRENT_HVAC_OFF
|
||||
if self._device.is_active is False:
|
||||
return CURRENT_HVAC_IDLE
|
||||
if self._device.mode is not None and self._device.mode.supports_controller_mode:
|
||||
return CURRENT_HVAC_ACTIONS.get(
|
||||
self._device.mode.controller_mode.value, CURRENT_HVAC_IDLE
|
||||
|
@ -311,6 +318,15 @@ class KNXClimate(KnxEntity, ClimateEntity):
|
|||
await self._device.mode.set_operation_mode(knx_operation_mode)
|
||||
self.async_write_ha_state()
|
||||
|
||||
@property
|
||||
def extra_state_attributes(self) -> dict[str, Any] | None:
|
||||
"""Return device specific state attributes."""
|
||||
attr: dict[str, Any] = {}
|
||||
|
||||
if self._device.command_value.initialized:
|
||||
attr[ATTR_COMMAND_VALUE] = self._device.command_value.value
|
||||
return attr
|
||||
|
||||
async def async_added_to_hass(self) -> None:
|
||||
"""Store register state change callback."""
|
||||
await super().async_added_to_hass()
|
||||
|
|
|
@ -259,6 +259,7 @@ class ClimateSchema(KNXPlatformSchema):
|
|||
|
||||
PLATFORM_NAME = SupportedPlatforms.CLIMATE.value
|
||||
|
||||
CONF_ACTIVE_STATE_ADDRESS = "active_state_address"
|
||||
CONF_SETPOINT_SHIFT_ADDRESS = "setpoint_shift_address"
|
||||
CONF_SETPOINT_SHIFT_STATE_ADDRESS = "setpoint_shift_state_address"
|
||||
CONF_SETPOINT_SHIFT_MODE = "setpoint_shift_mode"
|
||||
|
@ -274,6 +275,7 @@ class ClimateSchema(KNXPlatformSchema):
|
|||
CONF_CONTROLLER_STATUS_STATE_ADDRESS = "controller_status_state_address"
|
||||
CONF_CONTROLLER_MODE_ADDRESS = "controller_mode_address"
|
||||
CONF_CONTROLLER_MODE_STATE_ADDRESS = "controller_mode_state_address"
|
||||
CONF_COMMAND_VALUE_STATE_ADDRESS = "command_value_state_address"
|
||||
CONF_HEAT_COOL_ADDRESS = "heat_cool_address"
|
||||
CONF_HEAT_COOL_STATE_ADDRESS = "heat_cool_state_address"
|
||||
CONF_OPERATION_MODE_FROST_PROTECTION_ADDRESS = (
|
||||
|
@ -332,6 +334,8 @@ class ClimateSchema(KNXPlatformSchema):
|
|||
vol.Optional(CONF_SETPOINT_SHIFT_MODE): vol.Maybe(
|
||||
vol.All(vol.Upper, cv.enum(SetpointShiftMode))
|
||||
),
|
||||
vol.Optional(CONF_ACTIVE_STATE_ADDRESS): ga_list_validator,
|
||||
vol.Optional(CONF_COMMAND_VALUE_STATE_ADDRESS): ga_list_validator,
|
||||
vol.Optional(CONF_OPERATION_MODE_ADDRESS): ga_list_validator,
|
||||
vol.Optional(CONF_OPERATION_MODE_STATE_ADDRESS): ga_list_validator,
|
||||
vol.Optional(CONF_CONTROLLER_STATUS_ADDRESS): ga_list_validator,
|
||||
|
|
Loading…
Reference in New Issue