Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Notion sensors."""
2 
3 from dataclasses import dataclass
4 
5 from aionotion.listener.models import ListenerKind
6 
8  SensorDeviceClass,
9  SensorEntity,
10  SensorEntityDescription,
11  SensorStateClass,
12 )
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.const import UnitOfTemperature
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from .const import DOMAIN, SENSOR_MOLD, SENSOR_TEMPERATURE
19 from .coordinator import NotionDataUpdateCoordinator
20 from .entity import NotionEntity, NotionEntityDescription
21 
22 
23 @dataclass(frozen=True, kw_only=True)
25  """Describe a Notion sensor."""
26 
27 
28 SENSOR_DESCRIPTIONS = (
29  NotionSensorDescription(
30  key=SENSOR_MOLD,
31  translation_key="mold_risk",
32  listener_kind=ListenerKind.MOLD,
33  ),
34  NotionSensorDescription(
35  key=SENSOR_TEMPERATURE,
36  device_class=SensorDeviceClass.TEMPERATURE,
37  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
38  state_class=SensorStateClass.MEASUREMENT,
39  listener_kind=ListenerKind.TEMPERATURE,
40  ),
41 )
42 
43 
45  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
46 ) -> None:
47  """Set up Notion sensors based on a config entry."""
48  coordinator: NotionDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
49 
51  [
53  coordinator,
54  listener_id,
55  sensor.uuid,
56  sensor.bridge.id,
57  description,
58  )
59  for listener_id, listener in coordinator.data.listeners.items()
60  for description in SENSOR_DESCRIPTIONS
61  if description.listener_kind.value == listener.definition_id
62  and (sensor := coordinator.data.sensors[listener.sensor_id])
63  ]
64  )
65 
66 
68  """Define a Notion sensor."""
69 
70  @property
71  def native_unit_of_measurement(self) -> str | None:
72  """Return the unit of measurement of the sensor."""
73  if self.listenerlistener.definition_id == ListenerKind.TEMPERATURE.value:
74  if not self.coordinator.data.user_preferences:
75  return None
76  if self.coordinator.data.user_preferences.celsius_enabled:
77  return UnitOfTemperature.CELSIUS
78  return UnitOfTemperature.FAHRENHEIT
79  return None
80 
81  @property
82  def native_value(self) -> str | None:
83  """Return the value reported by the sensor."""
84  if not self.listenerlistener.status_localized:
85  return None
86  if self.listenerlistener.definition_id == ListenerKind.TEMPERATURE.value:
87  # The Notion API only returns a localized string for temperature (e.g.
88  # "70°"); we simply remove the degree symbol:
89  return self.listenerlistener.status_localized.state[:-1]
90  return self.listenerlistener.status_localized.state
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:46