Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Smart Meter Texas sensors."""
2 
3 from smart_meter_texas import Meter
4 
6  SensorDeviceClass,
7  SensorEntity,
8  SensorStateClass,
9 )
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.const import CONF_ADDRESS, UnitOfEnergy
12 from homeassistant.core import HomeAssistant, callback
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 from homeassistant.helpers.restore_state import RestoreEntity
16  CoordinatorEntity,
17  DataUpdateCoordinator,
18 )
19 
20 from .const import (
21  DATA_COORDINATOR,
22  DATA_SMART_METER,
23  DOMAIN,
24  ELECTRIC_METER,
25  ESIID,
26  METER_NUMBER,
27 )
28 
29 
31  hass: HomeAssistant,
32  config_entry: ConfigEntry,
33  async_add_entities: AddEntitiesCallback,
34 ) -> None:
35  """Set up the Smart Meter Texas sensors."""
36  coordinator = hass.data[DOMAIN][config_entry.entry_id][DATA_COORDINATOR]
37  meters = hass.data[DOMAIN][config_entry.entry_id][DATA_SMART_METER].meters
38 
40  [SmartMeterTexasSensor(meter, coordinator) for meter in meters], False
41  )
42 
43 
44 # pylint: disable-next=hass-invalid-inheritance # needs fixing
46  """Representation of an Smart Meter Texas sensor."""
47 
48  _attr_device_class = SensorDeviceClass.ENERGY
49  _attr_state_class = SensorStateClass.TOTAL_INCREASING
50  _attr_native_unit_of_measurement = UnitOfEnergy.KILO_WATT_HOUR
51  _attr_available = False
52 
53  def __init__(self, meter: Meter, coordinator: DataUpdateCoordinator) -> None:
54  """Initialize the sensor."""
55  super().__init__(coordinator)
56  self.metermeter = meter
57  self._attr_name_attr_name = f"{ELECTRIC_METER} {meter.meter}"
58  self._attr_unique_id_attr_unique_id = f"{meter.esiid}_{meter.meter}"
59 
60  @property
62  """Return the device specific state attributes."""
63  return {
64  METER_NUMBER: self.metermeter.meter,
65  ESIID: self.metermeter.esiid,
66  CONF_ADDRESS: self.metermeter.address,
67  }
68 
69  @callback
70  def _state_update(self):
71  """Call when the coordinator has an update."""
72  self._attr_available_attr_available_attr_available = self.coordinator.last_update_success
73  if self._attr_available_attr_available_attr_available:
74  self._attr_native_value_attr_native_value = self.metermeter.reading
75  self.async_write_ha_stateasync_write_ha_state()
76 
77  async def async_added_to_hass(self):
78  """Subscribe to updates."""
79  await super().async_added_to_hass()
80  self.async_on_removeasync_on_remove(self.coordinator.async_add_listener(self._state_update_state_update))
81 
82  # If the background update finished before
83  # we added the entity, there is no need to restore
84  # state.
85  if self.coordinator.last_update_success:
86  return
87 
88  if last_state := await self.async_get_last_stateasync_get_last_state():
89  self._attr_native_value_attr_native_value = last_state.state
90  self._attr_available_attr_available_attr_available = True
None __init__(self, Meter meter, DataUpdateCoordinator coordinator)
Definition: sensor.py:53
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
None async_add_listener(HomeAssistant hass, Callable[[], None] listener)
Definition: __init__.py:82
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:34