35 std::optional<std::array<uint8_t, 16>> decryption_key,
36 std::optional<std::array<uint8_t, 16>> authentication_key,
37 std::vector<CustomPattern> custom_patterns)
38 : receive_timeout_ms_(receive_timeout_ms),
39 skip_crc_check_(skip_crc_check),
40 custom_patterns_(std::move(custom_patterns)),
41 parser_(&decryptor_) {
42 dlms_parser::Logger::set_log_function(log_callback);
44 if (decryption_key.has_value()) {
45#ifdef DLMS_METER_NO_CRYPTO
46 ESP_LOGE(TAG,
"Decryption is not supported on this platform (no compatible crypto library found)");
48 auto opt_key = dlms_parser::Aes128GcmDecryptionKey::from_bytes(decryption_key.value());
50 this->
parser_.set_decryption_key(*opt_key);
52 ESP_LOGE(TAG,
"Failed to set decryption key: invalid key format");
57 if (authentication_key.has_value()) {
58#ifdef DLMS_METER_NO_CRYPTO
59 ESP_LOGE(TAG,
"Authentication is not supported on this platform (no compatible crypto library found)");
61 auto opt_key = dlms_parser::Aes128GcmAuthenticationKey::from_bytes(authentication_key.value());
63 this->
parser_.set_authentication_key(*opt_key);
65 ESP_LOGE(TAG,
"Failed to set authentication key: invalid key format");
72 this->
parser_.load_default_patterns();
74 if (pattern.default_obis.has_value() && pattern.name.has_value()) {
75 this->
parser_.register_pattern(pattern.name->c_str(), pattern.pattern.c_str(), pattern.priority,
76 pattern.default_obis.value());
77 }
else if (pattern.name.has_value()) {
78 this->
parser_.register_pattern(pattern.name->c_str(), pattern.pattern.c_str(), pattern.priority);
80 this->
parser_.register_pattern(pattern.pattern.c_str());
88 ESP_LOGCONFIG(TAG,
"DLMS Meter:");
90 ESP_LOGCONFIG(TAG,
" Skip CRC Check: %s", YESNO(this->
skip_crc_check_));
93 if (pattern.default_obis.has_value() && pattern.name.has_value()) {
94 const auto &obis = pattern.default_obis.value();
95 ESP_LOGCONFIG(TAG,
" Custom Pattern: '%s' (name: %s, priority: %d, default_obis: %d.%d.%d.%d.%d.%d)",
96 pattern.pattern.c_str(), pattern.name->c_str(), pattern.priority, obis[0], obis[1], obis[2],
97 obis[3], obis[4], obis[5]);
98 }
else if (pattern.name.has_value()) {
99 ESP_LOGCONFIG(TAG,
" Custom Pattern: '%s' (name: %s, priority: %d)", pattern.pattern.c_str(),
100 pattern.name->c_str(), pattern.priority);
102 ESP_LOGCONFIG(TAG,
" Custom Pattern: '%s'", pattern.pattern.c_str());
107 for (
const auto &entry : this->
sensors_) {
108 LOG_SENSOR(
" ",
"Numeric Sensor (OBIS)", entry.sensor);
109 ESP_LOGCONFIG(TAG,
" OBIS: %s", entry.obis_code.c_str());
112#ifdef USE_TEXT_SENSOR
114 LOG_TEXT_SENSOR(
" ",
"Text Sensor (OBIS)", entry.sensor);
115 ESP_LOGCONFIG(TAG,
" OBIS: %s", entry.obis_code.c_str());
118#ifdef USE_BINARY_SENSOR
120 LOG_BINARY_SENSOR(
" ",
"Binary Sensor (OBIS)", entry.sensor);
121 ESP_LOGCONFIG(TAG,
" OBIS: %s", entry.obis_code.c_str());
179 int updated_count = 0;
184 if (item.obis_code == obis_code) {
185 item.sensor->publish_state(float_val);
192#ifdef USE_TEXT_SENSOR
193 if (!is_numeric && str_val !=
nullptr) {
195 if (item.obis_code == obis_code) {
196 item.sensor->publish_state(str_val);
203#ifdef USE_BINARY_SENSOR
205 bool state = float_val != 0.0f;
207 if (item.obis_code == obis_code) {
208 item.sensor->publish_state(
state);
215 if (updated_count == 0) {
216 ESP_LOGV(TAG,
"Received OBIS %s, but no sensors are registered for it.", obis_code);