Add idle hvac_action to KNX climate (#52006)

* add idle hvac_action and command_value extra_state_attribute

* use class attribute for unit
pull/51824/head^2
Matthias Alphart 2021-06-27 18:31:07 +02:00 committed by GitHub
parent a788b6ebc1
commit 89cdda9fe6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 1 deletions

View File

@ -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()

View File

@ -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,