mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Add on_open and on_closed triggers to cover (#2488)
This commit is contained in:
		| @@ -15,6 +15,7 @@ from esphome.const import ( | |||||||
|     CONF_TILT_STATE_TOPIC, |     CONF_TILT_STATE_TOPIC, | ||||||
|     CONF_STOP, |     CONF_STOP, | ||||||
|     CONF_MQTT_ID, |     CONF_MQTT_ID, | ||||||
|  |     CONF_TRIGGER_ID, | ||||||
| ) | ) | ||||||
| from esphome.core import CORE, coroutine_with_priority | from esphome.core import CORE, coroutine_with_priority | ||||||
| from esphome.cpp_helpers import setup_entity | from esphome.cpp_helpers import setup_entity | ||||||
| @@ -67,6 +68,15 @@ CoverPublishAction = cover_ns.class_("CoverPublishAction", automation.Action) | |||||||
| CoverIsOpenCondition = cover_ns.class_("CoverIsOpenCondition", Condition) | CoverIsOpenCondition = cover_ns.class_("CoverIsOpenCondition", Condition) | ||||||
| CoverIsClosedCondition = cover_ns.class_("CoverIsClosedCondition", Condition) | CoverIsClosedCondition = cover_ns.class_("CoverIsClosedCondition", Condition) | ||||||
|  |  | ||||||
|  | # Triggers | ||||||
|  | CoverOpenTrigger = cover_ns.class_("CoverOpenTrigger", automation.Trigger.template()) | ||||||
|  | CoverClosedTrigger = cover_ns.class_( | ||||||
|  |     "CoverClosedTrigger", automation.Trigger.template() | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | CONF_ON_OPEN = "on_open" | ||||||
|  | CONF_ON_CLOSED = "on_closed" | ||||||
|  |  | ||||||
| COVER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).extend( | COVER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).extend( | ||||||
|     { |     { | ||||||
|         cv.GenerateID(): cv.declare_id(Cover), |         cv.GenerateID(): cv.declare_id(Cover), | ||||||
| @@ -84,6 +94,16 @@ COVER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).ex | |||||||
|         cv.Optional(CONF_TILT_STATE_TOPIC): cv.All( |         cv.Optional(CONF_TILT_STATE_TOPIC): cv.All( | ||||||
|             cv.requires_component("mqtt"), cv.subscribe_topic |             cv.requires_component("mqtt"), cv.subscribe_topic | ||||||
|         ), |         ), | ||||||
|  |         cv.Optional(CONF_ON_OPEN): automation.validate_automation( | ||||||
|  |             { | ||||||
|  |                 cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CoverOpenTrigger), | ||||||
|  |             } | ||||||
|  |         ), | ||||||
|  |         cv.Optional(CONF_ON_CLOSED): automation.validate_automation( | ||||||
|  |             { | ||||||
|  |                 cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CoverClosedTrigger), | ||||||
|  |             } | ||||||
|  |         ), | ||||||
|     } |     } | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -94,6 +114,13 @@ async def setup_cover_core_(var, config): | |||||||
|     if CONF_DEVICE_CLASS in config: |     if CONF_DEVICE_CLASS in config: | ||||||
|         cg.add(var.set_device_class(config[CONF_DEVICE_CLASS])) |         cg.add(var.set_device_class(config[CONF_DEVICE_CLASS])) | ||||||
|  |  | ||||||
|  |     for conf in config.get(CONF_ON_OPEN, []): | ||||||
|  |         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) | ||||||
|  |         await automation.build_automation(trigger, [], conf) | ||||||
|  |     for conf in config.get(CONF_ON_CLOSED, []): | ||||||
|  |         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) | ||||||
|  |         await automation.build_automation(trigger, [], conf) | ||||||
|  |  | ||||||
|     if CONF_MQTT_ID in config: |     if CONF_MQTT_ID in config: | ||||||
|         mqtt_ = cg.new_Pvariable(config[CONF_MQTT_ID], var) |         mqtt_ = cg.new_Pvariable(config[CONF_MQTT_ID], var) | ||||||
|         await mqtt.register_mqtt_component(mqtt_, config) |         await mqtt.register_mqtt_component(mqtt_, config) | ||||||
|   | |||||||
| @@ -99,6 +99,7 @@ template<typename... Ts> class CoverIsOpenCondition : public Condition<Ts...> { | |||||||
|  protected: |  protected: | ||||||
|   Cover *cover_; |   Cover *cover_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template<typename... Ts> class CoverIsClosedCondition : public Condition<Ts...> { | template<typename... Ts> class CoverIsClosedCondition : public Condition<Ts...> { | ||||||
|  public: |  public: | ||||||
|   CoverIsClosedCondition(Cover *cover) : cover_(cover) {} |   CoverIsClosedCondition(Cover *cover) : cover_(cover) {} | ||||||
| @@ -108,5 +109,27 @@ template<typename... Ts> class CoverIsClosedCondition : public Condition<Ts...> | |||||||
|   Cover *cover_; |   Cover *cover_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | class CoverOpenTrigger : public Trigger<> { | ||||||
|  |  public: | ||||||
|  |   CoverOpenTrigger(Cover *a_cover) { | ||||||
|  |     a_cover->add_on_state_callback([this, a_cover]() { | ||||||
|  |       if (a_cover->is_fully_open()) { | ||||||
|  |         this->trigger(); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class CoverClosedTrigger : public Trigger<> { | ||||||
|  |  public: | ||||||
|  |   CoverClosedTrigger(Cover *a_cover) { | ||||||
|  |     a_cover->add_on_state_callback([this, a_cover]() { | ||||||
|  |       if (a_cover->is_fully_closed()) { | ||||||
|  |         this->trigger(); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  |  | ||||||
| }  // namespace cover | }  // namespace cover | ||||||
| }  // namespace esphome | }  // namespace esphome | ||||||
|   | |||||||
| @@ -2307,6 +2307,12 @@ cover: | |||||||
|     tilt_lambda: !lambda 'return 0.5;' |     tilt_lambda: !lambda 'return 0.5;' | ||||||
|     tilt_state_topic: tilt/state/topic |     tilt_state_topic: tilt/state/topic | ||||||
|     tilt_command_topic: tilt/command/topic |     tilt_command_topic: tilt/command/topic | ||||||
|  |     on_open: | ||||||
|  |       then: | ||||||
|  |         - lambda: 'ESP_LOGD("cover", "open");' | ||||||
|  |     on_closed: | ||||||
|  |       then: | ||||||
|  |         - lambda: 'ESP_LOGD("cover", "closed");' | ||||||
|   - platform: am43 |   - platform: am43 | ||||||
|     name: 'Test AM43' |     name: 'Test AM43' | ||||||
|     id: am43_test |     id: am43_test | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user