Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor for Suez Water Consumption data."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Mapping
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from pysuez.const import ATTRIBUTION
10 
12  SensorDeviceClass,
13  SensorEntity,
14  SensorEntityDescription,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.const import CURRENCY_EURO, UnitOfVolume
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 from homeassistant.helpers.update_coordinator import CoordinatorEntity
22 
23 from .const import CONF_COUNTER_ID, DOMAIN
24 from .coordinator import SuezWaterCoordinator, SuezWaterData
25 
26 
27 @dataclass(frozen=True, kw_only=True)
29  """Describes Suez water sensor entity."""
30 
31  value_fn: Callable[[SuezWaterData], float | str | None]
32  attr_fn: Callable[[SuezWaterData], Mapping[str, Any] | None] = lambda _: None
33 
34 
35 SENSORS: tuple[SuezWaterSensorEntityDescription, ...] = (
37  key="water_usage_yesterday",
38  translation_key="water_usage_yesterday",
39  native_unit_of_measurement=UnitOfVolume.LITERS,
40  device_class=SensorDeviceClass.WATER,
41  value_fn=lambda suez_data: suez_data.aggregated_value,
42  attr_fn=lambda suez_data: suez_data.aggregated_attr,
43  ),
45  key="water_price",
46  translation_key="water_price",
47  native_unit_of_measurement=CURRENCY_EURO,
48  device_class=SensorDeviceClass.MONETARY,
49  value_fn=lambda suez_data: suez_data.price,
50  ),
51 )
52 
53 
55  hass: HomeAssistant,
56  entry: ConfigEntry,
57  async_add_entities: AddEntitiesCallback,
58 ) -> None:
59  """Set up Suez Water sensor from a config entry."""
60  coordinator = hass.data[DOMAIN][entry.entry_id]
61  counter_id = entry.data[CONF_COUNTER_ID]
62 
64  SuezWaterSensor(coordinator, counter_id, description) for description in SENSORS
65  )
66 
67 
68 class SuezWaterSensor(CoordinatorEntity[SuezWaterCoordinator], SensorEntity):
69  """Representation of a Suez water sensor."""
70 
71  _attr_has_entity_name = True
72  _attr_attribution = ATTRIBUTION
73  entity_description: SuezWaterSensorEntityDescription
74 
75  def __init__(
76  self,
77  coordinator: SuezWaterCoordinator,
78  counter_id: int,
79  entity_description: SuezWaterSensorEntityDescription,
80  ) -> None:
81  """Initialize the suez water sensor entity."""
82  super().__init__(coordinator)
83  self._attr_unique_id_attr_unique_id = f"{counter_id}_{entity_description.key}"
84  self._attr_device_info_attr_device_info = DeviceInfo(
85  identifiers={(DOMAIN, str(counter_id))},
86  entry_type=DeviceEntryType.SERVICE,
87  manufacturer="Suez",
88  )
89  self.entity_descriptionentity_description = entity_description
90 
91  @property
92  def native_value(self) -> float | str | None:
93  """Return the state of the sensor."""
94  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
95 
96  @property
97  def extra_state_attributes(self) -> Mapping[str, Any] | None:
98  """Return extra state of the sensor."""
99  return self.entity_descriptionentity_description.attr_fn(self.coordinator.data)
None __init__(self, SuezWaterCoordinator coordinator, int counter_id, SuezWaterSensorEntityDescription entity_description)
Definition: sensor.py:80
Mapping[str, Any]|None extra_state_attributes(self)
Definition: sensor.py:97
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:58