diff --git a/esphome/components/sml/sml.cpp b/esphome/components/sml/sml.cpp index 0a58240868..9e52e05be9 100644 --- a/esphome/components/sml/sml.cpp +++ b/esphome/components/sml/sml.cpp @@ -67,31 +67,12 @@ void Sml::add_on_data_callback(std::function, bool)> & } void Sml::process_sml_file_(const byte_span &sml_data) { - SmlFile sml_file = SmlFile(sml_data); - std::vector obis_info = sml_file.get_obis_info(); - this->publish_obis_info_(obis_info); - - this->log_obis_info_(obis_info); -} - -void Sml::log_obis_info_(const std::vector &obis_info_vec) { - ESP_LOGD(TAG, "OBIS info:"); - for (auto const &obis_info : obis_info_vec) { - std::string info; - info += " (" + bytes_repr(obis_info.server_id) + ") "; - info += obis_info.code_repr(); - info += " [0x" + bytes_repr(obis_info.value) + "]"; - ESP_LOGD(TAG, "%s", info.c_str()); - } -} - -void Sml::publish_obis_info_(const std::vector &obis_info_vec) { - for (auto const &obis_info : obis_info_vec) { - this->publish_value_(obis_info); - } + SmlFile(sml_data).for_each_obis_info([this](const ObisInfo &obis_info) { this->publish_value_(obis_info); }); } void Sml::publish_value_(const ObisInfo &obis_info) { + ESP_LOGD(TAG, "OBIS (%s) %s [0x%s]", bytes_repr(obis_info.server_id).c_str(), obis_info.code_repr().c_str(), + bytes_repr(obis_info.value).c_str()); for (auto const &sml_listener : sml_listeners_) { if ((!sml_listener->server_id.empty()) && (bytes_repr(obis_info.server_id) != sml_listener->server_id)) continue; diff --git a/esphome/components/sml/sml.h b/esphome/components/sml/sml.h index 7f290dec75..5780564689 100644 --- a/esphome/components/sml/sml.h +++ b/esphome/components/sml/sml.h @@ -28,8 +28,6 @@ class Sml : public Component, public uart::UARTDevice { protected: void process_sml_file_(const byte_span &sml_data); - void log_obis_info_(const std::vector &obis_info_vec); - void publish_obis_info_(const std::vector &obis_info_vec); char check_start_end_bytes_(uint8_t byte); void publish_value_(const ObisInfo &obis_info); diff --git a/esphome/components/sml/sml_parser.cpp b/esphome/components/sml/sml_parser.cpp index 76b5576081..78d89d1937 100644 --- a/esphome/components/sml/sml_parser.cpp +++ b/esphome/components/sml/sml_parser.cpp @@ -75,8 +75,7 @@ bool SmlFile::setup_node(std::vector &nodes) { return true; } -std::vector SmlFile::get_obis_info() { - std::vector obis_info; +void SmlFile::for_each_obis_info(const std::function &callback) { for (auto const &message : messages) { auto message_body = message.nodes[3]; auto message_type = bytes_to_uint(message_body.nodes[0].value_bytes); @@ -88,10 +87,9 @@ std::vector SmlFile::get_obis_info() { auto val_list = get_list_response.nodes[4]; for (auto const &val_list_entry : val_list.nodes) { - obis_info.emplace_back(server_id, val_list_entry); + callback(ObisInfo(server_id, val_list_entry)); } } - return obis_info; } std::string bytes_repr(const byte_span &buffer) { diff --git a/esphome/components/sml/sml_parser.h b/esphome/components/sml/sml_parser.h index f769b7419a..9dd9222e2b 100644 --- a/esphome/components/sml/sml_parser.h +++ b/esphome/components/sml/sml_parser.h @@ -41,7 +41,7 @@ class SmlFile { SmlFile(byte_span const &buffer); bool setup_node(std::vector &nodes); std::vector messages; - std::vector get_obis_info(); + void for_each_obis_info(const std::function &callback); protected: const byte_span buffer_;