ESPHome 2026.3.0
Loading...
Searching...
No Matches
bl0940.h
Go to the documentation of this file.
1#pragma once
6#ifdef USE_BUTTON
8#endif
9#ifdef USE_NUMBER
11#endif
15namespace esphome {
16namespace bl0940 {
17
18// Caveat: All these values are big endian (low - middle - high)
19struct DataPacket {
20 uint8_t frame_header; // Packet header (0x58 in EN docs, 0x55 in CN docs and Tasmota tests)
21 uint24_le_t i_fast_rms; // Fast RMS current
22 uint24_le_t i_rms; // RMS current
23 uint24_t RESERVED0; // Reserved
24 uint24_le_t v_rms; // RMS voltage
25 uint24_t RESERVED1; // Reserved
26 int24_le_t watt; // Active power (can be negative for bidirectional measurement)
27 uint24_t RESERVED2; // Reserved
28 uint24_le_t cf_cnt; // Energy pulse count
29 uint24_t RESERVED3; // Reserved
30 uint16_le_t tps1; // Internal temperature sensor 1
31 uint8_t RESERVED4; // Reserved (should be 0x00)
32 uint16_le_t tps2; // Internal temperature sensor 2
33 uint8_t RESERVED5; // Reserved (should be 0x00)
34 uint8_t checksum; // Packet checksum
35} __attribute__((packed));
36
38 public:
39 // Sensor setters
40 void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; }
41 void set_current_sensor(sensor::Sensor *current_sensor) { current_sensor_ = current_sensor; }
42 void set_power_sensor(sensor::Sensor *power_sensor) { power_sensor_ = power_sensor; }
43 void set_energy_sensor(sensor::Sensor *energy_sensor) { energy_sensor_ = energy_sensor; }
44
45 // Temperature sensor setters
46 void set_internal_temperature_sensor(sensor::Sensor *internal_temperature_sensor) {
47 internal_temperature_sensor_ = internal_temperature_sensor;
48 }
49 void set_external_temperature_sensor(sensor::Sensor *external_temperature_sensor) {
50 external_temperature_sensor_ = external_temperature_sensor;
51 }
52
53 // Configuration setters
54 void set_legacy_mode(bool enable) { this->legacy_mode_enabled_ = enable; }
55 void set_read_command(uint8_t read_command) { this->read_command_ = read_command; }
56 void set_write_command(uint8_t write_command) { this->write_command_ = write_command; }
57
58 // Reference value setters (used for calibration and conversion)
59 void set_current_reference(float current_ref) { this->current_reference_ = current_ref; }
60 void set_energy_reference(float energy_ref) { this->energy_reference_ = energy_ref; }
61 void set_power_reference(float power_ref) { this->power_reference_ = power_ref; }
62 void set_voltage_reference(float voltage_ref) { this->voltage_reference_ = voltage_ref; }
63
64#ifdef USE_NUMBER
65 // Calibration number setters (for Home Assistant number entities)
70#endif
71
72 // Resets all calibration values to defaults
73 void reset_calibration();
74
75 // Core component methods
76 void loop() override;
77 void update() override;
78 void setup() override;
79 void dump_config() override;
80
81 protected:
82 // --- Sensor pointers ---
83 sensor::Sensor *voltage_sensor_{nullptr}; // Voltage sensor
84 sensor::Sensor *current_sensor_{nullptr}; // Current sensor
85 sensor::Sensor *power_sensor_{nullptr}; // Power sensor (can be negative for bidirectional)
86 sensor::Sensor *energy_sensor_{nullptr}; // Energy sensor
87 sensor::Sensor *internal_temperature_sensor_{nullptr}; // Internal temperature sensor
88 sensor::Sensor *external_temperature_sensor_{nullptr}; // External temperature sensor
89
90#ifdef USE_NUMBER
91 // --- Calibration number entities (for dynamic calibration via HA UI) ---
96#endif
97
98 // --- Internal state ---
99 uint32_t prev_cf_cnt_ = 0; // Previous energy pulse count (for energy calculation)
100 float max_temperature_diff_{0}; // Max allowed temperature difference between two measurements (noise filter)
101
102 // --- Reference values for conversion ---
103 float power_reference_; // Divider for raw power to get Watts
104 float power_reference_cal_; // Calibrated power reference
105 float voltage_reference_; // Divider for raw voltage to get Volts
106 float voltage_reference_cal_; // Calibrated voltage reference
107 float current_reference_; // Divider for raw current to get Amperes
108 float current_reference_cal_; // Calibrated current reference
109 float energy_reference_; // Divider for raw energy to get kWh
110 float energy_reference_cal_; // Calibrated energy reference
111
112 // --- Home Assistant calibration values (multipliers, default 1) ---
113 float current_cal_{1};
114 float voltage_cal_{1};
115 float power_cal_{1};
116 float energy_cal_{1};
117
118 // --- Protocol commands ---
121
122 // --- Mode flags ---
124
125 // --- Methods ---
126 // Converts packed temperature value to float and updates the sensor
127 float update_temp_(sensor::Sensor *sensor, uint16_le_t packed_temperature) const;
128
129 // Validates the checksum of a received data packet
130 bool validate_checksum_(DataPacket *data);
131
132 // Handles a received data packet
133 void received_package_(DataPacket *data);
134
135 // Calculates reference values for calibration and conversion
139
140 // Calibration update callbacks (used with number entities)
146
147 // Recalculates all reference values after calibration changes
148 void recalibrate_();
150
151} // namespace bl0940
152} // namespace esphome
This class simplifies creating components that periodically check a state.
Definition component.h:538
void set_energy_calibration_number(number::Number *num)
Definition bl0940.h:69
float calculate_calibration_value_(float state)
Definition bl0940.cpp:127
number::Number * current_calibration_number_
Definition bl0940.h:93
sensor::Sensor * external_temperature_sensor_
Definition bl0940.h:88
void set_voltage_sensor(sensor::Sensor *voltage_sensor)
Definition bl0940.h:40
sensor::Sensor * current_sensor_
Definition bl0940.h:84
sensor::Sensor * internal_temperature_sensor_
Definition bl0940.h:87
float update_temp_(sensor::Sensor *sensor, uint16_le_t packed_temperature) const
Definition bl0940.cpp:193
number::Number * energy_calibration_number_
Definition bl0940.h:95
void set_read_command(uint8_t read_command)
Definition bl0940.h:55
number::Number * power_calibration_number_
Definition bl0940.h:94
void set_legacy_mode(bool enable)
Definition bl0940.h:54
void set_internal_temperature_sensor(sensor::Sensor *internal_temperature_sensor)
Definition bl0940.h:46
void set_voltage_reference(float voltage_ref)
Definition bl0940.h:62
void current_calibration_callback_(float state)
Definition bl0940.cpp:147
void dump_config() override
Definition bl0940.cpp:247
void set_energy_reference(float energy_ref)
Definition bl0940.h:60
void voltage_calibration_callback_(float state)
Definition bl0940.cpp:152
sensor::Sensor * voltage_sensor_
Definition bl0940.h:83
sensor::Sensor * energy_sensor_
Definition bl0940.h:86
void set_current_calibration_number(number::Number *num)
Definition bl0940.h:66
void set_power_sensor(sensor::Sensor *power_sensor)
Definition bl0940.h:42
void set_energy_sensor(sensor::Sensor *energy_sensor)
Definition bl0940.h:43
void update() override
Definition bl0940.cpp:61
void setup() override
Definition bl0940.cpp:67
number::Number * voltage_calibration_number_
Definition bl0940.h:92
float calculate_energy_reference_()
Definition bl0940.cpp:121
void energy_calibration_callback_(float state)
Definition bl0940.cpp:162
float calculate_power_reference_()
Definition bl0940.cpp:116
void set_power_reference(float power_ref)
Definition bl0940.h:61
void set_external_temperature_sensor(sensor::Sensor *external_temperature_sensor)
Definition bl0940.h:49
bool validate_checksum_(DataPacket *data)
Definition bl0940.cpp:47
uint32_t prev_cf_cnt_
Definition bl0940.h:99
sensor::Sensor * power_sensor_
Definition bl0940.h:85
void received_package_(DataPacket *data)
Definition bl0940.cpp:207
void set_voltage_calibration_number(number::Number *num)
Definition bl0940.h:67
void set_current_reference(float current_ref)
Definition bl0940.h:59
void set_current_sensor(sensor::Sensor *current_sensor)
Definition bl0940.h:41
void set_write_command(uint8_t write_command)
Definition bl0940.h:56
void loop() override
Definition bl0940.cpp:31
void power_calibration_callback_(float state)
Definition bl0940.cpp:157
void set_power_calibration_number(number::Number *num)
Definition bl0940.h:68
Base-class for all numbers.
Definition number.h:29
Base-class for all sensors.
Definition sensor.h:47
bool state
Definition fan.h:2
esphome::bl0940::BL0940 __attribute__
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
static void uint32_t
24-bit unsigned integer type, transparently converting to 32-bit.
Definition datatypes.h:32