1
0
mirror of https://github.com/esphome/esphome.git synced 2025-02-19 03:18:14 +00:00

[modbus_controller] Remove stream dependency (#8244)

This commit is contained in:
Keith Burzinski 2025-02-12 22:34:16 -06:00 committed by Jesse Hills
parent e9a537784e
commit be5639faf1
No known key found for this signature in database
GPG Key ID: BEAAE804EFD8E83A

View File

@ -1,8 +1,6 @@
#include "modbus_textsensor.h"
#include "esphome/core/log.h"
#include <iomanip>
#include <sstream>
namespace esphome {
namespace modbus_controller {
@ -12,20 +10,17 @@ static const char *const TAG = "modbus_controller.text_sensor";
void ModbusTextSensor::dump_config() { LOG_TEXT_SENSOR("", "Modbus Controller Text Sensor", this); }
void ModbusTextSensor::parse_and_publish(const std::vector<uint8_t> &data) {
std::ostringstream output;
std::string output_str{};
uint8_t items_left = this->response_bytes;
uint8_t index = this->offset;
char buffer[5];
while ((items_left > 0) && index < data.size()) {
uint8_t b = data[index];
switch (this->encode_) {
case RawEncoding::HEXBYTES:
sprintf(buffer, "%02x", b);
output << buffer;
output_str += str_snprintf("%02x", 2, b);
break;
case RawEncoding::COMMA:
sprintf(buffer, index != this->offset ? ",%d" : "%d", b);
output << buffer;
output_str += str_sprintf(index != this->offset ? ",%d" : "%d", b);
break;
case RawEncoding::ANSI:
if (b < 0x20)
@ -33,25 +28,24 @@ void ModbusTextSensor::parse_and_publish(const std::vector<uint8_t> &data) {
// FALLTHROUGH
// Anything else no encoding
default:
output << (char) b;
output_str += (char) b;
break;
}
items_left--;
index++;
}
auto result = output.str();
// Is there a lambda registered
// call it with the pre converted value and the raw data array
if (this->transform_func_.has_value()) {
// the lambda can parse the response itself
auto val = (*this->transform_func_)(this, result, data);
auto val = (*this->transform_func_)(this, output_str, data);
if (val.has_value()) {
ESP_LOGV(TAG, "Value overwritten by lambda");
result = val.value();
output_str = val.value();
}
}
this->publish_state(result);
this->publish_state(output_str);
}
} // namespace modbus_controller