Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for ThinkingCleaner sensors."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 
7 from pythinkingcleaner import Discovery, ThinkingCleaner
8 import voluptuous as vol
9 
10 from homeassistant import util
12  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
13  SensorEntity,
14  SensorEntityDescription,
15 )
16 from homeassistant.const import CONF_HOST, PERCENTAGE
17 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
21 
22 MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10)
23 MIN_TIME_BETWEEN_FORCED_SCANS = timedelta(milliseconds=100)
24 
25 SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
27  key="battery",
28  name="Battery",
29  native_unit_of_measurement=PERCENTAGE,
30  icon="mdi:battery",
31  ),
33  key="state",
34  name="State",
35  ),
37  key="capacity",
38  name="Capacity",
39  ),
40 )
41 
42 STATES = {
43  "st_base": "On homebase: Not Charging",
44  "st_base_recon": "On homebase: Reconditioning Charging",
45  "st_base_full": "On homebase: Full Charging",
46  "st_base_trickle": "On homebase: Trickle Charging",
47  "st_base_wait": "On homebase: Waiting",
48  "st_plug": "Plugged in: Not Charging",
49  "st_plug_recon": "Plugged in: Reconditioning Charging",
50  "st_plug_full": "Plugged in: Full Charging",
51  "st_plug_trickle": "Plugged in: Trickle Charging",
52  "st_plug_wait": "Plugged in: Waiting",
53  "st_stopped": "Stopped",
54  "st_clean": "Cleaning",
55  "st_cleanstop": "Stopped with cleaning",
56  "st_clean_spot": "Spot cleaning",
57  "st_clean_max": "Max cleaning",
58  "st_delayed": "Delayed cleaning will start soon",
59  "st_dock": "Searching Homebase",
60  "st_pickup": "Roomba picked up",
61  "st_remote": "Remote control driving",
62  "st_wait": "Waiting for command",
63  "st_off": "Off",
64  "st_error": "Error",
65  "st_locate": "Find me!",
66  "st_unknown": "Unknown state",
67 }
68 
69 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend({vol.Optional(CONF_HOST): cv.string})
70 
71 
73  hass: HomeAssistant,
74  config: ConfigType,
75  add_entities: AddEntitiesCallback,
76  discovery_info: DiscoveryInfoType | None = None,
77 ) -> None:
78  """Set up the ThinkingCleaner platform."""
79  if host := config.get(CONF_HOST):
80  devices = [ThinkingCleaner(host, "unknown")]
81  else:
82  discovery = Discovery()
83  devices = discovery.discover()
84 
85  @util.Throttle(MIN_TIME_BETWEEN_SCANS, MIN_TIME_BETWEEN_FORCED_SCANS)
86  def update_devices():
87  """Update all devices."""
88  for device_object in devices:
89  device_object.update()
90 
91  entities = [
92  ThinkingCleanerSensor(device, update_devices, description)
93  for device in devices
94  for description in SENSOR_TYPES
95  ]
96 
97  add_entities(entities)
98 
99 
101  """Representation of a ThinkingCleaner Sensor."""
102 
103  def __init__(
104  self, tc_object, update_devices, description: SensorEntityDescription
105  ) -> None:
106  """Initialize the ThinkingCleaner."""
107  self.entity_descriptionentity_description = description
108  self._tc_object_tc_object = tc_object
109  self._update_devices_update_devices = update_devices
110 
111  self._attr_name_attr_name = f"{tc_object.name} {description.name}"
112 
113  def update(self) -> None:
114  """Update the sensor."""
115  self._update_devices_update_devices()
116 
117  sensor_type = self.entity_descriptionentity_description.key
118  if sensor_type == "battery":
119  self._attr_native_value_attr_native_value = self._tc_object_tc_object.battery
120  elif sensor_type == "state":
121  self._attr_native_value_attr_native_value = STATES[self._tc_object_tc_object.status]
122  elif sensor_type == "capacity":
123  self._attr_native_value_attr_native_value = self._tc_object_tc_object.capacity
None __init__(self, tc_object, update_devices, SensorEntityDescription description)
Definition: sensor.py:105
None update_devices(HomeAssistant hass, ConfigEntry config_entry, dict[int, Roller] api)
Definition: helpers.py:47
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:77