Fix energy values after power cycle

Fix energy values after power cycle (#16118)
This commit is contained in:
Theo Arends 2022-08-05 15:25:39 +02:00
parent 5c8e67f48f
commit 02d7eb1d7d
6 changed files with 40 additions and 38 deletions

View File

@ -550,8 +550,8 @@ typedef struct {
uint32_t energy_power_calibration; // 364
uint32_t energy_voltage_calibration; // 368
uint32_t energy_current_calibration; // 36C
uint32_t energy_kWhtoday; // 370
uint32_t energy_kWhyesterday; // 374
uint32_t ex_energy_kWhtoday; // 370
uint32_t ex_energy_kWhyesterday; // 374
uint16_t energy_kWhdoy; // 378
uint16_t energy_min_power; // 37A
uint16_t energy_max_power; // 37C
@ -843,7 +843,7 @@ typedef struct {
uint16_t flowratemeter_calibration[2];// F78
int32_t energy_kWhexport_ph[3]; // F7C
uint32_t eth_ipv4_address[5]; // F88
uint32_t energy_kWhtotal; // F9C
uint32_t ex_energy_kWhtotal; // F9C
SBitfield1 sbflag1; // FA0
TeleinfoCfg teleinfo; // FA4
uint64_t rf_protocol_mask; // FA8

View File

@ -110,8 +110,8 @@ typedef struct {
uint16_t valid; // 290 (RTC memory offset 100)
uint8_t oswatch_blocked_loop; // 292
uint8_t ota_loader; // 293
uint32_t energy_kWhtoday; // 294
uint32_t energy_kWhtotal; // 298
uint32_t ex_energy_kWhtoday; // 294
uint32_t ex_energy_kWhtotal; // 298
volatile uint32_t pulse_counter[MAX_COUNTERS]; // 29C - See #9521 why volatile
power_t power; // 2AC
EnergyUsage energy_usage; // 2B0

View File

@ -45,8 +45,8 @@ void RtcSettingsSave(void) {
if (RTC_MEM_VALID != RtcSettings.valid) {
memset(&RtcSettings, 0, sizeof(RtcSettings));
RtcSettings.valid = RTC_MEM_VALID;
RtcSettings.energy_kWhtoday = Settings->energy_kWhtoday;
RtcSettings.energy_kWhtotal = Settings->energy_kWhtotal;
// RtcSettings.ex_energy_kWhtoday = Settings->ex_energy_kWhtoday;
// RtcSettings.ex_energy_kWhtotal = Settings->ex_energy_kWhtotal;
for (uint32_t i = 0; i < 3; i++) {
RtcSettings.energy_kWhtoday_ph[i] = Settings->energy_kWhtoday_ph[i];
RtcSettings.energy_kWhtotal_ph[i] = Settings->energy_kWhtotal_ph[i];
@ -61,6 +61,8 @@ void RtcSettingsSave(void) {
RtcSettings.baudrate = APP_BAUDRATE;
}
// AddLog(LOG_LEVEL_INFO, PSTR("DBG: energy_kWhtoday_ph[0] %d/%d"), RtcSettings.energy_kWhtoday_ph[0], Settings->energy_kWhtoday_ph[0]);
#ifdef ESP8266
ESP.rtcUserMemoryWrite(100, (uint32_t*)&RtcSettings, sizeof(RtcSettings));
#endif // ESP8266
@ -1037,8 +1039,12 @@ void SettingsDefaultSet2(void) {
Settings->energy_power_calibration = HLW_PREF_PULSE;
Settings->energy_voltage_calibration = HLW_UREF_PULSE;
Settings->energy_current_calibration = HLW_IREF_PULSE;
// Settings->energy_kWhtoday = 0;
// Settings->energy_kWhyesterday = 0;
// Settings->energy_kWhtoday_ph[0] = 0;
// Settings->energy_kWhtoday_ph[1] = 0;
// Settings->energy_kWhtoday_ph[2] = 0;
// Settings->energy_kWhyesterday_ph[0] = 0;
// Settings->energy_kWhyesterday_ph[1] = 0;
// Settings->energy_kWhyesterday_ph[2] = 0;
// Settings->energy_kWhdoy = 0;
// Settings->energy_min_power = 0;
// Settings->energy_max_power = 0;
@ -1054,8 +1060,12 @@ void SettingsDefaultSet2(void) {
Settings->energy_max_power_safe_limit_window = SAFE_POWER_WINDOW;
// Settings->energy_max_energy = 0; // MaxEnergy
// Settings->energy_max_energy_start = 0; // MaxEnergyStart
// Settings->energy_kWhtotal = 0;
RtcSettings.energy_kWhtotal = 0;
// Settings->energy_kWhtotal_ph[0] = 0;
// Settings->energy_kWhtotal_ph[1] = 0;
// Settings->energy_kWhtotal_ph[2] = 0;
RtcSettings.energy_kWhtotal_ph[0] = 0;
RtcSettings.energy_kWhtotal_ph[1] = 0;
RtcSettings.energy_kWhtotal_ph[2] = 0;
// memset((char*)&Settings->energy_usage, 0x00, sizeof(Settings->energy_usage));
memset((char*)&RtcSettings.energy_usage, 0x00, sizeof(RtcSettings.energy_usage));
Settings->param[P_OVER_TEMP] = ENERGY_OVERTEMP;
@ -1482,7 +1492,7 @@ void SettingsDelta(void) {
memset(&Settings->sensors, 0xFF, 16); // Enable all possible sensors
}
if (Settings->version < 0x09050004) {
Settings->energy_kWhtotal = Settings->ipv4_address[4];
Settings->ex_energy_kWhtotal = Settings->ipv4_address[4];
ParseIPv4(&Settings->ipv4_address[4], PSTR(WIFI_DNS2));
}
if (Settings->version < 0x09050005) {
@ -1507,6 +1517,11 @@ void SettingsDelta(void) {
if (Settings->version < 0x09050009) { // 9.5.0.9
memset(&Settings->energy_kWhtoday_ph, 0, 36);
memset(&RtcSettings.energy_kWhtoday_ph, 0, 24);
Settings->energy_kWhtotal_ph[0] = Settings->ex_energy_kWhtotal;
Settings->energy_kWhtoday_ph[0] = Settings->ex_energy_kWhtoday;
Settings->energy_kWhyesterday_ph[0] = Settings->ex_energy_kWhyesterday;
RtcSettings.energy_kWhtoday_ph[0] = RtcSettings.ex_energy_kWhtoday;
RtcSettings.energy_kWhtotal_ph[0] = RtcSettings.ex_energy_kWhtotal;
}
if (Settings->version < 0x0A000003) { // 10.0.0.3
if (0 == Settings->param[P_ARP_GRATUITOUS]) {

View File

@ -2473,7 +2473,7 @@ void SyslogAsync(bool refresh) {
if (!WifiHostByName(SettingsText(SET_SYSLOG_HOST), temp_syslog_host_addr)) { // If sleep enabled this might result in exception so try to do it once using hash
TasmotaGlobal.syslog_level = 0;
TasmotaGlobal.syslog_timer = SYSLOG_TIMER;
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_RETRY_IN " %d " D_UNIT_SECOND), SYSLOG_TIMER);
AddLog(LOG_LEVEL_INFO, PSTR("SLG: " D_RETRY_IN " %d " D_UNIT_SECOND), SYSLOG_TIMER);
return;
}
syslog_host_hash = current_hash;
@ -2482,7 +2482,7 @@ void SyslogAsync(bool refresh) {
if (!PortUdp.beginPacket(syslog_host_addr, Settings->syslog_port)) {
TasmotaGlobal.syslog_level = 0;
TasmotaGlobal.syslog_timer = SYSLOG_TIMER;
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_SYSLOG_HOST_NOT_FOUND ". " D_RETRY_IN " %d " D_UNIT_SECOND), SYSLOG_TIMER);
AddLog(LOG_LEVEL_INFO, PSTR("SLG: " D_SYSLOG_HOST_NOT_FOUND ". " D_RETRY_IN " %d " D_UNIT_SECOND), SYSLOG_TIMER);
return;
}

View File

@ -1040,7 +1040,7 @@ void EnergyDrvInit(void) {
#endif // USE_ENERGY_MARGIN_DETECTION
TasmotaGlobal.energy_driver = ENERGY_NONE;
XnrgCall(FUNC_PRE_INIT); // Find first energy driver
XnrgCall(FUNC_PRE_INIT); // Find first energy driver
}
void EnergySnsInit(void)
@ -1048,31 +1048,19 @@ void EnergySnsInit(void)
XnrgCall(FUNC_INIT);
if (TasmotaGlobal.energy_driver) {
// Update for split phase totals (v9.5.0.9)
if ((Settings->energy_kWhtotal > 0) && (0 == Settings->energy_kWhtotal_ph[0])) {
Settings->energy_kWhtotal_ph[0] = Settings->energy_kWhtotal;
Settings->energy_kWhtoday_ph[0] = Settings->energy_kWhtoday;
Settings->energy_kWhyesterday_ph[0] = Settings->energy_kWhyesterday;
RtcSettings.energy_kWhtoday_ph[0] = RtcSettings.energy_kWhtoday;
RtcSettings.energy_kWhtotal_ph[0] = RtcSettings.energy_kWhtotal;
Settings->energy_kWhtotal = 0;
}
// Energy.kWhtoday_offset = 0;
// Do not use at Power On as Rtc was invalid (but has been restored from Settings already)
if ((ResetReason() != REASON_DEFAULT_RST) && RtcSettingsValid()) {
for (uint32_t i = 0; i < 3; i++) {
Energy.kWhtoday_offset[i] = RtcSettings.energy_kWhtoday_ph[i];
}
Energy.kWhtoday_offset_init = true;
}
for (uint32_t i = 0; i < 3; i++) {
// Energy.kWhtoday_ph[i] = 0;
// Energy.kWhtoday_delta[i] = 0;
// Energy.kWhtoday_offset[i] = 0; // Reset by EnergyDrvInit()
// 20220805 - Change from https://github.com/arendst/Tasmota/issues/16118
if (RtcSettingsValid()) {
Energy.kWhtoday_offset[i] = RtcSettings.energy_kWhtoday_ph[i];
RtcSettings.energy_kWhtoday_ph[i] = 0;
Energy.kWhtoday_offset_init = true;
}
// Energy.kWhtoday_ph[i] = 0; // Reset by EnergyDrvInit()
// Energy.kWhtoday_delta[i] = 0; // Reset by EnergyDrvInit()
Energy.period[i] = Energy.kWhtoday_offset[i];
if (Energy.local_energy_active_export) {
Energy.export_active[i] = 0;
Energy.export_active[i] = 0; // Was set to NAN by EnergyDrvInit()
}
}
EnergyUpdateToday();

View File

@ -570,7 +570,6 @@ void TInfoDrvInit(void) {
Energy.phase_count = 1;
// init hardware energy counters
Settings->flag3.hardware_energy_total = true;
Settings->energy_kWhtotal = 0;
}
}