From 5783b3a576af2f5dc72e5575e11d87f6a7e00568 Mon Sep 17 00:00:00 2001 From: Thomas D <11554546+thomasddn@users.noreply.github.com> Date: Wed, 22 Oct 2025 10:57:15 +0200 Subject: [PATCH] Add engine start/stop buttons to Volvo integration (#154610) --- homeassistant/components/volvo/button.py | 14 ++- homeassistant/components/volvo/icons.json | 6 ++ homeassistant/components/volvo/strings.json | 6 ++ .../volvo/snapshots/test_button.ambr | 96 +++++++++++++++++++ 4 files changed, 121 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/volvo/button.py b/homeassistant/components/volvo/button.py index be290f47dab..b1f0b067d7b 100644 --- a/homeassistant/components/volvo/button.py +++ b/homeassistant/components/volvo/button.py @@ -24,6 +24,7 @@ class VolvoButtonDescription(VolvoEntityDescription, ButtonEntityDescription): api_command: str required_command_key: str + data: dict[str, int] | None = None _DESCRIPTIONS: tuple[VolvoButtonDescription, ...] = ( @@ -37,6 +38,17 @@ _DESCRIPTIONS: tuple[VolvoButtonDescription, ...] = ( api_command="climatization-stop", required_command_key="CLIMATIZATION_STOP", ), + VolvoButtonDescription( + key="engine_start", + api_command="engine-start", + required_command_key="ENGINE_START", + data={"runtimeMinutes": 15}, + ), + VolvoButtonDescription( + key="engine_stop", + api_command="engine-stop", + required_command_key="ENGINE_STOP", + ), VolvoButtonDescription( key="flash", api_command="flash", @@ -84,7 +96,7 @@ class VolvoButton(VolvoBaseEntity, ButtonEntity): try: result = await self.entry.runtime_data.context.api.async_execute_command( - self.entity_description.api_command + self.entity_description.api_command, self.entity_description.data ) except VolvoApiException as ex: _LOGGER.debug("Command '%s' error", command) diff --git a/homeassistant/components/volvo/icons.json b/homeassistant/components/volvo/icons.json index 72f766553c6..e898f3deed5 100644 --- a/homeassistant/components/volvo/icons.json +++ b/homeassistant/components/volvo/icons.json @@ -267,6 +267,12 @@ "climatization_stop": { "default": "mdi:air-conditioner" }, + "engine_start": { + "default": "mdi:engine" + }, + "engine_stop": { + "default": "mdi:engine-off" + }, "flash": { "default": "mdi:alarm-light-outline" }, diff --git a/homeassistant/components/volvo/strings.json b/homeassistant/components/volvo/strings.json index a518fc92514..1a1c4499c30 100644 --- a/homeassistant/components/volvo/strings.json +++ b/homeassistant/components/volvo/strings.json @@ -194,6 +194,12 @@ "climatization_stop": { "name": "Stop climatization" }, + "engine_start": { + "name": "Start engine" + }, + "engine_stop": { + "name": "Stop engine" + }, "flash": { "name": "Flash" }, diff --git a/tests/components/volvo/snapshots/test_button.ambr b/tests/components/volvo/snapshots/test_button.ambr index 38e3564600d..d67fc12f2ce 100644 --- a/tests/components/volvo/snapshots/test_button.ambr +++ b/tests/components/volvo/snapshots/test_button.ambr @@ -911,6 +911,54 @@ 'state': 'unknown', }) # --- +# name: test_button[xc90_petrol_2019][button.volvo_xc90_start_engine-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'button', + 'entity_category': None, + 'entity_id': 'button.volvo_xc90_start_engine', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Start engine', + 'platform': 'volvo', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'engine_start', + 'unique_id': 'yv1abcdefg1234567_engine_start', + 'unit_of_measurement': None, + }) +# --- +# name: test_button[xc90_petrol_2019][button.volvo_xc90_start_engine-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Volvo XC90 Start engine', + }), + 'context': , + 'entity_id': 'button.volvo_xc90_start_engine', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_button[xc90_petrol_2019][button.volvo_xc90_stop_climatization-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -959,3 +1007,51 @@ 'state': 'unknown', }) # --- +# name: test_button[xc90_petrol_2019][button.volvo_xc90_stop_engine-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'button', + 'entity_category': None, + 'entity_id': 'button.volvo_xc90_stop_engine', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Stop engine', + 'platform': 'volvo', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'engine_stop', + 'unique_id': 'yv1abcdefg1234567_engine_stop', + 'unit_of_measurement': None, + }) +# --- +# name: test_button[xc90_petrol_2019][button.volvo_xc90_stop_engine-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'Volvo XC90 Stop engine', + }), + 'context': , + 'entity_id': 'button.volvo_xc90_stop_engine', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# ---