Update energy structure

This commit is contained in:
Theo Arends 2024-07-02 18:47:55 +02:00
parent 640aabe1b3
commit 1fd8de6762
3 changed files with 46 additions and 46 deletions

View File

@ -131,9 +131,9 @@ typedef struct {
bool max_current_flag;
#ifdef USE_ENERGY_POWER_LIMIT
uint16_t mplh_counter;
uint16_t mplw_counter;
uint8_t mplr_counter;
uint16_t mpl_hold_counter;
uint16_t mpl_window_counter;
uint8_t mpl_retry_counter;
uint8_t max_energy_state;
#endif // USE_ENERGY_POWER_LIMIT
#endif // USE_ENERGY_MARGIN_DETECTION
@ -567,34 +567,34 @@ void EnergyMarginCheck(void) {
// 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->mpl_hold_counter) {
Energy->mpl_hold_counter = Settings->energy_max_power_limit_hold;
} else {
Energy->mplh_counter--;
if (!Energy->mplh_counter) {
Energy->mpl_hold_counter--;
if (!Energy->mpl_hold_counter) {
ResponseTime_P(PSTR(",\"" D_JSON_MAXPOWERREACHED "\":%d}"), energy_power_u);
MqttPublishPrefixTopicRulesProcess_P(STAT, S_RSLT_WARNING);
EnergyMqttShow();
SetAllPower(POWER_OFF_FORCE, SRC_MAXPOWER);
if (!Energy->mplr_counter) {
Energy->mplr_counter = Settings->param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count
if (!Energy->mpl_retry_counter) {
Energy->mpl_retry_counter = Settings->param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count
}
Energy->mplw_counter = Settings->energy_max_power_limit_window;
Energy->mpl_window_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->mpl_hold_counter = 0;
Energy->mpl_retry_counter = 0;
Energy->mpl_window_counter = 0;
}
if (!TasmotaGlobal.power) {
if (Energy->mplw_counter) {
Energy->mplw_counter--;
if (Energy->mpl_window_counter) {
Energy->mpl_window_counter--;
} else {
if (Energy->mplr_counter) {
Energy->mplr_counter--;
if (Energy->mplr_counter) {
if (Energy->mpl_retry_counter) {
Energy->mpl_retry_counter--;
if (Energy->mpl_retry_counter) {
ResponseTime_P(PSTR(",\"" D_JSON_POWERMONITOR "\":\"%s\"}"), GetStateText(1));
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR));
RestorePower(true, SRC_MAXPOWER);

View File

@ -181,8 +181,8 @@ typedef struct {
float daily_sum_export_balanced; // 123.123 kWh
uint16_t power_history[ENERGY_MAX_PHASES][3];
uint16_t mplh_counter[ENERGY_MAX_PHASES];
uint16_t mplw_counter[ENERGY_MAX_PHASES];
uint16_t mpl_hold_counter[ENERGY_MAX_PHASES];
uint16_t mpl_window_counter[ENERGY_MAX_PHASES];
uint8_t data_valid[ENERGY_MAX_PHASES];
uint8_t phase_count; // Number of phases active
@ -190,7 +190,7 @@ typedef struct {
uint8_t command_code;
uint8_t power_steady_counter; // Allow for power on stabilization
uint8_t margin_stable;
uint8_t mplr_counter[ENERGY_MAX_PHASES];
uint8_t mpl_retry_counter[ENERGY_MAX_PHASES];
uint8_t max_energy_state[ENERGY_MAX_PHASES];
uint8_t hour;
@ -837,11 +837,11 @@ void EnergyMarginCheck(void) {
bool power_on = (TasmotaGlobal.power & (1 << phase));
// if (Energy->active_power[phase] > Energy->Settings.phase[phase].max_power_limit) {
if (energy_power_u > Energy->Settings.phase[phase].max_power_limit) {
if (!Energy->mplh_counter[phase]) {
Energy->mplh_counter[phase] = Energy->Settings.phase[phase].max_power_limit_hold +1;
if (!Energy->mpl_hold_counter[phase]) {
Energy->mpl_hold_counter[phase] = Energy->Settings.phase[phase].max_power_limit_hold +1;
}
Energy->mplh_counter[phase]--;
if (!Energy->mplh_counter[phase]) {
Energy->mpl_hold_counter[phase]--;
if (!Energy->mpl_hold_counter[phase]) {
ResponseTime_P(PSTR(",\"" D_JSON_MAXPOWERREACHED "%d\":%d}"), phase +1, energy_power_u);
MqttPublishPrefixTopicRulesProcess_P(STAT, S_RSLT_WARNING);
EnergyMqttShow();
@ -850,24 +850,24 @@ void EnergyMarginCheck(void) {
} else {
ExecuteCommandPower(phase +1, POWER_OFF_FORCE, SRC_MAXPOWER);
}
if (!Energy->mplr_counter[phase]) {
Energy->mplr_counter[phase] = Settings->param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count
if (!Energy->mpl_retry_counter[phase]) {
Energy->mpl_retry_counter[phase] = Settings->param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count
}
Energy->mplw_counter[phase] = Energy->Settings.phase[phase].max_power_limit_window;
Energy->mpl_window_counter[phase] = Energy->Settings.phase[phase].max_power_limit_window;
}
}
else if (power_on && (energy_power_u <= Energy->Settings.phase[phase].max_power_limit)) {
Energy->mplh_counter[phase] = 0;
Energy->mplr_counter[phase] = 0;
Energy->mplw_counter[phase] = 0;
Energy->mpl_hold_counter[phase] = 0;
Energy->mpl_retry_counter[phase] = 0;
Energy->mpl_window_counter[phase] = 0;
}
if (!power_on) {
if (Energy->mplw_counter[phase]) {
Energy->mplw_counter[phase]--;
if (Energy->mpl_window_counter[phase]) {
Energy->mpl_window_counter[phase]--;
} else {
if (Energy->mplr_counter[phase]) {
Energy->mplr_counter[phase]--;
if (Energy->mplr_counter[phase]) {
if (Energy->mpl_retry_counter[phase]) {
Energy->mpl_retry_counter[phase]--;
if (Energy->mpl_retry_counter[phase]) {
ResponseTime_P(PSTR(",\"" D_JSON_POWERMONITOR "%d\":\"%s\"}"), phase +1, GetStateText(1));
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR));
if (set_all_power) {

View File

@ -83,16 +83,16 @@ extern "C" {
{ "import_active", offsetof(tEnergy, import_active[0]), 0, 0, ctypes_float, 0 },
{ "import_active_2", offsetof(tEnergy, import_active[1]), 0, 0, ctypes_float, 0 },
{ "import_active_3", offsetof(tEnergy, import_active[2]), 0, 0, ctypes_float, 0 },
{ "max_current_flag", offsetof(tEnergy, max_current_flag), 0, 0, ctypes_u8, 0 },
{ "max_energy_state", offsetof(tEnergy, max_energy_state), 0, 0, ctypes_u8, 0 },
{ "max_power_flag", offsetof(tEnergy, max_power_flag), 0, 0, ctypes_u8, 0 },
{ "max_voltage_flag", offsetof(tEnergy, max_voltage_flag), 0, 0, ctypes_u8, 0 },
{ "min_current_flag", offsetof(tEnergy, min_current_flag), 0, 0, ctypes_u8, 0 },
{ "min_power_flag", offsetof(tEnergy, min_power_flag), 0, 0, ctypes_u8, 0 },
{ "min_voltage_flag", offsetof(tEnergy, min_voltage_flag), 0, 0, ctypes_u8, 0 },
{ "mplh_counter", offsetof(tEnergy, mplh_counter), 0, 0, ctypes_u16, 0 },
{ "mplr_counter", offsetof(tEnergy, mplr_counter), 0, 0, ctypes_u8, 0 },
{ "mplw_counter", offsetof(tEnergy, mplw_counter), 0, 0, ctypes_u16, 0 },
{ "max_current_flag", offsetof(tEnergy, max_current_flag[0]), 0, 0, ctypes_u8, 0 },
{ "max_energy_state", offsetof(tEnergy, max_energy_state[0]), 0, 0, ctypes_u8, 0 },
{ "max_power_flag", offsetof(tEnergy, max_power_flag[0]), 0, 0, ctypes_u8, 0 },
{ "max_voltage_flag", offsetof(tEnergy, max_voltage_flag[0]), 0, 0, ctypes_u8, 0 },
{ "min_current_flag", offsetof(tEnergy, min_current_flag[0]), 0, 0, ctypes_u8, 0 },
{ "min_power_flag", offsetof(tEnergy, min_power_flag[0]), 0, 0, ctypes_u8, 0 },
{ "min_voltage_flag", offsetof(tEnergy, min_voltage_flag[0]), 0, 0, ctypes_u8, 0 },
{ "mpl_hold_counter", offsetof(tEnergy, mpl_hold_counter[0]), 0, 0, ctypes_u16, 0 },
{ "mpl_retry_counter", offsetof(tEnergy, mpl_retry_counter[0]), 0, 0, ctypes_u8, 0 },
{ "mpl_window_counter", offsetof(tEnergy, mpl_window_counter[0]), 0, 0, ctypes_u16, 0 },
{ "period", offsetof(tEnergy, period_kWh[0]), 0, 0, ctypes_float, 0 },
{ "period_2", offsetof(tEnergy, period_kWh[1]), 0, 0, ctypes_float, 0 },
{ "period_3", offsetof(tEnergy, period_kWh[2]), 0, 0, ctypes_float, 0 },