Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor for RymPro meters."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
8  SensorDeviceClass,
9  SensorEntity,
10  SensorEntityDescription,
11  SensorStateClass,
12 )
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.const import UnitOfVolume
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.device_registry import DeviceInfo
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 from homeassistant.helpers.update_coordinator import CoordinatorEntity
19 
20 from .const import DOMAIN
21 from .coordinator import RymProDataUpdateCoordinator
22 
23 
24 @dataclass(kw_only=True, frozen=True)
26  """Class describing RymPro sensor entities."""
27 
28  value_key: str
29 
30 
31 SENSOR_DESCRIPTIONS: tuple[RymProSensorEntityDescription, ...] = (
33  key="total_consumption",
34  translation_key="total_consumption",
35  state_class=SensorStateClass.TOTAL_INCREASING,
36  suggested_display_precision=3,
37  value_key="read",
38  ),
40  key="monthly_forecast",
41  translation_key="monthly_forecast",
42  suggested_display_precision=3,
43  value_key="consumption_forecast",
44  ),
45 )
46 
47 
49  hass: HomeAssistant,
50  config_entry: ConfigEntry,
51  async_add_entities: AddEntitiesCallback,
52 ) -> None:
53  """Set up sensors for device."""
54  coordinator: RymProDataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]
56  RymProSensor(coordinator, meter_id, description, config_entry.entry_id)
57  for meter_id, meter in coordinator.data.items()
58  for description in SENSOR_DESCRIPTIONS
59  )
60 
61 
62 class RymProSensor(CoordinatorEntity[RymProDataUpdateCoordinator], SensorEntity):
63  """Sensor for RymPro meters."""
64 
65  _attr_has_entity_name = True
66  _attr_device_class = SensorDeviceClass.WATER
67  _attr_native_unit_of_measurement = UnitOfVolume.CUBIC_METERS
68  entity_description: RymProSensorEntityDescription
69 
70  def __init__(
71  self,
72  coordinator: RymProDataUpdateCoordinator,
73  meter_id: int,
74  description: RymProSensorEntityDescription,
75  entry_id: str,
76  ) -> None:
77  """Initialize sensor."""
78  super().__init__(coordinator)
79  self._meter_id_meter_id = meter_id
80  unique_id = f"{entry_id}_{meter_id}"
81  self._attr_unique_id_attr_unique_id = f"{unique_id}_{description.key}"
82  self._attr_extra_state_attributes_attr_extra_state_attributes = {"meter_id": str(meter_id)}
83  self._attr_device_info_attr_device_info = DeviceInfo(
84  identifiers={(DOMAIN, unique_id)},
85  manufacturer="Read Your Meter Pro",
86  name=f"Meter {meter_id}",
87  )
88  self.entity_descriptionentity_description = description
89 
90  @property
91  def native_value(self) -> float | None:
92  """Return the state of the sensor."""
93  return self.coordinator.data[self._meter_id_meter_id][self.entity_descriptionentity_description.value_key]
None __init__(self, RymProDataUpdateCoordinator coordinator, int meter_id, RymProSensorEntityDescription description, str entry_id)
Definition: sensor.py:76
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:52