From 5fac67ce15dbbd8c9fc1da89264a71fcfe87258c Mon Sep 17 00:00:00 2001 From: Felix Storm Date: Tue, 10 May 2022 11:39:18 +0200 Subject: [PATCH] CAN bus: on_frame remote_transmission_request (#3376) --- esphome/components/canbus/__init__.py | 13 ++++++++++++- esphome/components/canbus/canbus.cpp | 6 ++++-- esphome/components/canbus/canbus.h | 8 +++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/esphome/components/canbus/__init__.py b/esphome/components/canbus/__init__.py index 20f2642144..1dbd743c75 100644 --- a/esphome/components/canbus/__init__.py +++ b/esphome/components/canbus/__init__.py @@ -78,6 +78,7 @@ CANBUS_SCHEMA = cv.Schema( min=0, max=0x1FFFFFFF ), cv.Optional(CONF_USE_EXTENDED_ID, default=False): cv.boolean, + cv.Optional(CONF_REMOTE_TRANSMISSION_REQUEST): cv.boolean, }, validate_id, ), @@ -100,10 +101,20 @@ async def setup_canbus_core_(var, config): trigger = cg.new_Pvariable( conf[CONF_TRIGGER_ID], var, can_id, can_id_mask, ext_id ) + if CONF_REMOTE_TRANSMISSION_REQUEST in conf: + cg.add( + trigger.set_remote_transmission_request( + conf[CONF_REMOTE_TRANSMISSION_REQUEST] + ) + ) await cg.register_component(trigger, conf) await automation.build_automation( trigger, - [(cg.std_vector.template(cg.uint8), "x"), (cg.uint32, "can_id")], + [ + (cg.std_vector.template(cg.uint8), "x"), + (cg.uint32, "can_id"), + (cg.bool_, "remote_transmission_request"), + ], conf, ) diff --git a/esphome/components/canbus/canbus.cpp b/esphome/components/canbus/canbus.cpp index 5d9084706b..3fe0d50f06 100644 --- a/esphome/components/canbus/canbus.cpp +++ b/esphome/components/canbus/canbus.cpp @@ -81,8 +81,10 @@ void Canbus::loop() { // fire all triggers for (auto *trigger : this->triggers_) { if ((trigger->can_id_ == (can_message.can_id & trigger->can_id_mask_)) && - (trigger->use_extended_id_ == can_message.use_extended_id)) { - trigger->trigger(data, can_message.can_id); + (trigger->use_extended_id_ == can_message.use_extended_id) && + (!trigger->remote_transmission_request_.has_value() || + trigger->remote_transmission_request_.value() == can_message.remote_transmission_request)) { + trigger->trigger(data, can_message.can_id, can_message.remote_transmission_request); } } } diff --git a/esphome/components/canbus/canbus.h b/esphome/components/canbus/canbus.h index 20c490c083..06b15c0db5 100644 --- a/esphome/components/canbus/canbus.h +++ b/esphome/components/canbus/canbus.h @@ -126,13 +126,18 @@ template class CanbusSendAction : public Action, public P std::vector data_static_{}; }; -class CanbusTrigger : public Trigger, uint32_t>, public Component { +class CanbusTrigger : public Trigger, uint32_t, bool>, public Component { friend class Canbus; public: explicit CanbusTrigger(Canbus *parent, const std::uint32_t can_id, const std::uint32_t can_id_mask, const bool use_extended_id) : parent_(parent), can_id_(can_id), can_id_mask_(can_id_mask), use_extended_id_(use_extended_id){}; + + void set_remote_transmission_request(bool remote_transmission_request) { + this->remote_transmission_request_ = remote_transmission_request; + } + void setup() override { this->parent_->add_trigger(this); } protected: @@ -140,6 +145,7 @@ class CanbusTrigger : public Trigger, uint32_t>, public Com uint32_t can_id_; uint32_t can_id_mask_; bool use_extended_id_; + optional remote_transmission_request_{}; }; } // namespace canbus