1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-13 22:28:14 +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
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'

View File

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