Fix PZEM missing phase zeroing all readings

Fix PZEM missing phase zeroing all readings (#2315)
This commit is contained in:
Theo Arends 2019-09-21 17:10:52 +02:00
parent d6a5b651d5
commit 37d9cb4c92
11 changed files with 43 additions and 39 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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) {

View File

@ -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

View File

@ -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--

View File

@ -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