mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 13:34:54 +01:00
Rewrite interrupt components (#464)
* Rewrite intterupt components * Fix test
This commit is contained in:
parent
4b017e2096
commit
5a102c2ab7
11 changed files with 57 additions and 19 deletions
|
@ -42,7 +42,8 @@ def validate_dumpers_all(value):
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema({
|
CONFIG_SCHEMA = cv.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(RemoteReceiverComponent),
|
cv.GenerateID(): cv.declare_variable_id(RemoteReceiverComponent),
|
||||||
vol.Required(CONF_PIN): pins.gpio_input_pin_schema,
|
vol.Required(CONF_PIN): vol.All(pins.internal_gpio_input_pin_schema,
|
||||||
|
pins.validate_has_interrupt),
|
||||||
vol.Optional(CONF_DUMP, default=[]):
|
vol.Optional(CONF_DUMP, default=[]):
|
||||||
vol.Any(validate_dumpers_all, cv.ensure_list(cv.one_of(*DUMPERS, lower=True))),
|
vol.Any(validate_dumpers_all, cv.ensure_list(cv.one_of(*DUMPERS, lower=True))),
|
||||||
vol.Optional(CONF_TOLERANCE): vol.All(cv.percentage_int, vol.Range(min=0)),
|
vol.Optional(CONF_TOLERANCE): vol.All(cv.percentage_int, vol.Range(min=0)),
|
||||||
|
|
|
@ -12,7 +12,8 @@ DutyCycleSensor = sensor.sensor_ns.class_('DutyCycleSensor', sensor.PollingSenso
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(DutyCycleSensor),
|
cv.GenerateID(): cv.declare_variable_id(DutyCycleSensor),
|
||||||
vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema,
|
vol.Required(CONF_PIN): vol.All(pins.internal_gpio_input_pin_schema,
|
||||||
|
pins.validate_has_interrupt),
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema))
|
}).extend(cv.COMPONENT_SCHEMA.schema))
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ from esphome import pins
|
||||||
from esphome.components import sensor
|
from esphome.components import sensor
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_COUNT_MODE, CONF_FALLING_EDGE, CONF_ID, CONF_INTERNAL_FILTER, \
|
from esphome.const import CONF_COUNT_MODE, CONF_FALLING_EDGE, CONF_ID, CONF_INTERNAL_FILTER, \
|
||||||
CONF_NAME, CONF_PIN, CONF_RISING_EDGE, CONF_UPDATE_INTERVAL
|
CONF_NAME, CONF_PIN, CONF_RISING_EDGE, CONF_UPDATE_INTERVAL, CONF_NUMBER
|
||||||
from esphome.core import CORE
|
from esphome.core import CORE
|
||||||
from esphome.cpp_generator import Pvariable, add
|
from esphome.cpp_generator import Pvariable, add
|
||||||
from esphome.cpp_helpers import gpio_input_pin_expression, setup_component
|
from esphome.cpp_helpers import gpio_input_pin_expression, setup_component
|
||||||
|
@ -38,9 +38,16 @@ def validate_internal_filter(value):
|
||||||
return cv.positive_time_period_microseconds(value)
|
return cv.positive_time_period_microseconds(value)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_pulse_counter_pin(value):
|
||||||
|
value = pins.internal_gpio_input_pin_schema(value)
|
||||||
|
if CORE.is_esp8266 and value[CONF_NUMBER] >= 16:
|
||||||
|
raise vol.Invalid("Pins GPIO16 and GPIO17 cannot be used as pulse counters on ESP8266.")
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(PulseCounterSensorComponent),
|
cv.GenerateID(): cv.declare_variable_id(PulseCounterSensorComponent),
|
||||||
vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema,
|
vol.Required(CONF_PIN): validate_pulse_counter_pin,
|
||||||
vol.Optional(CONF_COUNT_MODE): cv.Schema({
|
vol.Optional(CONF_COUNT_MODE): cv.Schema({
|
||||||
vol.Required(CONF_RISING_EDGE): COUNT_MODE_SCHEMA,
|
vol.Required(CONF_RISING_EDGE): COUNT_MODE_SCHEMA,
|
||||||
vol.Required(CONF_FALLING_EDGE): COUNT_MODE_SCHEMA,
|
vol.Required(CONF_FALLING_EDGE): COUNT_MODE_SCHEMA,
|
||||||
|
|
|
@ -34,8 +34,10 @@ def validate_min_max_value(config):
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(RotaryEncoderSensor),
|
cv.GenerateID(): cv.declare_variable_id(RotaryEncoderSensor),
|
||||||
vol.Required(CONF_PIN_A): pins.internal_gpio_input_pin_schema,
|
vol.Required(CONF_PIN_A): vol.All(pins.internal_gpio_input_pin_schema,
|
||||||
vol.Required(CONF_PIN_B): pins.internal_gpio_input_pin_schema,
|
pins.validate_has_interrupt),
|
||||||
|
vol.Required(CONF_PIN_B): vol.All(pins.internal_gpio_input_pin_schema,
|
||||||
|
pins.validate_has_interrupt),
|
||||||
vol.Optional(CONF_PIN_RESET): pins.internal_gpio_input_pin_schema,
|
vol.Optional(CONF_PIN_RESET): pins.internal_gpio_input_pin_schema,
|
||||||
vol.Optional(CONF_RESOLUTION): cv.one_of(*RESOLUTIONS, int=True),
|
vol.Optional(CONF_RESOLUTION): cv.one_of(*RESOLUTIONS, int=True),
|
||||||
vol.Optional(CONF_MIN_VALUE): cv.int_,
|
vol.Optional(CONF_MIN_VALUE): cv.int_,
|
||||||
|
|
|
@ -3,23 +3,32 @@ import voluptuous as vol
|
||||||
from esphome import pins
|
from esphome import pins
|
||||||
from esphome.components import sensor
|
from esphome.components import sensor
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_ECHO_PIN, CONF_ID, CONF_NAME, CONF_TIMEOUT_METER, \
|
from esphome.const import CONF_ECHO_PIN, CONF_ID, CONF_NAME, CONF_TRIGGER_PIN, \
|
||||||
CONF_TIMEOUT_TIME, CONF_TRIGGER_PIN, CONF_UPDATE_INTERVAL
|
CONF_UPDATE_INTERVAL, CONF_TIMEOUT
|
||||||
from esphome.cpp_generator import Pvariable, add
|
from esphome.cpp_generator import Pvariable, add
|
||||||
from esphome.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \
|
from esphome.cpp_helpers import gpio_input_pin_expression, gpio_output_pin_expression, \
|
||||||
setup_component
|
setup_component
|
||||||
from esphome.cpp_types import App
|
from esphome.cpp_types import App
|
||||||
|
|
||||||
|
CONF_PULSE_TIME = 'pulse_time'
|
||||||
|
|
||||||
UltrasonicSensorComponent = sensor.sensor_ns.class_('UltrasonicSensorComponent',
|
UltrasonicSensorComponent = sensor.sensor_ns.class_('UltrasonicSensorComponent',
|
||||||
sensor.PollingSensorComponent)
|
sensor.PollingSensorComponent)
|
||||||
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID(): cv.declare_variable_id(UltrasonicSensorComponent),
|
cv.GenerateID(): cv.declare_variable_id(UltrasonicSensorComponent),
|
||||||
vol.Required(CONF_TRIGGER_PIN): pins.gpio_output_pin_schema,
|
vol.Required(CONF_TRIGGER_PIN): pins.gpio_output_pin_schema,
|
||||||
vol.Required(CONF_ECHO_PIN): pins.internal_gpio_input_pin_schema,
|
vol.Required(CONF_ECHO_PIN): pins.internal_gpio_input_pin_schema,
|
||||||
vol.Exclusive(CONF_TIMEOUT_METER, 'timeout'): cv.positive_float,
|
|
||||||
vol.Exclusive(CONF_TIMEOUT_TIME, 'timeout'): cv.positive_time_period_microseconds,
|
vol.Optional(CONF_TIMEOUT): cv.distance,
|
||||||
|
vol.Optional(CONF_PULSE_TIME): cv.positive_time_period_microseconds,
|
||||||
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval,
|
||||||
|
|
||||||
|
vol.Optional('timeout_meter'): cv.invalid("The timeout_meter option has been renamed "
|
||||||
|
"to 'timeout'."),
|
||||||
|
vol.Optional('timeout_time'): cv.invalid("The timeout_time option has been removed. Please "
|
||||||
|
"use 'timeout'."),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,10 +41,11 @@ def to_code(config):
|
||||||
config.get(CONF_UPDATE_INTERVAL))
|
config.get(CONF_UPDATE_INTERVAL))
|
||||||
ultrasonic = Pvariable(config[CONF_ID], rhs)
|
ultrasonic = Pvariable(config[CONF_ID], rhs)
|
||||||
|
|
||||||
if CONF_TIMEOUT_TIME in config:
|
if CONF_TIMEOUT in config:
|
||||||
add(ultrasonic.set_timeout_us(config[CONF_TIMEOUT_TIME]))
|
add(ultrasonic.set_timeout_us(config[CONF_TIMEOUT] / (0.000343 / 2)))
|
||||||
elif CONF_TIMEOUT_METER in config:
|
|
||||||
add(ultrasonic.set_timeout_m(config[CONF_TIMEOUT_METER]))
|
if CONF_PULSE_TIME in config:
|
||||||
|
add(ultrasonic.set_pulse_time_us(config[CONF_PULSE_TIME]))
|
||||||
|
|
||||||
sensor.setup_sensor(ultrasonic, config)
|
sensor.setup_sensor(ultrasonic, config)
|
||||||
setup_component(ultrasonic, config)
|
setup_component(ultrasonic, config)
|
||||||
|
|
|
@ -3,6 +3,7 @@ import voluptuous as vol
|
||||||
from esphome import pins
|
from esphome import pins
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_BAUD_RATE, CONF_ID, CONF_RX_PIN, CONF_TX_PIN
|
from esphome.const import CONF_BAUD_RATE, CONF_ID, CONF_RX_PIN, CONF_TX_PIN
|
||||||
|
from esphome.core import CORE
|
||||||
from esphome.cpp_generator import Pvariable, add
|
from esphome.cpp_generator import Pvariable, add
|
||||||
from esphome.cpp_helpers import setup_component
|
from esphome.cpp_helpers import setup_component
|
||||||
from esphome.cpp_types import App, Component, esphome_ns
|
from esphome.cpp_types import App, Component, esphome_ns
|
||||||
|
@ -11,10 +12,18 @@ UARTComponent = esphome_ns.class_('UARTComponent', Component)
|
||||||
UARTDevice = esphome_ns.class_('UARTDevice')
|
UARTDevice = esphome_ns.class_('UARTDevice')
|
||||||
MULTI_CONF = True
|
MULTI_CONF = True
|
||||||
|
|
||||||
|
|
||||||
|
def validate_rx_pin(value):
|
||||||
|
value = pins.input_pin(value)
|
||||||
|
if CORE.is_esp8266 and value >= 16:
|
||||||
|
raise vol.Invalid("Pins GPIO16 and GPIO17 cannot be used as RX pins on ESP8266.")
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.All(cv.Schema({
|
CONFIG_SCHEMA = vol.All(cv.Schema({
|
||||||
cv.GenerateID(): cv.declare_variable_id(UARTComponent),
|
cv.GenerateID(): cv.declare_variable_id(UARTComponent),
|
||||||
vol.Optional(CONF_TX_PIN): pins.output_pin,
|
vol.Optional(CONF_TX_PIN): pins.output_pin,
|
||||||
vol.Optional(CONF_RX_PIN): pins.input_pin,
|
vol.Optional(CONF_RX_PIN): validate_rx_pin,
|
||||||
vol.Required(CONF_BAUD_RATE): cv.positive_int,
|
vol.Required(CONF_BAUD_RATE): cv.positive_int,
|
||||||
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(CONF_TX_PIN, CONF_RX_PIN))
|
}).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(CONF_TX_PIN, CONF_RX_PIN))
|
||||||
|
|
||||||
|
|
|
@ -430,6 +430,7 @@ frequency = float_with_unit("frequency", r"(Hz|HZ|hz)?")
|
||||||
resistance = float_with_unit("resistance", r"(Ω|Ω|ohm|Ohm|OHM)?")
|
resistance = float_with_unit("resistance", r"(Ω|Ω|ohm|Ohm|OHM)?")
|
||||||
current = float_with_unit("current", r"(a|A|amp|Amp|amps|Amps|ampere|Ampere)?")
|
current = float_with_unit("current", r"(a|A|amp|Amp|amps|Amps|ampere|Ampere)?")
|
||||||
voltage = float_with_unit("voltage", r"(v|V|volt|Volts)?")
|
voltage = float_with_unit("voltage", r"(v|V|volt|Volts)?")
|
||||||
|
distance = float_with_unit("distance", r"(m)")
|
||||||
|
|
||||||
|
|
||||||
def validate_bytes(value):
|
def validate_bytes(value):
|
||||||
|
|
|
@ -157,8 +157,7 @@ CONF_ATTENUATION = 'attenuation'
|
||||||
CONF_PRESSURE = 'pressure'
|
CONF_PRESSURE = 'pressure'
|
||||||
CONF_TRIGGER_PIN = 'trigger_pin'
|
CONF_TRIGGER_PIN = 'trigger_pin'
|
||||||
CONF_ECHO_PIN = 'echo_pin'
|
CONF_ECHO_PIN = 'echo_pin'
|
||||||
CONF_TIMEOUT_METER = 'timeout_meter'
|
CONF_TIMEOUT = 'timeout'
|
||||||
CONF_TIMEOUT_TIME = 'timeout_time'
|
|
||||||
CONF_CARRIER_DUTY_PERCENT = 'carrier_duty_percent'
|
CONF_CARRIER_DUTY_PERCENT = 'carrier_duty_percent'
|
||||||
CONF_NEC = 'nec'
|
CONF_NEC = 'nec'
|
||||||
CONF_COMMAND = 'command'
|
CONF_COMMAND = 'command'
|
||||||
|
|
|
@ -194,7 +194,7 @@ CONFIG_SCHEMA = cv.Schema({
|
||||||
def preload_core_config(config):
|
def preload_core_config(config):
|
||||||
if 'esphomeyaml' in config:
|
if 'esphomeyaml' in config:
|
||||||
_LOGGER.warning("The esphomeyaml section has been renamed to esphome in 1.11.0. "
|
_LOGGER.warning("The esphomeyaml section has been renamed to esphome in 1.11.0. "
|
||||||
"Please replace 'esphomeyaml:' in your configuration by 'esphome:'.")
|
"Please replace 'esphomeyaml:' in your configuration with 'esphome:'.")
|
||||||
config[CONF_ESPHOME] = config.pop('esphomeyaml')
|
config[CONF_ESPHOME] = config.pop('esphomeyaml')
|
||||||
if CONF_ESPHOME not in config:
|
if CONF_ESPHOME not in config:
|
||||||
raise EsphomeError(u"No esphome section in config")
|
raise EsphomeError(u"No esphome section in config")
|
||||||
|
|
|
@ -348,6 +348,14 @@ def shorthand_input_pullup_pin(value):
|
||||||
return {CONF_NUMBER: value}
|
return {CONF_NUMBER: value}
|
||||||
|
|
||||||
|
|
||||||
|
def validate_has_interrupt(value):
|
||||||
|
if CORE.is_esp8266:
|
||||||
|
if value[CONF_NUMBER] >= 16:
|
||||||
|
raise vol.Invalid("Pins GPIO16 and GPIO17 do not support interrupts and cannot be used "
|
||||||
|
"here, got {}".format(value[CONF_NUMBER]))
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
I2CDevice = esphome_ns.class_('I2CDevice')
|
I2CDevice = esphome_ns.class_('I2CDevice')
|
||||||
PCF8574Component = io_ns.class_('PCF8574Component', Component, I2CDevice)
|
PCF8574Component = io_ns.class_('PCF8574Component', Component, I2CDevice)
|
||||||
|
|
||||||
|
|
|
@ -475,7 +475,7 @@ sensor:
|
||||||
number: GPIO23
|
number: GPIO23
|
||||||
inverted: true
|
inverted: true
|
||||||
name: "Ultrasonic Sensor"
|
name: "Ultrasonic Sensor"
|
||||||
timeout_meter: 5.5
|
timeout: 5.5m
|
||||||
id: ultrasonic_sensor1
|
id: ultrasonic_sensor1
|
||||||
- platform: uptime
|
- platform: uptime
|
||||||
name: Uptime Sensor
|
name: Uptime Sensor
|
||||||
|
|
Loading…
Reference in a new issue