mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 16:57:10 +00:00
Use climate enums in knx (#70676)
This commit is contained in:
parent
23d9e135bc
commit
069dd567f7
@ -8,12 +8,12 @@ from xknx.devices import Climate as XknxClimate, ClimateMode as XknxClimateMode
|
|||||||
from xknx.dpt.dpt_hvac_mode import HVACControllerMode, HVACOperationMode
|
from xknx.dpt.dpt_hvac_mode import HVACControllerMode, HVACOperationMode
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.components.climate import ClimateEntity, ClimateEntityFeature
|
from homeassistant.components.climate import ClimateEntity
|
||||||
from homeassistant.components.climate.const import (
|
from homeassistant.components.climate.const import (
|
||||||
CURRENT_HVAC_IDLE,
|
|
||||||
CURRENT_HVAC_OFF,
|
|
||||||
HVAC_MODE_OFF,
|
|
||||||
PRESET_AWAY,
|
PRESET_AWAY,
|
||||||
|
ClimateEntityFeature,
|
||||||
|
HVACAction,
|
||||||
|
HVACMode,
|
||||||
)
|
)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_TEMPERATURE,
|
ATTR_TEMPERATURE,
|
||||||
@ -149,7 +149,9 @@ class KNXClimate(KnxEntity, ClimateEntity):
|
|||||||
f"{self._device.target_temperature.group_address}_"
|
f"{self._device.target_temperature.group_address}_"
|
||||||
f"{self._device._setpoint_shift.group_address}"
|
f"{self._device._setpoint_shift.group_address}"
|
||||||
)
|
)
|
||||||
self.default_hvac_mode: str = config[ClimateSchema.CONF_DEFAULT_CONTROLLER_MODE]
|
self.default_hvac_mode: HVACMode = config[
|
||||||
|
ClimateSchema.CONF_DEFAULT_CONTROLLER_MODE
|
||||||
|
]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def current_temperature(self) -> float | None:
|
def current_temperature(self) -> float | None:
|
||||||
@ -181,10 +183,10 @@ class KNXClimate(KnxEntity, ClimateEntity):
|
|||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hvac_mode(self) -> str:
|
def hvac_mode(self) -> HVACMode:
|
||||||
"""Return current operation ie. heat, cool, idle."""
|
"""Return current operation ie. heat, cool, idle."""
|
||||||
if self._device.supports_on_off and not self._device.is_on:
|
if self._device.supports_on_off and not self._device.is_on:
|
||||||
return HVAC_MODE_OFF
|
return HVACMode.OFF
|
||||||
if self._device.mode is not None and self._device.mode.supports_controller_mode:
|
if self._device.mode is not None and self._device.mode.supports_controller_mode:
|
||||||
return CONTROLLER_MODES.get(
|
return CONTROLLER_MODES.get(
|
||||||
self._device.mode.controller_mode.value, self.default_hvac_mode
|
self._device.mode.controller_mode.value, self.default_hvac_mode
|
||||||
@ -192,9 +194,9 @@ class KNXClimate(KnxEntity, ClimateEntity):
|
|||||||
return self.default_hvac_mode
|
return self.default_hvac_mode
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hvac_modes(self) -> list[str]:
|
def hvac_modes(self) -> list[HVACMode]:
|
||||||
"""Return the list of available operation/controller modes."""
|
"""Return the list of available operation/controller modes."""
|
||||||
ha_controller_modes: list[str | None] = []
|
ha_controller_modes: list[HVACMode | None] = []
|
||||||
if self._device.mode is not None:
|
if self._device.mode is not None:
|
||||||
for knx_controller_mode in self._device.mode.controller_modes:
|
for knx_controller_mode in self._device.mode.controller_modes:
|
||||||
ha_controller_modes.append(
|
ha_controller_modes.append(
|
||||||
@ -204,30 +206,30 @@ class KNXClimate(KnxEntity, ClimateEntity):
|
|||||||
if self._device.supports_on_off:
|
if self._device.supports_on_off:
|
||||||
if not ha_controller_modes:
|
if not ha_controller_modes:
|
||||||
ha_controller_modes.append(self.default_hvac_mode)
|
ha_controller_modes.append(self.default_hvac_mode)
|
||||||
ha_controller_modes.append(HVAC_MODE_OFF)
|
ha_controller_modes.append(HVACMode.OFF)
|
||||||
|
|
||||||
hvac_modes = list(set(filter(None, ha_controller_modes)))
|
hvac_modes = list(set(filter(None, ha_controller_modes)))
|
||||||
return hvac_modes if hvac_modes else [self.default_hvac_mode]
|
return hvac_modes if hvac_modes else [self.default_hvac_mode]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hvac_action(self) -> str | None:
|
def hvac_action(self) -> HVACAction | None:
|
||||||
"""Return the current running hvac operation if supported.
|
"""Return the current running hvac operation if supported.
|
||||||
|
|
||||||
Need to be one of CURRENT_HVAC_*.
|
Need to be one of CURRENT_HVAC_*.
|
||||||
"""
|
"""
|
||||||
if self._device.supports_on_off and not self._device.is_on:
|
if self._device.supports_on_off and not self._device.is_on:
|
||||||
return CURRENT_HVAC_OFF
|
return HVACAction.OFF
|
||||||
if self._device.is_active is False:
|
if self._device.is_active is False:
|
||||||
return CURRENT_HVAC_IDLE
|
return HVACAction.IDLE
|
||||||
if (
|
if (
|
||||||
self._device.mode is not None and self._device.mode.supports_controller_mode
|
self._device.mode is not None and self._device.mode.supports_controller_mode
|
||||||
) or self._device.is_active:
|
) or self._device.is_active:
|
||||||
return CURRENT_HVAC_ACTIONS.get(self.hvac_mode, CURRENT_HVAC_IDLE)
|
return CURRENT_HVAC_ACTIONS.get(self.hvac_mode, HVACAction.IDLE)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def async_set_hvac_mode(self, hvac_mode: str) -> None:
|
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
||||||
"""Set operation mode."""
|
"""Set operation mode."""
|
||||||
if self._device.supports_on_off and hvac_mode == HVAC_MODE_OFF:
|
if self._device.supports_on_off and hvac_mode == HVACMode.OFF:
|
||||||
await self._device.turn_off()
|
await self._device.turn_off()
|
||||||
else:
|
else:
|
||||||
if self._device.supports_on_off and not self._device.is_on:
|
if self._device.supports_on_off and not self._device.is_on:
|
||||||
|
@ -5,22 +5,13 @@ from enum import Enum
|
|||||||
from typing import Final, TypedDict
|
from typing import Final, TypedDict
|
||||||
|
|
||||||
from homeassistant.components.climate.const import (
|
from homeassistant.components.climate.const import (
|
||||||
CURRENT_HVAC_COOL,
|
|
||||||
CURRENT_HVAC_DRY,
|
|
||||||
CURRENT_HVAC_FAN,
|
|
||||||
CURRENT_HVAC_HEAT,
|
|
||||||
CURRENT_HVAC_OFF,
|
|
||||||
HVAC_MODE_AUTO,
|
|
||||||
HVAC_MODE_COOL,
|
|
||||||
HVAC_MODE_DRY,
|
|
||||||
HVAC_MODE_FAN_ONLY,
|
|
||||||
HVAC_MODE_HEAT,
|
|
||||||
HVAC_MODE_OFF,
|
|
||||||
PRESET_AWAY,
|
PRESET_AWAY,
|
||||||
PRESET_COMFORT,
|
PRESET_COMFORT,
|
||||||
PRESET_ECO,
|
PRESET_ECO,
|
||||||
PRESET_NONE,
|
PRESET_NONE,
|
||||||
PRESET_SLEEP,
|
PRESET_SLEEP,
|
||||||
|
HVACAction,
|
||||||
|
HVACMode,
|
||||||
)
|
)
|
||||||
from homeassistant.const import Platform
|
from homeassistant.const import Platform
|
||||||
|
|
||||||
@ -127,20 +118,20 @@ SUPPORTED_PLATFORMS: Final = [
|
|||||||
# Map KNX controller modes to HA modes. This list might not be complete.
|
# Map KNX controller modes to HA modes. This list might not be complete.
|
||||||
CONTROLLER_MODES: Final = {
|
CONTROLLER_MODES: Final = {
|
||||||
# Map DPT 20.105 HVAC control modes
|
# Map DPT 20.105 HVAC control modes
|
||||||
"Auto": HVAC_MODE_AUTO,
|
"Auto": HVACMode.AUTO,
|
||||||
"Heat": HVAC_MODE_HEAT,
|
"Heat": HVACMode.HEAT,
|
||||||
"Cool": HVAC_MODE_COOL,
|
"Cool": HVACMode.COOL,
|
||||||
"Off": HVAC_MODE_OFF,
|
"Off": HVACMode.OFF,
|
||||||
"Fan only": HVAC_MODE_FAN_ONLY,
|
"Fan only": HVACMode.FAN_ONLY,
|
||||||
"Dry": HVAC_MODE_DRY,
|
"Dry": HVACMode.DRY,
|
||||||
}
|
}
|
||||||
|
|
||||||
CURRENT_HVAC_ACTIONS: Final = {
|
CURRENT_HVAC_ACTIONS: Final = {
|
||||||
HVAC_MODE_HEAT: CURRENT_HVAC_HEAT,
|
HVACMode.HEAT: HVACAction.HEATING,
|
||||||
HVAC_MODE_COOL: CURRENT_HVAC_COOL,
|
HVACMode.COOL: HVACAction.COOLING,
|
||||||
HVAC_MODE_OFF: CURRENT_HVAC_OFF,
|
HVACMode.OFF: HVACAction.OFF,
|
||||||
HVAC_MODE_FAN_ONLY: CURRENT_HVAC_FAN,
|
HVACMode.FAN_ONLY: HVACAction.FAN,
|
||||||
HVAC_MODE_DRY: CURRENT_HVAC_DRY,
|
HVACMode.DRY: HVACAction.DRYING,
|
||||||
}
|
}
|
||||||
|
|
||||||
PRESET_MODES: Final = {
|
PRESET_MODES: Final = {
|
||||||
|
@ -16,7 +16,7 @@ from xknx.telegram.address import IndividualAddress, parse_device_group_address
|
|||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA,
|
DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA,
|
||||||
)
|
)
|
||||||
from homeassistant.components.climate.const import HVAC_MODE_HEAT, HVAC_MODES
|
from homeassistant.components.climate.const import HVACMode
|
||||||
from homeassistant.components.cover import (
|
from homeassistant.components.cover import (
|
||||||
DEVICE_CLASSES_SCHEMA as COVER_DEVICE_CLASSES_SCHEMA,
|
DEVICE_CLASSES_SCHEMA as COVER_DEVICE_CLASSES_SCHEMA,
|
||||||
)
|
)
|
||||||
@ -465,8 +465,8 @@ class ClimateSchema(KNXPlatformSchema):
|
|||||||
cv.ensure_list, [vol.In(CONTROLLER_MODES)]
|
cv.ensure_list, [vol.In(CONTROLLER_MODES)]
|
||||||
),
|
),
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_DEFAULT_CONTROLLER_MODE, default=HVAC_MODE_HEAT
|
CONF_DEFAULT_CONTROLLER_MODE, default=HVACMode.HEAT
|
||||||
): vol.In(HVAC_MODES),
|
): vol.Coerce(HVACMode),
|
||||||
vol.Optional(CONF_MIN_TEMP): vol.Coerce(float),
|
vol.Optional(CONF_MIN_TEMP): vol.Coerce(float),
|
||||||
vol.Optional(CONF_MAX_TEMP): vol.Coerce(float),
|
vol.Optional(CONF_MAX_TEMP): vol.Coerce(float),
|
||||||
vol.Optional(CONF_ENTITY_CATEGORY): ENTITY_CATEGORIES_SCHEMA,
|
vol.Optional(CONF_ENTITY_CATEGORY): ENTITY_CATEGORIES_SCHEMA,
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
"""Test KNX climate."""
|
"""Test KNX climate."""
|
||||||
from homeassistant.components.climate import HVAC_MODE_HEAT, HVAC_MODE_OFF
|
from homeassistant.components.climate.const import PRESET_ECO, PRESET_SLEEP, HVACMode
|
||||||
from homeassistant.components.climate.const import PRESET_ECO, PRESET_SLEEP
|
|
||||||
from homeassistant.components.knx.schema import ClimateSchema
|
from homeassistant.components.knx.schema import ClimateSchema
|
||||||
from homeassistant.const import CONF_NAME, STATE_IDLE
|
from homeassistant.const import CONF_NAME, STATE_IDLE
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
@ -82,7 +81,7 @@ async def test_climate_hvac_mode(hass: HomeAssistant, knx: KNXTestKit):
|
|||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
"climate",
|
"climate",
|
||||||
"set_hvac_mode",
|
"set_hvac_mode",
|
||||||
{"entity_id": "climate.test", "hvac_mode": HVAC_MODE_OFF},
|
{"entity_id": "climate.test", "hvac_mode": HVACMode.OFF},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
await knx.assert_write("1/2/8", False)
|
await knx.assert_write("1/2/8", False)
|
||||||
@ -91,7 +90,7 @@ async def test_climate_hvac_mode(hass: HomeAssistant, knx: KNXTestKit):
|
|||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
"climate",
|
"climate",
|
||||||
"set_hvac_mode",
|
"set_hvac_mode",
|
||||||
{"entity_id": "climate.test", "hvac_mode": HVAC_MODE_HEAT},
|
{"entity_id": "climate.test", "hvac_mode": HVACMode.HEAT},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
await knx.assert_write("1/2/8", True)
|
await knx.assert_write("1/2/8", True)
|
||||||
@ -235,10 +234,10 @@ async def test_command_value_idle_mode(hass: HomeAssistant, knx: KNXTestKit):
|
|||||||
assert len(events) == 2
|
assert len(events) == 2
|
||||||
events.pop()
|
events.pop()
|
||||||
|
|
||||||
knx.assert_state("climate.test", HVAC_MODE_HEAT, command_value=20)
|
knx.assert_state("climate.test", HVACMode.HEAT, command_value=20)
|
||||||
|
|
||||||
await knx.receive_write("1/2/6", (0x00,))
|
await knx.receive_write("1/2/6", (0x00,))
|
||||||
|
|
||||||
knx.assert_state(
|
knx.assert_state(
|
||||||
"climate.test", HVAC_MODE_HEAT, command_value=0, hvac_action=STATE_IDLE
|
"climate.test", HVACMode.HEAT, command_value=0, hvac_action=STATE_IDLE
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user