ESPHome 2025.5.0
Loading...
Searching...
No Matches
modbus_textsensor.cpp
Go to the documentation of this file.
1
2#include "modbus_textsensor.h"
3#include "esphome/core/log.h"
4
5namespace esphome {
6namespace modbus_controller {
7
8static const char *const TAG = "modbus_controller.text_sensor";
9
10void ModbusTextSensor::dump_config() { LOG_TEXT_SENSOR("", "Modbus Controller Text Sensor", this); }
11
12void ModbusTextSensor::parse_and_publish(const std::vector<uint8_t> &data) {
13 std::string output_str{};
14 uint8_t items_left = this->response_bytes;
15 uint8_t index = this->offset;
16 while ((items_left > 0) && index < data.size()) {
17 uint8_t b = data[index];
18 switch (this->encode_) {
20 output_str += str_snprintf("%02x", 2, b);
21 break;
23 output_str += str_sprintf(index != this->offset ? ",%d" : "%d", b);
24 break;
26 if (b < 0x20)
27 break;
28 // FALLTHROUGH
29 // Anything else no encoding
30 default:
31 output_str += (char) b;
32 break;
33 }
34 items_left--;
35 index++;
36 }
37
38 // Is there a lambda registered
39 // call it with the pre converted value and the raw data array
40 if (this->transform_func_.has_value()) {
41 // the lambda can parse the response itself
42 auto val = (*this->transform_func_)(this, output_str, data);
43 if (val.has_value()) {
44 ESP_LOGV(TAG, "Value overwritten by lambda");
45 output_str = val.value();
46 }
47 }
48 this->publish_state(output_str);
49}
50
51} // namespace modbus_controller
52} // namespace esphome
void parse_and_publish(const std::vector< uint8_t > &data) override
bool has_value() const
Definition optional.h:87
void publish_state(const std::string &state)
mopeka_std_values val[4]
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string str_snprintf(const char *fmt, size_t len,...)
Definition helpers.cpp:309
std::string str_sprintf(const char *fmt,...)
Definition helpers.cpp:323