From 1ebde65f03cbde6348d99c1c12cb3432c4c208e1 Mon Sep 17 00:00:00 2001 From: Sebastiaan Speck <12570668+sebastiaanspeck@users.noreply.github.com> Date: Tue, 3 Feb 2026 15:18:55 +0100 Subject: [PATCH] Add sound horn and flash lights buttons to Renault (#161976) Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> --- homeassistant/components/renault/button.py | 16 + homeassistant/components/renault/icons.json | 6 + .../components/renault/renault_vehicle.py | 10 + homeassistant/components/renault/strings.json | 6 + .../renault/snapshots/test_button.ambr | 882 ++++++++++++++++++ tests/components/renault/test_button.py | 46 + 6 files changed, 966 insertions(+) diff --git a/homeassistant/components/renault/button.py b/homeassistant/components/renault/button.py index 75140867a3f..adfaf225bf6 100644 --- a/homeassistant/components/renault/button.py +++ b/homeassistant/components/renault/button.py @@ -79,4 +79,20 @@ BUTTON_TYPES: tuple[RenaultButtonEntityDescription, ...] = ( ), translation_key="stop_charge", ), + RenaultButtonEntityDescription( + async_press=lambda x: x.vehicle.sound_horn(), + key="sound_horn", + is_supported=lambda vehicle: ( + vehicle.details.supports_endpoint("actions/horn-start") + ), + translation_key="sound_horn", + ), + RenaultButtonEntityDescription( + async_press=lambda x: x.vehicle.flash_lights(), + key="flash_lights", + is_supported=lambda vehicle: ( + vehicle.details.supports_endpoint("actions/lights-start") + ), + translation_key="flash_lights", + ), ) diff --git a/homeassistant/components/renault/icons.json b/homeassistant/components/renault/icons.json index 7ab8cc75b33..2302f67b693 100644 --- a/homeassistant/components/renault/icons.json +++ b/homeassistant/components/renault/icons.json @@ -9,6 +9,12 @@ } }, "button": { + "flash_lights": { + "default": "mdi:lightbulb-on" + }, + "sound_horn": { + "default": "mdi:bugle" + }, "start_air_conditioner": { "default": "mdi:air-conditioner" }, diff --git a/homeassistant/components/renault/renault_vehicle.py b/homeassistant/components/renault/renault_vehicle.py index 6ae9693887e..c7eddeef881 100644 --- a/homeassistant/components/renault/renault_vehicle.py +++ b/homeassistant/components/renault/renault_vehicle.py @@ -221,6 +221,16 @@ class RenaultVehicleProxy: """Set vehicle charge schedules.""" return await self._vehicle.set_charge_schedules(schedules) + @with_error_wrapping + async def sound_horn(self) -> None: + """Start vehicle horn.""" + await self._vehicle.start_horn() + + @with_error_wrapping + async def flash_lights(self) -> None: + """Start vehicle lights.""" + await self._vehicle.start_lights() + COORDINATORS: tuple[RenaultCoordinatorDescription, ...] = ( RenaultCoordinatorDescription( diff --git a/homeassistant/components/renault/strings.json b/homeassistant/components/renault/strings.json index 1685c1b1cae..7bccfe641c0 100644 --- a/homeassistant/components/renault/strings.json +++ b/homeassistant/components/renault/strings.json @@ -73,6 +73,12 @@ } }, "button": { + "flash_lights": { + "name": "Flash lights" + }, + "sound_horn": { + "name": "Sound horn" + }, "start_air_conditioner": { "name": "Start air conditioner" }, diff --git a/tests/components/renault/snapshots/test_button.ambr b/tests/components/renault/snapshots/test_button.ambr index 177b5f2ceb5..4218c4339b5 100644 --- a/tests/components/renault/snapshots/test_button.ambr +++ b/tests/components/renault/snapshots/test_button.ambr @@ -1,4 +1,102 @@ # serializer version: 1 +# name: test_button_access_denied[zoe_40][button.reg_zoe_40_flash_lights-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.reg_zoe_40_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1zoe40vin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_button_access_denied[zoe_40][button.reg_zoe_40_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_button_access_denied[zoe_40][button.reg_zoe_40_sound_horn-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.reg_zoe_40_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1zoe40vin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_button_access_denied[zoe_40][button.reg_zoe_40_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_button_access_denied[zoe_40][button.reg_zoe_40_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -146,6 +244,104 @@ 'state': 'unknown', }) # --- +# name: test_button_empty[zoe_40][button.reg_zoe_40_flash_lights-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.reg_zoe_40_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1zoe40vin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_button_empty[zoe_40][button.reg_zoe_40_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_button_empty[zoe_40][button.reg_zoe_40_sound_horn-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.reg_zoe_40_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1zoe40vin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_button_empty[zoe_40][button.reg_zoe_40_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_button_empty[zoe_40][button.reg_zoe_40_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -293,6 +489,104 @@ 'state': 'unknown', }) # --- +# name: test_button_errors[zoe_40][button.reg_zoe_40_flash_lights-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.reg_zoe_40_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1zoe40vin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_button_errors[zoe_40][button.reg_zoe_40_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_button_errors[zoe_40][button.reg_zoe_40_sound_horn-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.reg_zoe_40_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1zoe40vin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_button_errors[zoe_40][button.reg_zoe_40_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_button_errors[zoe_40][button.reg_zoe_40_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -440,6 +734,104 @@ 'state': 'unknown', }) # --- +# name: test_button_not_supported[zoe_40][button.reg_zoe_40_flash_lights-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.reg_zoe_40_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1zoe40vin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_button_not_supported[zoe_40][button.reg_zoe_40_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_button_not_supported[zoe_40][button.reg_zoe_40_sound_horn-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.reg_zoe_40_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1zoe40vin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_button_not_supported[zoe_40][button.reg_zoe_40_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_button_not_supported[zoe_40][button.reg_zoe_40_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -587,6 +979,104 @@ 'state': 'unknown', }) # --- +# name: test_buttons[captur_fuel][button.reg_captur_fuel_flash_lights-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.reg_captur_fuel_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1capturfuelvin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[captur_fuel][button.reg_captur_fuel_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-CAPTUR-FUEL Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_captur_fuel_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_buttons[captur_fuel][button.reg_captur_fuel_sound_horn-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.reg_captur_fuel_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1capturfuelvin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[captur_fuel][button.reg_captur_fuel_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-CAPTUR-FUEL Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_captur_fuel_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_buttons[captur_fuel][button.reg_captur_fuel_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -636,6 +1126,104 @@ 'state': 'unknown', }) # --- +# name: test_buttons[captur_phev][button.reg_captur_phev_flash_lights-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.reg_captur_phev_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1capturphevvin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[captur_phev][button.reg_captur_phev_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-CAPTUR_PHEV Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_captur_phev_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_buttons[captur_phev][button.reg_captur_phev_sound_horn-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.reg_captur_phev_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1capturphevvin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[captur_phev][button.reg_captur_phev_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-CAPTUR_PHEV Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_captur_phev_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_buttons[captur_phev][button.reg_captur_phev_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -783,6 +1371,104 @@ 'state': 'unknown', }) # --- +# name: test_buttons[twingo_3_electric][button.reg_twingo_iii_flash_lights-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.reg_twingo_iii_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1twingoiiivin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[twingo_3_electric][button.reg_twingo_iii_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-TWINGO-III Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_twingo_iii_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_buttons[twingo_3_electric][button.reg_twingo_iii_sound_horn-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.reg_twingo_iii_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1twingoiiivin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[twingo_3_electric][button.reg_twingo_iii_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-TWINGO-III Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_twingo_iii_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_buttons[twingo_3_electric][button.reg_twingo_iii_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -930,6 +1616,104 @@ 'state': 'unknown', }) # --- +# name: test_buttons[zoe_40][button.reg_zoe_40_flash_lights-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.reg_zoe_40_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1zoe40vin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[zoe_40][button.reg_zoe_40_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_buttons[zoe_40][button.reg_zoe_40_sound_horn-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.reg_zoe_40_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1zoe40vin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[zoe_40][button.reg_zoe_40_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-40 Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_zoe_40_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_buttons[zoe_40][button.reg_zoe_40_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -1077,6 +1861,104 @@ 'state': 'unknown', }) # --- +# name: test_buttons[zoe_50][button.reg_zoe_50_flash_lights-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.reg_zoe_50_flash_lights', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Flash lights', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Flash lights', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'flash_lights', + 'unique_id': 'vf1zoe50vin_flash_lights', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[zoe_50][button.reg_zoe_50_flash_lights-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-50 Flash lights', + }), + 'context': , + 'entity_id': 'button.reg_zoe_50_flash_lights', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- +# name: test_buttons[zoe_50][button.reg_zoe_50_sound_horn-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.reg_zoe_50_sound_horn', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Sound horn', + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Sound horn', + 'platform': 'renault', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'sound_horn', + 'unique_id': 'vf1zoe50vin_sound_horn', + 'unit_of_measurement': None, + }) +# --- +# name: test_buttons[zoe_50][button.reg_zoe_50_sound_horn-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'REG-ZOE-50 Sound horn', + }), + 'context': , + 'entity_id': 'button.reg_zoe_50_sound_horn', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'unknown', + }) +# --- # name: test_buttons[zoe_50][button.reg_zoe_50_start_air_conditioner-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ diff --git a/tests/components/renault/test_button.py b/tests/components/renault/test_button.py index e621f1bce23..f8fdce7e24e 100644 --- a/tests/components/renault/test_button.py +++ b/tests/components/renault/test_button.py @@ -182,3 +182,49 @@ async def test_button_start_air_conditioner( ) assert len(mock_action.mock_calls) == 1 assert mock_action.mock_calls[0][1] == (21, None) + + +@pytest.mark.usefixtures("fixtures_with_data") +@pytest.mark.parametrize("vehicle_type", ["zoe_40"], indirect=True) +async def test_button_sound_horn( + hass: HomeAssistant, config_entry: ConfigEntry +) -> None: + """Test that button invokes renault_api with correct data.""" + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + data = { + ATTR_ENTITY_ID: "button.reg_zoe_40_sound_horn", + } + + with patch( + "renault_api.renault_vehicle.RenaultVehicle.start_horn", + ) as mock_action: + await hass.services.async_call( + BUTTON_DOMAIN, SERVICE_PRESS, service_data=data, blocking=True + ) + assert len(mock_action.mock_calls) == 1 + assert mock_action.mock_calls[0][1] == () + + +@pytest.mark.usefixtures("fixtures_with_data") +@pytest.mark.parametrize("vehicle_type", ["zoe_40"], indirect=True) +async def test_button_flash_lights( + hass: HomeAssistant, config_entry: ConfigEntry +) -> None: + """Test that button invokes renault_api with correct data.""" + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + data = { + ATTR_ENTITY_ID: "button.reg_zoe_40_flash_lights", + } + + with patch( + "renault_api.renault_vehicle.RenaultVehicle.start_lights", + ) as mock_action: + await hass.services.async_call( + BUTTON_DOMAIN, SERVICE_PRESS, service_data=data, blocking=True + ) + assert len(mock_action.mock_calls) == 1 + assert mock_action.mock_calls[0][1] == ()