mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	| @@ -254,6 +254,7 @@ def setup_binary_sensor_core_(var, config): | |||||||
|         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var, timings) |         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var, timings) | ||||||
|         if CONF_INVALID_COOLDOWN in conf: |         if CONF_INVALID_COOLDOWN in conf: | ||||||
|             cg.add(trigger.set_invalid_cooldown(conf[CONF_INVALID_COOLDOWN])) |             cg.add(trigger.set_invalid_cooldown(conf[CONF_INVALID_COOLDOWN])) | ||||||
|  |         yield cg.register_component(trigger, conf) | ||||||
|         yield automation.build_automation(trigger, [], conf) |         yield automation.build_automation(trigger, [], conf) | ||||||
|  |  | ||||||
|     for conf in config.get(CONF_ON_STATE, []): |     for conf in config.get(CONF_ON_STATE, []): | ||||||
|   | |||||||
| @@ -63,6 +63,7 @@ def register_fan(var, config): | |||||||
|     if not CORE.has_id(config[CONF_ID]): |     if not CORE.has_id(config[CONF_ID]): | ||||||
|         var = cg.Pvariable(config[CONF_ID], var) |         var = cg.Pvariable(config[CONF_ID], var) | ||||||
|     cg.add(cg.App.register_fan(var)) |     cg.add(cg.App.register_fan(var)) | ||||||
|  |     yield cg.register_component(var, config) | ||||||
|     yield setup_fan_core_(var, config) |     yield setup_fan_core_(var, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ from esphome.const import CONF_ASSUMED_STATE, CONF_CLOSE_ACTION, CONF_CURRENT_OP | |||||||
|     CONF_STATE, CONF_STOP_ACTION |     CONF_STATE, CONF_STOP_ACTION | ||||||
| from .. import template_ns | from .. import template_ns | ||||||
|  |  | ||||||
| TemplateCover = template_ns.class_('TemplateCover', cover.Cover) | TemplateCover = template_ns.class_('TemplateCover', cover.Cover, cg.Component) | ||||||
|  |  | ||||||
| TemplateCoverRestoreMode = template_ns.enum('TemplateCoverRestoreMode') | TemplateCoverRestoreMode = template_ns.enum('TemplateCoverRestoreMode') | ||||||
| RESTORE_MODES = { | RESTORE_MODES = { | ||||||
|   | |||||||
| @@ -285,6 +285,7 @@ def setup_time_core_(time_var, config): | |||||||
|         days_of_week = conf.get(CONF_DAYS_OF_WEEK, [x for x in range(1, 8)]) |         days_of_week = conf.get(CONF_DAYS_OF_WEEK, [x for x in range(1, 8)]) | ||||||
|         cg.add(trigger.add_days_of_week(days_of_week)) |         cg.add(trigger.add_days_of_week(days_of_week)) | ||||||
|  |  | ||||||
|  |         yield cg.register_component(trigger, conf) | ||||||
|         yield automation.build_automation(trigger, [], conf) |         yield automation.build_automation(trigger, [], conf) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ from .. import uart_ns | |||||||
|  |  | ||||||
| DEPENDENCIES = ['uart'] | DEPENDENCIES = ['uart'] | ||||||
|  |  | ||||||
| UARTSwitch = uart_ns.class_('UARTSwitch', switch.Switch, uart.UARTDevice) | UARTSwitch = uart_ns.class_('UARTSwitch', switch.Switch, uart.UARTDevice, cg.Component) | ||||||
|  |  | ||||||
|  |  | ||||||
| def validate_data(value): | def validate_data(value): | ||||||
|   | |||||||
| @@ -322,6 +322,7 @@ def iter_ids(config, path=None): | |||||||
|  |  | ||||||
| def do_id_pass(result):  # type: (Config) -> None | def do_id_pass(result):  # type: (Config) -> None | ||||||
|     from esphome.cpp_generator import MockObjClass |     from esphome.cpp_generator import MockObjClass | ||||||
|  |     from esphome.cpp_types import Component | ||||||
|  |  | ||||||
|     declare_ids = []  # type: List[Tuple[core.ID, ConfigPath]] |     declare_ids = []  # type: List[Tuple[core.ID, ConfigPath]] | ||||||
|     searching_ids = []  # type: List[Tuple[core.ID, ConfigPath]] |     searching_ids = []  # type: List[Tuple[core.ID, ConfigPath]] | ||||||
| @@ -340,6 +341,8 @@ def do_id_pass(result):  # type: (Config) -> None | |||||||
|     # Resolve default ids after manual IDs |     # Resolve default ids after manual IDs | ||||||
|     for id, _ in declare_ids: |     for id, _ in declare_ids: | ||||||
|         id.resolve([v[0].id for v in declare_ids]) |         id.resolve([v[0].id for v in declare_ids]) | ||||||
|  |         if isinstance(id.type, MockObjClass) and id.type.inherits_from(Component): | ||||||
|  |             CORE.component_ids.add(id.id) | ||||||
|  |  | ||||||
|     # Check searched IDs |     # Check searched IDs | ||||||
|     for id, path in searching_ids: |     for id, path in searching_ids: | ||||||
|   | |||||||
| @@ -505,6 +505,8 @@ class EsphomeCore(object): | |||||||
|         self.active_coroutines = {}  # type: Dict[int, Any] |         self.active_coroutines = {}  # type: Dict[int, Any] | ||||||
|         # A set of strings of names of loaded integrations, used to find namespace ID conflicts |         # A set of strings of names of loaded integrations, used to find namespace ID conflicts | ||||||
|         self.loaded_integrations = set() |         self.loaded_integrations = set() | ||||||
|  |         # A set of component IDs to track what Component subclasses are declared | ||||||
|  |         self.component_ids = set() | ||||||
|  |  | ||||||
|     def reset(self): |     def reset(self): | ||||||
|         self.dashboard = False |         self.dashboard = False | ||||||
| @@ -525,6 +527,7 @@ class EsphomeCore(object): | |||||||
|         self.defines = set() |         self.defines = set() | ||||||
|         self.active_coroutines = {} |         self.active_coroutines = {} | ||||||
|         self.loaded_integrations = set() |         self.loaded_integrations = set() | ||||||
|  |         self.component_ids = set() | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def address(self):  # type: () -> str |     def address(self):  # type: () -> str | ||||||
| @@ -626,6 +629,12 @@ class EsphomeCore(object): | |||||||
|             _LOGGER.warning(u"Please file a bug report with your configuration.") |             _LOGGER.warning(u"Please file a bug report with your configuration.") | ||||||
|         if self.active_coroutines: |         if self.active_coroutines: | ||||||
|             raise EsphomeError() |             raise EsphomeError() | ||||||
|  |         if self.component_ids: | ||||||
|  |             comps = u', '.join(u"'{}'".format(x) for x in self.component_ids) | ||||||
|  |             _LOGGER.warning(u"Components %s were never registered. Please create a bug report", | ||||||
|  |                             comps) | ||||||
|  |             _LOGGER.warning(u"with your configuration.") | ||||||
|  |             raise EsphomeError() | ||||||
|         self.active_coroutines.clear() |         self.active_coroutines.clear() | ||||||
|  |  | ||||||
|     def add(self, expression): |     def add(self, expression): | ||||||
|   | |||||||
| @@ -18,9 +18,11 @@ from esphome.pins import ESP8266_FLASH_SIZES, ESP8266_LD_SCRIPTS | |||||||
| _LOGGER = logging.getLogger(__name__) | _LOGGER = logging.getLogger(__name__) | ||||||
|  |  | ||||||
| BUILD_FLASH_MODES = ['qio', 'qout', 'dio', 'dout'] | BUILD_FLASH_MODES = ['qio', 'qout', 'dio', 'dout'] | ||||||
| StartupTrigger = cg.esphome_ns.StartupTrigger | StartupTrigger = cg.esphome_ns.class_('StartupTrigger', cg.Component, automation.Trigger.template()) | ||||||
| ShutdownTrigger = cg.esphome_ns.ShutdownTrigger | ShutdownTrigger = cg.esphome_ns.class_('ShutdownTrigger', cg.Component, | ||||||
| LoopTrigger = cg.esphome_ns.LoopTrigger |                                        automation.Trigger.template()) | ||||||
|  | LoopTrigger = cg.esphome_ns.class_('LoopTrigger', cg.Component, | ||||||
|  |                                    automation.Trigger.template()) | ||||||
|  |  | ||||||
| VERSION_REGEX = re.compile(r'^[0-9]+\.[0-9]+\.[0-9]+(?:[ab]\d+)?$') | VERSION_REGEX = re.compile(r'^[0-9]+\.[0-9]+\.[0-9]+(?:[ab]\d+)?$') | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,8 +1,9 @@ | |||||||
| from esphome.const import CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_SETUP_PRIORITY, \ | from esphome.const import CONF_INVERTED, CONF_MODE, CONF_NUMBER, CONF_SETUP_PRIORITY, \ | ||||||
|     CONF_UPDATE_INTERVAL, CONF_TYPE_ID |     CONF_UPDATE_INTERVAL, CONF_TYPE_ID | ||||||
| from esphome.core import coroutine, ID | from esphome.core import coroutine, ID, CORE | ||||||
| from esphome.cpp_generator import RawExpression, add, get_variable | from esphome.cpp_generator import RawExpression, add, get_variable | ||||||
| from esphome.cpp_types import App, GPIOPin | from esphome.cpp_types import App, GPIOPin | ||||||
|  | from esphome.py_compat import text_type | ||||||
|  |  | ||||||
|  |  | ||||||
| @coroutine | @coroutine | ||||||
| @@ -34,6 +35,12 @@ def register_component(var, config): | |||||||
|     :param var: The variable representing the component. |     :param var: The variable representing the component. | ||||||
|     :param config: The configuration for the component. |     :param config: The configuration for the component. | ||||||
|     """ |     """ | ||||||
|  |     id_ = text_type(var.base) | ||||||
|  |     if id_ not in CORE.component_ids: | ||||||
|  |         raise ValueError(u"Component ID {} was not declared to inherit from Component, " | ||||||
|  |                          u"or was registered twice. Please create a bug report with your " | ||||||
|  |                          u"configuration.".format(id_)) | ||||||
|  |     CORE.component_ids.remove(id_) | ||||||
|     if CONF_SETUP_PRIORITY in config: |     if CONF_SETUP_PRIORITY in config: | ||||||
|         add(var.set_setup_priority(config[CONF_SETUP_PRIORITY])) |         add(var.set_setup_priority(config[CONF_SETUP_PRIORITY])) | ||||||
|     if CONF_UPDATE_INTERVAL in config: |     if CONF_UPDATE_INTERVAL in config: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user