diff --git a/sonoff/xdrv_03_energy.ino b/sonoff/xdrv_03_energy.ino index 8d4f5edda..1c2333a70 100644 --- a/sonoff/xdrv_03_energy.ino +++ b/sonoff/xdrv_03_energy.ino @@ -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); diff --git a/sonoff/xnrg_01_hlw8012.ino b/sonoff/xnrg_01_hlw8012.ino index f2bd96734..5c904f13d 100644 --- a/sonoff/xnrg_01_hlw8012.ino +++ b/sonoff/xnrg_01_hlw8012.ino @@ -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; diff --git a/sonoff/xnrg_02_cse7766.ino b/sonoff/xnrg_02_cse7766.ino index 5fd927c28..b83e7bcb3 100644 --- a/sonoff/xnrg_02_cse7766.ino +++ b/sonoff/xnrg_02_cse7766.ino @@ -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; diff --git a/sonoff/xnrg_03_pzem004t.ino b/sonoff/xnrg_03_pzem004t.ino index 46a39f44c..23a9538fe 100644 --- a/sonoff/xnrg_03_pzem004t.ino +++ b/sonoff/xnrg_03_pzem004t.ino @@ -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; diff --git a/sonoff/xnrg_04_mcp39f501.ino b/sonoff/xnrg_04_mcp39f501.ino index 462049b0d..fa9f5cb59 100644 --- a/sonoff/xnrg_04_mcp39f501.ino +++ b/sonoff/xnrg_04_mcp39f501.ino @@ -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; diff --git a/sonoff/xnrg_05_pzem_ac.ino b/sonoff/xnrg_05_pzem_ac.ino index 60362adbc..2edb59d7b 100644 --- a/sonoff/xnrg_05_pzem_ac.ino +++ b/sonoff/xnrg_05_pzem_ac.ino @@ -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 diff --git a/sonoff/xnrg_06_pzem_dc.ino b/sonoff/xnrg_06_pzem_dc.ino index 983c2db6a..a8afdcbe4 100644 --- a/sonoff/xnrg_06_pzem_dc.ino +++ b/sonoff/xnrg_06_pzem_dc.ino @@ -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 diff --git a/sonoff/xnrg_07_ade7953.ino b/sonoff/xnrg_07_ade7953.ino index 4d2b3f3e4..81c7c458e 100644 --- a/sonoff/xnrg_07_ade7953.ino +++ b/sonoff/xnrg_07_ade7953.ino @@ -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) { diff --git a/sonoff/xnrg_08_sdm120.ino b/sonoff/xnrg_08_sdm120.ino index 0cfe9a4b2..8b771ba80 100644 --- a/sonoff/xnrg_08_sdm120.ino +++ b/sonoff/xnrg_08_sdm120.ino @@ -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 diff --git a/sonoff/xnrg_09_dds2382.ino b/sonoff/xnrg_09_dds2382.ino index b6e5a7e5c..b36a12d8f 100644 --- a/sonoff/xnrg_09_dds2382.ino +++ b/sonoff/xnrg_09_dds2382.ino @@ -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-- diff --git a/sonoff/xnrg_10_sdm630.ino b/sonoff/xnrg_10_sdm630.ino index 140226589..4c048b062 100644 --- a/sonoff/xnrg_10_sdm630.ino +++ b/sonoff/xnrg_10_sdm630.ino @@ -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