Use EntityFeature in homekit_controller (#69404)

This commit is contained in:
epenet 2022-04-06 12:04:58 +02:00 committed by GitHub
parent 999e2f3bf0
commit a5b919ec6b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 64 additions and 79 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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