ESPHome 2025.10.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 {
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#ifdef USE_BUTTON
73 // Resets all calibration values to defaults (can be triggered by a button)
74 void reset_calibration();
75#endif
76
77 // Core component methods
78 void loop() override;
79 void update() override;
80 void setup() override;
81 void dump_config() override;
82
83 protected:
84 // --- Sensor pointers ---
85 sensor::Sensor *voltage_sensor_{nullptr}; // Voltage sensor
86 sensor::Sensor *current_sensor_{nullptr}; // Current sensor
87 sensor::Sensor *power_sensor_{nullptr}; // Power sensor (can be negative for bidirectional)
88 sensor::Sensor *energy_sensor_{nullptr}; // Energy sensor
89 sensor::Sensor *internal_temperature_sensor_{nullptr}; // Internal temperature sensor
90 sensor::Sensor *external_temperature_sensor_{nullptr}; // External temperature sensor
91
92#ifdef USE_NUMBER
93 // --- Calibration number entities (for dynamic calibration via HA UI) ---
98#endif
99
100 // --- Internal state ---
101 uint32_t prev_cf_cnt_ = 0; // Previous energy pulse count (for energy calculation)
102 float max_temperature_diff_{0}; // Max allowed temperature difference between two measurements (noise filter)
103
104 // --- Reference values for conversion ---
105 float power_reference_; // Divider for raw power to get Watts
106 float power_reference_cal_; // Calibrated power reference
107 float voltage_reference_; // Divider for raw voltage to get Volts
108 float voltage_reference_cal_; // Calibrated voltage reference
109 float current_reference_; // Divider for raw current to get Amperes
110 float current_reference_cal_; // Calibrated current reference
111 float energy_reference_; // Divider for raw energy to get kWh
112 float energy_reference_cal_; // Calibrated energy reference
113
114 // --- Home Assistant calibration values (multipliers, default 1) ---
115 float current_cal_{1};
116 float voltage_cal_{1};
117 float power_cal_{1};
118 float energy_cal_{1};
119
120 // --- Protocol commands ---
123
124 // --- Mode flags ---
126
127 // --- Methods ---
128 // Converts packed temperature value to float and updates the sensor
129 float update_temp_(sensor::Sensor *sensor, uint16_le_t packed_temperature) const;
130
131 // Validates the checksum of a received data packet
132 bool validate_checksum_(DataPacket *data);
133
134 // Handles a received data packet
135 void received_package_(DataPacket *data);
136
137 // Calculates reference values for calibration and conversion
141
142 // Calibration update callbacks (used with number entities)
148
149 // Recalculates all reference values after calibration changes
150 void recalibrate_();
152
153} // namespace bl0940
154} // namespace esphome
This class simplifies creating components that periodically check a state.
Definition component.h:429
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:95
sensor::Sensor * external_temperature_sensor_
Definition bl0940.h:90
void set_voltage_sensor(sensor::Sensor *voltage_sensor)
Definition bl0940.h:40
sensor::Sensor * current_sensor_
Definition bl0940.h:86
sensor::Sensor * internal_temperature_sensor_
Definition bl0940.h:89
float update_temp_(sensor::Sensor *sensor, uint16_le_t packed_temperature) const
Definition bl0940.cpp:190
number::Number * energy_calibration_number_
Definition bl0940.h:97
void set_read_command(uint8_t read_command)
Definition bl0940.h:55
number::Number * power_calibration_number_
Definition bl0940.h:96
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:244
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:85
sensor::Sensor * energy_sensor_
Definition bl0940.h:88
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:94
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
sensor::Sensor * power_sensor_
Definition bl0940.h:87
void received_package_(DataPacket *data)
Definition bl0940.cpp:204
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:30
Base-class for all sensors.
Definition sensor.h:42
bool state
Definition fan.h:0
esphome::bl0940::BL0940 __attribute__
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
24-bit unsigned integer type, transparently converting to 32-bit.
Definition datatypes.h:32