mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	More Actions
This commit is contained in:
		| @@ -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])._ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user