Reduce nesting in discovergy setup (#104127)

* Reduce nesting in discovergy setup

* Update homeassistant/components/discovergy/sensor.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
This commit is contained in:
Jan-Philipp Benecke 2023-11-17 19:31:29 +01:00 committed by GitHub
parent e2f6fbd59b
commit 2d891c77ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 94 additions and 21 deletions

View File

@ -30,12 +30,19 @@ from .const import DOMAIN, MANUFACTURER
PARALLEL_UPDATES = 1
def _get_and_scale(reading: Reading, key: str, scale: int) -> datetime | float | None:
"""Get a value from a Reading and divide with scale it."""
if (value := reading.values.get(key)) is not None:
return value / scale
return None
@dataclass(kw_only=True)
class DiscovergySensorEntityDescription(SensorEntityDescription):
"""Class to describe a Discovergy sensor entity."""
value_fn: Callable[[Reading, str, int], datetime | float | None] = field(
default=lambda reading, key, scale: float(reading.values[key] / scale)
default=_get_and_scale
)
alternative_keys: list[str] = field(default_factory=lambda: [])
scale: int = field(default_factory=lambda: 1000)
@ -165,33 +172,27 @@ async def async_setup_entry(
entities: list[DiscovergySensor] = []
for meter in meters:
sensors = None
if meter.measurement_type == "ELECTRICITY":
sensors = ELECTRICITY_SENSORS
elif meter.measurement_type == "GAS":
sensors = GAS_SENSORS
sensors: tuple[DiscovergySensorEntityDescription, ...] = ()
coordinator: DiscovergyUpdateCoordinator = data.coordinators[meter.meter_id]
if sensors is not None:
for description in sensors:
# check if this meter has this data, then add this sensor
for key in {description.key, *description.alternative_keys}:
if key in coordinator.data.values:
entities.append(
DiscovergySensor(key, description, meter, coordinator)
)
# select sensor descriptions based on meter type and combine with additional sensors
if meter.measurement_type == "ELECTRICITY":
sensors = ELECTRICITY_SENSORS + ADDITIONAL_SENSORS
elif meter.measurement_type == "GAS":
sensors = GAS_SENSORS + ADDITIONAL_SENSORS
for description in ADDITIONAL_SENSORS:
entities.append(
DiscovergySensor(description.key, description, meter, coordinator)
)
entities.extend(
DiscovergySensor(value_key, description, meter, coordinator)
for description in sensors
for value_key in {description.key, *description.alternative_keys}
if description.value_fn(coordinator.data, value_key, description.scale)
)
async_add_entities(entities, False)
async_add_entities(entities)
class DiscovergySensor(CoordinatorEntity[DiscovergyUpdateCoordinator], SensorEntity):
"""Represents a discovergy smart meter sensor."""
"""Represents a Discovergy smart meter sensor."""
entity_description: DiscovergySensorEntityDescription
data_key: str

View File

@ -1,4 +1,38 @@
# serializer version: 1
# name: test_sensor[electricity last transmitted]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.electricity_teststrasse_1_last_transmitted',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TIMESTAMP: 'timestamp'>,
'original_icon': None,
'original_name': 'Last transmitted',
'platform': 'discovergy',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'last_transmitted',
'unique_id': 'abc123-last_transmitted',
'unit_of_measurement': None,
})
# ---
# name: test_sensor[electricity last transmitted].1
None
# ---
# name: test_sensor[electricity total consumption]
EntityRegistryEntrySnapshot({
'aliases': set({
@ -101,6 +135,40 @@
'state': '531.75',
})
# ---
# name: test_sensor[gas last transmitted]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': None,
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': <RegistryEntryDisabler.INTEGRATION: 'integration'>,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.gas_teststrasse_1_last_transmitted',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'name': None,
'options': dict({
}),
'original_device_class': <SensorDeviceClass.TIMESTAMP: 'timestamp'>,
'original_icon': None,
'original_name': 'Last transmitted',
'platform': 'discovergy',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'last_transmitted',
'unique_id': 'def456-last_transmitted',
'unit_of_measurement': None,
})
# ---
# name: test_sensor[gas last transmitted].1
None
# ---
# name: test_sensor[gas total consumption]
EntityRegistryEntrySnapshot({
'aliases': set({

View File

@ -16,12 +16,16 @@ from homeassistant.helpers import entity_registry as er
[
"sensor.electricity_teststrasse_1_total_consumption",
"sensor.electricity_teststrasse_1_total_power",
"sensor.electricity_teststrasse_1_last_transmitted",
"sensor.gas_teststrasse_1_total_gas_consumption",
"sensor.gas_teststrasse_1_last_transmitted",
],
ids=[
"electricity total consumption",
"electricity total power",
"electricity last transmitted",
"gas total consumption",
"gas last transmitted",
],
)
@pytest.mark.usefixtures("setup_integration")