From e89183054539471c09325de672f53bd65ff3658d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 24 Jan 2023 16:54:03 +0100 Subject: [PATCH] Prep ESP32 energy --- .../tasmota_xdrv_driver/xdrv_03_energy.ino | 560 +++++++++--------- .../tasmota_xdrv_driver/xdrv_10_scripter.ino | 26 +- tasmota/tasmota_xdrv_driver/xdrv_11_knx.ino | 42 +- .../xdrv_16_tuyamcu_v1.ino | 26 +- .../xdrv_16_tuyamcu_v2.ino | 26 +- .../xdrv_45_shelly_dimmer.ino | 24 +- .../xdrv_87_esp32_sonoff_tm1621.ino | 8 +- .../tasmota_xnrg_energy/xnrg_01_hlw8012.ino | 42 +- .../tasmota_xnrg_energy/xnrg_02_cse7766.ino | 40 +- .../tasmota_xnrg_energy/xnrg_03_pzem004t.ino | 24 +- .../tasmota_xnrg_energy/xnrg_04_mcp39f501.ino | 32 +- .../tasmota_xnrg_energy/xnrg_05_pzem_ac.ino | 26 +- .../tasmota_xnrg_energy/xnrg_06_pzem_dc.ino | 24 +- .../tasmota_xnrg_energy/xnrg_07_ade7953.ino | 62 +- .../tasmota_xnrg_energy/xnrg_08_sdm120.ino | 20 +- .../tasmota_xnrg_energy/xnrg_09_dds2382.ino | 18 +- .../tasmota_xnrg_energy/xnrg_10_sdm630.ino | 56 +- .../tasmota_xnrg_energy/xnrg_11_ddsu666.ino | 18 +- .../tasmota_xnrg_energy/xnrg_12_solaxX1.ino | 16 +- .../xnrg_13_fif_le01mr.ino | 20 +- .../tasmota_xnrg_energy/xnrg_14_bl09xx.ino | 54 +- .../tasmota_xnrg_energy/xnrg_15_teleinfo.ino | 52 +- .../tasmota_xnrg_energy/xnrg_16_iem3000.ino | 32 +- .../tasmota_xnrg_energy/xnrg_17_ornowe517.ino | 44 +- tasmota/tasmota_xnrg_energy/xnrg_18_sdm72.ino | 14 +- .../tasmota_xnrg_energy/xnrg_19_cse7761.ino | 50 +- .../tasmota_xnrg_energy/xnrg_21_sdm230.ino | 26 +- .../tasmota_xnrg_energy/xnrg_22_bl6523.ino | 32 +- .../tasmota_xnrg_energy/xnrg_23_ade7880.ino | 24 +- .../tasmota_xnrg_energy/xnrg_29_modbus.ino | 50 +- tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino | 46 +- .../tasmota_xsns_sensor/xsns_62_esp32_mi.ino | 8 +- .../xsns_75_prometheus.ino | 10 +- 33 files changed, 779 insertions(+), 773 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index 70fca2527..14d7279d8 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -17,6 +17,7 @@ along with this program. If not, see . */ +//#ifdef ESP8266 #ifdef USE_ENERGY_SENSOR /*********************************************************************************************\ * Energy @@ -74,7 +75,7 @@ void (* const EnergyCommand[])(void) PROGMEM = { #endif // USE_ENERGY_MARGIN_DETECTION &CmndEnergyToday, &CmndEnergyYesterday, &CmndEnergyTotal, &CmndEnergyExportActive, &CmndEnergyUsage, &CmndEnergyExport, &CmndTariff}; -struct ENERGY { +typedef struct { float voltage[ENERGY_MAX_PHASES]; // 123.1 V float current[ENERGY_MAX_PHASES]; // 123.123 A float active_power[ENERGY_MAX_PHASES]; // 123.1 W @@ -93,10 +94,10 @@ struct ENERGY { float daily_sum_import_balanced; // 123.123 kWh float daily_sum_export_balanced; // 123.123 kWh - int32_t kWhtoday_delta[ENERGY_MAX_PHASES]; // 1212312345 Wh 10^-5 (deca micro Watt hours) - Overflows to Energy.kWhtoday (HLW and CSE only) - int32_t kWhtoday_offset[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy.daily - int32_t kWhtoday[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy.daily - int32_t period[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy.daily + int32_t kWhtoday_delta[ENERGY_MAX_PHASES]; // 1212312345 Wh 10^-5 (deca micro Watt hours) - Overflows to Energy->kWhtoday (HLW and CSE only) + int32_t kWhtoday_offset[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy->daily + int32_t kWhtoday[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy->daily + int32_t period[ENERGY_MAX_PHASES]; // 12312312 Wh * 10^-2 (deca milli Watt hours) - 5764 = 0.05764 kWh = 0.058 kWh = Energy->daily uint8_t fifth_second; uint8_t command_code; @@ -132,7 +133,9 @@ struct ENERGY { uint8_t max_energy_state; #endif // USE_ENERGY_POWER_LIMIT #endif // USE_ENERGY_MARGIN_DETECTION -} Energy; +} tEnergy; + +tEnergy *Energy = nullptr; Ticker ticker_energy; @@ -140,25 +143,25 @@ Ticker ticker_energy; char* EnergyFormat(char* result, float* input, uint32_t resolution, uint32_t single = 0); char* EnergyFormat(char* result, float* input, uint32_t resolution, uint32_t single) { - // single = 0 - Energy.phase_count - xx or [xx,xx] or [xx,xx,xx] - // single = 1 - Energy.voltage_common or Energy.frequency_common - xx - // single = 2 - Sum of Energy.phase_count if SO129 0 - xx or if SO129 1 - [xx,xx,xx] + // single = 0 - Energy->phase_count - xx or [xx,xx] or [xx,xx,xx] + // single = 1 - Energy->voltage_common or Energy->frequency_common - xx + // single = 2 - Sum of Energy->phase_count if SO129 0 - xx or if SO129 1 - [xx,xx,xx] // single = 5 - single &0x03 = 1 - xx // single = 6 - single &0x03 = 2 - [xx,xx] - used by tarriff // single = 7 - single &0x03 = 3 - [xx,xx,xx] - uint32_t index = (single > 3) ? single &0x03 : (0 == single) ? Energy.phase_count : 1; // 1,2,3 + uint32_t index = (single > 3) ? single &0x03 : (0 == single) ? Energy->phase_count : 1; // 1,2,3 if (single > 2) { single = 0; } // 0,1,2 float input_sum = 0.0f; if (single > 1) { if (!Settings->flag5.energy_phase) { // SetOption129 - (Energy) Show phase information - for (uint32_t i = 0; i < Energy.phase_count; i++) { + for (uint32_t i = 0; i < Energy->phase_count; i++) { if (!isnan(input[i])) { input_sum += input[i]; } } input = &input_sum; } else { - index = Energy.phase_count; + index = Energy->phase_count; } } result[0] = '\0'; @@ -171,13 +174,13 @@ char* EnergyFormat(char* result, float* input, uint32_t resolution, uint32_t sin #ifdef USE_WEBSERVER char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t single = 0); char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t single) { - // single = 0 - Energy.phase_count - xx / xx / xx or multi column - // single = 1 - Energy.voltage_common or Energy.frequency_common - xx or single column using colspan (if needed) - // single = 2 - Sum of Energy.phase_count if SO129 0 - xx or single column using colspan (if needed) or if SO129 1 - xx / xx / xx or multi column + // single = 0 - Energy->phase_count - xx / xx / xx or multi column + // single = 1 - Energy->voltage_common or Energy->frequency_common - xx or single column using colspan (if needed) + // single = 2 - Sum of Energy->phase_count if SO129 0 - xx or single column using colspan (if needed) or if SO129 1 - xx / xx / xx or multi column float input_sum = 0.0f; if (single > 1) { // Sum and/or Single column if (!Settings->flag5.energy_phase) { // SetOption129 - (Energy) Show phase information - for (uint32_t i = 0; i < Energy.phase_count; i++) { + for (uint32_t i = 0; i < Energy->phase_count; i++) { if (!isnan(input[i])) { input_sum += input[i]; } @@ -189,25 +192,25 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t } #ifdef USE_ENERGY_COLUMN_GUI ext_snprintf_P(result, GUISZ, PSTR("")); // Skip first column - if ((Energy.phase_count > 1) && single) { // Need to set colspan so need new columns + if ((Energy->phase_count > 1) && single) { // Need to set colspan so need new columns // 1.23  // 1.23  // 1.23  ext_snprintf_P(result, GUISZ, PSTR("%s%*_f "), - result, (Energy.phase_count *2) -1, (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("center"), resolution, &input[0]); + result, (Energy->phase_count *2) -1, (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("center"), resolution, &input[0]); } else { // 1.23  // 1.23 1.23  // 1.23 1.23 1.23  // 1.23 1.23 1.23 1.23  - for (uint32_t i = 0; i < Energy.phase_count; i++) { + for (uint32_t i = 0; i < Energy->phase_count; i++) { ext_snprintf_P(result, GUISZ, PSTR("%s%*_f "), result, (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("left"), resolution, &input[i]); } } ext_snprintf_P(result, GUISZ, PSTR("%s"), result); #else // not USE_ENERGY_COLUMN_GUI - uint32_t index = (single) ? 1 : Energy.phase_count; // 1,2,3 + uint32_t index = (single) ? 1 : Energy->phase_count; // 1,2,3 result[0] = '\0'; for (uint32_t i = 0; i < index; i++) { ext_snprintf_P(result, GUISZ, PSTR("%s%s%*_f"), result, (i)?" / ":"", resolution, &input[i]); @@ -244,54 +247,54 @@ bool EnergyTariff1Active() // Off-Peak hours } void EnergyUpdateToday(void) { - Energy.total_sum = 0.0f; - Energy.yesterday_sum = 0.0f; - Energy.daily_sum = 0.0f; + Energy->total_sum = 0.0f; + Energy->yesterday_sum = 0.0f; + Energy->daily_sum = 0.0f; int32_t delta_sum_balanced = 0; - for (uint32_t i = 0; i < Energy.phase_count; i++) { - if (abs(Energy.kWhtoday_delta[i]) > 1000) { - int32_t delta = Energy.kWhtoday_delta[i] / 1000; + for (uint32_t i = 0; i < Energy->phase_count; i++) { + if (abs(Energy->kWhtoday_delta[i]) > 1000) { + int32_t delta = Energy->kWhtoday_delta[i] / 1000; delta_sum_balanced += delta; - Energy.kWhtoday_delta[i] -= (delta * 1000); - Energy.kWhtoday[i] += delta; + Energy->kWhtoday_delta[i] -= (delta * 1000); + Energy->kWhtoday[i] += delta; if (delta < 0) { // Export energy RtcSettings.energy_kWhexport_ph[i] += ((delta / 100) *-1); } } - RtcSettings.energy_kWhtoday_ph[i] = Energy.kWhtoday_offset[i] + Energy.kWhtoday[i]; - Energy.daily[i] = (float)(RtcSettings.energy_kWhtoday_ph[i]) / 100000; - Energy.total[i] = ((float)(RtcSettings.energy_kWhtotal_ph[i]) / 1000) + ((float)(RtcSettings.energy_kWhtoday_ph[i]) / 100000); - if (Energy.local_energy_active_export) { - Energy.export_active[i] = (float)(RtcSettings.energy_kWhexport_ph[i]) / 1000; + RtcSettings.energy_kWhtoday_ph[i] = Energy->kWhtoday_offset[i] + Energy->kWhtoday[i]; + Energy->daily[i] = (float)(RtcSettings.energy_kWhtoday_ph[i]) / 100000; + Energy->total[i] = ((float)(RtcSettings.energy_kWhtotal_ph[i]) / 1000) + ((float)(RtcSettings.energy_kWhtoday_ph[i]) / 100000); + if (Energy->local_energy_active_export) { + Energy->export_active[i] = (float)(RtcSettings.energy_kWhexport_ph[i]) / 1000; } - Energy.total_sum += Energy.total[i]; - Energy.yesterday_sum += (float)Settings->energy_kWhyesterday_ph[i] / 100000; - Energy.daily_sum += Energy.daily[i]; + Energy->total_sum += Energy->total[i]; + Energy->yesterday_sum += (float)Settings->energy_kWhyesterday_ph[i] / 100000; + Energy->daily_sum += Energy->daily[i]; } if (delta_sum_balanced > 0) { - Energy.daily_sum_import_balanced += (float)delta_sum_balanced / 100000; + Energy->daily_sum_import_balanced += (float)delta_sum_balanced / 100000; } else { - Energy.daily_sum_export_balanced += (float)abs(delta_sum_balanced) / 100000; + Energy->daily_sum_export_balanced += (float)abs(delta_sum_balanced) / 100000; } if (RtcTime.valid){ // We calc the difference only if we have a valid RTC time. - uint32_t energy_diff = (uint32_t)(Energy.total_sum * 1000) - RtcSettings.energy_usage.last_usage_kWhtotal; - RtcSettings.energy_usage.last_usage_kWhtotal = (uint32_t)(Energy.total_sum * 1000); + uint32_t energy_diff = (uint32_t)(Energy->total_sum * 1000) - RtcSettings.energy_usage.last_usage_kWhtotal; + RtcSettings.energy_usage.last_usage_kWhtotal = (uint32_t)(Energy->total_sum * 1000); uint32_t return_diff = 0; - if (!isnan(Energy.export_active[0])) { -// return_diff = (uint32_t)(Energy.export_active * 1000) - RtcSettings.energy_usage.last_return_kWhtotal; -// RtcSettings.energy_usage.last_return_kWhtotal = (uint32_t)(Energy.export_active * 1000); + if (!isnan(Energy->export_active[0])) { +// return_diff = (uint32_t)(Energy->export_active * 1000) - RtcSettings.energy_usage.last_return_kWhtotal; +// RtcSettings.energy_usage.last_return_kWhtotal = (uint32_t)(Energy->export_active * 1000); float export_active = 0.0f; - for (uint32_t i = 0; i < Energy.phase_count; i++) { - if (!isnan(Energy.export_active[i])) { - export_active += Energy.export_active[i]; + for (uint32_t i = 0; i < Energy->phase_count; i++) { + if (!isnan(Energy->export_active[i])) { + export_active += Energy->export_active[i]; } } return_diff = (uint32_t)(export_active * 1000) - RtcSettings.energy_usage.last_return_kWhtotal; @@ -309,17 +312,17 @@ void EnergyUpdateToday(void) { } void EnergyUpdateTotal(void) { - // Provide total import active energy as float Energy.import_active[phase] in kWh: 98Wh = 0.098kWh + // Provide total import active energy as float Energy->import_active[phase] in kWh: 98Wh = 0.098kWh - for (uint32_t i = 0; i < Energy.phase_count; i++) { - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("NRG: EnergyTotal[%d] %4_f kWh"), i, &Energy.import_active[i]); + for (uint32_t i = 0; i < Energy->phase_count; i++) { + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("NRG: EnergyTotal[%d] %4_f kWh"), i, &Energy->import_active[i]); // Try to fix instable input by verifying allowed bandwidth (#17659) - if ((Energy.start_energy[i] != 0) && + if ((Energy->start_energy[i] != 0) && (Settings->param[P_CSE7766_INVALID_POWER] > 0) && (Settings->param[P_CSE7766_INVALID_POWER] < 128)) { // SetOption39 1..127 kWh - int total = abs((int)Energy.total[i]); // We only use kWh - int import_active = abs((int)Energy.import_active[i]); + int total = abs((int)Energy->total[i]); // We only use kWh + int import_active = abs((int)Energy->import_active[i]); if ((import_active < (total - Settings->param[P_CSE7766_INVALID_POWER])) || (import_active > (total + Settings->param[P_CSE7766_INVALID_POWER]))) { AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("NRG: Outside bandwidth")); @@ -327,20 +330,20 @@ void EnergyUpdateTotal(void) { } } - if (0 == Energy.start_energy[i] || (Energy.import_active[i] < Energy.start_energy[i])) { - Energy.start_energy[i] = Energy.import_active[i]; // Init after restart and handle roll-over if any + if (0 == Energy->start_energy[i] || (Energy->import_active[i] < Energy->start_energy[i])) { + Energy->start_energy[i] = Energy->import_active[i]; // Init after restart and handle roll-over if any } - else if (Energy.import_active[i] != Energy.start_energy[i]) { - Energy.kWhtoday[i] = (int32_t)((Energy.import_active[i] - Energy.start_energy[i]) * 100000); + else if (Energy->import_active[i] != Energy->start_energy[i]) { + Energy->kWhtoday[i] = (int32_t)((Energy->import_active[i] - Energy->start_energy[i]) * 100000); } - if ((Energy.total[i] < (Energy.import_active[i] - 0.01f)) && // We subtract a little offset of 10Wh to avoid continuous updates + if ((Energy->total[i] < (Energy->import_active[i] - 0.01f)) && // We subtract a little offset of 10Wh to avoid continuous updates Settings->flag3.hardware_energy_total) { // SetOption72 - Enable hardware energy total counter as reference (#6561) - // The following calculation allows total usage (Energy.import_active[i]) up to +/-2147483.647 kWh - RtcSettings.energy_kWhtotal_ph[i] = (int32_t)((Energy.import_active[i] * 1000) - ((Energy.kWhtoday_offset[i] + Energy.kWhtoday[i]) / 100)); + // The following calculation allows total usage (Energy->import_active[i]) up to +/-2147483.647 kWh + RtcSettings.energy_kWhtotal_ph[i] = (int32_t)((Energy->import_active[i] * 1000) - ((Energy->kWhtoday_offset[i] + Energy->kWhtoday[i]) / 100)); Settings->energy_kWhtotal_ph[i] = RtcSettings.energy_kWhtotal_ph[i]; - Energy.total[i] = Energy.import_active[i]; - Settings->energy_kWhtotal_time = (!Energy.kWhtoday_offset[i]) ? LocalTime() : Midnight(); + Energy->total[i] = Energy->import_active[i]; + Settings->energy_kWhtotal_time = (!Energy->kWhtoday_offset[i]) ? LocalTime() : Midnight(); // AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: Energy Total updated with hardware value")); } } @@ -352,26 +355,26 @@ void EnergyUpdateTotal(void) { void Energy200ms(void) { - Energy.power_on = (TasmotaGlobal.power != 0) | Settings->flag.no_power_on_check; // SetOption21 - Show voltage even if powered off + Energy->power_on = (TasmotaGlobal.power != 0) | Settings->flag.no_power_on_check; // SetOption21 - Show voltage even if powered off - Energy.fifth_second++; - if (5 == Energy.fifth_second) { - Energy.fifth_second = 0; + Energy->fifth_second++; + if (5 == Energy->fifth_second) { + Energy->fifth_second = 0; XnrgCall(FUNC_ENERGY_EVERY_SECOND); if (RtcTime.valid) { - if (!Energy.kWhtoday_offset_init && (RtcTime.day_of_year == Settings->energy_kWhdoy)) { - Energy.kWhtoday_offset_init = true; + if (!Energy->kWhtoday_offset_init && (RtcTime.day_of_year == Settings->energy_kWhdoy)) { + Energy->kWhtoday_offset_init = true; for (uint32_t i = 0; i < 3; i++) { - Energy.kWhtoday_offset[i] = Settings->energy_kWhtoday_ph[i]; + Energy->kWhtoday_offset[i] = Settings->energy_kWhtoday_ph[i]; // RtcSettings.energy_kWhtoday_ph[i] = 0; } } if ((LocalTime() == Midnight()) || (RtcTime.day_of_year > Settings->energy_kWhdoy)) { - Energy.kWhtoday_offset_init = true; + Energy->kWhtoday_offset_init = true; Settings->energy_kWhdoy = RtcTime.day_of_year; for (uint32_t i = 0; i < 3; i++) { @@ -382,25 +385,25 @@ void Energy200ms(void) Settings->energy_kWhexport_ph[i] = RtcSettings.energy_kWhexport_ph[i]; - Energy.period[i] -= RtcSettings.energy_kWhtoday_ph[i]; // this becomes a large unsigned, effectively a negative for EnergyShow calculation - Energy.kWhtoday[i] = 0; - Energy.kWhtoday_offset[i] = 0; + Energy->period[i] -= RtcSettings.energy_kWhtoday_ph[i]; // this becomes a large unsigned, effectively a negative for EnergyShow calculation + Energy->kWhtoday[i] = 0; + Energy->kWhtoday_offset[i] = 0; RtcSettings.energy_kWhtoday_ph[i] = 0; Settings->energy_kWhtoday_ph[i] = 0; - Energy.start_energy[i] = 0; -// Energy.kWhtoday_delta = 0; // dont zero this, we need to carry the remainder over to tomorrow - Energy.daily_sum_import_balanced = 0.0; - Energy.daily_sum_export_balanced = 0.0; + Energy->start_energy[i] = 0; +// Energy->kWhtoday_delta = 0; // dont zero this, we need to carry the remainder over to tomorrow + Energy->daily_sum_import_balanced = 0.0; + Energy->daily_sum_export_balanced = 0.0; } EnergyUpdateToday(); #if defined(USE_ENERGY_MARGIN_DETECTION) && defined(USE_ENERGY_POWER_LIMIT) - Energy.max_energy_state = 3; + Energy->max_energy_state = 3; #endif // USE_ENERGY_POWER_LIMIT } #if defined(USE_ENERGY_MARGIN_DETECTION) && defined(USE_ENERGY_POWER_LIMIT) - if ((RtcTime.hour == Settings->energy_max_energy_start) && (3 == Energy.max_energy_state )) { - Energy.max_energy_state = 0; + if ((RtcTime.hour == Settings->energy_max_energy_start) && (3 == Energy->max_energy_state )) { + Energy->max_energy_state = 0; } #endif // USE_ENERGY_POWER_LIMIT @@ -440,9 +443,9 @@ bool EnergyMargin(bool type, uint16_t margin, uint16_t value, bool &flag, bool & } void EnergyMarginCheck(void) { - if (!Energy.phase_count || (TasmotaGlobal.uptime < 8)) { return; } - if (Energy.power_steady_counter) { - Energy.power_steady_counter--; + if (!Energy->phase_count || (TasmotaGlobal.uptime < 8)) { return; } + if (Energy->power_steady_counter) { + Energy->power_steady_counter--; return; } @@ -450,18 +453,18 @@ void EnergyMarginCheck(void) { Response_P(PSTR("{\"" D_RSLT_MARGINS "\":{")); int16_t power_diff[ENERGY_MAX_PHASES] = { 0 }; - for (uint32_t phase = 0; phase < Energy.phase_count; phase++) { - uint16_t active_power = (uint16_t)(Energy.active_power[phase]); + for (uint32_t phase = 0; phase < Energy->phase_count; phase++) { + uint16_t active_power = (uint16_t)(Energy->active_power[phase]); -// AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: APower %d, HPower0 %d, HPower1 %d, HPower2 %d"), active_power, Energy.power_history[phase][0], Energy.power_history[phase][1], Energy.power_history[phase][2]); +// AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: APower %d, HPower0 %d, HPower1 %d, HPower2 %d"), active_power, Energy->power_history[phase][0], Energy->power_history[phase][1], Energy->power_history[phase][2]); if (Settings->energy_power_delta[phase]) { - power_diff[phase] = active_power - Energy.power_history[phase][0]; + power_diff[phase] = active_power - Energy->power_history[phase][0]; uint16_t delta = abs(power_diff[phase]); bool threshold_met = false; if (delta > 0) { if (Settings->energy_power_delta[phase] < 101) { // 1..100 = Percentage - uint16_t min_power = (Energy.power_history[phase][0] > active_power) ? active_power : Energy.power_history[phase][0]; + uint16_t min_power = (Energy->power_history[phase][0] > active_power) ? active_power : Energy->power_history[phase][0]; if (0 == min_power) { min_power++; } // Fix divide by 0 exception (#6741) delta = (delta * 100) / min_power; if (delta >= Settings->energy_power_delta[phase]) { @@ -474,56 +477,56 @@ void EnergyMarginCheck(void) { } } if (threshold_met) { - Energy.power_history[phase][1] = active_power; // We only want one report so reset history - Energy.power_history[phase][2] = active_power; + Energy->power_history[phase][1] = active_power; // We only want one report so reset history + Energy->power_history[phase][2] = active_power; jsonflg = true; } else { power_diff[phase] = 0; } } - Energy.power_history[phase][0] = Energy.power_history[phase][1]; // Shift in history every second allowing power changes to settle for up to three seconds - Energy.power_history[phase][1] = Energy.power_history[phase][2]; - Energy.power_history[phase][2] = active_power; + Energy->power_history[phase][0] = Energy->power_history[phase][1]; // Shift in history every second allowing power changes to settle for up to three seconds + Energy->power_history[phase][1] = Energy->power_history[phase][2]; + Energy->power_history[phase][2] = active_power; } if (jsonflg) { - float power_diff_f[Energy.phase_count]; - for (uint32_t phase = 0; phase < Energy.phase_count; phase++) { + float power_diff_f[Energy->phase_count]; + for (uint32_t phase = 0; phase < Energy->phase_count; phase++) { power_diff_f[phase] = power_diff[phase]; } char value_chr[TOPSZ]; ResponseAppend_P(PSTR("\"" D_CMND_POWERDELTA "\":%s"), EnergyFormat(value_chr, power_diff_f, 0)); } - uint16_t energy_power_u = (uint16_t)(Energy.active_power[0]); + uint16_t energy_power_u = (uint16_t)(Energy->active_power[0]); - if (Energy.power_on && (Settings->energy_min_power || Settings->energy_max_power || Settings->energy_min_voltage || Settings->energy_max_voltage || Settings->energy_min_current || Settings->energy_max_current)) { - uint16_t energy_voltage_u = (uint16_t)(Energy.voltage[0]); - uint16_t energy_current_u = (uint16_t)(Energy.current[0] * 1000); + if (Energy->power_on && (Settings->energy_min_power || Settings->energy_max_power || Settings->energy_min_voltage || Settings->energy_max_voltage || Settings->energy_min_current || Settings->energy_max_current)) { + uint16_t energy_voltage_u = (uint16_t)(Energy->voltage[0]); + uint16_t energy_current_u = (uint16_t)(Energy->current[0] * 1000); DEBUG_DRIVER_LOG(PSTR("NRG: W %d, U %d, I %d"), energy_power_u, energy_voltage_u, energy_current_u); bool flag; - if (EnergyMargin(false, Settings->energy_min_power, energy_power_u, flag, Energy.min_power_flag)) { + if (EnergyMargin(false, Settings->energy_min_power, energy_power_u, flag, Energy->min_power_flag)) { ResponseAppend_P(PSTR("%s\"" D_CMND_POWERLOW "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag)); jsonflg = true; } - if (EnergyMargin(true, Settings->energy_max_power, energy_power_u, flag, Energy.max_power_flag)) { + if (EnergyMargin(true, Settings->energy_max_power, energy_power_u, flag, Energy->max_power_flag)) { ResponseAppend_P(PSTR("%s\"" D_CMND_POWERHIGH "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag)); jsonflg = true; } - if (EnergyMargin(false, Settings->energy_min_voltage, energy_voltage_u, flag, Energy.min_voltage_flag)) { + if (EnergyMargin(false, Settings->energy_min_voltage, energy_voltage_u, flag, Energy->min_voltage_flag)) { ResponseAppend_P(PSTR("%s\"" D_CMND_VOLTAGELOW "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag)); jsonflg = true; } - if (EnergyMargin(true, Settings->energy_max_voltage, energy_voltage_u, flag, Energy.max_voltage_flag)) { + if (EnergyMargin(true, Settings->energy_max_voltage, energy_voltage_u, flag, Energy->max_voltage_flag)) { ResponseAppend_P(PSTR("%s\"" D_CMND_VOLTAGEHIGH "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag)); jsonflg = true; } - if (EnergyMargin(false, Settings->energy_min_current, energy_current_u, flag, Energy.min_current_flag)) { + if (EnergyMargin(false, Settings->energy_min_current, energy_current_u, flag, Energy->min_current_flag)) { ResponseAppend_P(PSTR("%s\"" D_CMND_CURRENTLOW "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag)); jsonflg = true; } - if (EnergyMargin(true, Settings->energy_max_current, energy_current_u, flag, Energy.max_current_flag)) { + if (EnergyMargin(true, Settings->energy_max_current, energy_current_u, flag, Energy->max_current_flag)) { ResponseAppend_P(PSTR("%s\"" D_CMND_CURRENTHIGH "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag)); jsonflg = true; } @@ -537,35 +540,35 @@ void EnergyMarginCheck(void) { #ifdef USE_ENERGY_POWER_LIMIT // Max Power if (Settings->energy_max_power_limit) { - if (Energy.active_power[0] > Settings->energy_max_power_limit) { - if (!Energy.mplh_counter) { - Energy.mplh_counter = Settings->energy_max_power_limit_hold; + if (Energy->active_power[0] > Settings->energy_max_power_limit) { + if (!Energy->mplh_counter) { + Energy->mplh_counter = Settings->energy_max_power_limit_hold; } else { - Energy.mplh_counter--; - if (!Energy.mplh_counter) { + Energy->mplh_counter--; + if (!Energy->mplh_counter) { ResponseTime_P(PSTR(",\"" D_JSON_MAXPOWERREACHED "\":%d}"), energy_power_u); MqttPublishPrefixTopicRulesProcess_P(STAT, S_RSLT_WARNING); EnergyMqttShow(); SetAllPower(POWER_ALL_OFF, SRC_MAXPOWER); - if (!Energy.mplr_counter) { - Energy.mplr_counter = Settings->param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count + if (!Energy->mplr_counter) { + Energy->mplr_counter = Settings->param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count } - Energy.mplw_counter = Settings->energy_max_power_limit_window; + Energy->mplw_counter = Settings->energy_max_power_limit_window; } } } else if (TasmotaGlobal.power && (energy_power_u <= Settings->energy_max_power_limit)) { - Energy.mplh_counter = 0; - Energy.mplr_counter = 0; - Energy.mplw_counter = 0; + Energy->mplh_counter = 0; + Energy->mplr_counter = 0; + Energy->mplw_counter = 0; } if (!TasmotaGlobal.power) { - if (Energy.mplw_counter) { - Energy.mplw_counter--; + if (Energy->mplw_counter) { + Energy->mplw_counter--; } else { - if (Energy.mplr_counter) { - Energy.mplr_counter--; - if (Energy.mplr_counter) { + if (Energy->mplr_counter) { + Energy->mplr_counter--; + if (Energy->mplr_counter) { ResponseTime_P(PSTR(",\"" D_JSON_POWERMONITOR "\":\"%s\"}"), GetStateText(1)); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR)); RestorePower(true, SRC_MAXPOWER); @@ -582,16 +585,16 @@ void EnergyMarginCheck(void) { // Max Energy if (Settings->energy_max_energy) { - uint16_t energy_daily_u = (uint16_t)(Energy.daily_sum * 1000); - if (!Energy.max_energy_state && (RtcTime.hour == Settings->energy_max_energy_start)) { - Energy.max_energy_state = 1; + uint16_t energy_daily_u = (uint16_t)(Energy->daily_sum * 1000); + if (!Energy->max_energy_state && (RtcTime.hour == Settings->energy_max_energy_start)) { + Energy->max_energy_state = 1; ResponseTime_P(PSTR(",\"" D_JSON_ENERGYMONITOR "\":\"%s\"}"), GetStateText(1)); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_ENERGYMONITOR)); RestorePower(true, SRC_MAXENERGY); } - else if ((1 == Energy.max_energy_state ) && (energy_daily_u >= Settings->energy_max_energy)) { - Energy.max_energy_state = 2; - ResponseTime_P(PSTR(",\"" D_JSON_MAXENERGYREACHED "\":%3_f}"), &Energy.daily_sum); + else if ((1 == Energy->max_energy_state ) && (energy_daily_u >= Settings->energy_max_energy)) { + Energy->max_energy_state = 2; + ResponseTime_P(PSTR(",\"" D_JSON_MAXENERGYREACHED "\":%3_f}"), &Energy->daily_sum); MqttPublishPrefixTopicRulesProcess_P(STAT, S_RSLT_WARNING); EnergyMqttShow(); SetAllPower(POWER_ALL_OFF, SRC_MAXENERGY); @@ -617,7 +620,7 @@ void EnergyMqttShow(void) void EnergyEverySecond(void) { // Overtemp check - if (Energy.use_overtemp && TasmotaGlobal.global_update) { + if (Energy->use_overtemp && TasmotaGlobal.global_update) { if (TasmotaGlobal.power && !isnan(TasmotaGlobal.temperature_celsius) && (TasmotaGlobal.temperature_celsius > (float)Settings->param[P_OVER_TEMP])) { // SetOption42 Device overtemp, turn off relays AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: Temperature %1_f"), &TasmotaGlobal.temperature_celsius); @@ -628,27 +631,27 @@ void EnergyEverySecond(void) // Invalid data reset if (TasmotaGlobal.uptime > ENERGY_WATCHDOG) { - 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) { + 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; - if (!isnan(Energy.apparent_power[i])) { Energy.apparent_power[i] = 0; } - 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[i])) { Energy.export_active[i] = 0; } + Energy->voltage[i] = 0; + Energy->current[i] = 0; + Energy->active_power[i] = 0; + if (!isnan(Energy->apparent_power[i])) { Energy->apparent_power[i] = 0; } + 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[i])) { Energy->export_active[i] = 0; } data_valid--; } } } if (!data_valid) { - //Energy.start_energy = 0; + //Energy->start_energy = 0; AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: Energy reset by invalid data")); XnrgCall(FUNC_ENERGY_RESET); @@ -670,22 +673,22 @@ void ResponseCmndEnergyTotalYesterdayToday(void) { char value3_chr[TOPSZ]; float energy_yesterday_ph[3]; - for (uint32_t i = 0; i < Energy.phase_count; i++) { + for (uint32_t i = 0; i < Energy->phase_count; i++) { energy_yesterday_ph[i] = (float)Settings->energy_kWhyesterday_ph[i] / 100000; - Energy.total[i] = ((float)(RtcSettings.energy_kWhtotal_ph[i]) / 1000) + ((float)(Energy.kWhtoday_offset[i] + Energy.kWhtoday[i]) / 100000); - if (Energy.local_energy_active_export) { - Energy.export_active[i] = (float)(RtcSettings.energy_kWhexport_ph[i]) / 1000; + Energy->total[i] = ((float)(RtcSettings.energy_kWhtotal_ph[i]) / 1000) + ((float)(Energy->kWhtoday_offset[i] + Energy->kWhtoday[i]) / 100000); + if (Energy->local_energy_active_export) { + Energy->export_active[i] = (float)(RtcSettings.energy_kWhexport_ph[i]) / 1000; } } Response_P(PSTR("{\"%s\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s"), XdrvMailbox.command, - EnergyFormat(value_chr, Energy.total, Settings->flag2.energy_resolution), + EnergyFormat(value_chr, Energy->total, Settings->flag2.energy_resolution), EnergyFormat(value2_chr, energy_yesterday_ph, Settings->flag2.energy_resolution), - EnergyFormat(value3_chr, Energy.daily, Settings->flag2.energy_resolution)); - if (Energy.local_energy_active_export) { + EnergyFormat(value3_chr, Energy->daily, Settings->flag2.energy_resolution)); + if (Energy->local_energy_active_export) { ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT_ACTIVE "\":%s"), - EnergyFormat(value_chr, Energy.export_active, Settings->flag2.energy_resolution)); + EnergyFormat(value_chr, Energy->export_active, Settings->flag2.energy_resolution)); } ResponseJsonEndEnd(); } @@ -694,7 +697,7 @@ void CmndEnergyTotal(void) { uint32_t values[2] = { 0 }; uint32_t params = ParseParameters(2, values); - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy.phase_count) && (params > 0)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy->phase_count) && (params > 0)) { uint32_t phase = XdrvMailbox.index -1; // Reset Energy Total RtcSettings.energy_kWhtotal_ph[phase] = values[0]; @@ -702,9 +705,9 @@ void CmndEnergyTotal(void) { if (params > 1) { Settings->energy_kWhtotal_time = values[1]; } else { - Settings->energy_kWhtotal_time = (!Energy.kWhtoday_offset[phase]) ? LocalTime() : Midnight(); + Settings->energy_kWhtotal_time = (!Energy->kWhtoday_offset[phase]) ? LocalTime() : Midnight(); } - RtcSettings.energy_usage.last_usage_kWhtotal = (uint32_t)(Energy.total[phase] * 1000); + RtcSettings.energy_usage.last_usage_kWhtotal = (uint32_t)(Energy->total[phase] * 1000); } ResponseCmndEnergyTotalYesterdayToday(); } @@ -713,7 +716,7 @@ void CmndEnergyYesterday(void) { uint32_t values[2] = { 0 }; uint32_t params = ParseParameters(2, values); - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy.phase_count) && (params > 0)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy->phase_count) && (params > 0)) { uint32_t phase = XdrvMailbox.index -1; // Reset Energy Yesterday Settings->energy_kWhyesterday_ph[phase] = values[0] * 100; @@ -728,21 +731,21 @@ void CmndEnergyToday(void) { uint32_t values[2] = { 0 }; uint32_t params = ParseParameters(2, values); - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy.phase_count) && (params > 0)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy->phase_count) && (params > 0)) { uint32_t phase = XdrvMailbox.index -1; // Reset Energy Today - Energy.kWhtoday_offset[phase] = values[0] * 100; - Energy.kWhtoday[phase] = 0; - Energy.kWhtoday_delta[phase] = 0; - Energy.start_energy[phase] = 0; - Energy.period[phase] = Energy.kWhtoday_offset[phase]; - Settings->energy_kWhtoday_ph[phase] = Energy.kWhtoday_offset[phase]; - RtcSettings.energy_kWhtoday_ph[phase] = Energy.kWhtoday_offset[phase]; - Energy.daily[phase] = (float)Energy.kWhtoday_offset[phase] / 100000; + Energy->kWhtoday_offset[phase] = values[0] * 100; + Energy->kWhtoday[phase] = 0; + Energy->kWhtoday_delta[phase] = 0; + Energy->start_energy[phase] = 0; + Energy->period[phase] = Energy->kWhtoday_offset[phase]; + Settings->energy_kWhtoday_ph[phase] = Energy->kWhtoday_offset[phase]; + RtcSettings.energy_kWhtoday_ph[phase] = Energy->kWhtoday_offset[phase]; + Energy->daily[phase] = (float)Energy->kWhtoday_offset[phase] / 100000; if (params > 1) { Settings->energy_kWhtotal_time = values[1]; } - else if (!RtcSettings.energy_kWhtotal_ph[phase] && !Energy.kWhtoday_offset[phase]) { + else if (!RtcSettings.energy_kWhtotal_ph[phase] && !Energy->kWhtoday_offset[phase]) { Settings->energy_kWhtotal_time = LocalTime(); } } @@ -750,13 +753,13 @@ void CmndEnergyToday(void) { } void CmndEnergyExportActive(void) { - if (Energy.local_energy_active_export) { + if (Energy->local_energy_active_export) { // EnergyExportActive1 24 // EnergyExportActive1 24,1650111291 uint32_t values[2] = { 0 }; uint32_t params = ParseParameters(2, values); - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy.phase_count) && (params > 0)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy->phase_count) && (params > 0)) { uint32_t phase = XdrvMailbox.index -1; // Reset Energy Export Active RtcSettings.energy_kWhexport_ph[phase] = values[0]; @@ -858,7 +861,7 @@ void CmndTariff(void) { } uint32_t EnergyGetCalibration(uint32_t chan, uint32_t cal_type) { - uint32_t channel = ((1 == chan) && (2 == Energy.phase_count)) ? 1 : 0; + uint32_t channel = ((1 == chan) && (2 == Energy->phase_count)) ? 1 : 0; if (channel) { switch (cal_type) { case ENERGY_POWER_CALIBRATION: return Settings->energy_power_calibration2; @@ -877,7 +880,7 @@ uint32_t EnergyGetCalibration(uint32_t chan, uint32_t cal_type) { void EnergyCommandCalSetResponse(uint32_t cal_type) { if (XdrvMailbox.payload > 99) { - uint32_t channel = ((2 == XdrvMailbox.index) && (2 == Energy.phase_count)) ? 1 : 0; + uint32_t channel = ((2 == XdrvMailbox.index) && (2 == Energy->phase_count)) ? 1 : 0; if (channel) { switch (cal_type) { case ENERGY_POWER_CALIBRATION: Settings->energy_power_calibration2 = XdrvMailbox.payload; break; @@ -897,7 +900,7 @@ void EnergyCommandCalSetResponse(uint32_t cal_type) { if (ENERGY_FREQUENCY_CALIBRATION == cal_type) { ResponseAppend_P(PSTR("%d}"), Settings->energy_frequency_calibration); } else { - if (2 == Energy.phase_count) { + if (2 == Energy->phase_count) { ResponseAppend_P(PSTR("[%d,%d]}"), EnergyGetCalibration(0, cal_type), EnergyGetCalibration(1, cal_type)); } else { ResponseAppend_P(PSTR("%d}"), EnergyGetCalibration(0, cal_type)); @@ -916,64 +919,64 @@ void EnergyCommandSetCalResponse(uint32_t cal_type) { } void CmndPowerCal(void) { - Energy.command_code = CMND_POWERCAL; + Energy->command_code = CMND_POWERCAL; if (XnrgCall(FUNC_COMMAND)) { // microseconds EnergyCommandCalResponse(ENERGY_POWER_CALIBRATION); } } void CmndVoltageCal(void) { - Energy.command_code = CMND_VOLTAGECAL; + Energy->command_code = CMND_VOLTAGECAL; if (XnrgCall(FUNC_COMMAND)) { // microseconds EnergyCommandCalResponse(ENERGY_VOLTAGE_CALIBRATION); } } void CmndCurrentCal(void) { - Energy.command_code = CMND_CURRENTCAL; + Energy->command_code = CMND_CURRENTCAL; if (XnrgCall(FUNC_COMMAND)) { // microseconds EnergyCommandCalResponse(ENERGY_CURRENT_CALIBRATION); } } void CmndFrequencyCal(void) { - Energy.command_code = CMND_FREQUENCYCAL; + Energy->command_code = CMND_FREQUENCYCAL; if (XnrgCall(FUNC_COMMAND)) { // microseconds EnergyCommandCalResponse(ENERGY_FREQUENCY_CALIBRATION); } } void CmndPowerSet(void) { - Energy.command_code = CMND_POWERSET; + Energy->command_code = CMND_POWERSET; if (XnrgCall(FUNC_COMMAND)) { // Watt EnergyCommandSetCalResponse(ENERGY_POWER_CALIBRATION); } } void CmndVoltageSet(void) { - Energy.command_code = CMND_VOLTAGESET; + Energy->command_code = CMND_VOLTAGESET; if (XnrgCall(FUNC_COMMAND)) { // Volt EnergyCommandSetCalResponse(ENERGY_VOLTAGE_CALIBRATION); } } void CmndCurrentSet(void) { - Energy.command_code = CMND_CURRENTSET; + Energy->command_code = CMND_CURRENTSET; if (XnrgCall(FUNC_COMMAND)) { // milliAmpere EnergyCommandSetCalResponse(ENERGY_CURRENT_CALIBRATION); } } void CmndFrequencySet(void) { - Energy.command_code = CMND_FREQUENCYSET; + Energy->command_code = CMND_FREQUENCYSET; if (XnrgCall(FUNC_COMMAND)) { // Hz EnergyCommandSetCalResponse(ENERGY_FREQUENCY_CALIBRATION); } } void CmndModuleAddress(void) { - if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 4) && (1 == Energy.phase_count)) { - Energy.command_code = CMND_MODULEADDRESS; + if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 4) && (1 == Energy->phase_count)) { + Energy->command_code = CMND_MODULEADDRESS; if (XnrgCall(FUNC_COMMAND)) { // Module address ResponseCmndDone(); } @@ -981,7 +984,7 @@ void CmndModuleAddress(void) { } void CmndEnergyConfig(void) { - Energy.command_code = CMND_ENERGYCONFIG; + Energy->command_code = CMND_ENERGYCONFIG; ResponseClear(); if (XnrgCall(FUNC_COMMAND)) { if (!ResponseLength()) { @@ -1088,7 +1091,7 @@ void CmndSafePowerWindow(void) { void CmndMaxEnergy(void) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 6000)) { Settings->energy_max_energy = XdrvMailbox.payload; - Energy.max_energy_state = 3; + Energy->max_energy_state = 3; } ResponseCmndNumber(Settings->energy_max_energy); } @@ -1103,21 +1106,23 @@ void CmndMaxEnergyStart(void) { #endif // USE_ENERGY_MARGIN_DETECTION void EnergyDrvInit(void) { - memset(&Energy, 0, sizeof(Energy)); // Reset all to 0 and false; -// Energy.voltage_common = false; -// Energy.frequency_common = false; -// Energy.use_overtemp = false; + Energy = (tEnergy*)calloc(sizeof(tEnergy), 1); // Need calloc to reset registers to 0/false + if (!Energy) { return; } + +// Energy->voltage_common = false; +// Energy->frequency_common = false; +// Energy->use_overtemp = false; for (uint32_t phase = 0; phase < ENERGY_MAX_PHASES; phase++) { - Energy.apparent_power[phase] = NAN; - Energy.reactive_power[phase] = NAN; - Energy.power_factor[phase] = NAN; - Energy.frequency[phase] = NAN; - Energy.export_active[phase] = NAN; + Energy->apparent_power[phase] = NAN; + Energy->reactive_power[phase] = NAN; + Energy->power_factor[phase] = NAN; + Energy->frequency[phase] = NAN; + Energy->export_active[phase] = NAN; } - Energy.phase_count = 1; // Number of phases active - Energy.voltage_available = true; // Enable if voltage is measured - Energy.current_available = true; // Enable if current is measured - Energy.power_on = true; + Energy->phase_count = 1; // Number of phases active + Energy->voltage_available = true; // Enable if voltage is measured + Energy->current_available = true; // Enable if current is measured + Energy->power_on = true; TasmotaGlobal.energy_driver = ENERGY_NONE; XnrgCall(FUNC_PRE_INIT); // Find first energy driver @@ -1139,18 +1144,18 @@ void EnergySnsInit(void) ); */ for (uint32_t i = 0; i < 3; i++) { -// Energy.kWhtoday_offset[i] = 0; // Reset by EnergyDrvInit() +// 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]; + Energy->kWhtoday_offset[i] = RtcSettings.energy_kWhtoday_ph[i]; RtcSettings.energy_kWhtoday_ph[i] = 0; - Energy.kWhtoday_offset_init = true; + 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; // Was set to NAN by EnergyDrvInit() +// 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; // Was set to NAN by EnergyDrvInit() } } EnergyUpdateToday(); @@ -1174,43 +1179,43 @@ const char HTTP_ENERGY_SNS3[] PROGMEM = #endif // USE_WEBSERVER void EnergyShow(bool json) { - if (Energy.voltage_common) { - for (uint32_t i = 0; i < Energy.phase_count; i++) { - Energy.voltage[i] = Energy.voltage[0]; + if (Energy->voltage_common) { + for (uint32_t i = 0; i < Energy->phase_count; i++) { + Energy->voltage[i] = Energy->voltage[0]; } } - float apparent_power[Energy.phase_count]; - float reactive_power[Energy.phase_count]; - float power_factor[Energy.phase_count]; - if (!Energy.type_dc) { - if (Energy.current_available && Energy.voltage_available) { - for (uint32_t i = 0; i < Energy.phase_count; i++) { - apparent_power[i] = Energy.apparent_power[i]; + float apparent_power[Energy->phase_count]; + float reactive_power[Energy->phase_count]; + float power_factor[Energy->phase_count]; + if (!Energy->type_dc) { + if (Energy->current_available && Energy->voltage_available) { + for (uint32_t i = 0; i < Energy->phase_count; i++) { + apparent_power[i] = Energy->apparent_power[i]; if (isnan(apparent_power[i])) { - apparent_power[i] = Energy.voltage[i] * Energy.current[i]; + apparent_power[i] = Energy->voltage[i] * Energy->current[i]; } - if (apparent_power[i] < Energy.active_power[i]) { // Should be impossible - Energy.active_power[i] = apparent_power[i]; + if (apparent_power[i] < Energy->active_power[i]) { // Should be impossible + Energy->active_power[i] = apparent_power[i]; } - power_factor[i] = Energy.power_factor[i]; + power_factor[i] = Energy->power_factor[i]; if (isnan(power_factor[i])) { - power_factor[i] = (Energy.active_power[i] && apparent_power[i]) ? Energy.active_power[i] / apparent_power[i] : 0; + power_factor[i] = (Energy->active_power[i] && apparent_power[i]) ? Energy->active_power[i] / apparent_power[i] : 0; if (power_factor[i] > 1) { power_factor[i] = 1; } } - reactive_power[i] = Energy.reactive_power[i]; + reactive_power[i] = Energy->reactive_power[i]; if (isnan(reactive_power[i])) { reactive_power[i] = 0; - uint32_t difference = ((uint32_t)(apparent_power[i] * 100) - (uint32_t)(Energy.active_power[i] * 100)) / 10; - if ((Energy.current[i] > 0.005f) && ((difference > 15) || (difference > (uint32_t)(apparent_power[i] * 100 / 1000)))) { + uint32_t difference = ((uint32_t)(apparent_power[i] * 100) - (uint32_t)(Energy->active_power[i] * 100)) / 10; + if ((Energy->current[i] > 0.005f) && ((difference > 15) || (difference > (uint32_t)(apparent_power[i] * 100 / 1000)))) { // calculating reactive power only if current is greater than 0.005A and // difference between active and apparent power is greater than 1.5W or 1% - //reactive_power[i] = (float)(RoundSqrtInt((uint64_t)(apparent_power[i] * apparent_power[i] * 100) - (uint64_t)(Energy.active_power[i] * Energy.active_power[i] * 100))) / 10; - float power_diff = apparent_power[i] * apparent_power[i] - Energy.active_power[i] * Energy.active_power[i]; + //reactive_power[i] = (float)(RoundSqrtInt((uint64_t)(apparent_power[i] * apparent_power[i] * 100) - (uint64_t)(Energy->active_power[i] * Energy->active_power[i] * 100))) / 10; + float power_diff = apparent_power[i] * apparent_power[i] - Energy->active_power[i] * Energy->active_power[i]; if (power_diff < 10737418) // 2^30 / 100 (RoundSqrtInt is limited to 2^30-1) reactive_power[i] = (float)(RoundSqrtInt((uint32_t)(power_diff * 100.0f))) / 10.0f; else @@ -1223,11 +1228,11 @@ void EnergyShow(bool json) { } float active_power_sum = 0.0f; - float energy_yesterday_ph[Energy.phase_count]; - for (uint32_t i = 0; i < Energy.phase_count; i++) { + float energy_yesterday_ph[Energy->phase_count]; + for (uint32_t i = 0; i < Energy->phase_count; i++) { energy_yesterday_ph[i] = (float)Settings->energy_kWhyesterday_ph[i] / 100000; - active_power_sum += Energy.active_power[i]; + active_power_sum += Energy->active_power[i]; } bool energy_tariff = false; @@ -1250,7 +1255,7 @@ void EnergyShow(bool json) { ResponseAppend_P(PSTR(",\"" D_RSLT_ENERGY "\":{\"" D_JSON_TOTAL_START_TIME "\":\"%s\",\"" D_JSON_TOTAL "\":%s"), GetDateAndTime(DT_ENERGY).c_str(), - EnergyFormat(value_chr, Energy.total, Settings->flag2.energy_resolution, 2)); + EnergyFormat(value_chr, Energy->total, Settings->flag2.energy_resolution, 2)); if (energy_tariff) { ResponseAppend_P(PSTR(",\"" D_JSON_TOTAL D_CMND_TARIFF "\":%s"), @@ -1259,13 +1264,13 @@ void EnergyShow(bool json) { ResponseAppend_P(PSTR(",\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s"), EnergyFormat(value_chr, energy_yesterday_ph, Settings->flag2.energy_resolution, 2), - EnergyFormat(value2_chr, Energy.daily, Settings->flag2.energy_resolution, 2)); + EnergyFormat(value2_chr, Energy->daily, Settings->flag2.energy_resolution, 2)); /* #if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP) - if (!isnan(Energy.import_active[0])) { + if (!isnan(Energy->import_active[0])) { ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT_ACTIVE "\":%s"), - EnergyFormat(value_chr, Energy.import_active, Settings->flag2.energy_resolution)); + EnergyFormat(value_chr, Energy->import_active, Settings->flag2.energy_resolution)); if (energy_tariff) { ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT D_CMND_TARIFF "\":%s"), EnergyFormat(value_chr, energy_return, Settings->flag2.energy_resolution, 6)); @@ -1274,12 +1279,12 @@ void EnergyShow(bool json) { #endif // SDM630_IMPORT || SDM72_IMPEXP */ - if (!isnan(Energy.export_active[0])) { - uint32_t single = (!isnan(Energy.export_active[1]) && !isnan(Energy.export_active[2])) ? 0 : 1; + if (!isnan(Energy->export_active[0])) { + uint32_t single = (!isnan(Energy->export_active[1]) && !isnan(Energy->export_active[2])) ? 0 : 1; ResponseAppend_P(PSTR(",\"" D_JSON_TODAY_SUM_IMPORT "\":%s,\"" D_JSON_TODAY_SUM_EXPORT "\":%s,\"" D_JSON_EXPORT_ACTIVE "\":%s"), - EnergyFormat(value_chr, &Energy.daily_sum_import_balanced, Settings->flag2.energy_resolution, 1), - EnergyFormat(value2_chr, &Energy.daily_sum_export_balanced, Settings->flag2.energy_resolution, 1), - EnergyFormat(value3_chr, Energy.export_active, Settings->flag2.energy_resolution, single)); + EnergyFormat(value_chr, &Energy->daily_sum_import_balanced, Settings->flag2.energy_resolution, 1), + EnergyFormat(value2_chr, &Energy->daily_sum_export_balanced, Settings->flag2.energy_resolution, 1), + EnergyFormat(value3_chr, Energy->export_active, Settings->flag2.energy_resolution, single)); if (energy_tariff) { ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT D_CMND_TARIFF "\":%s"), EnergyFormat(value_chr, energy_return, Settings->flag2.energy_resolution, 6)); @@ -1287,36 +1292,36 @@ void EnergyShow(bool json) { } if (show_energy_period) { - float energy_period[Energy.phase_count]; - for (uint32_t i = 0; i < Energy.phase_count; i++) { - energy_period[i] = (float)(RtcSettings.energy_kWhtoday_ph[i] - Energy.period[i]) / 100; - Energy.period[i] = RtcSettings.energy_kWhtoday_ph[i]; + float energy_period[Energy->phase_count]; + for (uint32_t i = 0; i < Energy->phase_count; i++) { + energy_period[i] = (float)(RtcSettings.energy_kWhtoday_ph[i] - Energy->period[i]) / 100; + Energy->period[i] = RtcSettings.energy_kWhtoday_ph[i]; } ResponseAppend_P(PSTR(",\"" D_JSON_PERIOD "\":%s"), EnergyFormat(value_chr, energy_period, Settings->flag2.wattage_resolution)); } ResponseAppend_P(PSTR(",\"" D_JSON_POWERUSAGE "\":%s"), - EnergyFormat(value_chr, Energy.active_power, Settings->flag2.wattage_resolution)); - if (!Energy.type_dc) { - if (Energy.current_available && Energy.voltage_available) { + EnergyFormat(value_chr, Energy->active_power, Settings->flag2.wattage_resolution)); + if (!Energy->type_dc) { + if (Energy->current_available && Energy->voltage_available) { ResponseAppend_P(PSTR(",\"" D_JSON_APPARENT_POWERUSAGE "\":%s,\"" D_JSON_REACTIVE_POWERUSAGE "\":%s,\"" D_JSON_POWERFACTOR "\":%s"), EnergyFormat(value_chr, apparent_power, Settings->flag2.wattage_resolution), EnergyFormat(value2_chr, reactive_power, Settings->flag2.wattage_resolution), EnergyFormat(value3_chr, power_factor, 2)); } - if (!isnan(Energy.frequency[0])) { + if (!isnan(Energy->frequency[0])) { ResponseAppend_P(PSTR(",\"" D_JSON_FREQUENCY "\":%s"), - EnergyFormat(value_chr, Energy.frequency, Settings->flag2.frequency_resolution, Energy.frequency_common)); + EnergyFormat(value_chr, Energy->frequency, Settings->flag2.frequency_resolution, Energy->frequency_common)); } } - if (Energy.voltage_available) { + if (Energy->voltage_available) { ResponseAppend_P(PSTR(",\"" D_JSON_VOLTAGE "\":%s"), - EnergyFormat(value_chr, Energy.voltage, Settings->flag2.voltage_resolution, Energy.voltage_common)); + EnergyFormat(value_chr, Energy->voltage, Settings->flag2.voltage_resolution, Energy->voltage_common)); } - if (Energy.current_available) { + if (Energy->current_available) { ResponseAppend_P(PSTR(",\"" D_JSON_CURRENT "\":%s"), - EnergyFormat(value_chr, Energy.current, Settings->flag2.current_resolution)); + EnergyFormat(value_chr, Energy->current, Settings->flag2.current_resolution)); } XnrgCall(FUNC_JSON_APPEND); ResponseJsonEnd(); @@ -1324,15 +1329,15 @@ void EnergyShow(bool json) { #ifdef USE_DOMOTICZ if (show_energy_period) { // Only send if telemetry char temp_chr[FLOATSZ]; - if (Energy.voltage_available) { - dtostrfd(Energy.voltage[0], Settings->flag2.voltage_resolution, temp_chr); + if (Energy->voltage_available) { + dtostrfd(Energy->voltage[0], Settings->flag2.voltage_resolution, temp_chr); DomoticzSensor(DZ_VOLTAGE, temp_chr); // Voltage } - if (Energy.current_available) { - dtostrfd(Energy.current[0], Settings->flag2.current_resolution, temp_chr); + if (Energy->current_available) { + dtostrfd(Energy->current[0], Settings->flag2.current_resolution, temp_chr); DomoticzSensor(DZ_CURRENT, temp_chr); // Current } - dtostrfd(Energy.total_sum * 1000, 1, temp_chr); + dtostrfd(Energy->total_sum * 1000, 1, temp_chr); DomoticzSensorPowerEnergy((int)active_power_sum, temp_chr); // PowerUsage, EnergyToday char energy_usage_chr[2][FLOATSZ]; @@ -1347,19 +1352,19 @@ void EnergyShow(bool json) { #endif // USE_DOMOTICZ #ifdef USE_KNX if (show_energy_period) { - if (Energy.voltage_available) { - KnxSensor(KNX_ENERGY_VOLTAGE, Energy.voltage[0]); + if (Energy->voltage_available) { + KnxSensor(KNX_ENERGY_VOLTAGE, Energy->voltage[0]); } - if (Energy.current_available) { - KnxSensor(KNX_ENERGY_CURRENT, Energy.current[0]); + if (Energy->current_available) { + KnxSensor(KNX_ENERGY_CURRENT, Energy->current[0]); } KnxSensor(KNX_ENERGY_POWER, active_power_sum); - if (!Energy.type_dc) { + if (!Energy->type_dc) { KnxSensor(KNX_ENERGY_POWERFACTOR, power_factor[0]); } - KnxSensor(KNX_ENERGY_DAILY, Energy.daily_sum); - KnxSensor(KNX_ENERGY_TOTAL, Energy.total_sum); - KnxSensor(KNX_ENERGY_YESTERDAY, Energy.yesterday_sum); + KnxSensor(KNX_ENERGY_DAILY, Energy->daily_sum); + KnxSensor(KNX_ENERGY_TOTAL, Energy->total_sum); + KnxSensor(KNX_ENERGY_YESTERDAY, Energy->yesterday_sum); } #endif // USE_KNX #ifdef USE_WEBSERVER @@ -1371,38 +1376,38 @@ void EnergyShow(bool json) { // {s}Head1Head2Head3{e} // {s}Head1Head2Head3Head4{e} WSContentSend_P(PSTR("
{t}{s}")); // First column is empty ({t} = , {s} = "), (no_label)?"":"L", (no_label)?"":itoa(i +1, value_chr, 10)); } WSContentSend_P(PSTR(") #endif // USE_ENERGY_COLUMN_GUI - if (Energy.voltage_available) { - WSContentSend_PD(HTTP_SNS_VOLTAGE, WebEnergyFormat(value_chr, Energy.voltage, Settings->flag2.voltage_resolution, Energy.voltage_common)); + if (Energy->voltage_available) { + WSContentSend_PD(HTTP_SNS_VOLTAGE, WebEnergyFormat(value_chr, Energy->voltage, Settings->flag2.voltage_resolution, Energy->voltage_common)); } - if (!Energy.type_dc) { - if (!isnan(Energy.frequency[0])) { + if (!Energy->type_dc) { + if (!isnan(Energy->frequency[0])) { WSContentSend_PD(PSTR("{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}"), - WebEnergyFormat(value_chr, Energy.frequency, Settings->flag2.frequency_resolution, Energy.frequency_common)); + WebEnergyFormat(value_chr, Energy->frequency, Settings->flag2.frequency_resolution, Energy->frequency_common)); } } - if (Energy.current_available) { - WSContentSend_PD(HTTP_SNS_CURRENT, WebEnergyFormat(value_chr, Energy.current, Settings->flag2.current_resolution)); + if (Energy->current_available) { + WSContentSend_PD(HTTP_SNS_CURRENT, WebEnergyFormat(value_chr, Energy->current, Settings->flag2.current_resolution)); } - WSContentSend_PD(HTTP_SNS_POWER, WebEnergyFormat(value_chr, Energy.active_power, Settings->flag2.wattage_resolution)); - if (!Energy.type_dc) { - if (Energy.current_available && Energy.voltage_available) { + WSContentSend_PD(HTTP_SNS_POWER, WebEnergyFormat(value_chr, Energy->active_power, Settings->flag2.wattage_resolution)); + if (!Energy->type_dc) { + if (Energy->current_available && Energy->voltage_available) { WSContentSend_PD(HTTP_ENERGY_SNS1, WebEnergyFormat(value_chr, apparent_power, Settings->flag2.wattage_resolution), WebEnergyFormat(value2_chr, reactive_power, Settings->flag2.wattage_resolution), WebEnergyFormat(value3_chr, power_factor, 2)); } } - WSContentSend_PD(HTTP_ENERGY_SNS2, WebEnergyFormat(value_chr, Energy.daily, Settings->flag2.energy_resolution, 2), + WSContentSend_PD(HTTP_ENERGY_SNS2, WebEnergyFormat(value_chr, Energy->daily, Settings->flag2.energy_resolution, 2), WebEnergyFormat(value2_chr, energy_yesterday_ph, Settings->flag2.energy_resolution, 2), - WebEnergyFormat(value3_chr, Energy.total, Settings->flag2.energy_resolution, 2)); - if (!isnan(Energy.export_active[0])) { - uint32_t single = (!isnan(Energy.export_active[1]) && !isnan(Energy.export_active[2])) ? 2 : 1; - WSContentSend_PD(HTTP_ENERGY_SNS3, WebEnergyFormat(value_chr, Energy.export_active, Settings->flag2.energy_resolution, single)); + WebEnergyFormat(value3_chr, Energy->total, Settings->flag2.energy_resolution, 2)); + if (!isnan(Energy->export_active[0])) { + uint32_t single = (!isnan(Energy->export_active[1]) && !isnan(Energy->export_active[2])) ? 2 : 1; + WSContentSend_PD(HTTP_ENERGY_SNS3, WebEnergyFormat(value_chr, Energy->export_active, Settings->flag2.energy_resolution, single)); } #ifdef USE_ENERGY_COLUMN_GUI XnrgCall(FUNC_WEB_COL_SENSOR); @@ -1443,7 +1448,7 @@ bool Xdrv03(uint32_t function) break; #ifdef USE_ENERGY_MARGIN_DETECTION case FUNC_SET_POWER: - Energy.power_steady_counter = 2; + Energy->power_steady_counter = 2; break; #endif // USE_ENERGY_MARGIN_DETECTION case FUNC_COMMAND: @@ -1489,3 +1494,4 @@ bool Xsns03(uint32_t function) } #endif // USE_ENERGY_SENSOR +//#endif // ESP8266 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino index ecfc0d418..5d02340d5 100755 --- a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino @@ -2773,43 +2773,43 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); while (*lp==' ') lp++; switch ((uint32_t)fvar) { case 0: - fvar = Energy.total_sum; + fvar = Energy->total_sum; break; case 1: - fvar = Energy.voltage[0]; + fvar = Energy->voltage[0]; break; case 2: - fvar = Energy.voltage[1]; + fvar = Energy->voltage[1]; break; case 3: - fvar = Energy.voltage[2]; + fvar = Energy->voltage[2]; break; case 4: - fvar = Energy.current[0]; + fvar = Energy->current[0]; break; case 5: - fvar = Energy.current[1]; + fvar = Energy->current[1]; break; case 6: - fvar = Energy.current[2]; + fvar = Energy->current[2]; break; case 7: - fvar = Energy.active_power[0]; + fvar = Energy->active_power[0]; break; case 8: - fvar = Energy.active_power[1]; + fvar = Energy->active_power[1]; break; case 9: - fvar = Energy.active_power[2]; + fvar = Energy->active_power[2]; break; case 10: - fvar = Energy.start_energy[0]; + fvar = Energy->start_energy[0]; break; case 11: - fvar = Energy.daily_sum; + fvar = Energy->daily_sum; break; case 12: - fvar = Energy.yesterday_sum; + fvar = Energy->yesterday_sum; break; default: diff --git a/tasmota/tasmota_xdrv_driver/xdrv_11_knx.ino b/tasmota/tasmota_xdrv_driver/xdrv_11_knx.ino index 04d1225d3..ef08718c1 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_11_knx.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_11_knx.ino @@ -649,58 +649,58 @@ void KNX_CB_Action(message_t const &msg, void *arg) #if defined(USE_ENERGY_SENSOR) else if (chan->type == KNX_ENERGY_VOLTAGE) // Reply KNX_ENERGY_VOLTAGE { - knx.answer_4byte_float(msg.received_on, Energy.voltage[0]); + knx.answer_4byte_float(msg.received_on, Energy->voltage[0]); if (Settings->flag.knx_enable_enhancement) { - knx.answer_4byte_float(msg.received_on, Energy.voltage[0]); - knx.answer_4byte_float(msg.received_on, Energy.voltage[0]); + knx.answer_4byte_float(msg.received_on, Energy->voltage[0]); + knx.answer_4byte_float(msg.received_on, Energy->voltage[0]); } } else if (chan->type == KNX_ENERGY_CURRENT) // Reply KNX_ENERGY_CURRENT { - knx.answer_4byte_float(msg.received_on, Energy.current[0]); + knx.answer_4byte_float(msg.received_on, Energy->current[0]); if (Settings->flag.knx_enable_enhancement) { - knx.answer_4byte_float(msg.received_on, Energy.current[0]); - knx.answer_4byte_float(msg.received_on, Energy.current[0]); + knx.answer_4byte_float(msg.received_on, Energy->current[0]); + knx.answer_4byte_float(msg.received_on, Energy->current[0]); } } else if (chan->type == KNX_ENERGY_POWER) // Reply KNX_ENERGY_POWER { - knx.answer_4byte_float(msg.received_on, Energy.active_power[0]); + knx.answer_4byte_float(msg.received_on, Energy->active_power[0]); if (Settings->flag.knx_enable_enhancement) { - knx.answer_4byte_float(msg.received_on, Energy.active_power[0]); - knx.answer_4byte_float(msg.received_on, Energy.active_power[0]); + knx.answer_4byte_float(msg.received_on, Energy->active_power[0]); + knx.answer_4byte_float(msg.received_on, Energy->active_power[0]); } } else if (chan->type == KNX_ENERGY_POWERFACTOR) // Reply KNX_ENERGY_POWERFACTOR { - knx.answer_4byte_float(msg.received_on, Energy.power_factor[0]); + knx.answer_4byte_float(msg.received_on, Energy->power_factor[0]); if (Settings->flag.knx_enable_enhancement) { - knx.answer_4byte_float(msg.received_on, Energy.power_factor[0]); - knx.answer_4byte_float(msg.received_on, Energy.power_factor[0]); + knx.answer_4byte_float(msg.received_on, Energy->power_factor[0]); + knx.answer_4byte_float(msg.received_on, Energy->power_factor[0]); } } else if (chan->type == KNX_ENERGY_YESTERDAY) // Reply KNX_ENERGY_YESTERDAY { - knx.answer_4byte_float(msg.received_on, Energy.yesterday_sum); + knx.answer_4byte_float(msg.received_on, Energy->yesterday_sum); if (Settings->flag.knx_enable_enhancement) { - knx.answer_4byte_float(msg.received_on, Energy.yesterday_sum); - knx.answer_4byte_float(msg.received_on, Energy.yesterday_sum); + knx.answer_4byte_float(msg.received_on, Energy->yesterday_sum); + knx.answer_4byte_float(msg.received_on, Energy->yesterday_sum); } } else if (chan->type == KNX_ENERGY_DAILY) // Reply KNX_ENERGY_DAILY { - knx.answer_4byte_float(msg.received_on, Energy.daily_sum); + knx.answer_4byte_float(msg.received_on, Energy->daily_sum); if (Settings->flag.knx_enable_enhancement) { - knx.answer_4byte_float(msg.received_on, Energy.daily_sum); - knx.answer_4byte_float(msg.received_on, Energy.daily_sum); + knx.answer_4byte_float(msg.received_on, Energy->daily_sum); + knx.answer_4byte_float(msg.received_on, Energy->daily_sum); } } else if (chan->type == KNX_ENERGY_TOTAL) // Reply KNX_ENERGY_TOTAL { - knx.answer_4byte_float(msg.received_on, Energy.total_sum); + knx.answer_4byte_float(msg.received_on, Energy->total_sum); if (Settings->flag.knx_enable_enhancement) { - knx.answer_4byte_float(msg.received_on, Energy.total_sum); - knx.answer_4byte_float(msg.received_on, Energy.total_sum); + knx.answer_4byte_float(msg.received_on, Energy->total_sum); + knx.answer_4byte_float(msg.received_on, Energy->total_sum); } } #endif diff --git a/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino b/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino index 3f90044b9..54633d8a5 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v1.ino @@ -812,16 +812,16 @@ void TuyaProcessStatePacket(void) { uint16_t tmpVol = Tuya.buffer[dpidStart + 4] << 8 | Tuya.buffer[dpidStart + 5]; uint16_t tmpCur = Tuya.buffer[dpidStart + 7] << 8 | Tuya.buffer[dpidStart + 8]; uint16_t tmpPow = Tuya.buffer[dpidStart + 10] << 8 | Tuya.buffer[dpidStart + 11]; - Energy.voltage[0] = (float)tmpVol / 10; - Energy.current[0] = (float)tmpCur / 1000; - Energy.active_power[0] = (float)tmpPow; + Energy->voltage[0] = (float)tmpVol / 10; + Energy->current[0] = (float)tmpCur / 1000; + Energy->active_power[0] = (float)tmpPow; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Rx ID=%d Voltage=%d"), Tuya.buffer[dpidStart], tmpVol); AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Rx ID=%d Current=%d"), Tuya.buffer[dpidStart], tmpCur); AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Rx ID=%d Active_Power=%d"), Tuya.buffer[dpidStart], tmpPow); if (RtcTime.valid) { - if (Tuya.lastPowerCheckTime != 0 && Energy.active_power[0] > 0) { - Energy.kWhtoday[0] += Energy.active_power[0] * (float)(Rtc.utc_time - Tuya.lastPowerCheckTime) / 36.0; + if (Tuya.lastPowerCheckTime != 0 && Energy->active_power[0] > 0) { + Energy->kWhtoday[0] += Energy->active_power[0] * (float)(Rtc.utc_time - Tuya.lastPowerCheckTime) / 36.0; EnergyUpdateToday(); } Tuya.lastPowerCheckTime = Rtc.utc_time; @@ -950,24 +950,24 @@ void TuyaProcessStatePacket(void) { } #ifdef USE_ENERGY_SENSOR else if (tuya_energy_enabled && fnId == TUYA_MCU_FUNC_VOLTAGE) { - Energy.voltage[0] = (float)packetValue / 10; + Energy->voltage[0] = (float)packetValue / 10; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Rx ID=%d Voltage=%d"), Tuya.buffer[dpidStart], packetValue); } else if (tuya_energy_enabled && fnId == TUYA_MCU_FUNC_CURRENT) { - Energy.current[0] = (float)packetValue / 1000; + Energy->current[0] = (float)packetValue / 1000; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Rx ID=%d Current=%d"), Tuya.buffer[dpidStart], packetValue); } else if (tuya_energy_enabled && fnId == TUYA_MCU_FUNC_POWER) { - Energy.active_power[0] = (float)packetValue / 10; + Energy->active_power[0] = (float)packetValue / 10; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Rx ID=%d Active_Power=%d"), Tuya.buffer[dpidStart], packetValue); if (RtcTime.valid) { - if (Tuya.lastPowerCheckTime != 0 && Energy.active_power[0] > 0) { - Energy.kWhtoday[0] += Energy.active_power[0] * (float)(Rtc.utc_time - Tuya.lastPowerCheckTime) / 36.0; + if (Tuya.lastPowerCheckTime != 0 && Energy->active_power[0] > 0) { + Energy->kWhtoday[0] += Energy->active_power[0] * (float)(Rtc.utc_time - Tuya.lastPowerCheckTime) / 36.0; EnergyUpdateToday(); } Tuya.lastPowerCheckTime = Rtc.utc_time; } } else if (tuya_energy_enabled && fnId == TUYA_MCU_FUNC_POWER_TOTAL) { - Energy.import_active[0] = (float)packetValue / 100; + Energy->import_active[0] = (float)packetValue / 100; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: Rx ID=%d Total_Power=%d"), Tuya.buffer[dpidStart], packetValue); EnergyUpdateTotal(); } @@ -1602,10 +1602,10 @@ bool Xnrg32(uint32_t function) if (FUNC_PRE_INIT == function) { if (TuyaGetDpId(TUYA_MCU_FUNC_POWER) != 0 || TuyaGetDpId(TUYA_MCU_FUNC_POWER_COMBINED) != 0) { if (TuyaGetDpId(TUYA_MCU_FUNC_CURRENT) == 0 && TuyaGetDpId(TUYA_MCU_FUNC_POWER_COMBINED) == 0) { - Energy.current_available = false; + Energy->current_available = false; } if (TuyaGetDpId(TUYA_MCU_FUNC_VOLTAGE) == 0 && TuyaGetDpId(TUYA_MCU_FUNC_POWER_COMBINED) == 0) { - Energy.voltage_available = false; + Energy->voltage_available = false; } TasmotaGlobal.energy_driver = XNRG_32; } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v2.ino b/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v2.ino index b0bc5e6aa..d78b1bec3 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v2.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_16_tuyamcu_v2.ino @@ -1604,15 +1604,15 @@ void TuyaProcessRxedDP(uint8_t dpid, uint8_t type, uint8_t *data, int dpDataLen) /* uint16_t tmpVol = pTuya->buffer[dpidStart + 4] << 8 | pTuya->buffer[dpidStart + 5]; uint16_t tmpCur = pTuya->buffer[dpidStart + 7] << 8 | pTuya->buffer[dpidStart + 8]; uint16_t tmpPow = pTuya->buffer[dpidStart + 10] << 8 | pTuya->buffer[dpidStart + 11];*/ - Energy.voltage[0] = (float)tmpVol / 10; - Energy.current[0] = (float)tmpCur / 1000; - Energy.active_power[0] = (float)tmpPow; + Energy->voltage[0] = (float)tmpVol / 10; + Energy->current[0] = (float)tmpCur / 1000; + Energy->active_power[0] = (float)tmpPow; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: fnId=%d Rx ID=%d Voltage=%d Current=%d Active_Power=%d"), fnId, dpid, tmpVol, tmpCur, tmpPow); if (RtcTime.valid) { - if (pTuya->lastPowerCheckTime != 0 && Energy.active_power[0] > 0) { - Energy.kWhtoday[0] += Energy.active_power[0] * (float)(Rtc.utc_time - pTuya->lastPowerCheckTime) / 36.0; + if (pTuya->lastPowerCheckTime != 0 && Energy->active_power[0] > 0) { + Energy->kWhtoday[0] += Energy->active_power[0] * (float)(Rtc.utc_time - pTuya->lastPowerCheckTime) / 36.0; EnergyUpdateToday(); } pTuya->lastPowerCheckTime = Rtc.utc_time; @@ -1745,24 +1745,24 @@ void TuyaProcessRxedDP(uint8_t dpid, uint8_t type, uint8_t *data, int dpDataLen) } #ifdef USE_ENERGY_SENSOR else if (tuya_energy_enabled && fnId == TUYA_MCU_FUNC_VOLTAGE) { - Energy.voltage[0] = (float)packetValue / 10; + Energy->voltage[0] = (float)packetValue / 10; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: fnId=%d Rx ID=%d Voltage=%d"), fnId, dpid, packetValue); } else if (tuya_energy_enabled && fnId == TUYA_MCU_FUNC_CURRENT) { - Energy.current[0] = (float)packetValue / 1000; + Energy->current[0] = (float)packetValue / 1000; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: fnId=%d Rx ID=%d Current=%d"), fnId, dpid, packetValue); } else if (tuya_energy_enabled && fnId == TUYA_MCU_FUNC_POWER) { - Energy.active_power[0] = (float)packetValue / 10; + Energy->active_power[0] = (float)packetValue / 10; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: fnId=%d Rx ID=%d Active_Power=%d"), fnId, dpid, packetValue); if (RtcTime.valid) { - if (pTuya->lastPowerCheckTime != 0 && Energy.active_power[0] > 0) { - Energy.kWhtoday[0] += Energy.active_power[0] * (float)(Rtc.utc_time - pTuya->lastPowerCheckTime) / 36.0; + if (pTuya->lastPowerCheckTime != 0 && Energy->active_power[0] > 0) { + Energy->kWhtoday[0] += Energy->active_power[0] * (float)(Rtc.utc_time - pTuya->lastPowerCheckTime) / 36.0; EnergyUpdateToday(); } pTuya->lastPowerCheckTime = Rtc.utc_time; } } else if (tuya_energy_enabled && fnId == TUYA_MCU_FUNC_POWER_TOTAL) { - Energy.import_active[0] = (float)packetValue / 100; + Energy->import_active[0] = (float)packetValue / 100; AddLog(LOG_LEVEL_DEBUG, PSTR("TYA: fnId=%d Rx ID=%d Total_Power=%d"), fnId, dpid, packetValue); EnergyUpdateTotal(); } @@ -2441,10 +2441,10 @@ bool Xnrg32(uint32_t function) if (FUNC_PRE_INIT == function) { if (TuyaGetDpId(TUYA_MCU_FUNC_POWER) != 0 || TuyaGetDpId(TUYA_MCU_FUNC_POWER_COMBINED) != 0) { if (TuyaGetDpId(TUYA_MCU_FUNC_CURRENT) == 0 && TuyaGetDpId(TUYA_MCU_FUNC_POWER_COMBINED) == 0) { - Energy.current_available = false; + Energy->current_available = false; } if (TuyaGetDpId(TUYA_MCU_FUNC_VOLTAGE) == 0 && TuyaGetDpId(TUYA_MCU_FUNC_POWER_COMBINED) == 0) { - Energy.voltage_available = false; + Energy->voltage_available = false; } TasmotaGlobal.energy_driver = XNRG_32; } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_45_shelly_dimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_45_shelly_dimmer.ino index 4b157ac6e..0ed553765 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_45_shelly_dimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_45_shelly_dimmer.ino @@ -527,19 +527,19 @@ bool ShdPacketProcess(void) #ifdef USE_ENERGY_SENSOR if (Shd.hw_version == 2) { - Energy.current_available = true; - Energy.voltage_available = true; + Energy->current_available = true; + Energy->voltage_available = true; } - Energy.active_power[0] = wattage; - Energy.voltage[0] = voltage; - Energy.current[0] = current; - if (Shd.last_power_check > 10 && Energy.active_power[0] > 0) { + Energy->active_power[0] = wattage; + Energy->voltage[0] = voltage; + Energy->current[0] = current; + if (Shd.last_power_check > 10 && Energy->active_power[0] > 0) { uint32_t time_passed = abs(TimePassedSince(Shd.last_power_check)); // Time passed in milliseconds - uint32_t deca_microWh = (uint32_t)(Energy.active_power[0] * time_passed) / 36; + uint32_t deca_microWh = (uint32_t)(Energy->active_power[0] * time_passed) / 36; #ifdef SHELLY_DIMMER_DEBUG - AddLog(LOG_LEVEL_DEBUG, PSTR(SHD_LOGNAME "%4_f W is %u dmWh during %u ms"), &Energy.active_power[0], deca_microWh, time_passed); + AddLog(LOG_LEVEL_DEBUG, PSTR(SHD_LOGNAME "%4_f W is %u dmWh during %u ms"), &Energy->active_power[0], deca_microWh, time_passed); #endif // SHELLY_DIMMER_DEBUG - Energy.kWhtoday_delta[0] += deca_microWh; + Energy->kWhtoday_delta[0] += deca_microWh; EnergyUpdateToday(); } Shd.last_power_check = millis(); @@ -833,10 +833,10 @@ bool Xnrg31(uint32_t function) { if (Shd.present) { if (FUNC_PRE_INIT == function) { #ifndef SHELLY_VOLTAGE_MON - Energy.current_available = false; - Energy.voltage_available = false; + Energy->current_available = false; + Energy->voltage_available = false; #endif // SHELLY_VOLTAGE_MON - Energy.use_overtemp = true; // Use global temperature for overtemp detection + Energy->use_overtemp = true; // Use global temperature for overtemp detection TasmotaGlobal.energy_driver = XNRG_31; } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino b/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino index d8b315063..51fd818ad 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino @@ -429,13 +429,13 @@ void TM1621Show(void) { if (TM1621_POWR316D == Tm1621.device) { if (0 == Tm1621.display_rotate) { - ext_snprintf_P(Tm1621.row[0], sizeof(Tm1621.row[0]), PSTR("%1_f"), &Energy.voltage[0]); - ext_snprintf_P(Tm1621.row[1], sizeof(Tm1621.row[1]), PSTR("%1_f"), &Energy.current[0]); + ext_snprintf_P(Tm1621.row[0], sizeof(Tm1621.row[0]), PSTR("%1_f"), &Energy->voltage[0]); + ext_snprintf_P(Tm1621.row[1], sizeof(Tm1621.row[1]), PSTR("%1_f"), &Energy->current[0]); Tm1621.voltage = true; Tm1621.display_rotate = 1; } else { - ext_snprintf_P(Tm1621.row[0], sizeof(Tm1621.row[0]), PSTR("%1_f"), &Energy.total[0]); - ext_snprintf_P(Tm1621.row[1], sizeof(Tm1621.row[1]), PSTR("%1_f"), &Energy.active_power[0]); + ext_snprintf_P(Tm1621.row[0], sizeof(Tm1621.row[0]), PSTR("%1_f"), &Energy->total[0]); + ext_snprintf_P(Tm1621.row[1], sizeof(Tm1621.row[1]), PSTR("%1_f"), &Energy->active_power[0]); Tm1621.kwh = true; Tm1621.display_rotate = 0; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_01_hlw8012.ino b/tasmota/tasmota_xnrg_energy/xnrg_01_hlw8012.ino index cfbd76d94..88f6d2d74 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_01_hlw8012.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_01_hlw8012.ino @@ -93,7 +93,7 @@ void HlwCfInterrupt(void) { // Service Power Hlw.cf_pulse_counter++; Hlw.energy_period_counter++; } - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; } void HlwCf1Interrupt(void) { // Service Voltage and Current @@ -111,7 +111,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] = 0; + Energy->data_valid[0] = 0; } /********************************************************************************************/ @@ -133,15 +133,15 @@ void HlwEvery200ms(void) { Hlw.cf_summed_pulse_length = 0; Hlw.cf_pulse_counter = 0; - if (Hlw.cf_power_pulse_length && Energy.power_on && !Hlw.load_off) { + if (Hlw.cf_power_pulse_length && Energy->power_on && !Hlw.load_off) { hlw_w = (Hlw.power_ratio * Settings->energy_power_calibration) / Hlw.cf_power_pulse_length ; // W *10 - Energy.active_power[0] = (float)hlw_w / 10; + Energy->active_power[0] = (float)hlw_w / 10; Hlw.power_retry = 1; // Workaround issue #5161 } else { if (Hlw.power_retry) { Hlw.power_retry--; } else { - Energy.active_power[0] = 0; + Energy->active_power[0] = 0; } } @@ -178,21 +178,21 @@ void HlwEvery200ms(void) { if (Hlw.select_ui_flag == Hlw.ui_flag) { Hlw.cf1_voltage_pulse_length = cf1_pulse_length; - if (Hlw.cf1_voltage_pulse_length && Energy.power_on) { // If powered on always provide voltage + if (Hlw.cf1_voltage_pulse_length && Energy->power_on) { // If powered on always provide voltage hlw_u = (Hlw.voltage_ratio * Settings->energy_voltage_calibration) / Hlw.cf1_voltage_pulse_length ; // V *10 - Energy.voltage[0] = (float)hlw_u / 10; + Energy->voltage[0] = (float)hlw_u / 10; } else { - Energy.voltage[0] = 0; + Energy->voltage[0] = 0; } } else { Hlw.cf1_current_pulse_length = cf1_pulse_length; - if (Hlw.cf1_current_pulse_length && Energy.active_power[0]) { // No current if no power being consumed + if (Hlw.cf1_current_pulse_length && Energy->active_power[0]) { // No current if no power being consumed hlw_i = (Hlw.current_ratio * Settings->energy_current_calibration) / Hlw.cf1_current_pulse_length; // mA - Energy.current[0] = (float)hlw_i / 1000; + Energy->current[0] = (float)hlw_i / 1000; } else { - Energy.current[0] = 0; + Energy->current[0] = 0; } } @@ -203,7 +203,7 @@ void HlwEvery200ms(void) { } void HlwEverySecond(void) { - if (Energy.data_valid[0] > 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; @@ -217,7 +217,7 @@ void HlwEverySecond(void) { hlw_len = 10000 * 100 / Hlw.energy_period_counter; // Add *100 to fix rounding on loads at 3.6kW (#9160) Hlw.energy_period_counter = 0; if (hlw_len) { - Energy.kWhtoday_delta[0] += (((Hlw.power_ratio * Settings->energy_power_calibration) / 36) * 100) / hlw_len; + Energy->kWhtoday_delta[0] += (((Hlw.power_ratio * Settings->energy_power_calibration) / 36) * 100) / hlw_len; EnergyUpdateToday(); } } @@ -270,13 +270,13 @@ void HlwDrvInit(void) { if (PinUsed(GPIO_NRG_CF1)) { // Voltage and/or Current monitor if (!PinUsed(GPIO_NRG_SEL)) { // Voltage and/or Current selector - Energy.current_available = false; // Assume Voltage + Energy->current_available = false; // Assume Voltage } } else { - Energy.current_available = false; - Energy.voltage_available = false; + Energy->current_available = false; + Energy->voltage_available = false; } - Energy.use_overtemp = true; // Use global temperature for overtemp detection + Energy->use_overtemp = true; // Use global temperature for overtemp detection TasmotaGlobal.energy_driver = XNRG_01; } @@ -285,20 +285,20 @@ void HlwDrvInit(void) { bool HlwCommand(void) { bool serviced = true; - if ((CMND_POWERCAL == Energy.command_code) || (CMND_VOLTAGECAL == Energy.command_code) || (CMND_CURRENTCAL == Energy.command_code)) { + if ((CMND_POWERCAL == Energy->command_code) || (CMND_VOLTAGECAL == Energy->command_code) || (CMND_CURRENTCAL == Energy->command_code)) { // Service in xdrv_03_energy.ino } - else if (CMND_POWERSET == Energy.command_code) { + else if (CMND_POWERSET == Energy->command_code) { if (XdrvMailbox.data_len && Hlw.cf_power_pulse_length ) { XdrvMailbox.payload = ((uint32_t)(CharToFloat(XdrvMailbox.data) * 10) * Hlw.cf_power_pulse_length ) / Hlw.power_ratio; } } - else if (CMND_VOLTAGESET == Energy.command_code) { + else if (CMND_VOLTAGESET == Energy->command_code) { if (XdrvMailbox.data_len && Hlw.cf1_voltage_pulse_length ) { XdrvMailbox.payload = ((uint32_t)(CharToFloat(XdrvMailbox.data) * 10) * Hlw.cf1_voltage_pulse_length ) / Hlw.voltage_ratio; } } - else if (CMND_CURRENTSET == Energy.command_code) { + else if (CMND_CURRENTSET == Energy->command_code) { if (XdrvMailbox.data_len && Hlw.cf1_current_pulse_length) { XdrvMailbox.payload = ((uint32_t)(CharToFloat(XdrvMailbox.data)) * Hlw.cf1_current_pulse_length) / Hlw.current_ratio; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_02_cse7766.ino b/tasmota/tasmota_xnrg_energy/xnrg_02_cse7766.ino index fd2ccc11e..b4077ed74 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_02_cse7766.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_02_cse7766.ino @@ -105,21 +105,21 @@ void CseReceived(void) { Cse.power_cycle = Cse.rx_buffer[17] << 16 | Cse.rx_buffer[18] << 8 | Cse.rx_buffer[19]; Cse.cf_pulses = Cse.rx_buffer[21] << 8 | Cse.rx_buffer[22]; - if (Energy.power_on) { // Powered on + if (Energy->power_on) { // Powered on if (adjustement & 0x40) { // Voltage valid - Energy.voltage[0] = (float)(Settings->energy_voltage_calibration * CSE_UREF) / (float)Cse.voltage_cycle; + Energy->voltage[0] = (float)(Settings->energy_voltage_calibration * CSE_UREF) / (float)Cse.voltage_cycle; } if (adjustement & 0x10) { // Power valid Cse.power_invalid = 0; if ((header & 0xF2) == 0xF2) { // Power cycle exceeds range - Energy.active_power[0] = 0; + Energy->active_power[0] = 0; } else { if (0 == Cse.power_cycle_first) { Cse.power_cycle_first = Cse.power_cycle; } // Skip first incomplete Cse.power_cycle if (Cse.power_cycle_first != Cse.power_cycle) { Cse.power_cycle_first = -1; - Energy.active_power[0] = (float)(Settings->energy_power_calibration * CSE_PREF) / (float)Cse.power_cycle; + Energy->active_power[0] = (float)(Settings->energy_power_calibration * CSE_PREF) / (float)Cse.power_cycle; } else { - Energy.active_power[0] = 0; + Energy->active_power[0] = 0; } } } else { @@ -127,21 +127,21 @@ void CseReceived(void) { Cse.power_invalid++; } else { Cse.power_cycle_first = 0; - Energy.active_power[0] = 0; // Powered on but no load + Energy->active_power[0] = 0; // Powered on but no load } } if (adjustement & 0x20) { // Current valid - if (0 == Energy.active_power[0]) { - Energy.current[0] = 0; + if (0 == Energy->active_power[0]) { + Energy->current[0] = 0; } else { - Energy.current[0] = (float)Settings->energy_current_calibration / (float)Cse.current_cycle; + Energy->current[0] = (float)Settings->energy_current_calibration / (float)Cse.current_cycle; } } } else { // Powered off Cse.power_cycle_first = 0; - Energy.voltage[0] = 0; - Energy.active_power[0] = 0; - Energy.current[0] = 0; + Energy->voltage[0] = 0; + Energy->active_power[0] = 0; + Energy->current[0] = 0; } } @@ -159,7 +159,7 @@ void CseSerialInput(void) { uint8_t checksum = 0; for (uint32_t i = 2; i < 23; i++) { checksum += Cse.rx_buffer[i]; } if (checksum == Cse.rx_buffer[23]) { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; CseReceived(); Cse.received = false; return; @@ -189,7 +189,7 @@ void CseSerialInput(void) { /********************************************************************************************/ void CseEverySecond(void) { - if (Energy.data_valid[0] > ENERGY_WATCHDOG) { + if (Energy->data_valid[0] > ENERGY_WATCHDOG) { Cse.voltage_cycle = 0; Cse.current_cycle = 0; Cse.power_cycle = 0; @@ -203,7 +203,7 @@ void CseEverySecond(void) { } else { cf_pulses = Cse.cf_pulses - Cse.cf_pulses_last_time; } - if (cf_pulses && Energy.active_power[0]) { + if (cf_pulses && Energy->active_power[0]) { uint32_t delta = (cf_pulses * Settings->energy_power_calibration) / 36; // prevent invalid load delta steps even checksum is valid (issue #5789): // prevent invalid load delta steps even checksum is valid but allow up to 4kW (issue #7155): @@ -211,7 +211,7 @@ void CseEverySecond(void) { // prevent invalid load delta steps even checksum is valid but allow up to 5.5kW (issue #14156): if (delta <= (5500 * 1000 / 36)) { // max load for Pow R3: 5.50kW Cse.cf_pulses_last_time = Cse.cf_pulses; - Energy.kWhtoday_delta[0] += delta; + Energy->kWhtoday_delta[0] += delta; } else { AddLog(LOG_LEVEL_DEBUG, PSTR("CSE: Overload")); @@ -236,7 +236,7 @@ void CseSnsInit(void) { Settings->param[P_CSE7766_INVALID_POWER] = CSE_MAX_INVALID_POWER; // SetOption39 1..255 } Cse.power_invalid = Settings->param[P_CSE7766_INVALID_POWER]; - Energy.use_overtemp = true; // Use global temperature for overtemp detection + Energy->use_overtemp = true; // Use global temperature for overtemp detection } else { TasmotaGlobal.energy_driver = ENERGY_NONE; } @@ -255,17 +255,17 @@ void CseDrvInit(void) { bool CseCommand(void) { bool serviced = true; - if (CMND_POWERSET == Energy.command_code) { + if (CMND_POWERSET == Energy->command_code) { if (XdrvMailbox.data_len && Cse.power_cycle) { XdrvMailbox.payload = (unsigned long)(CharToFloat(XdrvMailbox.data) * Cse.power_cycle) / CSE_PREF; } } - else if (CMND_VOLTAGESET == Energy.command_code) { + else if (CMND_VOLTAGESET == Energy->command_code) { if (XdrvMailbox.data_len && Cse.voltage_cycle) { XdrvMailbox.payload = (unsigned long)(CharToFloat(XdrvMailbox.data) * Cse.voltage_cycle) / CSE_UREF; } } - else if (CMND_CURRENTSET == Energy.command_code) { + else if (CMND_CURRENTSET == Energy->command_code) { if (XdrvMailbox.data_len && Cse.current_cycle) { XdrvMailbox.payload = (unsigned long)(CharToFloat(XdrvMailbox.data) * Cse.current_cycle) / 1000; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_03_pzem004t.ino b/tasmota/tasmota_xnrg_energy/xnrg_03_pzem004t.ino index 7e6dc699b..41644df77 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_03_pzem004t.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_03_pzem004t.ino @@ -180,20 +180,20 @@ void PzemEvery250ms(void) if (data_ready) { float value = 0; if (PzemRecieve(pzem_responses[Pzem.read_state], &value)) { - Energy.data_valid[Pzem.phase] = 0; + Energy->data_valid[Pzem.phase] = 0; switch (Pzem.read_state) { case 1: // Voltage as 230.2V - Energy.voltage[Pzem.phase] = value; + Energy->voltage[Pzem.phase] = value; break; case 2: // Current as 17.32A - Energy.current[Pzem.phase] = value; + Energy->current[Pzem.phase] = value; break; case 3: // Power as 20W - Energy.active_power[Pzem.phase] = value; + Energy->active_power[Pzem.phase] = value; break; case 4: // Total energy as 99999Wh - Energy.import_active[Pzem.phase] = value / 1000.0f; // 99.999kWh - if (Pzem.phase == Energy.phase_count -1) { + Energy->import_active[Pzem.phase] = value / 1000.0f; // 99.999kWh + if (Pzem.phase == Energy->phase_count -1) { if (TasmotaGlobal.uptime > PZEM_STABILIZE) { EnergyUpdateTotal(); } @@ -212,12 +212,12 @@ void PzemEvery250ms(void) if (0 == Pzem.send_retry || data_ready) { if (1 == Pzem.read_state) { if (0 == Pzem.phase) { - Pzem.phase = Energy.phase_count -1; + Pzem.phase = Energy->phase_count -1; } else { Pzem.phase--; } -// AddLog(LOG_LEVEL_DEBUG, PSTR("PZM: Probing address %d, Max phases %d"), Pzem.phase +1, Energy.phase_count); +// AddLog(LOG_LEVEL_DEBUG, PSTR("PZM: Probing address %d, Max phases %d"), Pzem.phase +1, Energy->phase_count); } if (Pzem.address) { @@ -229,8 +229,8 @@ void PzemEvery250ms(void) } else { Pzem.send_retry--; - if ((Energy.phase_count > 1) && (0 == Pzem.send_retry) && (TasmotaGlobal.uptime < PZEM_STABILIZE)) { - Energy.phase_count--; // Decrement phases if no response after retry within 30 seconds after restart + if ((Energy->phase_count > 1) && (0 == Pzem.send_retry) && (TasmotaGlobal.uptime < PZEM_STABILIZE)) { + Energy->phase_count--; // Decrement phases if no response after retry within 30 seconds after restart if (TasmotaGlobal.discovery_counter) { TasmotaGlobal.discovery_counter += (PZEM_RETRY / 4) + 1; // Don't send Discovery yet, delay by 5 * 250ms + 1s } @@ -246,7 +246,7 @@ void PzemSnsInit(void) if (PzemSerial->hardwareSerial()) { ClaimSerial(); } - Energy.phase_count = ENERGY_MAX_PHASES; // Start off with three phases + Energy->phase_count = ENERGY_MAX_PHASES; // Start off with three phases Pzem.phase = 0; Pzem.read_state = 1; } else { @@ -265,7 +265,7 @@ bool PzemCommand(void) { bool serviced = true; - if (CMND_MODULEADDRESS == Energy.command_code) { + if (CMND_MODULEADDRESS == Energy->command_code) { if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= ENERGY_MAX_PHASES)) { Pzem.address = XdrvMailbox.payload; // Valid addresses are 1, 2 and 3 } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_04_mcp39f501.ino b/tasmota/tasmota_xnrg_energy/xnrg_04_mcp39f501.ino index 631fe9919..41259ba87 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_04_mcp39f501.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_04_mcp39f501.ino @@ -454,19 +454,19 @@ void McpParseData(void) // mcp_power_factor = McpExtractInt(mcp_buffer, 20, 2); 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; - if (0 == Energy.active_power[0]) { - Energy.current[0] = 0; + 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; + if (0 == Energy->active_power[0]) { + Energy->current[0] = 0; } else { - Energy.current[0] = (float)mcp_current_rms / 10000; + Energy->current[0] = (float)mcp_current_rms / 10000; } /* } else { // Powered off - Energy.data_valid[0] = ENERGY_WATCHDOG; + Energy->data_valid[0] = ENERGY_WATCHDOG; */ } } @@ -526,7 +526,7 @@ void McpSerialInput(void) void McpEverySecond(void) { - if (Energy.data_valid[0] > ENERGY_WATCHDOG) { + if (Energy->data_valid[0] > ENERGY_WATCHDOG) { mcp_voltage_rms = 0; mcp_current_rms = 0; mcp_active_power = 0; @@ -534,7 +534,7 @@ void McpEverySecond(void) } if (mcp_active_power) { - Energy.kWhtoday_delta[0] += ((mcp_active_power * 10) / 36); + Energy->kWhtoday_delta[0] += ((mcp_active_power * 10) / 36); EnergyUpdateToday(); } @@ -573,7 +573,7 @@ void McpSnsInit(void) mcp_buffer = (char*)(malloc(MCP_BUFFER_SIZE)); } DigitalWrite(GPIO_MCP39F5_RST, 0, 1); // MCP enable - Energy.use_overtemp = true; // Use global temperature for overtemp detection + Energy->use_overtemp = true; // Use global temperature for overtemp detection } else { TasmotaGlobal.energy_driver = ENERGY_NONE; } @@ -598,7 +598,7 @@ bool McpCommand(void) bool serviced = true; unsigned long value = 0; - if (CMND_POWERSET == Energy.command_code) { + if (CMND_POWERSET == Energy->command_code) { if (XdrvMailbox.data_len && mcp_active_power) { value = (unsigned long)(CharToFloat(XdrvMailbox.data) * 100); if ((value > 100) && (value < 200000)) { // Between 1W and 2000W @@ -608,7 +608,7 @@ bool McpCommand(void) } } } - else if (CMND_VOLTAGESET == Energy.command_code) { + else if (CMND_VOLTAGESET == Energy->command_code) { if (XdrvMailbox.data_len && mcp_voltage_rms) { value = (unsigned long)(CharToFloat(XdrvMailbox.data) * 10); if ((value > 1000) && (value < 2600)) { // Between 100V and 260V @@ -618,7 +618,7 @@ bool McpCommand(void) } } } - else if (CMND_CURRENTSET == Energy.command_code) { + else if (CMND_CURRENTSET == Energy->command_code) { if (XdrvMailbox.data_len && mcp_current_rms) { value = (unsigned long)(CharToFloat(XdrvMailbox.data) * 10); if ((value > 100) && (value < 80000)) { // Between 10mA and 8A @@ -628,7 +628,7 @@ bool McpCommand(void) } } } - else if (CMND_FREQUENCYSET == Energy.command_code) { + else if (CMND_FREQUENCYSET == Energy->command_code) { if (XdrvMailbox.data_len && mcp_line_frequency) { value = (unsigned long)(CharToFloat(XdrvMailbox.data) * 1000); if ((value > 45000) && (value < 65000)) { // Between 45Hz and 65Hz diff --git a/tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino b/tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino index e07fcb566..242254d71 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_05_pzem_ac.ino @@ -65,20 +65,20 @@ void PzemAcEverySecond(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("PAC: PzemAc %d error %d"), PZEM_AC_DEVICE_ADDRESS + PzemAc.phase, error); } else { - Energy.data_valid[PzemAc.phase] = 0; + Energy->data_valid[PzemAc.phase] = 0; if (10 == registers) { // 0 1 2 3 4 5 6 7 8 9 = ModBus register // 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 = Buffer index // 01 04 14 08 D1 00 6C 00 00 00 F4 00 00 00 26 00 00 01 F4 00 64 00 00 51 34 // Id Cc Sz Volt- Current---- Power------ Energy----- Frequ PFact Alarm Crc-- - Energy.voltage[PzemAc.phase] = (float)((buffer[3] << 8) + buffer[4]) / 10.0f; // 6553.0 V - Energy.current[PzemAc.phase] = (float)((buffer[7] << 24) + (buffer[8] << 16) + (buffer[5] << 8) + buffer[6]) / 1000.0f; // 4294967.000 A - Energy.active_power[PzemAc.phase] = (float)((buffer[11] << 24) + (buffer[12] << 16) + (buffer[9] << 8) + buffer[10]) / 10.0f; // 429496729.0 W - Energy.frequency[PzemAc.phase] = (float)((buffer[17] << 8) + buffer[18]) / 10.0f; // 50.0 Hz - Energy.power_factor[PzemAc.phase] = (float)((buffer[19] << 8) + buffer[20]) / 100.0f; // 1.00 - Energy.import_active[PzemAc.phase] = (float)((buffer[15] << 24) + (buffer[16] << 16) + (buffer[13] << 8) + buffer[14]) / 1000.0f; // 4294967.295 kWh - if (PzemAc.phase == Energy.phase_count -1) { + Energy->voltage[PzemAc.phase] = (float)((buffer[3] << 8) + buffer[4]) / 10.0f; // 6553.0 V + Energy->current[PzemAc.phase] = (float)((buffer[7] << 24) + (buffer[8] << 16) + (buffer[5] << 8) + buffer[6]) / 1000.0f; // 4294967.000 A + Energy->active_power[PzemAc.phase] = (float)((buffer[11] << 24) + (buffer[12] << 16) + (buffer[9] << 8) + buffer[10]) / 10.0f; // 429496729.0 W + Energy->frequency[PzemAc.phase] = (float)((buffer[17] << 8) + buffer[18]) / 10.0f; // 50.0 Hz + Energy->power_factor[PzemAc.phase] = (float)((buffer[19] << 8) + buffer[20]) / 100.0f; // 1.00 + Energy->import_active[PzemAc.phase] = (float)((buffer[15] << 24) + (buffer[16] << 16) + (buffer[13] << 8) + buffer[14]) / 1000.0f; // 4294967.295 kWh + if (PzemAc.phase == Energy->phase_count -1) { if (TasmotaGlobal.uptime > PZEM_AC_STABILIZE) { EnergyUpdateTotal(); } @@ -89,7 +89,7 @@ void PzemAcEverySecond(void) if (0 == PzemAc.send_retry || data_ready) { if (0 == PzemAc.phase) { - PzemAc.phase = Energy.phase_count -1; + PzemAc.phase = Energy->phase_count -1; } else { PzemAc.phase--; } @@ -103,8 +103,8 @@ void PzemAcEverySecond(void) } else { PzemAc.send_retry--; - if ((Energy.phase_count > 1) && (0 == PzemAc.send_retry) && (TasmotaGlobal.uptime < PZEM_AC_STABILIZE)) { - Energy.phase_count--; // Decrement phases if no response after retry within 30 seconds after restart + if ((Energy->phase_count > 1) && (0 == PzemAc.send_retry) && (TasmotaGlobal.uptime < PZEM_AC_STABILIZE)) { + Energy->phase_count--; // Decrement phases if no response after retry within 30 seconds after restart if (TasmotaGlobal.discovery_counter) { TasmotaGlobal.discovery_counter += ENERGY_WATCHDOG + 1; // Don't send Discovery yet, delay by 4s + 1s } @@ -118,7 +118,7 @@ void PzemAcSnsInit(void) uint8_t result = PzemAcModbus->Begin(9600); if (result) { if (2 == result) { ClaimSerial(); } - Energy.phase_count = ENERGY_MAX_PHASES; // Start off with three phases + Energy->phase_count = ENERGY_MAX_PHASES; // Start off with three phases PzemAc.phase = 0; } else { TasmotaGlobal.energy_driver = ENERGY_NONE; @@ -136,7 +136,7 @@ bool PzemAcCommand(void) { bool serviced = true; - if (CMND_MODULEADDRESS == Energy.command_code) { + if (CMND_MODULEADDRESS == Energy->command_code) { PzemAc.address = XdrvMailbox.payload; // Valid addresses are 1, 2 and 3 PzemAc.address_step = ADDR_SEND; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_06_pzem_dc.ino b/tasmota/tasmota_xnrg_energy/xnrg_06_pzem_dc.ino index 06dcf3bb8..1fddb68d0 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_06_pzem_dc.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_06_pzem_dc.ino @@ -64,18 +64,18 @@ void PzemDcEverySecond(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("PDC: PzemDc %d error %d"), PZEM_DC_DEVICE_ADDRESS + PzemDc.channel, error); } else { - Energy.data_valid[PzemDc.channel] = 0; + Energy->data_valid[PzemDc.channel] = 0; if (8 == registers) { // 0 1 2 3 4 5 6 7 = ModBus register // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = Buffer index // 01 04 10 05 40 00 0A 00 0D 00 00 00 02 00 00 00 00 00 00 D6 29 // Id Cc Sz Volt- Curre Power------ Energy----- HiAlm LoAlm Crc-- - Energy.voltage[PzemDc.channel] = (float)((buffer[3] << 8) + buffer[4]) / 100.0f; // 655.00 V - Energy.current[PzemDc.channel] = (float)((buffer[5] << 8) + buffer[6]) / 100.0f; // 655.00 A - Energy.active_power[PzemDc.channel] = (float)((buffer[9] << 24) + (buffer[10] << 16) + (buffer[7] << 8) + buffer[8]) / 10.0f; // 429496729.0 W - Energy.import_active[PzemDc.channel] = (float)((buffer[13] << 24) + (buffer[14] << 16) + (buffer[11] << 8) + buffer[12]) / 1000.0f; // 4294967.295 kWh - if (PzemDc.channel == Energy.phase_count -1) { + Energy->voltage[PzemDc.channel] = (float)((buffer[3] << 8) + buffer[4]) / 100.0f; // 655.00 V + Energy->current[PzemDc.channel] = (float)((buffer[5] << 8) + buffer[6]) / 100.0f; // 655.00 A + Energy->active_power[PzemDc.channel] = (float)((buffer[9] << 24) + (buffer[10] << 16) + (buffer[7] << 8) + buffer[8]) / 10.0f; // 429496729.0 W + Energy->import_active[PzemDc.channel] = (float)((buffer[13] << 24) + (buffer[14] << 16) + (buffer[11] << 8) + buffer[12]) / 1000.0f; // 4294967.295 kWh + if (PzemDc.channel == Energy->phase_count -1) { if (TasmotaGlobal.uptime > PZEM_DC_STABILIZE) { EnergyUpdateTotal(); } @@ -86,7 +86,7 @@ void PzemDcEverySecond(void) if (0 == PzemDc.send_retry || data_ready) { if (0 == PzemDc.channel) { - PzemDc.channel = Energy.phase_count -1; + PzemDc.channel = Energy->phase_count -1; } else { PzemDc.channel--; } @@ -100,8 +100,8 @@ void PzemDcEverySecond(void) } else { PzemDc.send_retry--; - if ((Energy.phase_count > 1) && (0 == PzemDc.send_retry) && (TasmotaGlobal.uptime < PZEM_DC_STABILIZE)) { - Energy.phase_count--; // Decrement channels if no response after retry within 30 seconds after restart + if ((Energy->phase_count > 1) && (0 == PzemDc.send_retry) && (TasmotaGlobal.uptime < PZEM_DC_STABILIZE)) { + Energy->phase_count--; // Decrement channels if no response after retry within 30 seconds after restart if (TasmotaGlobal.discovery_counter) { TasmotaGlobal.discovery_counter += ENERGY_WATCHDOG + 1; // Don't send Discovery yet, delay by 4s + 1s } @@ -115,8 +115,8 @@ void PzemDcSnsInit(void) uint8_t result = PzemDcModbus->Begin(9600, SERIAL_8N2); if (result) { if (2 == result) { ClaimSerial(); } - Energy.type_dc = true; - Energy.phase_count = ENERGY_MAX_PHASES; // Start off with three channels + Energy->type_dc = true; + Energy->phase_count = ENERGY_MAX_PHASES; // Start off with three channels PzemDc.channel = 0; } else { TasmotaGlobal.energy_driver = ENERGY_NONE; @@ -134,7 +134,7 @@ bool PzemDcCommand(void) { bool serviced = true; - if (CMND_MODULEADDRESS == Energy.command_code) { + if (CMND_MODULEADDRESS == Energy->command_code) { PzemDc.address = XdrvMailbox.payload; // Valid addresses are 1, 2 and 3 PzemDc.address_step = ADDR_SEND; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_07_ade7953.ino b/tasmota/tasmota_xnrg_energy/xnrg_07_ade7953.ino index 9efcd2748..d5f79e848 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_07_ade7953.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_07_ade7953.ino @@ -460,7 +460,7 @@ void Ade7953GetData(void) { #endif // USE_ESP32_SPI #ifdef USE_ESP32_SPI - if (1 == Energy.phase_count) { + if (1 == Energy->phase_count) { AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ADE: ACCMODE 0x%06X, VRMS %d, Period %d, IRMS %d, WATT %d, VA %d, VAR %d"), acc_mode, reg[0][4], reg[0][5], reg[0][0], reg[0][1], reg[0][2], reg[0][3]); } else @@ -475,7 +475,7 @@ void Ade7953GetData(void) { uint32_t apparent_power[2] = { 0, 0 }; uint32_t reactive_power[2] = { 0, 0 }; - for (uint32_t channel = 0; channel < Energy.phase_count; channel++) { + for (uint32_t channel = 0; channel < Energy->phase_count; channel++) { Ade7953.voltage_rms[channel] = reg[channel][4]; Ade7953.current_rms[channel] = reg[channel][0]; if (Ade7953.current_rms[channel] < 2000) { // No load threshold (20mA) @@ -491,10 +491,10 @@ void Ade7953GetData(void) { } } - if (Energy.power_on) { // Powered on + if (Energy->power_on) { // Powered on float divider; - for (uint32_t channel = 0; channel < Energy.phase_count; channel++) { - Energy.data_valid[channel] = 0; + for (uint32_t channel = 0; channel < Energy->phase_count; channel++) { + Energy->data_valid[channel] = 0; float power_calibration = (float)EnergyGetCalibration(channel, ENERGY_POWER_CALIBRATION) / 10; #ifdef ADE7953_ACCU_ENERGY @@ -503,29 +503,29 @@ void Ade7953GetData(void) { float voltage_calibration = (float)EnergyGetCalibration(channel, ENERGY_VOLTAGE_CALIBRATION); float current_calibration = (float)EnergyGetCalibration(channel, ENERGY_CURRENT_CALIBRATION) * 10; - Energy.frequency[channel] = 223750.0f / ((float)reg[channel][5] + 1); + Energy->frequency[channel] = 223750.0f / ((float)reg[channel][5] + 1); divider = (Ade7953.calib_data[channel][ADE7953_CAL_VGAIN] != ADE7953_GAIN_DEFAULT) ? 10000 : voltage_calibration; - Energy.voltage[channel] = (float)Ade7953.voltage_rms[channel] / divider; + Energy->voltage[channel] = (float)Ade7953.voltage_rms[channel] / divider; divider = (Ade7953.calib_data[channel][ADE7953_CAL_WGAIN + channel] != ADE7953_GAIN_DEFAULT) ? ADE7953_LSB_PER_WATTSECOND : power_calibration; - Energy.active_power[channel] = (float)Ade7953.active_power[channel] / divider; + Energy->active_power[channel] = (float)Ade7953.active_power[channel] / divider; divider = (Ade7953.calib_data[channel][ADE7953_CAL_VARGAIN + channel] != ADE7953_GAIN_DEFAULT) ? ADE7953_LSB_PER_WATTSECOND : power_calibration; - Energy.reactive_power[channel] = (float)reactive_power[channel] / divider; + Energy->reactive_power[channel] = (float)reactive_power[channel] / divider; if (ADE7953_SHELLY_EM == Ade7953.model) { if (bitRead(acc_mode, 10 +channel)) { // APSIGN - Energy.active_power[channel] *= -1; + Energy->active_power[channel] *= -1; } if (bitRead(acc_mode, 12 +channel)) { // VARSIGN - Energy.reactive_power[channel] *= -1; + Energy->reactive_power[channel] *= -1; } } divider = (Ade7953.calib_data[channel][ADE7953_CAL_VAGAIN + channel] != ADE7953_GAIN_DEFAULT) ? ADE7953_LSB_PER_WATTSECOND : power_calibration; - Energy.apparent_power[channel] = (float)apparent_power[channel] / divider; - if (0 == Energy.active_power[channel]) { - Energy.current[channel] = 0; + Energy->apparent_power[channel] = (float)apparent_power[channel] / divider; + if (0 == Energy->active_power[channel]) { + Energy->current[channel] = 0; } else { divider = (Ade7953.calib_data[channel][ADE7953_CAL_IGAIN + channel] != ADE7953_GAIN_DEFAULT) ? 100000 : current_calibration; - Energy.current[channel] = (float)Ade7953.current_rms[channel] / divider; - Energy.kWhtoday_delta[channel] += Energy.active_power[channel] * 1000 / 36; + Energy->current[channel] = (float)Ade7953.current_rms[channel] / divider; + Energy->kWhtoday_delta[channel] += Energy->active_power[channel] * 1000 / 36; } } EnergyUpdateToday(); @@ -719,22 +719,22 @@ void Ade7953DrvInit(void) { Ade7953.init_step = 3; -// Energy.phase_count = 1; -// Energy.voltage_common = false; -// Energy.frequency_common = false; -// Energy.use_overtemp = false; +// Energy->phase_count = 1; +// Energy->voltage_common = false; +// Energy->frequency_common = false; +// Energy->use_overtemp = false; if (ADE7953_SHELLY_PRO_1PM == Ade7953.model) { } else { - Energy.phase_count = 2; // Handle two channels as two phases + Energy->phase_count = 2; // Handle two channels as two phases if (ADE7953_SHELLY_PRO_2PM == Ade7953.model) { } else { - Energy.voltage_common = true; // Use common voltage - Energy.frequency_common = true; // Use common frequency + Energy->voltage_common = true; // Use common voltage + Energy->frequency_common = true; // Use common frequency } } - Energy.use_overtemp = true; // Use global temperature for overtemp detection + Energy->use_overtemp = true; // Use global temperature for overtemp detection if (ADE7953_SHELLY_EM == Ade7953.model) { - Energy.local_energy_active_export = true; + Energy->local_energy_active_export = true; } TasmotaGlobal.energy_driver = XNRG_07; } @@ -746,19 +746,19 @@ bool Ade7953Command(void) { uint32_t channel = (2 == XdrvMailbox.index) ? 1 : 0; uint32_t value = (uint32_t)(CharToFloat(XdrvMailbox.data) * 100); // 1.23 = 123 - if (CMND_POWERCAL == Energy.command_code) { + if (CMND_POWERCAL == Energy->command_code) { if (1 == XdrvMailbox.payload) { XdrvMailbox.payload = ADE7953_PREF; } // Service in xdrv_03_energy.ino } - else if (CMND_VOLTAGECAL == Energy.command_code) { + else if (CMND_VOLTAGECAL == Energy->command_code) { if (1 == XdrvMailbox.payload) { XdrvMailbox.payload = ADE7953_UREF; } // Service in xdrv_03_energy.ino } - else if (CMND_CURRENTCAL == Energy.command_code) { + else if (CMND_CURRENTCAL == Energy->command_code) { if (1 == XdrvMailbox.payload) { XdrvMailbox.payload = ADE7953_IREF; } // Service in xdrv_03_energy.ino } - else if (CMND_POWERSET == Energy.command_code) { + else if (CMND_POWERSET == Energy->command_code) { if (XdrvMailbox.data_len && Ade7953.active_power[channel]) { if ((value > 100) && (value < 200000)) { // Between 1W and 2000W #ifdef ADE7953_ACCU_ENERGY @@ -771,14 +771,14 @@ bool Ade7953Command(void) { } } } - else if (CMND_VOLTAGESET == Energy.command_code) { + else if (CMND_VOLTAGESET == Energy->command_code) { if (XdrvMailbox.data_len && Ade7953.voltage_rms[channel]) { if ((value > 10000) && (value < 26000)) { // Between 100V and 260V XdrvMailbox.payload = (Ade7953.voltage_rms[channel] * 100) / value; // 0.00 V } } } - else if (CMND_CURRENTSET == Energy.command_code) { + else if (CMND_CURRENTSET == Energy->command_code) { if (XdrvMailbox.data_len && Ade7953.current_rms[channel]) { if ((value > 2000) && (value < 1000000)) { // Between 20mA and 10A XdrvMailbox.payload = ((Ade7953.current_rms[channel] * 100) / value) * 100; // 0.00 mA diff --git a/tasmota/tasmota_xnrg_energy/xnrg_08_sdm120.ino b/tasmota/tasmota_xnrg_energy/xnrg_08_sdm120.ino index d4591aa85..e3c5b9b76 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_08_sdm120.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_08_sdm120.ino @@ -85,7 +85,7 @@ void SDM120Every250ms(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("SDM: SDM120 error %d"), error); } else { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; // 0 1 2 3 4 5 6 7 8 // SA FC BC Fh Fl Sh Sl Cl Ch @@ -98,31 +98,31 @@ void SDM120Every250ms(void) switch(Sdm120.read_state) { case 0: - Energy.voltage[0] = value; // 230.2 V + Energy->voltage[0] = value; // 230.2 V break; case 1: - Energy.current[0] = value; // 1.260 A + Energy->current[0] = value; // 1.260 A break; case 2: - Energy.active_power[0] = value; // -196.3 W + Energy->active_power[0] = value; // -196.3 W break; case 3: - Energy.apparent_power[0] = value; // 223.4 VA + Energy->apparent_power[0] = value; // 223.4 VA break; case 4: - Energy.reactive_power[0] = value; // 92.2 + Energy->reactive_power[0] = value; // 92.2 break; case 5: - Energy.power_factor[0] = value; // -0.91 + Energy->power_factor[0] = value; // -0.91 break; case 6: - Energy.frequency[0] = value; // 50.0 Hz + Energy->frequency[0] = value; // 50.0 Hz break; case 7: @@ -134,7 +134,7 @@ void SDM120Every250ms(void) break; case 9: - Energy.export_active[0] = value; // 6.216 kWh + Energy->export_active[0] = value; // 6.216 kWh break; case 10: @@ -161,7 +161,7 @@ void SDM120Every250ms(void) Sdm120.start_address_count = sdm120_table; // No extended registers available } } - Energy.import_active[0] = Sdm120.total_active; // 484.708 kWh + Energy->import_active[0] = Sdm120.total_active; // 484.708 kWh EnergyUpdateTotal(); // 484.708 kWh } } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_09_dds2382.ino b/tasmota/tasmota_xnrg_energy/xnrg_09_dds2382.ino index 1c5e55a30..c8d258dd2 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_09_dds2382.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_09_dds2382.ino @@ -52,7 +52,7 @@ void Dds2382EverySecond(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "DDS2382 response error %d"), error); } else { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; // 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 = ModBus register // 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 = Buffer index @@ -64,18 +64,18 @@ void Dds2382EverySecond(void) // {"TotalStartTime":"2020-01-08T09:43:05","Total":0.060,"Yesterday":0.001,"Today":0.001,"ExportActive":12.670,"Period":0,"Power":1016,"ApparentPower":1020,"ReactivePower":112,"Factor":0.99,"Frequency":50,"Voltage":242,"Current":4.210}} // {"TotalStartTime":"2020-01-08T00:00:00","Total":0.061,"Yesterday":0.001,"Today":0.001,"ExportActive":12.670,"Period":0.020,"Power":1199.000,"ApparentPower":1204.231,"ReactivePower":108.000,"Factor":1.00,"Frequency":49.98,"Voltage":242.3,"Current":4.970}} - Energy.voltage[0] = (float)((buffer[27] << 8) + buffer[28]) / 10.0f; - Energy.current[0] = (float)((buffer[29] << 8) + buffer[30]) / 100.0f; - Energy.active_power[0] = (float)((buffer[31] << 8) + buffer[32]); - Energy.reactive_power[0] = (float)(int16_t)((buffer[33] << 8) + buffer[34]); - Energy.power_factor[0] = (float)((buffer[35] << 8) + buffer[36]) / 1000.0f; // 1.00 - Energy.frequency[0] = (float)((buffer[37] << 8) + buffer[38]) / 100.0f; // 50.0 Hz + Energy->voltage[0] = (float)((buffer[27] << 8) + buffer[28]) / 10.0f; + Energy->current[0] = (float)((buffer[29] << 8) + buffer[30]) / 100.0f; + Energy->active_power[0] = (float)((buffer[31] << 8) + buffer[32]); + Energy->reactive_power[0] = (float)(int16_t)((buffer[33] << 8) + buffer[34]); + Energy->power_factor[0] = (float)((buffer[35] << 8) + buffer[36]) / 1000.0f; // 1.00 + Energy->frequency[0] = (float)((buffer[37] << 8) + buffer[38]) / 100.0f; // 50.0 Hz uint8_t offset = 11; if (Settings->flag3.dds2382_model) { // SetOption71 - Select different Modbus registers for Active Energy (#6531) offset = 19; } - Energy.export_active[0] = (float)((buffer[offset] << 24) + (buffer[offset +1] << 16) + (buffer[offset +2] << 8) + buffer[offset +3]) / 100.0f; // 429496.729 kW - Energy.import_active[0] = (float)((buffer[offset +4] << 24) + (buffer[offset +5] << 16) + (buffer[offset +6] << 8) + buffer[offset +7]) / 100.0f; // 429496.729 kW + Energy->export_active[0] = (float)((buffer[offset] << 24) + (buffer[offset +1] << 16) + (buffer[offset +2] << 8) + buffer[offset +3]) / 100.0f; // 429496.729 kW + Energy->import_active[0] = (float)((buffer[offset +4] << 24) + (buffer[offset +5] << 16) + (buffer[offset +6] << 8) + buffer[offset +7]) / 100.0f; // 429496.729 kW EnergyUpdateTotal(); // 484.708 kWh } } // end data ready diff --git a/tasmota/tasmota_xnrg_energy/xnrg_10_sdm630.ino b/tasmota/tasmota_xnrg_energy/xnrg_10_sdm630.ino index f6848707d..826d6a1e1 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_10_sdm630.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_10_sdm630.ino @@ -88,9 +88,9 @@ void SDM630Every250ms(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("SDM: SDM630 error %d"), error); } else { - Energy.data_valid[0] = 0; - Energy.data_valid[1] = 0; - Energy.data_valid[2] = 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 @@ -103,95 +103,95 @@ void SDM630Every250ms(void) switch(Sdm630.read_state) { case 0: - Energy.voltage[0] = value; + Energy->voltage[0] = value; break; case 1: - Energy.voltage[1] = value; + Energy->voltage[1] = value; break; case 2: - Energy.voltage[2] = value; + Energy->voltage[2] = value; break; case 3: - Energy.current[0] = value; + Energy->current[0] = value; break; case 4: - Energy.current[1] = value; + Energy->current[1] = value; break; case 5: - Energy.current[2] = value; + Energy->current[2] = value; break; case 6: - Energy.active_power[0] = value; + Energy->active_power[0] = value; break; case 7: - Energy.active_power[1] = value; + Energy->active_power[1] = value; break; case 8: - Energy.active_power[2] = value; + Energy->active_power[2] = value; break; case 9: - Energy.reactive_power[0] = value; + Energy->reactive_power[0] = value; break; case 10: - Energy.reactive_power[1] = value; + Energy->reactive_power[1] = value; break; case 11: - Energy.reactive_power[2] = value; + Energy->reactive_power[2] = value; break; case 12: - Energy.power_factor[0] = value; + Energy->power_factor[0] = value; break; case 13: - Energy.power_factor[1] = value; + Energy->power_factor[1] = value; break; case 14: - Energy.power_factor[2] = value; + Energy->power_factor[2] = value; break; case 15: - Energy.frequency[0] = value; + Energy->frequency[0] = value; break; case 16: - Energy.export_active[0] = value; + Energy->export_active[0] = value; break; case 17: - Energy.export_active[1] = value; + Energy->export_active[1] = value; break; case 18: - Energy.export_active[2] = value; + Energy->export_active[2] = value; break; case 19: - Energy.import_active[0] = value; + Energy->import_active[0] = value; break; case 20: - Energy.import_active[1] = value; + Energy->import_active[1] = value; break; case 21: - Energy.import_active[2] = value; + Energy->import_active[2] = value; break; case 22: -// Energy.import_active[0] = value; +// Energy->import_active[0] = value; EnergyUpdateTotal(); break; } @@ -217,8 +217,8 @@ void Sdm630SnsInit(void) uint8_t result = Sdm630Modbus->Begin(SDM630_SPEED); if (result) { if (2 == result) { ClaimSerial(); } - Energy.phase_count = 3; - Energy.frequency_common = true; // Use common frequency + Energy->phase_count = 3; + Energy->frequency_common = true; // Use common frequency } else { TasmotaGlobal.energy_driver = ENERGY_NONE; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_11_ddsu666.ino b/tasmota/tasmota_xnrg_energy/xnrg_11_ddsu666.ino index ab629c106..67e8cbbb2 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_11_ddsu666.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_11_ddsu666.ino @@ -68,7 +68,7 @@ void DDSU666Every250ms(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("SDM: Ddsu666 error %d"), error); } else { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; // 0 1 2 3 4 5 6 7 8 // SA FC BC Fh Fl Sh Sl Cl Ch @@ -81,35 +81,35 @@ void DDSU666Every250ms(void) switch(Ddsu666.read_state) { case 0: - Energy.voltage[0] = value; // 230.2 V + Energy->voltage[0] = value; // 230.2 V break; case 1: - Energy.current[0] = value; // 1.260 A + Energy->current[0] = value; // 1.260 A break; case 2: - Energy.active_power[0] = value * 1000; // -196.3 W + Energy->active_power[0] = value * 1000; // -196.3 W break; case 3: - Energy.reactive_power[0] = value * 1000; // 92.2 + Energy->reactive_power[0] = value * 1000; // 92.2 break; case 4: - Energy.power_factor[0] = value; // 0.91 + Energy->power_factor[0] = value; // 0.91 break; case 5: - Energy.frequency[0] = value; // 50.0 Hz + Energy->frequency[0] = value; // 50.0 Hz break; case 6: - Energy.import_active[0] = value; // 478.492 kWh + Energy->import_active[0] = value; // 478.492 kWh break; case 7: - Energy.export_active[0] = value; // 6.216 kWh + Energy->export_active[0] = value; // 6.216 kWh break; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_12_solaxX1.ino b/tasmota/tasmota_xnrg_energy/xnrg_12_solaxX1.ino index c57fdd8d2..9a36439b9 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_12_solaxX1.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_12_solaxX1.ino @@ -284,19 +284,19 @@ void solaxX1_250MSecond(void) // Every 250 milliseconds } if (DataRead[6] == 0x11 && DataRead[7] == 0x82) { // received "Response for query (live data)" - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; solaxX1.temperature = (DataRead[9] << 8) | DataRead[10]; // Temperature solaxX1.energy_today = ((DataRead[11] << 8) | DataRead[12]) * 0.1f; // Energy Today solaxX1.dc1_voltage = ((DataRead[13] << 8) | DataRead[14]) * 0.1f; // PV1 Voltage solaxX1.dc2_voltage = ((DataRead[15] << 8) | DataRead[16]) * 0.1f; // PV2 Voltage solaxX1.dc1_current = ((DataRead[17] << 8) | DataRead[18]) * 0.1f; // PV1 Current solaxX1.dc2_current = ((DataRead[19] << 8) | DataRead[20]) * 0.1f; // PV2 Current - Energy.current[0] = ((DataRead[21] << 8) | DataRead[22]) * 0.1f; // AC Current - Energy.voltage[0] = ((DataRead[23] << 8) | DataRead[24]) * 0.1f; // AC Voltage - Energy.frequency[0] = ((DataRead[25] << 8) | DataRead[26]) * 0.01f; // AC Frequency - Energy.active_power[0] = ((DataRead[27] << 8) | DataRead[28]); // AC Power + Energy->current[0] = ((DataRead[21] << 8) | DataRead[22]) * 0.1f; // AC Current + Energy->voltage[0] = ((DataRead[23] << 8) | DataRead[24]) * 0.1f; // AC Voltage + Energy->frequency[0] = ((DataRead[25] << 8) | DataRead[26]) * 0.01f; // AC Frequency + Energy->active_power[0] = ((DataRead[27] << 8) | DataRead[28]); // AC Power //temporal = (float)((DataRead[29] << 8) | DataRead[30]) * 0.1f; // Not Used - Energy.import_active[0] = ((DataRead[31] << 24) | (DataRead[32] << 16) | (DataRead[33] << 8) | DataRead[34]) * 0.1f; // Energy Total + Energy->import_active[0] = ((DataRead[31] << 24) | (DataRead[32] << 16) | (DataRead[33] << 8) | DataRead[34]) * 0.1f; // Energy Total solaxX1.runtime_total = (DataRead[35] << 24) | (DataRead[36] << 16) | (DataRead[37] << 8) | DataRead[38]; // Work Time Total solaxX1.runMode = (DataRead[39] << 8) | DataRead[40]; // Work mode //temporal = (float)((DataRead[41] << 8) | DataRead[42]); // Grid voltage fault value 0.1V @@ -444,9 +444,9 @@ void solaxX1_250MSecond(void) // Every 250 milliseconds if (!solaxX1_global.SendRetry_count) { // Inverter went "off" solaxX1_global.SendRetry_count = 20; DEBUG_SENSOR_LOG(PSTR("SX1: Inverter went \"off\"")); - Energy.data_valid[0] = ENERGY_WATCHDOG; + Energy->data_valid[0] = ENERGY_WATCHDOG; solaxX1.temperature = solaxX1.dc1_voltage = solaxX1.dc2_voltage = solaxX1.dc1_current = solaxX1.dc2_current = solaxX1.dc1_power = 0; - solaxX1.dc2_power = Energy.current[0] = Energy.voltage[0] = Energy.frequency[0] = Energy.active_power[0] = 0; + solaxX1.dc2_power = Energy->current[0] = Energy->voltage[0] = Energy->frequency[0] = Energy->active_power[0] = 0; solaxX1.runMode = -1; // off(line) solaxX1_global.AddressAssigned = false; } // end Inverter went "off" diff --git a/tasmota/tasmota_xnrg_energy/xnrg_13_fif_le01mr.ino b/tasmota/tasmota_xnrg_energy/xnrg_13_fif_le01mr.ino index 1ec4f7698..5be6cc2b2 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_13_fif_le01mr.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_13_fif_le01mr.ino @@ -125,7 +125,7 @@ void FifLEEvery250ms(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("FiF-LE: LE01MR Modbus error %d"), error); } else { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; // CA=Client Address, FC=Function Code, BC=Byte Count, B3..B0=Data byte, Ch Cl = crc16 checksum // U32 registers: @@ -153,36 +153,36 @@ void FifLEEvery250ms(void) switch(Le01mr.read_state) { case 0: - Energy.frequency[0] = value_buff * 0.01f; // 5000 => 50.00 + Energy->frequency[0] = value_buff * 0.01f; // 5000 => 50.00 break; case 1: - Energy.voltage[0] = value_buff * 0.01f; // 23298 => 232.98 V + Energy->voltage[0] = value_buff * 0.01f; // 23298 => 232.98 V break; case 2: - Energy.power_factor[0] = ((int16_t)value_buff) * 0.001f; // 1000 => 1.000 //note: I never saw this negative... + Energy->power_factor[0] = ((int16_t)value_buff) * 0.001f; // 1000 => 1.000 //note: I never saw this negative... break; case 3: - Energy.current[0] = value_buff * 0.001f; // 114 => 0.114 A + Energy->current[0] = value_buff * 0.001f; // 114 => 0.114 A break; case 4: - Energy.active_power[0] = value_buff * 1.0f; // P [W] + Energy->active_power[0] = value_buff * 1.0f; // P [W] break; case 5: - Energy.reactive_power[0] = value_buff * 1.0f; // Q [var] + Energy->reactive_power[0] = value_buff * 1.0f; // Q [var] break; case 6: - Energy.apparent_power[0] = value_buff * 1.0f; // S [VA] + Energy->apparent_power[0] = value_buff * 1.0f; // S [VA] break; case 7: - Energy.import_active[0] = value_buff * 0.01f; // [kWh] - Le01mr.total_active = Energy.import_active[0]; // Useless + Energy->import_active[0] = value_buff * 0.01f; // [kWh] + Le01mr.total_active = Energy->import_active[0]; // Useless break; case 8: diff --git a/tasmota/tasmota_xnrg_energy/xnrg_14_bl09xx.ino b/tasmota/tasmota_xnrg_energy/xnrg_14_bl09xx.ino index 9287bab21..b944078af 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_14_bl09xx.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_14_bl09xx.ino @@ -131,7 +131,7 @@ bool Bl09XXDecode3940(void) { Bl09XX.power[0] = Bl09XX.rx_buffer[18] << 16 | Bl09XX.rx_buffer[17] << 8 | Bl09XX.rx_buffer[16]; // WATT_A signed if (bitRead(Bl09XX.power[0], 23)) { Bl09XX.power[0] |= 0xFF000000; } // Extend sign bit - if (Energy.phase_count > 1) { + if (Energy->phase_count > 1) { Bl09XX.current[1] = Bl09XX.rx_buffer[9] << 16 | Bl09XX.rx_buffer[8] << 8 | Bl09XX.rx_buffer[7]; // IB_RMS unsigned Bl09XX.power[1] = Bl09XX.rx_buffer[21] << 16 | Bl09XX.rx_buffer[20] << 8 | Bl09XX.rx_buffer[19]; // WATT_B signed if (bitRead(Bl09XX.power[1], 23)) { Bl09XX.power[1] |= 0xFF000000; } // Extend sign bit @@ -187,29 +187,29 @@ bool Bl09XXDecode42(void) { } void Bl09XXUpdateEnergy() { - if (Energy.power_on) { // Powered on - Energy.voltage[0] = (float)Bl09XX.voltage / Settings->energy_voltage_calibration; + if (Energy->power_on) { // Powered on + Energy->voltage[0] = (float)Bl09XX.voltage / Settings->energy_voltage_calibration; #ifdef DEBUG_BL09XX - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("BL9: U %2_f, T %2_f"), &Energy.voltage[0], &Bl09XX.temperature); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("BL9: U %2_f, T %2_f"), &Energy->voltage[0], &Bl09XX.temperature); #endif - for (uint32_t chan = 0; chan < Energy.phase_count; chan++) { + for (uint32_t chan = 0; chan < Energy->phase_count; chan++) { uint32_t power_calibration = EnergyGetCalibration(chan, ENERGY_POWER_CALIBRATION); uint32_t current_calibration = EnergyGetCalibration(chan, ENERGY_CURRENT_CALIBRATION); if (Bl09XX.power[chan] > power_calibration) { // We need at least 1W - Energy.active_power[chan] = (float)Bl09XX.power[chan] / power_calibration; - Energy.current[chan] = (float)Bl09XX.current[chan] / current_calibration; + Energy->active_power[chan] = (float)Bl09XX.power[chan] / power_calibration; + Energy->current[chan] = (float)Bl09XX.current[chan] / current_calibration; } else { - Energy.active_power[chan] = 0; - Energy.current[chan] = 0; + Energy->active_power[chan] = 0; + Energy->current[chan] = 0; } #ifdef DEBUG_BL09XX - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("BL9: Chan[%d] I %2_f, P %2_f"), chan, &Energy.current[chan], &Energy.active_power[chan]); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("BL9: Chan[%d] I %2_f, P %2_f"), chan, &Energy->current[chan], &Energy->active_power[chan]); #endif } } else { // Powered off - Energy.voltage[0] = 0; - Energy.active_power[0] = Energy.active_power[1] = 0; - Energy.current[0] = Energy.current[1] = 0; + Energy->voltage[0] = 0; + Energy->active_power[0] = Energy->active_power[1] = 0; + Energy->current[0] = Energy->current[1] = 0; } } @@ -229,7 +229,7 @@ void Bl09XXSerialInput(void) { for (uint32_t i = 0; i < Bl09XX.buffer_size -1; i++) { checksum += Bl09XX.rx_buffer[i]; } checksum ^= 0xFF; if (checksum == Bl09XX.rx_buffer[Bl09XX.buffer_size -1]) { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; bool ok; if (BL0942_MODEL == Bl09XX.model) { ok = Bl09XXDecode42(); @@ -261,14 +261,14 @@ void Bl09XXSerialInput(void) { /********************************************************************************************/ void Bl09XXEverySecond(void) { - if (Energy.data_valid[0] > ENERGY_WATCHDOG) { + if (Energy->data_valid[0] > ENERGY_WATCHDOG) { Bl09XX.voltage = 0; memset(Bl09XX.current, 0, sizeof(Bl09XX.current)); memset(Bl09XX.power, 0, sizeof(Bl09XX.power)); } else { // Calculate energy by using active power - for (uint32_t channel = 0; channel < Energy.phase_count; channel++) { - Energy.kWhtoday_delta[channel] += Energy.active_power[channel] * 1000 / 36; + for (uint32_t channel = 0; channel < Energy->phase_count; channel++) { + Energy->kWhtoday_delta[channel] += Energy->active_power[channel] * 1000 / 36; } EnergyUpdateToday(); } @@ -303,7 +303,7 @@ void Bl09XXInit(void) { #ifdef DEBUG_BL09XX AddLog(LOG_LEVEL_DEBUG, PSTR("BL9: Send Init string")); #endif - Energy.use_overtemp = true; // Use global temperature for overtemp detection + Energy->use_overtemp = true; // Use global temperature for overtemp detection for (uint32_t i = 0; i < 5; i++) { uint8_t crc, byte; crc = byte = BL09XX_WRITE_COMMAND | Bl09XX.address; @@ -316,7 +316,7 @@ void Bl09XXInit(void) { delay(1); } } else { - Energy.use_overtemp = false; // Use global temperature for overtemp detection + Energy->use_overtemp = false; // Use global temperature for overtemp detection } } else { TasmotaGlobal.energy_driver = ENERGY_NONE; @@ -343,10 +343,10 @@ void Bl09XXPreInit(void) { Bl09XX.buffer_size = bl09xx_buffer_size[Bl09XX.model]; Bl09XX.rx_buffer = (uint8_t*)(malloc(Bl09XX.buffer_size)); if (Bl09XX.rx_buffer != nullptr) { - Energy.voltage_common = true; // Use common voltage - Energy.frequency_common = true; // Use common frequency - Energy.use_overtemp = true; // Use global temperature for overtemp detection - Energy.phase_count = bl09xx_phase_count[Bl09XX.model]; // Handle two channels as two phases + Energy->voltage_common = true; // Use common voltage + Energy->frequency_common = true; // Use common frequency + Energy->use_overtemp = true; // Use global temperature for overtemp detection + Energy->phase_count = bl09xx_phase_count[Bl09XX.model]; // Handle two channels as two phases TasmotaGlobal.energy_driver = XNRG_14; AddLog(LOG_LEVEL_DEBUG,PSTR("BL9: Enabling BL09%02d"), bl09xx_type[Bl09XX.model]); } @@ -357,20 +357,20 @@ void Bl09XXPreInit(void) { bool Bl09XXCommand(void) { bool serviced = true; - uint32_t channel = (2 == XdrvMailbox.index) && (Energy.phase_count > 1) ? 1 : 0; + uint32_t channel = (2 == XdrvMailbox.index) && (Energy->phase_count > 1) ? 1 : 0; uint32_t value = (uint32_t)(CharToFloat(XdrvMailbox.data) * 100); // 1.23 = 123 - if (CMND_POWERSET == Energy.command_code) { + if (CMND_POWERSET == Energy->command_code) { if (XdrvMailbox.data_len && Bl09XX.power[channel]) { XdrvMailbox.payload = (Bl09XX.power[channel] * 100) / value; } } - else if (CMND_VOLTAGESET == Energy.command_code) { + else if (CMND_VOLTAGESET == Energy->command_code) { if (XdrvMailbox.data_len && Bl09XX.voltage) { XdrvMailbox.payload = (Bl09XX.voltage * 100) / value; } } - else if (CMND_CURRENTSET == Energy.command_code) { + else if (CMND_CURRENTSET == Energy->command_code) { if (XdrvMailbox.data_len && Bl09XX.current[channel]) { XdrvMailbox.payload = (Bl09XX.current[channel] * 100) / value; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_15_teleinfo.ino b/tasmota/tasmota_xnrg_energy/xnrg_15_teleinfo.ino index f04b5f730..c25025197 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_15_teleinfo.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_15_teleinfo.ino @@ -285,16 +285,16 @@ void DataCallback(struct _ValueList * me, uint8_t flags) // Voltage V (not present on all Smart Meter) if ( ilabel == LABEL_TENSION || ilabel == LABEL_URMS1 || ilabel == LABEL_URMS2 || ilabel == LABEL_URMS3) { - Energy.voltage_available = true; + Energy->voltage_available = true; float volt = (float) atoi(me->value); AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: Voltage %s=%s, now %d"), me->name, me->value, (int) volt); if ( ilabel == LABEL_URMS2) { - Energy.voltage[1] = volt; + Energy->voltage[1] = volt; } else if ( ilabel == LABEL_URMS3) { - Energy.voltage[2] = volt; + Energy->voltage[2] = volt; } else { - Energy.voltage[0] = volt; + Energy->voltage[0] = volt; } } @@ -304,25 +304,25 @@ void DataCallback(struct _ValueList * me, uint8_t flags) || ilabel == LABEL_IINST2 || ilabel == LABEL_IRMS2 || ilabel == LABEL_IINST3 || ilabel == LABEL_IRMS3 ) { - Energy.current_available = true; + Energy->current_available = true; float current = (float) atoi(me->value); AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: Current %s=%s, now %d"), me->name, me->value, (int) current); if (ilabel == LABEL_IINST2 || ilabel == LABEL_IRMS2) { - Energy.current[1] = current; + Energy->current[1] = current; } else if (ilabel == LABEL_IINST3 || ilabel == LABEL_IRMS3) { - Energy.phase_count = 3; - Energy.current[2] = current; + Energy->phase_count = 3; + Energy->current[2] = current; } else { - Energy.current[0] = current; + Energy->current[0] = current; } } // Power P else if (ilabel == LABEL_PAPP || ilabel == LABEL_SINSTS) { - Energy.active_power[0] = (float) atoi(me->value);; - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: Power %s, now %d"), me->value, (int) Energy.active_power[0]); + Energy->active_power[0] = (float) atoi(me->value);; + AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: Power %s, now %d"), me->value, (int) Energy->active_power[0]); } // Ok now not so real time values Does this value is new or changed? @@ -394,11 +394,11 @@ void DataCallback(struct _ValueList * me, uint8_t flags) AddLog (LOG_LEVEL_INFO, PSTR ("TIC: Total counter updated to %ld Wh"), total_wh); if (total_wh>0) { - Energy.total[0] = (float) total_wh / 1000.0f; - Energy.import_active[0] = Energy.total[0]; - //Energy.import_active[0] = (float)total/1000.0f; + Energy->total[0] = (float) total_wh / 1000.0f; + Energy->import_active[0] = Energy->total[0]; + //Energy->import_active[0] = (float)total/1000.0f; //EnergyUpdateTotal(); - AddLog (LOG_LEVEL_DEBUG_MORE, PSTR ("TIC: import_active[0]=%.3fKWh"), Energy.import_active[0] ); + AddLog (LOG_LEVEL_DEBUG_MORE, PSTR ("TIC: import_active[0]=%.3fKWh"), Energy->import_active[0] ); } } @@ -406,8 +406,8 @@ void DataCallback(struct _ValueList * me, uint8_t flags) else if ( ilabel == LABEL_EAST) { total_wh = atol(me->value); - Energy.total[0] = (float) total_wh / 1000.0f; - Energy.import_active[0] = Energy.total[0]; + Energy->total[0] = (float) total_wh / 1000.0f; + Energy->import_active[0] = Energy->total[0]; AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: Total:%ldWh"), total_wh); } @@ -591,7 +591,7 @@ Comments: - void NewFrameCallback(struct _ValueList * me) { // Reset Energy Watchdog - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; // Deprecated see setOption108 // send teleinfo MQTT raw data only if setup like that @@ -631,8 +631,8 @@ void TInfoDrvInit(void) { if (PinUsed(GPIO_TELEINFO_RX)) { tic_rx_pin = Pin(GPIO_TELEINFO_RX); TasmotaGlobal.energy_driver = XNRG_15; - Energy.voltage_available = false; - Energy.phase_count = 1; + Energy->voltage_available = false; + Energy->phase_count = 1; // init hardware energy counters total_wh = 0; Settings->flag3.hardware_energy_total = true; @@ -763,7 +763,7 @@ bool TInfoCmd(void) { //uint8_t name_len = strlen(D_NAME_TELEINFO); // At least "EnergyConfig" - if (CMND_ENERGYCONFIG == Energy.command_code) { + if (CMND_ENERGYCONFIG == Energy->command_code) { AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: len %d, data '%s'"), XdrvMailbox.data_len, XdrvMailbox.data ? XdrvMailbox.data : "null" ); @@ -1106,7 +1106,7 @@ void TInfoShow(bool json) { // Add new value (not part of TIC JSON Object) if (isousc) { - ResponseAppend_P(PSTR(",\"Load\":%d"),(int) ((Energy.current[0]*100.0f) / isousc)); + ResponseAppend_P(PSTR(",\"Load\":%d"),(int) ((Energy->current[0]*100.0f) / isousc)); } // add teleinfo TIC object @@ -1126,8 +1126,8 @@ void TInfoShow(bool json) uint8_t red, green, blue; char phase_color[8]; - for (int i=0; iphase_count ; i++ ) { + percent = (int) ((Energy->current[i]*100.0f) / isousc) ; if (percent > 100) { percent = 100; } @@ -1150,7 +1150,7 @@ void TInfoShow(bool json) } if (tinfo_mode==TINFO_MODE_HISTORIQUE ) { - if (Energy.phase_count==3) { + if (Energy->phase_count==3) { int imax[3]; for (int i=LABEL_IMAX1; i<=LABEL_IMAX3; i++) { if (getValueFromLabelIndex(i, value) ) { @@ -1177,7 +1177,7 @@ void TInfoShow(bool json) } } if (contrat && isousc) { - int percent = (int) ((Energy.current[0]*100.0f) / isousc) ; + int percent = (int) ((Energy->current[0]*100.0f) / isousc) ; GetTextIndexed(name, sizeof(name), contrat, kContratName); WSContentSend_P(HTTP_ENERGY_CONTRAT_TELEINFO, name, isousc); //WSContentSend_P(HTTP_ENERGY_LOAD_TELEINFO, percent); diff --git a/tasmota/tasmota_xnrg_energy/xnrg_16_iem3000.ino b/tasmota/tasmota_xnrg_energy/xnrg_16_iem3000.ino index 10f15afb1..5fbb007fb 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_16_iem3000.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_16_iem3000.ino @@ -83,7 +83,7 @@ void IEM3000Every250ms(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("SDM: Iem3000 error %d"), error); } else { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; // 0 1 2 3 4 5 6 7 8 // SA FC BC Fh Fl Sh Sl Cl Ch @@ -108,55 +108,55 @@ void IEM3000Every250ms(void) switch(Iem3000.read_state) { case 0: - Energy.current[0] = value; + Energy->current[0] = value; break; case 1: - Energy.current[1] = value; + Energy->current[1] = value; break; case 2: - Energy.current[2] = value; + Energy->current[2] = value; break; case 3: - Energy.voltage[0] = value; + Energy->voltage[0] = value; break; case 4: - Energy.voltage[1] = value; + Energy->voltage[1] = value; break; case 5: - Energy.voltage[2] = value; + Energy->voltage[2] = value; break; case 6: - Energy.active_power[0] = value*1000; + Energy->active_power[0] = value*1000; break; case 7: - Energy.active_power[1] = value*1000; + Energy->active_power[1] = value*1000; break; case 8: - Energy.active_power[2] = value*1000; + Energy->active_power[2] = value*1000; break; case 9: - Energy.frequency[0] = value; + Energy->frequency[0] = value; break; case 10: - Energy.import_active[0] = value64/1000.0; + Energy->import_active[0] = value64/1000.0; break; case 11: - Energy.import_active[1] = value64/1000.0; + Energy->import_active[1] = value64/1000.0; break; case 12: - Energy.import_active[2] = value64/1000.0; + Energy->import_active[2] = value64/1000.0; break; case 13: @@ -185,8 +185,8 @@ void Iem3000SnsInit(void) uint8_t result = Iem3000Modbus->Begin(IEM3000_SPEED); if (result) { if (2 == result) { ClaimSerial(); } - Energy.phase_count = 3; - Energy.frequency_common = true; // Use common frequency + Energy->phase_count = 3; + Energy->frequency_common = true; // Use common frequency } else { TasmotaGlobal.energy_driver = ENERGY_NONE; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_17_ornowe517.ino b/tasmota/tasmota_xnrg_energy/xnrg_17_ornowe517.ino index cbdb90d0f..4e7794908 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_17_ornowe517.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_17_ornowe517.ino @@ -84,9 +84,9 @@ void WE517Every250ms(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("ORNO: WE517 error %d"), error); } else { - Energy.data_valid[0] = 0; - Energy.data_valid[1] = 0; - Energy.data_valid[2] = 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 @@ -99,71 +99,71 @@ void WE517Every250ms(void) switch(We517.read_state) { case 0: - Energy.voltage[0] = value; + Energy->voltage[0] = value; break; case 1: - Energy.voltage[1] = value; + Energy->voltage[1] = value; break; case 2: - Energy.voltage[2] = value; + Energy->voltage[2] = value; break; case 3: - Energy.current[0] = value; + Energy->current[0] = value; break; case 4: - Energy.current[1] = value; + Energy->current[1] = value; break; case 5: - Energy.current[2] = value; + Energy->current[2] = value; break; case 6: - Energy.active_power[0] = value * 1000; + Energy->active_power[0] = value * 1000; break; case 7: - Energy.active_power[1] = value * 1000; + Energy->active_power[1] = value * 1000; break; case 8: - Energy.active_power[2] = value * 1000; + Energy->active_power[2] = value * 1000; break; case 9: - Energy.reactive_power[0] = value; + Energy->reactive_power[0] = value; break; case 10: - Energy.reactive_power[1] = value; + Energy->reactive_power[1] = value; break; case 11: - Energy.reactive_power[2] = value; + Energy->reactive_power[2] = value; break; case 12: - Energy.power_factor[0] = value; + Energy->power_factor[0] = value; break; case 13: - Energy.power_factor[1] = value; + Energy->power_factor[1] = value; break; case 14: - Energy.power_factor[2] = value; + Energy->power_factor[2] = value; break; case 15: - Energy.frequency[0] = value; + Energy->frequency[0] = value; break; case 16: - Energy.import_active[0] = value; + Energy->import_active[0] = value; EnergyUpdateTotal(); break; } @@ -192,8 +192,8 @@ void We517SnsInit(void) { Serial.begin(WE517_SPEED, SERIAL_8E1); ClaimSerial(); } - Energy.phase_count = 3; - Energy.frequency_common = true; // Use common frequency + Energy->phase_count = 3; + Energy->frequency_common = true; // Use common frequency } else { TasmotaGlobal.energy_driver = ENERGY_NONE; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_18_sdm72.ino b/tasmota/tasmota_xnrg_energy/xnrg_18_sdm72.ino index bde9d90df..b058b09c0 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_18_sdm72.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_18_sdm72.ino @@ -76,7 +76,7 @@ void Sdm72Every250ms(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("SDM: SDM72 error %d"), error); } else { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; float value; ((uint8_t*)&value)[3] = buffer[3]; // Get float values @@ -86,7 +86,7 @@ void Sdm72Every250ms(void) switch(Sdm72.read_state) { case 0: - Energy.active_power[0] = value; // W + Energy->active_power[0] = value; // W break; case 1: @@ -103,18 +103,18 @@ void Sdm72Every250ms(void) break; case 4: - Energy.import_active[0] = value; // kWh + Energy->import_active[0] = value; // kWh break; case 5: - Energy.export_active[0] = value; // kWh + Energy->export_active[0] = value; // kWh break; #endif // SDM72_IMPEXP } ++Sdm72.read_state %= nitems(sdm72_register); if (0 == Sdm72.read_state && !isnan(Sdm72.total_active)) { - Energy.import_active[0] = Sdm72.total_active; + Energy->import_active[0] = Sdm72.total_active; EnergyUpdateTotal(); } } @@ -144,8 +144,8 @@ void Sdm72SnsInit(void) void Sdm72DrvInit(void) { if (PinUsed(GPIO_SDM72_RX) && PinUsed(GPIO_SDM72_TX)) { - Energy.voltage_available = false; - Energy.current_available = false; + Energy->voltage_available = false; + Energy->current_available = false; TasmotaGlobal.energy_driver = XNRG_18; } } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_19_cse7761.ino b/tasmota/tasmota_xnrg_energy/xnrg_19_cse7761.ino index 71e675e1b..a75035b5b 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_19_cse7761.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_19_cse7761.ino @@ -458,28 +458,28 @@ void Cse7761GetData(void) { CSE7761Data.current_rms[0], CSE7761Data.current_rms[1], CSE7761Data.active_power[0], CSE7761Data.active_power[1]); - if (Energy.power_on) { // Powered on + if (Energy->power_on) { // Powered on // Voltage = RmsU * RmsUC * 10 / 0x400000 - // Energy.voltage[0] = (float)(((uint64_t)CSE7761Data.voltage_rms * CSE7761Data.coefficient[RmsUC] * 10) >> 22) / 1000; // V - Energy.voltage[0] = ((float)CSE7761Data.voltage_rms / Settings->energy_voltage_calibration); // V + // Energy->voltage[0] = (float)(((uint64_t)CSE7761Data.voltage_rms * CSE7761Data.coefficient[RmsUC] * 10) >> 22) / 1000; // V + Energy->voltage[0] = ((float)CSE7761Data.voltage_rms / Settings->energy_voltage_calibration); // V #ifdef CSE7761_FREQUENCY - Energy.frequency[0] = (CSE7761Data.frequency) ? ((float)Settings->energy_frequency_calibration / 8 / CSE7761Data.frequency) : 0; // Hz + Energy->frequency[0] = (CSE7761Data.frequency) ? ((float)Settings->energy_frequency_calibration / 8 / CSE7761Data.frequency) : 0; // Hz #endif for (uint32_t channel = 0; channel < 2; channel++) { - Energy.data_valid[channel] = 0; + Energy->data_valid[channel] = 0; uint32_t power_calibration = EnergyGetCalibration(channel, ENERGY_POWER_CALIBRATION); // Active power = PowerPA * PowerPAC * 1000 / 0x80000000 - // Energy.active_power[channel] = (float)(((uint64_t)CSE7761Data.active_power[channel] * CSE7761Data.coefficient[PowerPAC + channel] * 1000) >> 31) / 1000; // W - Energy.active_power[channel] = (float)CSE7761Data.active_power[channel] / power_calibration; // W - if (0 == Energy.active_power[channel]) { - Energy.current[channel] = 0; + // Energy->active_power[channel] = (float)(((uint64_t)CSE7761Data.active_power[channel] * CSE7761Data.coefficient[PowerPAC + channel] * 1000) >> 31) / 1000; // W + Energy->active_power[channel] = (float)CSE7761Data.active_power[channel] / power_calibration; // W + if (0 == Energy->active_power[channel]) { + Energy->current[channel] = 0; } else { uint32_t current_calibration = EnergyGetCalibration(channel, ENERGY_CURRENT_CALIBRATION); // Current = RmsIA * RmsIAC / 0x800000 - // Energy.current[channel] = (float)(((uint64_t)CSE7761Data.current_rms[channel] * CSE7761Data.coefficient[RmsIAC + channel]) >> 23) / 1000; // A - Energy.current[channel] = (float)CSE7761Data.current_rms[channel] / current_calibration; // A - CSE7761Data.energy[channel] += Energy.active_power[channel]; + // Energy->current[channel] = (float)(((uint64_t)CSE7761Data.current_rms[channel] * CSE7761Data.coefficient[RmsIAC + channel]) >> 23) / 1000; // A + Energy->current[channel] = (float)CSE7761Data.current_rms[channel] / current_calibration; // A + CSE7761Data.energy[channel] += Energy->active_power[channel]; CSE7761Data.energy_update[channel]++; } } @@ -563,7 +563,7 @@ void Cse7761EverySecond(void) { if (2 == CSE7761Data.ready) { for (uint32_t channel = 0; channel < 2; channel++) { if (CSE7761Data.energy_update[channel]) { - Energy.kWhtoday_delta[channel] += ((CSE7761Data.energy[channel] * 1000) / CSE7761Data.energy_update[channel]) / 36; + Energy->kWhtoday_delta[channel] += ((CSE7761Data.energy[channel] * 1000) / CSE7761Data.energy_update[channel]) / 36; CSE7761Data.energy[channel] = 0; CSE7761Data.energy_update[channel] = 0; } @@ -597,12 +597,12 @@ void Cse7761DrvInit(void) { if (PinUsed(GPIO_CSE7761_RX) && PinUsed(GPIO_CSE7761_TX)) { CSE7761Data.ready = 0; CSE7761Data.init = 4; // Init setup steps - Energy.phase_count = 2; // Handle two channels as two phases - Energy.voltage_common = true; // Use common voltage + Energy->phase_count = 2; // Handle two channels as two phases + Energy->voltage_common = true; // Use common voltage #ifdef CSE7761_FREQUENCY - Energy.frequency_common = true; // Use common frequency + Energy->frequency_common = true; // Use common frequency #endif - Energy.use_overtemp = true; // Use global temperature for overtemp detection + Energy->use_overtemp = true; // Use global temperature for overtemp detection TasmotaGlobal.energy_driver = XNRG_19; } } @@ -613,33 +613,33 @@ bool Cse7761Command(void) { uint32_t channel = (2 == XdrvMailbox.index) ? 1 : 0; uint32_t value = (uint32_t)(CharToFloat(XdrvMailbox.data) * 100); // 1.23 = 123 - if (CMND_POWERCAL == Energy.command_code) { + if (CMND_POWERCAL == Energy->command_code) { if (1 == XdrvMailbox.payload) { XdrvMailbox.payload = Cse7761Ref(PowerPAC); } // Service in xdrv_03_energy.ino } - else if (CMND_POWERSET == Energy.command_code) { + else if (CMND_POWERSET == Energy->command_code) { if (XdrvMailbox.data_len && CSE7761Data.active_power[channel]) { if ((value > 100) && (value < 200000)) { // Between 1W and 2000W XdrvMailbox.payload = ((CSE7761Data.active_power[channel]) / value) * 100; } } } - else if (CMND_VOLTAGECAL == Energy.command_code) { + else if (CMND_VOLTAGECAL == Energy->command_code) { if (1 == XdrvMailbox.payload) { XdrvMailbox.payload = Cse7761Ref(RmsUC); } // Service in xdrv_03_energy.ino } - else if (CMND_VOLTAGESET == Energy.command_code) { + else if (CMND_VOLTAGESET == Energy->command_code) { if (XdrvMailbox.data_len && CSE7761Data.voltage_rms) { if ((value > 10000) && (value < 26000)) { // Between 100V and 260V XdrvMailbox.payload = (CSE7761Data.voltage_rms * 100) / value; } } } - else if (CMND_CURRENTCAL == Energy.command_code) { + else if (CMND_CURRENTCAL == Energy->command_code) { if (1 == XdrvMailbox.payload) { XdrvMailbox.payload = Cse7761Ref(RmsIAC); } // Service in xdrv_03_energy.ino } - else if (CMND_CURRENTSET == Energy.command_code) { + else if (CMND_CURRENTSET == Energy->command_code) { if (XdrvMailbox.data_len && CSE7761Data.current_rms[channel]) { if ((value > 1000) && (value < 1000000)) { // Between 10mA and 10A XdrvMailbox.payload = ((CSE7761Data.current_rms[channel] * 100) / value) * 1000; @@ -647,11 +647,11 @@ bool Cse7761Command(void) { } } #ifdef CSE7761_FREQUENCY - else if (CMND_FREQUENCYCAL == Energy.command_code) { + else if (CMND_FREQUENCYCAL == Energy->command_code) { if (1 == XdrvMailbox.payload) { XdrvMailbox.payload = CSE7761_FREF; } // Service in xdrv_03_energy.ino } - else if (CMND_FREQUENCYSET == Energy.command_code) { + else if (CMND_FREQUENCYSET == Energy->command_code) { if (XdrvMailbox.data_len && CSE7761Data.frequency) { if ((value > 4500) && (value < 6500)) { // Between 45.00Hz and 65.00Hz XdrvMailbox.payload = (CSE7761Data.frequency * 8 * value) / 100; diff --git a/tasmota/tasmota_xnrg_energy/xnrg_21_sdm230.ino b/tasmota/tasmota_xnrg_energy/xnrg_21_sdm230.ino index 90f16f566..f851b8110 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_21_sdm230.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_21_sdm230.ino @@ -58,7 +58,7 @@ const uint16_t sdm230_start_addresses[] { 0x0046, // SDM230_FREQUENCY [Hz] 0X0048, // SDM230_IMPORT_ACTIVE [kWh] 0X004A, // SDM230_EXPORT_ACTIVE [kWh] -// 0X0156, // SDM230_TOTAL_ENERGY_ACTIVE [kWh] // = SDM230_IMPORT_ACTIVE = Energy.total +// 0X0156, // SDM230_TOTAL_ENERGY_ACTIVE [kWh] // = SDM230_IMPORT_ACTIVE = Energy->total // read more registers offered by SDM230 (may cause timing issues) #ifdef SDM230_MORE_REGS @@ -106,7 +106,7 @@ void SDM230Every250ms(void) if (error) { AddLog(LOG_LEVEL_DEBUG, PSTR("SDM: SDM230 error %d"), error); } else { - Energy.data_valid[0] = 0; + Energy->data_valid[0] = 0; // 0 1 2 3 4 5 6 7 8 // SA FC BC Fh Fl Sh Sl Cl Ch @@ -119,39 +119,39 @@ void SDM230Every250ms(void) switch(Sdm230.read_state) { case 0: - Energy.voltage[0] = value; // 230.2 V + Energy->voltage[0] = value; // 230.2 V break; case 1: - Energy.current[0] = value; // 1.260 A + Energy->current[0] = value; // 1.260 A break; case 2: - Energy.active_power[0] = value; // -196.3 W + Energy->active_power[0] = value; // -196.3 W break; case 3: - Energy.apparent_power[0] = value; // 223.4 VA + Energy->apparent_power[0] = value; // 223.4 VA break; case 4: - Energy.reactive_power[0] = value; // 92.2 + Energy->reactive_power[0] = value; // 92.2 break; case 5: - Energy.power_factor[0] = value; // -0.91 + Energy->power_factor[0] = value; // -0.91 break; case 6: - Energy.frequency[0] = value; // 50.0 Hz + Energy->frequency[0] = value; // 50.0 Hz break; case 7: - Energy.import_active[0] = value; // 6.216 kWh => used in EnergyUpdateTotal() + Energy->import_active[0] = value; // 6.216 kWh => used in EnergyUpdateTotal() break; case 8: - Energy.export_active[0] = value; // 478.492 kWh + Energy->export_active[0] = value; // 478.492 kWh break; #ifdef SDM230_MORE_REGS @@ -192,8 +192,8 @@ void Sdm230SnsInit(void) uint8_t result = Sdm230Modbus->Begin(SDM230_SPEED); if (result) { if (2 == result) { ClaimSerial(); } - Energy.phase_count = 1; - Energy.frequency_common = true; // Use common frequency + Energy->phase_count = 1; + Energy->frequency_common = true; // Use common frequency } else { TasmotaGlobal.energy_driver = ENERGY_NONE; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_22_bl6523.ino b/tasmota/tasmota_xnrg_energy/xnrg_22_bl6523.ino index 2bdd3eff4..383b19073 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_22_bl6523.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_22_bl6523.ino @@ -162,16 +162,16 @@ RX: 35 0C TX: 00 00 00 F3 (WATT_HR) switch(rx_buffer[1]) { case BL6523_REG_AMPS : - Energy.current[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_current_calibration; // 1.260 A + Energy->current[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_current_calibration; // 1.260 A break; case BL6523_REG_VOLTS : - Energy.voltage[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_voltage_calibration; // 230.2 V + Energy->voltage[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_voltage_calibration; // 230.2 V break; case BL6523_REG_FREQ : - Energy.frequency[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_frequency_calibration; // 50.0 Hz + Energy->frequency[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_frequency_calibration; // 50.0 Hz break; case BL6523_REG_WATTS : - Energy.active_power[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_power_calibration; // -196.3 W + Energy->active_power[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_power_calibration; // -196.3 W break; case BL6523_REG_POWF : /* Power factor =(sign bit)*((PF[22]×2^-1)+(PF[21]×2^-2)+。。。) @@ -185,15 +185,15 @@ switch(rx_buffer[1]) { powf_word = powf_word & (0x7fffff >> (1+i)); } powf = (powf_buf >> 23) ? (0.0f - (powf)) : powf; // Negate if sign bit(24) is set - Energy.power_factor[SINGLE_PHASE] = powf; + Energy->power_factor[SINGLE_PHASE] = powf; break; case BL6523_REG_WATTHR : - Energy.import_active[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / ( Settings->energy_power_calibration - BL6523_PWHRREF_D ); // 6.216 kWh => used in EnergyUpdateTotal() + Energy->import_active[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / ( Settings->energy_power_calibration - BL6523_PWHRREF_D ); // 6.216 kWh => used in EnergyUpdateTotal() break; default : break; } - Energy.data_valid[SINGLE_PHASE] = 0; + Energy->data_valid[SINGLE_PHASE] = 0; EnergyUpdateTotal(); if (!Bl6523.discovery_triggered) { @@ -239,7 +239,7 @@ void Bl6523Init(void) ClaimSerial(); } Bl6523.type = 1; - Energy.phase_count = 1; + Energy->phase_count = 1; AddLog(LOG_LEVEL_DEBUG, PSTR("BL6:Init Success" )); } else @@ -256,46 +256,46 @@ bool Bl6523Command(void) { int32_t value = (int32_t)(CharToFloat(XdrvMailbox.data) * 1000); // 1.234 = 1234, -1.234 = -1234 uint32_t abs_value = abs(value) / 10; // 1.23 = 123, -1.23 = 123 - if ((CMND_POWERCAL == Energy.command_code) || (CMND_VOLTAGECAL == Energy.command_code) || (CMND_CURRENTCAL == Energy.command_code)) { + if ((CMND_POWERCAL == Energy->command_code) || (CMND_VOLTAGECAL == Energy->command_code) || (CMND_CURRENTCAL == Energy->command_code)) { // Service in xdrv_03_energy.ino } - else if (CMND_POWERSET == Energy.command_code) { + else if (CMND_POWERSET == Energy->command_code) { if (XdrvMailbox.data_len) { if ((abs_value > 100) && (abs_value < 200000)) { // Between 1.00 and 2000.00 W XdrvMailbox.payload = abs_value; } } } - else if (CMND_VOLTAGESET == Energy.command_code) { + else if (CMND_VOLTAGESET == Energy->command_code) { if (XdrvMailbox.data_len) { if ((abs_value > 10000) && (abs_value < 26000)) { // Between 100.00 and 260.00 V XdrvMailbox.payload = abs_value; } } } - else if (CMND_CURRENTSET == Energy.command_code) { + else if (CMND_CURRENTSET == Energy->command_code) { if (XdrvMailbox.data_len) { if ((abs_value > 1000) && (abs_value < 1000000)) { // Between 10.00 mA and 10.00000 A XdrvMailbox.payload = abs_value; } } } - else if (CMND_FREQUENCYSET == Energy.command_code) { + else if (CMND_FREQUENCYSET == Energy->command_code) { if (XdrvMailbox.data_len) { if ((abs_value > 4500) && (abs_value < 6500)) { // Between 45.00 and 65.00 Hz XdrvMailbox.payload = abs_value; } } } - else if (CMND_ENERGYCONFIG == Energy.command_code) { + else if (CMND_ENERGYCONFIG == Energy->command_code) { AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: Config index %d, payload %d, value %d, data '%s'"), XdrvMailbox.index, XdrvMailbox.payload, value, XdrvMailbox.data ? XdrvMailbox.data : "null" ); - // EnergyConfig1 to 3 = Set Energy.current[channel] in A like 0.417 for 417mA + // EnergyConfig1 to 3 = Set Energy->current[channel] in A like 0.417 for 417mA if ((XdrvMailbox.index > 0) && (XdrvMailbox.index < 4)) { //Bl6523.current[XdrvMailbox.index -1] = value; } - // EnergyConfig4 to 6 = Set Energy.active_power[channel] in W like 100 for 100W + // EnergyConfig4 to 6 = Set Energy->active_power[channel] in W like 100 for 100W if ((XdrvMailbox.index > 3) && (XdrvMailbox.index < 7)) { //Bl6523.power[XdrvMailbox.index -4] = value; } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_23_ade7880.ino b/tasmota/tasmota_xnrg_energy/xnrg_23_ade7880.ino index a11ab38f0..d4799833f 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_23_ade7880.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_23_ade7880.ino @@ -501,16 +501,16 @@ void Ade7880Cycle(void) { } Ade7880.neutral_current = (float)Ade7880ReadVerify(ADE7880_NIRMS) / 100000; // 0x43C6 for (uint32_t phase = 0; phase < 3; phase++) { - Energy.data_valid[phase] = 0; - Energy.voltage[phase] = (float)Ade7880ReadVerify(ADE7880_AVRMS + (phase * 2)) / 10000; // 0x43C1 - 0x0024CC94 = 241.1668 V - Energy.current[phase] = (float)Ade7880ReadVerify(ADE7880_AIRMS + (phase * 2)) / 100000; // 0x43C0 - 0x00002D6D = 0.11629 A - Energy.active_power[phase] = (float)Ade7880ReadVerify(ADE7880_AWATT + phase) / 100; // 0xE513 - 0xFFFFF524 = -27.79 W - Energy.apparent_power[phase] = (float)Ade7880ReadVerify(ADE7880_AVA + phase) / 100; // 0xE519 - 0xFFFFF50D - Energy.frequency[phase] = 256000.0f / Ade7880ReadVerify(ADE7880_APERIOD + phase); // 0xE905 - Page 34 and based on ADE7880_FREQ_INIT + Energy->data_valid[phase] = 0; + Energy->voltage[phase] = (float)Ade7880ReadVerify(ADE7880_AVRMS + (phase * 2)) / 10000; // 0x43C1 - 0x0024CC94 = 241.1668 V + Energy->current[phase] = (float)Ade7880ReadVerify(ADE7880_AIRMS + (phase * 2)) / 100000; // 0x43C0 - 0x00002D6D = 0.11629 A + Energy->active_power[phase] = (float)Ade7880ReadVerify(ADE7880_AWATT + phase) / 100; // 0xE513 - 0xFFFFF524 = -27.79 W + Energy->apparent_power[phase] = (float)Ade7880ReadVerify(ADE7880_AVA + phase) / 100; // 0xE519 - 0xFFFFF50D + Energy->frequency[phase] = 256000.0f / Ade7880ReadVerify(ADE7880_APERIOD + phase); // 0xE905 - Page 34 and based on ADE7880_FREQ_INIT // Suppose constant load during period of 100/120 periods as set by ADE7880_LINECYC disregards load change inbetween. // ADE7880_AWATT = 6713 = 67,13 W // 67,13 * 1000 / 36 = 1864 deca micro Wh (0.01864Wh) -// Energy.kWhtoday_delta[phase] += Energy.active_power[phase] * 1000 / 36; +// Energy->kWhtoday_delta[phase] += Energy->active_power[phase] * 1000 / 36; // By measuring load 1024000 times/second load change in 100/120 periods can be accounted for. // ADE7880_AWATT = 6713 = 67,13 W @@ -525,7 +525,7 @@ void Ade7880Cycle(void) { // 273 * 402653184 / 16384 = 6709248 = 67092,48W / 3600 = 1863 deca micro Wh // 273 * 24576 = 6709248 / 3600 = 1863 deca micro Wh int32_t active_energy = Ade7880ReadVerify(ADE7880_AWATTHR + phase); // 0xE400 - 0xFFFFFF8F = -0.112 - Energy.kWhtoday_delta[phase] += active_energy * 24576 / 3600; // Using int32_t allows loads up to 87kW (0x7FFFFFFF / 24576) + Energy->kWhtoday_delta[phase] += active_energy * 24576 / 3600; // Using int32_t allows loads up to 87kW (0x7FFFFFFF / 24576) } EnergyUpdateToday(); @@ -662,10 +662,10 @@ void Ade7880DrvInit(void) { Ade7880Defaults(); if (Ade7880SetCalibrate()) { - Energy.phase_count = 3; // Three phases + Energy->phase_count = 3; // Three phases // Settings->flag5.energy_phase = 1; // SetOption129 - (Energy) Show phase information -// Energy.use_overtemp = true; // Use global temperature for overtemp detection - Energy.local_energy_active_export = true; +// Energy->use_overtemp = true; // Use global temperature for overtemp detection + Energy->local_energy_active_export = true; TasmotaGlobal.energy_driver = XNRG_23; } } @@ -675,7 +675,7 @@ void Ade7880DrvInit(void) { bool Ade7880Command(void) { bool serviced = false; - if (CMND_ENERGYCONFIG == Energy.command_code) { + if (CMND_ENERGYCONFIG == Energy->command_code) { // Non-pesistent settings // EnergyConfig {"rms":{"current_a":3166385,"current_b":3125691,"current_c":3131983,"current_s":1756557,"voltage_a":-767262,"voltage_b":-763439,"voltage_c":-749854},"angles":{"angle0":180,"angle1":176,"angle2":176},"powers":{"totactive": {"a":-1345820,"b":-1347328,"c":-1351979}},"freq":0} // EnergyConfig {"rms":{"voltage_c":-549854}} diff --git a/tasmota/tasmota_xnrg_energy/xnrg_29_modbus.ino b/tasmota/tasmota_xnrg_energy/xnrg_29_modbus.ino index a98f94fe2..8dde49a5a 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_29_modbus.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_29_modbus.ino @@ -216,7 +216,7 @@ void EnergyModbusLoop(void) { * Cl = CRC lsb * Ch = CRC msb */ - Energy.data_valid[NrgMbsParam.phase] = 0; + Energy->data_valid[NrgMbsParam.phase] = 0; float value; switch (NrgMbsReg[NrgMbsParam.state].datatype) { @@ -293,31 +293,31 @@ void EnergyModbusLoop(void) { switch (NrgMbsParam.state) { case NRG_MBS_VOLTAGE: - Energy.voltage[NrgMbsParam.phase] = value; // 230.2 V + Energy->voltage[NrgMbsParam.phase] = value; // 230.2 V break; case NRG_MBS_CURRENT: - Energy.current[NrgMbsParam.phase] = value; // 1.260 A + Energy->current[NrgMbsParam.phase] = value; // 1.260 A break; case NRG_MBS_ACTIVE_POWER: - Energy.active_power[NrgMbsParam.phase] = value; // -196.3 W + Energy->active_power[NrgMbsParam.phase] = value; // -196.3 W break; case NRG_MBS_APPARENT_POWER: - Energy.apparent_power[NrgMbsParam.phase] = value; // 223.4 VA + Energy->apparent_power[NrgMbsParam.phase] = value; // 223.4 VA break; case NRG_MBS_REACTIVE_POWER: - Energy.reactive_power[NrgMbsParam.phase] = value; // 92.2 + Energy->reactive_power[NrgMbsParam.phase] = value; // 92.2 break; case NRG_MBS_POWER_FACTOR: - Energy.power_factor[NrgMbsParam.phase] = value; // -0.91 + Energy->power_factor[NrgMbsParam.phase] = value; // -0.91 break; case NRG_MBS_FREQUENCY: - Energy.frequency[NrgMbsParam.phase] = value; // 50.0 Hz + Energy->frequency[NrgMbsParam.phase] = value; // 50.0 Hz break; case NRG_MBS_TOTAL_ENERGY: - Energy.import_active[NrgMbsParam.phase] = value; // 6.216 kWh => used in EnergyUpdateTotal() + Energy->import_active[NrgMbsParam.phase] = value; // 6.216 kWh => used in EnergyUpdateTotal() break; case NRG_MBS_EXPORT_ACTIVE_ENERGY: - Energy.export_active[NrgMbsParam.phase] = value; // 478.492 kWh + Energy->export_active[NrgMbsParam.phase] = value; // 478.492 kWh break; default: if (NrgMbsUser) { @@ -334,7 +334,7 @@ void EnergyModbusLoop(void) { uint32_t phase = 0; do { NrgMbsParam.phase++; - if (NrgMbsParam.phase >= Energy.phase_count) { + if (NrgMbsParam.phase >= Energy->phase_count) { NrgMbsParam.phase = 0; NrgMbsParam.state++; if (NrgMbsParam.state >= NrgMbsParam.total_regs) { @@ -434,8 +434,8 @@ bool EnergyModbusReadUserRegisters(JsonParserObject user_add_value, uint32_t add if (!phase) { return false; // No register entered so skip } - if (phase > Energy.phase_count) { - Energy.phase_count = phase; + if (phase > Energy->phase_count) { + Energy->phase_count = phase; NrgMbsParam.devices = 1; // Only one device allowed with multiple phases } @@ -514,7 +514,7 @@ bool EnergyModbusReadRegisters(void) { if (!root) { return false; } // Invalid JSON // Init defaults - Energy.phase_count = 1; + Energy->phase_count = 1; NrgMbsParam.serial_bps = ENERGY_MODBUS_SPEED; NrgMbsParam.serial_config = ENERGY_MODBUS_CONFIG; NrgMbsParam.ticker_poll = ENERGY_MODBUS_TICKER_POLL; @@ -603,8 +603,8 @@ bool EnergyModbusReadRegisters(void) { // Get default energy registers char register_name[32]; - Energy.voltage_available = false; // Disable voltage is measured - Energy.current_available = false; // Disable current is measured + Energy->voltage_available = false; // Disable voltage is measured + Energy->current_available = false; // Disable current is measured for (uint32_t names = 0; names < NRG_MBS_MAX_REGS; names++) { val = root[GetTextIndexed(register_name, sizeof(register_name), names, kEnergyModbusValues)]; if (val) { @@ -631,24 +631,24 @@ bool EnergyModbusReadRegisters(void) { NrgMbsReg[names].address[0] = val.getUInt(); phase++; } - if (phase > Energy.phase_count) { - Energy.phase_count = phase; + if (phase > Energy->phase_count) { + Energy->phase_count = phase; NrgMbsParam.devices = 1; // Only one device allowed with multiple phases } switch(names) { case NRG_MBS_VOLTAGE: - Energy.voltage_available = true; // Enable if voltage is measured + Energy->voltage_available = true; // Enable if voltage is measured if (1 == phase) { - Energy.voltage_common = true; // Use common voltage + Energy->voltage_common = true; // Use common voltage } break; case NRG_MBS_CURRENT: - Energy.current_available = true; // Enable if current is measured + Energy->current_available = true; // Enable if current is measured break; case NRG_MBS_FREQUENCY: if (1 == phase) { - Energy.frequency_common = true; // Use common frequency + Energy->frequency_common = true; // Use common frequency } break; case NRG_MBS_TOTAL_ENERGY: @@ -707,9 +707,9 @@ bool EnergyModbusReadRegisters(void) { } if (NrgMbsParam.devices > 1) { // Multiple devices have no common values - Energy.phase_count = NrgMbsParam.devices; - Energy.voltage_common = false; // Use no common voltage - Energy.frequency_common = false; // Use no common frequency + Energy->phase_count = NrgMbsParam.devices; + Energy->voltage_common = false; // Use no common voltage + Energy->frequency_common = false; // Use no common frequency Settings->flag5.energy_phase = 1; // SetOption129 - (Energy) Show phase information } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino b/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino index 1a661b91a..dd198e8ad 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino @@ -53,25 +53,25 @@ struct { } NrgDummy; void NrgDummyEverySecond(void) { - if (Energy.power_on) { // Powered on - for (uint32_t channel = 0; channel < Energy.phase_count; channel++) { + if (Energy->power_on) { // Powered on + for (uint32_t channel = 0; channel < Energy->phase_count; channel++) { float power_calibration = (float)EnergyGetCalibration(channel, ENERGY_POWER_CALIBRATION) / 100; float voltage_calibration = (float)EnergyGetCalibration(channel, ENERGY_VOLTAGE_CALIBRATION) / 100; float current_calibration = (float)EnergyGetCalibration(channel, ENERGY_CURRENT_CALIBRATION) / 100000; float frequency_calibration = (float)EnergyGetCalibration(channel, ENERGY_FREQUENCY_CALIBRATION) / 100; - Energy.voltage[channel] = voltage_calibration; // V - Energy.frequency[channel] = frequency_calibration; // Hz + Energy->voltage[channel] = voltage_calibration; // V + Energy->frequency[channel] = frequency_calibration; // Hz if (bitRead(TasmotaGlobal.power, channel)) { // Emulate power read only if device is powered on - Energy.active_power[channel] = (NrgDummy.power[channel]) ? ((float)NrgDummy.power[channel] / 1000) : power_calibration; // W - if (0 == Energy.active_power[channel]) { - Energy.current[channel] = 0; + Energy->active_power[channel] = (NrgDummy.power[channel]) ? ((float)NrgDummy.power[channel] / 1000) : power_calibration; // W + if (0 == Energy->active_power[channel]) { + Energy->current[channel] = 0; } else { - Energy.current[channel] = (NrgDummy.current[channel]) ? ((float)NrgDummy.current[channel] / 1000) : current_calibration; // A - Energy.kWhtoday_delta[channel] += Energy.active_power[channel] * 1000 / 36; + Energy->current[channel] = (NrgDummy.current[channel]) ? ((float)NrgDummy.current[channel] / 1000) : current_calibration; // A + Energy->kWhtoday_delta[channel] += Energy->active_power[channel] * 1000 / 36; } - Energy.data_valid[channel] = 0; + Energy->data_valid[channel] = 0; } } EnergyUpdateToday(); @@ -84,46 +84,46 @@ bool NrgDummyCommand(void) { int32_t value = (int32_t)(CharToFloat(XdrvMailbox.data) * 1000); // 1.234 = 1234, -1.234 = -1234 uint32_t abs_value = abs(value) / 10; // 1.23 = 123, -1.23 = 123 - if ((CMND_POWERCAL == Energy.command_code) || (CMND_VOLTAGECAL == Energy.command_code) || (CMND_CURRENTCAL == Energy.command_code)) { + if ((CMND_POWERCAL == Energy->command_code) || (CMND_VOLTAGECAL == Energy->command_code) || (CMND_CURRENTCAL == Energy->command_code)) { // Service in xdrv_03_energy.ino } - else if (CMND_POWERSET == Energy.command_code) { + else if (CMND_POWERSET == Energy->command_code) { if (XdrvMailbox.data_len) { if ((abs_value >= 100) && (abs_value <= 16000000)) { // Between 1.00 and 160000.00 W XdrvMailbox.payload = abs_value; } } } - else if (CMND_VOLTAGESET == Energy.command_code) { + else if (CMND_VOLTAGESET == Energy->command_code) { if (XdrvMailbox.data_len) { if ((abs_value >= 10000) && (abs_value <= 40000)) { // Between 100.00 and 400.00 V XdrvMailbox.payload = abs_value; } } } - else if (CMND_CURRENTSET == Energy.command_code) { + else if (CMND_CURRENTSET == Energy->command_code) { if (XdrvMailbox.data_len) { if ((abs_value >= 1000) && (abs_value <= 40000000)) { // Between 10.00 mA and 400.00000 A XdrvMailbox.payload = abs_value; } } } - else if (CMND_FREQUENCYSET == Energy.command_code) { + else if (CMND_FREQUENCYSET == Energy->command_code) { if (XdrvMailbox.data_len) { if ((abs_value >= 4500) && (abs_value <= 6500)) { // Between 45.00 and 65.00 Hz XdrvMailbox.payload = abs_value; } } } - else if (CMND_ENERGYCONFIG == Energy.command_code) { + else if (CMND_ENERGYCONFIG == Energy->command_code) { AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: Config index %d, payload %d, value %d, data '%s'"), XdrvMailbox.index, XdrvMailbox.payload, value, XdrvMailbox.data ? XdrvMailbox.data : "null" ); - // EnergyConfig1 to 3 = Set Energy.current[channel] in A like 0.417 for 417mA + // EnergyConfig1 to 3 = Set Energy->current[channel] in A like 0.417 for 417mA if ((XdrvMailbox.index > 0) && (XdrvMailbox.index < 4)) { NrgDummy.current[XdrvMailbox.index -1] = value; } - // EnergyConfig4 to 6 = Set Energy.active_power[channel] in W like 100 for 100W + // EnergyConfig4 to 6 = Set Energy->active_power[channel] in W like 100 for 100W if ((XdrvMailbox.index > 3) && (XdrvMailbox.index < 7)) { NrgDummy.power[XdrvMailbox.index -4] = value; } @@ -145,11 +145,11 @@ void NrgDummyDrvInit(void) { Settings->energy_power_calibration2 = NRG_DUMMY_PREF; } - Energy.phase_count = (TasmotaGlobal.devices_present < ENERGY_MAX_PHASES) ? TasmotaGlobal.devices_present : ENERGY_MAX_PHASES; - Energy.voltage_common = NRG_DUMMY_U_COMMON; // Phase voltage = false, Common voltage = true - Energy.frequency_common = NRG_DUMMY_F_COMMON; // Phase frequency = false, Common frequency = true - Energy.type_dc = NRG_DUMMY_DC; // AC = false, DC = true; - Energy.use_overtemp = NRG_DUMMY_OVERTEMP; // Use global temperature for overtemp detection + Energy->phase_count = (TasmotaGlobal.devices_present < ENERGY_MAX_PHASES) ? TasmotaGlobal.devices_present : ENERGY_MAX_PHASES; + Energy->voltage_common = NRG_DUMMY_U_COMMON; // Phase voltage = false, Common voltage = true + Energy->frequency_common = NRG_DUMMY_F_COMMON; // Phase frequency = false, Common frequency = true + Energy->type_dc = NRG_DUMMY_DC; // AC = false, DC = true; + Energy->use_overtemp = NRG_DUMMY_OVERTEMP; // Use global temperature for overtemp detection TasmotaGlobal.energy_driver = XNRG_30; } diff --git a/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino index 9a85c149b..b57503b2c 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino @@ -1899,11 +1899,11 @@ void MI32createPolyline(char *polyline, uint8_t *history){ #ifdef USE_MI_ESP32_ENERGY void MI32sendEnergyWidget(){ - if (Energy.current_available && Energy.voltage_available) { - WSContentSend_P(HTTP_MI32_POWER_WIDGET,MIBLEsensors.size()+1, Energy.voltage,Energy.current[1]); + if (Energy->current_available && Energy->voltage_available) { + WSContentSend_P(HTTP_MI32_POWER_WIDGET,MIBLEsensors.size()+1, Energy->voltage,Energy->current[1]); char _polyline[176]; MI32createPolyline(_polyline,MI32.energy_history); - WSContentSend_P(PSTR("

" D_POWERUSAGE ": %.1f " D_UNIT_WATT ""),Energy.active_power); + WSContentSend_P(PSTR("

" D_POWERUSAGE ": %.1f " D_UNIT_WATT ""),Energy->active_power); WSContentSend_P(HTTP_MI32_GRAPH,_polyline,185,124,124,_polyline,1); WSContentSend_P(PSTR("

")); } @@ -2243,7 +2243,7 @@ void MI32Show(bool json) #ifdef USE_MI_EXT_GUI Mi32invalidateOldHistory(); #ifdef USE_MI_ESP32_ENERGY - MI32addHistory(MI32.energy_history,Energy.active_power[0],100); //TODO: which value?? + MI32addHistory(MI32.energy_history,Energy->active_power[0],100); //TODO: which value?? #endif //USE_MI_ESP32_ENERGY #endif //USE_MI_EXT_GUI vTaskResume(MI32.ScanTask); diff --git a/tasmota/tasmota_xsns_sensor/xsns_75_prometheus.ino b/tasmota/tasmota_xsns_sensor/xsns_75_prometheus.ino index 56b507c61..f09257919 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_75_prometheus.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_75_prometheus.ino @@ -260,19 +260,19 @@ void HandleMetrics(void) { #ifdef USE_ENERGY_SENSOR WritePromMetricDec(PSTR("energy_voltage_volts"), kPromMetricGauge, - Energy.voltage[0], Settings->flag2.voltage_resolution, nullptr); + Energy->voltage[0], Settings->flag2.voltage_resolution, nullptr); WritePromMetricDec(PSTR("energy_current_amperes"), kPromMetricGauge, - Energy.current[0], Settings->flag2.current_resolution, nullptr); + Energy->current[0], Settings->flag2.current_resolution, nullptr); WritePromMetricDec(PSTR("energy_power_active_watts"), kPromMetricGauge, - Energy.active_power[0], Settings->flag2.wattage_resolution, nullptr); + Energy->active_power[0], Settings->flag2.wattage_resolution, nullptr); WritePromMetricDec(PSTR("energy_power_kilowatts_daily"), kPromMetricCounter, - Energy.daily_sum, Settings->flag2.energy_resolution, nullptr); + Energy->daily_sum, Settings->flag2.energy_resolution, nullptr); WritePromMetricDec(PSTR("energy_power_kilowatts_total"), kPromMetricCounter, - Energy.total_sum, Settings->flag2.energy_resolution, nullptr); + Energy->total_sum, Settings->flag2.energy_resolution, nullptr); #endif for (uint32_t device = 0; device < TasmotaGlobal.devices_present; device++) {
) - bool no_label = Energy.voltage_common || (1 == Energy.phase_count); - for (uint32_t i = 0; i < Energy.phase_count; i++) { + bool no_label = Energy->voltage_common || (1 == Energy->phase_count); + for (uint32_t i = 0; i < Energy->phase_count; i++) { WSContentSend_P(PSTR("%s%s{e}")); // Last column is units ({e} =