From 20c1a155b622a8c2a1d7462db6d4e79b1ce6e070 Mon Sep 17 00:00:00 2001
From: epenet <6771947+epenet@users.noreply.github.com>
Date: Wed, 6 Apr 2022 10:46:44 +0200
Subject: [PATCH] Use EntityFeature enum in components (g**) (#69394)

---
 homeassistant/components/generic/camera.py    | 11 ++----
 .../generic_hygrostat/humidifier.py           | 12 ++----
 .../components/generic_thermostat/climate.py  | 18 ++++-----
 homeassistant/components/gogogate2/cover.py   |  6 +--
 .../components/gpmdp/media_player.py          | 37 +++++++------------
 homeassistant/components/gree/climate.py      | 25 ++++---------
 .../components/gstreamer/media_player.py      | 34 +++++++----------
 tests/components/gree/test_climate.py         | 14 ++++---
 8 files changed, 60 insertions(+), 97 deletions(-)

diff --git a/homeassistant/components/generic/camera.py b/homeassistant/components/generic/camera.py
index 72fec27b733..e83cb0df0aa 100644
--- a/homeassistant/components/generic/camera.py
+++ b/homeassistant/components/generic/camera.py
@@ -9,8 +9,8 @@ import voluptuous as vol
 from homeassistant.components.camera import (
     DEFAULT_CONTENT_TYPE,
     PLATFORM_SCHEMA,
-    SUPPORT_STREAM,
     Camera,
+    CameraEntityFeature,
 )
 from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
 from homeassistant.const import (
@@ -150,7 +150,9 @@ class GenericCamera(Camera):
             self._stream_source.hass = hass
         self._limit_refetch = device_info[CONF_LIMIT_REFETCH_TO_URL_CHANGE]
         self._attr_frame_interval = 1 / device_info[CONF_FRAMERATE]
-        self._supported_features = SUPPORT_STREAM if self._stream_source else 0
+        self._attr_supported_features = (
+            CameraEntityFeature.STREAM if self._stream_source else 0
+        )
         self.content_type = device_info[CONF_CONTENT_TYPE]
         self.verify_ssl = device_info[CONF_VERIFY_SSL]
         if device_info.get(CONF_RTSP_TRANSPORT):
@@ -162,11 +164,6 @@ class GenericCamera(Camera):
         self._last_url = None
         self._last_image = None
 
-    @property
-    def supported_features(self):
-        """Return supported features for this camera."""
-        return self._supported_features
-
     async def async_camera_image(
         self, width: int | None = None, height: int | None = None
     ) -> bytes | None:
diff --git a/homeassistant/components/generic_hygrostat/humidifier.py b/homeassistant/components/generic_hygrostat/humidifier.py
index 05851bf339d..fa8b05b5ef8 100644
--- a/homeassistant/components/generic_hygrostat/humidifier.py
+++ b/homeassistant/components/generic_hygrostat/humidifier.py
@@ -8,12 +8,12 @@ from homeassistant.components.humidifier import (
     PLATFORM_SCHEMA,
     HumidifierDeviceClass,
     HumidifierEntity,
+    HumidifierEntityFeature,
 )
 from homeassistant.components.humidifier.const import (
     ATTR_HUMIDITY,
     MODE_AWAY,
     MODE_NORMAL,
-    SUPPORT_MODES,
 )
 from homeassistant.const import (
     ATTR_ENTITY_ID,
@@ -57,7 +57,6 @@ _LOGGER = logging.getLogger(__name__)
 
 ATTR_SAVED_HUMIDITY = "saved_humidity"
 
-SUPPORT_FLAGS = 0
 
 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(HYGROSTAT_SCHEMA.schema)
 
@@ -148,9 +147,9 @@ class GenericHygrostat(HumidifierEntity, RestoreEntity):
         self._min_humidity = min_humidity
         self._max_humidity = max_humidity
         self._target_humidity = target_humidity
-        self._support_flags = SUPPORT_FLAGS
+        self._attr_supported_features = 0
         if away_humidity:
-            self._support_flags = SUPPORT_FLAGS | SUPPORT_MODES
+            self._attr_supported_features |= HumidifierEntityFeature.MODES
         self._away_humidity = away_humidity
         self._away_fixed = away_fixed
         self._sensor_stale_duration = sensor_stale_duration
@@ -434,11 +433,6 @@ class GenericHygrostat(HumidifierEntity, RestoreEntity):
         """If the toggleable device is currently active."""
         return self.hass.states.is_state(self._switch_entity_id, STATE_ON)
 
-    @property
-    def supported_features(self):
-        """Return the list of supported features."""
-        return self._support_flags
-
     async def _async_device_turn_on(self):
         """Turn humidifier toggleable device on."""
         data = {ATTR_ENTITY_ID: self._switch_entity_id}
diff --git a/homeassistant/components/generic_thermostat/climate.py b/homeassistant/components/generic_thermostat/climate.py
index b9fdcbbfd94..56b0dad3416 100644
--- a/homeassistant/components/generic_thermostat/climate.py
+++ b/homeassistant/components/generic_thermostat/climate.py
@@ -7,7 +7,11 @@ import math
 
 import voluptuous as vol
 
-from homeassistant.components.climate import PLATFORM_SCHEMA, ClimateEntity
+from homeassistant.components.climate import (
+    PLATFORM_SCHEMA,
+    ClimateEntity,
+    ClimateEntityFeature,
+)
 from homeassistant.components.climate.const import (
     ATTR_PRESET_MODE,
     CURRENT_HVAC_COOL,
@@ -23,8 +27,6 @@ from homeassistant.components.climate.const import (
     PRESET_HOME,
     PRESET_NONE,
     PRESET_SLEEP,
-    SUPPORT_PRESET_MODE,
-    SUPPORT_TARGET_TEMPERATURE,
 )
 from homeassistant.const import (
     ATTR_ENTITY_ID,
@@ -73,7 +75,6 @@ CONF_HOT_TOLERANCE = "hot_tolerance"
 CONF_KEEP_ALIVE = "keep_alive"
 CONF_INITIAL_HVAC_MODE = "initial_hvac_mode"
 CONF_PRECISION = "precision"
-SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE
 
 CONF_PRESETS = {
     p: f"{p}_temp"
@@ -210,9 +211,9 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
         self._target_temp = target_temp
         self._unit = unit
         self._unique_id = unique_id
-        self._support_flags = SUPPORT_FLAGS
+        self._attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE
         if len(presets):
-            self._support_flags = SUPPORT_FLAGS | SUPPORT_PRESET_MODE
+            self._attr_supported_features |= ClimateEntityFeature.PRESET_MODE
             self._attr_preset_modes = [PRESET_NONE] + list(presets.keys())
         else:
             self._attr_preset_modes = [PRESET_NONE]
@@ -524,11 +525,6 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
 
         return self.hass.states.is_state(self.heater_entity_id, STATE_ON)
 
-    @property
-    def supported_features(self):
-        """Return the list of supported features."""
-        return self._support_flags
-
     async def _async_heater_turn_on(self):
         """Turn heater toggleable device on."""
         data = {ATTR_ENTITY_ID: self.heater_entity_id}
diff --git a/homeassistant/components/gogogate2/cover.py b/homeassistant/components/gogogate2/cover.py
index 69eba3390d8..af3bd1c7530 100644
--- a/homeassistant/components/gogogate2/cover.py
+++ b/homeassistant/components/gogogate2/cover.py
@@ -9,10 +9,9 @@ from ismartgate.common import (
 )
 
 from homeassistant.components.cover import (
-    SUPPORT_CLOSE,
-    SUPPORT_OPEN,
     CoverDeviceClass,
     CoverEntity,
+    CoverEntityFeature,
 )
 from homeassistant.config_entries import ConfigEntry
 from homeassistant.core import HomeAssistant
@@ -45,6 +44,8 @@ async def async_setup_entry(
 class DeviceCover(GoGoGate2Entity, CoverEntity):
     """Cover entity for gogogate2."""
 
+    _attr_supported_features = CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE
+
     def __init__(
         self,
         config_entry: ConfigEntry,
@@ -54,7 +55,6 @@ class DeviceCover(GoGoGate2Entity, CoverEntity):
         """Initialize the object."""
         unique_id = cover_unique_id(config_entry, door)
         super().__init__(config_entry, data_update_coordinator, door, unique_id)
-        self._attr_supported_features = SUPPORT_OPEN | SUPPORT_CLOSE
         self._attr_device_class = (
             CoverDeviceClass.GATE if self.door.gate else CoverDeviceClass.GARAGE
         )
diff --git a/homeassistant/components/gpmdp/media_player.py b/homeassistant/components/gpmdp/media_player.py
index d156f144eec..b2861e4d96d 100644
--- a/homeassistant/components/gpmdp/media_player.py
+++ b/homeassistant/components/gpmdp/media_player.py
@@ -11,16 +11,12 @@ import voluptuous as vol
 from websocket import _exceptions, create_connection
 
 from homeassistant.components import configurator
-from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
-from homeassistant.components.media_player.const import (
-    MEDIA_TYPE_MUSIC,
-    SUPPORT_NEXT_TRACK,
-    SUPPORT_PAUSE,
-    SUPPORT_PLAY,
-    SUPPORT_PREVIOUS_TRACK,
-    SUPPORT_SEEK,
-    SUPPORT_VOLUME_SET,
+from homeassistant.components.media_player import (
+    PLATFORM_SCHEMA,
+    MediaPlayerEntity,
+    MediaPlayerEntityFeature,
 )
+from homeassistant.components.media_player.const import MEDIA_TYPE_MUSIC
 from homeassistant.const import (
     CONF_HOST,
     CONF_NAME,
@@ -44,15 +40,6 @@ DEFAULT_PORT = 5672
 
 GPMDP_CONFIG_FILE = "gpmpd.conf"
 
-SUPPORT_GPMDP = (
-    SUPPORT_PAUSE
-    | SUPPORT_PREVIOUS_TRACK
-    | SUPPORT_NEXT_TRACK
-    | SUPPORT_SEEK
-    | SUPPORT_VOLUME_SET
-    | SUPPORT_PLAY
-)
-
 PLAYBACK_DICT = {"0": STATE_PAUSED, "1": STATE_PAUSED, "2": STATE_PLAYING}  # Stopped
 
 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
@@ -179,6 +166,15 @@ def setup_platform(
 class GPMDP(MediaPlayerEntity):
     """Representation of a GPMDP."""
 
+    _attr_supported_features = (
+        MediaPlayerEntityFeature.PAUSE
+        | MediaPlayerEntityFeature.PREVIOUS_TRACK
+        | MediaPlayerEntityFeature.NEXT_TRACK
+        | MediaPlayerEntityFeature.SEEK
+        | MediaPlayerEntityFeature.VOLUME_SET
+        | MediaPlayerEntityFeature.PLAY
+    )
+
     def __init__(self, name, url, code):
         """Initialize the media player."""
 
@@ -321,11 +317,6 @@ class GPMDP(MediaPlayerEntity):
         """Return the name of the device."""
         return self._name
 
-    @property
-    def supported_features(self):
-        """Flag media player features that are supported."""
-        return SUPPORT_GPMDP
-
     def media_next_track(self):
         """Send media_next command to media player."""
         self.send_gpmdp_msg("playback", "forward", False)
diff --git a/homeassistant/components/gree/climate.py b/homeassistant/components/gree/climate.py
index 3bff375e320..585f52530fc 100644
--- a/homeassistant/components/gree/climate.py
+++ b/homeassistant/components/gree/climate.py
@@ -15,7 +15,7 @@ from greeclimate.device import (
     VerticalSwing,
 )
 
-from homeassistant.components.climate import ClimateEntity
+from homeassistant.components.climate import ClimateEntity, ClimateEntityFeature
 from homeassistant.components.climate.const import (
     FAN_AUTO,
     FAN_HIGH,
@@ -32,10 +32,6 @@ from homeassistant.components.climate.const import (
     PRESET_ECO,
     PRESET_NONE,
     PRESET_SLEEP,
-    SUPPORT_FAN_MODE,
-    SUPPORT_PRESET_MODE,
-    SUPPORT_SWING_MODE,
-    SUPPORT_TARGET_TEMPERATURE,
     SWING_BOTH,
     SWING_HORIZONTAL,
     SWING_OFF,
@@ -96,13 +92,6 @@ FAN_MODES_REVERSE = {v: k for k, v in FAN_MODES.items()}
 
 SWING_MODES = [SWING_OFF, SWING_VERTICAL, SWING_HORIZONTAL, SWING_BOTH]
 
-SUPPORTED_FEATURES = (
-    SUPPORT_TARGET_TEMPERATURE
-    | SUPPORT_FAN_MODE
-    | SUPPORT_PRESET_MODE
-    | SUPPORT_SWING_MODE
-)
-
 
 async def async_setup_entry(
     hass: HomeAssistant,
@@ -127,6 +116,13 @@ async def async_setup_entry(
 class GreeClimateEntity(CoordinatorEntity, ClimateEntity):
     """Representation of a Gree HVAC device."""
 
+    _attr_supported_features = (
+        ClimateEntityFeature.TARGET_TEMPERATURE
+        | ClimateEntityFeature.FAN_MODE
+        | ClimateEntityFeature.PRESET_MODE
+        | ClimateEntityFeature.SWING_MODE
+    )
+
     def __init__(self, coordinator):
         """Initialize the Gree device."""
         super().__init__(coordinator)
@@ -365,8 +361,3 @@ class GreeClimateEntity(CoordinatorEntity, ClimateEntity):
     def swing_modes(self) -> list[str]:
         """Return the swing modes currently supported for this device."""
         return SWING_MODES
-
-    @property
-    def supported_features(self) -> int:
-        """Return the supported features for this device integration."""
-        return SUPPORTED_FEATURES
diff --git a/homeassistant/components/gstreamer/media_player.py b/homeassistant/components/gstreamer/media_player.py
index 123ea860d3b..d1b0fb056ff 100644
--- a/homeassistant/components/gstreamer/media_player.py
+++ b/homeassistant/components/gstreamer/media_player.py
@@ -6,15 +6,12 @@ import logging
 from gsp import GstreamerPlayer
 import voluptuous as vol
 
-from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
-from homeassistant.components.media_player.const import (
-    MEDIA_TYPE_MUSIC,
-    SUPPORT_NEXT_TRACK,
-    SUPPORT_PAUSE,
-    SUPPORT_PLAY,
-    SUPPORT_PLAY_MEDIA,
-    SUPPORT_VOLUME_SET,
+from homeassistant.components.media_player import (
+    PLATFORM_SCHEMA,
+    MediaPlayerEntity,
+    MediaPlayerEntityFeature,
 )
+from homeassistant.components.media_player.const import MEDIA_TYPE_MUSIC
 from homeassistant.const import CONF_NAME, EVENT_HOMEASSISTANT_STOP, STATE_IDLE
 from homeassistant.core import HomeAssistant
 import homeassistant.helpers.config_validation as cv
@@ -27,14 +24,6 @@ CONF_PIPELINE = "pipeline"
 
 DOMAIN = "gstreamer"
 
-SUPPORT_GSTREAMER = (
-    SUPPORT_VOLUME_SET
-    | SUPPORT_PLAY
-    | SUPPORT_PAUSE
-    | SUPPORT_PLAY_MEDIA
-    | SUPPORT_NEXT_TRACK
-)
-
 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
     {vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_PIPELINE): cv.string}
 )
@@ -63,6 +52,14 @@ def setup_platform(
 class GstreamerDevice(MediaPlayerEntity):
     """Representation of a Gstreamer device."""
 
+    _attr_supported_features = (
+        MediaPlayerEntityFeature.VOLUME_SET
+        | MediaPlayerEntityFeature.PLAY
+        | MediaPlayerEntityFeature.PAUSE
+        | MediaPlayerEntityFeature.PLAY_MEDIA
+        | MediaPlayerEntityFeature.NEXT_TRACK
+    )
+
     def __init__(self, player, name):
         """Initialize the Gstreamer device."""
         self._player = player
@@ -128,11 +125,6 @@ class GstreamerDevice(MediaPlayerEntity):
         """Return the volume level."""
         return self._volume
 
-    @property
-    def supported_features(self):
-        """Flag media player features that are supported."""
-        return SUPPORT_GSTREAMER
-
     @property
     def state(self):
         """Return the state of the player."""
diff --git a/tests/components/gree/test_climate.py b/tests/components/gree/test_climate.py
index ce1d8f3c705..cd9a8f6fdb2 100644
--- a/tests/components/gree/test_climate.py
+++ b/tests/components/gree/test_climate.py
@@ -6,6 +6,7 @@ from greeclimate.device import HorizontalSwing, VerticalSwing
 from greeclimate.exceptions import DeviceNotBoundError, DeviceTimeoutError
 import pytest
 
+from homeassistant.components.climate import ClimateEntityFeature
 from homeassistant.components.climate.const import (
     ATTR_CURRENT_TEMPERATURE,
     ATTR_FAN_MODE,
@@ -38,11 +39,7 @@ from homeassistant.components.climate.const import (
     SWING_OFF,
     SWING_VERTICAL,
 )
-from homeassistant.components.gree.climate import (
-    FAN_MODES_REVERSE,
-    HVAC_MODES_REVERSE,
-    SUPPORTED_FEATURES,
-)
+from homeassistant.components.gree.climate import FAN_MODES_REVERSE, HVAC_MODES_REVERSE
 from homeassistant.components.gree.const import FAN_MEDIUM_HIGH, FAN_MEDIUM_LOW
 from homeassistant.const import (
     ATTR_ENTITY_ID,
@@ -771,4 +768,9 @@ async def test_supported_features_with_turnon(hass, discovery, device):
     """Test for supported_features property."""
     await async_setup_gree(hass)
     state = hass.states.get(ENTITY_ID)
-    assert state.attributes[ATTR_SUPPORTED_FEATURES] == SUPPORTED_FEATURES
+    assert state.attributes[ATTR_SUPPORTED_FEATURES] == (
+        ClimateEntityFeature.TARGET_TEMPERATURE
+        | ClimateEntityFeature.FAN_MODE
+        | ClimateEntityFeature.PRESET_MODE
+        | ClimateEntityFeature.SWING_MODE
+    )