diff --git a/homeassistant/components/cover/services.yaml b/homeassistant/components/cover/services.yaml index 2f8e20464f3f..8ab42c6d3e97 100644 --- a/homeassistant/components/cover/services.yaml +++ b/homeassistant/components/cover/services.yaml @@ -6,6 +6,8 @@ open_cover: target: entity: domain: cover + supported_features: + - cover.CoverEntityFeature.OPEN close_cover: name: Close @@ -13,6 +15,8 @@ close_cover: target: entity: domain: cover + supported_features: + - cover.CoverEntityFeature.CLOSE toggle: name: Toggle @@ -20,6 +24,9 @@ toggle: target: entity: domain: cover + supported_features: + - - cover.CoverEntityFeature.CLOSE + - cover.CoverEntityFeature.OPEN set_cover_position: name: Set position @@ -27,6 +34,8 @@ set_cover_position: target: entity: domain: cover + supported_features: + - cover.CoverEntityFeature.SET_POSITION fields: position: name: Position @@ -44,6 +53,8 @@ stop_cover: target: entity: domain: cover + supported_features: + - cover.CoverEntityFeature.STOP open_cover_tilt: name: Open tilt @@ -51,6 +62,8 @@ open_cover_tilt: target: entity: domain: cover + supported_features: + - cover.CoverEntityFeature.OPEN_TILT close_cover_tilt: name: Close tilt @@ -58,6 +71,8 @@ close_cover_tilt: target: entity: domain: cover + supported_features: + - cover.CoverEntityFeature.CLOSE_TILT toggle_cover_tilt: name: Toggle tilt @@ -65,6 +80,9 @@ toggle_cover_tilt: target: entity: domain: cover + supported_features: + - - cover.CoverEntityFeature.CLOSE_TILT + - cover.CoverEntityFeature.OPEN_TILT set_cover_tilt_position: name: Set tilt position @@ -72,6 +90,8 @@ set_cover_tilt_position: target: entity: domain: cover + supported_features: + - cover.CoverEntityFeature.SET_TILT_POSITION fields: tilt_position: name: Tilt position @@ -89,3 +109,5 @@ stop_cover_tilt: target: entity: domain: cover + supported_features: + - cover.CoverEntityFeature.STOP_TILT diff --git a/homeassistant/helpers/selector.py b/homeassistant/helpers/selector.py index 84c0f769c7ce..abd4d2e623ee 100644 --- a/homeassistant/helpers/selector.py +++ b/homeassistant/helpers/selector.py @@ -122,12 +122,9 @@ def _entity_features() -> dict[str, type[IntFlag]]: } -def _validate_supported_feature(supported_feature: int | str) -> int: +def _validate_supported_feature(supported_feature: str) -> int: """Validate a supported feature and resolve an enum string to its value.""" - if isinstance(supported_feature, int): - return supported_feature - known_entity_features = _entity_features() try: @@ -144,6 +141,20 @@ def _validate_supported_feature(supported_feature: int | str) -> int: raise vol.Invalid(f"Unknown supported feature '{supported_feature}'") from exc +def _validate_supported_features(supported_features: int | list[str]) -> int: + """Validate a supported feature and resolve an enum string to its value.""" + + if isinstance(supported_features, int): + return supported_features + + feature_mask = 0 + + for supported_feature in supported_features: + feature_mask |= _validate_supported_feature(supported_feature) + + return feature_mask + + ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA = vol.Schema( { # Integration that provided the entity @@ -153,7 +164,9 @@ ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA = vol.Schema( # Device class of the entity vol.Optional("device_class"): vol.All(cv.ensure_list, [str]), # Features supported by the entity - vol.Optional("supported_features"): [vol.All(str, _validate_supported_feature)], + vol.Optional("supported_features"): [ + vol.All(cv.ensure_list, [str], _validate_supported_features) + ], } ) diff --git a/tests/helpers/test_selector.py b/tests/helpers/test_selector.py index c518ad227a76..fd2dba4b0845 100644 --- a/tests/helpers/test_selector.py +++ b/tests/helpers/test_selector.py @@ -235,6 +235,22 @@ def test_device_selector_schema(schema, valid_selections, invalid_selections) -> ("light.abc123", "blah.blah", FAKE_UUID), (None,), ), + ( + { + "filter": [ + { + "supported_features": [ + [ + "light.LightEntityFeature.EFFECT", + "light.LightEntityFeature.TRANSITION", + ] + ] + }, + ] + }, + ("light.abc123", "blah.blah", FAKE_UUID), + (None,), + ), ( { "filter": [