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