mirror of
https://github.com/home-assistant/core
synced 2024-10-07 10:13:38 +02:00
Use EntityDescription - wallbox (#58690)
This commit is contained in:
parent
d6e49bc5bc
commit
733280e169
@ -16,10 +16,9 @@ from .const import (
|
||||
CONF_CONNECTIONS,
|
||||
CONF_DATA_KEY,
|
||||
CONF_MAX_CHARGING_CURRENT_KEY,
|
||||
CONF_ROUND,
|
||||
CONF_SENSOR_TYPES,
|
||||
CONF_STATION,
|
||||
DOMAIN,
|
||||
SENSOR_TYPES,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@ -72,10 +71,10 @@ class WallboxCoordinator(DataUpdateCoordinator):
|
||||
CONF_MAX_CHARGING_CURRENT_KEY
|
||||
]
|
||||
|
||||
filtered_data = {k: data[k] for k in CONF_SENSOR_TYPES if k in data}
|
||||
filtered_data = {k: data[k] for k in SENSOR_TYPES if k in data}
|
||||
|
||||
for key, value in filtered_data.items():
|
||||
if (sensor_round := CONF_SENSOR_TYPES[key][CONF_ROUND]) is not None:
|
||||
if (sensor_round := SENSOR_TYPES[key].precision) is not None:
|
||||
try:
|
||||
filtered_data[key] = round(value, sensor_round)
|
||||
except TypeError:
|
||||
|
@ -1,9 +1,10 @@
|
||||
"""Constants for the Wallbox integration."""
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
||||
from homeassistant.components.sensor import SensorEntityDescription
|
||||
from homeassistant.const import (
|
||||
CONF_DEVICE_CLASS,
|
||||
CONF_ICON,
|
||||
CONF_NAME,
|
||||
CONF_UNIT_OF_MEASUREMENT,
|
||||
DEVICE_CLASS_BATTERY,
|
||||
DEVICE_CLASS_CURRENT,
|
||||
DEVICE_CLASS_ENERGY,
|
||||
@ -33,91 +34,86 @@ CONF_STATE_OF_CHARGE_KEY = "state_of_charge"
|
||||
CONF_STATUS_DESCRIPTION_KEY = "status_description"
|
||||
|
||||
CONF_CONNECTIONS = "connections"
|
||||
CONF_ROUND = "round"
|
||||
|
||||
CONF_SENSOR_TYPES = {
|
||||
CONF_CHARGING_POWER_KEY: {
|
||||
CONF_ICON: None,
|
||||
CONF_NAME: "Charging Power",
|
||||
CONF_ROUND: 2,
|
||||
CONF_UNIT_OF_MEASUREMENT: POWER_KILO_WATT,
|
||||
CONF_DEVICE_CLASS: DEVICE_CLASS_POWER,
|
||||
},
|
||||
CONF_MAX_AVAILABLE_POWER_KEY: {
|
||||
CONF_ICON: None,
|
||||
CONF_NAME: "Max Available Power",
|
||||
CONF_ROUND: 0,
|
||||
CONF_UNIT_OF_MEASUREMENT: ELECTRIC_CURRENT_AMPERE,
|
||||
CONF_DEVICE_CLASS: DEVICE_CLASS_CURRENT,
|
||||
},
|
||||
CONF_CHARGING_SPEED_KEY: {
|
||||
CONF_ICON: "mdi:speedometer",
|
||||
CONF_NAME: "Charging Speed",
|
||||
CONF_ROUND: 0,
|
||||
CONF_UNIT_OF_MEASUREMENT: None,
|
||||
CONF_DEVICE_CLASS: None,
|
||||
},
|
||||
CONF_ADDED_RANGE_KEY: {
|
||||
CONF_ICON: "mdi:map-marker-distance",
|
||||
CONF_NAME: "Added Range",
|
||||
CONF_ROUND: 0,
|
||||
CONF_UNIT_OF_MEASUREMENT: LENGTH_KILOMETERS,
|
||||
CONF_DEVICE_CLASS: None,
|
||||
},
|
||||
CONF_ADDED_ENERGY_KEY: {
|
||||
CONF_ICON: None,
|
||||
CONF_NAME: "Added Energy",
|
||||
CONF_ROUND: 2,
|
||||
CONF_UNIT_OF_MEASUREMENT: ENERGY_KILO_WATT_HOUR,
|
||||
CONF_DEVICE_CLASS: DEVICE_CLASS_ENERGY,
|
||||
},
|
||||
CONF_CHARGING_TIME_KEY: {
|
||||
CONF_ICON: "mdi:timer",
|
||||
CONF_NAME: "Charging Time",
|
||||
CONF_ROUND: None,
|
||||
CONF_UNIT_OF_MEASUREMENT: None,
|
||||
CONF_DEVICE_CLASS: None,
|
||||
},
|
||||
CONF_COST_KEY: {
|
||||
CONF_ICON: "mdi:ev-station",
|
||||
CONF_NAME: "Cost",
|
||||
CONF_ROUND: None,
|
||||
CONF_UNIT_OF_MEASUREMENT: None,
|
||||
CONF_DEVICE_CLASS: None,
|
||||
},
|
||||
CONF_STATE_OF_CHARGE_KEY: {
|
||||
CONF_ICON: None,
|
||||
CONF_NAME: "State of Charge",
|
||||
CONF_ROUND: None,
|
||||
CONF_UNIT_OF_MEASUREMENT: PERCENTAGE,
|
||||
CONF_DEVICE_CLASS: DEVICE_CLASS_BATTERY,
|
||||
},
|
||||
CONF_CURRENT_MODE_KEY: {
|
||||
CONF_ICON: "mdi:ev-station",
|
||||
CONF_NAME: "Current Mode",
|
||||
CONF_ROUND: None,
|
||||
CONF_UNIT_OF_MEASUREMENT: None,
|
||||
CONF_DEVICE_CLASS: None,
|
||||
},
|
||||
CONF_DEPOT_PRICE_KEY: {
|
||||
CONF_ICON: "mdi:ev-station",
|
||||
CONF_NAME: "Depot Price",
|
||||
CONF_ROUND: 2,
|
||||
CONF_UNIT_OF_MEASUREMENT: None,
|
||||
CONF_DEVICE_CLASS: None,
|
||||
},
|
||||
CONF_STATUS_DESCRIPTION_KEY: {
|
||||
CONF_ICON: "mdi:ev-station",
|
||||
CONF_NAME: "Status Description",
|
||||
CONF_ROUND: None,
|
||||
CONF_UNIT_OF_MEASUREMENT: None,
|
||||
CONF_DEVICE_CLASS: None,
|
||||
},
|
||||
CONF_MAX_CHARGING_CURRENT_KEY: {
|
||||
CONF_ICON: None,
|
||||
CONF_NAME: "Max. Charging Current",
|
||||
CONF_ROUND: None,
|
||||
CONF_UNIT_OF_MEASUREMENT: ELECTRIC_CURRENT_AMPERE,
|
||||
CONF_DEVICE_CLASS: DEVICE_CLASS_CURRENT,
|
||||
},
|
||||
|
||||
@dataclass
|
||||
class WallboxSensorEntityDescription(SensorEntityDescription):
|
||||
"""Describes Wallbox sensor entity."""
|
||||
|
||||
precision: int | None = None
|
||||
|
||||
|
||||
SENSOR_TYPES: dict[str, WallboxSensorEntityDescription] = {
|
||||
CONF_CHARGING_POWER_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_CHARGING_POWER_KEY,
|
||||
name="Charging Power",
|
||||
precision=2,
|
||||
native_unit_of_measurement=POWER_KILO_WATT,
|
||||
device_class=DEVICE_CLASS_POWER,
|
||||
),
|
||||
CONF_MAX_AVAILABLE_POWER_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_MAX_AVAILABLE_POWER_KEY,
|
||||
name="Max Available Power",
|
||||
precision=0,
|
||||
native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE,
|
||||
device_class=DEVICE_CLASS_CURRENT,
|
||||
),
|
||||
CONF_CHARGING_SPEED_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_CHARGING_SPEED_KEY,
|
||||
icon="mdi:speedometer",
|
||||
name="Charging Speed",
|
||||
precision=0,
|
||||
),
|
||||
CONF_ADDED_RANGE_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_ADDED_RANGE_KEY,
|
||||
icon="mdi:map-marker-distance",
|
||||
name="Added Range",
|
||||
precision=0,
|
||||
native_unit_of_measurement=LENGTH_KILOMETERS,
|
||||
),
|
||||
CONF_ADDED_ENERGY_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_ADDED_ENERGY_KEY,
|
||||
name="Added Energy",
|
||||
precision=2,
|
||||
native_unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||
device_class=DEVICE_CLASS_ENERGY,
|
||||
),
|
||||
CONF_CHARGING_TIME_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_CHARGING_TIME_KEY,
|
||||
icon="mdi:timer",
|
||||
name="Charging Time",
|
||||
),
|
||||
CONF_COST_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_COST_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Cost",
|
||||
),
|
||||
CONF_STATE_OF_CHARGE_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_STATE_OF_CHARGE_KEY,
|
||||
name="State of Charge",
|
||||
native_unit_of_measurement=PERCENTAGE,
|
||||
device_class=DEVICE_CLASS_BATTERY,
|
||||
),
|
||||
CONF_CURRENT_MODE_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_CURRENT_MODE_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Current Mode",
|
||||
),
|
||||
CONF_DEPOT_PRICE_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_DEPOT_PRICE_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Depot Price",
|
||||
precision=2,
|
||||
),
|
||||
CONF_STATUS_DESCRIPTION_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_STATUS_DESCRIPTION_KEY,
|
||||
icon="mdi:ev-station",
|
||||
name="Status Description",
|
||||
),
|
||||
CONF_MAX_CHARGING_CURRENT_KEY: WallboxSensorEntityDescription(
|
||||
key=CONF_MAX_CHARGING_CURRENT_KEY,
|
||||
name="Max. Charging Current",
|
||||
native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE,
|
||||
device_class=DEVICE_CLASS_CURRENT,
|
||||
),
|
||||
}
|
||||
|
@ -1,7 +1,5 @@
|
||||
"""Home Assistant component for accessing the Wallbox Portal API. The sensor component creates multiple sensors regarding wallbox performance."""
|
||||
|
||||
from homeassistant.components.number import NumberEntity
|
||||
from homeassistant.const import CONF_DEVICE_CLASS
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from . import InvalidAuth
|
||||
@ -9,9 +7,8 @@ from .const import (
|
||||
CONF_CONNECTIONS,
|
||||
CONF_MAX_AVAILABLE_POWER_KEY,
|
||||
CONF_MAX_CHARGING_CURRENT_KEY,
|
||||
CONF_NAME,
|
||||
CONF_SENSOR_TYPES,
|
||||
DOMAIN,
|
||||
SENSOR_TYPES,
|
||||
)
|
||||
|
||||
|
||||
@ -35,11 +32,11 @@ class WallboxNumber(CoordinatorEntity, NumberEntity):
|
||||
def __init__(self, coordinator, config):
|
||||
"""Initialize a Wallbox sensor."""
|
||||
super().__init__(coordinator)
|
||||
_properties = CONF_SENSOR_TYPES[CONF_MAX_CHARGING_CURRENT_KEY]
|
||||
sensor_description = SENSOR_TYPES[CONF_MAX_CHARGING_CURRENT_KEY]
|
||||
self._coordinator = coordinator
|
||||
self._attr_name = f"{config.title} {_properties[CONF_NAME]}"
|
||||
self._attr_name = f"{config.title} {sensor_description.name}"
|
||||
self._attr_min_value = 6
|
||||
self._attr_device_class = _properties[CONF_DEVICE_CLASS]
|
||||
self._attr_device_class = sensor_description.device_class
|
||||
|
||||
@property
|
||||
def max_value(self):
|
||||
|
@ -1,16 +1,12 @@
|
||||
"""Home Assistant component for accessing the Wallbox Portal API. The sensor component creates multiple sensors regarding wallbox performance."""
|
||||
|
||||
from homeassistant.components.sensor import SensorEntity
|
||||
from homeassistant.const import CONF_DEVICE_CLASS
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from .const import (
|
||||
CONF_CONNECTIONS,
|
||||
CONF_ICON,
|
||||
CONF_NAME,
|
||||
CONF_SENSOR_TYPES,
|
||||
CONF_UNIT_OF_MEASUREMENT,
|
||||
DOMAIN,
|
||||
SENSOR_TYPES,
|
||||
WallboxSensorEntityDescription,
|
||||
)
|
||||
|
||||
CONF_STATION = "station"
|
||||
@ -22,26 +18,28 @@ async def async_setup_entry(hass, config, async_add_entities):
|
||||
coordinator = hass.data[DOMAIN][CONF_CONNECTIONS][config.entry_id]
|
||||
|
||||
async_add_entities(
|
||||
WallboxSensor(coordinator, idx, ent, config)
|
||||
for idx, ent in enumerate(coordinator.data)
|
||||
[
|
||||
WallboxSensor(coordinator, config, description)
|
||||
for ent in coordinator.data
|
||||
if (description := SENSOR_TYPES[ent])
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
class WallboxSensor(CoordinatorEntity, SensorEntity):
|
||||
"""Representation of the Wallbox portal."""
|
||||
|
||||
def __init__(self, coordinator, idx, ent, config):
|
||||
entity_description: WallboxSensorEntityDescription
|
||||
|
||||
def __init__(
|
||||
self, coordinator, config, description: WallboxSensorEntityDescription
|
||||
):
|
||||
"""Initialize a Wallbox sensor."""
|
||||
super().__init__(coordinator)
|
||||
self._attr_name = f"{config.title} {CONF_SENSOR_TYPES[ent][CONF_NAME]}"
|
||||
self._attr_icon = CONF_SENSOR_TYPES[ent][CONF_ICON]
|
||||
self._attr_native_unit_of_measurement = CONF_SENSOR_TYPES[ent][
|
||||
CONF_UNIT_OF_MEASUREMENT
|
||||
]
|
||||
self._attr_device_class = CONF_SENSOR_TYPES[ent][CONF_DEVICE_CLASS]
|
||||
self._ent = ent
|
||||
self.entity_description = description
|
||||
self._attr_name = f"{config.title} {description.name}"
|
||||
|
||||
@property
|
||||
def native_value(self):
|
||||
"""Return the state of the sensor."""
|
||||
return self.coordinator.data[self._ent]
|
||||
return self.coordinator.data[self.entity_description.key]
|
||||
|
Loading…
Reference in New Issue
Block a user