Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Blue Current sensors."""
2 
3 from __future__ import annotations
4 
6  SensorDeviceClass,
7  SensorEntity,
8  SensorEntityDescription,
9  SensorStateClass,
10 )
11 from homeassistant.const import (
12  CURRENCY_EURO,
13  UnitOfElectricCurrent,
14  UnitOfElectricPotential,
15  UnitOfEnergy,
16  UnitOfPower,
17 )
18 from homeassistant.core import HomeAssistant, callback
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from . import BlueCurrentConfigEntry, Connector
22 from .const import DOMAIN
23 from .entity import BlueCurrentEntity, ChargepointEntity
24 
25 SENSORS = (
27  key="actual_v1",
28  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
29  device_class=SensorDeviceClass.VOLTAGE,
30  translation_key="actual_v1",
31  entity_registry_enabled_default=False,
32  state_class=SensorStateClass.MEASUREMENT,
33  ),
35  key="actual_v2",
36  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
37  device_class=SensorDeviceClass.VOLTAGE,
38  translation_key="actual_v2",
39  entity_registry_enabled_default=False,
40  state_class=SensorStateClass.MEASUREMENT,
41  ),
43  key="actual_v3",
44  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
45  device_class=SensorDeviceClass.VOLTAGE,
46  translation_key="actual_v3",
47  entity_registry_enabled_default=False,
48  state_class=SensorStateClass.MEASUREMENT,
49  ),
51  key="avg_voltage",
52  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
53  device_class=SensorDeviceClass.VOLTAGE,
54  translation_key="avg_voltage",
55  state_class=SensorStateClass.MEASUREMENT,
56  ),
58  key="actual_p1",
59  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
60  device_class=SensorDeviceClass.CURRENT,
61  translation_key="actual_p1",
62  entity_registry_enabled_default=False,
63  state_class=SensorStateClass.MEASUREMENT,
64  ),
66  key="actual_p2",
67  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
68  device_class=SensorDeviceClass.CURRENT,
69  translation_key="actual_p2",
70  entity_registry_enabled_default=False,
71  state_class=SensorStateClass.MEASUREMENT,
72  ),
74  key="actual_p3",
75  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
76  device_class=SensorDeviceClass.CURRENT,
77  translation_key="actual_p3",
78  entity_registry_enabled_default=False,
79  state_class=SensorStateClass.MEASUREMENT,
80  ),
82  key="avg_current",
83  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
84  device_class=SensorDeviceClass.CURRENT,
85  translation_key="avg_current",
86  state_class=SensorStateClass.MEASUREMENT,
87  ),
89  key="total_kw",
90  native_unit_of_measurement=UnitOfPower.KILO_WATT,
91  device_class=SensorDeviceClass.POWER,
92  translation_key="total_kw",
93  state_class=SensorStateClass.MEASUREMENT,
94  ),
96  key="actual_kwh",
97  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
98  device_class=SensorDeviceClass.ENERGY,
99  translation_key="actual_kwh",
100  state_class=SensorStateClass.TOTAL_INCREASING,
101  ),
103  key="total_cost",
104  native_unit_of_measurement=CURRENCY_EURO,
105  device_class=SensorDeviceClass.MONETARY,
106  translation_key="total_cost",
107  ),
109  key="vehicle_status",
110  device_class=SensorDeviceClass.ENUM,
111  options=["standby", "vehicle_detected", "ready", "no_power", "vehicle_error"],
112  translation_key="vehicle_status",
113  ),
115  key="activity",
116  device_class=SensorDeviceClass.ENUM,
117  options=["available", "charging", "unavailable", "error", "offline"],
118  translation_key="activity",
119  ),
121  key="max_usage",
122  translation_key="max_usage",
123  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
124  device_class=SensorDeviceClass.CURRENT,
125  state_class=SensorStateClass.MEASUREMENT,
126  ),
128  key="smartcharging_max_usage",
129  translation_key="smartcharging_max_usage",
130  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
131  entity_registry_enabled_default=False,
132  device_class=SensorDeviceClass.CURRENT,
133  state_class=SensorStateClass.MEASUREMENT,
134  ),
136  key="max_offline",
137  translation_key="max_offline",
138  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
139  entity_registry_enabled_default=False,
140  device_class=SensorDeviceClass.CURRENT,
141  state_class=SensorStateClass.MEASUREMENT,
142  ),
144  key="current_left",
145  translation_key="current_left",
146  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
147  entity_registry_enabled_default=False,
148  device_class=SensorDeviceClass.CURRENT,
149  state_class=SensorStateClass.MEASUREMENT,
150  ),
151 )
152 
153 TIMESTAMP_SENSORS = (
155  key="start_datetime",
156  translation_key="start_datetime",
157  ),
159  key="stop_datetime",
160  translation_key="stop_datetime",
161  ),
163  key="offline_since",
164  translation_key="offline_since",
165  ),
166 )
167 
168 GRID_SENSORS = (
170  key="grid_actual_p1",
171  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
172  device_class=SensorDeviceClass.CURRENT,
173  translation_key="grid_actual_p1",
174  entity_registry_enabled_default=False,
175  state_class=SensorStateClass.MEASUREMENT,
176  ),
178  key="grid_actual_p2",
179  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
180  device_class=SensorDeviceClass.CURRENT,
181  translation_key="grid_actual_p2",
182  entity_registry_enabled_default=False,
183  state_class=SensorStateClass.MEASUREMENT,
184  ),
186  key="grid_actual_p3",
187  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
188  device_class=SensorDeviceClass.CURRENT,
189  translation_key="grid_actual_p3",
190  entity_registry_enabled_default=False,
191  state_class=SensorStateClass.MEASUREMENT,
192  ),
194  key="grid_avg_current",
195  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
196  device_class=SensorDeviceClass.CURRENT,
197  translation_key="grid_avg_current",
198  state_class=SensorStateClass.MEASUREMENT,
199  ),
201  key="grid_max_current",
202  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
203  device_class=SensorDeviceClass.CURRENT,
204  translation_key="grid_max_current",
205  state_class=SensorStateClass.MEASUREMENT,
206  ),
207 )
208 
209 PARALLEL_UPDATES = 1
210 
211 
213  hass: HomeAssistant,
214  entry: BlueCurrentConfigEntry,
215  async_add_entities: AddEntitiesCallback,
216 ) -> None:
217  """Set up Blue Current sensors."""
218  connector = entry.runtime_data
219  sensor_list: list[SensorEntity] = [
220  ChargePointSensor(connector, sensor, evse_id)
221  for evse_id in connector.charge_points
222  for sensor in SENSORS
223  ]
224 
225  sensor_list.extend(
226  [
227  ChargePointTimestampSensor(connector, sensor, evse_id)
228  for evse_id in connector.charge_points
229  for sensor in TIMESTAMP_SENSORS
230  ]
231  )
232 
233  sensor_list.extend(GridSensor(connector, sensor) for sensor in GRID_SENSORS)
234 
235  async_add_entities(sensor_list)
236 
237 
239  """Define a charge point sensor."""
240 
241  def __init__(
242  self,
243  connector: Connector,
244  sensor: SensorEntityDescription,
245  evse_id: str,
246  ) -> None:
247  """Initialize the sensor."""
248  super().__init__(connector, evse_id)
249 
250  self.keykey = sensor.key
251  self.entity_descriptionentity_description = sensor
252  self._attr_unique_id_attr_unique_id = f"{sensor.key}_{evse_id}"
253 
254  @callback
255  def update_from_latest_data(self) -> None:
256  """Update the sensor from the latest data."""
257 
258  new_value = self.connectorconnector.charge_points[self.evse_idevse_id].get(self.keykey)
259 
260  if new_value is not None:
261  self.has_valuehas_valuehas_value = True
262  self._attr_native_value_attr_native_value = new_value
263 
264  else:
265  self.has_valuehas_valuehas_value = False
266 
267 
269  """Define a timestamp sensor."""
270 
271  _attr_device_class = SensorDeviceClass.TIMESTAMP
272 
273  @callback
274  def update_from_latest_data(self) -> None:
275  """Update the sensor from the latest data."""
276  new_value = self.connectorconnector.charge_points[self.evse_idevse_id].get(self.keykey)
277 
278  # only update if the new_value is a newer timestamp.
279  if new_value is not None and (
280  self.has_valuehas_valuehas_valuehas_value is False or self._attr_native_value_attr_native_value_attr_native_value < new_value
281  ):
282  self.has_valuehas_valuehas_valuehas_value = True
283  self._attr_native_value_attr_native_value_attr_native_value = new_value
284 
285 
287  """Define a grid sensor."""
288 
289  def __init__(
290  self,
291  connector: Connector,
292  sensor: SensorEntityDescription,
293  ) -> None:
294  """Initialize the sensor."""
295  super().__init__(connector, f"{DOMAIN}_grid_update")
296 
297  self.keykey = sensor.key
298  self.entity_descriptionentity_description = sensor
299  self._attr_unique_id_attr_unique_id = sensor.key
300 
301  @callback
302  def update_from_latest_data(self) -> None:
303  """Update the grid sensor from the latest data."""
304 
305  new_value = self.connectorconnector.grid.get(self.keykey)
306 
307  if new_value is not None:
308  self.has_valuehas_valuehas_value = True
309  self._attr_native_value_attr_native_value = new_value
310 
311  else:
312  self.has_valuehas_valuehas_value = False
None __init__(self, Connector connector, SensorEntityDescription sensor, str evse_id)
Definition: sensor.py:246
None __init__(self, Connector connector, SensorEntityDescription sensor)
Definition: sensor.py:293
None async_setup_entry(HomeAssistant hass, BlueCurrentConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:216
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88