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} | | Head1 | | Head2 | | Head3 | | {e}
// {s} | | Head1 | | Head2 | | Head3 | | Head4 | | {e}
WSContentSend_P(PSTR(" {t}{s} | | ")); // First column is empty ({t} = , {s} = )
- 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 | | "), (no_label)?"":"L", (no_label)?"":itoa(i +1, value_chr, 10));
}
WSContentSend_P(PSTR("{e}")); // Last column is units ({e} = |
)
#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++) {