diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py index 44573c0a6da..aecca5a4029 100644 --- a/homeassistant/components/cover/__init__.py +++ b/homeassistant/components/cover/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations from dataclasses import dataclass from datetime import timedelta +from enum import IntEnum import functools as ft import logging from typing import Any, final @@ -79,6 +80,22 @@ DEVICE_CLASS_SHADE = CoverDeviceClass.SHADE.value DEVICE_CLASS_SHUTTER = CoverDeviceClass.SHUTTER.value DEVICE_CLASS_WINDOW = CoverDeviceClass.WINDOW.value + +class CoverEntityFeature(IntEnum): + """Supported features of the cover entity.""" + + OPEN = 1 + CLOSE = 2 + SET_POSITION = 4 + STOP = 8 + OPEN_TILT = 16 + CLOSE_TILT = 32 + STOP_TILT = 64 + SET_TILT_POSITION = 128 + + +# These SUPPORT_* constants are deprecated as of Home Assistant 2022.5. +# Please use the CoverEntityFeature enum instead. SUPPORT_OPEN = 1 SUPPORT_CLOSE = 2 SUPPORT_SET_POSITION = 4 @@ -109,11 +126,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: await component.async_setup(config) component.async_register_entity_service( - SERVICE_OPEN_COVER, {}, "async_open_cover", [SUPPORT_OPEN] + SERVICE_OPEN_COVER, {}, "async_open_cover", [CoverEntityFeature.OPEN] ) component.async_register_entity_service( - SERVICE_CLOSE_COVER, {}, "async_close_cover", [SUPPORT_CLOSE] + SERVICE_CLOSE_COVER, {}, "async_close_cover", [CoverEntityFeature.CLOSE] ) component.async_register_entity_service( @@ -124,27 +141,39 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) }, "async_set_cover_position", - [SUPPORT_SET_POSITION], + [CoverEntityFeature.SET_POSITION], ) component.async_register_entity_service( - SERVICE_STOP_COVER, {}, "async_stop_cover", [SUPPORT_STOP] + SERVICE_STOP_COVER, {}, "async_stop_cover", [CoverEntityFeature.STOP] ) component.async_register_entity_service( - SERVICE_TOGGLE, {}, "async_toggle", [SUPPORT_OPEN | SUPPORT_CLOSE] + SERVICE_TOGGLE, + {}, + "async_toggle", + [CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE], ) component.async_register_entity_service( - SERVICE_OPEN_COVER_TILT, {}, "async_open_cover_tilt", [SUPPORT_OPEN_TILT] + SERVICE_OPEN_COVER_TILT, + {}, + "async_open_cover_tilt", + [CoverEntityFeature.OPEN_TILT], ) component.async_register_entity_service( - SERVICE_CLOSE_COVER_TILT, {}, "async_close_cover_tilt", [SUPPORT_CLOSE_TILT] + SERVICE_CLOSE_COVER_TILT, + {}, + "async_close_cover_tilt", + [CoverEntityFeature.CLOSE_TILT], ) component.async_register_entity_service( - SERVICE_STOP_COVER_TILT, {}, "async_stop_cover_tilt", [SUPPORT_STOP_TILT] + SERVICE_STOP_COVER_TILT, + {}, + "async_stop_cover_tilt", + [CoverEntityFeature.STOP_TILT], ) component.async_register_entity_service( @@ -155,14 +184,14 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) }, "async_set_cover_tilt_position", - [SUPPORT_SET_TILT_POSITION], + [CoverEntityFeature.SET_TILT_POSITION], ) component.async_register_entity_service( SERVICE_TOGGLE_COVER_TILT, {}, "async_toggle_tilt", - [SUPPORT_OPEN_TILT | SUPPORT_CLOSE_TILT], + [CoverEntityFeature.OPEN_TILT | CoverEntityFeature.CLOSE_TILT], ) return True @@ -262,17 +291,19 @@ class CoverEntity(Entity): if self._attr_supported_features is not None: return self._attr_supported_features - supported_features = SUPPORT_OPEN | SUPPORT_CLOSE | SUPPORT_STOP + supported_features = ( + CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE | CoverEntityFeature.STOP + ) if self.current_cover_position is not None: - supported_features |= SUPPORT_SET_POSITION + supported_features |= CoverEntityFeature.SET_POSITION if self.current_cover_tilt_position is not None: supported_features |= ( - SUPPORT_OPEN_TILT - | SUPPORT_CLOSE_TILT - | SUPPORT_STOP_TILT - | SUPPORT_SET_TILT_POSITION + CoverEntityFeature.OPEN_TILT + | CoverEntityFeature.CLOSE_TILT + | CoverEntityFeature.STOP_TILT + | CoverEntityFeature.SET_TILT_POSITION ) return supported_features @@ -395,7 +426,7 @@ class CoverEntity(Entity): await self.async_close_cover_tilt(**kwargs) def _get_toggle_function(self, fns): - if SUPPORT_STOP | self.supported_features and ( + if CoverEntityFeature.STOP | self.supported_features and ( self.is_closing or self.is_opening ): return fns["stop"] diff --git a/homeassistant/components/demo/cover.py b/homeassistant/components/demo/cover.py index dab85964639..9a1ea6239ee 100644 --- a/homeassistant/components/demo/cover.py +++ b/homeassistant/components/demo/cover.py @@ -4,14 +4,9 @@ from __future__ import annotations from homeassistant.components.cover import ( ATTR_POSITION, ATTR_TILT_POSITION, - SUPPORT_CLOSE, - SUPPORT_CLOSE_TILT, - SUPPORT_OPEN, - SUPPORT_OPEN_TILT, - SUPPORT_SET_TILT_POSITION, - SUPPORT_STOP_TILT, CoverDeviceClass, CoverEntity, + CoverEntityFeature, ) from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback @@ -40,7 +35,7 @@ async def async_setup_platform( "cover_4", "Garage Door", device_class=CoverDeviceClass.GARAGE, - supported_features=(SUPPORT_OPEN | SUPPORT_CLOSE), + supported_features=(CoverEntityFeature.OPEN | CoverEntityFeature.CLOSE), ), DemoCover( hass, @@ -48,10 +43,10 @@ async def async_setup_platform( "Pergola Roof", tilt_position=60, supported_features=( - SUPPORT_OPEN_TILT - | SUPPORT_STOP_TILT - | SUPPORT_CLOSE_TILT - | SUPPORT_SET_TILT_POSITION + CoverEntityFeature.OPEN_TILT + | CoverEntityFeature.STOP_TILT + | CoverEntityFeature.CLOSE_TILT + | CoverEntityFeature.SET_TILT_POSITION ), ), ]