Use entity name translations in Renault (#90697)

pull/90855/head
epenet 2023-04-03 18:20:11 +02:00 committed by Paulus Schoutsen
parent 71608d4795
commit 5835ae03bc
9 changed files with 146 additions and 49 deletions

View File

@ -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")
],

View File

@ -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",
),
)

View File

@ -55,6 +55,6 @@ DEVICE_TRACKER_TYPES: tuple[RenaultDataEntityDescription, ...] = (
key="location",
coordinator="location",
icon="mdi:car",
name="Location",
translation_key="location",
),
)

View File

@ -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"],
),
)

View File

@ -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",
),
)

View File

@ -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"
}
}
}

View File

@ -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

View File

@ -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",
},

View File

@ -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})