Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Epion API."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
8  SensorDeviceClass,
9  SensorEntity,
10  SensorEntityDescription,
11  SensorStateClass,
12 )
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.const import (
15  CONCENTRATION_PARTS_PER_MILLION,
16  PERCENTAGE,
17  UnitOfPressure,
18  UnitOfTemperature,
19 )
20 from homeassistant.core import HomeAssistant
21 from homeassistant.helpers.device_registry import DeviceInfo
22 from homeassistant.helpers.entity_platform import AddEntitiesCallback
23 from homeassistant.helpers.update_coordinator import CoordinatorEntity
24 
25 from .const import DOMAIN
26 from .coordinator import EpionCoordinator
27 
28 SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
30  device_class=SensorDeviceClass.CO2,
31  state_class=SensorStateClass.MEASUREMENT,
32  native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
33  key="co2",
34  suggested_display_precision=0,
35  ),
37  device_class=SensorDeviceClass.TEMPERATURE,
38  state_class=SensorStateClass.MEASUREMENT,
39  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
40  key="temperature",
41  suggested_display_precision=1,
42  ),
44  device_class=SensorDeviceClass.HUMIDITY,
45  state_class=SensorStateClass.MEASUREMENT,
46  native_unit_of_measurement=PERCENTAGE,
47  key="humidity",
48  suggested_display_precision=1,
49  ),
51  device_class=SensorDeviceClass.ATMOSPHERIC_PRESSURE,
52  state_class=SensorStateClass.MEASUREMENT,
53  native_unit_of_measurement=UnitOfPressure.HPA,
54  key="pressure",
55  suggested_display_precision=0,
56  ),
57 )
58 
59 
61  hass: HomeAssistant,
62  entry: ConfigEntry,
63  async_add_entities: AddEntitiesCallback,
64 ) -> None:
65  """Add an Epion entry."""
66  coordinator: EpionCoordinator = hass.data[DOMAIN][entry.entry_id]
67 
68  entities = [
69  EpionSensor(coordinator, epion_device_id, description)
70  for epion_device_id in coordinator.data
71  for description in SENSOR_TYPES
72  ]
73 
74  async_add_entities(entities)
75 
76 
77 class EpionSensor(CoordinatorEntity[EpionCoordinator], SensorEntity):
78  """Representation of an Epion Air sensor."""
79 
80  _attr_has_entity_name = True
81 
82  def __init__(
83  self,
84  coordinator: EpionCoordinator,
85  epion_device_id: str,
86  description: SensorEntityDescription,
87  ) -> None:
88  """Initialize an EpionSensor."""
89  super().__init__(coordinator)
90  self._epion_device_id_epion_device_id = epion_device_id
91  self.entity_descriptionentity_description = description
92  self._attr_unique_id_attr_unique_id = f"{epion_device_id}_{description.key}"
93  self._attr_device_info_attr_device_info = DeviceInfo(
94  identifiers={(DOMAIN, epion_device_id)},
95  manufacturer="Epion",
96  name=self.devicedevice.get("deviceName"),
97  sw_version=self.devicedevice.get("fwVersion"),
98  model="Epion Air",
99  )
100 
101  @property
102  def native_value(self) -> float | None:
103  """Return the value reported by the sensor, or None if the relevant sensor can't produce a current measurement."""
104  return self.devicedevice.get(self.entity_descriptionentity_description.key)
105 
106  @property
107  def available(self) -> bool:
108  """Return the availability of the device that provides this sensor data."""
109  return super().available and self._epion_device_id_epion_device_id in self.coordinator.data
110 
111  @property
112  def device(self) -> dict[str, Any]:
113  """Get the device record from the current coordinator data, or None if there is no data being returned for this device ID anymore."""
114  return self.coordinator.data[self._epion_device_id_epion_device_id]
None __init__(self, EpionCoordinator coordinator, str epion_device_id, SensorEntityDescription description)
Definition: sensor.py:87
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:64