ESPHome 2026.2.1
Loading...
Searching...
No Matches
dsmr.h
Go to the documentation of this file.
1#pragma once
2
7#include "esphome/core/log.h"
8#include <dsmr_parser/fields.h>
9#include <dsmr_parser/parser.h>
10#include <vector>
11
12namespace esphome::dsmr {
13
14using namespace dsmr_parser::fields;
15
16// DSMR_**_LIST generated by ESPHome and written in esphome/core/defines
17
18#if !defined(DSMR_SENSOR_LIST) && !defined(DSMR_TEXT_SENSOR_LIST)
19// Neither set, set it to a dummy value to not break build
20#define DSMR_TEXT_SENSOR_LIST(F, SEP) F(identification)
21#endif
22
23#if defined(DSMR_SENSOR_LIST) && defined(DSMR_TEXT_SENSOR_LIST)
24#define DSMR_BOTH ,
25#else
26#define DSMR_BOTH
27#endif
28
29#ifndef DSMR_SENSOR_LIST
30#define DSMR_SENSOR_LIST(F, SEP)
31#endif
32
33#ifndef DSMR_TEXT_SENSOR_LIST
34#define DSMR_TEXT_SENSOR_LIST(F, SEP)
35#endif
36
37#define DSMR_DATA_SENSOR(s) s
38#define DSMR_COMMA ,
39
40using MyData = dsmr_parser::ParsedData<DSMR_TEXT_SENSOR_LIST(DSMR_DATA_SENSOR, DSMR_COMMA)
41 DSMR_BOTH DSMR_SENSOR_LIST(DSMR_DATA_SENSOR, DSMR_COMMA)>;
42
43class Dsmr : public Component, public uart::UARTDevice {
44 public:
45 Dsmr(uart::UARTComponent *uart, bool crc_check) : uart::UARTDevice(uart), crc_check_(crc_check) {}
46
47 void setup() override;
48 void loop() override;
49
50 bool parse_telegram();
51
52 void publish_sensors(MyData &data) {
53#define DSMR_PUBLISH_SENSOR(s) \
54 if (data.s##_present && this->s_##s##_ != nullptr) \
55 s_##s##_->publish_state(data.s);
56 DSMR_SENSOR_LIST(DSMR_PUBLISH_SENSOR, )
57
58#define DSMR_PUBLISH_TEXT_SENSOR(s) \
59 if (data.s##_present && this->s_##s##_ != nullptr) \
60 s_##s##_->publish_state(data.s.c_str());
61 DSMR_TEXT_SENSOR_LIST(DSMR_PUBLISH_TEXT_SENSOR, )
62 };
63
64 void dump_config() override;
65
66 void set_decryption_key(const char *decryption_key);
68 void set_request_pin(GPIOPin *request_pin) { this->request_pin_ = request_pin; }
69 void set_request_interval(uint32_t interval) { this->request_interval_ = interval; }
70 void set_receive_timeout(uint32_t timeout) { this->receive_timeout_ = timeout; }
71
72// Sensor setters
73#define DSMR_SET_SENSOR(s) \
74 void set_##s(sensor::Sensor *sensor) { s_##s##_ = sensor; }
75 DSMR_SENSOR_LIST(DSMR_SET_SENSOR, )
76
77#define DSMR_SET_TEXT_SENSOR(s) \
78 void set_##s(text_sensor::TextSensor *sensor) { s_##s##_ = sensor; }
79 DSMR_TEXT_SENSOR_LIST(DSMR_SET_TEXT_SENSOR, )
80
81 // handled outside dsmr
82 void set_telegram(text_sensor::TextSensor *sensor) { s_telegram_ = sensor; }
83
84 protected:
85 void receive_telegram_();
87 void reset_telegram_();
88 void drain_rx_buffer_();
89
100
101 // Request telegram
106 bool requesting_data_{false};
110
111 // Read telegram
115 char *telegram_{nullptr};
116 size_t bytes_read_{0};
117 uint8_t *crypt_telegram_{nullptr};
120 uint32_t last_read_time_{0};
121 bool header_found_{false};
122 bool footer_found_{false};
123
124 // handled outside dsmr
126
127// Sensor member pointers
128#define DSMR_DECLARE_SENSOR(s) sensor::Sensor *s_##s##_{nullptr};
129 DSMR_SENSOR_LIST(DSMR_DECLARE_SENSOR, )
130
131#define DSMR_DECLARE_TEXT_SENSOR(s) text_sensor::TextSensor *s_##s##_{nullptr};
132 DSMR_TEXT_SENSOR_LIST(DSMR_DECLARE_TEXT_SENSOR, )
133
134 std::vector<uint8_t> decryption_key_{};
136};
137} // namespace esphome::dsmr
void stop_requesting_data_()
Definition dsmr.cpp:108
uint32_t last_request_time_
Definition dsmr.h:105
void reset_telegram_()
Definition dsmr.cpp:131
size_t crypt_telegram_len_
Definition dsmr.h:118
void drain_rx_buffer_()
Definition dsmr.cpp:121
GPIOPin * request_pin_
Definition dsmr.h:104
uint32_t receive_timeout_
Definition dsmr.h:112
void set_max_telegram_length(size_t length)
Definition dsmr.h:67
size_t crypt_bytes_read_
Definition dsmr.h:119
void set_receive_timeout(uint32_t timeout)
Definition dsmr.h:70
void set_telegram(text_sensor::TextSensor *sensor)
Definition dsmr.h:82
bool ready_to_request_data_()
Definition dsmr.cpp:30
bool available_within_timeout_()
Wait for UART data to become available within the read timeout.
Definition dsmr.cpp:58
text_sensor::TextSensor * s_telegram_
Definition dsmr.h:125
void publish_sensors(MyData &data)
Definition dsmr.h:52
bool request_interval_reached_()
Definition dsmr.cpp:49
void start_requesting_data_()
Definition dsmr.cpp:95
void set_decryption_key(const char *decryption_key)
Definition dsmr.cpp:327
void receive_telegram_()
Definition dsmr.cpp:139
Dsmr(uart::UARTComponent *uart, bool crc_check)
Definition dsmr.h:45
size_t max_telegram_len_
Definition dsmr.h:114
size_t bytes_read_
Definition dsmr.h:116
uint32_t last_read_time_
Definition dsmr.h:120
DSMR_SENSOR_LIST(DSMR_SET_SENSOR,) DSMR_TEXT_SENSOR_LIST(DSMR_SET_TEXT_SENSOR
uint8_t * crypt_telegram_
Definition dsmr.h:117
char * telegram_
Definition dsmr.h:115
bool requesting_data_
Definition dsmr.h:106
void loop() override
Definition dsmr.cpp:20
bool parse_telegram()
Definition dsmr.cpp:282
void set_request_interval(uint32_t interval)
Definition dsmr.h:69
uint32_t request_interval_
Definition dsmr.h:102
DSMR_SENSOR_LIST(DSMR_DECLARE_SENSOR,) DSMR_TEXT_SENSOR_LIST(DSMR_DECLARE_TEXT_SENSOR
void setup() override
Definition dsmr.cpp:13
std::vector< uint8_t > decryption_key_
Definition dsmr.h:134
void dump_config() override
Definition dsmr.cpp:307
bool receive_timeout_reached_()
Definition dsmr.cpp:56
void receive_encrypted_telegram_()
Definition dsmr.cpp:205
void set_request_pin(GPIOPin *request_pin)
Definition dsmr.h:68
dsmr_parser::ParsedData< DSMR_TEXT_SENSOR_LIST(DSMR_DATA_SENSOR, DSMR_COMMA) DSMR_BOTH DSMR_SENSOR_LIST(DSMR_DATA_SENSOR, DSMR_COMMA)> MyData
Definition dsmr.h:40
uint16_t length
Definition tt21100.cpp:0