From 73d0124c98d01850e4174b90d791629e743458fa Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 3 Apr 2023 18:20:11 +0200 Subject: [PATCH] Use entity name translations in Renault (#90697) --- .../components/renault/binary_sensor.py | 12 +- homeassistant/components/renault/button.py | 6 +- .../components/renault/device_tracker.py | 2 +- homeassistant/components/renault/select.py | 1 - homeassistant/components/renault/sensor.py | 36 +++--- homeassistant/components/renault/strings.json | 113 ++++++++++++++++-- tests/components/renault/__init__.py | 2 +- tests/components/renault/const.py | 22 ++-- tests/components/renault/test_sensor.py | 1 + 9 files changed, 146 insertions(+), 49 deletions(-) diff --git a/homeassistant/components/renault/binary_sensor.py b/homeassistant/components/renault/binary_sensor.py index f309a8f188a..c0db562bd8c 100644 --- a/homeassistant/components/renault/binary_sensor.py +++ b/homeassistant/components/renault/binary_sensor.py @@ -85,43 +85,43 @@ BINARY_SENSOR_TYPES: tuple[RenaultBinarySensorEntityDescription, ...] = tuple( key="plugged_in", coordinator="battery", device_class=BinarySensorDeviceClass.PLUG, - name="Plugged in", on_key="plugStatus", on_value=PlugState.PLUGGED.value, + translation_key="plugged_in", ), RenaultBinarySensorEntityDescription( key="charging", coordinator="battery", device_class=BinarySensorDeviceClass.BATTERY_CHARGING, - name="Charging", on_key="chargingStatus", on_value=ChargeState.CHARGE_IN_PROGRESS.value, + translation_key="charging", ), RenaultBinarySensorEntityDescription( key="hvac_status", coordinator="hvac_status", icon_fn=lambda e: "mdi:fan" if e.is_on else "mdi:fan-off", - name="HVAC", on_key="hvacStatus", on_value="on", + translation_key="hvac_status", ), RenaultBinarySensorEntityDescription( key="lock_status", coordinator="lock_status", # lock: on means open (unlocked), off means closed (locked) device_class=BinarySensorDeviceClass.LOCK, - name="Lock", on_key="lockStatus", on_value="unlocked", + translation_key="lock_status", ), RenaultBinarySensorEntityDescription( key="hatch_status", coordinator="lock_status", # On means open, Off means closed device_class=BinarySensorDeviceClass.DOOR, - name="Hatch", on_key="hatchStatus", on_value="open", + translation_key="hatch_status", ), ] + [ @@ -130,9 +130,9 @@ BINARY_SENSOR_TYPES: tuple[RenaultBinarySensorEntityDescription, ...] = tuple( coordinator="lock_status", # On means open, Off means closed device_class=BinarySensorDeviceClass.DOOR, - name=f"{door.capitalize()} door", on_key=f"doorStatus{door.replace(' ','')}", on_value="open", + translation_key=f"{door.lower().replace(' ','_')}_door_status", ) for door in ("Rear Left", "Rear Right", "Driver", "Passenger") ], diff --git a/homeassistant/components/renault/button.py b/homeassistant/components/renault/button.py index 67dfe8fc971..01881d6947a 100644 --- a/homeassistant/components/renault/button.py +++ b/homeassistant/components/renault/button.py @@ -62,20 +62,20 @@ BUTTON_TYPES: tuple[RenaultButtonEntityDescription, ...] = ( async_press=lambda x: x.vehicle.set_ac_start(21, None), key="start_air_conditioner", icon="mdi:air-conditioner", - name="Start air conditioner", + translation_key="start_air_conditioner", ), RenaultButtonEntityDescription( async_press=lambda x: x.vehicle.set_charge_start(), key="start_charge", icon="mdi:ev-station", - name="Start charge", requires_electricity=True, + translation_key="start_charge", ), RenaultButtonEntityDescription( async_press=lambda x: x.vehicle.set_charge_stop(), key="stop_charge", icon="mdi:ev-station", - name="Stop charge", requires_electricity=True, + translation_key="stop_charge", ), ) diff --git a/homeassistant/components/renault/device_tracker.py b/homeassistant/components/renault/device_tracker.py index 87ca3c9eb5f..e646a9648e3 100644 --- a/homeassistant/components/renault/device_tracker.py +++ b/homeassistant/components/renault/device_tracker.py @@ -55,6 +55,6 @@ DEVICE_TRACKER_TYPES: tuple[RenaultDataEntityDescription, ...] = ( key="location", coordinator="location", icon="mdi:car", - name="Location", + translation_key="location", ), ) diff --git a/homeassistant/components/renault/select.py b/homeassistant/components/renault/select.py index 8fef7d9aee0..02cf6d5c6b0 100644 --- a/homeassistant/components/renault/select.py +++ b/homeassistant/components/renault/select.py @@ -92,7 +92,6 @@ SENSOR_TYPES: tuple[RenaultSelectEntityDescription, ...] = ( data_key="chargeMode", translation_key="charge_mode", icon_lambda=_get_charge_mode_icon, - name="Charge mode", options=["always", "always_charging", "schedule_mode"], ), ) diff --git a/homeassistant/components/renault/sensor.py b/homeassistant/components/renault/sensor.py index d75dc55aa21..1433d1e74f5 100644 --- a/homeassistant/components/renault/sensor.py +++ b/homeassistant/components/renault/sensor.py @@ -163,9 +163,9 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="batteryLevel", device_class=SensorDeviceClass.BATTERY, entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], - name="Battery level", native_unit_of_measurement=PERCENTAGE, state_class=SensorStateClass.MEASUREMENT, + translation_key="battery_level", ), RenaultSensorEntityDescription( key="charge_state", @@ -175,7 +175,6 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( device_class=SensorDeviceClass.ENUM, entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], icon_lambda=_get_charge_state_icon, - name="Charge state", options=[ "not_in_charge", "waiting_for_a_planned_charge", @@ -194,9 +193,9 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="chargingRemainingTime", entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], icon="mdi:timer", - name="Charging remaining time", native_unit_of_measurement=UnitOfTime.MINUTES, state_class=SensorStateClass.MEASUREMENT, + translation_key="charging_remaining_time", ), RenaultSensorEntityDescription( # For vehicles that DO NOT report charging power in watts, this seems to @@ -208,9 +207,9 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="chargingInstantaneousPower", device_class=SensorDeviceClass.POWER, entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], - name="Admissible charging power", native_unit_of_measurement=UnitOfPower.KILO_WATT, state_class=SensorStateClass.MEASUREMENT, + translation_key="admissible_charging_power", ), RenaultSensorEntityDescription( # For vehicles that DO report charging power in watts, this is the power @@ -221,10 +220,10 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="chargingInstantaneousPower", device_class=SensorDeviceClass.POWER, entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], - name="Charging power", native_unit_of_measurement=UnitOfPower.KILO_WATT, state_class=SensorStateClass.MEASUREMENT, value_lambda=_get_charging_power, + translation_key="charging_power", ), RenaultSensorEntityDescription( key="plug_state", @@ -234,7 +233,6 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( device_class=SensorDeviceClass.ENUM, entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], icon_lambda=_get_plug_state_icon, - name="Plug state", options=["unplugged", "plugged", "plug_error", "plug_unknown"], value_lambda=_get_plug_state_formatted, ), @@ -245,9 +243,9 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( device_class=SensorDeviceClass.DISTANCE, entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], icon="mdi:ev-station", - name="Battery autonomy", native_unit_of_measurement=UnitOfLength.KILOMETERS, state_class=SensorStateClass.MEASUREMENT, + translation_key="battery_autonomy", ), RenaultSensorEntityDescription( key="battery_available_energy", @@ -255,9 +253,9 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="batteryAvailableEnergy", entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], device_class=SensorDeviceClass.ENERGY, - name="Battery available energy", native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR, state_class=SensorStateClass.TOTAL, + translation_key="battery_available_energy", ), RenaultSensorEntityDescription( key="battery_temperature", @@ -265,9 +263,9 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="batteryTemperature", device_class=SensorDeviceClass.TEMPERATURE, entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], - name="Battery temperature", native_unit_of_measurement=UnitOfTemperature.CELSIUS, state_class=SensorStateClass.MEASUREMENT, + translation_key="battery_temperature", ), RenaultSensorEntityDescription( key="battery_last_activity", @@ -276,8 +274,8 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="timestamp", entity_class=RenaultSensor[KamereonVehicleBatteryStatusData], entity_registry_enabled_default=False, - name="Battery last activity", value_lambda=_get_utc_value, + translation_key="battery_last_activity", ), RenaultSensorEntityDescription( key="mileage", @@ -286,10 +284,10 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( device_class=SensorDeviceClass.DISTANCE, entity_class=RenaultSensor[KamereonVehicleCockpitData], icon="mdi:sign-direction", - name="Mileage", native_unit_of_measurement=UnitOfLength.KILOMETERS, state_class=SensorStateClass.TOTAL_INCREASING, value_lambda=_get_rounded_value, + translation_key="mileage", ), RenaultSensorEntityDescription( key="fuel_autonomy", @@ -298,11 +296,11 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( device_class=SensorDeviceClass.DISTANCE, entity_class=RenaultSensor[KamereonVehicleCockpitData], icon="mdi:gas-station", - name="Fuel autonomy", native_unit_of_measurement=UnitOfLength.KILOMETERS, state_class=SensorStateClass.MEASUREMENT, requires_fuel=True, value_lambda=_get_rounded_value, + translation_key="fuel_autonomy", ), RenaultSensorEntityDescription( key="fuel_quantity", @@ -311,11 +309,11 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( device_class=SensorDeviceClass.VOLUME, entity_class=RenaultSensor[KamereonVehicleCockpitData], icon="mdi:fuel", - name="Fuel quantity", native_unit_of_measurement=UnitOfVolume.LITERS, state_class=SensorStateClass.TOTAL, requires_fuel=True, value_lambda=_get_rounded_value, + translation_key="fuel_quantity", ), RenaultSensorEntityDescription( key="outside_temperature", @@ -323,17 +321,17 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( device_class=SensorDeviceClass.TEMPERATURE, data_key="externalTemperature", entity_class=RenaultSensor[KamereonVehicleHvacStatusData], - name="Outside temperature", native_unit_of_measurement=UnitOfTemperature.CELSIUS, state_class=SensorStateClass.MEASUREMENT, + translation_key="outside_temperature", ), RenaultSensorEntityDescription( key="hvac_soc_threshold", coordinator="hvac_status", data_key="socThreshold", entity_class=RenaultSensor[KamereonVehicleHvacStatusData], - name="HVAC SoC threshold", native_unit_of_measurement=PERCENTAGE, + translation_key="hvac_soc_threshold", ), RenaultSensorEntityDescription( key="hvac_last_activity", @@ -342,7 +340,7 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="lastUpdateTime", entity_class=RenaultSensor[KamereonVehicleHvacStatusData], entity_registry_enabled_default=False, - name="HVAC last activity", + translation_key="hvac_last_activity", value_lambda=_get_utc_value, ), RenaultSensorEntityDescription( @@ -352,7 +350,7 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="lastUpdateTime", entity_class=RenaultSensor[KamereonVehicleLocationData], entity_registry_enabled_default=False, - name="Location last activity", + translation_key="location_last_activity", value_lambda=_get_utc_value, ), RenaultSensorEntityDescription( @@ -360,7 +358,7 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( coordinator="res_state", data_key="details", entity_class=RenaultSensor[KamereonVehicleResStateData], - name="Remote engine start", + translation_key="res_state", ), RenaultSensorEntityDescription( key="res_state_code", @@ -368,6 +366,6 @@ SENSOR_TYPES: tuple[RenaultSensorEntityDescription[Any], ...] = ( data_key="code", entity_class=RenaultSensor[KamereonVehicleResStateData], entity_registry_enabled_default=False, - name="Remote engine start code", + translation_key="res_state_code", ), ) diff --git a/homeassistant/components/renault/strings.json b/homeassistant/components/renault/strings.json index b28f1727c2f..066b49abcc0 100644 --- a/homeassistant/components/renault/strings.json +++ b/homeassistant/components/renault/strings.json @@ -33,8 +33,54 @@ } }, "entity": { + "binary_sensor": { + "charging": { + "name": "[%key:component::binary_sensor::entity_component::battery_charging::name%]" + }, + "hatch_status": { + "name": "Hatch" + }, + "driver_door_status": { + "name": "Driver door" + }, + "hvac_status": { + "name": "HVAC" + }, + "lock_status": { + "name": "[%key:component::binary_sensor::entity_component::lock::name%]" + }, + "passenger_door_status": { + "name": "Passenger door" + }, + "plugged_in": { + "name": "[%key:component::binary_sensor::entity_component::plug::name%]" + }, + "rear_left_door_status": { + "name": "Rear left door" + }, + "rear_right_door_status": { + "name": "Rear right door" + } + }, + "button": { + "start_air_conditioner": { + "name": "Start air conditioner" + }, + "start_charge": { + "name": "Start charge" + }, + "stop_charge": { + "name": "Stop charge" + } + }, + "device_tracker": { + "location": { + "name": "Location" + } + }, "select": { "charge_mode": { + "name": "Charge mode", "state": { "always": "Instant", "always_charging": "Instant", @@ -43,15 +89,26 @@ } }, "sensor": { - "plug_state": { - "state": { - "unplugged": "Unplugged", - "plugged": "Plugged in", - "plug_error": "Plug error", - "plug_unknown": "Plug unknown" - } + "admissible_charging_power": { + "name": "Admissible charging power" + }, + "battery_autonomy": { + "name": "Battery autonomy" + }, + "battery_available_energy": { + "name": "Battery available energy" + }, + "battery_last_activity": { + "name": "Last battery activity" + }, + "battery_level": { + "name": "Battery level" + }, + "battery_temperature": { + "name": "Battery temperature" }, "charge_state": { + "name": "Charge state", "state": { "not_in_charge": "Not charging", "waiting_for_a_planned_charge": "Waiting for planned charge", @@ -62,6 +119,48 @@ "charge_error": "Not charging or plugged in", "unavailable": "Unavailable" } + }, + "charging_power": { + "name": "Charging power" + }, + "charging_remaining_time": { + "name": "Charging remaining time" + }, + "fuel_autonomy": { + "name": "Fuel autonomy" + }, + "fuel_quantity": { + "name": "Fuel quantity" + }, + "hvac_last_activity": { + "name": "Last HVAC activity" + }, + "hvac_soc_threshold": { + "name": "HVAC SoC threshold" + }, + "location_last_activity": { + "name": "Last location activity" + }, + "mileage": { + "name": "Mileage" + }, + "outside_temperature": { + "name": "Outside temperature" + }, + "plug_state": { + "name": "Plug state", + "state": { + "unplugged": "Unplugged", + "plugged": "Plugged in", + "plug_error": "Plug error", + "plug_unknown": "Plug unknown" + } + }, + "res_state": { + "name": "Remote engine start" + }, + "res_state_code": { + "name": "Remote engine start code" } } } diff --git a/tests/components/renault/__init__.py b/tests/components/renault/__init__.py index f13adae1982..8dd0a1bf154 100644 --- a/tests/components/renault/__init__.py +++ b/tests/components/renault/__init__.py @@ -92,7 +92,7 @@ def check_entities_unavailable( for expected_entity in expected_entities: entity_id = expected_entity[ATTR_ENTITY_ID] registry_entry = entity_registry.entities.get(entity_id) - assert registry_entry is not None + assert registry_entry is not None, f"{entity_id} not found in registry" assert registry_entry.unique_id == expected_entity[ATTR_UNIQUE_ID] state = hass.states.get(entity_id) assert state.state == STATE_UNAVAILABLE diff --git a/tests/components/renault/const.py b/tests/components/renault/const.py index e17e6b64948..2aceb5e7489 100644 --- a/tests/components/renault/const.py +++ b/tests/components/renault/const.py @@ -84,7 +84,7 @@ MOCK_VEHICLES = { Platform.BINARY_SENSOR: [ { ATTR_DEVICE_CLASS: BinarySensorDeviceClass.PLUG, - ATTR_ENTITY_ID: "binary_sensor.reg_number_plugged_in", + ATTR_ENTITY_ID: "binary_sensor.reg_number_plug", ATTR_STATE: STATE_ON, ATTR_UNIQUE_ID: "vf1aaaaa555777999_plugged_in", }, @@ -160,7 +160,7 @@ MOCK_VEHICLES = { { ATTR_DEFAULT_DISABLED: True, ATTR_DEVICE_CLASS: SensorDeviceClass.TIMESTAMP, - ATTR_ENTITY_ID: "sensor.reg_number_battery_last_activity", + ATTR_ENTITY_ID: "sensor.reg_number_last_battery_activity", ATTR_STATE: "2020-01-12T21:40:16+00:00", ATTR_UNIQUE_ID: "vf1aaaaa555777999_battery_last_activity", }, @@ -231,7 +231,7 @@ MOCK_VEHICLES = { { ATTR_DEFAULT_DISABLED: True, ATTR_DEVICE_CLASS: SensorDeviceClass.TIMESTAMP, - ATTR_ENTITY_ID: "sensor.reg_number_hvac_last_activity", + ATTR_ENTITY_ID: "sensor.reg_number_last_hvac_activity", ATTR_STATE: STATE_UNKNOWN, ATTR_UNIQUE_ID: "vf1aaaaa555777999_hvac_last_activity", }, @@ -276,7 +276,7 @@ MOCK_VEHICLES = { Platform.BINARY_SENSOR: [ { ATTR_DEVICE_CLASS: BinarySensorDeviceClass.PLUG, - ATTR_ENTITY_ID: "binary_sensor.reg_number_plugged_in", + ATTR_ENTITY_ID: "binary_sensor.reg_number_plug", ATTR_STATE: STATE_OFF, ATTR_UNIQUE_ID: "vf1aaaaa555777999_plugged_in", }, @@ -395,7 +395,7 @@ MOCK_VEHICLES = { { ATTR_DEFAULT_DISABLED: True, ATTR_DEVICE_CLASS: SensorDeviceClass.TIMESTAMP, - ATTR_ENTITY_ID: "sensor.reg_number_battery_last_activity", + ATTR_ENTITY_ID: "sensor.reg_number_last_battery_activity", ATTR_STATE: "2020-11-17T08:06:48+00:00", ATTR_UNIQUE_ID: "vf1aaaaa555777999_battery_last_activity", }, @@ -466,7 +466,7 @@ MOCK_VEHICLES = { { ATTR_DEFAULT_DISABLED: True, ATTR_DEVICE_CLASS: SensorDeviceClass.TIMESTAMP, - ATTR_ENTITY_ID: "sensor.reg_number_hvac_last_activity", + ATTR_ENTITY_ID: "sensor.reg_number_last_hvac_activity", ATTR_STATE: "2020-12-03T00:00:00+00:00", ATTR_UNIQUE_ID: "vf1aaaaa555777999_hvac_last_activity", }, @@ -481,7 +481,7 @@ MOCK_VEHICLES = { { ATTR_DEFAULT_DISABLED: True, ATTR_DEVICE_CLASS: SensorDeviceClass.TIMESTAMP, - ATTR_ENTITY_ID: "sensor.reg_number_location_last_activity", + ATTR_ENTITY_ID: "sensor.reg_number_last_location_activity", ATTR_STATE: "2020-02-18T16:58:38+00:00", ATTR_UNIQUE_ID: "vf1aaaaa555777999_location_last_activity", }, @@ -517,7 +517,7 @@ MOCK_VEHICLES = { Platform.BINARY_SENSOR: [ { ATTR_DEVICE_CLASS: BinarySensorDeviceClass.PLUG, - ATTR_ENTITY_ID: "binary_sensor.reg_number_plugged_in", + ATTR_ENTITY_ID: "binary_sensor.reg_number_plug", ATTR_STATE: STATE_ON, ATTR_UNIQUE_ID: "vf1aaaaa555777123_plugged_in", }, @@ -630,7 +630,7 @@ MOCK_VEHICLES = { { ATTR_DEFAULT_DISABLED: True, ATTR_DEVICE_CLASS: SensorDeviceClass.TIMESTAMP, - ATTR_ENTITY_ID: "sensor.reg_number_battery_last_activity", + ATTR_ENTITY_ID: "sensor.reg_number_last_battery_activity", ATTR_STATE: "2020-01-12T21:40:16+00:00", ATTR_UNIQUE_ID: "vf1aaaaa555777123_battery_last_activity", }, @@ -713,7 +713,7 @@ MOCK_VEHICLES = { { ATTR_DEFAULT_DISABLED: True, ATTR_DEVICE_CLASS: SensorDeviceClass.TIMESTAMP, - ATTR_ENTITY_ID: "sensor.reg_number_location_last_activity", + ATTR_ENTITY_ID: "sensor.reg_number_last_location_activity", ATTR_STATE: "2020-02-18T16:58:38+00:00", ATTR_UNIQUE_ID: "vf1aaaaa555777123_location_last_activity", }, @@ -830,7 +830,7 @@ MOCK_VEHICLES = { { ATTR_DEFAULT_DISABLED: True, ATTR_DEVICE_CLASS: SensorDeviceClass.TIMESTAMP, - ATTR_ENTITY_ID: "sensor.reg_number_location_last_activity", + ATTR_ENTITY_ID: "sensor.reg_number_last_location_activity", ATTR_STATE: "2020-02-18T16:58:38+00:00", ATTR_UNIQUE_ID: "vf1aaaaa555777123_location_last_activity", }, diff --git a/tests/components/renault/test_sensor.py b/tests/components/renault/test_sensor.py index 1a4e84e1361..8220a0bf6aa 100644 --- a/tests/components/renault/test_sensor.py +++ b/tests/components/renault/test_sensor.py @@ -36,6 +36,7 @@ def _check_and_enable_disabled_entities( if expected_entity.get(ATTR_DEFAULT_DISABLED): entity_id = expected_entity[ATTR_ENTITY_ID] registry_entry = entity_registry.entities.get(entity_id) + assert registry_entry, f"{entity_id} not found in registry" assert registry_entry.disabled assert registry_entry.disabled_by is er.RegistryEntryDisabler.INTEGRATION entity_registry.async_update_entity(entity_id, **{"disabled_by": None})