mirror of
https://github.com/home-assistant/core.git
synced 2025-04-24 01:08:12 +00:00
Add entity translations to Wallbox (#99021)
Co-authored-by: Robert Resch <robert@resch.dev>
This commit is contained in:
parent
1e76d37cee
commit
f21d924dd5
@ -246,6 +246,8 @@ class InvalidAuth(HomeAssistantError):
|
||||
class WallboxEntity(CoordinatorEntity[WallboxCoordinator]):
|
||||
"""Defines a base Wallbox entity."""
|
||||
|
||||
_attr_has_entity_name = True
|
||||
|
||||
@property
|
||||
def device_info(self) -> DeviceInfo:
|
||||
"""Return device information about this Wallbox device."""
|
||||
@ -256,7 +258,7 @@ class WallboxEntity(CoordinatorEntity[WallboxCoordinator]):
|
||||
self.coordinator.data[CHARGER_DATA_KEY][CHARGER_SERIAL_NUMBER_KEY],
|
||||
)
|
||||
},
|
||||
name=f"Wallbox - {self.coordinator.data[CHARGER_NAME_KEY]}",
|
||||
name=f"Wallbox {self.coordinator.data[CHARGER_NAME_KEY]}",
|
||||
manufacturer="Wallbox",
|
||||
model=self.coordinator.data[CHARGER_DATA_KEY][CHARGER_PART_NUMBER_KEY],
|
||||
sw_version=self.coordinator.data[CHARGER_DATA_KEY][CHARGER_SOFTWARE_KEY][
|
||||
|
@ -20,7 +20,7 @@ from .const import (
|
||||
LOCK_TYPES: dict[str, LockEntityDescription] = {
|
||||
CHARGER_LOCKED_UNLOCKED_KEY: LockEntityDescription(
|
||||
key=CHARGER_LOCKED_UNLOCKED_KEY,
|
||||
name="Locked/Unlocked",
|
||||
translation_key="lock",
|
||||
),
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ async def async_setup_entry(
|
||||
|
||||
async_add_entities(
|
||||
[
|
||||
WallboxLock(coordinator, entry, description)
|
||||
WallboxLock(coordinator, description)
|
||||
for ent in coordinator.data
|
||||
if (description := LOCK_TYPES.get(ent))
|
||||
]
|
||||
@ -55,14 +55,12 @@ class WallboxLock(WallboxEntity, LockEntity):
|
||||
def __init__(
|
||||
self,
|
||||
coordinator: WallboxCoordinator,
|
||||
entry: ConfigEntry,
|
||||
description: LockEntityDescription,
|
||||
) -> None:
|
||||
"""Initialize a Wallbox lock."""
|
||||
|
||||
super().__init__(coordinator)
|
||||
self.entity_description = description
|
||||
self._attr_name = f"{entry.title} {description.name}"
|
||||
self._attr_unique_id = f"{description.key}-{coordinator.data[CHARGER_DATA_KEY][CHARGER_SERIAL_NUMBER_KEY]}"
|
||||
|
||||
@property
|
||||
|
@ -33,7 +33,7 @@ class WallboxNumberEntityDescription(NumberEntityDescription):
|
||||
NUMBER_TYPES: dict[str, WallboxNumberEntityDescription] = {
|
||||
CHARGER_MAX_CHARGING_CURRENT_KEY: WallboxNumberEntityDescription(
|
||||
key=CHARGER_MAX_CHARGING_CURRENT_KEY,
|
||||
name="Max. Charging Current",
|
||||
translation_key="maximum_charging_current",
|
||||
),
|
||||
}
|
||||
|
||||
@ -77,7 +77,6 @@ class WallboxNumber(WallboxEntity, NumberEntity):
|
||||
super().__init__(coordinator)
|
||||
self.entity_description = description
|
||||
self._coordinator = coordinator
|
||||
self._attr_name = f"{entry.title} {description.name}"
|
||||
self._attr_unique_id = f"{description.key}-{coordinator.data[CHARGER_DATA_KEY][CHARGER_SERIAL_NUMBER_KEY]}"
|
||||
self._is_bidirectional = (
|
||||
coordinator.data[CHARGER_DATA_KEY][CHARGER_PART_NUMBER_KEY][0:3]
|
||||
|
@ -60,7 +60,7 @@ class WallboxSensorEntityDescription(SensorEntityDescription):
|
||||
SENSOR_TYPES: dict[str, WallboxSensorEntityDescription] = {
|
||||
CHARGER_CHARGING_POWER_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_CHARGING_POWER_KEY,
|
||||
name="Charging Power",
|
||||
translation_key=CHARGER_CHARGING_POWER_KEY,
|
||||
precision=2,
|
||||
native_unit_of_measurement=UnitOfPower.KILO_WATT,
|
||||
device_class=SensorDeviceClass.POWER,
|
||||
@ -68,7 +68,7 @@ SENSOR_TYPES: dict[str, WallboxSensorEntityDescription] = {
|
||||
),
|
||||
CHARGER_MAX_AVAILABLE_POWER_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_MAX_AVAILABLE_POWER_KEY,
|
||||
name="Max Available Power",
|
||||
translation_key=CHARGER_MAX_AVAILABLE_POWER_KEY,
|
||||
precision=0,
|
||||
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
|
||||
device_class=SensorDeviceClass.CURRENT,
|
||||
@ -76,15 +76,15 @@ SENSOR_TYPES: dict[str, WallboxSensorEntityDescription] = {
|
||||
),
|
||||
CHARGER_CHARGING_SPEED_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_CHARGING_SPEED_KEY,
|
||||
translation_key=CHARGER_CHARGING_SPEED_KEY,
|
||||
icon="mdi:speedometer",
|
||||
name="Charging Speed",
|
||||
precision=0,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
),
|
||||
CHARGER_ADDED_RANGE_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_ADDED_RANGE_KEY,
|
||||
translation_key=CHARGER_ADDED_RANGE_KEY,
|
||||
icon="mdi:map-marker-distance",
|
||||
name="Added Range",
|
||||
precision=0,
|
||||
native_unit_of_measurement=UnitOfLength.KILOMETERS,
|
||||
device_class=SensorDeviceClass.DISTANCE,
|
||||
@ -92,7 +92,7 @@ SENSOR_TYPES: dict[str, WallboxSensorEntityDescription] = {
|
||||
),
|
||||
CHARGER_ADDED_ENERGY_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_ADDED_ENERGY_KEY,
|
||||
name="Added Energy",
|
||||
translation_key=CHARGER_ADDED_ENERGY_KEY,
|
||||
precision=2,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
@ -100,7 +100,7 @@ SENSOR_TYPES: dict[str, WallboxSensorEntityDescription] = {
|
||||
),
|
||||
CHARGER_ADDED_DISCHARGED_ENERGY_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_ADDED_DISCHARGED_ENERGY_KEY,
|
||||
name="Discharged Energy",
|
||||
translation_key=CHARGER_ADDED_DISCHARGED_ENERGY_KEY,
|
||||
precision=2,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
@ -108,44 +108,44 @@ SENSOR_TYPES: dict[str, WallboxSensorEntityDescription] = {
|
||||
),
|
||||
CHARGER_COST_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_COST_KEY,
|
||||
translation_key=CHARGER_COST_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Cost",
|
||||
state_class=SensorStateClass.TOTAL_INCREASING,
|
||||
),
|
||||
CHARGER_STATE_OF_CHARGE_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_STATE_OF_CHARGE_KEY,
|
||||
name="State of Charge",
|
||||
translation_key=CHARGER_STATE_OF_CHARGE_KEY,
|
||||
native_unit_of_measurement=PERCENTAGE,
|
||||
device_class=SensorDeviceClass.BATTERY,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
),
|
||||
CHARGER_CURRENT_MODE_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_CURRENT_MODE_KEY,
|
||||
translation_key=CHARGER_CURRENT_MODE_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Current Mode",
|
||||
),
|
||||
CHARGER_DEPOT_PRICE_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_DEPOT_PRICE_KEY,
|
||||
translation_key=CHARGER_DEPOT_PRICE_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Depot Price",
|
||||
precision=2,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
),
|
||||
CHARGER_ENERGY_PRICE_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_ENERGY_PRICE_KEY,
|
||||
translation_key=CHARGER_ENERGY_PRICE_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Energy Price",
|
||||
precision=2,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
),
|
||||
CHARGER_STATUS_DESCRIPTION_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_STATUS_DESCRIPTION_KEY,
|
||||
translation_key=CHARGER_STATUS_DESCRIPTION_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Status Description",
|
||||
),
|
||||
CHARGER_MAX_CHARGING_CURRENT_KEY: WallboxSensorEntityDescription(
|
||||
key=CHARGER_MAX_CHARGING_CURRENT_KEY,
|
||||
name="Max. Charging Current",
|
||||
translation_key=CHARGER_MAX_CHARGING_CURRENT_KEY,
|
||||
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
|
||||
device_class=SensorDeviceClass.CURRENT,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
@ -161,7 +161,7 @@ async def async_setup_entry(
|
||||
|
||||
async_add_entities(
|
||||
[
|
||||
WallboxSensor(coordinator, entry, description)
|
||||
WallboxSensor(coordinator, description)
|
||||
for ent in coordinator.data
|
||||
if (description := SENSOR_TYPES.get(ent))
|
||||
]
|
||||
@ -176,13 +176,11 @@ class WallboxSensor(WallboxEntity, SensorEntity):
|
||||
def __init__(
|
||||
self,
|
||||
coordinator: WallboxCoordinator,
|
||||
entry: ConfigEntry,
|
||||
description: WallboxSensorEntityDescription,
|
||||
) -> None:
|
||||
"""Initialize a Wallbox sensor."""
|
||||
super().__init__(coordinator)
|
||||
self.entity_description = description
|
||||
self._attr_name = f"{entry.title} {description.name}"
|
||||
self._attr_unique_id = f"{description.key}-{coordinator.data[CHARGER_DATA_KEY][CHARGER_SERIAL_NUMBER_KEY]}"
|
||||
|
||||
@property
|
||||
|
@ -25,5 +25,63 @@
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
|
||||
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"lock": {
|
||||
"lock": {
|
||||
"name": "[%key:component::lock::title%]"
|
||||
}
|
||||
},
|
||||
"number": {
|
||||
"maximum_charging_current": {
|
||||
"name": "Maximum charging current"
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"charging_power": {
|
||||
"name": "Charging power"
|
||||
},
|
||||
"max_available_power": {
|
||||
"name": "Max available power"
|
||||
},
|
||||
"charging_speed": {
|
||||
"name": "Charging speed"
|
||||
},
|
||||
"added_range": {
|
||||
"name": "Added range"
|
||||
},
|
||||
"added_energy": {
|
||||
"name": "Added energy"
|
||||
},
|
||||
"added_discharged_energy": {
|
||||
"name": "Discharged energy"
|
||||
},
|
||||
"cost": {
|
||||
"name": "Cost"
|
||||
},
|
||||
"state_of_charge": {
|
||||
"name": "State of charge"
|
||||
},
|
||||
"current_mode": {
|
||||
"name": "Current mode"
|
||||
},
|
||||
"depot_price": {
|
||||
"name": "Depot price"
|
||||
},
|
||||
"energy_price": {
|
||||
"name": "Energy price"
|
||||
},
|
||||
"status_description": {
|
||||
"name": "Status description"
|
||||
},
|
||||
"max_charging_current": {
|
||||
"name": "Max charging current"
|
||||
}
|
||||
},
|
||||
"switch": {
|
||||
"pause_resume": {
|
||||
"name": "Pause/resume"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ from .const import (
|
||||
SWITCH_TYPES: dict[str, SwitchEntityDescription] = {
|
||||
CHARGER_PAUSE_RESUME_KEY: SwitchEntityDescription(
|
||||
key=CHARGER_PAUSE_RESUME_KEY,
|
||||
name="Pause/Resume",
|
||||
translation_key="pause_resume",
|
||||
),
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@ async def async_setup_entry(
|
||||
"""Create wallbox sensor entities in HASS."""
|
||||
coordinator: WallboxCoordinator = hass.data[DOMAIN][entry.entry_id]
|
||||
async_add_entities(
|
||||
[WallboxSwitch(coordinator, entry, SWITCH_TYPES[CHARGER_PAUSE_RESUME_KEY])]
|
||||
[WallboxSwitch(coordinator, SWITCH_TYPES[CHARGER_PAUSE_RESUME_KEY])]
|
||||
)
|
||||
|
||||
|
||||
@ -42,13 +42,11 @@ class WallboxSwitch(WallboxEntity, SwitchEntity):
|
||||
def __init__(
|
||||
self,
|
||||
coordinator: WallboxCoordinator,
|
||||
entry: ConfigEntry,
|
||||
description: SwitchEntityDescription,
|
||||
) -> None:
|
||||
"""Initialize a Wallbox switch."""
|
||||
super().__init__(coordinator)
|
||||
self.entity_description = description
|
||||
self._attr_name = f"{entry.title} {description.name}"
|
||||
self._attr_unique_id = f"{description.key}-{coordinator.data[CHARGER_DATA_KEY][CHARGER_SERIAL_NUMBER_KEY]}"
|
||||
|
||||
@property
|
||||
|
@ -5,9 +5,9 @@ TTL = "ttl"
|
||||
ERROR = "error"
|
||||
STATUS = "status"
|
||||
|
||||
MOCK_NUMBER_ENTITY_ID = "number.mock_title_max_charging_current"
|
||||
MOCK_LOCK_ENTITY_ID = "lock.mock_title_locked_unlocked"
|
||||
MOCK_SENSOR_CHARGING_SPEED_ID = "sensor.mock_title_charging_speed"
|
||||
MOCK_SENSOR_CHARGING_POWER_ID = "sensor.mock_title_charging_power"
|
||||
MOCK_SENSOR_MAX_AVAILABLE_POWER = "sensor.mock_title_max_available_power"
|
||||
MOCK_SWITCH_ENTITY_ID = "switch.mock_title_pause_resume"
|
||||
MOCK_NUMBER_ENTITY_ID = "number.wallbox_wallboxname_maximum_charging_current"
|
||||
MOCK_LOCK_ENTITY_ID = "lock.wallbox_wallboxname_lock"
|
||||
MOCK_SENSOR_CHARGING_SPEED_ID = "sensor.wallbox_wallboxname_charging_speed"
|
||||
MOCK_SENSOR_CHARGING_POWER_ID = "sensor.wallbox_wallboxname_charging_power"
|
||||
MOCK_SENSOR_MAX_AVAILABLE_POWER = "sensor.wallbox_wallboxname_max_available_power"
|
||||
MOCK_SWITCH_ENTITY_ID = "switch.wallbox_wallboxname_pause_resume"
|
||||
|
@ -21,11 +21,11 @@ async def test_wallbox_sensor_class(
|
||||
|
||||
state = hass.states.get(MOCK_SENSOR_CHARGING_POWER_ID)
|
||||
assert state.attributes[CONF_UNIT_OF_MEASUREMENT] == UnitOfPower.KILO_WATT
|
||||
assert state.name == "Mock Title Charging Power"
|
||||
assert state.name == "Wallbox WallboxName Charging power"
|
||||
|
||||
state = hass.states.get(MOCK_SENSOR_CHARGING_SPEED_ID)
|
||||
assert state.attributes[CONF_ICON] == "mdi:speedometer"
|
||||
assert state.name == "Mock Title Charging Speed"
|
||||
assert state.name == "Wallbox WallboxName Charging speed"
|
||||
|
||||
# Test round with precision '0' works
|
||||
state = hass.states.get(MOCK_SENSOR_MAX_AVAILABLE_POWER)
|
||||
|
Loading…
x
Reference in New Issue
Block a user