2#if defined(USE_ESP32) || defined(USE_ARDUINO) || defined(USE_HOST)
6#include <dsmr_parser/util.h>
10static constexpr auto &TAG =
"dsmr";
12static void log_callback(dsmr_parser::LogLevel level,
const char *
fmt, va_list
args) {
13 std::array<char, 256> buf;
14 vsnprintf(buf.data(), buf.size(),
fmt,
args);
16 case dsmr_parser::LogLevel::ERROR:
17 ESP_LOGE(TAG,
"%s", buf.data());
19 case dsmr_parser::LogLevel::WARNING:
20 ESP_LOGW(TAG,
"%s", buf.data());
22 case dsmr_parser::LogLevel::INFO:
23 ESP_LOGI(TAG,
"%s", buf.data());
25 case dsmr_parser::LogLevel::VERBOSE:
26 ESP_LOGV(TAG,
"%s", buf.data());
28 case dsmr_parser::LogLevel::VERY_VERBOSE:
29 ESP_LOGVV(TAG,
"%s", buf.data());
31 case dsmr_parser::LogLevel::DEBUG:
32 ESP_LOGD(TAG,
"%s", buf.data());
38 dsmr_parser::Logger::set_log_function(log_callback);
75 ESP_LOGV(TAG,
"Start reading data from P1 port");
79 ESP_LOGV(TAG,
"Set request pin to 1");
92 ESP_LOGV(TAG,
"Stop reading data from P1 port");
94 ESP_LOGV(TAG,
"Set request pin to 0");
101 ESP_LOGV(TAG,
"Flush UART RX buffer");
108 for (uint8_t
byte : data) {
122 for (uint8_t
byte : data) {
124 ESP_LOGW(TAG,
"Encrypted buffer overflow, resetting");
136 ESP_LOGV(TAG,
"Encrypted telegram received (%zu bytes)", this->
buffer_pos_);
156 ESP_LOGV(TAG,
"Trying to parse telegram (%zu bytes)", telegram.content().size());
157 ESP_LOGVV(TAG,
"Telegram content:\n %.*s",
static_cast<int>(telegram.content().size()), telegram.content().data());
160 if (
const bool res = dsmr_parser::DsmrParser::parse(data, telegram); !res) {
161 ESP_LOGE(TAG,
"Failed to parse telegram");
178 " Max telegram length: %zu\n"
179 " Receive timeout: %.1fs",
180 this->
buffer_.size(), this->receive_timeout_ / 1e3f);
188#define DSMR_LOG_SENSOR(s) LOG_SENSOR(" ", #s, this->s_##s##_);
191#define DSMR_LOG_TEXT_SENSOR(s) LOG_TEXT_SENSOR(" ", #s, this->s_##s##_);
192 DSMR_TEXT_SENSOR_LIST(DSMR_LOG_TEXT_SENSOR, )
196 if (decryption_key ==
nullptr || decryption_key[0] ==
'\0') {
201 auto key = dsmr_parser::Aes128GcmDecryptionKey::from_hex(decryption_key);
203 ESP_LOGE(TAG,
"Error, decryption key has incorrect format");
208 ESP_LOGI(TAG,
"Decryption key is set");
void status_clear_warning()
virtual void digital_write(bool value)=0
void stop_requesting_data_()
uint32_t last_request_time_
uint32_t receive_timeout_
bool request_interval_reached_() const
bool ready_to_request_data_()
dsmr_parser::DlmsPacketDecryptor dlms_decryptor_
void set_decryption_key_(const char *decryption_key)
text_sensor::TextSensor * s_telegram_
void publish_sensors(MyData &data)
void start_requesting_data_()
dsmr_parser::PacketAccumulator packet_accumulator_
DSMR_SENSOR_LIST(DSMR_SET_SENSOR,) DSMR_TEXT_SENSOR_LIST(DSMR_SET_TEXT_SENSOR
uint32_t request_interval_
std::array< uint8_t, 256 > uart_chunk_reading_buf_
void dump_config() override
Aes128GcmDecryptorImpl gcm_decryptor_
void receive_encrypted_telegram_()
bool parse_telegram_(const dsmr_parser::DsmrUnencryptedTelegram &telegram)
std::vector< uint8_t > buffer_
std::span< uint8_t > uart_read_chunk_()
void publish_state(const std::string &state)
optional< std::array< uint8_t, N > > read_array()
dsmr_parser::ParsedData< DSMR_TEXT_SENSOR_LIST(DSMR_IDENTITY, DSMR_COMMA) DSMR_PREPEND_COMMA(DSMR_SENSOR_LIST(DSMR_IDENTITY, DSMR_COMMA))> MyData
const char int const __FlashStringHelper va_list args
size_t size_t const char * fmt
uint32_t IRAM_ATTR HOT millis()