ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
emontx.h
Go to the documentation of this file.
1#pragma once
2
10
11#include <atomic>
12
13#ifdef USE_SENSOR
15#endif
16#ifdef USE_EMONTX_VERSION_TEXT_SENSOR
18#endif
19
20namespace esphome::emontx {
21
23static constexpr size_t MAX_LINE_LENGTH = 1024;
24
25enum class LockOnReboot : uint8_t {
28 LOCK_ON_REBOOT_AUTO, // Only when the emonTx reports firmware v1.2.0 or later
29};
30
38class EmonTx final : public Component, public uart::UARTDevice {
39#ifdef USE_EMONTX_VERSION_TEXT_SENSOR
40 SUB_TEXT_SENSOR(version)
41#endif
42 public:
43 EmonTx() = default;
44
45 void loop() override;
46 void setup() override;
47 void dump_config() override;
48 void on_shutdown() override;
49
50 template<typename F> void add_on_json_callback(F &&callback) { this->json_callbacks_.add(std::forward<F>(callback)); }
51
52 template<typename F> void add_on_data_callback(F &&callback) { this->data_callbacks_.add(std::forward<F>(callback)); }
53
54 // Send command to emonTx via UART
55 void send_command(const char *command);
56 void send_command(const std::string &command) { this->send_command(command.c_str()); }
57
60 void set_paused(bool paused) { this->paused_.store(paused, std::memory_order_relaxed); }
61
62 bool is_paused() const { return this->paused_.load(std::memory_order_relaxed); }
63
66 void set_lock_on_reboot(LockOnReboot lock_on_reboot) { this->lock_on_reboot_ = lock_on_reboot; }
67
68#ifdef USE_SENSOR
69 void init_sensors(size_t count) { this->sensors_.init(count); }
70 void register_sensor(const char *tag_name, sensor::Sensor *sensor);
71#endif
72
73 protected:
74 void parse_json_(const char *data, size_t len);
75 void unlock_();
76#ifdef USE_EMONTX_VERSION
77 bool wants_version_() const {
78#ifdef USE_EMONTX_VERSION_TEXT_SENSOR
79 if (this->version_text_sensor_ != nullptr)
80 return true;
81#endif
83 }
84 void request_version_();
86 void parse_msg_number_(const char *line, size_t len);
87 void parse_version_line_(const char *line, size_t len);
88#endif
89
90#ifdef USE_SENSOR
92#endif
95 std::atomic<bool> paused_{false};
96 bool was_paused_{false};
98#ifdef USE_EMONTX_VERSION
99 bool lock_supported_{false}; // The last version reported is v1.2.0 or later
100 bool unlock_sent_{false}; // AUTO has sent 'emonunlock' since boot
101 uint8_t version_frames_left_{0}; // Data lines still to wait for a version reply; 0 when none is owed
103#endif
105};
106
107} // namespace esphome::emontx
Fixed-capacity vector - sized once through init() or try_init(); push_back never reallocates This avo...
Definition helpers.h:624
Collects bytes into NUL terminated lines of up to N - 1 characters; IGNORE_CHAR bytes are skipped and...
Definition line_reader.h:15
StringRef is a reference to a string owned by something else.
Definition string_ref.h:31
Main class for the EmonTx component.
Definition emontx.h:38
FixedVector< std::pair< const char *, sensor::Sensor * > > sensors_
Definition emontx.h:91
LineReader< MAX_LINE_LENGTH+1 > line_reader_
Definition emontx.h:104
LockOnReboot lock_on_reboot_
Definition emontx.h:97
bool wants_version_() const
Definition emontx.h:77
void parse_msg_number_(const char *line, size_t len)
Definition emontx.cpp:188
LazyCallbackManager< void(JsonObject, StringRef)> json_callbacks_
Definition emontx.h:93
uint32_t last_msg_number_
Definition emontx.h:102
LazyCallbackManager< void(StringRef)> data_callbacks_
Definition emontx.h:94
uint8_t version_frames_left_
Definition emontx.h:101
void parse_json_(const char *data, size_t len)
Definition emontx.cpp:150
void parse_version_line_(const char *line, size_t len)
Definition emontx.cpp:214
std::atomic< bool > paused_
Definition emontx.h:95
Base-class for all sensors.
Definition sensor.h:47
unsigned count
Definition gif.cpp:51
const void size_t len
Definition hal.h:68
static void uint32_t