1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-15 15:18:16 +00:00

from scrach

This commit is contained in:
pi4homez 2019-04-07 06:54:03 +02:00
parent 6019c83684
commit 7cfc80045a
3 changed files with 115 additions and 31 deletions

View File

@ -1,66 +1,97 @@
import voluptuous as vol import voluptuous as vol
from esphome import pins from esphome.components import sensor, uart
from esphome.components import sensor 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_NAME, CONF_PM_10_0, \ from esphome.const import CONF_FORMALDEHYDE, CONF_HUMIDITY, CONF_ID, CONF_NAME, CONF_PM_10_0, \
CONF_PM_2_5, CONF_TYPE, CONF_UPDATE_INTERVAL, CONF_TIMEOUT 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_generator import Pvariable, get_variable
from esphome.cpp_helpers import setup_component from esphome.cpp_helpers import setup_component
from esphome.cpp_types import App, 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) PPD42XSensor = sensor.sensor_ns.class_('PPD42XSensor', sensor.Sensor)
CONF_PPD42 = 'PPD42' CONF_PPD42X = 'PPD42X'
CONF_PPD42NS = 'PPD42NS' CONF_PMS5003T = 'PMS5003T'
CONF_PMS5003ST = 'PMS5003ST'
CONF_PIN_02_5 = 'pin_2_5'
CONF_PIN_10_0 = 'pin_10_0'
PPD42XType = sensor.sensor_ns.enum('PPD42XType') PPD42XType = sensor.sensor_ns.enum('PPD42XType')
PPD42X_TYPES = { PPD42X_TYPES = {
CONF_PPD42: PPD42XType.PPD42X_TYPE, CONF_PPD42X: PPD42XType.PPD42X_TYPE_X003,
CONF_PPD42NS: PPD42XType.PPD42X_TYPE_NS, CONF_PMS5003T: PPD42XType.PPD42X_TYPE_5003T,
CONF_PMS5003ST: PPD42XType.PPD42X_TYPE_5003ST,
} }
SENSORS_TO_TYPE = { SENSORS_TO_TYPE = {
CONF_PIN_02_5: [CONF_PPD42, CONF_PPD42NS], CONF_PM_1_0: [CONF_PPD42X],
CONF_PIN_10_0: [CONF_PPD42, CONF_PPD42NS], 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(): for key, types in SENSORS_TO_TYPE.items():
if key in value and value[CONF_TYPE] not in types: if key in value and value[CONF_TYPE] not in types:
raise vol.Invalid(u"{} does not have {} sensor!".format(value[CONF_TYPE], key)) raise vol.Invalid(u"{} does not have {} sensor!".format(value[CONF_TYPE], key))
return value return value
PPD42X_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(PPD42XSensor),
})
PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(PPD42XComponent), 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.Required(CONF_TYPE): cv.one_of(*PPD42X_TYPES, upper=True),
vol.Optional(CONF_PIN_02_5): pins.gpio_input_pin_schema, vol.Optional(CONF_PM_1_0): cv.nameable(PPD42X_SENSOR_SCHEMA),
vol.Optional(CONF_PIN_10_0): pins.gpio_input_pin_schema, vol.Optional(CONF_PM_2_5): cv.nameable(PPD42X_SENSOR_SCHEMA),
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, vol.Optional(CONF_PM_10_0): cv.nameable(PPD42X_SENSOR_SCHEMA),
vol.Optional(CONF_TIMEOUT): cv.positive_time_period_microseconds, vol.Optional(CONF_TEMPERATURE): cv.nameable(PPD42X_SENSOR_SCHEMA),
}).extend(cv.COMPONENT_SCHEMA.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): def to_code(config):
rhs = App.make_ppd42x(PPD42X_TYPES[config[CONF_TYPE]]) for uart_ in get_variable(config[CONF_UART_ID]):
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 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)
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' BUILD_FLAGS = '-DUSE_PPD42X'

View File

@ -79,6 +79,32 @@ sensor:
name: "Xiaomi MiJia Humidity" name: "Xiaomi MiJia Humidity"
battery_level: battery_level:
name: "Xiaomi MiJia 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 - platform: pmsx003
type: PMSX003 type: PMSX003
pm_1_0: pm_1_0:

View File

@ -44,6 +44,33 @@ deep_sleep:
sleep_duration: 50s sleep_duration: 50s
sensor: 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 - platform: pmsx003
type: PMSX003 type: PMSX003
pm_1_0: pm_1_0: