mirror of
https://github.com/esphome/esphome.git
synced 2024-11-21 22:48:10 +01:00
More Actions
This commit is contained in:
parent
94d7ac4ef0
commit
677fe8bacf
7 changed files with 115 additions and 11 deletions
|
@ -1,11 +1,12 @@
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
import esphomeyaml.config_validation as cv
|
import esphomeyaml.config_validation as cv
|
||||||
|
from esphomeyaml.components import cover, fan
|
||||||
from esphomeyaml.const import CONF_ACTION_ID, CONF_AND, CONF_AUTOMATION_ID, CONF_BLUE, \
|
from esphomeyaml.const import CONF_ACTION_ID, CONF_AND, CONF_AUTOMATION_ID, CONF_BLUE, \
|
||||||
CONF_BRIGHTNESS, CONF_CONDITION_ID, CONF_DELAY, CONF_EFFECT, CONF_FLASH_LENGTH, CONF_GREEN, \
|
CONF_BRIGHTNESS, CONF_CONDITION_ID, CONF_DELAY, CONF_EFFECT, CONF_FLASH_LENGTH, CONF_GREEN, \
|
||||||
CONF_ID, CONF_IF, CONF_LAMBDA, CONF_MAX, CONF_MIN, CONF_OR, CONF_PAYLOAD, CONF_QOS, \
|
CONF_ID, CONF_IF, CONF_LAMBDA, CONF_MAX, CONF_MIN, CONF_OR, CONF_PAYLOAD, CONF_QOS, \
|
||||||
CONF_RANGE, CONF_RED, CONF_RETAIN, CONF_THEN, CONF_TOPIC, CONF_TRANSITION_LENGTH, \
|
CONF_RANGE, CONF_RED, CONF_RETAIN, CONF_THEN, CONF_TOPIC, CONF_TRANSITION_LENGTH, \
|
||||||
CONF_TRIGGER_ID, CONF_WHITE
|
CONF_TRIGGER_ID, CONF_WHITE, CONF_OSCILLATING, CONF_SPEED
|
||||||
from esphomeyaml.core import ESPHomeYAMLError
|
from esphomeyaml.core import ESPHomeYAMLError
|
||||||
from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, TemplateArguments, add, \
|
from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, TemplateArguments, add, \
|
||||||
bool_, esphomelib_ns, float_, get_variable, process_lambda, std_string, templatable, uint32, \
|
bool_, esphomelib_ns, float_, get_variable, process_lambda, std_string, templatable, uint32, \
|
||||||
|
@ -18,6 +19,12 @@ CONF_LIGHT_TURN_ON = 'light.turn_on'
|
||||||
CONF_SWITCH_TOGGLE = 'switch.toggle'
|
CONF_SWITCH_TOGGLE = 'switch.toggle'
|
||||||
CONF_SWITCH_TURN_OFF = 'switch.turn_off'
|
CONF_SWITCH_TURN_OFF = 'switch.turn_off'
|
||||||
CONF_SWITCH_TURN_ON = 'switch.turn_on'
|
CONF_SWITCH_TURN_ON = 'switch.turn_on'
|
||||||
|
CONF_COVER_OPEN = 'cover.open'
|
||||||
|
CONF_COVER_CLOSE = 'cover.close'
|
||||||
|
CONF_COVER_STOP = 'cover.stop'
|
||||||
|
CONF_FAN_TOGGLE = 'fan.toggle'
|
||||||
|
CONF_FAN_TURN_OFF = 'fan.turn_off'
|
||||||
|
CONF_FAN_TURN_ON = 'fan.turn_on'
|
||||||
|
|
||||||
ACTION_KEYS = [CONF_DELAY, CONF_MQTT_PUBLISH, CONF_LIGHT_TOGGLE, CONF_LIGHT_TURN_OFF,
|
ACTION_KEYS = [CONF_DELAY, CONF_MQTT_PUBLISH, CONF_LIGHT_TOGGLE, CONF_LIGHT_TURN_OFF,
|
||||||
CONF_LIGHT_TURN_ON, CONF_SWITCH_TOGGLE, CONF_SWITCH_TURN_OFF, CONF_SWITCH_TURN_ON,
|
CONF_LIGHT_TURN_ON, CONF_SWITCH_TOGGLE, CONF_SWITCH_TURN_OFF, CONF_SWITCH_TURN_ON,
|
||||||
|
@ -60,6 +67,35 @@ ACTIONS_SCHEMA = vol.All(cv.ensure_list, [vol.All({
|
||||||
vol.Optional(CONF_SWITCH_TURN_ON): vol.Schema({
|
vol.Optional(CONF_SWITCH_TURN_ON): vol.Schema({
|
||||||
vol.Required(CONF_ID): cv.variable_id,
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
}),
|
}),
|
||||||
|
vol.Optional(CONF_COVER_OPEN): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
}),
|
||||||
|
vol.Optional(CONF_COVER_CLOSE): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
}),
|
||||||
|
vol.Optional(CONF_COVER_STOP): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
}),
|
||||||
|
vol.Optional(CONF_COVER_OPEN): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
}),
|
||||||
|
vol.Optional(CONF_COVER_CLOSE): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
}),
|
||||||
|
vol.Optional(CONF_COVER_STOP): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
}),
|
||||||
|
vol.Optional(CONF_FAN_TOGGLE): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
}),
|
||||||
|
vol.Optional(CONF_FAN_TURN_OFF): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
}),
|
||||||
|
vol.Optional(CONF_FAN_TURN_ON): vol.Schema({
|
||||||
|
vol.Required(CONF_ID): cv.variable_id,
|
||||||
|
vol.Optional(CONF_OSCILLATING): cv.templatable(cv.boolean),
|
||||||
|
vol.Optional(CONF_SPEED): cv.templatable(fan.validate_fan_speed),
|
||||||
|
}),
|
||||||
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
||||||
}, cv.has_at_exactly_one_key(*ACTION_KEYS))])
|
}, cv.has_at_exactly_one_key(*ACTION_KEYS))])
|
||||||
|
|
||||||
|
@ -208,6 +244,41 @@ def build_action(config, arg_type):
|
||||||
var = get_variable(conf[CONF_ID])
|
var = get_variable(conf[CONF_ID])
|
||||||
rhs = var.make_turn_on_action(template_arg)
|
rhs = var.make_turn_on_action(template_arg)
|
||||||
return Pvariable(switch.TurnOnAction.template(arg_type), config[CONF_ACTION_ID], rhs)
|
return Pvariable(switch.TurnOnAction.template(arg_type), config[CONF_ACTION_ID], rhs)
|
||||||
|
elif CONF_COVER_OPEN in config:
|
||||||
|
conf = config[CONF_COVER_OPEN]
|
||||||
|
var = get_variable(conf[CONF_ID])
|
||||||
|
rhs = var.make_open_action(template_arg)
|
||||||
|
return Pvariable(cover.OpenAction.template(arg_type), config[CONF_ACTION_ID], rhs)
|
||||||
|
elif CONF_COVER_CLOSE in config:
|
||||||
|
conf = config[CONF_SWITCH_TURN_OFF]
|
||||||
|
var = get_variable(conf[CONF_ID])
|
||||||
|
rhs = var.make_close_action(template_arg)
|
||||||
|
return Pvariable(cover.CloseAction.template(arg_type), config[CONF_ACTION_ID], rhs)
|
||||||
|
elif CONF_COVER_STOP in config:
|
||||||
|
conf = config[CONF_SWITCH_TURN_ON]
|
||||||
|
var = get_variable(conf[CONF_ID])
|
||||||
|
rhs = var.make_stop_action(template_arg)
|
||||||
|
return Pvariable(cover.StopAction.template(arg_type), config[CONF_ACTION_ID], rhs)
|
||||||
|
elif CONF_FAN_TOGGLE in config:
|
||||||
|
conf = config[CONF_FAN_TOGGLE]
|
||||||
|
var = get_variable(conf[CONF_ID])
|
||||||
|
rhs = var.make_toggle_action(template_arg)
|
||||||
|
return Pvariable(fan.ToggleAction.template(arg_type), config[CONF_ACTION_ID], rhs)
|
||||||
|
elif CONF_FAN_TURN_OFF in config:
|
||||||
|
conf = config[CONF_FAN_TURN_OFF]
|
||||||
|
var = get_variable(conf[CONF_ID])
|
||||||
|
rhs = var.make_turn_off_action(template_arg)
|
||||||
|
return Pvariable(fan.TurnOffAction.template(arg_type), config[CONF_ACTION_ID], rhs)
|
||||||
|
elif CONF_FAN_TURN_ON in config:
|
||||||
|
conf = config[CONF_FAN_TURN_ON]
|
||||||
|
var = get_variable(conf[CONF_ID])
|
||||||
|
rhs = var.make_turn_on_action(template_arg)
|
||||||
|
action = Pvariable(fan.TurnOnAction.template(arg_type), config[CONF_ACTION_ID], rhs)
|
||||||
|
if CONF_OSCILLATING in config:
|
||||||
|
add(action.set_oscillating(templatable(conf[CONF_OSCILLATING], arg_type, bool_)))
|
||||||
|
if CONF_SPEED in config:
|
||||||
|
add(action.set_speed(templatable(conf[CONF_SPEED], arg_type, fan.FanSpeed)))
|
||||||
|
return action
|
||||||
raise ESPHomeYAMLError(u"Unsupported action {}".format(config))
|
raise ESPHomeYAMLError(u"Unsupported action {}".format(config))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,9 @@ MQTTCoverComponent = cover_ns.MQTTCoverComponent
|
||||||
CoverState = cover_ns.CoverState
|
CoverState = cover_ns.CoverState
|
||||||
COVER_OPEN = cover_ns.COVER_OPEN
|
COVER_OPEN = cover_ns.COVER_OPEN
|
||||||
COVER_CLOSED = cover_ns.COVER_CLOSED
|
COVER_CLOSED = cover_ns.COVER_CLOSED
|
||||||
|
OpenAction = cover_ns.OpenAction
|
||||||
|
CloseAction = cover_ns.CloseAction
|
||||||
|
StopAction = cover_ns.StopAction
|
||||||
|
|
||||||
|
|
||||||
def setup_cover_core_(cover_var, mqtt_var, config):
|
def setup_cover_core_(cover_var, mqtt_var, config):
|
||||||
|
|
|
@ -4,22 +4,23 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import automation
|
from esphomeyaml import automation
|
||||||
from esphomeyaml.components import cover
|
from esphomeyaml.components import cover
|
||||||
from esphomeyaml.const import CONF_CLOSE_ACTION, CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, \
|
from esphomeyaml.const import CONF_CLOSE_ACTION, CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, \
|
||||||
CONF_OPEN_ACTION, CONF_STOP_ACTION
|
CONF_OPEN_ACTION, CONF_STOP_ACTION, CONF_OPTIMISTIC
|
||||||
from esphomeyaml.helpers import App, Application, NoArg, add, process_lambda, variable
|
from esphomeyaml.helpers import App, Application, NoArg, add, process_lambda, variable
|
||||||
|
|
||||||
PLATFORM_SCHEMA = cover.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(cover.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID('template_cover', CONF_MAKE_ID): cv.register_variable_id,
|
cv.GenerateID('template_cover', CONF_MAKE_ID): cv.register_variable_id,
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
||||||
|
vol.Optional(CONF_OPTIMISTIC): cv.boolean,
|
||||||
vol.Optional(CONF_OPEN_ACTION): automation.ACTIONS_SCHEMA,
|
vol.Optional(CONF_OPEN_ACTION): automation.ACTIONS_SCHEMA,
|
||||||
vol.Optional(CONF_CLOSE_ACTION): automation.ACTIONS_SCHEMA,
|
vol.Optional(CONF_CLOSE_ACTION): automation.ACTIONS_SCHEMA,
|
||||||
vol.Optional(CONF_STOP_ACTION): automation.ACTIONS_SCHEMA,
|
vol.Optional(CONF_STOP_ACTION): automation.ACTIONS_SCHEMA,
|
||||||
}).extend(cover.COVER_SCHEMA.schema)
|
}).extend(cover.COVER_SCHEMA.schema), cv.has_at_exactly_one_key(CONF_LAMBDA, CONF_OPTIMISTIC))
|
||||||
|
|
||||||
MakeTemplateCover = Application.MakeTemplateCover
|
MakeTemplateCover = Application.MakeTemplateCover
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
template_ = process_lambda(config[CONF_LAMBDA], [])
|
template_ = process_lambda(config.get(CONF_LAMBDA), [])
|
||||||
rhs = App.make_template_cover(config[CONF_NAME], template_)
|
rhs = App.make_template_cover(config[CONF_NAME], template_)
|
||||||
make = variable(MakeTemplateCover, config[CONF_MAKE_ID], rhs)
|
make = variable(MakeTemplateCover, config[CONF_MAKE_ID], rhs)
|
||||||
|
|
||||||
|
@ -32,6 +33,8 @@ def to_code(config):
|
||||||
if CONF_STOP_ACTION in config:
|
if CONF_STOP_ACTION in config:
|
||||||
actions = automation.build_actions(config[CONF_STOP_ACTION], NoArg)
|
actions = automation.build_actions(config[CONF_STOP_ACTION], NoArg)
|
||||||
add(make.Ptemplate_.add_stop_actions(actions))
|
add(make.Ptemplate_.add_stop_actions(actions))
|
||||||
|
if CONF_OPTIMISTIC in config:
|
||||||
|
add(make.Ptemplate_.set_optimistic(config[CONF_OPTIMISTIC]))
|
||||||
|
|
||||||
cover.setup_cover(make.Ptemplate_, make.Pmqtt, config)
|
cover.setup_cover(make.Ptemplate_, make.Pmqtt, config)
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,26 @@ fan_ns = esphomelib_ns.namespace('fan')
|
||||||
FanState = fan_ns.FanState
|
FanState = fan_ns.FanState
|
||||||
MQTTFanComponent = fan_ns.MQTTFanComponent
|
MQTTFanComponent = fan_ns.MQTTFanComponent
|
||||||
MakeFan = Application.MakeFan
|
MakeFan = Application.MakeFan
|
||||||
|
TurnOnAction = fan_ns.TurnOnAction
|
||||||
|
TurnOffAction = fan_ns.TurnOffAction
|
||||||
|
ToggleAction = fan_ns.ToggleAction
|
||||||
|
FanSpeed = fan_ns.FanSpeed
|
||||||
|
FAN_SPEED_OFF = fan_ns.FAN_SPEED_OFF
|
||||||
|
FAN_SPEED_LOW = fan_ns.FAN_SPEED_LOW
|
||||||
|
FAN_SPEED_MEDIUM = fan_ns.FAN_SPEED_MEDIUM
|
||||||
|
FAN_SPEED_HIGH = fan_ns.FAN_SPEED_HIGH
|
||||||
|
|
||||||
|
|
||||||
|
FAN_SPEEDS = {
|
||||||
|
'OFF': FAN_SPEED_OFF,
|
||||||
|
'LOW': FAN_SPEED_LOW,
|
||||||
|
'MEDIUM': FAN_SPEED_MEDIUM,
|
||||||
|
'HIGH': FAN_SPEED_HIGH,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def validate_fan_speed(value):
|
||||||
|
return vol.All(vol.Upper, cv.one_of(FAN_SPEEDS))(value)
|
||||||
|
|
||||||
|
|
||||||
def setup_fan_core_(fan_var, mqtt_var, config):
|
def setup_fan_core_(fan_var, mqtt_var, config):
|
||||||
|
|
|
@ -4,21 +4,22 @@ import esphomeyaml.config_validation as cv
|
||||||
from esphomeyaml import automation
|
from esphomeyaml import automation
|
||||||
from esphomeyaml.components import switch
|
from esphomeyaml.components import switch
|
||||||
from esphomeyaml.const import CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, CONF_TURN_OFF_ACTION, \
|
from esphomeyaml.const import CONF_LAMBDA, CONF_MAKE_ID, CONF_NAME, CONF_TURN_OFF_ACTION, \
|
||||||
CONF_TURN_ON_ACTION
|
CONF_TURN_ON_ACTION, CONF_OPTIMISTIC
|
||||||
from esphomeyaml.helpers import App, Application, process_lambda, variable, NoArg, add
|
from esphomeyaml.helpers import App, Application, process_lambda, variable, NoArg, add
|
||||||
|
|
||||||
PLATFORM_SCHEMA = switch.PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = vol.All(switch.PLATFORM_SCHEMA.extend({
|
||||||
cv.GenerateID('template_switch', CONF_MAKE_ID): cv.register_variable_id,
|
cv.GenerateID('template_switch', CONF_MAKE_ID): cv.register_variable_id,
|
||||||
vol.Required(CONF_LAMBDA): cv.lambda_,
|
vol.Optional(CONF_LAMBDA): cv.lambda_,
|
||||||
|
vol.Optional(CONF_OPTIMISTIC): cv.boolean,
|
||||||
vol.Optional(CONF_TURN_OFF_ACTION): automation.ACTIONS_SCHEMA,
|
vol.Optional(CONF_TURN_OFF_ACTION): automation.ACTIONS_SCHEMA,
|
||||||
vol.Optional(CONF_TURN_ON_ACTION): automation.ACTIONS_SCHEMA,
|
vol.Optional(CONF_TURN_ON_ACTION): automation.ACTIONS_SCHEMA,
|
||||||
}).extend(switch.SWITCH_SCHEMA.schema)
|
}).extend(switch.SWITCH_SCHEMA.schema), cv.has_at_exactly_one_key(CONF_LAMBDA, CONF_OPTIMISTIC))
|
||||||
|
|
||||||
MakeTemplateSwitch = Application.MakeTemplateSwitch
|
MakeTemplateSwitch = Application.MakeTemplateSwitch
|
||||||
|
|
||||||
|
|
||||||
def to_code(config):
|
def to_code(config):
|
||||||
template_ = process_lambda(config[CONF_LAMBDA], [])
|
template_ = process_lambda(config.get(CONF_LAMBDA), [])
|
||||||
rhs = App.make_template_switch(config[CONF_NAME], template_)
|
rhs = App.make_template_switch(config[CONF_NAME], template_)
|
||||||
make = variable(MakeTemplateSwitch, config[CONF_MAKE_ID], rhs)
|
make = variable(MakeTemplateSwitch, config[CONF_MAKE_ID], rhs)
|
||||||
|
|
||||||
|
@ -28,6 +29,8 @@ def to_code(config):
|
||||||
if CONF_TURN_ON_ACTION in config:
|
if CONF_TURN_ON_ACTION in config:
|
||||||
actions = automation.build_actions(config[CONF_TURN_ON_ACTION], NoArg)
|
actions = automation.build_actions(config[CONF_TURN_ON_ACTION], NoArg)
|
||||||
add(make.Ptemplate_.add_turn_on_actions(actions))
|
add(make.Ptemplate_.add_turn_on_actions(actions))
|
||||||
|
if CONF_OPTIMISTIC in config:
|
||||||
|
add(make.Ptemplate_.set_optimistic(config[CONF_OPTIMISTIC]))
|
||||||
|
|
||||||
switch.setup_switch(make.Ptemplate_, make.Pmqtt, config)
|
switch.setup_switch(make.Ptemplate_, make.Pmqtt, config)
|
||||||
|
|
||||||
|
|
|
@ -164,6 +164,7 @@ CONF_OSCILLATION_OUTPUT = 'oscillation_output'
|
||||||
CONF_SPEED = 'speed'
|
CONF_SPEED = 'speed'
|
||||||
CONF_OSCILLATION_STATE_TOPIC = 'oscillation_state_topic'
|
CONF_OSCILLATION_STATE_TOPIC = 'oscillation_state_topic'
|
||||||
CONF_OSCILLATION_COMMAND_TOPIC = 'oscillation_command_topic'
|
CONF_OSCILLATION_COMMAND_TOPIC = 'oscillation_command_topic'
|
||||||
|
CONF_OSCILLATING = 'oscillating'
|
||||||
CONF_SPEED_STATE_TOPIC = 'speed_state_topic'
|
CONF_SPEED_STATE_TOPIC = 'speed_state_topic'
|
||||||
CONF_SPEED_COMMAND_TOPIC = 'speed_command_topic'
|
CONF_SPEED_COMMAND_TOPIC = 'speed_command_topic'
|
||||||
CONF_LOW = 'low'
|
CONF_LOW = 'low'
|
||||||
|
@ -229,6 +230,7 @@ CONF_OPEN_ACTION = 'open_action'
|
||||||
CONF_CLOSE_ACTION = 'close_action'
|
CONF_CLOSE_ACTION = 'close_action'
|
||||||
CONF_STOP_ACTION = 'stop_action'
|
CONF_STOP_ACTION = 'stop_action'
|
||||||
CONF_DOMAIN = 'domain'
|
CONF_DOMAIN = 'domain'
|
||||||
|
CONF_OPTIMISTIC = 'optimistic'
|
||||||
|
|
||||||
ESP32_BOARDS = [
|
ESP32_BOARDS = [
|
||||||
'featheresp32', 'node32s', 'espea32', 'firebeetle32', 'esp32doit-devkit-v1',
|
'featheresp32', 'node32s', 'espea32', 'firebeetle32', 'esp32doit-devkit-v1',
|
||||||
|
|
|
@ -413,6 +413,8 @@ def get_variable(id, type=None):
|
||||||
|
|
||||||
|
|
||||||
def process_lambda(value, parameters, capture='=', return_type=None):
|
def process_lambda(value, parameters, capture='=', return_type=None):
|
||||||
|
if value is None:
|
||||||
|
return None
|
||||||
parts = re.split(r'id\(\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\)\.', value.value)
|
parts = re.split(r'id\(\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\)\.', value.value)
|
||||||
for i in range(1, len(parts), 2):
|
for i in range(1, len(parts), 2):
|
||||||
parts[i] = get_variable(parts[i])._
|
parts[i] = get_variable(parts[i])._
|
||||||
|
|
Loading…
Reference in a new issue