1 """Sensor platform for Roomba."""
3 from collections.abc
import Callable
4 from dataclasses
import dataclass
6 from roombapy
import Roomba
11 SensorEntityDescription,
20 from .const
import DOMAIN
21 from .entity
import IRobotEntity
22 from .models
import RoombaData
25 @dataclass(frozen=True, kw_only=True)
27 """Immutable class for describing Roomba data."""
29 value_fn: Callable[[IRobotEntity], StateType]
32 SENSORS: list[RoombaSensorEntityDescription] = [
35 native_unit_of_measurement=PERCENTAGE,
36 device_class=SensorDeviceClass.BATTERY,
37 entity_category=EntityCategory.DIAGNOSTIC,
38 value_fn=
lambda self: self.battery_level,
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"),
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"),
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"),
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"),
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"),
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"),
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"),
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,
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
111 suggested_display_precision=0,
112 entity_registry_enabled_default=
False,
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,
127 config_entry: ConfigEntry,
128 async_add_entities: AddEntitiesCallback,
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
136 RoombaSensor(roomba, blid, entity_description)
for entity_description
in SENSORS
143 entity_description: RoombaSensorEntityDescription
149 entity_description: RoombaSensorEntityDescription,
151 """Initialize Roomba sensor."""
157 """Return a unique ID."""
158 return f
"{self.entity_description.key}_{self._blid}"
162 """Return the state of the sensor."""
StateType native_value(self)
None __init__(self, Roomba roomba, str blid, RoombaSensorEntityDescription entity_description)
web.Response get(self, web.Request request, str config_key)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)