Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Platform for Sanix integration."""
2 
3 from collections.abc import Callable
4 from dataclasses import dataclass
5 from datetime import date, datetime
6 
7 from sanix.const import (
8  ATTR_API_BATTERY,
9  ATTR_API_DEVICE_NO,
10  ATTR_API_DISTANCE,
11  ATTR_API_FILL_PERC,
12  ATTR_API_SERVICE_DATE,
13  ATTR_API_SSID,
14 )
15 from sanix.models import Measurement
16 
18  SensorDeviceClass,
19  SensorEntity,
20  SensorEntityDescription,
21  SensorStateClass,
22 )
23 from homeassistant.config_entries import ConfigEntry
24 from homeassistant.const import PERCENTAGE, UnitOfLength
25 from homeassistant.core import HomeAssistant
26 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
27 from homeassistant.helpers.entity_platform import AddEntitiesCallback
28 from homeassistant.helpers.update_coordinator import CoordinatorEntity
29 
30 from .const import DOMAIN, MANUFACTURER
31 from .coordinator import SanixCoordinator
32 
33 
34 @dataclass(frozen=True, kw_only=True)
36  """Class describing Sanix Sensor entities."""
37 
38  native_value_fn: Callable[[Measurement], int | datetime | date | str]
39 
40 
41 SENSOR_TYPES: tuple[SanixSensorEntityDescription, ...] = (
43  key=ATTR_API_BATTERY,
44  native_unit_of_measurement=PERCENTAGE,
45  device_class=SensorDeviceClass.BATTERY,
46  state_class=SensorStateClass.MEASUREMENT,
47  native_value_fn=lambda data: data.battery,
48  ),
50  key=ATTR_API_DISTANCE,
51  native_unit_of_measurement=UnitOfLength.CENTIMETERS,
52  device_class=SensorDeviceClass.DISTANCE,
53  state_class=SensorStateClass.MEASUREMENT,
54  native_value_fn=lambda data: data.distance,
55  ),
57  key=ATTR_API_SERVICE_DATE,
58  translation_key=ATTR_API_SERVICE_DATE,
59  device_class=SensorDeviceClass.DATE,
60  native_value_fn=lambda data: data.service_date,
61  ),
63  key=ATTR_API_FILL_PERC,
64  translation_key=ATTR_API_FILL_PERC,
65  native_unit_of_measurement=PERCENTAGE,
66  state_class=SensorStateClass.MEASUREMENT,
67  native_value_fn=lambda data: data.fill_perc,
68  ),
70  key=ATTR_API_SSID,
71  translation_key=ATTR_API_SSID,
72  entity_registry_enabled_default=False,
73  native_value_fn=lambda data: data.ssid,
74  ),
76  key=ATTR_API_DEVICE_NO,
77  translation_key=ATTR_API_DEVICE_NO,
78  entity_registry_enabled_default=False,
79  native_value_fn=lambda data: data.device_no,
80  ),
81 )
82 
83 
85  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
86 ) -> None:
87  """Set up Sanix Sensor entities based on a config entry."""
88  coordinator = hass.data[DOMAIN][entry.entry_id]
89 
91  SanixSensorEntity(coordinator, description) for description in SENSOR_TYPES
92  )
93 
94 
95 class SanixSensorEntity(CoordinatorEntity[SanixCoordinator], SensorEntity):
96  """Sanix Sensor entity."""
97 
98  _attr_has_entity_name = True
99  entity_description: SanixSensorEntityDescription
100 
101  def __init__(
102  self,
103  coordinator: SanixCoordinator,
104  description: SanixSensorEntityDescription,
105  ) -> None:
106  """Pass coordinator to CoordinatorEntity."""
107  super().__init__(coordinator)
108  serial_no = str(coordinator.config_entry.unique_id)
109 
110  self._attr_unique_id_attr_unique_id = f"{serial_no}-{description.key}"
111  self.entity_descriptionentity_description = description
112 
113  self._attr_device_info_attr_device_info = DeviceInfo(
114  identifiers={(DOMAIN, serial_no)},
115  entry_type=DeviceEntryType.SERVICE,
116  manufacturer=MANUFACTURER,
117  serial_number=serial_no,
118  )
119 
120  @property
121  def native_value(self) -> int | datetime | date | str:
122  """Return the state of the sensor."""
123  return self.entity_descriptionentity_description.native_value_fn(self.coordinator.data)
None __init__(self, SanixCoordinator coordinator, SanixSensorEntityDescription description)
Definition: sensor.py:105
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:86