Add Energy Export Active support to BL0906 (Athom EM2/EM6)

This commit is contained in:
Theo Arends 2024-09-27 18:08:22 +02:00
parent 692a0ca4b1
commit 452031fbbd
3 changed files with 47 additions and 14 deletions

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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