Use EntityFeature in homekit_controller (#69404)
This commit is contained in:
parent
999e2f3bf0
commit
a5b919ec6b
6 changed files with 64 additions and 79 deletions
|
@ -6,11 +6,9 @@ from typing import Any
|
|||
from aiohomekit.model.characteristics import CharacteristicsTypes
|
||||
from aiohomekit.model.services import Service, ServicesTypes
|
||||
|
||||
from homeassistant.components.alarm_control_panel import AlarmControlPanelEntity
|
||||
from homeassistant.components.alarm_control_panel.const import (
|
||||
SUPPORT_ALARM_ARM_AWAY,
|
||||
SUPPORT_ALARM_ARM_HOME,
|
||||
SUPPORT_ALARM_ARM_NIGHT,
|
||||
from homeassistant.components.alarm_control_panel import (
|
||||
AlarmControlPanelEntity,
|
||||
AlarmControlPanelEntityFeature,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import (
|
||||
|
@ -67,6 +65,12 @@ async def async_setup_entry(
|
|||
class HomeKitAlarmControlPanelEntity(HomeKitEntity, AlarmControlPanelEntity):
|
||||
"""Representation of a Homekit Alarm Control Panel."""
|
||||
|
||||
_attr_supported_features = (
|
||||
AlarmControlPanelEntityFeature.ARM_HOME
|
||||
| AlarmControlPanelEntityFeature.ARM_AWAY
|
||||
| AlarmControlPanelEntityFeature.ARM_NIGHT
|
||||
)
|
||||
|
||||
def get_characteristic_types(self) -> list[str]:
|
||||
"""Define the homekit characteristics the entity cares about."""
|
||||
return [
|
||||
|
@ -87,11 +91,6 @@ class HomeKitAlarmControlPanelEntity(HomeKitEntity, AlarmControlPanelEntity):
|
|||
self.service.value(CharacteristicsTypes.SECURITY_SYSTEM_STATE_CURRENT)
|
||||
]
|
||||
|
||||
@property
|
||||
def supported_features(self) -> int:
|
||||
"""Return the list of supported features."""
|
||||
return SUPPORT_ALARM_ARM_HOME | SUPPORT_ALARM_ARM_AWAY | SUPPORT_ALARM_ARM_NIGHT
|
||||
|
||||
async def async_alarm_disarm(self, code: str | None = None) -> None:
|
||||
"""Send disarm command."""
|
||||
await self.set_alarm_state(STATE_ALARM_DISARMED, code)
|
||||
|
|
|
@ -20,6 +20,7 @@ from homeassistant.components.climate import (
|
|||
DEFAULT_MAX_TEMP,
|
||||
DEFAULT_MIN_TEMP,
|
||||
ClimateEntity,
|
||||
ClimateEntityFeature,
|
||||
)
|
||||
from homeassistant.components.climate.const import (
|
||||
ATTR_HVAC_MODE,
|
||||
|
@ -33,10 +34,6 @@ from homeassistant.components.climate.const import (
|
|||
HVAC_MODE_HEAT,
|
||||
HVAC_MODE_HEAT_COOL,
|
||||
HVAC_MODE_OFF,
|
||||
SUPPORT_SWING_MODE,
|
||||
SUPPORT_TARGET_HUMIDITY,
|
||||
SUPPORT_TARGET_TEMPERATURE,
|
||||
SUPPORT_TARGET_TEMPERATURE_RANGE,
|
||||
SWING_OFF,
|
||||
SWING_VERTICAL,
|
||||
)
|
||||
|
@ -304,7 +301,7 @@ class HomeKitHeaterCoolerEntity(HomeKitEntity, ClimateEntity):
|
|||
def swing_mode(self) -> str:
|
||||
"""Return the swing setting.
|
||||
|
||||
Requires SUPPORT_SWING_MODE.
|
||||
Requires ClimateEntityFeature.SWING_MODE.
|
||||
"""
|
||||
value = self.service.value(CharacteristicsTypes.SWING_MODE)
|
||||
return SWING_MODE_HOMEKIT_TO_HASS[value]
|
||||
|
@ -313,7 +310,7 @@ class HomeKitHeaterCoolerEntity(HomeKitEntity, ClimateEntity):
|
|||
def swing_modes(self) -> list[str]:
|
||||
"""Return the list of available swing modes.
|
||||
|
||||
Requires SUPPORT_SWING_MODE.
|
||||
Requires ClimateEntityFeature.SWING_MODE.
|
||||
"""
|
||||
valid_values = clamp_enum_to_char(
|
||||
SwingModeValues,
|
||||
|
@ -333,13 +330,13 @@ class HomeKitHeaterCoolerEntity(HomeKitEntity, ClimateEntity):
|
|||
features = 0
|
||||
|
||||
if self.service.has(CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD):
|
||||
features |= SUPPORT_TARGET_TEMPERATURE
|
||||
features |= ClimateEntityFeature.TARGET_TEMPERATURE
|
||||
|
||||
if self.service.has(CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD):
|
||||
features |= SUPPORT_TARGET_TEMPERATURE
|
||||
features |= ClimateEntityFeature.TARGET_TEMPERATURE
|
||||
|
||||
if self.service.has(CharacteristicsTypes.SWING_MODE):
|
||||
features |= SUPPORT_SWING_MODE
|
||||
features |= ClimateEntityFeature.SWING_MODE
|
||||
|
||||
return features
|
||||
|
||||
|
@ -384,7 +381,9 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
|||
|
||||
if (
|
||||
(mode == HVAC_MODE_HEAT_COOL)
|
||||
and (SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features)
|
||||
and (
|
||||
ClimateEntityFeature.TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
)
|
||||
and heat_temp
|
||||
and cool_temp
|
||||
):
|
||||
|
@ -429,7 +428,9 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
|||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT, HVAC_MODE_COOL}) or (
|
||||
(MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL})
|
||||
and not (SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features)
|
||||
and not (
|
||||
ClimateEntityFeature.TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
)
|
||||
):
|
||||
return self.service.value(CharacteristicsTypes.TEMPERATURE_TARGET)
|
||||
return None
|
||||
|
@ -439,7 +440,7 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
|||
"""Return the highbound target temperature we try to reach."""
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
|
||||
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
ClimateEntityFeature.TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
):
|
||||
return self.service.value(
|
||||
CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD
|
||||
|
@ -451,7 +452,7 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
|||
"""Return the lowbound target temperature we try to reach."""
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
|
||||
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
ClimateEntityFeature.TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
):
|
||||
return self.service.value(
|
||||
CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD
|
||||
|
@ -463,7 +464,7 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
|||
"""Return the minimum target temp."""
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
|
||||
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
ClimateEntityFeature.TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
):
|
||||
min_temp = self.service[
|
||||
CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD
|
||||
|
@ -485,7 +486,7 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
|||
"""Return the maximum target temp."""
|
||||
value = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET)
|
||||
if (MODE_HOMEKIT_TO_HASS.get(value) in {HVAC_MODE_HEAT_COOL}) and (
|
||||
SUPPORT_TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
ClimateEntityFeature.TARGET_TEMPERATURE_RANGE & self.supported_features
|
||||
):
|
||||
max_temp = self.service[
|
||||
CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD
|
||||
|
@ -566,15 +567,15 @@ class HomeKitClimateEntity(HomeKitEntity, ClimateEntity):
|
|||
features = 0
|
||||
|
||||
if self.service.has(CharacteristicsTypes.TEMPERATURE_TARGET):
|
||||
features |= SUPPORT_TARGET_TEMPERATURE
|
||||
features |= ClimateEntityFeature.TARGET_TEMPERATURE
|
||||
|
||||
if self.service.has(
|
||||
CharacteristicsTypes.TEMPERATURE_COOLING_THRESHOLD
|
||||
) and self.service.has(CharacteristicsTypes.TEMPERATURE_HEATING_THRESHOLD):
|
||||
features |= SUPPORT_TARGET_TEMPERATURE_RANGE
|
||||
features |= ClimateEntityFeature.TARGET_TEMPERATURE_RANGE
|
||||
|
||||
if self.service.has(CharacteristicsTypes.RELATIVE_HUMIDITY_TARGET):
|
||||
features |= SUPPORT_TARGET_HUMIDITY
|
||||
features |= ClimateEntityFeature.TARGET_HUMIDITY
|
||||
|
||||
return features
|
||||
|
||||
|
|
|
@ -9,15 +9,9 @@ from aiohomekit.model.services import Service, ServicesTypes
|
|||
from homeassistant.components.cover import (
|
||||
ATTR_POSITION,
|
||||
ATTR_TILT_POSITION,
|
||||
SUPPORT_CLOSE,
|
||||
SUPPORT_CLOSE_TILT,
|
||||
SUPPORT_OPEN,
|
||||
SUPPORT_OPEN_TILT,
|
||||
SUPPORT_SET_POSITION,
|
||||
SUPPORT_SET_TILT_POSITION,
|
||||
SUPPORT_STOP,
|
||||
CoverDeviceClass,
|
||||
CoverEntity,
|
||||
CoverEntityFeature,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import STATE_CLOSED, STATE_CLOSING, STATE_OPEN, STATE_OPENING
|
||||
|
@ -65,6 +59,7 @@ class HomeKitGarageDoorCover(HomeKitEntity, CoverEntity):
|
|||
"""Representation of a HomeKit Garage Door."""
|
||||
|
||||
_attr_device_class = CoverDeviceClass.GARAGE
|
||||
_attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
|
||||
|
||||
def get_characteristic_types(self) -> list[str]:
|
||||
"""Define the homekit characteristics the entity cares about."""
|
||||
|
@ -74,11 +69,6 @@ class HomeKitGarageDoorCover(HomeKitEntity, CoverEntity):
|
|||
CharacteristicsTypes.OBSTRUCTION_DETECTED,
|
||||
]
|
||||
|
||||
@property
|
||||
def supported_features(self) -> int:
|
||||
"""Flag supported features."""
|
||||
return SUPPORT_OPEN | SUPPORT_CLOSE
|
||||
|
||||
@property
|
||||
def _state(self) -> str:
|
||||
"""Return the current state of the garage door."""
|
||||
|
@ -143,10 +133,14 @@ class HomeKitWindowCover(HomeKitEntity, CoverEntity):
|
|||
@property
|
||||
def supported_features(self) -> int:
|
||||
"""Flag supported features."""
|
||||
features = SUPPORT_OPEN | SUPPORT_CLOSE | SUPPORT_SET_POSITION
|
||||
features = (
|
||||
CoverEntityFeature.OPEN
|
||||
| CoverEntityFeature.CLOSE
|
||||
| CoverEntityFeature.SET_POSITION
|
||||
)
|
||||
|
||||
if self.service.has(CharacteristicsTypes.POSITION_HOLD):
|
||||
features |= SUPPORT_STOP
|
||||
features |= CoverEntityFeature.STOP
|
||||
|
||||
supports_tilt = any(
|
||||
(
|
||||
|
@ -157,7 +151,9 @@ class HomeKitWindowCover(HomeKitEntity, CoverEntity):
|
|||
|
||||
if supports_tilt:
|
||||
features |= (
|
||||
SUPPORT_OPEN_TILT | SUPPORT_CLOSE_TILT | SUPPORT_SET_TILT_POSITION
|
||||
CoverEntityFeature.OPEN_TILT
|
||||
| CoverEntityFeature.CLOSE_TILT
|
||||
| CoverEntityFeature.SET_TILT_POSITION
|
||||
)
|
||||
|
||||
return features
|
||||
|
|
|
@ -9,10 +9,8 @@ from aiohomekit.model.services import Service, ServicesTypes
|
|||
from homeassistant.components.fan import (
|
||||
DIRECTION_FORWARD,
|
||||
DIRECTION_REVERSE,
|
||||
SUPPORT_DIRECTION,
|
||||
SUPPORT_OSCILLATE,
|
||||
SUPPORT_SET_SPEED,
|
||||
FanEntity,
|
||||
FanEntityFeature,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
|
@ -76,13 +74,13 @@ class BaseHomeKitFan(HomeKitEntity, FanEntity):
|
|||
features = 0
|
||||
|
||||
if self.service.has(CharacteristicsTypes.ROTATION_DIRECTION):
|
||||
features |= SUPPORT_DIRECTION
|
||||
features |= FanEntityFeature.DIRECTION
|
||||
|
||||
if self.service.has(CharacteristicsTypes.ROTATION_SPEED):
|
||||
features |= SUPPORT_SET_SPEED
|
||||
features |= FanEntityFeature.SET_SPEED
|
||||
|
||||
if self.service.has(CharacteristicsTypes.SWING_MODE):
|
||||
features |= SUPPORT_OSCILLATE
|
||||
features |= FanEntityFeature.OSCILLATE
|
||||
|
||||
return features
|
||||
|
||||
|
@ -127,7 +125,10 @@ class BaseHomeKitFan(HomeKitEntity, FanEntity):
|
|||
if not self.is_on:
|
||||
characteristics[self.on_characteristic] = True
|
||||
|
||||
if percentage is not None and self.supported_features & SUPPORT_SET_SPEED:
|
||||
if (
|
||||
percentage is not None
|
||||
and self.supported_features & FanEntityFeature.SET_SPEED
|
||||
):
|
||||
characteristics[CharacteristicsTypes.ROTATION_SPEED] = percentage
|
||||
|
||||
if characteristics:
|
||||
|
|
|
@ -6,13 +6,16 @@ from typing import Any
|
|||
from aiohomekit.model.characteristics import CharacteristicsTypes
|
||||
from aiohomekit.model.services import Service, ServicesTypes
|
||||
|
||||
from homeassistant.components.humidifier import HumidifierDeviceClass, HumidifierEntity
|
||||
from homeassistant.components.humidifier import (
|
||||
HumidifierDeviceClass,
|
||||
HumidifierEntity,
|
||||
HumidifierEntityFeature,
|
||||
)
|
||||
from homeassistant.components.humidifier.const import (
|
||||
DEFAULT_MAX_HUMIDITY,
|
||||
DEFAULT_MIN_HUMIDITY,
|
||||
MODE_AUTO,
|
||||
MODE_NORMAL,
|
||||
SUPPORT_MODES,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
|
@ -20,8 +23,6 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|||
|
||||
from . import KNOWN_DEVICES, HomeKitEntity
|
||||
|
||||
SUPPORT_FLAGS = 0
|
||||
|
||||
HK_MODE_TO_HA = {
|
||||
0: "off",
|
||||
1: MODE_AUTO,
|
||||
|
@ -40,6 +41,7 @@ class HomeKitHumidifier(HomeKitEntity, HumidifierEntity):
|
|||
"""Representation of a HomeKit Controller Humidifier."""
|
||||
|
||||
_attr_device_class = HumidifierDeviceClass.HUMIDIFIER
|
||||
_attr_supported_features = HumidifierEntityFeature.MODES
|
||||
|
||||
def get_characteristic_types(self) -> list[str]:
|
||||
"""Define the homekit characteristics the entity cares about."""
|
||||
|
@ -50,11 +52,6 @@ class HomeKitHumidifier(HomeKitEntity, HumidifierEntity):
|
|||
CharacteristicsTypes.RELATIVE_HUMIDITY_HUMIDIFIER_THRESHOLD,
|
||||
]
|
||||
|
||||
@property
|
||||
def supported_features(self) -> int:
|
||||
"""Return the list of supported features."""
|
||||
return SUPPORT_FLAGS | SUPPORT_MODES
|
||||
|
||||
@property
|
||||
def is_on(self) -> bool:
|
||||
"""Return true if device is on."""
|
||||
|
@ -79,7 +76,7 @@ class HomeKitHumidifier(HomeKitEntity, HumidifierEntity):
|
|||
def mode(self) -> str | None:
|
||||
"""Return the current mode, e.g., home, auto, baby.
|
||||
|
||||
Requires SUPPORT_MODES.
|
||||
Requires HumidifierEntityFeature.MODES.
|
||||
"""
|
||||
mode = self.service.value(
|
||||
CharacteristicsTypes.CURRENT_HUMIDIFIER_DEHUMIDIFIER_STATE
|
||||
|
@ -90,7 +87,7 @@ class HomeKitHumidifier(HomeKitEntity, HumidifierEntity):
|
|||
def available_modes(self) -> list[str] | None:
|
||||
"""Return a list of available modes.
|
||||
|
||||
Requires SUPPORT_MODES.
|
||||
Requires HumidifierEntityFeature.MODES.
|
||||
"""
|
||||
available_modes = [
|
||||
MODE_NORMAL,
|
||||
|
@ -147,6 +144,7 @@ class HomeKitDehumidifier(HomeKitEntity, HumidifierEntity):
|
|||
"""Representation of a HomeKit Controller Humidifier."""
|
||||
|
||||
_attr_device_class = HumidifierDeviceClass.DEHUMIDIFIER
|
||||
_attr_supported_features = HumidifierEntityFeature.MODES
|
||||
|
||||
def get_characteristic_types(self) -> list[str]:
|
||||
"""Define the homekit characteristics the entity cares about."""
|
||||
|
@ -158,11 +156,6 @@ class HomeKitDehumidifier(HomeKitEntity, HumidifierEntity):
|
|||
CharacteristicsTypes.RELATIVE_HUMIDITY_DEHUMIDIFIER_THRESHOLD,
|
||||
]
|
||||
|
||||
@property
|
||||
def supported_features(self) -> int:
|
||||
"""Return the list of supported features."""
|
||||
return SUPPORT_FLAGS | SUPPORT_MODES
|
||||
|
||||
@property
|
||||
def is_on(self) -> bool:
|
||||
"""Return true if device is on."""
|
||||
|
@ -187,7 +180,7 @@ class HomeKitDehumidifier(HomeKitEntity, HumidifierEntity):
|
|||
def mode(self) -> str | None:
|
||||
"""Return the current mode, e.g., home, auto, baby.
|
||||
|
||||
Requires SUPPORT_MODES.
|
||||
Requires HumidifierEntityFeature.MODES.
|
||||
"""
|
||||
mode = self.service.value(
|
||||
CharacteristicsTypes.CURRENT_HUMIDIFIER_DEHUMIDIFIER_STATE
|
||||
|
@ -198,7 +191,7 @@ class HomeKitDehumidifier(HomeKitEntity, HumidifierEntity):
|
|||
def available_modes(self) -> list[str] | None:
|
||||
"""Return a list of available modes.
|
||||
|
||||
Requires SUPPORT_MODES.
|
||||
Requires HumidifierEntityFeature.MODES.
|
||||
"""
|
||||
available_modes = [
|
||||
MODE_NORMAL,
|
||||
|
|
|
@ -15,12 +15,7 @@ from aiohomekit.utils import clamp_enum_to_char
|
|||
from homeassistant.components.media_player import (
|
||||
MediaPlayerDeviceClass,
|
||||
MediaPlayerEntity,
|
||||
)
|
||||
from homeassistant.components.media_player.const import (
|
||||
SUPPORT_PAUSE,
|
||||
SUPPORT_PLAY,
|
||||
SUPPORT_SELECT_SOURCE,
|
||||
SUPPORT_STOP,
|
||||
MediaPlayerEntityFeature,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import (
|
||||
|
@ -89,23 +84,23 @@ class HomeKitTelevision(HomeKitEntity, MediaPlayerEntity):
|
|||
features = 0
|
||||
|
||||
if self.service.has(CharacteristicsTypes.ACTIVE_IDENTIFIER):
|
||||
features |= SUPPORT_SELECT_SOURCE
|
||||
features |= MediaPlayerEntityFeature.SELECT_SOURCE
|
||||
|
||||
if self.service.has(CharacteristicsTypes.TARGET_MEDIA_STATE):
|
||||
if TargetMediaStateValues.PAUSE in self.supported_media_states:
|
||||
features |= SUPPORT_PAUSE
|
||||
features |= MediaPlayerEntityFeature.PAUSE
|
||||
|
||||
if TargetMediaStateValues.PLAY in self.supported_media_states:
|
||||
features |= SUPPORT_PLAY
|
||||
features |= MediaPlayerEntityFeature.PLAY
|
||||
|
||||
if TargetMediaStateValues.STOP in self.supported_media_states:
|
||||
features |= SUPPORT_STOP
|
||||
features |= MediaPlayerEntityFeature.STOP
|
||||
|
||||
if (
|
||||
self.service.has(CharacteristicsTypes.REMOTE_KEY)
|
||||
and RemoteKeyValues.PLAY_PAUSE in self.supported_remote_keys
|
||||
):
|
||||
features |= SUPPORT_PAUSE | SUPPORT_PLAY
|
||||
features |= MediaPlayerEntityFeature.PAUSE | MediaPlayerEntityFeature.PLAY
|
||||
|
||||
return features
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue