diff --git a/esphome/components/binary_sensor/__init__.py b/esphome/components/binary_sensor/__init__.py index 0f921eaf748..1f641185602 100644 --- a/esphome/components/binary_sensor/__init__.py +++ b/esphome/components/binary_sensor/__init__.py @@ -554,20 +554,8 @@ def binary_sensor_schema( return _BINARY_SENSOR_SCHEMA.extend(schema) -@setup_entity("binary_sensor") -async def setup_binary_sensor_core_(var, config): - setup_device_class(config) - trigger = config.get(CONF_TRIGGER_ON_INITIAL_STATE, False) or config.get( - CONF_PUBLISH_INITIAL_STATE, False - ) - cg.add(var.set_trigger_on_initial_state(trigger)) - if inverted := config.get(CONF_INVERTED): - cg.add(var.set_inverted(inverted)) - if filters_config := config.get(CONF_FILTERS): - cg.add_define("USE_BINARY_SENSOR_FILTER") - filters = await cg.build_registry_list(FILTER_REGISTRY, filters_config) - cg.add(var.add_filters(filters)) - +@coroutine_with_priority(CoroPriority.AUTOMATION) +async def _build_binary_sensor_automations(var, config): for conf in config.get(CONF_ON_PRESS, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [], conf) @@ -619,6 +607,23 @@ async def setup_binary_sensor_core_(var, config): conf, ) + +@setup_entity("binary_sensor") +async def setup_binary_sensor_core_(var, config): + setup_device_class(config) + trigger = config.get(CONF_TRIGGER_ON_INITIAL_STATE, False) or config.get( + CONF_PUBLISH_INITIAL_STATE, False + ) + cg.add(var.set_trigger_on_initial_state(trigger)) + if inverted := config.get(CONF_INVERTED): + cg.add(var.set_inverted(inverted)) + if filters_config := config.get(CONF_FILTERS): + cg.add_define("USE_BINARY_SENSOR_FILTER") + filters = await cg.build_registry_list(FILTER_REGISTRY, filters_config) + cg.add(var.add_filters(filters)) + + CORE.add_job(_build_binary_sensor_automations, var, config) + if mqtt_id := config.get(CONF_MQTT_ID): mqtt_ = cg.new_Pvariable(mqtt_id, var) await mqtt.register_mqtt_component(mqtt_, config) diff --git a/esphome/components/number/__init__.py b/esphome/components/number/__init__.py index dc07b4bfea3..0570ac0b1ec 100644 --- a/esphome/components/number/__init__.py +++ b/esphome/components/number/__init__.py @@ -245,19 +245,8 @@ def number_schema( return _NUMBER_SCHEMA.extend(schema) -@setup_entity("number") -async def setup_number_core_( - var, config, *, min_value: float, max_value: float, step: float -): - cg.add(var.traits.set_min_value(min_value)) - cg.add(var.traits.set_max_value(max_value)) - cg.add(var.traits.set_step(step)) - - # Only set if non-default to avoid bloating setup() function - # (mode_ is initialized to NUMBER_MODE_AUTO in the header) - if config[CONF_MODE] != NumberMode.NUMBER_MODE_AUTO: - cg.add(var.traits.set_mode(config[CONF_MODE])) - +@coroutine_with_priority(CoroPriority.AUTOMATION) +async def _build_number_automations(var, config): for conf in config.get(CONF_ON_VALUE, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [(float, "x")], conf) @@ -272,6 +261,22 @@ async def setup_number_core_( cg.add(trigger.set_max(template_)) await automation.build_automation(trigger, [(float, "x")], conf) + +@setup_entity("number") +async def setup_number_core_( + var, config, *, min_value: float, max_value: float, step: float +): + cg.add(var.traits.set_min_value(min_value)) + cg.add(var.traits.set_max_value(max_value)) + cg.add(var.traits.set_step(step)) + + # Only set if non-default to avoid bloating setup() function + # (mode_ is initialized to NUMBER_MODE_AUTO in the header) + if config[CONF_MODE] != NumberMode.NUMBER_MODE_AUTO: + cg.add(var.traits.set_mode(config[CONF_MODE])) + + CORE.add_job(_build_number_automations, var, config) + setup_device_class(config) setup_unit_of_measurement(config) diff --git a/esphome/components/sensor/__init__.py b/esphome/components/sensor/__init__.py index 700373110e0..4be6ed1b841 100644 --- a/esphome/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -893,22 +893,8 @@ async def build_filters(config): return await cg.build_registry_list(FILTER_REGISTRY, config) -@setup_entity("sensor") -async def setup_sensor_core_(var, config): - setup_device_class(config) - setup_unit_of_measurement(config) - if (state_class := config.get(CONF_STATE_CLASS)) is not None: - cg.add(var.set_state_class(state_class)) - if (accuracy_decimals := config.get(CONF_ACCURACY_DECIMALS)) is not None: - cg.add(var.set_accuracy_decimals(accuracy_decimals)) - # Only set force_update if True (default is False) - if config[CONF_FORCE_UPDATE]: - cg.add(var.set_force_update(True)) - if config.get(CONF_FILTERS): # must exist and not be empty - cg.add_define("USE_SENSOR_FILTER") - filters = await build_filters(config[CONF_FILTERS]) - cg.add(var.set_filters(filters)) - +@coroutine_with_priority(CoroPriority.AUTOMATION) +async def _build_sensor_automations(var, config): for conf in config.get(CONF_ON_VALUE, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [(float, "x")], conf) @@ -926,6 +912,25 @@ async def setup_sensor_core_(var, config): cg.add(trigger.set_max(template_)) await automation.build_automation(trigger, [(float, "x")], conf) + +@setup_entity("sensor") +async def setup_sensor_core_(var, config): + setup_device_class(config) + setup_unit_of_measurement(config) + if (state_class := config.get(CONF_STATE_CLASS)) is not None: + cg.add(var.set_state_class(state_class)) + if (accuracy_decimals := config.get(CONF_ACCURACY_DECIMALS)) is not None: + cg.add(var.set_accuracy_decimals(accuracy_decimals)) + # Only set force_update if True (default is False) + if config[CONF_FORCE_UPDATE]: + cg.add(var.set_force_update(True)) + if config.get(CONF_FILTERS): # must exist and not be empty + cg.add_define("USE_SENSOR_FILTER") + filters = await build_filters(config[CONF_FILTERS]) + cg.add(var.set_filters(filters)) + + CORE.add_job(_build_sensor_automations, var, config) + if (mqtt_id := config.get(CONF_MQTT_ID)) is not None: mqtt_ = cg.new_Pvariable(mqtt_id, var) await mqtt.register_mqtt_component(mqtt_, config) diff --git a/esphome/components/switch/__init__.py b/esphome/components/switch/__init__.py index fbe523239c0..bbafc54bd1e 100644 --- a/esphome/components/switch/__init__.py +++ b/esphome/components/switch/__init__.py @@ -145,10 +145,8 @@ def switch_schema( return _SWITCH_SCHEMA.extend(schema) -@setup_entity("switch") -async def setup_switch_core_(var, config): - if (inverted := config.get(CONF_INVERTED)) is not None: - cg.add(var.set_inverted(inverted)) +@coroutine_with_priority(CoroPriority.AUTOMATION) +async def _build_switch_automations(var, config): for conf in config.get(CONF_ON_STATE, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [(bool, "x")], conf) @@ -159,6 +157,14 @@ async def setup_switch_core_(var, config): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [], conf) + +@setup_entity("switch") +async def setup_switch_core_(var, config): + if (inverted := config.get(CONF_INVERTED)) is not None: + cg.add(var.set_inverted(inverted)) + + CORE.add_job(_build_switch_automations, var, config) + if (mqtt_id := config.get(CONF_MQTT_ID)) is not None: mqtt_ = cg.new_Pvariable(mqtt_id, var) await mqtt.register_mqtt_component(mqtt_, config) diff --git a/esphome/components/text_sensor/__init__.py b/esphome/components/text_sensor/__init__.py index 7b00aa34241..97f394ecf73 100644 --- a/esphome/components/text_sensor/__init__.py +++ b/esphome/components/text_sensor/__init__.py @@ -201,6 +201,17 @@ async def build_filters(config): return await cg.build_registry_list(FILTER_REGISTRY, config) +@coroutine_with_priority(CoroPriority.AUTOMATION) +async def _build_text_sensor_automations(var, config): + for conf in config.get(CONF_ON_VALUE, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [(cg.std_string, "x")], conf) + + for conf in config.get(CONF_ON_RAW_VALUE, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [(cg.std_string, "x")], conf) + + @setup_entity("text_sensor") async def setup_text_sensor_core_(var, config): setup_device_class(config) @@ -210,13 +221,7 @@ async def setup_text_sensor_core_(var, config): filters = await build_filters(config[CONF_FILTERS]) cg.add(var.set_filters(filters)) - for conf in config.get(CONF_ON_VALUE, []): - trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) - await automation.build_automation(trigger, [(cg.std_string, "x")], conf) - - for conf in config.get(CONF_ON_RAW_VALUE, []): - trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) - await automation.build_automation(trigger, [(cg.std_string, "x")], conf) + CORE.add_job(_build_text_sensor_automations, var, config) if (mqtt_id := config.get(CONF_MQTT_ID)) is not None: mqtt_ = cg.new_Pvariable(mqtt_id, var)