diff --git a/esphome/components/sensor/ppd42x.py b/esphome/components/sensor/ppd42x.py index c052ea55dd..8b7923980e 100644 --- a/esphome/components/sensor/ppd42x.py +++ b/esphome/components/sensor/ppd42x.py @@ -1,59 +1,72 @@ import voluptuous as vol from esphome import pins -from esphome.components import sensor +from esphome.components import sensor, uart +from esphome.components.uart import UARTComponent import esphome.config_validation as cv -from esphome.const import CONF_ID, CONF_PM_10_0, CONF_PM_2_5, CONF_NAME, \ - CONF_UPDATE_INTERVAL, CONF_TIMEOUT, CONF_PIN -from esphome.cpp_generator import Pvariable, add -from esphome.cpp_helpers import gpio_input_pin_expression, \ - setup_component -from esphome.cpp_types import App +from esphome.const import CONF_ID, CONF_NAME, CONF_PM_10_0, \ + CONF_PM_2_5, CONF_PIN, CONF_TYPE +from esphome.cpp_generator import Pvariable, get_variable +from esphome.cpp_helpers import setup_component +from esphome.cpp_types import App, Component -Ppd42xSensorComponent = sensor.sensor_ns.class_('Ppd42xSensorComponent', - sensor.PollingSensorComponent) -PPD42X10_0Sensor = sensor.sensor_ns.class_('BME680TemperatureSensor', - sensor.EmptyPollingParentSensor) -PPD42X02_5Sensor = sensor.sensor_ns.class_('BME680PressureSensor', - sensor.EmptyPollingParentSensor) +PPD42XComponent = sensor.sensor_ns.class_('PPD42XComponent', Component) +PPD42XSensor = sensor.sensor_ns.class_('PPD42XSensor', sensor.Sensor) -PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ - cv.GenerateID(): cv.declare_variable_id(Ppd42xSensorComponent), - vol.Optional(CONF_PM_10_0): sensor.SENSOR_SCHEMA.extend({ - cv.GenerateID(): cv.declare_variable_id(PPD42X10_0Sensor), - }), - vol.Optional(CONF_PM_2_5): sensor.SENSOR_SCHEMA.extend({ - cv.GenerateID(): cv.declare_variable_id(PPD42X02_5Sensor), - }), - vol.Required(CONF_TIMEOUT): cv.positive_time_period_microseconds, - vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, +CONF_PPD42__ = 'PPD42' +CONF_PPD42NS = 'PPD42NS' + +PPD42XType = sensor.sensor_ns.enum('PPD42XType') +PPD42X_TYPES = { + CONF_PPD42__: PPD42XType.PPD42_TYPE___, + CONF_PPD42NS: PPD42XType.PPD42X_TYPE_NS, +} + +SENSORS_TO_TYPE = { + CONF_PM_2_5: [CONF_PPD42__, CONF_PPD42NS], + CONF_PM_10_0: [CONF_PPD42__, CONF_PPD42NS], +} + + +def validate_PPD42X_sensors(value): + for key, types in SENSORS_TO_TYPE.items(): + if key in value and value[CONF_TYPE] not in types: + raise vol.Invalid(u"{} does not have {} sensor!".format(value[CONF_TYPE], key)) + return value + + +PPD42X_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(PPD42XSensor), + vol.Required(CONF_PIN): pins.gpio_input_pin_schema }) +PLATFORM_SCHEMA = vol.nameable(sensor.PLATFORM_SCHEMA.extend({ + cv.GenerateID(): cv.declare_variable_id(PPD42XComponent), + vol.Required(CONF_TYPE): cv.one_of(*PPD42X_TYPES, upper=True), + vol.Optional(CONF_PM_2_5): cv.nameable(PPD42X_SENSOR_SCHEMA), + vol.Optional(CONF_PM_10_0): cv.nameable(PPD42X_SENSOR_SCHEMA), +}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSORS_TO_TYPE)) + def to_code(config): + rhs = App.make_ppd42x(config[CONF_NAME], PPD42X_TYPES[config[CONF_TYPE]]) + pms = Pvariable(config[CONF_ID], rhs) + if CONF_PM_2_5 in config: - conf_02_5 = config[CONF_PM_2_5] - for pm_02_5 in gpio_input_pin_expression(conf_02_5[CONF_PIN]): + conf = config[CONF_PM_2_5] + for pm_02_5 in get_variable(conf[CONF_PIN]): yield - sensor.register_sensor(ppd42x.make_pm_02_5_sensor(conf_02_5[CONF_NAME]), conf_02_5) - rhs = App.make_ppd42x_sensor(config[CONF_PM_2_5][CONF_NAME], - config.get(CONF_UPDATE_INTERVAL)) - se_02_5 = Pvariable(conf_02_5[CONF_ID], rhs) - sensor.setup_sensor(se_02_5, conf_02_5) - setup_component(se_02_5, config) + sensor.register_sensor(pms.make_pm_2_5_sensor(conf[CONF_NAME]), conf) + + if CONF_PM_10_0 in config: - conf_10_0 = config[CONF_PM_10_0] - for pm_10_0 in gpio_input_pin_expression(conf_10_0[CONF_PIN]): + conf = config[CONF_PM_10_0] + for pm_10_0 in get_variable(conf[CONF_PIN]): yield - sensor.register_sensor(ppd42x.make_pm_10_0_sensor(conf_10_0[CONF_NAME]), conf_10_0) - rhs = App.make_ppd42x_sensor(config[CONF_PM_10_0][CONF_NAME], - config.get(CONF_UPDATE_INTERVAL)) - se_10_0 = Pvariable(conf_10_0[CONF_ID], rhs) - sensor.setup_sensor(se_10_0, conf_10_0) - setup_component(se_10_0, config) - if CONF_TIMEOUT in config: - add(se_10_0.set_timeout_us(config[CONF_TIMEOUT])) + sensor.register_sensor(pms.make_pm_10_0_sensor(conf[CONF_NAME]), conf) -BUILD_FLAGS = '-DUSE_PPD42X_SENSOR' + setup_component(pms, config) + +BUILD_FLAGS = '-DUSE_PPD42X' diff --git a/tests/test1.yaml b/tests/test1.yaml index ea863d73f1..2822561260 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -503,6 +503,7 @@ sensor: rx_only: false - platform: ppd42x + type: PPD42 pm_2_5: pin: GPIO32 name: "ppd42 PM2.5"