Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for particulate matter sensors connected to a serial port."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from pmsensor import serial_pm as pm
8 import voluptuous as vol
9 
11  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
12  SensorEntity,
13 )
14 from homeassistant.const import CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, CONF_NAME
15 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
19 
20 _LOGGER = logging.getLogger(__name__)
21 
22 CONF_BRAND = "brand"
23 CONF_SERIAL_DEVICE = "serial_device"
24 
25 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
26  {
27  vol.Required(CONF_BRAND): cv.string,
28  vol.Required(CONF_SERIAL_DEVICE): cv.string,
29  vol.Optional(CONF_NAME): cv.string,
30  }
31 )
32 
33 
35  hass: HomeAssistant,
36  config: ConfigType,
37  add_entities: AddEntitiesCallback,
38  discovery_info: DiscoveryInfoType | None = None,
39 ) -> None:
40  """Set up the available PM sensors."""
41  try:
42  coll = pm.PMDataCollector(
43  config.get(CONF_SERIAL_DEVICE), pm.SUPPORTED_SENSORS[config.get(CONF_BRAND)]
44  )
45  except KeyError:
46  _LOGGER.error(
47  "Brand %s not supported\n supported brands: %s",
48  config.get(CONF_BRAND),
49  pm.SUPPORTED_SENSORS.keys(),
50  )
51  return
52  except OSError as err:
53  _LOGGER.error(
54  "Could not open serial connection to %s (%s)",
55  config.get(CONF_SERIAL_DEVICE),
56  err,
57  )
58  return
59 
60  dev = []
61 
62  for pmname in coll.supported_values():
63  if config.get(CONF_NAME) is not None:
64  name = f"{config.get(CONF_NAME)} PM{pmname}"
65  else:
66  name = f"PM{pmname}"
67  dev.append(ParticulateMatterSensor(coll, name, pmname))
68 
69  add_entities(dev)
70 
71 
73  """Representation of an Particulate matter sensor."""
74 
75  def __init__(self, pm_data_collector, name, pmname):
76  """Initialize a new PM sensor."""
77  self._name_name = name
78  self._pmname_pmname = pmname
79  self._state_state = None
80  self._collector_collector = pm_data_collector
81 
82  @property
83  def name(self):
84  """Return the name of the sensor."""
85  return self._name_name
86 
87  @property
88  def native_value(self):
89  """Return the state of the sensor."""
90  return self._state_state
91 
92  @property
94  """Return the unit of measurement of this entity, if any."""
95  return CONCENTRATION_MICROGRAMS_PER_CUBIC_METER
96 
97  def update(self) -> None:
98  """Read from sensor and update the state."""
99  _LOGGER.debug("Reading data from PM sensor")
100  try:
101  self._state_state = self._collector_collector.read_data()[self._pmname_pmname]
102  except KeyError:
103  _LOGGER.error("Could not read PM%s value", self._pmname_pmname)
def __init__(self, pm_data_collector, name, pmname)
Definition: sensor.py:75
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:39