4#if defined(USE_ESP32) || defined(USE_ARDUINO) || defined(USE_HOST)
11#include <dsmr_parser/dlms_packet_decryptor.h>
12#include <dsmr_parser/fields.h>
13#include <dsmr_parser/packet_accumulator.h>
14#include <dsmr_parser/parser.h>
19#if __has_include(<psa/crypto.h>)
20#include <dsmr_parser/decryption/aes128gcm_tfpsa.h>
21#elif __has_include(<mbedtls/gcm.h>)
22#if __has_include(<mbedtls/esp_config.h>)
23#include <mbedtls/esp_config.h>
25#include <dsmr_parser/decryption/aes128gcm_mbedtls.h>
26#elif __has_include(<bearssl/bearssl.h>)
27#include <dsmr_parser/decryption/aes128gcm_bearssl.h>
29#error "The platform doesn't provide a compatible encryption library for dsmr_parser"
34#if __has_include(<psa/crypto.h>)
36#elif __has_include(<mbedtls/gcm.h>)
42using namespace dsmr_parser::fields;
44#ifndef DSMR_SENSOR_LIST
45#define DSMR_SENSOR_LIST(F, SEP)
48#ifndef DSMR_TEXT_SENSOR_LIST
49#define DSMR_TEXT_SENSOR_LIST(F, SEP)
52#define DSMR_IDENTITY(s) s
54#define DSMR_PREPEND_COMMA(...) __VA_OPT__(, ) __VA_ARGS__
56#ifdef DSMR_TEXT_SENSOR_LIST_DEFINED
57using MyData = dsmr_parser::ParsedData<DSMR_TEXT_SENSOR_LIST(DSMR_IDENTITY, DSMR_COMMA)
58 DSMR_PREPEND_COMMA(DSMR_SENSOR_LIST(DSMR_IDENTITY, DSMR_COMMA))>;
60using MyData = dsmr_parser::ParsedData<DSMR_SENSOR_LIST(DSMR_IDENTITY, DSMR_COMMA)>;
66 uint32_t receive_timeout,
GPIOPin *request_pin,
const char *decryption_key)
76 void setup()
override;
80#define DSMR_PUBLISH_SENSOR(s) \
81 if (data.s##_present && this->s_##s##_ != nullptr) \
82 s_##s##_->publish_state(data.s);
85#define DSMR_PUBLISH_TEXT_SENSOR(s) \
86 if (data.s##_present && this->s_##s##_ != nullptr) \
87 s_##s##_->publish_state(data.s.data(), data.s.size());
88 DSMR_TEXT_SENSOR_LIST(DSMR_PUBLISH_TEXT_SENSOR, )
94 ESPDEPRECATED(
"Use 'decryption_key' configuration parameter. This method will be removed in 2026.8.0",
"2026.2.0")
95 void set_decryption_key(const std::
string &decryption_key) { this->
set_decryption_key_(decryption_key.c_str()); }
98#define DSMR_SET_SENSOR(s) \
99 void set_##s(sensor::Sensor *sensor) { s_##s##_ = sensor; }
102#define DSMR_SET_TEXT_SENSOR(s) \
103 void set_##s(text_sensor::TextSensor *sensor) { s_##s##_ = sensor; }
104 DSMR_TEXT_SENSOR_LIST(DSMR_SET_TEXT_SENSOR, )
115 bool parse_telegram_(
const dsmr_parser::DsmrUnencryptedTelegram &telegram);
127#define DSMR_DECLARE_SENSOR(s) sensor::Sensor *s_##s##_{nullptr};
129#define DSMR_DECLARE_TEXT_SENSOR(s) text_sensor::TextSensor *s_##s##_{nullptr};
130 DSMR_TEXT_SENSOR_LIST(DSMR_DECLARE_TEXT_SENSOR, )
ESPDEPRECATED("Use 'decryption_key' configuration parameter. This method will be removed in 2026.8.0", "2026.2.0") void set_decryption_key(const std
void stop_requesting_data_()
Dsmr(uart::UARTComponent *uart, bool crc_check, size_t max_telegram_length, uint32_t request_interval, uint32_t receive_timeout, GPIOPin *request_pin, const char *decryption_key)
uint32_t last_request_time_
uint32_t receive_timeout_
void set_telegram(text_sensor::TextSensor *sensor)
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_
DSMR_SENSOR_LIST(DSMR_DECLARE_SENSOR,) DSMR_TEXT_SENSOR_LIST(DSMR_DECLARE_TEXT_SENSOR
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_()
dsmr_parser::Aes128GcmTfPsa Aes128GcmDecryptorImpl
dsmr_parser::ParsedData< DSMR_TEXT_SENSOR_LIST(DSMR_IDENTITY, DSMR_COMMA) DSMR_PREPEND_COMMA(DSMR_SENSOR_LIST(DSMR_IDENTITY, DSMR_COMMA))> MyData