Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Sensor.Community sensors."""
2 
3 from __future__ import annotations
4 
5 from typing import cast
6 
8  SensorDeviceClass,
9  SensorEntity,
10  SensorEntityDescription,
11  SensorStateClass,
12 )
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.const import (
15  ATTR_LATITUDE,
16  ATTR_LONGITUDE,
17  CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
18  CONF_SHOW_ON_MAP,
19  PERCENTAGE,
20  UnitOfPressure,
21  UnitOfTemperature,
22 )
23 from homeassistant.core import HomeAssistant
24 from homeassistant.helpers.device_registry import DeviceInfo
25 from homeassistant.helpers.entity_platform import AddEntitiesCallback
27  CoordinatorEntity,
28  DataUpdateCoordinator,
29 )
30 
31 from .const import ATTR_SENSOR_ID, CONF_SENSOR_ID, DOMAIN
32 
33 SENSORS: tuple[SensorEntityDescription, ...] = (
35  key="temperature",
36  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
37  device_class=SensorDeviceClass.TEMPERATURE,
38  state_class=SensorStateClass.MEASUREMENT,
39  ),
41  key="humidity",
42  native_unit_of_measurement=PERCENTAGE,
43  device_class=SensorDeviceClass.HUMIDITY,
44  state_class=SensorStateClass.MEASUREMENT,
45  ),
47  key="pressure",
48  native_unit_of_measurement=UnitOfPressure.PA,
49  device_class=SensorDeviceClass.PRESSURE,
50  state_class=SensorStateClass.MEASUREMENT,
51  ),
53  key="pressure_at_sealevel",
54  translation_key="pressure_at_sealevel",
55  native_unit_of_measurement=UnitOfPressure.PA,
56  device_class=SensorDeviceClass.PRESSURE,
57  state_class=SensorStateClass.MEASUREMENT,
58  ),
60  key="P1",
61  native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
62  device_class=SensorDeviceClass.PM10,
63  state_class=SensorStateClass.MEASUREMENT,
64  ),
66  key="P2",
67  native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
68  device_class=SensorDeviceClass.PM25,
69  state_class=SensorStateClass.MEASUREMENT,
70  ),
71 )
72 
73 
75  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
76 ) -> None:
77  """Set up a Sensor.Community sensor based on a config entry."""
78  coordinator = hass.data[DOMAIN][entry.entry_id]
79 
82  coordinator=coordinator,
83  description=description,
84  sensor_id=entry.data[CONF_SENSOR_ID],
85  show_on_map=entry.data[CONF_SHOW_ON_MAP],
86  )
87  for description in SENSORS
88  if description.key in coordinator.data
89  )
90 
91 
93  """Implementation of a Sensor.Community sensor."""
94 
95  _attr_attribution = "Data provided by Sensor.Community"
96  _attr_has_entity_name = True
97  _attr_should_poll = False
98 
99  def __init__(
100  self,
101  *,
102  coordinator: DataUpdateCoordinator,
103  description: SensorEntityDescription,
104  sensor_id: int,
105  show_on_map: bool,
106  ) -> None:
107  """Initialize the Sensor.Community sensor."""
108  super().__init__(coordinator=coordinator)
109  self.entity_descriptionentity_description = description
110  self._attr_unique_id_attr_unique_id = f"{sensor_id}_{description.key}"
111  self._attr_extra_state_attributes_attr_extra_state_attributes = {
112  ATTR_SENSOR_ID: sensor_id,
113  }
114  self._attr_device_info_attr_device_info = DeviceInfo(
115  configuration_url=(
116  f"https://devices.sensor.community/sensors/{sensor_id}/settings"
117  ),
118  identifiers={(DOMAIN, str(sensor_id))},
119  name=f"Sensor {sensor_id}",
120  manufacturer="Sensor.Community",
121  )
122 
123  if show_on_map:
124  self._attr_extra_state_attributes_attr_extra_state_attributes[ATTR_LONGITUDE] = coordinator.data[
125  "longitude"
126  ]
127  self._attr_extra_state_attributes_attr_extra_state_attributes[ATTR_LATITUDE] = coordinator.data[
128  "latitude"
129  ]
130 
131  @property
132  def native_value(self) -> float | None:
133  """Return the state of the device."""
134  if (
135  not self.coordinator.data
136  or (value := self.coordinator.data.get(self.entity_descriptionentity_description.key)) is None
137  ):
138  return None
139  return cast(float, value)
None __init__(self, *DataUpdateCoordinator coordinator, SensorEntityDescription description, int sensor_id, bool show_on_map)
Definition: sensor.py:106
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:76