diff --git a/homeassistant/components/siren/__init__.py b/homeassistant/components/siren/__init__.py index 20b56a21b53..42dfd0ed3df 100644 --- a/homeassistant/components/siren/__init__.py +++ b/homeassistant/components/siren/__init__.py @@ -152,12 +152,14 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: class SirenEntityDescription(ToggleEntityDescription): """A class that describes siren entities.""" + available_tones: list[int | str] | dict[int, str] | None = None + class SirenEntity(ToggleEntity): """Representation of a siren device.""" entity_description: SirenEntityDescription - _attr_available_tones: list[int | str] | dict[int, str] | None = None + _attr_available_tones: list[int | str] | dict[int, str] | None @final @property @@ -180,4 +182,8 @@ class SirenEntity(ToggleEntity): Requires SirenEntityFeature.TONES. """ - return self._attr_available_tones + if hasattr(self, "_attr_available_tones"): + return self._attr_available_tones + if hasattr(self, "entity_description"): + return self.entity_description.available_tones + return None diff --git a/tests/components/siren/test_init.py b/tests/components/siren/test_init.py index 90df49a5580..9670be9555b 100644 --- a/tests/components/siren/test_init.py +++ b/tests/components/siren/test_init.py @@ -3,7 +3,11 @@ from unittest.mock import MagicMock import pytest -from homeassistant.components.siren import SirenEntity, process_turn_on_params +from homeassistant.components.siren import ( + SirenEntity, + SirenEntityDescription, + process_turn_on_params, +) from homeassistant.components.siren.const import SirenEntityFeature @@ -12,10 +16,20 @@ class MockSirenEntity(SirenEntity): _attr_is_on = True - def __init__(self, supported_features=0, available_tones=None): + def __init__( + self, + supported_features=0, + available_tones_as_attr=None, + available_tones_in_desc=None, + ): """Initialize mock siren entity.""" self._attr_supported_features = supported_features - self._attr_available_tones = available_tones + if available_tones_as_attr is not None: + self._attr_available_tones = available_tones_as_attr + elif available_tones_in_desc is not None: + self.entity_description = SirenEntityDescription( + "mock", available_tones=available_tones_in_desc + ) async def test_sync_turn_on(hass): @@ -50,11 +64,23 @@ async def test_no_available_tones(hass): async def test_available_tones_list(hass): """Test that valid tones from tone list will get passed in.""" - siren = MockSirenEntity(SirenEntityFeature.TONES, ["a", "b"]) + siren = MockSirenEntity( + SirenEntityFeature.TONES, available_tones_as_attr=["a", "b"] + ) siren.hass = hass assert process_turn_on_params(siren, {"tone": "a"}) == {"tone": "a"} +async def test_available_tones(hass): + """Test different available tones scenarios.""" + siren = MockSirenEntity( + SirenEntityFeature.TONES, available_tones_in_desc=["a", "b"] + ) + assert siren.available_tones == ["a", "b"] + siren = MockSirenEntity(SirenEntityFeature.TONES) + assert siren.available_tones is None + + async def test_available_tones_dict(hass): """Test that valid tones from available_tones dict will get passed in.""" siren = MockSirenEntity(SirenEntityFeature.TONES, {1: "a", 2: "b"})