diff --git a/homeassistant/components/climate/__init__.py b/homeassistant/components/climate/__init__.py index 03acaa0829465..59749cd58ee82 100644 --- a/homeassistant/components/climate/__init__.py +++ b/homeassistant/components/climate/__init__.py @@ -27,7 +27,6 @@ from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.temperature import display_temp as show_temp from homeassistant.helpers.typing import ConfigType -from homeassistant.loader import async_suggest_report_issue from homeassistant.util.hass_dict import HassKey from homeassistant.util.unit_conversion import TemperatureConverter @@ -535,26 +534,6 @@ def _valid_mode_or_raise( return modes_str: str = ", ".join(modes) if modes else "" translation_key = f"not_valid_{mode_type}_mode" - if mode_type == "hvac": - report_issue = async_suggest_report_issue( - self.hass, - integration_domain=self.platform.platform_name, - module=type(self).__module__, - ) - _LOGGER.warning( - ( - "%s::%s sets the hvac_mode %s which is not " - "valid for this entity with modes: %s. " - "This will stop working in 2025.4 and raise an error instead. " - "Please %s" - ), - self.platform.platform_name, - self.__class__.__name__, - mode, - modes_str, - report_issue, - ) - return raise ServiceValidationError( translation_domain=DOMAIN, translation_key=translation_key, diff --git a/homeassistant/components/climate/strings.json b/homeassistant/components/climate/strings.json index bd6ed083650eb..ad0bccb25cedc 100644 --- a/homeassistant/components/climate/strings.json +++ b/homeassistant/components/climate/strings.json @@ -258,6 +258,9 @@ "not_valid_preset_mode": { "message": "Preset mode {mode} is not valid. Valid preset modes are: {modes}." }, + "not_valid_hvac_mode": { + "message": "HVAC mode {mode} is not valid. Valid HVAC modes are: {modes}." + }, "not_valid_swing_mode": { "message": "Swing mode {mode} is not valid. Valid swing modes are: {modes}." }, diff --git a/homeassistant/components/deconz/climate.py b/homeassistant/components/deconz/climate.py index 26597c195e793..af10bf7e3c371 100644 --- a/homeassistant/components/deconz/climate.py +++ b/homeassistant/components/deconz/climate.py @@ -164,8 +164,6 @@ def hvac_mode(self) -> HVACMode: async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set new target hvac mode.""" - if hvac_mode not in self._attr_hvac_modes: - raise ValueError(f"Unsupported HVAC mode {hvac_mode}") if len(self._attr_hvac_modes) == 2: # Only allow turn on and off thermostat await self.hub.api.sensors.thermostat.set_config( diff --git a/homeassistant/components/electric_kiwi/strings.json b/homeassistant/components/electric_kiwi/strings.json index 5e0a2ef168d35..903c16543bbaa 100644 --- a/homeassistant/components/electric_kiwi/strings.json +++ b/homeassistant/components/electric_kiwi/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/fitbit/strings.json b/homeassistant/components/fitbit/strings.json index 9029a8265bb6e..37e1259a35c93 100644 --- a/homeassistant/components/fitbit/strings.json +++ b/homeassistant/components/fitbit/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "auth": { "title": "Link Fitbit" diff --git a/homeassistant/components/freedompro/climate.py b/homeassistant/components/freedompro/climate.py index 0145dea27bb00..4e4660bc545d4 100644 --- a/homeassistant/components/freedompro/climate.py +++ b/homeassistant/components/freedompro/climate.py @@ -125,8 +125,6 @@ async def async_added_to_hass(self) -> None: async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Async function to set mode to climate.""" - if hvac_mode not in SUPPORTED_HVAC_MODES: - raise ValueError(f"Got unsupported hvac_mode {hvac_mode}") payload = {"heatingCoolingState": HVAC_INVERT_MAP[hvac_mode]} await put_state( diff --git a/homeassistant/components/geocaching/strings.json b/homeassistant/components/geocaching/strings.json index 9989af9a75c5a..ca6e9d5e67f59 100644 --- a/homeassistant/components/geocaching/strings.json +++ b/homeassistant/components/geocaching/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/google/strings.json b/homeassistant/components/google/strings.json index 4f3e27af27e71..7ac16ab0af67a 100644 --- a/homeassistant/components/google/strings.json +++ b/homeassistant/components/google/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/google_assistant_sdk/strings.json b/homeassistant/components/google_assistant_sdk/strings.json index 885ff0aad71a4..2622333e15f00 100644 --- a/homeassistant/components/google_assistant_sdk/strings.json +++ b/homeassistant/components/google_assistant_sdk/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/google_drive/strings.json b/homeassistant/components/google_drive/strings.json index e6658fb08e9bf..3dc958b7dfc10 100644 --- a/homeassistant/components/google_drive/strings.json +++ b/homeassistant/components/google_drive/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/google_mail/strings.json b/homeassistant/components/google_mail/strings.json index 759242593ff82..c856b0d33294e 100644 --- a/homeassistant/components/google_mail/strings.json +++ b/homeassistant/components/google_mail/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/google_photos/strings.json b/homeassistant/components/google_photos/strings.json index 5695192dd27b4..503f27d812592 100644 --- a/homeassistant/components/google_photos/strings.json +++ b/homeassistant/components/google_photos/strings.json @@ -5,7 +5,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/google_sheets/strings.json b/homeassistant/components/google_sheets/strings.json index 406c4440d003e..9a5ed48767d67 100644 --- a/homeassistant/components/google_sheets/strings.json +++ b/homeassistant/components/google_sheets/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/google_tasks/strings.json b/homeassistant/components/google_tasks/strings.json index b58678f6d3000..3a7ef8a1ec881 100644 --- a/homeassistant/components/google_tasks/strings.json +++ b/homeassistant/components/google_tasks/strings.json @@ -5,7 +5,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/home_connect/strings.json b/homeassistant/components/home_connect/strings.json index 1445a8eae08d3..99c89ec8788b0 100644 --- a/homeassistant/components/home_connect/strings.json +++ b/homeassistant/components/home_connect/strings.json @@ -9,7 +9,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/homematicip_cloud/climate.py b/homeassistant/components/homematicip_cloud/climate.py index 7f393cf52bd03..18f169bb91b14 100644 --- a/homeassistant/components/homematicip_cloud/climate.py +++ b/homeassistant/components/homematicip_cloud/climate.py @@ -216,8 +216,6 @@ async def async_set_temperature(self, **kwargs: Any) -> None: async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set new target hvac mode.""" - if hvac_mode not in self.hvac_modes: - return if hvac_mode == HVACMode.AUTO: await self._device.set_control_mode_async(HMIP_AUTOMATIC_CM) diff --git a/homeassistant/components/husqvarna_automower/strings.json b/homeassistant/components/husqvarna_automower/strings.json index 5b815e79263b0..9e808c66878f8 100644 --- a/homeassistant/components/husqvarna_automower/strings.json +++ b/homeassistant/components/husqvarna_automower/strings.json @@ -10,7 +10,13 @@ "description": "For the best experience with this integration both the `Authentication API` and the `Automower Connect API` should be connected. Please make sure that both of them are connected to your account in the [Husqvarna Developer Portal]({application_url})." }, "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } } }, "abort": { diff --git a/homeassistant/components/iotty/strings.json b/homeassistant/components/iotty/strings.json index cb0dc509d9ad2..cf9a8fbb87745 100644 --- a/homeassistant/components/iotty/strings.json +++ b/homeassistant/components/iotty/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } } }, "abort": { diff --git a/homeassistant/components/lametric/strings.json b/homeassistant/components/lametric/strings.json index 0656454bb014a..dbf25f6680bde 100644 --- a/homeassistant/components/lametric/strings.json +++ b/homeassistant/components/lametric/strings.json @@ -9,7 +9,13 @@ } }, "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "manual_entry": { "data": { diff --git a/homeassistant/components/lyric/strings.json b/homeassistant/components/lyric/strings.json index 786f49e530075..a934d8eda2e50 100644 --- a/homeassistant/components/lyric/strings.json +++ b/homeassistant/components/lyric/strings.json @@ -5,7 +5,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/maxcube/climate.py b/homeassistant/components/maxcube/climate.py index 69a0eb8a5536d..65b1795023f70 100644 --- a/homeassistant/components/maxcube/climate.py +++ b/homeassistant/components/maxcube/climate.py @@ -133,8 +133,6 @@ def set_hvac_mode(self, hvac_mode: HVACMode) -> None: self._set_target(MAX_DEVICE_MODE_MANUAL, temp) elif hvac_mode == HVACMode.AUTO: self._set_target(MAX_DEVICE_MODE_AUTOMATIC, None) - else: - raise ValueError(f"unsupported HVAC mode {hvac_mode}") def _set_target(self, mode: int | None, temp: float | None) -> None: """Set the mode and/or temperature of the thermostat. diff --git a/homeassistant/components/mcp/strings.json b/homeassistant/components/mcp/strings.json index 2b59d4ffa5139..780b4818666dd 100644 --- a/homeassistant/components/mcp/strings.json +++ b/homeassistant/components/mcp/strings.json @@ -12,10 +12,10 @@ "pick_implementation": { "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", "data": { - "implementation": "Credentials" + "implementation": "[%key:common::config_flow::data::implementation%]" }, "data_description": { - "implementation": "The credentials to use for the OAuth2 flow" + "implementation": "[%key:common::config_flow::description::implementation%]" } } }, diff --git a/homeassistant/components/microbees/strings.json b/homeassistant/components/microbees/strings.json index 8635753a56427..5337bf149b7cc 100644 --- a/homeassistant/components/microbees/strings.json +++ b/homeassistant/components/microbees/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } } }, "error": { diff --git a/homeassistant/components/miele/strings.json b/homeassistant/components/miele/strings.json index cf01d01e476a8..94aef8d6d3f56 100644 --- a/homeassistant/components/miele/strings.json +++ b/homeassistant/components/miele/strings.json @@ -8,7 +8,13 @@ "description": "[%key:common::config_flow::description::confirm_setup%]" }, "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/monzo/strings.json b/homeassistant/components/monzo/strings.json index e4ec34a845916..fa91602113826 100644 --- a/homeassistant/components/monzo/strings.json +++ b/homeassistant/components/monzo/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/myuplink/strings.json b/homeassistant/components/myuplink/strings.json index 939aa2f17c886..d599836b8ef43 100644 --- a/homeassistant/components/myuplink/strings.json +++ b/homeassistant/components/myuplink/strings.json @@ -5,7 +5,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/neato/strings.json b/homeassistant/components/neato/strings.json index 0324fdb8fad06..c16b7bc19036c 100644 --- a/homeassistant/components/neato/strings.json +++ b/homeassistant/components/neato/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::description::confirm_setup%]" diff --git a/homeassistant/components/nest/climate.py b/homeassistant/components/nest/climate.py index f5eff664f835e..25f39704393ac 100644 --- a/homeassistant/components/nest/climate.py +++ b/homeassistant/components/nest/climate.py @@ -267,8 +267,6 @@ def _get_supported_features(self) -> ClimateEntityFeature: async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set new target hvac mode.""" - if hvac_mode not in self.hvac_modes: - raise ValueError(f"Unsupported hvac_mode '{hvac_mode}'") api_mode = THERMOSTAT_INV_MODE_MAP[hvac_mode] trait = self._device.traits[ThermostatModeTrait.NAME] try: diff --git a/homeassistant/components/nest/strings.json b/homeassistant/components/nest/strings.json index 5146d04af0bf9..1fc3de9be6b03 100644 --- a/homeassistant/components/nest/strings.json +++ b/homeassistant/components/nest/strings.json @@ -23,7 +23,13 @@ } }, "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "pubsub_topic": { "title": "Configure Cloud Pub/Sub topic", diff --git a/homeassistant/components/netatmo/strings.json b/homeassistant/components/netatmo/strings.json index 580b49ea64667..f47b9e993aafe 100644 --- a/homeassistant/components/netatmo/strings.json +++ b/homeassistant/components/netatmo/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/ondilo_ico/strings.json b/homeassistant/components/ondilo_ico/strings.json index 360c0b124a7c2..3a5e7445a0c52 100644 --- a/homeassistant/components/ondilo_ico/strings.json +++ b/homeassistant/components/ondilo_ico/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } } }, "abort": { diff --git a/homeassistant/components/onedrive/strings.json b/homeassistant/components/onedrive/strings.json index b8fa7f8189d34..8c01ad85d4ac5 100644 --- a/homeassistant/components/onedrive/strings.json +++ b/homeassistant/components/onedrive/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/plex/const.py b/homeassistant/components/plex/const.py index d5d7021947121..b43a1eca135ad 100644 --- a/homeassistant/components/plex/const.py +++ b/homeassistant/components/plex/const.py @@ -56,7 +56,6 @@ MANUAL_SETUP_STRING = "Configure Plex server manually" SERVICE_REFRESH_LIBRARY = "refresh_library" -SERVICE_SCAN_CLIENTS = "scan_for_clients" PLEX_URI_SCHEME = "plex://" diff --git a/homeassistant/components/plex/icons.json b/homeassistant/components/plex/icons.json index 2d3a7342ad288..21a48fd274ee4 100644 --- a/homeassistant/components/plex/icons.json +++ b/homeassistant/components/plex/icons.json @@ -9,9 +9,6 @@ "services": { "refresh_library": { "service": "mdi:refresh" - }, - "scan_for_clients": { - "service": "mdi:database-refresh" } } } diff --git a/homeassistant/components/plex/services.py b/homeassistant/components/plex/services.py index c70ddb6ed53cf..6412a4c3927a2 100644 --- a/homeassistant/components/plex/services.py +++ b/homeassistant/components/plex/services.py @@ -9,16 +9,8 @@ from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.exceptions import HomeAssistantError -from homeassistant.helpers.dispatcher import async_dispatcher_send - -from .const import ( - DOMAIN, - PLEX_UPDATE_PLATFORMS_SIGNAL, - PLEX_URI_SCHEME, - SERVERS, - SERVICE_REFRESH_LIBRARY, - SERVICE_SCAN_CLIENTS, -) + +from .const import DOMAIN, PLEX_URI_SCHEME, SERVERS, SERVICE_REFRESH_LIBRARY from .errors import MediaNotFound from .helpers import get_plex_data from .models import PlexMediaSearchResult @@ -37,24 +29,12 @@ async def async_setup_services(hass: HomeAssistant) -> None: async def async_refresh_library_service(service_call: ServiceCall) -> None: await hass.async_add_executor_job(refresh_library, hass, service_call) - async def async_scan_clients_service(_: ServiceCall) -> None: - _LOGGER.warning( - "This service is deprecated in favor of the scan_clients button entity." - " Service calls will still work for now but the service will be removed in" - " a future release" - ) - for server_id in get_plex_data(hass)[SERVERS]: - async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id)) - hass.services.async_register( DOMAIN, SERVICE_REFRESH_LIBRARY, async_refresh_library_service, schema=REFRESH_LIBRARY_SCHEMA, ) - hass.services.async_register( - DOMAIN, SERVICE_SCAN_CLIENTS, async_scan_clients_service - ) def refresh_library(hass: HomeAssistant, service_call: ServiceCall) -> None: diff --git a/homeassistant/components/plex/services.yaml b/homeassistant/components/plex/services.yaml index 5ed655b7d78ad..ee4a2a234ea2a 100644 --- a/homeassistant/components/plex/services.yaml +++ b/homeassistant/components/plex/services.yaml @@ -9,5 +9,3 @@ refresh_library: example: "TV Shows" selector: text: - -scan_for_clients: diff --git a/homeassistant/components/plex/strings.json b/homeassistant/components/plex/strings.json index 0c8eae86f733d..0eb83a64a5dad 100644 --- a/homeassistant/components/plex/strings.json +++ b/homeassistant/components/plex/strings.json @@ -83,10 +83,6 @@ "description": "Name of the Plex library to refresh." } } - }, - "scan_for_clients": { - "name": "Scan for clients", - "description": "Scans for available clients from the Plex server(s), local network, and plex.tv." } } } diff --git a/homeassistant/components/plugwise/climate.py b/homeassistant/components/plugwise/climate.py index c7fac07f1cb03..834ff8bce769a 100644 --- a/homeassistant/components/plugwise/climate.py +++ b/homeassistant/components/plugwise/climate.py @@ -15,7 +15,6 @@ ) from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature from homeassistant.core import HomeAssistant, callback -from homeassistant.exceptions import ServiceValidationError from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import DOMAIN, MASTER_THERMOSTATS @@ -216,17 +215,6 @@ async def async_set_temperature(self, **kwargs: Any) -> None: @plugwise_command async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set the hvac mode.""" - if hvac_mode not in self.hvac_modes: - hvac_modes = ", ".join(self.hvac_modes) - raise ServiceValidationError( - translation_domain=DOMAIN, - translation_key="unsupported_hvac_mode_requested", - translation_placeholders={ - "hvac_mode": hvac_mode, - "hvac_modes": hvac_modes, - }, - ) - if hvac_mode == self.hvac_mode: return diff --git a/homeassistant/components/plugwise/strings.json b/homeassistant/components/plugwise/strings.json index fdbe8c3901580..9c005c4c0dffa 100644 --- a/homeassistant/components/plugwise/strings.json +++ b/homeassistant/components/plugwise/strings.json @@ -316,9 +316,6 @@ }, "unsupported_firmware": { "message": "[%key:component::plugwise::config::error::unsupported%]" - }, - "unsupported_hvac_mode_requested": { - "message": "Unsupported mode {hvac_mode} requested, valid modes are: {hvac_modes}." } } } diff --git a/homeassistant/components/point/strings.json b/homeassistant/components/point/strings.json index b2e8d9309d9ec..2ef55d6204a34 100644 --- a/homeassistant/components/point/strings.json +++ b/homeassistant/components/point/strings.json @@ -20,7 +20,13 @@ }, "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/senz/strings.json b/homeassistant/components/senz/strings.json index cb1f056d72d7a..32398c64c523d 100644 --- a/homeassistant/components/senz/strings.json +++ b/homeassistant/components/senz/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } } }, "abort": { diff --git a/homeassistant/components/smappee/strings.json b/homeassistant/components/smappee/strings.json index 3037fbc98f659..ddb5c96db0aa9 100644 --- a/homeassistant/components/smappee/strings.json +++ b/homeassistant/components/smappee/strings.json @@ -19,7 +19,13 @@ "title": "Discovered Smappee device" }, "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } } }, "abort": { diff --git a/homeassistant/components/smartthings/strings.json b/homeassistant/components/smartthings/strings.json index 8e972ac8aea14..b322b73062b28 100644 --- a/homeassistant/components/smartthings/strings.json +++ b/homeassistant/components/smartthings/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/spotify/strings.json b/homeassistant/components/spotify/strings.json index 66d837c503f7b..352a2fb7fa2bd 100644 --- a/homeassistant/components/spotify/strings.json +++ b/homeassistant/components/spotify/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/synology_dsm/__init__.py b/homeassistant/components/synology_dsm/__init__.py index b3b40d975ceca..e568ce5a6d101 100644 --- a/homeassistant/components/synology_dsm/__init__.py +++ b/homeassistant/components/synology_dsm/__init__.py @@ -45,7 +45,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the Synology DSM component.""" - await async_setup_services(hass) + async_setup_services(hass) return True diff --git a/homeassistant/components/synology_dsm/services.py b/homeassistant/components/synology_dsm/services.py index 40b6fd4bc304a..9522361d500b2 100644 --- a/homeassistant/components/synology_dsm/services.py +++ b/homeassistant/components/synology_dsm/services.py @@ -7,7 +7,7 @@ from synology_dsm.exceptions import SynologyDSMException -from homeassistant.core import HomeAssistant, ServiceCall +from homeassistant.core import HomeAssistant, ServiceCall, callback from .const import CONF_SERIAL, DOMAIN, SERVICE_REBOOT, SERVICE_SHUTDOWN, SERVICES from .coordinator import SynologyDSMConfigEntry @@ -15,63 +15,63 @@ LOGGER = logging.getLogger(__name__) -async def async_setup_services(hass: HomeAssistant) -> None: - """Service handler setup.""" +async def _service_handler(call: ServiceCall) -> None: + """Handle service call.""" + serial: str | None = call.data.get(CONF_SERIAL) + entries: list[SynologyDSMConfigEntry] = ( + call.hass.config_entries.async_loaded_entries(DOMAIN) + ) + dsm_devices = {cast(str, entry.unique_id): entry.runtime_data for entry in entries} - async def service_handler(call: ServiceCall) -> None: - """Handle service call.""" - serial: str | None = call.data.get(CONF_SERIAL) - entries: list[SynologyDSMConfigEntry] = ( - hass.config_entries.async_loaded_entries(DOMAIN) + if serial: + entry: SynologyDSMConfigEntry | None = ( + call.hass.config_entries.async_entry_for_domain_unique_id(DOMAIN, serial) + ) + assert entry + dsm_device = entry.runtime_data + elif len(dsm_devices) == 1: + dsm_device = next(iter(dsm_devices.values())) + serial = next(iter(dsm_devices)) + else: + LOGGER.error( + "More than one DSM configured, must specify one of serials %s", + sorted(dsm_devices), ) - dsm_devices = { - cast(str, entry.unique_id): entry.runtime_data for entry in entries - } + return - if serial: - entry: SynologyDSMConfigEntry | None = ( - hass.config_entries.async_entry_for_domain_unique_id(DOMAIN, serial) - ) - assert entry - dsm_device = entry.runtime_data - elif len(dsm_devices) == 1: - dsm_device = next(iter(dsm_devices.values())) - serial = next(iter(dsm_devices)) - else: - LOGGER.error( - "More than one DSM configured, must specify one of serials %s", - sorted(dsm_devices), - ) - return + if not dsm_device: + LOGGER.error("DSM with specified serial %s not found", serial) + return - if not dsm_device: + if call.service in [SERVICE_REBOOT, SERVICE_SHUTDOWN]: + if serial not in dsm_devices: LOGGER.error("DSM with specified serial %s not found", serial) return - - if call.service in [SERVICE_REBOOT, SERVICE_SHUTDOWN]: - if serial not in dsm_devices: - LOGGER.error("DSM with specified serial %s not found", serial) - return - LOGGER.debug("%s DSM with serial %s", call.service, serial) - LOGGER.warning( - ( - "The %s service is deprecated and will be removed in future" - " release. Please use the corresponding button entity" - ), + LOGGER.debug("%s DSM with serial %s", call.service, serial) + LOGGER.warning( + ( + "The %s service is deprecated and will be removed in future" + " release. Please use the corresponding button entity" + ), + call.service, + ) + dsm_device = dsm_devices[serial] + dsm_api = dsm_device.api + try: + await getattr(dsm_api, f"async_{call.service}")() + except SynologyDSMException as ex: + LOGGER.error( + "%s of DSM with serial %s not possible, because of %s", call.service, + serial, + ex, ) - dsm_device = dsm_devices[serial] - dsm_api = dsm_device.api - try: - await getattr(dsm_api, f"async_{call.service}")() - except SynologyDSMException as ex: - LOGGER.error( - "%s of DSM with serial %s not possible, because of %s", - call.service, - serial, - ex, - ) - return + return + + +@callback +def async_setup_services(hass: HomeAssistant) -> None: + """Service handler setup.""" for service in SERVICES: - hass.services.async_register(DOMAIN, service, service_handler) + hass.services.async_register(DOMAIN, service, _service_handler) diff --git a/homeassistant/components/tesla_fleet/climate.py b/homeassistant/components/tesla_fleet/climate.py index f752509ee1718..2628a9e134ff7 100644 --- a/homeassistant/components/tesla_fleet/climate.py +++ b/homeassistant/components/tesla_fleet/climate.py @@ -164,12 +164,6 @@ async def async_set_temperature(self, **kwargs: Any) -> None: async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set the climate mode and state.""" - if hvac_mode not in self.hvac_modes: - raise ServiceValidationError( - translation_domain=DOMAIN, - translation_key="invalid_hvac_mode", - translation_placeholders={"hvac_mode": hvac_mode}, - ) if hvac_mode == HVACMode.OFF: await self.async_turn_off() else: diff --git a/homeassistant/components/tesla_fleet/strings.json b/homeassistant/components/tesla_fleet/strings.json index 04ccbd13b44fc..276858bb3ddf9 100644 --- a/homeassistant/components/tesla_fleet/strings.json +++ b/homeassistant/components/tesla_fleet/strings.json @@ -17,7 +17,13 @@ }, "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", @@ -573,9 +579,6 @@ "invalid_cop_temp": { "message": "Cabin overheat protection does not support that temperature." }, - "invalid_hvac_mode": { - "message": "Climate mode {hvac_mode} is not supported." - }, "missing_temperature": { "message": "Temperature is required for this action." }, diff --git a/homeassistant/components/toon/strings.json b/homeassistant/components/toon/strings.json index 3072896653df2..07843de1a0535 100644 --- a/homeassistant/components/toon/strings.json +++ b/homeassistant/components/toon/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "Choose your tenant to authenticate with" + "title": "Choose your tenant to authenticate with", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "agreement": { "title": "Select your agreement", diff --git a/homeassistant/components/tplink/climate.py b/homeassistant/components/tplink/climate.py index 66037d7476e7a..45e4575b4e316 100644 --- a/homeassistant/components/tplink/climate.py +++ b/homeassistant/components/tplink/climate.py @@ -21,11 +21,10 @@ ) from homeassistant.const import PRECISION_TENTHS, UnitOfTemperature from homeassistant.core import HomeAssistant, callback -from homeassistant.exceptions import ServiceValidationError from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from . import TPLinkConfigEntry, legacy_device_id -from .const import DOMAIN, UNIT_MAPPING +from .const import UNIT_MAPPING from .coordinator import TPLinkDataUpdateCoordinator from .entity import ( CoordinatedTPLinkModuleEntity, @@ -161,14 +160,6 @@ async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: await self._thermostat_module.set_state(True) elif hvac_mode is HVACMode.OFF: await self._thermostat_module.set_state(False) - else: - raise ServiceValidationError( - translation_domain=DOMAIN, - translation_key="unsupported_mode", - translation_placeholders={ - "mode": hvac_mode, - }, - ) @async_refresh_after async def async_turn_on(self) -> None: diff --git a/homeassistant/components/tplink/strings.json b/homeassistant/components/tplink/strings.json index 856b4d339a53f..a7f9dfbcb0969 100644 --- a/homeassistant/components/tplink/strings.json +++ b/homeassistant/components/tplink/strings.json @@ -487,9 +487,6 @@ "unexpected_device": { "message": "Unexpected device found at {host}; expected {expected}, found {found}" }, - "unsupported_mode": { - "message": "Tried to set unsupported mode: {mode}" - }, "invalid_alarm_duration": { "message": "Invalid duration {duration} available: 1-{duration_max}s" } diff --git a/homeassistant/components/weheat/strings.json b/homeassistant/components/weheat/strings.json index 93a3fbaad3032..b3c2af7180364 100644 --- a/homeassistant/components/weheat/strings.json +++ b/homeassistant/components/weheat/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "find_devices": { "title": "Select your heat pump" diff --git a/homeassistant/components/whirlpool/climate.py b/homeassistant/components/whirlpool/climate.py index 75967bb81d4ec..0113d3c99d62e 100644 --- a/homeassistant/components/whirlpool/climate.py +++ b/homeassistant/components/whirlpool/climate.py @@ -130,9 +130,7 @@ async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: await self._appliance.set_power_on(False) return - if not (mode := HVAC_MODE_TO_AIRCON_MODE.get(hvac_mode)): - raise ValueError(f"Invalid hvac mode {hvac_mode}") - + mode = HVAC_MODE_TO_AIRCON_MODE[hvac_mode] await self._appliance.set_mode(mode) if not self._appliance.get_power_on(): await self._appliance.set_power_on(True) diff --git a/homeassistant/components/withings/strings.json b/homeassistant/components/withings/strings.json index 14c7bf640e993..4792e3362bd18 100644 --- a/homeassistant/components/withings/strings.json +++ b/homeassistant/components/withings/strings.json @@ -5,7 +5,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/xbox/strings.json b/homeassistant/components/xbox/strings.json index 0d9a12137ceb4..a59e8b9022108 100644 --- a/homeassistant/components/xbox/strings.json +++ b/homeassistant/components/xbox/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } } }, "abort": { diff --git a/homeassistant/components/yale/strings.json b/homeassistant/components/yale/strings.json index 3fb1345a3b036..f5078ac2ece2c 100644 --- a/homeassistant/components/yale/strings.json +++ b/homeassistant/components/yale/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } } }, "abort": { diff --git a/homeassistant/components/yolink/strings.json b/homeassistant/components/yolink/strings.json index d38ea248c3102..0eb9de974693e 100644 --- a/homeassistant/components/yolink/strings.json +++ b/homeassistant/components/yolink/strings.json @@ -2,7 +2,13 @@ "config": { "step": { "pick_implementation": { - "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" + "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]", + "data": { + "implementation": "[%key:common::config_flow::data::implementation%]" + }, + "data_description": { + "implementation": "[%key:common::config_flow::description::implementation%]" + } }, "reauth_confirm": { "title": "[%key:common::config_flow::title::reauth%]", diff --git a/homeassistant/components/zwave_js/climate.py b/homeassistant/components/zwave_js/climate.py index b27dbdad1a025..809d3543fe448 100644 --- a/homeassistant/components/zwave_js/climate.py +++ b/homeassistant/components/zwave_js/climate.py @@ -492,8 +492,6 @@ async def async_set_temperature(self, **kwargs: Any) -> None: async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: """Set new target hvac mode.""" - if (hvac_mode_id := self._hvac_modes.get(hvac_mode)) is None: - raise ValueError(f"Received an invalid hvac mode: {hvac_mode}") if not self._current_mode: # Thermostat(valve) has no support for setting a mode, so we make it a no-op @@ -503,7 +501,7 @@ async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: # can set it again when turning the device back on. if hvac_mode == HVACMode.OFF and self._current_mode.value != ThermostatMode.OFF: self._last_hvac_mode_id_before_off = self._current_mode.value - await self._async_set_value(self._current_mode, hvac_mode_id) + await self._async_set_value(self._current_mode, self._hvac_modes[hvac_mode]) async def async_turn_off(self) -> None: """Turn the entity off.""" diff --git a/homeassistant/strings.json b/homeassistant/strings.json index 6175f587318f4..6e47163e90a57 100644 --- a/homeassistant/strings.json +++ b/homeassistant/strings.json @@ -53,6 +53,7 @@ "email": "Email", "host": "Host", "ip": "IP address", + "implementation": "Application Credentials", "language": "Language", "latitude": "Latitude", "llm_hass_api": "Control Home Assistant", @@ -71,7 +72,8 @@ "verify_ssl": "Verify SSL certificate" }, "description": { - "confirm_setup": "Do you want to start setup?" + "confirm_setup": "Do you want to start setup?", + "implementation": "The credentials you want to use to authenticate." }, "error": { "cannot_connect": "Failed to connect", diff --git a/tests/components/advantage_air/test_climate.py b/tests/components/advantage_air/test_climate.py index 69094a80d30e5..c7fe200e66d9c 100644 --- a/tests/components/advantage_air/test_climate.py +++ b/tests/components/advantage_air/test_climate.py @@ -177,7 +177,7 @@ async def test_climate_myzone_zone( await hass.services.async_call( CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE, - {ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.FAN_ONLY}, + {ATTR_ENTITY_ID: [entity_id], ATTR_HVAC_MODE: HVACMode.HEAT_COOL}, blocking=True, ) mock_update.assert_called_once() diff --git a/tests/components/balboa/test_climate.py b/tests/components/balboa/test_climate.py index 5cd5bc9091afc..4ccbe91fbcde4 100644 --- a/tests/components/balboa/test_climate.py +++ b/tests/components/balboa/test_climate.py @@ -127,9 +127,6 @@ async def test_spa_hvac_action( state = await _patch_spa_heatstate(hass, client, 1) assert state.attributes[ATTR_HVAC_ACTION] == HVACAction.HEATING - state = await _patch_spa_heatstate(hass, client, 2) - assert state.attributes[ATTR_HVAC_ACTION] == HVACAction.IDLE - async def test_spa_preset_modes( hass: HomeAssistant, client: MagicMock, integration: MockConfigEntry diff --git a/tests/components/climate/test_init.py b/tests/components/climate/test_init.py index a81efa1640c9b..06bd9c0c096af 100644 --- a/tests/components/climate/test_init.py +++ b/tests/components/climate/test_init.py @@ -323,22 +323,23 @@ async def test_mode_validation( assert state.attributes.get(ATTR_SWING_MODE) == "off" assert state.attributes.get(ATTR_SWING_HORIZONTAL_MODE) == "off" - await hass.services.async_call( - DOMAIN, - SERVICE_SET_HVAC_MODE, - { - "entity_id": "climate.test", - "hvac_mode": "auto", - }, - blocking=True, - ) - + with pytest.raises( + ServiceValidationError, + match="HVAC mode auto is not valid. Valid HVAC modes are: off, heat", + ) as exc: + await hass.services.async_call( + DOMAIN, + SERVICE_SET_HVAC_MODE, + { + "entity_id": "climate.test", + "hvac_mode": "auto", + }, + blocking=True, + ) assert ( - "MockClimateEntity sets the hvac_mode auto which is not valid " - "for this entity with modes: off, heat. This will stop working " - "in 2025.4 and raise an error instead. " - "Please" in caplog.text + str(exc.value) == "HVAC mode auto is not valid. Valid HVAC modes are: off, heat" ) + assert exc.value.translation_key == "not_valid_hvac_mode" with pytest.raises( ServiceValidationError, diff --git a/tests/components/deconz/test_climate.py b/tests/components/deconz/test_climate.py index 723ff12ad37da..9f6ee5afec1ff 100644 --- a/tests/components/deconz/test_climate.py +++ b/tests/components/deconz/test_climate.py @@ -136,7 +136,7 @@ async def test_simple_climate_device( # Service set HVAC mode to unsupported value - with pytest.raises(ValueError): + with pytest.raises(ServiceValidationError): await hass.services.async_call( CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE, @@ -239,7 +239,7 @@ async def test_climate_device_without_cooling_support( # Service set HVAC mode to unsupported value - with pytest.raises(ValueError): + with pytest.raises(ServiceValidationError): await hass.services.async_call( CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE, diff --git a/tests/components/freedompro/test_climate.py b/tests/components/freedompro/test_climate.py index 9a8f0c5030cdb..d6e97d62ac990 100644 --- a/tests/components/freedompro/test_climate.py +++ b/tests/components/freedompro/test_climate.py @@ -19,6 +19,7 @@ ) from homeassistant.const import ATTR_ENTITY_ID from homeassistant.core import HomeAssistant +from homeassistant.exceptions import ServiceValidationError from homeassistant.helpers import device_registry as dr, entity_registry as er from homeassistant.util.dt import utcnow @@ -135,7 +136,7 @@ async def test_climate_set_unsupported_hvac_mode( assert entry assert entry.unique_id == uid - with pytest.raises(ValueError): + with pytest.raises(ServiceValidationError): await hass.services.async_call( CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE, diff --git a/tests/components/generic_thermostat/test_climate.py b/tests/components/generic_thermostat/test_climate.py index 7d606bee93aee..d082308236a24 100644 --- a/tests/components/generic_thermostat/test_climate.py +++ b/tests/components/generic_thermostat/test_climate.py @@ -896,7 +896,7 @@ async def test_heating_cooling_switch_toggles_when_outside_min_cycle_duration( "expected_triggered_service_call", ), [ - (True, HVACMode.COOL, False, 30, 25, HVACMode.HEAT, SERVICE_TURN_ON), + (True, HVACMode.COOL, False, 30, 25, HVACMode.COOL, SERVICE_TURN_ON), (True, HVACMode.COOL, True, 25, 30, HVACMode.OFF, SERVICE_TURN_OFF), (False, HVACMode.HEAT, False, 25, 30, HVACMode.HEAT, SERVICE_TURN_ON), (False, HVACMode.HEAT, True, 30, 25, HVACMode.OFF, SERVICE_TURN_OFF), diff --git a/tests/components/homematicip_cloud/test_climate.py b/tests/components/homematicip_cloud/test_climate.py index 434f26e0e6f53..67dbb55bb1218 100644 --- a/tests/components/homematicip_cloud/test_climate.py +++ b/tests/components/homematicip_cloud/test_climate.py @@ -205,13 +205,14 @@ async def test_hmip_heating_group_heat( ha_state = hass.states.get(entity_id) assert ha_state.state == HVACMode.AUTO - # hvac mode "dry" is not available. expect a valueerror. - await hass.services.async_call( - "climate", - "set_hvac_mode", - {"entity_id": entity_id, "hvac_mode": "dry"}, - blocking=True, - ) + # hvac mode "dry" is not available. + with pytest.raises(ServiceValidationError): + await hass.services.async_call( + "climate", + "set_hvac_mode", + {"entity_id": entity_id, "hvac_mode": "dry"}, + blocking=True, + ) assert len(hmip_device.mock_calls) == service_call_counter + 24 # Only fire event from last async_manipulate_test_data available. diff --git a/tests/components/maxcube/test_maxcube_climate.py b/tests/components/maxcube/test_maxcube_climate.py index 8b56ee6a6deb4..40603344325a3 100644 --- a/tests/components/maxcube/test_maxcube_climate.py +++ b/tests/components/maxcube/test_maxcube_climate.py @@ -179,7 +179,7 @@ async def test_thermostat_set_invalid_hvac_mode( hass: HomeAssistant, cube: MaxCube, thermostat: MaxThermostat ) -> None: """Set hvac mode to heat.""" - with pytest.raises(ValueError): + with pytest.raises(ServiceValidationError): await hass.services.async_call( CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE, diff --git a/tests/components/mqtt/test_climate.py b/tests/components/mqtt/test_climate.py index fd0b95f2b13be..568fb7ea39dac 100644 --- a/tests/components/mqtt/test_climate.py +++ b/tests/components/mqtt/test_climate.py @@ -405,13 +405,6 @@ async def test_turn_on_and_off_optimistic_with_power_command( "heat", None, ), - ( - help_custom_config( - climate.DOMAIN, DEFAULT_CONFIG, ({"modes": ["off", "dry"]},) - ), - None, - "off", - ), ( help_custom_config( climate.DOMAIN, DEFAULT_CONFIG, ({"modes": ["off", "cool"]},) diff --git a/tests/components/nest/test_climate.py b/tests/components/nest/test_climate.py index fe148c2529d07..76a9a52f2de24 100644 --- a/tests/components/nest/test_climate.py +++ b/tests/components/nest/test_climate.py @@ -520,7 +520,7 @@ async def test_thermostat_invalid_hvac_mode( assert thermostat.state == HVACMode.OFF assert thermostat.attributes[ATTR_HVAC_ACTION] == HVACAction.OFF - with pytest.raises(ValueError): + with pytest.raises(ServiceValidationError): await common.async_set_hvac_mode(hass, HVACMode.DRY) assert thermostat.state == HVACMode.OFF @@ -1396,7 +1396,7 @@ async def test_thermostat_unexpected_hvac_status( assert ATTR_FAN_MODE not in thermostat.attributes assert ATTR_FAN_MODES not in thermostat.attributes - with pytest.raises(ValueError): + with pytest.raises(ServiceValidationError): await common.async_set_hvac_mode(hass, HVACMode.DRY) assert thermostat.state == HVACMode.OFF diff --git a/tests/components/nibe_heatpump/test_climate.py b/tests/components/nibe_heatpump/test_climate.py index 91245503eb3f6..a9620b5ddb31d 100644 --- a/tests/components/nibe_heatpump/test_climate.py +++ b/tests/components/nibe_heatpump/test_climate.py @@ -297,7 +297,6 @@ async def test_set_temperature_unsupported_cooling( [ (Model.S320, "s1", "climate.climate_system_s1"), (Model.F1155, "s2", "climate.climate_system_s2"), - (Model.F730, "s1", "climate.climate_system_s1"), ], ) @pytest.mark.usefixtures("entity_registry_enabled_by_default") diff --git a/tests/components/plex/test_services.py b/tests/components/plex/test_services.py index c84322e1c14d9..8a6dceb1e4707 100644 --- a/tests/components/plex/test_services.py +++ b/tests/components/plex/test_services.py @@ -17,7 +17,6 @@ PLEX_SERVER_CONFIG, PLEX_URI_SCHEME, SERVICE_REFRESH_LIBRARY, - SERVICE_SCAN_CLIENTS, ) from homeassistant.components.plex.services import process_plex_payload from homeassistant.const import CONF_URL @@ -107,15 +106,6 @@ async def test_refresh_library( assert refresh.call_count == 1 -async def test_scan_clients(hass: HomeAssistant, mock_plex_server) -> None: - """Test scan_for_clients service call.""" - await hass.services.async_call( - DOMAIN, - SERVICE_SCAN_CLIENTS, - blocking=True, - ) - - async def test_lookup_media_for_other_integrations( hass: HomeAssistant, entry, diff --git a/tests/components/plugwise/test_climate.py b/tests/components/plugwise/test_climate.py index 7a481285be0e3..3787cbf715009 100644 --- a/tests/components/plugwise/test_climate.py +++ b/tests/components/plugwise/test_climate.py @@ -242,7 +242,10 @@ async def test_adam_climate_entity_climate_changes( "c50f167537524366a5af7aa3942feb1e", HVACMode.OFF ) - with pytest.raises(ServiceValidationError, match="valid modes are"): + with pytest.raises( + ServiceValidationError, + match="HVAC mode dry is not valid. Valid HVAC modes are: auto, heat", + ): await hass.services.async_call( CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE, diff --git a/tests/components/tesla_fleet/test_climate.py b/tests/components/tesla_fleet/test_climate.py index fae79c795c212..6f700f7e9396a 100644 --- a/tests/components/tesla_fleet/test_climate.py +++ b/tests/components/tesla_fleet/test_climate.py @@ -401,7 +401,8 @@ async def test_climate_noscope( entity_id = "climate.test_climate" with pytest.raises( - ServiceValidationError, match="Climate mode off is not supported" + ServiceValidationError, + match="HVAC mode off is not valid. Valid HVAC modes are: heat_cool", ): await hass.services.async_call( CLIMATE_DOMAIN, diff --git a/tests/components/tplink/test_climate.py b/tests/components/tplink/test_climate.py index adcca24886b94..6d5b498b922d8 100644 --- a/tests/components/tplink/test_climate.py +++ b/tests/components/tplink/test_climate.py @@ -161,7 +161,7 @@ async def test_set_hvac_mode( ) therm_module.set_state.assert_called_with(True) - msg = "Tried to set unsupported mode: dry" + msg = "HVAC mode dry is not valid. Valid HVAC modes are: heat, off" with pytest.raises(ServiceValidationError, match=msg): await hass.services.async_call( CLIMATE_DOMAIN, diff --git a/tests/components/whirlpool/test_climate.py b/tests/components/whirlpool/test_climate.py index 2c36c713546c9..6157da04256aa 100644 --- a/tests/components/whirlpool/test_climate.py +++ b/tests/components/whirlpool/test_climate.py @@ -300,7 +300,7 @@ async def test_service_hvac_mode_turn_on( ( SERVICE_SET_HVAC_MODE, {ATTR_HVAC_MODE: HVACMode.DRY}, - ValueError, + ServiceValidationError, ), ( SERVICE_SET_FAN_MODE, diff --git a/tests/components/zha/test_climate.py b/tests/components/zha/test_climate.py index 7b94db51d0411..3425c1eb2b65b 100644 --- a/tests/components/zha/test_climate.py +++ b/tests/components/zha/test_climate.py @@ -522,20 +522,28 @@ async def test_set_hvac_mode( state = hass.states.get(entity_id) assert state.state == HVACMode.OFF - await hass.services.async_call( - CLIMATE_DOMAIN, - SERVICE_SET_HVAC_MODE, - {ATTR_ENTITY_ID: entity_id, ATTR_HVAC_MODE: hvac_mode}, - blocking=True, - ) - state = hass.states.get(entity_id) if sys_mode is not None: + await hass.services.async_call( + CLIMATE_DOMAIN, + SERVICE_SET_HVAC_MODE, + {ATTR_ENTITY_ID: entity_id, ATTR_HVAC_MODE: hvac_mode}, + blocking=True, + ) + state = hass.states.get(entity_id) assert state.state == hvac_mode assert thrm_cluster.write_attributes.call_count == 1 assert thrm_cluster.write_attributes.call_args[0][0] == { "system_mode": sys_mode } else: + with pytest.raises(ServiceValidationError): + await hass.services.async_call( + CLIMATE_DOMAIN, + SERVICE_SET_HVAC_MODE, + {ATTR_ENTITY_ID: entity_id, ATTR_HVAC_MODE: hvac_mode}, + blocking=True, + ) + state = hass.states.get(entity_id) assert thrm_cluster.write_attributes.call_count == 0 assert state.state == HVACMode.OFF diff --git a/tests/components/zwave_js/test_climate.py b/tests/components/zwave_js/test_climate.py index f312284d89725..a356613aa7a87 100644 --- a/tests/components/zwave_js/test_climate.py +++ b/tests/components/zwave_js/test_climate.py @@ -264,7 +264,7 @@ async def test_thermostat_v2( client.async_send_command.reset_mock() # Test setting invalid hvac mode - with pytest.raises(ValueError): + with pytest.raises(ServiceValidationError): await hass.services.async_call( CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE, @@ -574,7 +574,7 @@ async def test_setpoint_thermostat( ) # Test setting illegal mode raises an error - with pytest.raises(ValueError): + with pytest.raises(ServiceValidationError): await hass.services.async_call( CLIMATE_DOMAIN, SERVICE_SET_HVAC_MODE,