71#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERY_VERBOSE
74 ESP_LOGVV(TAG,
"Raw data: %s", s.c_str());
81 if (header1 == 0xAA) {
82 ESP_LOGE(TAG,
"CSE7766 not calibrated!");
86 bool power_cycle_exceeds_range =
false;
87 if ((header1 & 0xF0) == 0xF0) {
89 ESP_LOGE(TAG,
"CSE7766 reports abnormal external circuit or chip damage: (0x%02X)", header1);
90 if (header1 & (1 << 3)) {
91 ESP_LOGE(TAG,
" Voltage cycle exceeds range.");
93 if (header1 & (1 << 2)) {
94 ESP_LOGE(TAG,
" Current cycle exceeds range.");
96 if (header1 & (1 << 0)) {
97 ESP_LOGE(TAG,
" Coefficient storage area is abnormal.");
104 power_cycle_exceeds_range = header1 & (1 << 1);
117 bool have_power = adj & 0x10;
118 bool have_current = adj & 0x20;
119 bool have_voltage = adj & 0x40;
121 float voltage = 0.0f;
123 voltage = voltage_coeff / float(voltage_cycle);
136 this->cf_pulses_last_ = cf_pulses;
137 energy = this->
cf_pulses_total_ * float(power_coeff) / 1000000.0f / 3600.0f;
142 if (power_cycle_exceeds_range) {
148 }
else if (have_power) {
149 power = power_coeff / float(power_cycle);
155 float current = 0.0f;
156 float calculated_current = 0.0f;
159 if (have_power && voltage > 1.0f) {
160 calculated_current = power / voltage;
163 if (calculated_current > 0.05f) {
164 current = current_coeff / float(current_cycle);
171 if (have_voltage && have_current) {
172 const float apparent_power = voltage * current;
177 const float reactive_power = apparent_power - power;
178 if (reactive_power < 0.0f) {
179 ESP_LOGD(TAG,
"Impossible reactive power: %.4f is negative", reactive_power);
187 if (apparent_power > 0) {
188 pf = power / apparent_power;
189 if (pf < 0 || pf > 1) {
190 ESP_LOGD(TAG,
"Impossible power factor: %.4f not in interval [0, 1]", pf);
193 }
else if (apparent_power == 0 && power == 0) {
196 }
else if (current == 0 && calculated_current <= 0.05f) {
198 ESP_LOGV(TAG,
"Can't calculate power factor (current below minimum for CSE7766)");
200 ESP_LOGW(TAG,
"Can't calculate power factor from P = %.4f W, S = %.4f VA", power, apparent_power);
206#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERY_VERBOSE
208 std::string buf =
"Parsed:";
213 buf +=
str_sprintf(
" I=%fmA (~%fmA)", current * 1000.0f, calculated_current * 1000.0f);
218 if (energy != 0.0f) {
219 buf +=
str_sprintf(
" E=%fkWh (%u)", energy, cf_pulses);
221 ESP_LOGVV(TAG,
"%s", buf.c_str());