Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Genius Hub sensor devices."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 from typing import Any
7 
8 from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
9 from homeassistant.const import PERCENTAGE
10 from homeassistant.core import HomeAssistant
11 from homeassistant.helpers.entity_platform import AddEntitiesCallback
12 import homeassistant.util.dt as dt_util
13 
14 from . import GeniusHubConfigEntry
15 from .entity import GeniusDevice, GeniusEntity
16 
17 GH_STATE_ATTR = "batteryLevel"
18 
19 GH_LEVEL_MAPPING = {
20  "error": "Errors",
21  "warning": "Warnings",
22  "information": "Information",
23 }
24 
25 
27  hass: HomeAssistant,
28  entry: GeniusHubConfigEntry,
29  async_add_entities: AddEntitiesCallback,
30 ) -> None:
31  """Set up the Genius Hub sensor entities."""
32 
33  broker = entry.runtime_data
34 
35  entities: list[GeniusBattery | GeniusIssue] = [
36  GeniusBattery(broker, d, GH_STATE_ATTR)
37  for d in broker.client.device_objs
38  if GH_STATE_ATTR in d.data["state"]
39  ]
40  entities.extend([GeniusIssue(broker, i) for i in list(GH_LEVEL_MAPPING)])
41 
42  async_add_entities(entities)
43 
44 
46  """Representation of a Genius Hub sensor."""
47 
48  _attr_device_class = SensorDeviceClass.BATTERY
49  _attr_native_unit_of_measurement = PERCENTAGE
50 
51  def __init__(self, broker, device, state_attr) -> None:
52  """Initialize the sensor."""
53  super().__init__(broker, device)
54 
55  self._state_attr_state_attr_state_attr = state_attr
56 
57  self._attr_name_attr_name = f"{device.type} {device.id}"
58 
59  @property
60  def icon(self) -> str:
61  """Return the icon of the sensor."""
62  if "_state" in self._device_device.data: # only for v3 API
63  interval = timedelta(
64  seconds=self._device_device.data["_state"].get("wakeupInterval", 30 * 60)
65  )
66  if (
67  not self._last_comms_last_comms
68  or self._last_comms_last_comms < dt_util.utcnow() - interval * 3
69  ):
70  return "mdi:battery-unknown"
71 
72  battery_level = self._device_device.data["state"][self._state_attr_state_attr_state_attr]
73  if battery_level == 255:
74  return "mdi:battery-unknown"
75  if battery_level < 40:
76  return "mdi:battery-alert"
77 
78  icon = "mdi:battery"
79  if battery_level <= 95:
80  icon += f"-{int(round(battery_level / 10 - 0.01)) * 10}"
81 
82  return icon
83 
84  @property
85  def native_value(self) -> int:
86  """Return the state of the sensor."""
87  level = self._device_device.data["state"][self._state_attr_state_attr_state_attr]
88  return level if level != 255 else 0
89 
90 
92  """Representation of a Genius Hub sensor."""
93 
94  def __init__(self, broker, level) -> None:
95  """Initialize the sensor."""
96  super().__init__()
97 
98  self._hub_hub = broker.client
99  self._unique_id_unique_id = f"{broker.hub_uid}_{GH_LEVEL_MAPPING[level]}"
100 
101  self._attr_name_attr_name = f"GeniusHub {GH_LEVEL_MAPPING[level]}"
102  self._level_level = level
103  self._issues_issues: list = []
104 
105  @property
106  def native_value(self) -> int:
107  """Return the number of issues."""
108  return len(self._issues_issues)
109 
110  @property
111  def extra_state_attributes(self) -> dict[str, Any]:
112  """Return the device state attributes."""
113  return {f"{self._level}_list": self._issues_issues}
114 
115  async def async_update(self) -> None:
116  """Process the sensor's state data."""
117  self._issues_issues = [
118  i["description"] for i in self._hub_hub.issues if i["level"] == self._level_level
119  ]
None __init__(self, broker, device, state_attr)
Definition: sensor.py:51
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, GeniusHubConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:30