1 """Discovergy sensor entity."""
3 from collections.abc
import Callable
4 from dataclasses
import dataclass, field
5 from datetime
import datetime
7 from pydiscovergy.models
import Reading
12 SensorEntityDescription,
17 UnitOfElectricPotential,
27 from .
import DiscovergyConfigEntry
28 from .const
import DOMAIN, MANUFACTURER
29 from .coordinator
import DiscovergyUpdateCoordinator
32 def _get_and_scale(reading: Reading, key: str, scale: int) -> datetime | float |
None:
33 """Get a value from a Reading and divide with scale it."""
34 if (value := reading.values.get(key))
is not None:
39 @dataclass(frozen=True, kw_only=True)
41 """Class to describe a Discovergy sensor entity."""
43 value_fn: Callable[[Reading, str, int], datetime | float |
None] = field(
44 default=_get_and_scale
46 alternative_keys: list[str] = field(default_factory=list)
47 scale: int = field(default_factory=
lambda: 1000)
50 GAS_SENSORS: tuple[DiscovergySensorEntityDescription, ...] = (
53 translation_key=
"total_gas_consumption",
54 suggested_display_precision=4,
55 native_unit_of_measurement=UnitOfVolume.CUBIC_METERS,
56 device_class=SensorDeviceClass.GAS,
57 state_class=SensorStateClass.TOTAL_INCREASING,
61 ELECTRICITY_SENSORS: tuple[DiscovergySensorEntityDescription, ...] = (
65 translation_key=
"total_power",
66 native_unit_of_measurement=UnitOfPower.WATT,
67 suggested_display_precision=3,
68 device_class=SensorDeviceClass.POWER,
69 state_class=SensorStateClass.MEASUREMENT,
73 translation_key=
"phase_1_power",
74 native_unit_of_measurement=UnitOfPower.WATT,
75 suggested_display_precision=3,
76 device_class=SensorDeviceClass.POWER,
77 state_class=SensorStateClass.MEASUREMENT,
78 entity_registry_enabled_default=
False,
79 alternative_keys=[
"phase1Power"],
83 translation_key=
"phase_2_power",
84 native_unit_of_measurement=UnitOfPower.WATT,
85 suggested_display_precision=3,
86 device_class=SensorDeviceClass.POWER,
87 state_class=SensorStateClass.MEASUREMENT,
88 entity_registry_enabled_default=
False,
89 alternative_keys=[
"phase2Power"],
93 translation_key=
"phase_3_power",
94 native_unit_of_measurement=UnitOfPower.WATT,
95 suggested_display_precision=3,
96 device_class=SensorDeviceClass.POWER,
97 state_class=SensorStateClass.MEASUREMENT,
98 entity_registry_enabled_default=
False,
99 alternative_keys=[
"phase3Power"],
104 translation_key=
"phase_1_voltage",
105 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
106 suggested_display_precision=1,
107 device_class=SensorDeviceClass.VOLTAGE,
108 state_class=SensorStateClass.MEASUREMENT,
109 entity_registry_enabled_default=
False,
110 alternative_keys=[
"voltage1"],
114 translation_key=
"phase_2_voltage",
115 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
116 suggested_display_precision=1,
117 device_class=SensorDeviceClass.VOLTAGE,
118 state_class=SensorStateClass.MEASUREMENT,
119 entity_registry_enabled_default=
False,
120 alternative_keys=[
"voltage2"],
124 translation_key=
"phase_3_voltage",
125 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
126 suggested_display_precision=1,
127 device_class=SensorDeviceClass.VOLTAGE,
128 state_class=SensorStateClass.MEASUREMENT,
129 entity_registry_enabled_default=
False,
130 alternative_keys=[
"voltage3"],
135 translation_key=
"total_consumption",
136 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
137 suggested_display_precision=4,
138 device_class=SensorDeviceClass.ENERGY,
139 state_class=SensorStateClass.TOTAL_INCREASING,
144 translation_key=
"total_production",
145 native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
146 suggested_display_precision=4,
147 device_class=SensorDeviceClass.ENERGY,
148 state_class=SensorStateClass.TOTAL_INCREASING,
153 ADDITIONAL_SENSORS: tuple[DiscovergySensorEntityDescription, ...] = (
155 key=
"last_transmitted",
156 translation_key=
"last_transmitted",
157 device_class=SensorDeviceClass.TIMESTAMP,
158 entity_category=EntityCategory.DIAGNOSTIC,
159 entity_registry_enabled_default=
False,
160 value_fn=
lambda reading, key, scale: reading.time,
167 entry: DiscovergyConfigEntry,
168 async_add_entities: AddEntitiesCallback,
170 """Set up the Discovergy sensors."""
171 entities: list[DiscovergySensor] = []
172 for coordinator
in entry.runtime_data:
173 sensors: tuple[DiscovergySensorEntityDescription, ...] = ()
176 if coordinator.meter.measurement_type ==
"ELECTRICITY":
177 sensors = ELECTRICITY_SENSORS + ADDITIONAL_SENSORS
178 elif coordinator.meter.measurement_type ==
"GAS":
179 sensors = GAS_SENSORS + ADDITIONAL_SENSORS
183 for description
in sensors
184 for value_key
in {description.key, *description.alternative_keys}
185 if description.value_fn(coordinator.data, value_key, description.scale)
193 """Represents a Discovergy smart meter sensor."""
195 entity_description: DiscovergySensorEntityDescription
197 _attr_has_entity_name =
True
202 description: DiscovergySensorEntityDescription,
203 coordinator: DiscovergyUpdateCoordinator,
205 """Initialize the sensor."""
211 meter = coordinator.meter
214 identifiers={(DOMAIN, meter.meter_id)},
215 name=f
"{meter.measurement_type.capitalize()} {meter.location.street} {meter.location.street_number}",
216 model=meter.meter_type,
217 manufacturer=MANUFACTURER,
218 serial_number=meter.full_serial_number,
223 """Return the sensor state."""
datetime|float|None native_value(self)
None __init__(self, str data_key, DiscovergySensorEntityDescription description, DiscovergyUpdateCoordinator coordinator)
datetime|float|None _get_and_scale(Reading reading, str key, int scale)
None async_setup_entry(HomeAssistant hass, DiscovergyConfigEntry entry, AddEntitiesCallback async_add_entities)