ESPHome 2026.1.5
Loading...
Searching...
No Matches
sml_text_sensor.cpp
Go to the documentation of this file.
2#include "esphome/core/log.h"
3#include "sml_text_sensor.h"
4#include "../sml_parser.h"
5#include <cinttypes>
6
7namespace esphome {
8namespace sml {
9
10static const char *const TAG = "sml_text_sensor";
11
12SmlTextSensor::SmlTextSensor(std::string server_id, std::string obis_code, SmlType format)
13 : SmlListener(std::move(server_id), std::move(obis_code)), format_(format) {}
14
15void SmlTextSensor::publish_val(const ObisInfo &obis_info) {
16 uint8_t value_type;
17 if (this->format_ == SML_UNDEFINED) {
18 value_type = obis_info.value_type;
19 } else {
20 value_type = this->format_;
21 }
22
23 switch (value_type) {
24 case SML_HEX: {
25 // Buffer for "0x" + up to 32 bytes as hex + null
26 char buf[67];
27 // Max 32 bytes of data fit in buffer ((67-3)/2)
28 size_t hex_bytes = std::min(obis_info.value.size(), size_t(32));
29 format_hex_prefixed_to(buf, obis_info.value.begin(), hex_bytes);
30 publish_state(buf, 2 + hex_bytes * 2);
31 break;
32 }
33 case SML_INT: {
34 char buf[21]; // Enough for int64_t (-9223372036854775808)
35 int len = snprintf(buf, sizeof(buf), "%" PRId64, bytes_to_int(obis_info.value));
36 publish_state(buf, static_cast<size_t>(len));
37 break;
38 }
39 case SML_BOOL:
40 publish_state(bytes_to_uint(obis_info.value) ? "True" : "False");
41 break;
42 case SML_UINT: {
43 char buf[21]; // Enough for uint64_t (18446744073709551615)
44 int len = snprintf(buf, sizeof(buf), "%" PRIu64, bytes_to_uint(obis_info.value));
45 publish_state(buf, static_cast<size_t>(len));
46 break;
47 }
48 case SML_OCTET: {
49 publish_state(reinterpret_cast<const char *>(obis_info.value.begin()), obis_info.value.size());
50 break;
51 }
52 }
53}
54
56 LOG_TEXT_SENSOR("", "SML", this);
57 if (!this->server_id.empty()) {
58 ESP_LOGCONFIG(TAG, " Server ID: %s", this->server_id.c_str());
59 }
60 ESP_LOGCONFIG(TAG, " OBIS Code: %s", this->obis_code.c_str());
61}
62
63} // namespace sml
64} // namespace esphome
const uint8_t * begin() const noexcept
Definition sml_parser.h:35
size_t size() const noexcept
Definition sml_parser.h:23
std::string server_id
Definition sml.h:15
std::string obis_code
Definition sml.h:16
SmlTextSensor(std::string server_id, std::string obis_code, SmlType format)
void publish_val(const ObisInfo &obis_info) override
void publish_state(const std::string &state)
int64_t bytes_to_int(const BytesView &buffer)
uint64_t bytes_to_uint(const BytesView &buffer)
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string size_t len
Definition helpers.h:595
char * format_hex_prefixed_to(char(&buffer)[N], T val)
Format an unsigned integer as "0x" prefixed lowercase hex to buffer.
Definition helpers.h:811