11static const char *
const TAG =
"dsmr";
88 ESP_LOGW(TAG,
"Timeout while reading data for telegram");
98 ESP_LOGV(TAG,
"Start requesting data from P1 port");
101 ESP_LOGV(TAG,
"Start reading data from P1 port");
111 ESP_LOGV(TAG,
"Stop requesting data from P1 port");
114 ESP_LOGV(TAG,
"Stop reading data from P1 port");
124 while ((avail = this->
available()) > 0) {
125 if (!this->
read_array(buf, std::min(avail,
sizeof(buf)))) {
145 size_t to_read = std::min(avail,
sizeof(buf));
150 for (
size_t i = 0; i < to_read; i++) {
151 const char c =
static_cast<char>(buf[i]);
155 ESP_LOGV(TAG,
"Header of telegram found");
165 ESP_LOGE(TAG,
"Error: telegram larger than buffer (%d bytes)", this->
max_telegram_len_);
175 if (previous_char ==
'\n' || previous_char ==
'\r') {
189 ESP_LOGV(TAG,
"Footer of telegram found");
211 size_t to_read = std::min(avail,
sizeof(buf));
216 for (
size_t i = 0; i < to_read; i++) {
217 const char c =
static_cast<char>(buf[i]);
221 if ((uint8_t) c != 0xDB) {
224 ESP_LOGV(TAG,
"Start byte 0xDB of encrypted telegram found");
232 ESP_LOGE(TAG,
"Error: encrypted telegram larger than buffer (%d bytes)", this->
max_telegram_len_);
251 ESP_LOGV(TAG,
"End of encrypted telegram found");
254 GCM<AES128> *gcmaes128{
new GCM<AES128>()};
258 for (
int i = 10; i < 14; i++)
260 constexpr uint16_t iv_size{12};
262 gcmaes128->decrypt(
reinterpret_cast<uint8_t *
>(this->
telegram_),
270 ESP_LOGV(TAG,
"Decrypted telegram size: %d bytes", this->
bytes_read_);
271 ESP_LOGVV(TAG,
"Decrypted telegram: %s", this->
telegram_);
284 ESP_LOGV(TAG,
"Trying to parse telegram");
287 const auto &res = dsmr_parser::P1Parser::parse(
293 ESP_LOGE(TAG,
"%s", err_str.c_str());
310 " Max telegram length: %d\n"
311 " Receive timeout: %.1fs",
320#define DSMR_LOG_SENSOR(s) LOG_SENSOR(" ", #s, this->s_##s##_);
323#define DSMR_LOG_TEXT_SENSOR(s) LOG_TEXT_SENSOR(" ", #s, this->s_##s##_);
324 DSMR_TEXT_SENSOR_LIST(DSMR_LOG_TEXT_SENSOR, )
328 if (decryption_key ==
nullptr || decryption_key[0] ==
'\0') {
329 ESP_LOGI(TAG,
"Disabling decryption");
339 ESP_LOGE(TAG,
"Error, decryption key must be 32 hex characters");
344 ESP_LOGI(TAG,
"Decryption key is set");
346 ESP_LOGV(TAG,
"Using decryption key: %s", decryption_key);
void status_clear_warning()
virtual void digital_write(bool value)=0
void stop_requesting_data_()
uint32_t last_request_time_
size_t crypt_telegram_len_
uint32_t receive_timeout_
bool ready_to_request_data_()
bool available_within_timeout_()
Wait for UART data to become available within the read timeout.
text_sensor::TextSensor * s_telegram_
void publish_sensors(MyData &data)
bool request_interval_reached_()
void start_requesting_data_()
void set_decryption_key(const char *decryption_key)
DSMR_SENSOR_LIST(DSMR_SET_SENSOR,) DSMR_TEXT_SENSOR_LIST(DSMR_SET_TEXT_SENSOR
uint8_t * crypt_telegram_
uint32_t request_interval_
std::vector< uint8_t > decryption_key_
void dump_config() override
bool receive_timeout_reached_()
void receive_encrypted_telegram_()
void publish_state(const std::string &state)
size_t get_rx_buffer_size()
optional< std::array< uint8_t, N > > read_array()
dsmr_parser::ParsedData< DSMR_TEXT_SENSOR_LIST(DSMR_DATA_SENSOR, DSMR_COMMA) DSMR_BOTH DSMR_SENSOR_LIST(DSMR_DATA_SENSOR, DSMR_COMMA)> MyData
size_t parse_hex(const char *str, size_t length, uint8_t *data, size_t count)
Parse bytes from a hex-encoded string into a byte array.
void IRAM_ATTR HOT delay(uint32_t ms)
uint32_t IRAM_ATTR HOT millis()