69 uint8_t state_reg = this->
raw_data_[STATE_REG_OFFSET];
71 if (state_reg == STATE_REG_CORRECTION_FUNC_FAIL) {
72 ESP_LOGE(TAG,
"The chip's function of error correction fails.");
77 uint32_t voltage_parameter = this->
read_uint24_(VOLTAGE_PARAM_OFFSET);
78 uint32_t voltage_reg = this->
read_uint24_(VOLTAGE_REG_OFFSET);
79 uint32_t current_parameter = this->
read_uint24_(CURRENT_PARAM_OFFSET);
80 uint32_t current_reg = this->
read_uint24_(CURRENT_REG_OFFSET);
81 uint32_t power_parameter = this->
read_uint24_(POWER_PARAM_OFFSET);
82 uint32_t power_reg = this->
read_uint24_(POWER_REG_OFFSET);
83 uint8_t data_update_register = this->
raw_data_[DATA_UPDATE_REG_OFFSET];
85 bool have_power = data_update_register & HAVE_POWER_BIT;
86 bool have_current = data_update_register & HAVE_CURRENT_BIT;
87 bool have_voltage = data_update_register & HAVE_VOLTAGE_BIT;
89 bool power_cycle_exceeds_range =
false;
90 bool parameter_regs_usable =
true;
92 if ((state_reg & STATE_REG_CORRECTION_MASK) == STATE_REG_CORRECTION_MASK) {
93 if (state_reg & STATE_REG_OVERFLOW_MASK) {
94 if (state_reg & VOLTAGE_OVERFLOW_BIT) {
97 if (state_reg & CURRENT_OVERFLOW_BIT) {
100 if (state_reg & POWER_OVERFLOW_BIT) {
103 if (state_reg & PARAM_REG_USABLE_BIT) {
104 parameter_regs_usable =
false;
108 "Reports: (0x%02X)\n"
109 " Voltage REG overflows: %s\n"
110 " Current REG overflows: %s\n"
111 " Power REG overflows: %s\n"
112 " Voltage/Current/Power Parameter REGs not usable: %s\n",
113 state_reg, YESNO(!have_voltage), YESNO(!have_current), YESNO(!have_power),
114 YESNO(!parameter_regs_usable));
116 if (!parameter_regs_usable) {
120 power_cycle_exceeds_range = have_power;
125 " Voltage: Parameter REG 0x%06" PRIX32
", REG 0x%06" PRIX32
"\n"
126 " Current: Parameter REG 0x%06" PRIX32
", REG 0x%06" PRIX32
"\n"
127 " Power: Parameter REG 0x%06" PRIX32
", REG 0x%06" PRIX32
"\n"
128 " Data Update: REG 0x%02" PRIX8
"\n",
129 voltage_parameter, voltage_reg, current_parameter, current_reg, power_parameter, power_reg,
130 data_update_register);
134 float voltage = 0.0f;
135 if (have_voltage && voltage_reg) {
136 voltage = float(voltage_parameter) * this->
voltage_divider_ / float(voltage_reg);
143 if (have_power && power_reg && !power_cycle_exceeds_range) {
144 power = (float(power_parameter) / float(power_reg)) * this->
voltage_divider_ * current_multiplier;
150 float current = 0.0f;
151 if (have_current && current_reg) {
152 current = float(current_parameter) * current_multiplier / float(current_reg);
159 const float apparent_power = voltage * current;
160 if (have_voltage && have_current) {
161 if (have_power || power_cycle_exceeds_range) {
162 if (apparent_power > 0) {
163 pf = power / apparent_power;
164 if (pf < 0 || pf > 1) {
165 ESP_LOGD(TAG,
"Impossible power factor: %.4f not in interval [0, 1]", pf);
168 }
else if (apparent_power == 0 && power == 0) {