Use EntityDescription - climacell (#53573)

* Use EntityDescription - climacell

* Fix tests

* Fix coverage ignore comment
This commit is contained in:
Marc Mueller 2021-07-27 23:47:29 +02:00 committed by GitHub
parent dd849c4eab
commit 3908aabc13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 175 additions and 130 deletions

View File

@ -222,7 +222,7 @@ class ClimaCellDataUpdateCoordinator(DataUpdateCoordinator):
CC_V3_ATTR_WIND_GUST, CC_V3_ATTR_WIND_GUST,
CC_V3_ATTR_CLOUD_COVER, CC_V3_ATTR_CLOUD_COVER,
CC_V3_ATTR_PRECIPITATION_TYPE, CC_V3_ATTR_PRECIPITATION_TYPE,
*(sensor_type.field for sensor_type in CC_V3_SENSOR_TYPES), *(sensor_type.key for sensor_type in CC_V3_SENSOR_TYPES),
] ]
) )
data[FORECASTS][HOURLY] = await self._api.forecast_hourly( data[FORECASTS][HOURLY] = await self._api.forecast_hourly(
@ -279,7 +279,7 @@ class ClimaCellDataUpdateCoordinator(DataUpdateCoordinator):
CC_ATTR_WIND_GUST, CC_ATTR_WIND_GUST,
CC_ATTR_CLOUD_COVER, CC_ATTR_CLOUD_COVER,
CC_ATTR_PRECIPITATION_TYPE, CC_ATTR_PRECIPITATION_TYPE,
*(sensor_type.field for sensor_type in CC_SENSOR_TYPES), *(sensor_type.key for sensor_type in CC_SENSOR_TYPES),
], ],
[ [
CC_ATTR_TEMPERATURE_LOW, CC_ATTR_TEMPERATURE_LOW,

View File

@ -17,6 +17,7 @@ from pyclimacell.const import (
WeatherCode, WeatherCode,
) )
from homeassistant.components.sensor import SensorEntityDescription
from homeassistant.components.weather import ( from homeassistant.components.weather import (
ATTR_CONDITION_CLEAR_NIGHT, ATTR_CONDITION_CLEAR_NIGHT,
ATTR_CONDITION_CLOUDY, ATTR_CONDITION_CLOUDY,
@ -151,11 +152,9 @@ CC_ATTR_CLOUD_CEILING = "cloudCeiling"
@dataclass @dataclass
class ClimaCellSensorMetadata: class ClimaCellSensorEntityDescription(SensorEntityDescription):
"""Metadata about an individual ClimaCell sensor.""" """Describes a ClimaCell sensor entity."""
field: str
name: str
unit_imperial: str | None = None unit_imperial: str | None = None
unit_metric: str | None = None unit_metric: str | None = None
metric_conversion: Callable[[float], float] | float = 1.0 metric_conversion: Callable[[float], float] | float = 1.0
@ -171,30 +170,33 @@ class ClimaCellSensorMetadata:
"`unit_imperial` and `unit_metric` both need to be None or both need " "`unit_imperial` and `unit_metric` both need to be None or both need "
"to be defined." "to be defined."
) )
if self.name is None: # pragma: no cover
raise TypeError
self.name_ = self.name
CC_SENSOR_TYPES = ( CC_SENSOR_TYPES = (
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_FEELS_LIKE, key=CC_ATTR_FEELS_LIKE,
"Feels Like", name="Feels Like",
unit_imperial=TEMP_FAHRENHEIT, unit_imperial=TEMP_FAHRENHEIT,
unit_metric=TEMP_CELSIUS, unit_metric=TEMP_CELSIUS,
metric_conversion=lambda val: temp_convert(val, TEMP_FAHRENHEIT, TEMP_CELSIUS), metric_conversion=lambda val: temp_convert(val, TEMP_FAHRENHEIT, TEMP_CELSIUS),
is_metric_check=True, is_metric_check=True,
device_class=DEVICE_CLASS_TEMPERATURE, device_class=DEVICE_CLASS_TEMPERATURE,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_DEW_POINT, key=CC_ATTR_DEW_POINT,
"Dew Point", name="Dew Point",
unit_imperial=TEMP_FAHRENHEIT, unit_imperial=TEMP_FAHRENHEIT,
unit_metric=TEMP_CELSIUS, unit_metric=TEMP_CELSIUS,
metric_conversion=lambda val: temp_convert(val, TEMP_FAHRENHEIT, TEMP_CELSIUS), metric_conversion=lambda val: temp_convert(val, TEMP_FAHRENHEIT, TEMP_CELSIUS),
is_metric_check=True, is_metric_check=True,
device_class=DEVICE_CLASS_TEMPERATURE, device_class=DEVICE_CLASS_TEMPERATURE,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_PRESSURE_SURFACE_LEVEL, key=CC_ATTR_PRESSURE_SURFACE_LEVEL,
"Pressure (Surface Level)", name="Pressure (Surface Level)",
unit_imperial=PRESSURE_INHG, unit_imperial=PRESSURE_INHG,
unit_metric=PRESSURE_HPA, unit_metric=PRESSURE_HPA,
metric_conversion=lambda val: pressure_convert( metric_conversion=lambda val: pressure_convert(
@ -203,17 +205,17 @@ CC_SENSOR_TYPES = (
is_metric_check=True, is_metric_check=True,
device_class=DEVICE_CLASS_PRESSURE, device_class=DEVICE_CLASS_PRESSURE,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_SOLAR_GHI, key=CC_ATTR_SOLAR_GHI,
"Global Horizontal Irradiance", name="Global Horizontal Irradiance",
unit_imperial=IRRADIATION_BTUS_PER_HOUR_SQUARE_FOOT, unit_imperial=IRRADIATION_BTUS_PER_HOUR_SQUARE_FOOT,
unit_metric=IRRADIATION_WATTS_PER_SQUARE_METER, unit_metric=IRRADIATION_WATTS_PER_SQUARE_METER,
metric_conversion=3.15459, metric_conversion=3.15459,
is_metric_check=True, is_metric_check=True,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_CLOUD_BASE, key=CC_ATTR_CLOUD_BASE,
"Cloud Base", name="Cloud Base",
unit_imperial=LENGTH_MILES, unit_imperial=LENGTH_MILES,
unit_metric=LENGTH_KILOMETERS, unit_metric=LENGTH_KILOMETERS,
metric_conversion=lambda val: distance_convert( metric_conversion=lambda val: distance_convert(
@ -221,9 +223,9 @@ CC_SENSOR_TYPES = (
), ),
is_metric_check=True, is_metric_check=True,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_CLOUD_CEILING, key=CC_ATTR_CLOUD_CEILING,
"Cloud Ceiling", name="Cloud Ceiling",
unit_imperial=LENGTH_MILES, unit_imperial=LENGTH_MILES,
unit_metric=LENGTH_KILOMETERS, unit_metric=LENGTH_KILOMETERS,
metric_conversion=lambda val: distance_convert( metric_conversion=lambda val: distance_convert(
@ -231,99 +233,114 @@ CC_SENSOR_TYPES = (
), ),
is_metric_check=True, is_metric_check=True,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_CLOUD_COVER, key=CC_ATTR_CLOUD_COVER,
"Cloud Cover", name="Cloud Cover",
unit_imperial=PERCENTAGE, unit_imperial=PERCENTAGE,
unit_metric=PERCENTAGE, unit_metric=PERCENTAGE,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_WIND_GUST, key=CC_ATTR_WIND_GUST,
"Wind Gust", name="Wind Gust",
unit_imperial=SPEED_MILES_PER_HOUR, unit_imperial=SPEED_MILES_PER_HOUR,
unit_metric=SPEED_METERS_PER_SECOND, unit_metric=SPEED_METERS_PER_SECOND,
metric_conversion=lambda val: distance_convert(val, LENGTH_MILES, LENGTH_METERS) metric_conversion=lambda val: distance_convert(val, LENGTH_MILES, LENGTH_METERS)
/ 3600, / 3600,
is_metric_check=True, is_metric_check=True,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_PRECIPITATION_TYPE, key=CC_ATTR_PRECIPITATION_TYPE,
"Precipitation Type", name="Precipitation Type",
value_map=PrecipitationType, value_map=PrecipitationType,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_OZONE, key=CC_ATTR_OZONE,
"Ozone", name="Ozone",
unit_imperial=CONCENTRATION_PARTS_PER_BILLION, unit_imperial=CONCENTRATION_PARTS_PER_BILLION,
unit_metric=CONCENTRATION_PARTS_PER_BILLION, unit_metric=CONCENTRATION_PARTS_PER_BILLION,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_PARTICULATE_MATTER_25, key=CC_ATTR_PARTICULATE_MATTER_25,
"Particulate Matter < 2.5 μm", name="Particulate Matter < 2.5 μm",
unit_imperial=CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT, unit_imperial=CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT,
unit_metric=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, unit_metric=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
metric_conversion=3.2808399 ** 3, metric_conversion=3.2808399 ** 3,
is_metric_check=True, is_metric_check=True,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_PARTICULATE_MATTER_10, key=CC_ATTR_PARTICULATE_MATTER_10,
"Particulate Matter < 10 μm", name="Particulate Matter < 10 μm",
unit_imperial=CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT, unit_imperial=CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT,
unit_metric=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, unit_metric=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
metric_conversion=3.2808399 ** 3, metric_conversion=3.2808399 ** 3,
is_metric_check=True, is_metric_check=True,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_NITROGEN_DIOXIDE, key=CC_ATTR_NITROGEN_DIOXIDE,
"Nitrogen Dioxide", name="Nitrogen Dioxide",
unit_imperial=CONCENTRATION_PARTS_PER_BILLION, unit_imperial=CONCENTRATION_PARTS_PER_BILLION,
unit_metric=CONCENTRATION_PARTS_PER_BILLION, unit_metric=CONCENTRATION_PARTS_PER_BILLION,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_CARBON_MONOXIDE, key=CC_ATTR_CARBON_MONOXIDE,
"Carbon Monoxide", name="Carbon Monoxide",
unit_imperial=CONCENTRATION_PARTS_PER_MILLION, unit_imperial=CONCENTRATION_PARTS_PER_MILLION,
unit_metric=CONCENTRATION_PARTS_PER_MILLION, unit_metric=CONCENTRATION_PARTS_PER_MILLION,
device_class=DEVICE_CLASS_CO, device_class=DEVICE_CLASS_CO,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_SULFUR_DIOXIDE, key=CC_ATTR_SULFUR_DIOXIDE,
"Sulfur Dioxide", name="Sulfur Dioxide",
unit_imperial=CONCENTRATION_PARTS_PER_BILLION, unit_imperial=CONCENTRATION_PARTS_PER_BILLION,
unit_metric=CONCENTRATION_PARTS_PER_BILLION, unit_metric=CONCENTRATION_PARTS_PER_BILLION,
), ),
ClimaCellSensorMetadata(CC_ATTR_EPA_AQI, "US EPA Air Quality Index"), ClimaCellSensorEntityDescription(
ClimaCellSensorMetadata( key=CC_ATTR_EPA_AQI,
CC_ATTR_EPA_PRIMARY_POLLUTANT, name="US EPA Air Quality Index",
"US EPA Primary Pollutant", ),
ClimaCellSensorEntityDescription(
key=CC_ATTR_EPA_PRIMARY_POLLUTANT,
name="US EPA Primary Pollutant",
value_map=PrimaryPollutantType, value_map=PrimaryPollutantType,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_EPA_HEALTH_CONCERN, key=CC_ATTR_EPA_HEALTH_CONCERN,
"US EPA Health Concern", name="US EPA Health Concern",
value_map=HealthConcernType, value_map=HealthConcernType,
), ),
ClimaCellSensorMetadata(CC_ATTR_CHINA_AQI, "China MEP Air Quality Index"), ClimaCellSensorEntityDescription(
ClimaCellSensorMetadata( key=CC_ATTR_CHINA_AQI,
CC_ATTR_CHINA_PRIMARY_POLLUTANT, name="China MEP Air Quality Index",
"China MEP Primary Pollutant", ),
ClimaCellSensorEntityDescription(
key=CC_ATTR_CHINA_PRIMARY_POLLUTANT,
name="China MEP Primary Pollutant",
value_map=PrimaryPollutantType, value_map=PrimaryPollutantType,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_CHINA_HEALTH_CONCERN, key=CC_ATTR_CHINA_HEALTH_CONCERN,
"China MEP Health Concern", name="China MEP Health Concern",
value_map=HealthConcernType, value_map=HealthConcernType,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_POLLEN_TREE, "Tree Pollen Index", value_map=PollenIndex key=CC_ATTR_POLLEN_TREE,
name="Tree Pollen Index",
value_map=PollenIndex,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_POLLEN_WEED, "Weed Pollen Index", value_map=PollenIndex key=CC_ATTR_POLLEN_WEED,
name="Weed Pollen Index",
value_map=PollenIndex,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_ATTR_POLLEN_GRASS, "Grass Pollen Index", value_map=PollenIndex key=CC_ATTR_POLLEN_GRASS,
name="Grass Pollen Index",
value_map=PollenIndex,
),
ClimaCellSensorEntityDescription(
CC_ATTR_FIRE_INDEX,
name="Fire Index",
), ),
ClimaCellSensorMetadata(CC_ATTR_FIRE_INDEX, "Fire Index"),
) )
# V3 constants # V3 constants
@ -389,67 +406,88 @@ CC_V3_ATTR_POLLEN_GRASS = "pollen_grass"
CC_V3_ATTR_FIRE_INDEX = "fire_index" CC_V3_ATTR_FIRE_INDEX = "fire_index"
CC_V3_SENSOR_TYPES = ( CC_V3_SENSOR_TYPES = (
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_OZONE, key=CC_V3_ATTR_OZONE,
"Ozone", name="Ozone",
unit_imperial=CONCENTRATION_PARTS_PER_BILLION, unit_imperial=CONCENTRATION_PARTS_PER_BILLION,
unit_metric=CONCENTRATION_PARTS_PER_BILLION, unit_metric=CONCENTRATION_PARTS_PER_BILLION,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_PARTICULATE_MATTER_25, key=CC_V3_ATTR_PARTICULATE_MATTER_25,
"Particulate Matter < 2.5 μm", name="Particulate Matter < 2.5 μm",
unit_imperial=CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT, unit_imperial=CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT,
unit_metric=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, unit_metric=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
metric_conversion=3.2808399 ** 3, metric_conversion=3.2808399 ** 3,
is_metric_check=False, is_metric_check=False,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_PARTICULATE_MATTER_10, key=CC_V3_ATTR_PARTICULATE_MATTER_10,
"Particulate Matter < 10 μm", name="Particulate Matter < 10 μm",
unit_imperial=CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT, unit_imperial=CONCENTRATION_MICROGRAMS_PER_CUBIC_FOOT,
unit_metric=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, unit_metric=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
metric_conversion=3.2808399 ** 3, metric_conversion=3.2808399 ** 3,
is_metric_check=False, is_metric_check=False,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_NITROGEN_DIOXIDE, key=CC_V3_ATTR_NITROGEN_DIOXIDE,
"Nitrogen Dioxide", name="Nitrogen Dioxide",
unit_imperial=CONCENTRATION_PARTS_PER_BILLION, unit_imperial=CONCENTRATION_PARTS_PER_BILLION,
unit_metric=CONCENTRATION_PARTS_PER_BILLION, unit_metric=CONCENTRATION_PARTS_PER_BILLION,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_CARBON_MONOXIDE, key=CC_V3_ATTR_CARBON_MONOXIDE,
"Carbon Monoxide", name="Carbon Monoxide",
unit_imperial=CONCENTRATION_PARTS_PER_MILLION, unit_imperial=CONCENTRATION_PARTS_PER_MILLION,
unit_metric=CONCENTRATION_PARTS_PER_MILLION, unit_metric=CONCENTRATION_PARTS_PER_MILLION,
device_class=DEVICE_CLASS_CO, device_class=DEVICE_CLASS_CO,
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_SULFUR_DIOXIDE, key=CC_V3_ATTR_SULFUR_DIOXIDE,
"Sulfur Dioxide", name="Sulfur Dioxide",
unit_imperial=CONCENTRATION_PARTS_PER_BILLION, unit_imperial=CONCENTRATION_PARTS_PER_BILLION,
unit_metric=CONCENTRATION_PARTS_PER_BILLION, unit_metric=CONCENTRATION_PARTS_PER_BILLION,
), ),
ClimaCellSensorMetadata(CC_V3_ATTR_EPA_AQI, "US EPA Air Quality Index"), ClimaCellSensorEntityDescription(
ClimaCellSensorMetadata( key=CC_V3_ATTR_EPA_AQI,
CC_V3_ATTR_EPA_PRIMARY_POLLUTANT, "US EPA Primary Pollutant" name="US EPA Air Quality Index",
), ),
ClimaCellSensorMetadata(CC_V3_ATTR_EPA_HEALTH_CONCERN, "US EPA Health Concern"), ClimaCellSensorEntityDescription(
ClimaCellSensorMetadata(CC_V3_ATTR_CHINA_AQI, "China MEP Air Quality Index"), key=CC_V3_ATTR_EPA_PRIMARY_POLLUTANT,
ClimaCellSensorMetadata( name="US EPA Primary Pollutant",
CC_V3_ATTR_CHINA_PRIMARY_POLLUTANT, "China MEP Primary Pollutant"
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_CHINA_HEALTH_CONCERN, "China MEP Health Concern" key=CC_V3_ATTR_EPA_HEALTH_CONCERN,
name="US EPA Health Concern",
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_POLLEN_TREE, "Tree Pollen Index", value_map=V3PollenIndex key=CC_V3_ATTR_CHINA_AQI,
name="China MEP Air Quality Index",
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_POLLEN_WEED, "Weed Pollen Index", value_map=V3PollenIndex key=CC_V3_ATTR_CHINA_PRIMARY_POLLUTANT,
name="China MEP Primary Pollutant",
), ),
ClimaCellSensorMetadata( ClimaCellSensorEntityDescription(
CC_V3_ATTR_POLLEN_GRASS, "Grass Pollen Index", value_map=V3PollenIndex key=CC_V3_ATTR_CHINA_HEALTH_CONCERN,
name="China MEP Health Concern",
),
ClimaCellSensorEntityDescription(
key=CC_V3_ATTR_POLLEN_TREE,
name="Tree Pollen Index",
value_map=V3PollenIndex,
),
ClimaCellSensorEntityDescription(
key=CC_V3_ATTR_POLLEN_WEED,
name="Weed Pollen Index",
value_map=V3PollenIndex,
),
ClimaCellSensorEntityDescription(
key=CC_V3_ATTR_POLLEN_GRASS,
name="Grass Pollen Index",
value_map=V3PollenIndex,
),
ClimaCellSensorEntityDescription(
key=CC_V3_ATTR_FIRE_INDEX,
name="Fire Index",
), ),
ClimaCellSensorMetadata(CC_V3_ATTR_FIRE_INDEX, "Fire Index"),
) )

View File

@ -14,7 +14,12 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util import slugify from homeassistant.util import slugify
from . import ClimaCellDataUpdateCoordinator, ClimaCellEntity from . import ClimaCellDataUpdateCoordinator, ClimaCellEntity
from .const import CC_SENSOR_TYPES, CC_V3_SENSOR_TYPES, DOMAIN, ClimaCellSensorMetadata from .const import (
CC_SENSOR_TYPES,
CC_V3_SENSOR_TYPES,
DOMAIN,
ClimaCellSensorEntityDescription,
)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -35,8 +40,8 @@ async def async_setup_entry(
api_class = ClimaCellSensorEntity api_class = ClimaCellSensorEntity
sensor_types = CC_SENSOR_TYPES sensor_types = CC_SENSOR_TYPES
entities = [ entities = [
api_class(hass, config_entry, coordinator, api_version, sensor_type) api_class(hass, config_entry, coordinator, api_version, description)
for sensor_type in sensor_types for description in sensor_types
] ]
async_add_entities(entities) async_add_entities(entities)
@ -44,30 +49,29 @@ async def async_setup_entry(
class BaseClimaCellSensorEntity(ClimaCellEntity, SensorEntity): class BaseClimaCellSensorEntity(ClimaCellEntity, SensorEntity):
"""Base ClimaCell sensor entity.""" """Base ClimaCell sensor entity."""
entity_description: ClimaCellSensorEntityDescription
def __init__( def __init__(
self, self,
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ConfigEntry,
coordinator: ClimaCellDataUpdateCoordinator, coordinator: ClimaCellDataUpdateCoordinator,
api_version: int, api_version: int,
sensor_type: ClimaCellSensorMetadata, description: ClimaCellSensorEntityDescription,
) -> None: ) -> None:
"""Initialize ClimaCell Sensor Entity.""" """Initialize ClimaCell Sensor Entity."""
super().__init__(config_entry, coordinator, api_version) super().__init__(config_entry, coordinator, api_version)
self.sensor_type = sensor_type self.entity_description = description
self._attr_device_class = self.sensor_type.device_class
self._attr_entity_registry_enabled_default = False self._attr_entity_registry_enabled_default = False
self._attr_name = ( self._attr_name = f"{self._config_entry.data[CONF_NAME]} - {description.name}"
f"{self._config_entry.data[CONF_NAME]} - {self.sensor_type.name}"
)
self._attr_unique_id = ( self._attr_unique_id = (
f"{self._config_entry.unique_id}_{slugify(self.sensor_type.name)}" f"{self._config_entry.unique_id}_{slugify(description.name_)}"
) )
self._attr_extra_state_attributes = {ATTR_ATTRIBUTION: self.attribution} self._attr_extra_state_attributes = {ATTR_ATTRIBUTION: self.attribution}
self._attr_unit_of_measurement = ( self._attr_unit_of_measurement = (
self.sensor_type.unit_metric description.unit_metric
if hass.config.units.is_metric if hass.config.units.is_metric
else self.sensor_type.unit_imperial else description.unit_imperial
) )
@property @property
@ -81,20 +85,21 @@ class BaseClimaCellSensorEntity(ClimaCellEntity, SensorEntity):
state = self._state state = self._state
if ( if (
state is not None state is not None
and self.sensor_type.unit_imperial is not None and self.entity_description.unit_imperial is not None
and self.sensor_type.metric_conversion != 1.0 and self.entity_description.metric_conversion != 1.0
and self.sensor_type.is_metric_check is not None and self.entity_description.is_metric_check is not None
and self.hass.config.units.is_metric == self.sensor_type.is_metric_check and self.hass.config.units.is_metric
== self.entity_description.is_metric_check
): ):
conversion = self.sensor_type.metric_conversion conversion = self.entity_description.metric_conversion
# When conversion is a callable, we assume it's a single input function # When conversion is a callable, we assume it's a single input function
if callable(conversion): if callable(conversion):
return round(conversion(state), 4) return round(conversion(state), 4)
return round(state * conversion, 4) return round(state * conversion, 4)
if self.sensor_type.value_map is not None and state is not None: if self.entity_description.value_map is not None and state is not None:
return self.sensor_type.value_map(state).name.lower() return self.entity_description.value_map(state).name.lower()
return state return state
@ -105,7 +110,7 @@ class ClimaCellSensorEntity(BaseClimaCellSensorEntity):
@property @property
def _state(self) -> str | int | float | None: def _state(self) -> str | int | float | None:
"""Return the raw state.""" """Return the raw state."""
return self._get_current_property(self.sensor_type.field) return self._get_current_property(self.entity_description.key)
class ClimaCellV3SensorEntity(BaseClimaCellSensorEntity): class ClimaCellV3SensorEntity(BaseClimaCellSensorEntity):
@ -115,5 +120,5 @@ class ClimaCellV3SensorEntity(BaseClimaCellSensorEntity):
def _state(self) -> str | int | float | None: def _state(self) -> str | int | float | None:
"""Return the raw state.""" """Return the raw state."""
return self._get_cc_value( return self._get_cc_value(
self.coordinator.data[CURRENT], self.sensor_type.field self.coordinator.data[CURRENT], self.entity_description.key
) )

View File

@ -1,12 +1,14 @@
"""Tests for ClimaCell const.""" """Tests for ClimaCell const."""
import pytest import pytest
from homeassistant.components.climacell.const import ClimaCellSensorMetadata from homeassistant.components.climacell.const import ClimaCellSensorEntityDescription
from homeassistant.const import TEMP_FAHRENHEIT from homeassistant.const import TEMP_FAHRENHEIT
async def test_post_init(): async def test_post_init():
"""Test post initiailization check for ClimaCellSensorMetadata.""" """Test post initiailization check for ClimaCellSensorEntityDescription."""
with pytest.raises(RuntimeError): with pytest.raises(RuntimeError):
ClimaCellSensorMetadata("a", "b", unit_imperial=TEMP_FAHRENHEIT) ClimaCellSensorEntityDescription(
key="a", name="b", unit_imperial=TEMP_FAHRENHEIT
)