diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index 67dc050d1..6b2f992d3 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -86,6 +86,7 @@ typedef struct { float import_active[ENERGY_MAX_PHASES]; // 123.123 kWh float export_active[ENERGY_MAX_PHASES]; // 123.123 kWh float start_energy[ENERGY_MAX_PHASES]; // 12345.12345 kWh total previous + float start_export_energy[ENERGY_MAX_PHASES]; // 12345.12345 kWh total previous float daily[ENERGY_MAX_PHASES]; // 123.123 kWh float total[ENERGY_MAX_PHASES]; // 12345.12345 kWh total energy float daily_sum; // 123.123 kWh @@ -357,9 +358,14 @@ 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 + Energy->start_export_energy[i] = (float)(RtcSettings.energy_kWhexport_ph[i]) / 1000; // Init after restart } 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->local_energy_active_export && (Energy->active_power[i] < 0)) { + RtcSettings.energy_kWhexport_ph[i] = (int32_t)((Energy->start_export_energy[i] + Energy->import_active[i] - Energy->start_energy[i]) * 1000); + } else { + 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 @@ -779,13 +785,18 @@ void CmndEnergyToday(void) { } void CmndEnergyExportActive(void) { - if (Energy->local_energy_active_export) { - // EnergyExportActive1 24 - // EnergyExportActive1 24,1650111291 - uint32_t values[2] = { 0 }; - uint32_t params = ParseParameters(2, values); + // EnergyExportActive 0 - Disable local energy_active_export support + // EnergyExportActive 1 - Enable local energy_active_export support + 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)) { + if (!XdrvMailbox.usridx) { + Energy->local_energy_active_export = values[0] &1; + } + else if (Energy->local_energy_active_export) { + // EnergyExportActive1 24 + // EnergyExportActive1 24,1650111291 uint32_t phase = XdrvMailbox.index -1; // Reset Energy Export Active RtcSettings.energy_kWhexport_ph[phase] = (int32_t)values[0]; @@ -794,7 +805,12 @@ void CmndEnergyExportActive(void) { Settings->energy_kWhtotal_time = values[1]; } } + } + if (Energy->local_energy_active_export) { ResponseCmndEnergyTotalYesterdayToday(); + } else { + Energy->export_active[0] = NAN; // Disable display of unused export_active + ResponseCmndStateText(Energy->local_energy_active_export); } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index 848f99d1c..536301409 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -163,6 +163,7 @@ typedef struct { float import_active[ENERGY_MAX_PHASES]; // 123.123 kWh float export_active[ENERGY_MAX_PHASES]; // 123.123 kWh float start_energy[ENERGY_MAX_PHASES]; // 12345.12345 kWh total previous + float start_export_energy[ENERGY_MAX_PHASES]; // 12345.12345 kWh total previous float total[ENERGY_MAX_PHASES]; // 12345.12345 kWh total energy float daily_sum; // 123.123 kWh float total_sum; // 12345.12345 kWh total energy @@ -613,9 +614,14 @@ 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 + Energy->start_export_energy[i] = RtcEnergySettings.energy_export_kWh[i]; // Init after restart } 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->local_energy_active_export && (Energy->active_power[i] < 0)) { + RtcEnergySettings.energy_export_kWh[i] = Energy->start_export_energy[i] + Energy->import_active[i] - Energy->start_energy[i]; + } else { + 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 @@ -1095,13 +1101,18 @@ void CmndEnergyToday(void) { } void CmndEnergyExportActive(void) { - if (Energy->local_energy_active_export) { - // EnergyExportActive1 24 - // EnergyExportActive1 24,1650111291 - uint32_t values[2] = { 0 }; - uint32_t params = ParseParameters(2, values); + // EnergyExportActive 0 - Disable local energy_active_export support + // EnergyExportActive 1 - Enable local energy_active_export support + 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)) { + if (!XdrvMailbox.usridx) { + Energy->local_energy_active_export = values[0] &1; + } + else if (Energy->local_energy_active_export) { + // EnergyExportActive1 24 + // EnergyExportActive1 24,1650111291 uint32_t phase = XdrvMailbox.index -1; // Reset Energy Export Active RtcEnergySettings.energy_export_kWh[phase] = (float)(int32_t)values[0] / 1000; @@ -1110,7 +1121,12 @@ void CmndEnergyExportActive(void) { Energy->Settings.energy_kWhtotal_time = values[1]; } } + } + if (Energy->local_energy_active_export) { ResponseCmndEnergyTotalYesterdayToday(); + } else { + Energy->export_active[0] = NAN; // Disable display of unused export_active + ResponseCmndStateText(Energy->local_energy_active_export); } } diff --git a/tasmota/tasmota_xnrg_energy/xnrg_24_bl0906.ino b/tasmota/tasmota_xnrg_energy/xnrg_24_bl0906.ino index 3826b0f85..dd15ca117 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_24_bl0906.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_24_bl0906.ino @@ -27,6 +27,7 @@ * SetOption21 1 - Display Voltage * SetOption129 1 - Display energy for each phase instead of single sum * SetOption150 1 - Display no common voltage/frequency + * EnergyExportActive 1 - Enable display of Export Active energy based on negative Active Power \*********************************************************************************************/ #define XNRG_24 24