diff --git a/homeassistant/components/air_quality/__init__.py b/homeassistant/components/air_quality/__init__.py index 605a34a69e050..1e2a0525f2999 100644 --- a/homeassistant/components/air_quality/__init__.py +++ b/homeassistant/components/air_quality/__init__.py @@ -19,7 +19,7 @@ _LOGGER: Final = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[AirQualityEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[AirQualityEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT: Final = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -56,7 +56,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the air quality component.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[AirQualityEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[AirQualityEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -65,12 +65,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class AirQualityEntity(Entity): diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py index 91d3a83df8eea..5cc13c867294f 100644 --- a/homeassistant/components/alarm_control_panel/__init__.py +++ b/homeassistant/components/alarm_control_panel/__init__.py @@ -53,7 +53,7 @@ _LOGGER: Final = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[AlarmControlPanelEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[AlarmControlPanelEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT: Final = DOMAIN + ".{}" PLATFORM_SCHEMA: Final = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE: Final = cv.PLATFORM_SCHEMA_BASE @@ -71,7 +71,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for sensors.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[AlarmControlPanelEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[AlarmControlPanelEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -124,12 +124,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class AlarmControlPanelEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/assist_satellite/__init__.py b/homeassistant/components/assist_satellite/__init__.py index 6932fa3180c9c..dd940e8cdbe57 100644 --- a/homeassistant/components/assist_satellite/__init__.py +++ b/homeassistant/components/assist_satellite/__init__.py @@ -13,8 +13,8 @@ from .connection_test import ConnectionTestView from .const import ( CONNECTION_TEST_DATA, + DATA_COMPONENT, DOMAIN, - DOMAIN_DATA, AssistSatelliteEntityFeature, ) from .entity import ( @@ -44,7 +44,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: - component = hass.data[DOMAIN_DATA] = EntityComponent[AssistSatelliteEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[AssistSatelliteEntity]( _LOGGER, DOMAIN, hass ) await component.async_setup(config) @@ -72,9 +72,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) diff --git a/homeassistant/components/assist_satellite/const.py b/homeassistant/components/assist_satellite/const.py index 73bc126f7ba52..61ac7ecb39d01 100644 --- a/homeassistant/components/assist_satellite/const.py +++ b/homeassistant/components/assist_satellite/const.py @@ -15,7 +15,7 @@ DOMAIN = "assist_satellite" -DOMAIN_DATA: HassKey[EntityComponent[AssistSatelliteEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[AssistSatelliteEntity]] = HassKey(DOMAIN) CONNECTION_TEST_DATA: HassKey[dict[str, asyncio.Event]] = HassKey( f"{DOMAIN}_connection_tests" ) diff --git a/homeassistant/components/assist_satellite/websocket_api.py b/homeassistant/components/assist_satellite/websocket_api.py index 4c95d9555aa82..c81648c6ee360 100644 --- a/homeassistant/components/assist_satellite/websocket_api.py +++ b/homeassistant/components/assist_satellite/websocket_api.py @@ -16,8 +16,8 @@ from .connection_test import CONNECTION_TEST_URL_BASE from .const import ( CONNECTION_TEST_DATA, + DATA_COMPONENT, DOMAIN, - DOMAIN_DATA, AssistSatelliteEntityFeature, ) from .entity import AssistSatelliteEntity @@ -48,7 +48,7 @@ async def websocket_intercept_wake_word( msg: dict[str, Any], ) -> None: """Intercept the next wake word from a satellite.""" - satellite = hass.data[DOMAIN_DATA].get_entity(msg["entity_id"]) + satellite = hass.data[DATA_COMPONENT].get_entity(msg["entity_id"]) if satellite is None: connection.send_error( msg["id"], websocket_api.ERR_NOT_FOUND, "Entity not found" @@ -86,7 +86,7 @@ def websocket_get_configuration( msg: dict[str, Any], ) -> None: """Get the current satellite configuration.""" - satellite = hass.data[DOMAIN_DATA].get_entity(msg["entity_id"]) + satellite = hass.data[DATA_COMPONENT].get_entity(msg["entity_id"]) if satellite is None: connection.send_error( msg["id"], websocket_api.ERR_NOT_FOUND, "Entity not found" @@ -115,7 +115,7 @@ async def websocket_set_wake_words( msg: dict[str, Any], ) -> None: """Set the active wake words for the satellite.""" - satellite = hass.data[DOMAIN_DATA].get_entity(msg["entity_id"]) + satellite = hass.data[DATA_COMPONENT].get_entity(msg["entity_id"]) if satellite is None: connection.send_error( msg["id"], websocket_api.ERR_NOT_FOUND, "Entity not found" diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index a40df67e2ca2a..8f1a38c2cd00c 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -110,7 +110,7 @@ from .helpers import async_get_blueprints from .trace import trace_automation -DOMAIN_DATA: HassKey[EntityComponent[BaseAutomationEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[BaseAutomationEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" @@ -163,12 +163,12 @@ def _automations_with_x( hass: HomeAssistant, referenced_id: str, property_name: str ) -> list[str]: """Return all automations that reference the x.""" - if DOMAIN_DATA not in hass.data: + if DATA_COMPONENT not in hass.data: return [] return [ automation_entity.entity_id - for automation_entity in hass.data[DOMAIN_DATA].entities + for automation_entity in hass.data[DATA_COMPONENT].entities if referenced_id in getattr(automation_entity, property_name) ] @@ -177,10 +177,10 @@ def _x_in_automation( hass: HomeAssistant, entity_id: str, property_name: str ) -> list[str]: """Return all x in an automation.""" - if DOMAIN_DATA not in hass.data: + if DATA_COMPONENT not in hass.data: return [] - if (automation_entity := hass.data[DOMAIN_DATA].get_entity(entity_id)) is None: + if (automation_entity := hass.data[DATA_COMPONENT].get_entity(entity_id)) is None: return [] return list(getattr(automation_entity, property_name)) @@ -254,7 +254,7 @@ def automations_with_blueprint(hass: HomeAssistant, blueprint_path: str) -> list return [ automation_entity.entity_id - for automation_entity in hass.data[DOMAIN_DATA].entities + for automation_entity in hass.data[DATA_COMPONENT].entities if automation_entity.referenced_blueprint == blueprint_path ] @@ -262,10 +262,10 @@ def automations_with_blueprint(hass: HomeAssistant, blueprint_path: str) -> list @callback def blueprint_in_automation(hass: HomeAssistant, entity_id: str) -> str | None: """Return the blueprint the automation is based on or None.""" - if DOMAIN_DATA not in hass.data: + if DATA_COMPONENT not in hass.data: return None - if (automation_entity := hass.data[DOMAIN_DATA].get_entity(entity_id)) is None: + if (automation_entity := hass.data[DATA_COMPONENT].get_entity(entity_id)) is None: return None return automation_entity.referenced_blueprint @@ -273,7 +273,7 @@ def blueprint_in_automation(hass: HomeAssistant, entity_id: str) -> str | None: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up all automations.""" - hass.data[DOMAIN_DATA] = component = EntityComponent[BaseAutomationEntity]( + hass.data[DATA_COMPONENT] = component = EntityComponent[BaseAutomationEntity]( LOGGER, DOMAIN, hass ) @@ -1204,7 +1204,7 @@ def websocket_config( msg: dict[str, Any], ) -> None: """Get automation config.""" - automation = hass.data[DOMAIN_DATA].get_entity(msg["entity_id"]) + automation = hass.data[DATA_COMPONENT].get_entity(msg["entity_id"]) if automation is None: connection.send_error( diff --git a/homeassistant/components/bang_olufsen/const.py b/homeassistant/components/bang_olufsen/const.py index 6803a141ceed9..64ee4cf275dc7 100644 --- a/homeassistant/components/bang_olufsen/const.py +++ b/homeassistant/components/bang_olufsen/const.py @@ -68,6 +68,7 @@ class BangOlufsenModel(StrEnum): class WebsocketNotification(StrEnum): """Enum for WebSocket notification types.""" + ACTIVE_LISTENING_MODE = "active_listening_mode" PLAYBACK_ERROR = "playback_error" PLAYBACK_METADATA = "playback_metadata" PLAYBACK_PROGRESS = "playback_progress" diff --git a/homeassistant/components/bang_olufsen/media_player.py b/homeassistant/components/bang_olufsen/media_player.py index bd74f15ddf943..474319fc3a12e 100644 --- a/homeassistant/components/bang_olufsen/media_player.py +++ b/homeassistant/components/bang_olufsen/media_player.py @@ -13,6 +13,8 @@ Action, Art, BeolinkLeader, + ListeningModeProps, + ListeningModeRef, OverlayPlayRequest, OverlayPlayRequestTextToSpeechTextToSpeech, PlaybackContentMetadata, @@ -88,6 +90,7 @@ | MediaPlayerEntityFeature.TURN_OFF | MediaPlayerEntityFeature.VOLUME_MUTE | MediaPlayerEntityFeature.VOLUME_SET + | MediaPlayerEntityFeature.SELECT_SOUND_MODE ) @@ -137,6 +140,7 @@ def __init__(self, entry: ConfigEntry, client: MozartClient) -> None: self._sources: dict[str, str] = {} self._state: str = MediaPlayerState.IDLE self._video_sources: dict[str, str] = {} + self._sound_modes: dict[str, int] = {} # Beolink compatible sources self._beolink_sources: dict[str, bool] = {} @@ -148,6 +152,7 @@ async def async_added_to_hass(self) -> None: signal_handlers: dict[str, Callable] = { CONNECTION_STATUS: self._async_update_connection_state, + WebsocketNotification.ACTIVE_LISTENING_MODE: self._async_update_sound_modes, WebsocketNotification.BEOLINK: self._async_update_beolink, WebsocketNotification.PLAYBACK_ERROR: self._async_update_playback_error, WebsocketNotification.PLAYBACK_METADATA: self._async_update_playback_metadata_and_beolink, @@ -211,6 +216,8 @@ async def _initialize(self) -> None: # If the device has been updated with new sources, then the API will fail here. await self._async_update_sources() + await self._async_update_sound_modes() + async def _async_update_sources(self) -> None: """Get sources for the specific product.""" @@ -432,6 +439,29 @@ def _get_beolink_jid(self, entity_id: str) -> str: # Return JID return cast(str, config_entry.data[CONF_BEOLINK_JID]) + async def _async_update_sound_modes( + self, active_sound_mode: ListeningModeProps | ListeningModeRef | None = None + ) -> None: + """Update the available sound modes.""" + sound_modes = await self._client.get_listening_mode_set() + + if active_sound_mode is None: + active_sound_mode = await self._client.get_active_listening_mode() + + # Add the key to make the labels unique (As labels are not required to be unique on B&O devices) + for sound_mode in sound_modes: + label = f"{sound_mode.name} ({sound_mode.id})" + + self._sound_modes[label] = sound_mode.id + + if sound_mode.id == active_sound_mode.id: + self._attr_sound_mode = label + + # Set available options + self._attr_sound_mode_list = list(self._sound_modes.keys()) + + self.async_write_ha_state() + @property def state(self) -> MediaPlayerState: """Return the current state of the media player.""" @@ -620,6 +650,21 @@ async def async_select_source(self, source: str) -> None: # Video await self._client.post_remote_trigger(id=key) + async def async_select_sound_mode(self, sound_mode: str) -> None: + """Select a sound mode.""" + # Ensure only known sound modes known by the integration can be activated. + if sound_mode not in self._sound_modes: + raise ServiceValidationError( + translation_domain=DOMAIN, + translation_key="invalid_sound_mode", + translation_placeholders={ + "invalid_sound_mode": sound_mode, + "valid_sound_modes": ", ".join(list(self._sound_modes.keys())), + }, + ) + + await self._client.activate_listening_mode(id=self._sound_modes[sound_mode]) + async def async_play_media( self, media_type: MediaType | str, diff --git a/homeassistant/components/bang_olufsen/strings.json b/homeassistant/components/bang_olufsen/strings.json index 6c4b7f1370c30..b0cb88985d254 100644 --- a/homeassistant/components/bang_olufsen/strings.json +++ b/homeassistant/components/bang_olufsen/strings.json @@ -43,6 +43,9 @@ }, "invalid_grouping_entity": { "message": "Entity with id: {entity_id} can't be added to the Beolink session. Is the entity a Bang & Olufsen media_player?" + }, + "invalid_sound_mode": { + "message": "{invalid_sound_mode} is an invalid sound mode. Valid values are: {valid_sound_modes}." } } } diff --git a/homeassistant/components/bang_olufsen/websocket.py b/homeassistant/components/bang_olufsen/websocket.py index 6e5c1d4c76cd8..3519fcd9a48a7 100644 --- a/homeassistant/components/bang_olufsen/websocket.py +++ b/homeassistant/components/bang_olufsen/websocket.py @@ -5,6 +5,7 @@ import logging from mozart_api.models import ( + ListeningModeProps, PlaybackContentMetadata, PlaybackError, PlaybackProgress, @@ -50,6 +51,9 @@ def __init__( self._client.get_notification_notifications(self.on_notification_notification) self._client.get_on_connection_lost(self.on_connection_lost) self._client.get_on_connection(self.on_connection) + self._client.get_active_listening_mode_notifications( + self.on_active_listening_mode + ) self._client.get_playback_error_notifications( self.on_playback_error_notification ) @@ -89,6 +93,14 @@ def on_connection_lost(self) -> None: _LOGGER.error("Lost connection to the %s", self.entry.title) self._update_connection_status() + def on_active_listening_mode(self, notification: ListeningModeProps) -> None: + """Send active_listening_mode dispatch.""" + async_dispatcher_send( + self.hass, + f"{self._unique_id}_{WebsocketNotification.ACTIVE_LISTENING_MODE}", + notification, + ) + def on_notification_notification( self, notification: WebsocketNotificationTag ) -> None: diff --git a/homeassistant/components/binary_sensor/__init__.py b/homeassistant/components/binary_sensor/__init__.py index 5ed6014030ff4..1aa6903d64d62 100644 --- a/homeassistant/components/binary_sensor/__init__.py +++ b/homeassistant/components/binary_sensor/__init__.py @@ -29,7 +29,7 @@ _LOGGER = logging.getLogger(__name__) DOMAIN = "binary_sensor" -DOMAIN_DATA: HassKey[EntityComponent[BinarySensorEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[BinarySensorEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -219,7 +219,7 @@ class BinarySensorDeviceClass(StrEnum): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for binary sensors.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[BinarySensorEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[BinarySensorEntity]( logging.getLogger(__name__), DOMAIN, hass, SCAN_INTERVAL ) @@ -229,12 +229,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class BinarySensorEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/button/__init__.py b/homeassistant/components/button/__init__.py index 614a6e6dba33b..1f06a41bf2d60 100644 --- a/homeassistant/components/button/__init__.py +++ b/homeassistant/components/button/__init__.py @@ -25,7 +25,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[ButtonEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[ButtonEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -49,7 +49,7 @@ class ButtonDeviceClass(StrEnum): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Button entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[ButtonEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[ButtonEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -65,12 +65,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class ButtonEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/calendar/__init__.py b/homeassistant/components/calendar/__init__.py index fa7b82a9e1eef..40d6952fa645e 100644 --- a/homeassistant/components/calendar/__init__.py +++ b/homeassistant/components/calendar/__init__.py @@ -43,8 +43,8 @@ from .const import ( CONF_EVENT, + DATA_COMPONENT, DOMAIN, - DOMAIN_DATA, EVENT_DESCRIPTION, EVENT_DURATION, EVENT_END, @@ -286,7 +286,7 @@ def _empty_as_none(value: str | None) -> str | None: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for calendars.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[CalendarEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[CalendarEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -319,12 +319,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) def get_date(date: dict[str, Any]) -> datetime.datetime: @@ -707,7 +707,7 @@ async def handle_calendar_event_create( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: """Handle creation of a calendar event.""" - if not (entity := hass.data[DOMAIN_DATA].get_entity(msg["entity_id"])): + if not (entity := hass.data[DATA_COMPONENT].get_entity(msg["entity_id"])): connection.send_error(msg["id"], ERR_NOT_FOUND, "Entity not found") return @@ -747,7 +747,7 @@ async def handle_calendar_event_delete( ) -> None: """Handle delete of a calendar event.""" - if not (entity := hass.data[DOMAIN_DATA].get_entity(msg["entity_id"])): + if not (entity := hass.data[DATA_COMPONENT].get_entity(msg["entity_id"])): connection.send_error(msg["id"], ERR_NOT_FOUND, "Entity not found") return @@ -792,7 +792,7 @@ async def handle_calendar_event_update( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: """Handle creation of a calendar event.""" - if not (entity := hass.data[DOMAIN_DATA].get_entity(msg["entity_id"])): + if not (entity := hass.data[DATA_COMPONENT].get_entity(msg["entity_id"])): connection.send_error(msg["id"], ERR_NOT_FOUND, "Entity not found") return diff --git a/homeassistant/components/calendar/const.py b/homeassistant/components/calendar/const.py index 6266a604c817f..821fe24c38315 100644 --- a/homeassistant/components/calendar/const.py +++ b/homeassistant/components/calendar/const.py @@ -13,7 +13,7 @@ from . import CalendarEntity DOMAIN = "calendar" -DOMAIN_DATA: HassKey[EntityComponent[CalendarEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[CalendarEntity]] = HassKey(DOMAIN) CONF_EVENT = "event" diff --git a/homeassistant/components/calendar/trigger.py b/homeassistant/components/calendar/trigger.py index 4daa32f7fc784..ca69a4b662f20 100644 --- a/homeassistant/components/calendar/trigger.py +++ b/homeassistant/components/calendar/trigger.py @@ -24,7 +24,7 @@ from homeassistant.util import dt as dt_util from . import CalendarEntity, CalendarEvent -from .const import DOMAIN, DOMAIN_DATA +from .const import DATA_COMPONENT, DOMAIN _LOGGER = logging.getLogger(__name__) @@ -95,7 +95,7 @@ def __str__(self) -> str: def get_entity(hass: HomeAssistant, entity_id: str) -> CalendarEntity: """Get the calendar entity for the provided entity_id.""" - component: EntityComponent[CalendarEntity] = hass.data[DOMAIN_DATA] + component: EntityComponent[CalendarEntity] = hass.data[DATA_COMPONENT] if not (entity := component.get_entity(entity_id)) or not isinstance( entity, CalendarEntity ): diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index 88162df6f1a9f..e5bce1b545b98 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -71,9 +71,9 @@ CONF_DURATION, CONF_LOOKBACK, DATA_CAMERA_PREFS, + DATA_COMPONENT, DATA_RTSP_TO_WEB_RTC, DOMAIN, - DOMAIN_DATA, PREF_ORIENTATION, PREF_PRELOAD_STREAM, SERVICE_RECORD, @@ -366,7 +366,7 @@ def remove_provider() -> None: async def _async_refresh_providers(hass: HomeAssistant) -> None: """Check all cameras for any state changes for registered providers.""" - component = hass.data[DOMAIN_DATA] + component = hass.data[DATA_COMPONENT] await asyncio.gather( *(camera.async_refresh_providers() for camera in component.entities) ) @@ -382,7 +382,7 @@ def _async_get_rtsp_to_web_rtc_providers( async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the camera component.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[Camera]( + component = hass.data[DATA_COMPONENT] = EntityComponent[Camera]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -457,12 +457,12 @@ def unsub_track_time_interval(_event: Event) -> None: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) CACHED_PROPERTIES_WITH_ATTR_ = { diff --git a/homeassistant/components/camera/const.py b/homeassistant/components/camera/const.py index c4327e922e656..1286e0f39764b 100644 --- a/homeassistant/components/camera/const.py +++ b/homeassistant/components/camera/const.py @@ -21,7 +21,7 @@ from .prefs import CameraPreferences DOMAIN: Final = "camera" -DOMAIN_DATA: HassKey[EntityComponent[Camera]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[Camera]] = HassKey(DOMAIN) DATA_CAMERA_PREFS: HassKey[CameraPreferences] = HassKey("camera_prefs") DATA_RTSP_TO_WEB_RTC: HassKey[dict[str, RtspToWebRtcProviderType]] = HassKey( diff --git a/homeassistant/components/camera/media_source.py b/homeassistant/components/camera/media_source.py index 00c0e83b46fed..ea30dafb09e19 100644 --- a/homeassistant/components/camera/media_source.py +++ b/homeassistant/components/camera/media_source.py @@ -18,7 +18,7 @@ from homeassistant.exceptions import HomeAssistantError from . import Camera, _async_stream_endpoint_url -from .const import DOMAIN, DOMAIN_DATA, StreamType +from .const import DATA_COMPONENT, DOMAIN, StreamType async def async_get_media_source(hass: HomeAssistant) -> CameraMediaSource: @@ -58,7 +58,7 @@ def __init__(self, hass: HomeAssistant) -> None: async def async_resolve_media(self, item: MediaSourceItem) -> PlayMedia: """Resolve media to a url.""" - component = self.hass.data[DOMAIN_DATA] + component = self.hass.data[DATA_COMPONENT] camera = component.get_entity(item.identifier) if not camera: @@ -107,7 +107,7 @@ async def _filter_browsable_camera(camera: Camera) -> BrowseMediaSource | None: return _media_source_for_camera(self.hass, camera, content_type) - component = self.hass.data[DOMAIN_DATA] + component = self.hass.data[DATA_COMPONENT] results = await asyncio.gather( *(_filter_browsable_camera(camera) for camera in component.entities), return_exceptions=True, diff --git a/homeassistant/components/climate/__init__.py b/homeassistant/components/climate/__init__.py index 1aa082f8c6ca9..cd2ce3b563b65 100644 --- a/homeassistant/components/climate/__init__.py +++ b/homeassistant/components/climate/__init__.py @@ -115,7 +115,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[ClimateEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[ClimateEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -152,7 +152,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up climate entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[ClimateEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[ClimateEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -225,12 +225,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class ClimateEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/conversation/__init__.py b/homeassistant/components/conversation/__init__.py index a1325171af213..17f3b6f5ccc0a 100644 --- a/homeassistant/components/conversation/__init__.py +++ b/homeassistant/components/conversation/__init__.py @@ -35,9 +35,9 @@ ATTR_CONVERSATION_ID, ATTR_LANGUAGE, ATTR_TEXT, + DATA_COMPONENT, DATA_DEFAULT_ENTITY, DOMAIN, - DOMAIN_DATA, HOME_ASSISTANT_AGENT, OLD_HOME_ASSISTANT_AGENT, SERVICE_PROCESS, @@ -149,7 +149,7 @@ def async_get_conversation_languages( agents = [agent] else: - agents = list(hass.data[DOMAIN_DATA].entities) + agents = list(hass.data[DATA_COMPONENT].entities) for info in agent_manager.async_get_agent_info(): agent = agent_manager.async_get_agent(info.id) assert agent is not None @@ -210,7 +210,7 @@ async def async_prepare_agent( async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Register the process service.""" entity_component = EntityComponent[ConversationEntity](_LOGGER, DOMAIN, hass) - hass.data[DOMAIN_DATA] = entity_component + hass.data[DATA_COMPONENT] = entity_component await async_setup_default_agent( hass, entity_component, config.get(DOMAIN, {}).get("intents", {}) @@ -269,9 +269,9 @@ async def handle_reload(service: ServiceCall) -> None: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) diff --git a/homeassistant/components/conversation/agent_manager.py b/homeassistant/components/conversation/agent_manager.py index 25b2a5a422072..7516d9d22efd2 100644 --- a/homeassistant/components/conversation/agent_manager.py +++ b/homeassistant/components/conversation/agent_manager.py @@ -12,8 +12,8 @@ from homeassistant.helpers import config_validation as cv, singleton from .const import ( + DATA_COMPONENT, DATA_DEFAULT_ENTITY, - DOMAIN_DATA, HOME_ASSISTANT_AGENT, OLD_HOME_ASSISTANT_AGENT, ) @@ -57,7 +57,7 @@ def async_get_agent( return hass.data[DATA_DEFAULT_ENTITY] if "." in agent_id: - return hass.data[DOMAIN_DATA].get_entity(agent_id) + return hass.data[DATA_COMPONENT].get_entity(agent_id) manager = get_agent_manager(hass) diff --git a/homeassistant/components/conversation/const.py b/homeassistant/components/conversation/const.py index f4599ef899119..619a41fd002a7 100644 --- a/homeassistant/components/conversation/const.py +++ b/homeassistant/components/conversation/const.py @@ -26,7 +26,7 @@ SERVICE_PROCESS = "process" SERVICE_RELOAD = "reload" -DOMAIN_DATA: HassKey[EntityComponent[ConversationEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[ConversationEntity]] = HassKey(DOMAIN) DATA_DEFAULT_ENTITY: HassKey[DefaultAgent] = HassKey(f"{DOMAIN}_default_entity") diff --git a/homeassistant/components/conversation/http.py b/homeassistant/components/conversation/http.py index 181afeb8525df..df1ffc7f74f2a 100644 --- a/homeassistant/components/conversation/http.py +++ b/homeassistant/components/conversation/http.py @@ -27,7 +27,7 @@ async_get_agent, get_agent_manager, ) -from .const import DATA_DEFAULT_ENTITY, DOMAIN_DATA +from .const import DATA_COMPONENT, DATA_DEFAULT_ENTITY from .default_agent import ( METADATA_CUSTOM_FILE, METADATA_CUSTOM_SENTENCE, @@ -114,7 +114,7 @@ async def websocket_list_agents( language = msg.get("language") agents = [] - for entity in hass.data[DOMAIN_DATA].entities: + for entity in hass.data[DATA_COMPONENT].entities: supported_languages = entity.supported_languages if language and supported_languages != MATCH_ALL: supported_languages = language_util.matches( diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py index d64358896ba5e..a9327965c4ed3 100644 --- a/homeassistant/components/cover/__init__.py +++ b/homeassistant/components/cover/__init__.py @@ -47,7 +47,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[CoverEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[CoverEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -153,7 +153,7 @@ def is_closed(hass: HomeAssistant, entity_id: str) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for covers.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[CoverEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[CoverEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -233,12 +233,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class CoverEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/date/__init__.py b/homeassistant/components/date/__init__.py index 701db594c6715..f361d0a7896ce 100644 --- a/homeassistant/components/date/__init__.py +++ b/homeassistant/components/date/__init__.py @@ -22,7 +22,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[DateEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[DateEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -39,7 +39,7 @@ async def _async_set_value(entity: DateEntity, service_call: ServiceCall) -> Non async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Date entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[DateEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[DateEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -53,12 +53,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class DateEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/datetime/__init__.py b/homeassistant/components/datetime/__init__.py index e3e742e107cea..7e83da9c3cb41 100644 --- a/homeassistant/components/datetime/__init__.py +++ b/homeassistant/components/datetime/__init__.py @@ -22,7 +22,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[DateTimeEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[DateTimeEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -42,7 +42,7 @@ async def _async_set_value(entity: DateTimeEntity, service_call: ServiceCall) -> async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Date/Time entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[DateTimeEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[DateTimeEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -60,12 +60,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class DateTimeEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/device_automation/__init__.py b/homeassistant/components/device_automation/__init__.py index 2c6e80e5f49c5..a75a4216475bd 100644 --- a/homeassistant/components/device_automation/__init__.py +++ b/homeassistant/components/device_automation/__init__.py @@ -484,7 +484,7 @@ async def websocket_device_automation_get_condition_capabilities( # The frontend responds with `trigger` as key, while the # `DEVICE_TRIGGER_BASE_SCHEMA` expects `platform1` as key. vol.Required("trigger"): vol.All( - cv._backward_compat_trigger_schema, # noqa: SLF001 + cv._trigger_pre_validator, # noqa: SLF001 DEVICE_TRIGGER_BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA), ), } diff --git a/homeassistant/components/device_tracker/config_entry.py b/homeassistant/components/device_tracker/config_entry.py index fe2b4aa436974..bea091c3fecc5 100644 --- a/homeassistant/components/device_tracker/config_entry.py +++ b/homeassistant/components/device_tracker/config_entry.py @@ -41,7 +41,7 @@ SourceType, ) -DOMAIN_DATA: HassKey[EntityComponent[BaseTrackerEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[BaseTrackerEntity]] = HassKey(DOMAIN) DATA_KEY: HassKey[dict[str, tuple[str, str]]] = HassKey(f"{DOMAIN}_mac") # mypy: disallow-any-generics @@ -54,7 +54,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: if component is not None: return await component.async_setup_entry(entry) - component = hass.data[DOMAIN_DATA] = EntityComponent[BaseTrackerEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[BaseTrackerEntity]( LOGGER, DOMAIN, hass ) component.register_shutdown() @@ -64,7 +64,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload an entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) @callback diff --git a/homeassistant/components/event/__init__.py b/homeassistant/components/event/__init__.py index b73babd5edc6d..a7d96860a4847 100644 --- a/homeassistant/components/event/__init__.py +++ b/homeassistant/components/event/__init__.py @@ -22,7 +22,7 @@ from .const import ATTR_EVENT_TYPE, ATTR_EVENT_TYPES, DOMAIN _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[EventEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[EventEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -53,7 +53,7 @@ class EventDeviceClass(StrEnum): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Event entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[EventEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[EventEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -62,12 +62,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class EventEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/fan/__init__.py b/homeassistant/components/fan/__init__.py index 3256168d3c589..e05ed967eb32b 100644 --- a/homeassistant/components/fan/__init__.py +++ b/homeassistant/components/fan/__init__.py @@ -43,7 +43,7 @@ _LOGGER = logging.getLogger(__name__) DOMAIN = "fan" -DOMAIN_DATA: HassKey[EntityComponent[FanEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[FanEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -121,7 +121,7 @@ def is_on(hass: HomeAssistant, entity_id: str) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Expose fan control via statemachine and services.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[FanEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[FanEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -203,12 +203,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class FanEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/geo_location/__init__.py b/homeassistant/components/geo_location/__init__.py index ca32c4795493a..cafd30d76580b 100644 --- a/homeassistant/components/geo_location/__init__.py +++ b/homeassistant/components/geo_location/__init__.py @@ -19,7 +19,7 @@ _LOGGER = logging.getLogger(__name__) DOMAIN = "geo_location" -DOMAIN_DATA: HassKey[EntityComponent[GeolocationEvent]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[GeolocationEvent]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -34,7 +34,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the Geolocation component.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[GeolocationEvent]( + component = hass.data[DATA_COMPONENT] = EntityComponent[GeolocationEvent]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -43,12 +43,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) CACHED_PROPERTIES_WITH_ATTR_ = { diff --git a/homeassistant/components/group/__init__.py b/homeassistant/components/group/__init__.py index e863eb4121159..c48cd8529a20c 100644 --- a/homeassistant/components/group/__init__.py +++ b/homeassistant/components/group/__init__.py @@ -48,8 +48,8 @@ ATTR_ORDER, ATTR_REMOVE_ENTITIES, CONF_HIDE_MEMBERS, + DATA_COMPONENT, DOMAIN, - DOMAIN_DATA, GROUP_ORDER, REG_KEY, ) @@ -131,7 +131,7 @@ def groups_with_entity(hass: HomeAssistant, entity_id: str) -> list[str]: return [ group.entity_id - for group in hass.data[DOMAIN_DATA].entities + for group in hass.data[DATA_COMPONENT].entities if entity_id in group.tracking ] diff --git a/homeassistant/components/group/const.py b/homeassistant/components/group/const.py index 790e643eb1490..c706247ae01c0 100644 --- a/homeassistant/components/group/const.py +++ b/homeassistant/components/group/const.py @@ -16,7 +16,7 @@ CONF_IGNORE_NON_NUMERIC = "ignore_non_numeric" DOMAIN = "group" -DOMAIN_DATA: HassKey[EntityComponent[Group]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[Group]] = HassKey(DOMAIN) REG_KEY: HassKey[GroupIntegrationRegistry] = HassKey(f"{DOMAIN}_registry") GROUP_ORDER: HassKey[int] = HassKey("group_order") diff --git a/homeassistant/components/group/entity.py b/homeassistant/components/group/entity.py index 02926cfc97b43..03a8be4bed596 100644 --- a/homeassistant/components/group/entity.py +++ b/homeassistant/components/group/entity.py @@ -22,7 +22,7 @@ from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.event import async_track_state_change_event -from .const import ATTR_AUTO, ATTR_ORDER, DOMAIN, DOMAIN_DATA, GROUP_ORDER, REG_KEY +from .const import ATTR_AUTO, ATTR_ORDER, DATA_COMPONENT, DOMAIN, GROUP_ORDER, REG_KEY from .registry import GroupIntegrationRegistry, SingleStateType ENTITY_ID_FORMAT = DOMAIN + ".{}" @@ -478,8 +478,8 @@ def _async_update_group_state(self, tr_state: State | None = None) -> None: def async_get_component(hass: HomeAssistant) -> EntityComponent[Group]: """Get the group entity component.""" - if (component := hass.data.get(DOMAIN_DATA)) is None: - component = hass.data[DOMAIN_DATA] = EntityComponent[Group]( + if (component := hass.data.get(DATA_COMPONENT)) is None: + component = hass.data[DATA_COMPONENT] = EntityComponent[Group]( _PACKAGE_LOGGER, DOMAIN, hass ) return component diff --git a/homeassistant/components/humidifier/__init__.py b/homeassistant/components/humidifier/__init__.py index 12b5b38696a7b..3979b66397f00 100644 --- a/homeassistant/components/humidifier/__init__.py +++ b/homeassistant/components/humidifier/__init__.py @@ -62,7 +62,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[HumidifierEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[HumidifierEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -96,7 +96,7 @@ def is_on(hass: HomeAssistant, entity_id: str) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up humidifier devices.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[HumidifierEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[HumidifierEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -125,12 +125,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class HumidifierEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/image/__init__.py b/homeassistant/components/image/__init__.py index 66aab1fde7970..5fb5790f25c51 100644 --- a/homeassistant/components/image/__init__.py +++ b/homeassistant/components/image/__init__.py @@ -30,7 +30,7 @@ from homeassistant.helpers.httpx_client import get_async_client from homeassistant.helpers.typing import UNDEFINED, ConfigType, UndefinedType -from .const import DOMAIN, DOMAIN_DATA, IMAGE_TIMEOUT +from .const import DATA_COMPONENT, DOMAIN, IMAGE_TIMEOUT _LOGGER = logging.getLogger(__name__) @@ -88,7 +88,7 @@ async def _async_get_image(image_entity: ImageEntity, timeout: int) -> Image: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the image component.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[ImageEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[ImageEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -120,12 +120,12 @@ def unsub_track_time_interval(_event: Event) -> None: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) CACHED_PROPERTIES_WITH_ATTR_ = { diff --git a/homeassistant/components/image/const.py b/homeassistant/components/image/const.py index 7746e40afbb07..a646b0dd3d5d6 100644 --- a/homeassistant/components/image/const.py +++ b/homeassistant/components/image/const.py @@ -13,6 +13,6 @@ DOMAIN: Final = "image" -DOMAIN_DATA: HassKey[EntityComponent[ImageEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[ImageEntity]] = HassKey(DOMAIN) IMAGE_TIMEOUT: Final = 10 diff --git a/homeassistant/components/image/media_source.py b/homeassistant/components/image/media_source.py index 4ed2449845353..8d06ec3807f89 100644 --- a/homeassistant/components/image/media_source.py +++ b/homeassistant/components/image/media_source.py @@ -15,7 +15,7 @@ from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.core import HomeAssistant, State -from .const import DOMAIN, DOMAIN_DATA +from .const import DATA_COMPONENT, DOMAIN async def async_get_media_source(hass: HomeAssistant) -> ImageMediaSource: @@ -35,7 +35,7 @@ def __init__(self, hass: HomeAssistant) -> None: async def async_resolve_media(self, item: MediaSourceItem) -> PlayMedia: """Resolve media to a url.""" - image = self.hass.data[DOMAIN_DATA].get_entity(item.identifier) + image = self.hass.data[DATA_COMPONENT].get_entity(item.identifier) if not image: raise Unresolvable(f"Could not resolve media item: {item.identifier}") @@ -65,7 +65,7 @@ async def async_browse_media( can_play=True, can_expand=False, ) - for image in self.hass.data[DOMAIN_DATA].entities + for image in self.hass.data[DATA_COMPONENT].entities ] return BrowseMediaSource( diff --git a/homeassistant/components/lawn_mower/__init__.py b/homeassistant/components/lawn_mower/__init__.py index 604a6580f97b0..b9d5f70f9ed30 100644 --- a/homeassistant/components/lawn_mower/__init__.py +++ b/homeassistant/components/lawn_mower/__init__.py @@ -26,7 +26,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[LawnMowerEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[LawnMowerEntity]] = HassKey(DOMAIN) PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE SCAN_INTERVAL = timedelta(seconds=60) @@ -34,7 +34,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the lawn_mower component.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[LawnMowerEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[LawnMowerEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -57,12 +57,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up lawn mower devices.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class LawnMowerEntityEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 94b27664b9960..a496404401a00 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -32,7 +32,7 @@ from homeassistant.util.hass_dict import HassKey DOMAIN = "light" -DOMAIN_DATA: HassKey[EntityComponent[LightEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[LightEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -395,7 +395,7 @@ def filter_turn_on_params(light: LightEntity, params: dict[str, Any]) -> dict[st async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: # noqa: C901 """Expose light control via state machine and services.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[LightEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[LightEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -672,12 +672,12 @@ async def async_handle_toggle_service( async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) def _coerce_none(value: str) -> None: diff --git a/homeassistant/components/lock/__init__.py b/homeassistant/components/lock/__init__.py index d70c6383ce09e..7bc0d88addccc 100644 --- a/homeassistant/components/lock/__init__.py +++ b/homeassistant/components/lock/__init__.py @@ -45,7 +45,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[LockEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[LockEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -78,7 +78,7 @@ class LockEntityFeature(IntFlag): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for locks.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[LockEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[LockEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -102,12 +102,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class LockEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index bd1872422bbf2..2323c14b688f1 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -139,7 +139,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[MediaPlayerEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[MediaPlayerEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -278,7 +278,7 @@ def rename(value: dict[str, Any]) -> dict[str, Any]: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for media_players.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[MediaPlayerEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[MediaPlayerEntity]( logging.getLogger(__name__), DOMAIN, hass, SCAN_INTERVAL ) @@ -452,12 +452,12 @@ def _rewrite_enqueue(value: dict[str, Any]) -> dict[str, Any]: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class MediaPlayerEntityDescription(EntityDescription, frozen_or_thawed=True): @@ -1294,7 +1294,7 @@ async def websocket_browse_media( To use, media_player integrations can implement MediaPlayerEntity.async_browse_media() """ - player = hass.data[DOMAIN_DATA].get_entity(msg["entity_id"]) + player = hass.data[DATA_COMPONENT].get_entity(msg["entity_id"]) if player is None: connection.send_error(msg["id"], "entity_not_found", "Entity not found") diff --git a/homeassistant/components/notify/__init__.py b/homeassistant/components/notify/__init__.py index 75b4b65ac5b25..a4ebfc7f6de22 100644 --- a/homeassistant/components/notify/__init__.py +++ b/homeassistant/components/notify/__init__.py @@ -47,7 +47,7 @@ # Platform specific data ATTR_TITLE_DEFAULT = "Home Assistant" -DOMAIN_DATA: HassKey[EntityComponent[NotifyEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[NotifyEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) @@ -78,7 +78,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: # legacy platforms to finish setting up. hass.async_create_task(setup, eager_start=True) - component = hass.data[DOMAIN_DATA] = EntityComponent[NotifyEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[NotifyEntity]( _LOGGER, DOMAIN, hass ) component.async_register_entity_service( @@ -117,12 +117,12 @@ class NotifyEntityDescription(EntityDescription, frozen_or_thawed=True): async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class NotifyEntity(RestoreEntity): diff --git a/homeassistant/components/number/__init__.py b/homeassistant/components/number/__init__.py index 7ff86dca7a881..2b2faba8f18c0 100644 --- a/homeassistant/components/number/__init__.py +++ b/homeassistant/components/number/__init__.py @@ -50,7 +50,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[NumberEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[NumberEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -83,7 +83,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Number entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[NumberEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[NumberEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) async_setup_ws_api(hass) @@ -126,12 +126,12 @@ async def async_set_value(entity: NumberEntity, service_call: ServiceCall) -> No async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class NumberEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/remote/__init__.py b/homeassistant/components/remote/__init__.py index 28019727ffb18..8d027b95eef6b 100644 --- a/homeassistant/components/remote/__init__.py +++ b/homeassistant/components/remote/__init__.py @@ -37,7 +37,7 @@ _LOGGER = logging.getLogger(__name__) DOMAIN = "remote" -DOMAIN_DATA: HassKey[EntityComponent[RemoteEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[RemoteEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -100,7 +100,7 @@ def is_on(hass: HomeAssistant, entity_id: str) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for remotes.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[RemoteEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[RemoteEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -157,12 +157,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class RemoteEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/scene/__init__.py b/homeassistant/components/scene/__init__.py index 6fcebbdfb673f..d1b34b5077092 100644 --- a/homeassistant/components/scene/__init__.py +++ b/homeassistant/components/scene/__init__.py @@ -20,7 +20,7 @@ from homeassistant.util.hass_dict import HassKey DOMAIN: Final = "scene" -DOMAIN_DATA: HassKey[EntityComponent[Scene]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[Scene]] = HassKey(DOMAIN) STATES: Final = "states" @@ -62,7 +62,7 @@ def _platform_validator(config: dict[str, Any]) -> dict[str, Any]: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the scenes.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[Scene]( + component = hass.data[DATA_COMPONENT] = EntityComponent[Scene]( logging.getLogger(__name__), DOMAIN, hass ) @@ -85,12 +85,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class Scene(RestoreEntity): diff --git a/homeassistant/components/select/__init__.py b/homeassistant/components/select/__init__.py index 62592428da0d7..b317f4ec601f2 100644 --- a/homeassistant/components/select/__init__.py +++ b/homeassistant/components/select/__init__.py @@ -32,7 +32,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[SelectEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[SelectEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -61,7 +61,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Select entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[SelectEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[SelectEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -101,12 +101,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class SelectEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index 29d31d10ffc48..88d35217556a6 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -89,7 +89,7 @@ _LOGGER: Final = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[SensorEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[SensorEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT: Final = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -117,7 +117,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for sensors.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[SensorEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[SensorEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -128,12 +128,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class SensorEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/siren/__init__.py b/homeassistant/components/siren/__init__.py index 34c3e22f09496..15a46adeb3b15 100644 --- a/homeassistant/components/siren/__init__.py +++ b/homeassistant/components/siren/__init__.py @@ -39,7 +39,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[SirenEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[SirenEntity]] = HassKey(DOMAIN) PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE SCAN_INTERVAL = timedelta(seconds=60) @@ -106,7 +106,7 @@ def process_turn_on_params( async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up siren devices.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[SirenEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[SirenEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -145,12 +145,12 @@ async def async_handle_turn_on_service( async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class SirenEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/stt/__init__.py b/homeassistant/components/stt/__init__.py index 2fb3b652c5c91..d3c85aba1e719 100644 --- a/homeassistant/components/stt/__init__.py +++ b/homeassistant/components/stt/__init__.py @@ -30,9 +30,9 @@ from homeassistant.util import dt as dt_util, language as language_util from .const import ( + DATA_COMPONENT, DATA_PROVIDERS, DOMAIN, - DOMAIN_DATA, AudioBitRates, AudioChannels, AudioCodecs, @@ -75,7 +75,7 @@ def async_default_engine(hass: HomeAssistant) -> str | None: """Return the domain or entity id of the default engine.""" default_entity_id: str | None = None - for entity in hass.data[DOMAIN_DATA].entities: + for entity in hass.data[DATA_COMPONENT].entities: if entity.platform and entity.platform.platform_name == "cloud": return entity.entity_id @@ -90,7 +90,7 @@ def async_get_speech_to_text_entity( hass: HomeAssistant, entity_id: str ) -> SpeechToTextEntity | None: """Return stt entity.""" - return hass.data[DOMAIN_DATA].get_entity(entity_id) + return hass.data[DATA_COMPONENT].get_entity(entity_id) @callback @@ -108,7 +108,7 @@ def async_get_speech_to_text_languages(hass: HomeAssistant) -> set[str]: """Return a set with the union of languages supported by stt engines.""" languages = set() - for entity in hass.data[DOMAIN_DATA].entities: + for entity in hass.data[DATA_COMPONENT].entities: for language_tag in entity.supported_languages: languages.add(language_tag) @@ -123,7 +123,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up STT.""" websocket_api.async_register_command(hass, websocket_list_engines) - component = hass.data[DOMAIN_DATA] = EntityComponent[SpeechToTextEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[SpeechToTextEntity]( _LOGGER, DOMAIN, hass ) @@ -145,12 +145,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class SpeechToTextEntity(RestoreEntity): @@ -424,7 +424,7 @@ def websocket_list_engines( providers = [] provider_info: dict[str, Any] - for entity in hass.data[DOMAIN_DATA].entities: + for entity in hass.data[DATA_COMPONENT].entities: provider_info = { "engine_id": entity.entity_id, "supported_languages": entity.supported_languages, diff --git a/homeassistant/components/stt/const.py b/homeassistant/components/stt/const.py index 5c805494cef34..1c4172cfc89c7 100644 --- a/homeassistant/components/stt/const.py +++ b/homeassistant/components/stt/const.py @@ -14,7 +14,7 @@ from .legacy import Provider DOMAIN = "stt" -DOMAIN_DATA: HassKey[EntityComponent[SpeechToTextEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[SpeechToTextEntity]] = HassKey(DOMAIN) DATA_PROVIDERS: HassKey[dict[str, Provider]] = HassKey(f"{DOMAIN}_providers") diff --git a/homeassistant/components/switch/__init__.py b/homeassistant/components/switch/__init__.py index e1320fe4469ba..e11b392ec07f2 100644 --- a/homeassistant/components/switch/__init__.py +++ b/homeassistant/components/switch/__init__.py @@ -34,7 +34,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[SwitchEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[SwitchEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -76,7 +76,7 @@ def is_on(hass: HomeAssistant, entity_id: str) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for switches.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[SwitchEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[SwitchEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -90,12 +90,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class SwitchEntityDescription(ToggleEntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/text/__init__.py b/homeassistant/components/text/__init__.py index 5c4fbf2c15c76..633c29e7beb83 100644 --- a/homeassistant/components/text/__init__.py +++ b/homeassistant/components/text/__init__.py @@ -34,7 +34,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[TextEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[TextEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -48,7 +48,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Text entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[TextEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[TextEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -83,12 +83,12 @@ async def _async_set_value(entity: TextEntity, service_call: ServiceCall) -> Non async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class TextMode(StrEnum): diff --git a/homeassistant/components/time/__init__.py b/homeassistant/components/time/__init__.py index 7230ce490bde3..4888b525dee15 100644 --- a/homeassistant/components/time/__init__.py +++ b/homeassistant/components/time/__init__.py @@ -22,7 +22,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[TimeEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[TimeEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -39,7 +39,7 @@ async def _async_set_value(entity: TimeEntity, service_call: ServiceCall) -> Non async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Time entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[TimeEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[TimeEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -53,12 +53,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class TimeEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/todo/__init__.py b/homeassistant/components/todo/__init__.py index 533ae354dd2e8..fa3241cd88495 100644 --- a/homeassistant/components/todo/__init__.py +++ b/homeassistant/components/todo/__init__.py @@ -38,8 +38,8 @@ ATTR_ITEM, ATTR_RENAME, ATTR_STATUS, + DATA_COMPONENT, DOMAIN, - DOMAIN_DATA, TodoItemStatus, TodoListEntityFeature, TodoServices, @@ -114,7 +114,7 @@ def _validate_supported_features( async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Todo entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[TodoListEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[TodoListEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -197,12 +197,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) @dataclasses.dataclass @@ -334,7 +334,7 @@ async def websocket_handle_subscribe_todo_items( """Subscribe to To-do list item updates.""" entity_id: str = msg["entity_id"] - if not (entity := hass.data[DOMAIN_DATA].get_entity(entity_id)): + if not (entity := hass.data[DATA_COMPONENT].get_entity(entity_id)): connection.send_error( msg["id"], "invalid_entity_id", @@ -389,7 +389,7 @@ async def websocket_handle_todo_item_list( """Handle the list of To-do items in a To-do- list.""" if ( not (entity_id := msg[CONF_ENTITY_ID]) - or not (entity := hass.data[DOMAIN_DATA].get_entity(entity_id)) + or not (entity := hass.data[DATA_COMPONENT].get_entity(entity_id)) or not isinstance(entity, TodoListEntity) ): connection.send_error(msg["id"], ERR_NOT_FOUND, "Entity not found") @@ -422,7 +422,7 @@ async def websocket_handle_todo_item_move( hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict[str, Any] ) -> None: """Handle move of a To-do item within a To-do list.""" - if not (entity := hass.data[DOMAIN_DATA].get_entity(msg["entity_id"])): + if not (entity := hass.data[DATA_COMPONENT].get_entity(msg["entity_id"])): connection.send_error(msg["id"], ERR_NOT_FOUND, "Entity not found") return diff --git a/homeassistant/components/todo/const.py b/homeassistant/components/todo/const.py index 634075d7f32a1..3b0aa37fa7bea 100644 --- a/homeassistant/components/todo/const.py +++ b/homeassistant/components/todo/const.py @@ -13,7 +13,7 @@ from . import TodoListEntity DOMAIN = "todo" -DOMAIN_DATA: HassKey[EntityComponent[TodoListEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[TodoListEntity]] = HassKey(DOMAIN) ATTR_DUE = "due" ATTR_DUE_DATE = "due_date" diff --git a/homeassistant/components/todo/intent.py b/homeassistant/components/todo/intent.py index 6520e6c12b7c4..6233ea6029e09 100644 --- a/homeassistant/components/todo/intent.py +++ b/homeassistant/components/todo/intent.py @@ -8,7 +8,7 @@ from homeassistant.helpers import intent from . import TodoItem, TodoItemStatus, TodoListEntity -from .const import DOMAIN, DOMAIN_DATA +from .const import DATA_COMPONENT, DOMAIN INTENT_LIST_ADD_ITEM = "HassListAddItem" @@ -49,7 +49,7 @@ async def async_handle(self, intent_obj: intent.Intent) -> intent.IntentResponse result=match_result, constraints=match_constraints ) - target_list = hass.data[DOMAIN_DATA].get_entity( + target_list = hass.data[DATA_COMPONENT].get_entity( match_result.states[0].entity_id ) if target_list is None: diff --git a/homeassistant/components/tts/__init__.py b/homeassistant/components/tts/__init__.py index 5ecbe15601da3..671d5b13f37b6 100644 --- a/homeassistant/components/tts/__init__.py +++ b/homeassistant/components/tts/__init__.py @@ -57,12 +57,12 @@ CONF_CACHE, CONF_CACHE_DIR, CONF_TIME_MEMORY, + DATA_COMPONENT, DATA_TTS_MANAGER, DEFAULT_CACHE, DEFAULT_CACHE_DIR, DEFAULT_TIME_MEMORY, DOMAIN, - DOMAIN_DATA, TtsAudioType, ) from .helper import get_engine_instance @@ -140,7 +140,7 @@ def async_default_engine(hass: HomeAssistant) -> str | None: """ default_entity_id: str | None = None - for entity in hass.data[DOMAIN_DATA].entities: + for entity in hass.data[DATA_COMPONENT].entities: if entity.platform and entity.platform.platform_name == "cloud": return entity.entity_id @@ -158,7 +158,7 @@ def async_resolve_engine(hass: HomeAssistant, engine: str | None) -> str | None: """ if engine is not None: if ( - not hass.data[DOMAIN_DATA].get_entity(engine) + not hass.data[DATA_COMPONENT].get_entity(engine) and engine not in hass.data[DATA_TTS_MANAGER].providers ): return None @@ -200,7 +200,7 @@ def async_get_text_to_speech_languages(hass: HomeAssistant) -> set[str]: """Return a set with the union of languages supported by tts engines.""" languages = set() - for entity in hass.data[DOMAIN_DATA].entities: + for entity in hass.data[DATA_COMPONENT].entities: for language_tag in entity.supported_languages: languages.add(language_tag) @@ -317,7 +317,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: return False hass.data[DATA_TTS_MANAGER] = tts - component = hass.data[DOMAIN_DATA] = EntityComponent[TextToSpeechEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[TextToSpeechEntity]( _LOGGER, DOMAIN, hass ) @@ -365,12 +365,12 @@ async def async_clear_cache_handle(service: ServiceCall) -> None: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) CACHED_PROPERTIES_WITH_ATTR_ = { @@ -1101,7 +1101,7 @@ def websocket_list_engines( provider_info: dict[str, Any] entity_domains: set[str] = set() - for entity in hass.data[DOMAIN_DATA].entities: + for entity in hass.data[DATA_COMPONENT].entities: provider_info = { "engine_id": entity.entity_id, "supported_languages": entity.supported_languages, @@ -1149,7 +1149,7 @@ def websocket_get_engine( provider: TextToSpeechEntity | Provider | None = next( ( entity - for entity in hass.data[DOMAIN_DATA].entities + for entity in hass.data[DATA_COMPONENT].entities if entity.entity_id == engine_id ), None, diff --git a/homeassistant/components/tts/const.py b/homeassistant/components/tts/const.py index b465dfb15ddd8..42c7d710ad498 100644 --- a/homeassistant/components/tts/const.py +++ b/homeassistant/components/tts/const.py @@ -26,7 +26,7 @@ DEFAULT_TIME_MEMORY = 300 DOMAIN = "tts" -DOMAIN_DATA: HassKey[EntityComponent[TextToSpeechEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[TextToSpeechEntity]] = HassKey(DOMAIN) DATA_TTS_MANAGER: HassKey[SpeechManager] = HassKey("tts_manager") diff --git a/homeassistant/components/tts/helper.py b/homeassistant/components/tts/helper.py index 41b938f7e0bdf..614d848ea6a8a 100644 --- a/homeassistant/components/tts/helper.py +++ b/homeassistant/components/tts/helper.py @@ -6,7 +6,7 @@ from homeassistant.core import HomeAssistant -from .const import DATA_TTS_MANAGER, DOMAIN_DATA +from .const import DATA_COMPONENT, DATA_TTS_MANAGER if TYPE_CHECKING: from . import TextToSpeechEntity @@ -17,7 +17,7 @@ def get_engine_instance( hass: HomeAssistant, engine: str ) -> TextToSpeechEntity | Provider | None: """Get engine instance.""" - if entity := hass.data[DOMAIN_DATA].get_entity(engine): + if entity := hass.data[DATA_COMPONENT].get_entity(engine): return entity return hass.data[DATA_TTS_MANAGER].providers.get(engine) diff --git a/homeassistant/components/tts/media_source.py b/homeassistant/components/tts/media_source.py index dce521621c5fb..4f1fa59f0010f 100644 --- a/homeassistant/components/tts/media_source.py +++ b/homeassistant/components/tts/media_source.py @@ -20,7 +20,7 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError -from .const import DATA_TTS_MANAGER, DOMAIN, DOMAIN_DATA +from .const import DATA_COMPONENT, DATA_TTS_MANAGER, DOMAIN from .helper import get_engine_instance URL_QUERY_TTS_OPTIONS = "tts_options" @@ -146,7 +146,7 @@ async def async_browse_media( for engine in self.hass.data[DATA_TTS_MANAGER].providers ] + [ self._engine_item(entity.entity_id) - for entity in self.hass.data[DOMAIN_DATA].entities + for entity in self.hass.data[DATA_COMPONENT].entities ] return BrowseMediaSource( domain=DOMAIN, diff --git a/homeassistant/components/update/__init__.py b/homeassistant/components/update/__init__.py index 699f8bad51f7f..8897e9cc44259 100644 --- a/homeassistant/components/update/__init__.py +++ b/homeassistant/components/update/__init__.py @@ -42,7 +42,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[UpdateEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[UpdateEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT: Final = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -80,7 +80,7 @@ class UpdateDeviceClass(StrEnum): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Select entities.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[UpdateEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[UpdateEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -113,12 +113,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) async def async_install(entity: UpdateEntity, service_call: ServiceCall) -> None: @@ -492,7 +492,7 @@ async def websocket_release_notes( msg: dict[str, Any], ) -> None: """Get the full release notes for a entity.""" - entity = hass.data[DOMAIN_DATA].get_entity(msg["entity_id"]) + entity = hass.data[DATA_COMPONENT].get_entity(msg["entity_id"]) if entity is None: connection.send_error( diff --git a/homeassistant/components/vacuum/__init__.py b/homeassistant/components/vacuum/__init__.py index b74ccb5fc7a9d..0922ee75ee7a7 100644 --- a/homeassistant/components/vacuum/__init__.py +++ b/homeassistant/components/vacuum/__init__.py @@ -40,7 +40,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[StateVacuumEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[StateVacuumEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -134,7 +134,7 @@ def is_on(hass: HomeAssistant, entity_id: str) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the vacuum component.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[StateVacuumEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[StateVacuumEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -197,12 +197,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class StateVacuumEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/valve/__init__.py b/homeassistant/components/valve/__init__.py index c6b49a9a7c2b2..7df6f8eac5154 100644 --- a/homeassistant/components/valve/__init__.py +++ b/homeassistant/components/valve/__init__.py @@ -33,7 +33,7 @@ _LOGGER = logging.getLogger(__name__) -DOMAIN_DATA: HassKey[EntityComponent[ValveEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[ValveEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -67,7 +67,7 @@ class ValveEntityFeature(IntFlag): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Track states and offer events for valves.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[ValveEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[ValveEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) @@ -111,12 +111,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) @dataclass(frozen=True, kw_only=True) diff --git a/homeassistant/components/wake_word/__init__.py b/homeassistant/components/wake_word/__init__.py index 00db5a7355b5e..8b3a5bbf33118 100644 --- a/homeassistant/components/wake_word/__init__.py +++ b/homeassistant/components/wake_word/__init__.py @@ -36,7 +36,7 @@ _LOGGER = logging.getLogger(__name__) CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN) -DOMAIN_DATA: HassKey[EntityComponent[WakeWordDetectionEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[WakeWordDetectionEntity]] = HassKey(DOMAIN) TIMEOUT_FETCH_WAKE_WORDS = 10 @@ -52,14 +52,14 @@ def async_get_wake_word_detection_entity( hass: HomeAssistant, entity_id: str ) -> WakeWordDetectionEntity | None: """Return wake word entity.""" - return hass.data[DOMAIN_DATA].get_entity(entity_id) + return hass.data[DATA_COMPONENT].get_entity(entity_id) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up wake word.""" websocket_api.async_register_command(hass, websocket_entity_info) - component = hass.data[DOMAIN_DATA] = EntityComponent[WakeWordDetectionEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[WakeWordDetectionEntity]( _LOGGER, DOMAIN, hass ) component.register_shutdown() @@ -69,12 +69,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class WakeWordDetectionEntity(RestoreEntity): @@ -141,7 +141,7 @@ async def websocket_entity_info( hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict ) -> None: """Get info about wake word entity.""" - entity = hass.data[DOMAIN_DATA].get_entity(msg["entity_id"]) + entity = hass.data[DATA_COMPONENT].get_entity(msg["entity_id"]) if entity is None: connection.send_error( diff --git a/homeassistant/components/water_heater/__init__.py b/homeassistant/components/water_heater/__init__.py index da8b49bd171f5..502f7d226b0cc 100644 --- a/homeassistant/components/water_heater/__init__.py +++ b/homeassistant/components/water_heater/__init__.py @@ -40,7 +40,7 @@ from .const import DOMAIN -DOMAIN_DATA: HassKey[EntityComponent[WaterHeaterEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[WaterHeaterEntity]] = HassKey(DOMAIN) ENTITY_ID_FORMAT = DOMAIN + ".{}" PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE @@ -111,7 +111,7 @@ class WaterHeaterEntityFeature(IntFlag): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up water_heater devices.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[WaterHeaterEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[WaterHeaterEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) await component.async_setup(config) @@ -139,12 +139,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class WaterHeaterEntityEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/weather/__init__.py b/homeassistant/components/weather/__init__.py index 03b8addc1c9b1..4db90f70bd89a 100644 --- a/homeassistant/components/weather/__init__.py +++ b/homeassistant/components/weather/__init__.py @@ -62,8 +62,8 @@ ATTR_WEATHER_WIND_GUST_SPEED, ATTR_WEATHER_WIND_SPEED, ATTR_WEATHER_WIND_SPEED_UNIT, + DATA_COMPONENT, DOMAIN, - DOMAIN_DATA, INTENT_GET_WEATHER, UNIT_CONVERSIONS, VALID_UNITS, @@ -197,7 +197,7 @@ class Forecast(TypedDict, total=False): async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the weather component.""" - component = hass.data[DOMAIN_DATA] = EntityComponent[WeatherEntity]( + component = hass.data[DATA_COMPONENT] = EntityComponent[WeatherEntity]( _LOGGER, DOMAIN, hass, SCAN_INTERVAL ) component.async_register_entity_service( @@ -218,12 +218,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a config entry.""" - return await hass.data[DOMAIN_DATA].async_setup_entry(entry) + return await hass.data[DATA_COMPONENT].async_setup_entry(entry) async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - return await hass.data[DOMAIN_DATA].async_unload_entry(entry) + return await hass.data[DATA_COMPONENT].async_unload_entry(entry) class WeatherEntityDescription(EntityDescription, frozen_or_thawed=True): diff --git a/homeassistant/components/weather/const.py b/homeassistant/components/weather/const.py index ef8eada2b3f2a..f532b891e3ee1 100644 --- a/homeassistant/components/weather/const.py +++ b/homeassistant/components/weather/const.py @@ -54,7 +54,7 @@ class WeatherEntityFeature(IntFlag): ATTR_WEATHER_UV_INDEX = "uv_index" DOMAIN: Final = "weather" -DOMAIN_DATA: HassKey[EntityComponent[WeatherEntity]] = HassKey(DOMAIN) +DATA_COMPONENT: HassKey[EntityComponent[WeatherEntity]] = HassKey(DOMAIN) INTENT_GET_WEATHER = "HassGetWeather" diff --git a/homeassistant/components/weather/websocket_api.py b/homeassistant/components/weather/websocket_api.py index fb9759c9bdf4d..a96c4fa99730a 100644 --- a/homeassistant/components/weather/websocket_api.py +++ b/homeassistant/components/weather/websocket_api.py @@ -11,7 +11,7 @@ from homeassistant.helpers import config_validation as cv from homeassistant.util.json import JsonValueType -from .const import DOMAIN, DOMAIN_DATA, VALID_UNITS, WeatherEntityFeature +from .const import DATA_COMPONENT, DOMAIN, VALID_UNITS, WeatherEntityFeature FORECAST_TYPE_TO_FLAG = { "daily": WeatherEntityFeature.FORECAST_DAILY, @@ -58,7 +58,7 @@ async def ws_subscribe_forecast( entity_id: str = msg["entity_id"] forecast_type: Literal["daily", "hourly", "twice_daily"] = msg["forecast_type"] - if not (entity := hass.data[DOMAIN_DATA].get_entity(msg["entity_id"])): + if not (entity := hass.data[DATA_COMPONENT].get_entity(msg["entity_id"])): connection.send_error( msg["id"], "invalid_entity_id", diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index 8b190abad923f..98a2cd719314a 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -1771,7 +1771,7 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: ) -def _backward_compat_trigger_schema(value: Any | None) -> Any: +def _trigger_pre_validator(value: Any | None) -> Any: """Rewrite trigger `trigger` to `platform`. `platform` has been renamed to `trigger` in user documentation and in the automation @@ -1790,6 +1790,8 @@ def _backward_compat_trigger_schema(value: Any | None) -> Any: ) value = dict(value) value[CONF_PLATFORM] = value.pop(CONF_TRIGGER) + elif CONF_PLATFORM not in value: + raise vol.Invalid("required key not provided", [CONF_TRIGGER]) return value @@ -1831,7 +1833,7 @@ def _base_trigger_validator(value: Any) -> Any: TRIGGER_SCHEMA = vol.All( ensure_list, _base_trigger_list_flatten, - [vol.All(_backward_compat_trigger_schema, _base_trigger_validator)], + [vol.All(_trigger_pre_validator, _base_trigger_validator)], ) _SCRIPT_DELAY_SCHEMA = vol.Schema( diff --git a/script/licenses.py b/script/licenses.py index 72906da2a895f..177fc8e4b2516 100644 --- a/script/licenses.py +++ b/script/licenses.py @@ -170,7 +170,7 @@ def from_dict(cls, data: dict[str, str]) -> PackageDefinition: TODO = { "aiocache": AwesomeVersion( - "0.12.2" + "0.12.3" ), # https://github.com/aio-libs/aiocache/blob/master/LICENSE all rights reserved? } diff --git a/tests/components/bang_olufsen/conftest.py b/tests/components/bang_olufsen/conftest.py index 0ad9d34a170df..ff29592b1376e 100644 --- a/tests/components/bang_olufsen/conftest.py +++ b/tests/components/bang_olufsen/conftest.py @@ -7,6 +7,10 @@ Action, BeolinkPeer, ContentItem, + ListeningMode, + ListeningModeFeatures, + ListeningModeRef, + ListeningModeTrigger, PlaybackContentMetadata, PlaybackProgress, PlaybackState, @@ -38,6 +42,9 @@ TEST_NAME_2, TEST_SERIAL_NUMBER, TEST_SERIAL_NUMBER_2, + TEST_SOUND_MODE, + TEST_SOUND_MODE_2, + TEST_SOUND_MODE_NAME, ) from tests.common import MockConfigEntry @@ -263,6 +270,32 @@ def mock_mozart_client() -> Generator[AsyncMock]: BeolinkPeer(friendly_name=TEST_FRIENDLY_NAME_3, jid=TEST_JID_3), ] + client.get_listening_mode_set = AsyncMock() + client.get_listening_mode_set.return_value = [ + ListeningMode( + id=TEST_SOUND_MODE, + name=TEST_SOUND_MODE_NAME, + features=ListeningModeFeatures(), + triggers=[ListeningModeTrigger()], + ), + ListeningMode( + id=TEST_SOUND_MODE_2, + name=TEST_SOUND_MODE_NAME, + features=ListeningModeFeatures(), + triggers=[ListeningModeTrigger()], + ), + ListeningMode( + id=345, + name=f"{TEST_SOUND_MODE_NAME} 2", + features=ListeningModeFeatures(), + triggers=[ListeningModeTrigger()], + ), + ] + client.get_active_listening_mode = AsyncMock() + client.get_active_listening_mode.return_value = ListeningModeRef( + href="", + id=123, + ) client.post_standby = AsyncMock() client.set_current_volume_level = AsyncMock() client.set_volume_mute = AsyncMock() @@ -283,6 +316,7 @@ def mock_mozart_client() -> Generator[AsyncMock]: client.post_beolink_leave = AsyncMock() client.post_beolink_allstandby = AsyncMock() client.join_latest_beolink_experience = AsyncMock() + client.activate_listening_mode = AsyncMock() # Non-REST API client methods client.check_device_connection = AsyncMock() diff --git a/tests/components/bang_olufsen/const.py b/tests/components/bang_olufsen/const.py index e8d8653c5b757..7cbe81dc06a40 100644 --- a/tests/components/bang_olufsen/const.py +++ b/tests/components/bang_olufsen/const.py @@ -6,6 +6,7 @@ from mozart_api.exceptions import ApiException from mozart_api.models import ( Action, + ListeningModeRef, OverlayPlayRequest, OverlayPlayRequestTextToSpeechTextToSpeech, PlaybackContentMetadata, @@ -197,3 +198,14 @@ data='{"message": "Couldn\'t start user flow for me"}', # codespell:ignore ), ) +TEST_SOUND_MODE = 123 +TEST_SOUND_MODE_2 = 234 +TEST_SOUND_MODE_NAME = "Test Listening Mode" +TEST_ACTIVE_SOUND_MODE_NAME = f"{TEST_SOUND_MODE_NAME} ({TEST_SOUND_MODE})" +TEST_ACTIVE_SOUND_MODE_NAME_2 = f"{TEST_SOUND_MODE_NAME} ({TEST_SOUND_MODE_2})" +TEST_LISTENING_MODE_REF = ListeningModeRef(href="", id=TEST_SOUND_MODE_2) +TEST_SOUND_MODES = [ + TEST_ACTIVE_SOUND_MODE_NAME, + TEST_ACTIVE_SOUND_MODE_NAME_2, + f"{TEST_SOUND_MODE_NAME} 2 (345)", +] diff --git a/tests/components/bang_olufsen/test_media_player.py b/tests/components/bang_olufsen/test_media_player.py index 12dee794709c0..ff42ae2a867be 100644 --- a/tests/components/bang_olufsen/test_media_player.py +++ b/tests/components/bang_olufsen/test_media_player.py @@ -37,6 +37,8 @@ ATTR_MEDIA_TRACK, ATTR_MEDIA_VOLUME_LEVEL, ATTR_MEDIA_VOLUME_MUTED, + ATTR_SOUND_MODE, + ATTR_SOUND_MODE_LIST, DOMAIN as MEDIA_PLAYER_DOMAIN, SERVICE_CLEAR_PLAYLIST, SERVICE_MEDIA_NEXT_TRACK, @@ -45,6 +47,7 @@ SERVICE_MEDIA_SEEK, SERVICE_MEDIA_STOP, SERVICE_PLAY_MEDIA, + SERVICE_SELECT_SOUND_MODE, SERVICE_SELECT_SOURCE, SERVICE_TURN_OFF, SERVICE_VOLUME_MUTE, @@ -58,6 +61,8 @@ from homeassistant.setup import async_setup_component from .const import ( + TEST_ACTIVE_SOUND_MODE_NAME, + TEST_ACTIVE_SOUND_MODE_NAME_2, TEST_AUDIO_SOURCES, TEST_DEEZER_FLOW, TEST_DEEZER_INVALID_FLOW, @@ -66,6 +71,7 @@ TEST_FALLBACK_SOURCES, TEST_FRIENDLY_NAME_2, TEST_JID_2, + TEST_LISTENING_MODE_REF, TEST_MEDIA_PLAYER_ENTITY_ID, TEST_MEDIA_PLAYER_ENTITY_ID_2, TEST_MEDIA_PLAYER_ENTITY_ID_3, @@ -79,6 +85,8 @@ TEST_PLAYBACK_STATE_TURN_OFF, TEST_RADIO_STATION, TEST_SEEK_POSITION_HOME_ASSISTANT_FORMAT, + TEST_SOUND_MODE_2, + TEST_SOUND_MODES, TEST_SOURCES, TEST_VIDEO_SOURCES, TEST_VOLUME, @@ -113,12 +121,15 @@ async def test_initialization( assert (states := hass.states.get(TEST_MEDIA_PLAYER_ENTITY_ID)) assert states.attributes[ATTR_INPUT_SOURCE_LIST] == TEST_SOURCES assert states.attributes[ATTR_MEDIA_POSITION_UPDATED_AT] + assert states.attributes[ATTR_SOUND_MODE_LIST] == TEST_SOUND_MODES # Check API calls mock_mozart_client.get_softwareupdate_status.assert_called_once() mock_mozart_client.get_product_state.assert_called_once() mock_mozart_client.get_available_sources.assert_called_once() mock_mozart_client.get_remote_menu.assert_called_once() + mock_mozart_client.get_listening_mode_set.assert_called_once() + mock_mozart_client.get_active_listening_mode.assert_called_once() async def test_async_update_sources_audio_only( @@ -779,6 +790,69 @@ async def test_async_select_source( assert mock_mozart_client.post_remote_trigger.call_count == video_source_call +async def test_async_select_sound_mode( + hass: HomeAssistant, + mock_mozart_client: AsyncMock, + mock_config_entry: MockConfigEntry, +) -> None: + """Test async_select_sound_mode.""" + + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + + assert (states := hass.states.get(TEST_MEDIA_PLAYER_ENTITY_ID)) + assert states.attributes[ATTR_SOUND_MODE] == TEST_ACTIVE_SOUND_MODE_NAME + + active_listening_mode_callback = ( + mock_mozart_client.get_active_listening_mode_notifications.call_args[0][0] + ) + + await hass.services.async_call( + MEDIA_PLAYER_DOMAIN, + SERVICE_SELECT_SOUND_MODE, + { + ATTR_ENTITY_ID: TEST_MEDIA_PLAYER_ENTITY_ID, + ATTR_SOUND_MODE: TEST_ACTIVE_SOUND_MODE_NAME_2, + }, + blocking=True, + ) + + active_listening_mode_callback(TEST_LISTENING_MODE_REF) + + assert (states := hass.states.get(TEST_MEDIA_PLAYER_ENTITY_ID)) + assert states.attributes[ATTR_SOUND_MODE] == TEST_ACTIVE_SOUND_MODE_NAME_2 + + mock_mozart_client.activate_listening_mode.assert_called_once_with( + id=TEST_SOUND_MODE_2 + ) + + +async def test_async_select_sound_mode_invalid( + hass: HomeAssistant, + mock_mozart_client: AsyncMock, + mock_config_entry: MockConfigEntry, +) -> None: + """Test async_select_sound_mode with an invalid sound_mode.""" + + mock_config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(mock_config_entry.entry_id) + + with pytest.raises(ServiceValidationError) as exc_info: + await hass.services.async_call( + MEDIA_PLAYER_DOMAIN, + SERVICE_SELECT_SOUND_MODE, + { + ATTR_ENTITY_ID: TEST_MEDIA_PLAYER_ENTITY_ID, + ATTR_SOUND_MODE: "invalid_sound_mode", + }, + blocking=True, + ) + + assert exc_info.value.translation_domain == DOMAIN + assert exc_info.value.translation_key == "invalid_sound_mode" + assert exc_info.errisinstance(ServiceValidationError) + + async def test_async_play_media_invalid_type( hass: HomeAssistant, mock_mozart_client: AsyncMock, diff --git a/tests/helpers/test_config_validation.py b/tests/helpers/test_config_validation.py index 4fd87d6d2fe51..7202cef6f5f4a 100644 --- a/tests/helpers/test_config_validation.py +++ b/tests/helpers/test_config_validation.py @@ -6,6 +6,7 @@ from functools import partial import logging import os +import re from socket import _GLOBAL_DEFAULT_TIMEOUT import threading from typing import Any @@ -1911,16 +1912,19 @@ async def test_nested_trigger_list_extra() -> None: async def test_trigger_backwards_compatibility() -> None: """Test triggers with backwards compatibility.""" - assert cv._backward_compat_trigger_schema("str") == "str" - assert cv._backward_compat_trigger_schema({"platform": "abc"}) == { - "platform": "abc" - } - assert cv._backward_compat_trigger_schema({"trigger": "abc"}) == {"platform": "abc"} + assert cv._trigger_pre_validator("str") == "str" + assert cv._trigger_pre_validator({"platform": "abc"}) == {"platform": "abc"} + assert cv._trigger_pre_validator({"trigger": "abc"}) == {"platform": "abc"} with pytest.raises( vol.Invalid, match="Cannot specify both 'platform' and 'trigger'. Please use 'trigger' only.", ): - cv._backward_compat_trigger_schema({"trigger": "abc", "platform": "def"}) + cv._trigger_pre_validator({"trigger": "abc", "platform": "def"}) + with pytest.raises( + vol.Invalid, + match=re.escape("required key not provided @ data['trigger']"), + ): + cv._trigger_pre_validator({}) async def test_is_entity_service_schema(