From 7cfc80045a3c9795ca6ab8a9151b723d28abb0b5 Mon Sep 17 00:00:00 2001 From: pi4homez Date: Sun, 7 Apr 2019 06:54:03 +0200 Subject: [PATCH] from scrach --- esphome/components/sensor/ppd42x.py | 93 +++++++++++++++++++---------- tests/test2.yaml | 26 ++++++++ tests/test3.yaml | 27 +++++++++ 3 files changed, 115 insertions(+), 31 deletions(-) diff --git a/esphome/components/sensor/ppd42x.py b/esphome/components/sensor/ppd42x.py index 2f5b09fb96..cc7ee34795 100644 --- a/esphome/components/sensor/ppd42x.py +++ b/esphome/components/sensor/ppd42x.py @@ -1,66 +1,97 @@ 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_NAME, CONF_PM_10_0, \ - CONF_PM_2_5, CONF_TYPE, CONF_UPDATE_INTERVAL, CONF_TIMEOUT +from esphome.const import CONF_FORMALDEHYDE, CONF_HUMIDITY, CONF_ID, CONF_NAME, CONF_PM_10_0, \ + CONF_PM_1_0, CONF_PM_2_5, CONF_TEMPERATURE, CONF_TYPE, CONF_UART_ID from esphome.cpp_generator import Pvariable, get_variable from esphome.cpp_helpers import setup_component from esphome.cpp_types import App, Component +DEPENDENCIES = ['uart'] -PPD42XComponent = sensor.sensor_ns.class_('PPD42XComponent', Component) +PPD42XComponent = sensor.sensor_ns.class_('PPD42XComponent', uart.UARTDevice, Component) PPD42XSensor = sensor.sensor_ns.class_('PPD42XSensor', sensor.Sensor) -CONF_PPD42 = 'PPD42' -CONF_PPD42NS = 'PPD42NS' - -CONF_PIN_02_5 = 'pin_2_5' -CONF_PIN_10_0 = 'pin_10_0' +CONF_PPD42X = 'PPD42X' +CONF_PMS5003T = 'PMS5003T' +CONF_PMS5003ST = 'PMS5003ST' PPD42XType = sensor.sensor_ns.enum('PPD42XType') PPD42X_TYPES = { - CONF_PPD42: PPD42XType.PPD42X_TYPE, - CONF_PPD42NS: PPD42XType.PPD42X_TYPE_NS, + CONF_PPD42X: PPD42XType.PPD42X_TYPE_X003, + CONF_PMS5003T: PPD42XType.PPD42X_TYPE_5003T, + CONF_PMS5003ST: PPD42XType.PPD42X_TYPE_5003ST, } + SENSORS_TO_TYPE = { - CONF_PIN_02_5: [CONF_PPD42, CONF_PPD42NS], - CONF_PIN_10_0: [CONF_PPD42, CONF_PPD42NS], + CONF_PM_1_0: [CONF_PPD42X], + CONF_PM_2_5: [CONF_PPD42X, CONF_PMS5003T, CONF_PMS5003ST], + CONF_PM_10_0: [CONF_PPD42X], + CONF_TEMPERATURE: [CONF_PMS5003T, CONF_PMS5003ST], + CONF_HUMIDITY: [CONF_PMS5003T, CONF_PMS5003ST], + CONF_FORMALDEHYDE: [CONF_PMS5003ST], } -def validate_PPD42X_sensors(value): +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), +}) + PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(PPD42XComponent), + cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), vol.Required(CONF_TYPE): cv.one_of(*PPD42X_TYPES, upper=True), - vol.Optional(CONF_PIN_02_5): pins.gpio_input_pin_schema, - vol.Optional(CONF_PIN_10_0): pins.gpio_input_pin_schema, - vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, - vol.Optional(CONF_TIMEOUT): cv.positive_time_period_microseconds, -}).extend(cv.COMPONENT_SCHEMA.schema)) + vol.Optional(CONF_PM_1_0): cv.nameable(PPD42X_SENSOR_SCHEMA), + vol.Optional(CONF_PM_2_5): cv.nameable(PPD42X_SENSOR_SCHEMA), + vol.Optional(CONF_PM_10_0): cv.nameable(PPD42X_SENSOR_SCHEMA), + vol.Optional(CONF_TEMPERATURE): cv.nameable(PPD42X_SENSOR_SCHEMA), + vol.Optional(CONF_HUMIDITY): cv.nameable(PPD42X_SENSOR_SCHEMA), + vol.Optional(CONF_FORMALDEHYDE): 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(PPD42X_TYPES[config[CONF_TYPE]]) - ppd = Pvariable(config[CONF_ID], rhs) - if CONF_PM_2_5 in config: - for pl_02_5 in get_variable(config[CONF_PIN_02_5]): - yield - sensor.register_sensor(ppd.make_pl_02_5_sensor(config[CONF_NAME], pl_02_5), config) - if CONF_PM_10_0 in config: - for pl_10_0 in get_variable(config[CONF_PM_10_0]): - yield - sensor.register_sensor(ppd.make_pl_10_0_sensor(config[CONF_NAME], pl_10_0), config) + for uart_ in get_variable(config[CONF_UART_ID]): + yield - setup_component(ppd, config) + rhs = App.make_ppd42x(uart_, PPD42X_TYPES[config[CONF_TYPE]]) + pms = Pvariable(config[CONF_ID], rhs) + + if CONF_PM_1_0 in config: + conf = config[CONF_PM_1_0] + sensor.register_sensor(pms.make_pm_1_0_sensor(conf[CONF_NAME]), conf) + + if CONF_PM_2_5 in config: + conf = config[CONF_PM_2_5] + sensor.register_sensor(pms.make_pm_2_5_sensor(conf[CONF_NAME]), conf) + + if CONF_PM_10_0 in config: + conf = config[CONF_PM_10_0] + sensor.register_sensor(pms.make_pm_10_0_sensor(conf[CONF_NAME]), conf) + + if CONF_TEMPERATURE in config: + conf = config[CONF_TEMPERATURE] + sensor.register_sensor(pms.make_temperature_sensor(conf[CONF_NAME]), conf) + + if CONF_HUMIDITY in config: + conf = config[CONF_HUMIDITY] + sensor.register_sensor(pms.make_humidity_sensor(conf[CONF_NAME]), conf) + + if CONF_FORMALDEHYDE in config: + conf = config[CONF_FORMALDEHYDE] + sensor.register_sensor(pms.make_formaldehyde_sensor(conf[CONF_NAME]), conf) + + setup_component(pms, config) BUILD_FLAGS = '-DUSE_PPD42X' diff --git a/tests/test2.yaml b/tests/test2.yaml index 03bb24578e..c57202b346 100644 --- a/tests/test2.yaml +++ b/tests/test2.yaml @@ -79,6 +79,32 @@ sensor: name: "Xiaomi MiJia Humidity" battery_level: name: "Xiaomi MiJia Battery Level" + - platform: ppd42x + type: PPD42 + pm_1_0: + name: "PM 1.0 Concentration" + pm_2_5: + name: "PM 2.5 Concentration" + pm_10_0: + name: "PM 10.0 Concentration" + - platform: ppd42x + type: PMS5003T + pm_2_5: + name: "PM 2.5 Concentration" + temperature: + name: "PMS Temperature" + humidity: + name: "PMS Humidity" + - platform: ppd42x + type: PMS5003ST + pm_2_5: + name: "PM 2.5 Concentration" + temperature: + name: "PMS Temperature" + humidity: + name: "PMS Humidity" + formaldehyde: + name: "PMS Formaldehyde Concentration" - platform: pmsx003 type: PMSX003 pm_1_0: diff --git a/tests/test3.yaml b/tests/test3.yaml index ec68e6c503..9cb8d44b5f 100644 --- a/tests/test3.yaml +++ b/tests/test3.yaml @@ -44,6 +44,33 @@ deep_sleep: sleep_duration: 50s sensor: + - platform: ppd42x + type: PPD42X + pm_1_0: + name: "PM 1.0 Concentration" + pm_2_5: + name: "PM 2.5 Concentration" + pm_10_0: + name: "PM 10.0 Concentration" + - platform: ppd42x + type: PMS5003T + pm_2_5: + name: "PM 2.5 Concentration" + temperature: + name: "PMS Temperature" + humidity: + name: "PMS Humidity" + - platform: ppd42x + type: PMS5003ST + pm_2_5: + name: "PM 2.5 Concentration" + temperature: + name: "PMS Temperature" + humidity: + name: "PMS Humidity" + formaldehyde: + name: "PMS Formaldehyde Concentration" + - platform: pmsx003 type: PMSX003 pm_1_0: