ESPHome 2026.10.0
Loading...
Searching...
No Matches
pzem6l24.h
Go to the documentation of this file.
1#pragma once
2
6
7#include <array>
8#include <span>
9
10namespace esphome::pzem6l24 {
11
12// Options for the reset_energy action
13enum ResetPhase : uint8_t {
14 RESET_PHASE_A = 0x00, // Reset phase A energy only
15 RESET_PHASE_B = 0x01, // Reset phase B energy only
16 RESET_PHASE_C = 0x02, // Reset phase C energy only
17 RESET_PHASE_COMBINED = 0x03, // Reset combined (sum) energy only
18 RESET_PHASE_ALL = 0x0F, // Reset all energy counters
19};
20
21// Reset energy function code (PZEM-6L24 specific, non-standard Modbus)
22static constexpr uint8_t PZEM_CMD_RESET_ENERGY = 0x42;
23
24// Input registers read per poll (0x0000 - 0x003F inclusive) and the payload size that yields.
25static constexpr uint8_t PZEM_REGISTER_COUNT = 64;
26static constexpr size_t PZEM_PAYLOAD_SIZE = PZEM_REGISTER_COUNT * 2;
27
28// Failed polls tolerated before the readings are blanked; one collision on a shared RS-485 bus should
29// not take every entity unavailable for a whole update interval.
30static constexpr uint8_t MAX_CONSECUTIVE_READ_FAILURES = 3;
31
32// The energy reset command as it goes on the wire: function code, reserved byte, phase selector. The
33// hub adds the address and CRC. Split out so the phase byte can be pinned by a test.
34constexpr std::array<uint8_t, 3> build_reset_pdu(ResetPhase phase) {
35 return {PZEM_CMD_RESET_ENERGY, 0x00, static_cast<uint8_t>(phase)};
36}
37
39 public:
40 // Per-phase sensors; each setter is named after its config key
41 void set_voltage_a_sensor(sensor::Sensor *sensor) { this->voltage_a_ = sensor; }
42 void set_voltage_b_sensor(sensor::Sensor *sensor) { this->voltage_b_ = sensor; }
43 void set_voltage_c_sensor(sensor::Sensor *sensor) { this->voltage_c_ = sensor; }
44
45 void set_current_a_sensor(sensor::Sensor *sensor) { this->current_a_ = sensor; }
46 void set_current_b_sensor(sensor::Sensor *sensor) { this->current_b_ = sensor; }
47 void set_current_c_sensor(sensor::Sensor *sensor) { this->current_c_ = sensor; }
48
52
56
60
64
68
72
76
77 // Combined sensors
78 void set_frequency_sensor(sensor::Sensor *sensor) { this->frequency_ = sensor; }
86
87 // Queues the energy reset command for the selected phase(s); the pzem6l24.reset_energy action calls this.
88 void reset_energy(ResetPhase phase_option);
89
90 void update() override;
91
92 void on_response(std::span<const uint8_t> request_pdu, std::span<const uint8_t> response_pdu) override;
93
94 void on_error(std::span<const uint8_t> request_pdu, modbus::ExceptionCode exception_code) override;
95
96 bool on_no_response(std::span<const uint8_t> request_pdu) override;
97
98 void on_not_sent(std::span<const uint8_t> request_pdu) override;
99
100 void dump_config() override;
101
102 protected:
103 void publish_(const uint8_t *data);
104 void request_failed_(std::span<const uint8_t> request_pdu);
105 void read_failed_();
106 void read_finished_();
107
108 // Register reads accepted by the hub but not yet resolved by a terminal callback.
110 // Failed polls since the last good one; stops counting at MAX_CONSECUTIVE_READ_FAILURES.
112
113 // Per-phase sensors
117
121
125
129
133
137
141
145
149
150 // Combined sensors
159};
160
161} // namespace esphome::pzem6l24
This class simplifies creating components that periodically check a state.
Definition component.h:510
void set_total_reactive_power_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:80
void set_apparent_energy_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:74
sensor::Sensor * active_energy_c_
Definition pzem6l24.h:140
void set_reactive_energy_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:70
sensor::Sensor * voltage_b_
Definition pzem6l24.h:115
sensor::Sensor * apparent_energy_c_
Definition pzem6l24.h:148
sensor::Sensor * active_power_c_
Definition pzem6l24.h:124
void set_total_apparent_energy_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:85
void publish_(const uint8_t *data)
Definition pzem6l24.cpp:164
void set_reactive_power_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:54
void set_total_active_power_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:79
sensor::Sensor * reactive_energy_b_
Definition pzem6l24.h:143
sensor::Sensor * reactive_energy_a_
Definition pzem6l24.h:142
sensor::Sensor * power_factor_c_
Definition pzem6l24.h:136
void set_voltage_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:42
sensor::Sensor * power_factor_b_
Definition pzem6l24.h:135
sensor::Sensor * active_energy_a_
Definition pzem6l24.h:138
sensor::Sensor * apparent_energy_a_
Definition pzem6l24.h:146
void set_active_power_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:49
bool on_no_response(std::span< const uint8_t > request_pdu) override
Definition pzem6l24.cpp:144
void set_power_factor_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:61
void set_apparent_power_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:59
void set_active_energy_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:67
void set_reactive_power_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:53
void set_frequency_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:78
void reset_energy(ResetPhase phase_option)
Definition pzem6l24.cpp:327
sensor::Sensor * reactive_power_c_
Definition pzem6l24.h:128
sensor::Sensor * total_reactive_power_
Definition pzem6l24.h:153
void set_current_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:46
void set_reactive_energy_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:69
sensor::Sensor * reactive_power_a_
Definition pzem6l24.h:126
sensor::Sensor * apparent_power_a_
Definition pzem6l24.h:130
sensor::Sensor * voltage_a_
Definition pzem6l24.h:114
void set_current_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:47
void set_current_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:45
sensor::Sensor * current_b_
Definition pzem6l24.h:119
void on_response(std::span< const uint8_t > request_pdu, std::span< const uint8_t > response_pdu) override
Definition pzem6l24.cpp:124
void dump_config() override
Definition pzem6l24.cpp:265
void set_apparent_energy_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:75
void set_power_factor_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:62
sensor::Sensor * total_active_energy_
Definition pzem6l24.h:156
sensor::Sensor * active_power_a_
Definition pzem6l24.h:122
sensor::Sensor * total_power_factor_
Definition pzem6l24.h:155
void set_reactive_energy_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:71
void set_apparent_power_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:57
sensor::Sensor * total_active_power_
Definition pzem6l24.h:152
void set_voltage_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:43
void set_active_power_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:50
sensor::Sensor * reactive_energy_c_
Definition pzem6l24.h:144
void set_apparent_power_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:58
void set_total_apparent_power_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:81
sensor::Sensor * current_a_
Definition pzem6l24.h:118
void set_total_reactive_energy_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:84
sensor::Sensor * active_power_b_
Definition pzem6l24.h:123
sensor::Sensor * total_reactive_energy_
Definition pzem6l24.h:157
void set_total_active_energy_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:83
void set_active_energy_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:65
void on_error(std::span< const uint8_t > request_pdu, modbus::ExceptionCode exception_code) override
Definition pzem6l24.cpp:140
sensor::Sensor * apparent_energy_b_
Definition pzem6l24.h:147
void on_not_sent(std::span< const uint8_t > request_pdu) override
Definition pzem6l24.cpp:149
void set_voltage_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:41
void set_active_energy_b_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:66
void set_active_power_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:51
void set_total_power_factor_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:82
void request_failed_(std::span< const uint8_t > request_pdu)
Definition pzem6l24.cpp:153
sensor::Sensor * frequency_
Definition pzem6l24.h:151
sensor::Sensor * total_apparent_energy_
Definition pzem6l24.h:158
sensor::Sensor * apparent_power_b_
Definition pzem6l24.h:131
sensor::Sensor * voltage_c_
Definition pzem6l24.h:116
void set_power_factor_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:63
void set_apparent_energy_a_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:73
sensor::Sensor * active_energy_b_
Definition pzem6l24.h:139
sensor::Sensor * apparent_power_c_
Definition pzem6l24.h:132
sensor::Sensor * current_c_
Definition pzem6l24.h:120
sensor::Sensor * total_apparent_power_
Definition pzem6l24.h:154
sensor::Sensor * power_factor_a_
Definition pzem6l24.h:134
sensor::Sensor * reactive_power_b_
Definition pzem6l24.h:127
void set_reactive_power_c_sensor(sensor::Sensor *sensor)
Definition pzem6l24.h:55
Base-class for all sensors.
Definition sensor.h:47
constexpr std::array< uint8_t, 3 > build_reset_pdu(ResetPhase phase)
Definition pzem6l24.h:34