diff --git a/esphomeyaml/config.py b/esphomeyaml/config.py index bdcfc6680d..6aa2489097 100644 --- a/esphomeyaml/config.py +++ b/esphomeyaml/config.py @@ -8,19 +8,21 @@ import voluptuous as vol from voluptuous.humanize import humanize_error import esphomeyaml.config_validation as cv -from esphomeyaml import core, yaml_util +from esphomeyaml import core, yaml_util, automation from esphomeyaml.const import CONF_BOARD, CONF_BOARD_FLASH_MODE, CONF_ESPHOMEYAML, \ - CONF_LIBRARY_URI, \ - CONF_NAME, CONF_PLATFORM, CONF_SIMPLIFY, CONF_USE_BUILD_FLAGS, CONF_WIFI, ESP_PLATFORMS, \ - ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 + CONF_LIBRARY_URI, CONF_NAME, CONF_PLATFORM, CONF_SIMPLIFY, CONF_USE_BUILD_FLAGS, CONF_WIFI, \ + ESP_PLATFORMS, ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266, CONF_ON_BOOT, CONF_TRIGGER_ID, \ + CONF_PRIORITY, CONF_ON_SHUTDOWN from esphomeyaml.core import ESPHomeYAMLError -from esphomeyaml.helpers import App, add, color +from esphomeyaml.helpers import App, add, color, esphomelib_ns, Pvariable, NoArg, const_char_p _LOGGER = logging.getLogger(__name__) DEFAULT_LIBRARY_URI = u'https://github.com/OttoWinter/esphomelib.git#v1.6.2' BUILD_FLASH_MODES = ['qio', 'qout', 'dio', 'dout'] +StartupTrigger = esphomelib_ns.StartupTrigger +ShutdownTrigger = esphomelib_ns.ShutdownTrigger CORE_SCHEMA = vol.Schema({ vol.Required(CONF_NAME): cv.valid_name, @@ -30,6 +32,13 @@ CORE_SCHEMA = vol.Schema({ vol.Optional(CONF_SIMPLIFY, default=True): cv.boolean, vol.Optional(CONF_USE_BUILD_FLAGS, default=True): cv.boolean, vol.Optional(CONF_BOARD_FLASH_MODE): vol.All(vol.Lower, cv.one_of(*BUILD_FLASH_MODES)), + vol.Optional(CONF_ON_BOOT): vol.All(cv.ensure_list, [automation.AUTOMATION_SCHEMA.extend({ + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(StartupTrigger), + vol.Optional(CONF_PRIORITY): vol.Coerce(float), + })]), + vol.Optional(CONF_ON_SHUTDOWN): vol.All(cv.ensure_list, [automation.AUTOMATION_SCHEMA.extend({ + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(ShutdownTrigger), + })]), }) REQUIRED_COMPONENTS = [ @@ -43,6 +52,15 @@ _ALL_COMPONENTS = [] def core_to_code(config): add(App.set_name(config[CONF_NAME])) + for conf in config.get(CONF_ON_BOOT, []): + rhs = App.register_component(StartupTrigger.new(conf.get(CONF_PRIORITY))) + trigger = Pvariable(conf[CONF_TRIGGER_ID], rhs) + automation.build_automation(trigger, NoArg, conf) + + for conf in config.get(CONF_ON_SHUTDOWN, []): + trigger = Pvariable(conf[CONF_TRIGGER_ID], ShutdownTrigger.new()) + automation.build_automation(trigger, const_char_p, conf) + def get_component(domain): if domain in _COMPONENT_CACHE: diff --git a/esphomeyaml/const.py b/esphomeyaml/const.py index 2d8f6fca9a..8e94a3b09c 100644 --- a/esphomeyaml/const.py +++ b/esphomeyaml/const.py @@ -231,6 +231,9 @@ CONF_CLOSE_ACTION = 'close_action' CONF_STOP_ACTION = 'stop_action' CONF_DOMAIN = 'domain' CONF_OPTIMISTIC = 'optimistic' +CONF_ON_BOOT = 'on_boot' +CONF_ON_SHUTDOWN = 'on_shutdown' +CONF_PRIORITY = 'priority' ESP32_BOARDS = [ 'featheresp32', 'node32s', 'espea32', 'firebeetle32', 'esp32doit-devkit-v1', diff --git a/esphomeyaml/helpers.py b/esphomeyaml/helpers.py index dc5a350dbc..518eb09873 100644 --- a/esphomeyaml/helpers.py +++ b/esphomeyaml/helpers.py @@ -534,6 +534,7 @@ std_string = std_ns.string uint8 = global_ns.namespace('uint8_t') uint16 = global_ns.namespace('uint16_t') uint32 = global_ns.namespace('uint32_t') +const_char_p = global_ns.namespace('const char *') NAN = global_ns.namespace('NAN') esphomelib_ns = global_ns # using namespace esphomelib; NoArg = esphomelib_ns.NoArg