1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-15 07:08:20 +00:00

Refactore ppd42x.py

This commit is contained in:
pi4homez 2019-04-05 21:24:25 +02:00
parent cb76038445
commit 026bd039f1
2 changed files with 56 additions and 42 deletions

View File

@ -1,59 +1,72 @@
import voluptuous as vol import voluptuous as vol
from esphome import pins 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 import esphome.config_validation as cv
from esphome.const import CONF_ID, CONF_PM_10_0, CONF_PM_2_5, CONF_NAME, \ from esphome.const import CONF_ID, CONF_NAME, CONF_PM_10_0, \
CONF_UPDATE_INTERVAL, CONF_TIMEOUT, CONF_PIN CONF_PM_2_5, CONF_PIN, CONF_TYPE
from esphome.cpp_generator import Pvariable, add from esphome.cpp_generator import Pvariable, get_variable
from esphome.cpp_helpers import gpio_input_pin_expression, \ from esphome.cpp_helpers import setup_component
setup_component from esphome.cpp_types import App, Component
from esphome.cpp_types import App
Ppd42xSensorComponent = sensor.sensor_ns.class_('Ppd42xSensorComponent', PPD42XComponent = sensor.sensor_ns.class_('PPD42XComponent', Component)
sensor.PollingSensorComponent) PPD42XSensor = sensor.sensor_ns.class_('PPD42XSensor', sensor.Sensor)
PPD42X10_0Sensor = sensor.sensor_ns.class_('BME680TemperatureSensor',
sensor.EmptyPollingParentSensor)
PPD42X02_5Sensor = sensor.sensor_ns.class_('BME680PressureSensor',
sensor.EmptyPollingParentSensor)
PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ CONF_PPD42__ = 'PPD42'
cv.GenerateID(): cv.declare_variable_id(Ppd42xSensorComponent), CONF_PPD42NS = 'PPD42NS'
vol.Optional(CONF_PM_10_0): sensor.SENSOR_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(PPD42X10_0Sensor), PPD42XType = sensor.sensor_ns.enum('PPD42XType')
}), PPD42X_TYPES = {
vol.Optional(CONF_PM_2_5): sensor.SENSOR_SCHEMA.extend({ CONF_PPD42__: PPD42XType.PPD42_TYPE___,
cv.GenerateID(): cv.declare_variable_id(PPD42X02_5Sensor), CONF_PPD42NS: PPD42XType.PPD42X_TYPE_NS,
}), }
vol.Required(CONF_TIMEOUT): cv.positive_time_period_microseconds,
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, 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): 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: if CONF_PM_2_5 in config:
conf_02_5 = config[CONF_PM_2_5] conf = config[CONF_PM_2_5]
for pm_02_5 in gpio_input_pin_expression(conf_02_5[CONF_PIN]): for pm_02_5 in get_variable(conf[CONF_PIN]):
yield yield
sensor.register_sensor(ppd42x.make_pm_02_5_sensor(conf_02_5[CONF_NAME]), conf_02_5) sensor.register_sensor(pms.make_pm_2_5_sensor(conf[CONF_NAME]), conf)
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)
if CONF_PM_10_0 in config: if CONF_PM_10_0 in config:
conf_10_0 = config[CONF_PM_10_0] conf = config[CONF_PM_10_0]
for pm_10_0 in gpio_input_pin_expression(conf_10_0[CONF_PIN]): for pm_10_0 in get_variable(conf[CONF_PIN]):
yield yield
sensor.register_sensor(ppd42x.make_pm_10_0_sensor(conf_10_0[CONF_NAME]), conf_10_0) sensor.register_sensor(pms.make_pm_10_0_sensor(conf[CONF_NAME]), conf)
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]))
BUILD_FLAGS = '-DUSE_PPD42X_SENSOR' setup_component(pms, config)
BUILD_FLAGS = '-DUSE_PPD42X'

View File

@ -503,6 +503,7 @@ sensor:
rx_only: false rx_only: false
- platform: ppd42x - platform: ppd42x
type: PPD42
pm_2_5: pm_2_5:
pin: GPIO32 pin: GPIO32
name: "ppd42 PM2.5" name: "ppd42 PM2.5"