Fix PZEM missing phase zeroing all readings
Fix PZEM missing phase zeroing all readings (#2315)
This commit is contained in:
parent
d6a5b651d5
commit
37d9cb4c92
@ -92,7 +92,7 @@ struct ENERGY {
|
||||
|
||||
uint8_t fifth_second = 0;
|
||||
uint8_t command_code = 0;
|
||||
uint8_t data_valid = 0;
|
||||
uint8_t data_valid[3] = { 0, 0, 0 };
|
||||
|
||||
uint8_t phase_count = 1; // Number of phases active
|
||||
bool voltage_common = false; // Use single voltage
|
||||
@ -423,18 +423,22 @@ void EnergyMqttShow(void)
|
||||
}
|
||||
#endif // USE_ENERGY_MARGIN_DETECTION
|
||||
|
||||
void EnergyOverTempCheck()
|
||||
void EnergyEverySecond()
|
||||
{
|
||||
// Overtemp check
|
||||
if (global_update) {
|
||||
if (power && (global_temperature != 9999) && (global_temperature > Settings.param[P_OVER_TEMP])) { // Device overtemp, turn off relays
|
||||
SetAllPower(POWER_ALL_OFF, SRC_OVERTEMP);
|
||||
}
|
||||
}
|
||||
if (Energy.data_valid <= ENERGY_WATCHDOG) {
|
||||
Energy.data_valid++;
|
||||
if (Energy.data_valid > ENERGY_WATCHDOG) {
|
||||
// Reset energy registers
|
||||
for (uint32_t i = 0; i < Energy.phase_count; i++) {
|
||||
|
||||
// Invalid data reset
|
||||
uint32_t data_valid = Energy.phase_count;
|
||||
for (uint32_t i = 0; i < Energy.phase_count; i++) {
|
||||
if (Energy.data_valid[i] <= ENERGY_WATCHDOG) {
|
||||
Energy.data_valid[i]++;
|
||||
if (Energy.data_valid[i] > ENERGY_WATCHDOG) {
|
||||
// Reset energy registers
|
||||
Energy.voltage[i] = 0;
|
||||
Energy.current[i] = 0;
|
||||
Energy.active_power[i] = 0;
|
||||
@ -442,13 +446,21 @@ void EnergyOverTempCheck()
|
||||
if (!isnan(Energy.reactive_power[i])) { Energy.reactive_power[i] = 0; }
|
||||
if (!isnan(Energy.frequency[i])) { Energy.frequency[i] = 0; }
|
||||
if (!isnan(Energy.power_factor[i])) { Energy.power_factor[i] = 0; }
|
||||
}
|
||||
if (!isnan(Energy.export_active)) { Energy.export_active = 0; }
|
||||
Energy.start_energy = 0;
|
||||
|
||||
XnrgCall(FUNC_ENERGY_RESET);
|
||||
data_valid--;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!data_valid) {
|
||||
if (!isnan(Energy.export_active)) { Energy.export_active = 0; }
|
||||
Energy.start_energy = 0;
|
||||
|
||||
XnrgCall(FUNC_ENERGY_RESET);
|
||||
}
|
||||
|
||||
#ifdef USE_ENERGY_MARGIN_DETECTION
|
||||
EnergyMarginCheck();
|
||||
#endif // USE_ENERGY_MARGIN_DETECTION
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
@ -1092,10 +1104,7 @@ bool Xsns03(uint8_t function)
|
||||
if (energy_flg) {
|
||||
switch (function) {
|
||||
case FUNC_EVERY_SECOND:
|
||||
#ifdef USE_ENERGY_MARGIN_DETECTION
|
||||
EnergyMarginCheck();
|
||||
#endif // USE_ENERGY_MARGIN_DETECTION
|
||||
EnergyOverTempCheck();
|
||||
EnergyEverySecond();
|
||||
break;
|
||||
case FUNC_JSON_APPEND:
|
||||
EnergyShow(true);
|
||||
|
||||
@ -89,7 +89,7 @@ void HlwCfInterrupt(void) // Service Power
|
||||
Hlw.cf_pulse_last_time = us;
|
||||
Hlw.energy_period_counter++;
|
||||
}
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[0] = 0;
|
||||
}
|
||||
|
||||
void HlwCf1Interrupt(void) // Service Voltage and Current
|
||||
@ -108,7 +108,7 @@ void HlwCf1Interrupt(void) // Service Voltage and Current
|
||||
Hlw.cf1_timer = 8; // We need up to HLW_SAMPLE_COUNT samples within 1 second (low current could take up to 0.3 second)
|
||||
}
|
||||
}
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[0] = 0;
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
@ -199,7 +199,7 @@ void HlwEvery200ms(void)
|
||||
|
||||
void HlwEverySecond(void)
|
||||
{
|
||||
if (Energy.data_valid > ENERGY_WATCHDOG) {
|
||||
if (Energy.data_valid[0] > ENERGY_WATCHDOG) {
|
||||
Hlw.cf1_voltage_pulse_length = 0;
|
||||
Hlw.cf1_current_pulse_length = 0;
|
||||
Hlw.cf_power_pulse_length = 0;
|
||||
|
||||
@ -143,7 +143,7 @@ bool CseSerialInput(void)
|
||||
uint8_t checksum = 0;
|
||||
for (uint32_t i = 2; i < 23; i++) { checksum += serial_in_buffer[i]; }
|
||||
if (checksum == serial_in_buffer[23]) {
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[0] = 0;
|
||||
CseReceived();
|
||||
Cse.received = false;
|
||||
return true;
|
||||
@ -175,7 +175,7 @@ bool CseSerialInput(void)
|
||||
|
||||
void CseEverySecond(void)
|
||||
{
|
||||
if (Energy.data_valid > ENERGY_WATCHDOG) {
|
||||
if (Energy.data_valid[0] > ENERGY_WATCHDOG) {
|
||||
Cse.voltage_cycle = 0;
|
||||
Cse.current_cycle = 0;
|
||||
Cse.power_cycle = 0;
|
||||
|
||||
@ -179,7 +179,7 @@ void PzemEvery200ms(void)
|
||||
if (data_ready) {
|
||||
float value = 0;
|
||||
if (PzemRecieve(pzem_responses[Pzem.read_state], &value)) {
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[Pzem.phase] = 0;
|
||||
switch (Pzem.read_state) {
|
||||
case 1: // Voltage as 230.2V
|
||||
Energy.voltage[Pzem.phase] = value;
|
||||
|
||||
@ -455,6 +455,7 @@ void McpParseData(void)
|
||||
mcp_line_frequency = McpExtractInt(mcp_buffer, 22, 2);
|
||||
|
||||
if (Energy.power_on) { // Powered on
|
||||
Energy.data_valid[0] = 0;
|
||||
Energy.frequency[0] = (float)mcp_line_frequency / 1000;
|
||||
Energy.voltage[0] = (float)mcp_voltage_rms / 10;
|
||||
Energy.active_power[0] = (float)mcp_active_power / 100;
|
||||
@ -464,12 +465,8 @@ void McpParseData(void)
|
||||
Energy.current[0] = (float)mcp_current_rms / 10000;
|
||||
}
|
||||
} else { // Powered off
|
||||
Energy.frequency[0] = 0;
|
||||
Energy.voltage[0] = 0;
|
||||
Energy.active_power[0] = 0;
|
||||
Energy.current[0] = 0;
|
||||
Energy.data_valid[0] = ENERGY_WATCHDOG;
|
||||
}
|
||||
Energy.data_valid = 0;
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
@ -527,7 +524,7 @@ void McpSerialInput(void)
|
||||
|
||||
void McpEverySecond(void)
|
||||
{
|
||||
if (Energy.data_valid > ENERGY_WATCHDOG) {
|
||||
if (Energy.data_valid[0] > ENERGY_WATCHDOG) {
|
||||
mcp_voltage_rms = 0;
|
||||
mcp_current_rms = 0;
|
||||
mcp_active_power = 0;
|
||||
|
||||
@ -62,7 +62,7 @@ void PzemAcEverySecond(void)
|
||||
if (error) {
|
||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PAC: PzemAc %d error %d"), PZEM_AC_DEVICE_ADDRESS + PzemAc.phase, error);
|
||||
} else {
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[PzemAc.phase] = 0;
|
||||
if (10 == registers) {
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
||||
|
||||
@ -62,7 +62,7 @@ void PzemDcEverySecond(void)
|
||||
if (error) {
|
||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PDC: PzemDc %d error %d"), PZEM_DC_DEVICE_ADDRESS + PzemDc.channel, error);
|
||||
} else {
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[PzemDc.channel] = 0;
|
||||
if (8 == registers) {
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
||||
|
||||
@ -155,6 +155,7 @@ void Ade7953GetData(void)
|
||||
Energy.voltage[0] = (float)Ade7953.voltage_rms / Settings.energy_voltage_calibration;
|
||||
|
||||
for (uint32_t channel = 0; channel < 2; channel++) {
|
||||
Energy.data_valid[channel] = 0;
|
||||
Energy.active_power[channel] = (float)Ade7953.active_power[channel] / (Settings.energy_power_calibration / 10);
|
||||
Energy.reactive_power[channel] = (float)reactive_power[channel] / (Settings.energy_power_calibration / 10);
|
||||
Energy.apparent_power[channel] = (float)apparent_power[channel] / (Settings.energy_power_calibration / 10);
|
||||
@ -165,13 +166,8 @@ void Ade7953GetData(void)
|
||||
}
|
||||
}
|
||||
} else { // Powered off
|
||||
Energy.voltage[0] = 0;
|
||||
for (uint32_t channel = 0; channel < 2; channel++) {
|
||||
Energy.current[channel] = 0;
|
||||
Energy.active_power[channel] = 0;
|
||||
Energy.reactive_power[channel] = 0;
|
||||
Energy.apparent_power[channel] = 0;
|
||||
}
|
||||
Energy.data_valid[0] = ENERGY_WATCHDOG;
|
||||
Energy.data_valid[1] = ENERGY_WATCHDOG;
|
||||
}
|
||||
|
||||
if (active_power_sum) {
|
||||
|
||||
@ -85,7 +85,7 @@ void SDM120Every250ms(void)
|
||||
if (error) {
|
||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SDM: SDM120 error %d"), error);
|
||||
} else {
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[0] = 0;
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
// SA FC BC Fh Fl Sh Sl Cl Ch
|
||||
|
||||
@ -52,7 +52,7 @@ void Dds2382EverySecond(void)
|
||||
if (error) {
|
||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "DDS2382 response error %d"), error);
|
||||
} else {
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[0] = 0;
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
||||
// SA FC BC EnergyTotal ExportActiv ImportActiv Volta Curre APowe RPowe PFact Frequ Crc--
|
||||
|
||||
@ -78,7 +78,9 @@ void SDM630Every250ms(void)
|
||||
if (error) {
|
||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SDM: SDM630 error %d"), error);
|
||||
} else {
|
||||
Energy.data_valid = 0;
|
||||
Energy.data_valid[0] = 0;
|
||||
Energy.data_valid[1] = 0;
|
||||
Energy.data_valid[2] = 0;
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
// SA FC BC Fh Fl Sh Sl Cl Ch
|
||||
|
||||
Loading…
Reference in New Issue
Block a user