14 if (data.size() < 20) {
15 ESP_LOGW(TAG,
"Invalid size for PZEM AC!");
25 auto pzem_get_16bit = [&](
size_t i) -> uint16_t {
26 return (uint16_t(data[i + 0]) << 8) | (uint16_t(data[i + 1]) << 0);
28 auto pzem_get_32bit = [&](
size_t i) -> uint32_t {
29 return (uint32_t(pzem_get_16bit(i + 2)) << 16) | (uint32_t(pzem_get_16bit(i + 0)) << 0);
35 uint32_t raw_current = pzem_get_32bit(2);
36 float current = raw_current / 1000.0f;
38 uint32_t raw_active_power = pzem_get_32bit(6);
39 float active_power = raw_active_power / 10.0f;
41 float active_energy =
static_cast<float>(pzem_get_32bit(10));
43 uint16_t raw_frequency = pzem_get_16bit(14);
46 uint16_t raw_power_factor = pzem_get_16bit(16);
47 float power_factor = raw_power_factor / 100.0f;
49 ESP_LOGD(TAG,
"PZEM AC: V=%.1f V, I=%.3f A, P=%.1f W, E=%.1f Wh, F=%.1f Hz, PF=%.2f", voltage, current, active_power,