diff --git a/.coveragerc b/.coveragerc index 8867a0837aa9325f35a342fcd881edf64932b7fa..d1db30522e9b50ffe9220ad98bf8f42d6ebc3e5e 100644 --- a/.coveragerc +++ b/.coveragerc @@ -206,6 +206,7 @@ omit = homeassistant/components/sensor/onewire.py homeassistant/components/sensor/openweathermap.py homeassistant/components/sensor/openexchangerates.py + homeassistant/components/sensor/serial_pm.py homeassistant/components/sensor/plex.py homeassistant/components/sensor/rest.py homeassistant/components/sensor/sabnzbd.py diff --git a/homeassistant/components/sensor/serial_pm.py b/homeassistant/components/sensor/serial_pm.py new file mode 100644 index 0000000000000000000000000000000000000000..0dd6259d083532456e50952c663ff3a83a5260ae --- /dev/null +++ b/homeassistant/components/sensor/serial_pm.py @@ -0,0 +1,94 @@ +""" +Support for particulate matter sensors connected to a serial port. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.particulate_matter/ +""" +import logging +import voluptuous as vol + +from homeassistant.const import CONF_NAME, CONF_PLATFORM +from homeassistant.helpers.entity import Entity +import homeassistant.helpers.config_validation as cv +from homeassistant.components.sensor import PLATFORM_SCHEMA + +REQUIREMENTS = ['pmsensor==0.2'] + + +_LOGGER = logging.getLogger(__name__) + +CONF_SERIAL_DEVICE = "serial_device" +CONF_BRAND = "brand" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_PLATFORM): 'serial_pm', + vol.Optional(CONF_NAME, default=""): cv.string, + vol.Required(CONF_SERIAL_DEVICE): cv.string, + vol.Required(CONF_BRAND): cv.string, +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the available PM sensors.""" + from pmsensor import serial_data_collector as pm + + try: + coll = pm.PMDataCollector(config.get(CONF_SERIAL_DEVICE), + pm.SUPPORTED_SENSORS[config.get(CONF_BRAND)]) + except KeyError: + _LOGGER.error("Brand %s not supported\n supported brands: %s", + config.get(CONF_BRAND), pm.SUPPORTED_SENSORS.keys()) + return + except OSError as err: + _LOGGER.error("Could not open serial connection to %s (%s)", + config.get(CONF_SERIAL_DEVICE), err) + return + + dev = [] + + for pmname in coll.supported_values(): + if config.get("name") != "": + name = "{} PM{}".format(config.get("name"), pmname) + else: + name = "PM{}".format(pmname) + dev.append(ParticulateMatterSensor(coll, name, pmname)) + + add_devices(dev) + + +class ParticulateMatterSensor(Entity): + """Representation of an Particulate matter sensor.""" + + def __init__(self, pmDataCollector, name, pmname): + """Initialize a new PM sensor.""" + self._name = name + self._pmname = pmname + self._state = None + self._collector = pmDataCollector + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def state(self): + """Return the state of the sensor.""" + return self._state + + @property + def unit_of_measurement(self): + """Return the unit of measurement of this entity, if any.""" + return "µg/m³" + + def update(self): + """Read from sensor and update the state.""" + _LOGGER.debug("Reading data from PM sensor") + try: + self._state = self._collector.read_data()[self._pmname] + except KeyError: + _LOGGER.error("Could not read PM%s value", self._pmname) + + def should_poll(self): + """Sensor needs polling.""" + return True diff --git a/requirements_all.txt b/requirements_all.txt index 3919024860a427572b650cf040d2d23ee3542c5e..9714c56a0f1e20d8b0bd27c0e8642f29292b9db0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -230,6 +230,9 @@ phue==0.8 # homeassistant.components.sensor.plex plexapi==1.1.0 +# homeassistant.components.sensor.serial_pm +pmsensor==0.2 + # homeassistant.components.thermostat.proliphix proliphix==0.2.0