Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Battery Charge and Range Support for the Nissan Leaf."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
8 from homeassistant.const import PERCENTAGE, UnitOfLength
9 from homeassistant.core import HomeAssistant
10 from homeassistant.helpers.entity_platform import AddEntitiesCallback
11 from homeassistant.helpers.icon import icon_for_battery_level
12 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType
13 from homeassistant.util.unit_conversion import DistanceConverter
14 from homeassistant.util.unit_system import US_CUSTOMARY_SYSTEM
15 
16 from . import LeafDataStore
17 from .const import (
18  DATA_BATTERY,
19  DATA_CHARGING,
20  DATA_LEAF,
21  DATA_RANGE_AC,
22  DATA_RANGE_AC_OFF,
23 )
24 from .entity import LeafEntity
25 
26 _LOGGER = logging.getLogger(__name__)
27 
28 
30  hass: HomeAssistant,
31  config: ConfigType,
32  add_entities: AddEntitiesCallback,
33  discovery_info: DiscoveryInfoType | None = None,
34 ) -> None:
35  """Sensors setup."""
36  if discovery_info is None:
37  return
38 
39  entities: list[LeafEntity] = []
40  for vin, datastore in hass.data[DATA_LEAF].items():
41  _LOGGER.debug("Adding sensors for vin=%s", vin)
42  entities.append(LeafBatterySensor(datastore))
43  entities.append(LeafRangeSensor(datastore, True))
44  entities.append(LeafRangeSensor(datastore, False))
45 
46  add_entities(entities, True)
47 
48 
50  """Nissan Leaf Battery Sensor."""
51 
52  _attr_device_class = SensorDeviceClass.BATTERY
53  _attr_native_unit_of_measurement = PERCENTAGE
54 
55  def __init__(self, car: LeafDataStore) -> None:
56  """Set up battery sensor."""
57  super().__init__(car)
58  self._attr_unique_id_attr_unique_id = f"{self.car.leaf.vin.lower()}_soc"
59 
60  @property
61  def name(self) -> str:
62  """Sensor Name."""
63  return f"{self.car.leaf.nickname} Charge"
64 
65  @property
66  def native_value(self) -> StateType:
67  """Battery state percentage."""
68  if self.carcar.data[DATA_BATTERY] is None:
69  return None
70  return round(self.carcar.data[DATA_BATTERY]) # type: ignore[no-any-return]
71 
72  @property
73  def icon(self) -> str:
74  """Battery state icon handling."""
75  chargestate = self.carcar.data[DATA_CHARGING]
76  return icon_for_battery_level(battery_level=self.statestatestate, charging=chargestate)
77 
78 
80  """Nissan Leaf Range Sensor."""
81 
82  _attr_icon = "mdi:speedometer"
83 
84  def __init__(self, car: LeafDataStore, ac_on: bool) -> None:
85  """Set up range sensor. Store if AC on."""
86  self._ac_on_ac_on = ac_on
87  super().__init__(car)
88  if ac_on:
89  self._attr_unique_id_attr_unique_id = f"{self.car.leaf.vin.lower()}_range_ac"
90  else:
91  self._attr_unique_id_attr_unique_id = f"{self.car.leaf.vin.lower()}_range"
92 
93  @property
94  def name(self) -> str:
95  """Update sensor name depending on AC."""
96  if self._ac_on_ac_on is True:
97  return f"{self.car.leaf.nickname} Range (AC)"
98  return f"{self.car.leaf.nickname} Range"
99 
100  def log_registration(self) -> None:
101  """Log registration."""
102  _LOGGER.debug(
103  "Registered LeafRangeSensor integration with Home Assistant for VIN %s",
104  self.carcar.leaf.vin,
105  )
106 
107  @property
108  def native_value(self) -> float | None:
109  """Battery range in miles or kms."""
110  ret: float | None
111  if self._ac_on_ac_on:
112  ret = self.carcar.data[DATA_RANGE_AC]
113  else:
114  ret = self.carcar.data[DATA_RANGE_AC_OFF]
115 
116  if ret is None:
117  return None
118 
119  if self.carcar.hass.config.units is US_CUSTOMARY_SYSTEM or self.carcar.force_miles:
120  ret = DistanceConverter.convert(
121  ret, UnitOfLength.KILOMETERS, UnitOfLength.MILES
122  )
123 
124  return round(ret)
125 
126  @property
127  def native_unit_of_measurement(self) -> str:
128  """Battery range unit."""
129  if self.carcar.hass.config.units is US_CUSTOMARY_SYSTEM or self.carcar.force_miles:
130  return UnitOfLength.MILES
131  return UnitOfLength.KILOMETERS
None __init__(self, LeafDataStore car, bool ac_on)
Definition: sensor.py:84
def add_entities(account, async_add_entities, tracked)
Definition: sensor.py:40
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:34
str icon_for_battery_level(int|None battery_level=None, bool charging=False)
Definition: icon.py:169