diff --git a/esphome/components/canbus/canbus.cpp b/esphome/components/canbus/canbus.cpp index 696cfff2b7..3b86f209cd 100644 --- a/esphome/components/canbus/canbus.cpp +++ b/esphome/components/canbus/canbus.cpp @@ -86,6 +86,9 @@ void Canbus::loop() { data.push_back(can_message.data[i]); } + this->callback_manager_(can_message.can_id, can_message.use_extended_id, can_message.remote_transmission_request, + data); + // fire all triggers for (auto *trigger : this->triggers_) { if ((trigger->can_id_ == (can_message.can_id & trigger->can_id_mask_)) && diff --git a/esphome/components/canbus/canbus.h b/esphome/components/canbus/canbus.h index 1e5214fef4..7319bfb4ad 100644 --- a/esphome/components/canbus/canbus.h +++ b/esphome/components/canbus/canbus.h @@ -81,6 +81,20 @@ class Canbus : public Component { void set_bitrate(CanSpeed bit_rate) { this->bit_rate_ = bit_rate; } void add_trigger(CanbusTrigger *trigger); + /** + * Add a callback to be called when a CAN message is received. All received messages + * are passed to the callback without filtering. + * + * The callback function receives: + * - can_id of the received data + * - extended_id True if the can_id is an extended id + * - rtr If this is a remote transmission request + * - data The message data + */ + void add_callback( + std::function &data)> callback) { + this->callback_manager_.add(std::move(callback)); + } protected: template friend class CanbusSendAction; @@ -88,6 +102,8 @@ class Canbus : public Component { uint32_t can_id_; bool use_extended_id_; CanSpeed bit_rate_; + CallbackManager &data)> + callback_manager_{}; virtual bool setup_internal(); virtual Error send_message(struct CanFrame *frame);