9 static const char *
const TAG =
"bl0906";
17 return (address + data->
l + data->
m + data->
h) ^ 0xFF;
30 this->
read_data_(BL0906_TEMPERATURE, BL0906_TREF, this->temperature_sensor_);
32 this->
read_data_(BL0906_I_1_RMS, BL0906_IREF, this->current_1_sensor_);
33 this->
read_data_(BL0906_WATT_1, BL0906_PREF, this->power_1_sensor_);
34 this->
read_data_(BL0906_CF_1_CNT, BL0906_EREF, this->energy_1_sensor_);
36 this->
read_data_(BL0906_I_2_RMS, BL0906_IREF, this->current_2_sensor_);
37 this->
read_data_(BL0906_WATT_2, BL0906_PREF, this->power_2_sensor_);
38 this->
read_data_(BL0906_CF_2_CNT, BL0906_EREF, this->energy_2_sensor_);
40 this->
read_data_(BL0906_I_3_RMS, BL0906_IREF, this->current_3_sensor_);
41 this->
read_data_(BL0906_WATT_3, BL0906_PREF, this->power_3_sensor_);
42 this->
read_data_(BL0906_CF_3_CNT, BL0906_EREF, this->energy_3_sensor_);
44 this->
read_data_(BL0906_I_4_RMS, BL0906_IREF, this->current_4_sensor_);
45 this->
read_data_(BL0906_WATT_4, BL0906_PREF, this->power_4_sensor_);
46 this->
read_data_(BL0906_CF_4_CNT, BL0906_EREF, this->energy_4_sensor_);
48 this->
read_data_(BL0906_I_5_RMS, BL0906_IREF, this->current_5_sensor_);
49 this->
read_data_(BL0906_WATT_5, BL0906_PREF, this->power_5_sensor_);
50 this->
read_data_(BL0906_CF_5_CNT, BL0906_EREF, this->energy_5_sensor_);
52 this->
read_data_(BL0906_I_6_RMS, BL0906_IREF, this->current_6_sensor_);
53 this->
read_data_(BL0906_WATT_6, BL0906_PREF, this->power_6_sensor_);
54 this->
read_data_(BL0906_CF_6_CNT, BL0906_EREF, this->energy_6_sensor_);
57 this->
read_data_(BL0906_FREQUENCY, BL0906_FREF, frequency_sensor_);
59 this->
read_data_(BL0906_V_RMS, BL0906_UREF, voltage_sensor_);
62 this->
read_data_(BL0906_WATT_SUM, BL0906_WATT, this->total_power_sensor_);
64 this->
read_data_(BL0906_CF_SUM_CNT, BL0906_CF, this->total_energy_sensor_);
73 void BL0906::setup() {
76 this->
write_array(USR_WRPROT_WITABLE,
sizeof(USR_WRPROT_WITABLE));
85 this->
write_array(USR_WRPROT_ONLYREAD,
sizeof(USR_WRPROT_ONLYREAD));
91 this->action_queue_.push_back(
function);
92 return this->action_queue_.size();
96 if (this->action_queue_.empty()) {
100 for (
int i = 0; i < this->action_queue_.size(); i++) {
101 ptr_func = this->action_queue_[i];
103 ESP_LOGI(TAG,
"HandleActionCallback[%d]...", i);
112 this->action_queue_.clear();
127 if (sensor ==
nullptr) {
135 bool signed_result = reference == BL0906_TREF || reference == BL0906_WATT || reference == BL0906_PREF;
139 if (this->
read_array((uint8_t *) &buffer,
sizeof(buffer) - 1)) {
142 data_s24.
l = buffer.l;
143 data_s24.
m = buffer.m;
144 data_s24.
h = buffer.h;
146 data_u24.
l = buffer.l;
147 data_u24.
m = buffer.m;
148 data_u24.
h = buffer.h;
151 ESP_LOGW(TAG,
"Junk on wire. Throwing away partial message");
158 if (reference == BL0906_PREF) {
159 value = (float)
to_int32_t(data_s24) * reference;
163 if (reference == BL0906_WATT) {
164 value = (float)
to_int32_t(data_s24) * reference;
168 if (reference == BL0906_UREF || reference == BL0906_IREF || reference == BL0906_EREF || reference == BL0906_CF) {
173 if (reference == BL0906_FREF) {
177 if (reference == BL0906_TREF) {
179 value = (value - 64) * 12.5 / 59 - 40;
187 float ki = 12875 * 1 * (5.1 + 5.1) * 1000 / 2000 / 1.097;
188 float i_rms0 = measurements * ki;
189 float i_rms = correction * ki;
190 int32_t value = (i_rms * i_rms - i_rms0 * i_rms0) / 256;
191 data.
l = value << 24 >> 24;
192 data.
m = value << 16 >> 24;
194 data.
h = (value << 8 >> 24) | 0b10000000;
197 ESP_LOGV(TAG,
"RMSOS:%02X%02X%02X%02X%02X%02X", BL0906_WRITE_COMMAND, address, data.
l, data.
m, data.
h, data.
address);
206 void BL0906::dump_config() {
207 ESP_LOGCONFIG(TAG,
"BL0906:");
208 LOG_SENSOR(
" ",
"Voltage", this->voltage_sensor_);
210 LOG_SENSOR(
" ",
"Current1", this->current_1_sensor_);
211 LOG_SENSOR(
" ",
"Current2", this->current_2_sensor_);
212 LOG_SENSOR(
" ",
"Current3", this->current_3_sensor_);
213 LOG_SENSOR(
" ",
"Current4", this->current_4_sensor_);
214 LOG_SENSOR(
" ",
"Current5", this->current_5_sensor_);
215 LOG_SENSOR(
" ",
"Current6", this->current_6_sensor_);
217 LOG_SENSOR(
" ",
"Power1", this->power_1_sensor_);
218 LOG_SENSOR(
" ",
"Power2", this->power_2_sensor_);
219 LOG_SENSOR(
" ",
"Power3", this->power_3_sensor_);
220 LOG_SENSOR(
" ",
"Power4", this->power_4_sensor_);
221 LOG_SENSOR(
" ",
"Power5", this->power_5_sensor_);
222 LOG_SENSOR(
" ",
"Power6", this->power_6_sensor_);
224 LOG_SENSOR(
" ",
"Energy1", this->energy_1_sensor_);
225 LOG_SENSOR(
" ",
"Energy2", this->energy_2_sensor_);
226 LOG_SENSOR(
" ",
"Energy3", this->energy_3_sensor_);
227 LOG_SENSOR(
" ",
"Energy4", this->energy_4_sensor_);
228 LOG_SENSOR(
" ",
"Energy5", this->energy_5_sensor_);
229 LOG_SENSOR(
" ",
"Energy6", this->energy_6_sensor_);
231 LOG_SENSOR(
" ",
"Total Power", this->total_power_sensor_);
232 LOG_SENSOR(
" ",
"Total Energy", this->total_energy_sensor_);
233 LOG_SENSOR(
" ",
"Frequency", this->frequency_sensor_);
234 LOG_SENSOR(
" ",
"Temperature", this->temperature_sensor_);
virtual void loop()
This method will be called repeatedly.
optional< std::array< uint8_t, N > > read_array()
void write_array(const uint8_t *data, size_t len)
void write_byte(uint8_t data)
void bias_correction_(uint8_t address, float measurements, float correction)
const uint8_t BL0906_INIT[2][6]
size_t enqueue_action_(ActionCallbackFuncPtr function)
void publish_state(float state)
Publish a new state to the front-end.
void read_data_(uint8_t address, float reference, sensor::Sensor *sensor)
constexpr int32_t to_int32_t(sbe24_t input)
constexpr uint32_t to_uint32_t(ube24_t input)
Implementation of SPI Controller mode.
void(BL0906::*)() ActionCallbackFuncPtr
Base-class for all sensors.
constexpr uint8_t bl0906_checksum(const uint8_t address, const DataPacket *data)
esphome::sensor::Sensor * sensor
void IRAM_ATTR HOT delay(uint32_t ms)