Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor platform for Roomba."""
2 
3 from collections.abc import Callable
4 from dataclasses import dataclass
5 
6 from roombapy import Roomba
7 
9  SensorDeviceClass,
10  SensorEntity,
11  SensorEntityDescription,
12  SensorStateClass,
13 )
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfArea, UnitOfTime
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 from homeassistant.helpers.typing import StateType
19 
20 from .const import DOMAIN
21 from .entity import IRobotEntity
22 from .models import RoombaData
23 
24 
25 @dataclass(frozen=True, kw_only=True)
27  """Immutable class for describing Roomba data."""
28 
29  value_fn: Callable[[IRobotEntity], StateType]
30 
31 
32 SENSORS: list[RoombaSensorEntityDescription] = [
34  key="battery",
35  native_unit_of_measurement=PERCENTAGE,
36  device_class=SensorDeviceClass.BATTERY,
37  entity_category=EntityCategory.DIAGNOSTIC,
38  value_fn=lambda self: self.battery_level,
39  ),
41  key="battery_cycles",
42  translation_key="battery_cycles",
43  state_class=SensorStateClass.MEASUREMENT,
44  entity_category=EntityCategory.DIAGNOSTIC,
45  value_fn=lambda self: self.battery_stats.get("nLithChrg")
46  or self.battery_stats.get("nNimhChrg"),
47  ),
49  key="total_cleaning_time",
50  translation_key="total_cleaning_time",
51  native_unit_of_measurement=UnitOfTime.HOURS,
52  entity_category=EntityCategory.DIAGNOSTIC,
53  value_fn=lambda self: self.run_stats.get("hr"),
54  ),
56  key="average_mission_time",
57  translation_key="average_mission_time",
58  native_unit_of_measurement=UnitOfTime.MINUTES,
59  entity_category=EntityCategory.DIAGNOSTIC,
60  value_fn=lambda self: self.mission_stats.get("aMssnM"),
61  ),
63  key="total_missions",
64  translation_key="total_missions",
65  state_class=SensorStateClass.MEASUREMENT,
66  native_unit_of_measurement="Missions",
67  entity_category=EntityCategory.DIAGNOSTIC,
68  value_fn=lambda self: self.mission_stats.get("nMssn"),
69  ),
71  key="successful_missions",
72  translation_key="successful_missions",
73  state_class=SensorStateClass.MEASUREMENT,
74  native_unit_of_measurement="Missions",
75  entity_category=EntityCategory.DIAGNOSTIC,
76  value_fn=lambda self: self.mission_stats.get("nMssnOk"),
77  ),
79  key="canceled_missions",
80  translation_key="canceled_missions",
81  state_class=SensorStateClass.MEASUREMENT,
82  native_unit_of_measurement="Missions",
83  entity_category=EntityCategory.DIAGNOSTIC,
84  value_fn=lambda self: self.mission_stats.get("nMssnC"),
85  ),
87  key="failed_missions",
88  translation_key="failed_missions",
89  state_class=SensorStateClass.MEASUREMENT,
90  native_unit_of_measurement="Missions",
91  entity_category=EntityCategory.DIAGNOSTIC,
92  value_fn=lambda self: self.mission_stats.get("nMssnF"),
93  ),
95  key="scrubs_count",
96  translation_key="scrubs_count",
97  state_class=SensorStateClass.MEASUREMENT,
98  native_unit_of_measurement="Scrubs",
99  entity_category=EntityCategory.DIAGNOSTIC,
100  value_fn=lambda self: self.run_stats.get("nScrubs"),
101  entity_registry_enabled_default=False,
102  ),
104  key="total_cleaned_area",
105  translation_key="total_cleaned_area",
106  native_unit_of_measurement=UnitOfArea.SQUARE_METERS,
107  entity_category=EntityCategory.DIAGNOSTIC,
108  value_fn=lambda self: (
109  None if (sqft := self.run_stats.get("sqft")) is None else sqft * 9.29
110  ),
111  suggested_display_precision=0,
112  entity_registry_enabled_default=False,
113  ),
115  key="last_mission",
116  translation_key="last_mission",
117  device_class=SensorDeviceClass.TIMESTAMP,
118  entity_category=EntityCategory.DIAGNOSTIC,
119  value_fn=lambda self: self.last_mission,
120  entity_registry_enabled_default=False,
121  ),
122 ]
123 
124 
126  hass: HomeAssistant,
127  config_entry: ConfigEntry,
128  async_add_entities: AddEntitiesCallback,
129 ) -> None:
130  """Set up the iRobot Roomba vacuum cleaner."""
131  domain_data: RoombaData = hass.data[DOMAIN][config_entry.entry_id]
132  roomba = domain_data.roomba
133  blid = domain_data.blid
134 
136  RoombaSensor(roomba, blid, entity_description) for entity_description in SENSORS
137  )
138 
139 
141  """Roomba sensor."""
142 
143  entity_description: RoombaSensorEntityDescription
144 
145  def __init__(
146  self,
147  roomba: Roomba,
148  blid: str,
149  entity_description: RoombaSensorEntityDescription,
150  ) -> None:
151  """Initialize Roomba sensor."""
152  super().__init__(roomba, blid)
153  self.entity_descriptionentity_description = entity_description
154 
155  @property
156  def unique_id(self) -> str:
157  """Return a unique ID."""
158  return f"{self.entity_description.key}_{self._blid}"
159 
160  @property
161  def native_value(self) -> StateType:
162  """Return the state of the sensor."""
163  return self.entity_descriptionentity_description.value_fn(self)
None __init__(self, Roomba roomba, str blid, RoombaSensorEntityDescription entity_description)
Definition: sensor.py:150
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:129