mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 19:56:30 +00:00
Update energy structure
This commit is contained in:
parent
640aabe1b3
commit
1fd8de6762
@ -131,9 +131,9 @@ typedef struct {
|
|||||||
bool max_current_flag;
|
bool max_current_flag;
|
||||||
|
|
||||||
#ifdef USE_ENERGY_POWER_LIMIT
|
#ifdef USE_ENERGY_POWER_LIMIT
|
||||||
uint16_t mplh_counter;
|
uint16_t mpl_hold_counter;
|
||||||
uint16_t mplw_counter;
|
uint16_t mpl_window_counter;
|
||||||
uint8_t mplr_counter;
|
uint8_t mpl_retry_counter;
|
||||||
uint8_t max_energy_state;
|
uint8_t max_energy_state;
|
||||||
#endif // USE_ENERGY_POWER_LIMIT
|
#endif // USE_ENERGY_POWER_LIMIT
|
||||||
#endif // USE_ENERGY_MARGIN_DETECTION
|
#endif // USE_ENERGY_MARGIN_DETECTION
|
||||||
@ -567,34 +567,34 @@ void EnergyMarginCheck(void) {
|
|||||||
// Max Power
|
// Max Power
|
||||||
if (Settings->energy_max_power_limit) {
|
if (Settings->energy_max_power_limit) {
|
||||||
if (Energy->active_power[0] > Settings->energy_max_power_limit) {
|
if (Energy->active_power[0] > Settings->energy_max_power_limit) {
|
||||||
if (!Energy->mplh_counter) {
|
if (!Energy->mpl_hold_counter) {
|
||||||
Energy->mplh_counter = Settings->energy_max_power_limit_hold;
|
Energy->mpl_hold_counter = Settings->energy_max_power_limit_hold;
|
||||||
} else {
|
} else {
|
||||||
Energy->mplh_counter--;
|
Energy->mpl_hold_counter--;
|
||||||
if (!Energy->mplh_counter) {
|
if (!Energy->mpl_hold_counter) {
|
||||||
ResponseTime_P(PSTR(",\"" D_JSON_MAXPOWERREACHED "\":%d}"), energy_power_u);
|
ResponseTime_P(PSTR(",\"" D_JSON_MAXPOWERREACHED "\":%d}"), energy_power_u);
|
||||||
MqttPublishPrefixTopicRulesProcess_P(STAT, S_RSLT_WARNING);
|
MqttPublishPrefixTopicRulesProcess_P(STAT, S_RSLT_WARNING);
|
||||||
EnergyMqttShow();
|
EnergyMqttShow();
|
||||||
SetAllPower(POWER_OFF_FORCE, SRC_MAXPOWER);
|
SetAllPower(POWER_OFF_FORCE, SRC_MAXPOWER);
|
||||||
if (!Energy->mplr_counter) {
|
if (!Energy->mpl_retry_counter) {
|
||||||
Energy->mplr_counter = Settings->param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count
|
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)) {
|
else if (TasmotaGlobal.power && (energy_power_u <= Settings->energy_max_power_limit)) {
|
||||||
Energy->mplh_counter = 0;
|
Energy->mpl_hold_counter = 0;
|
||||||
Energy->mplr_counter = 0;
|
Energy->mpl_retry_counter = 0;
|
||||||
Energy->mplw_counter = 0;
|
Energy->mpl_window_counter = 0;
|
||||||
}
|
}
|
||||||
if (!TasmotaGlobal.power) {
|
if (!TasmotaGlobal.power) {
|
||||||
if (Energy->mplw_counter) {
|
if (Energy->mpl_window_counter) {
|
||||||
Energy->mplw_counter--;
|
Energy->mpl_window_counter--;
|
||||||
} else {
|
} else {
|
||||||
if (Energy->mplr_counter) {
|
if (Energy->mpl_retry_counter) {
|
||||||
Energy->mplr_counter--;
|
Energy->mpl_retry_counter--;
|
||||||
if (Energy->mplr_counter) {
|
if (Energy->mpl_retry_counter) {
|
||||||
ResponseTime_P(PSTR(",\"" D_JSON_POWERMONITOR "\":\"%s\"}"), GetStateText(1));
|
ResponseTime_P(PSTR(",\"" D_JSON_POWERMONITOR "\":\"%s\"}"), GetStateText(1));
|
||||||
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR));
|
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR));
|
||||||
RestorePower(true, SRC_MAXPOWER);
|
RestorePower(true, SRC_MAXPOWER);
|
||||||
|
@ -181,8 +181,8 @@ typedef struct {
|
|||||||
float daily_sum_export_balanced; // 123.123 kWh
|
float daily_sum_export_balanced; // 123.123 kWh
|
||||||
|
|
||||||
uint16_t power_history[ENERGY_MAX_PHASES][3];
|
uint16_t power_history[ENERGY_MAX_PHASES][3];
|
||||||
uint16_t mplh_counter[ENERGY_MAX_PHASES];
|
uint16_t mpl_hold_counter[ENERGY_MAX_PHASES];
|
||||||
uint16_t mplw_counter[ENERGY_MAX_PHASES];
|
uint16_t mpl_window_counter[ENERGY_MAX_PHASES];
|
||||||
|
|
||||||
uint8_t data_valid[ENERGY_MAX_PHASES];
|
uint8_t data_valid[ENERGY_MAX_PHASES];
|
||||||
uint8_t phase_count; // Number of phases active
|
uint8_t phase_count; // Number of phases active
|
||||||
@ -190,7 +190,7 @@ typedef struct {
|
|||||||
uint8_t command_code;
|
uint8_t command_code;
|
||||||
uint8_t power_steady_counter; // Allow for power on stabilization
|
uint8_t power_steady_counter; // Allow for power on stabilization
|
||||||
uint8_t margin_stable;
|
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 max_energy_state[ENERGY_MAX_PHASES];
|
||||||
uint8_t hour;
|
uint8_t hour;
|
||||||
|
|
||||||
@ -837,11 +837,11 @@ void EnergyMarginCheck(void) {
|
|||||||
bool power_on = (TasmotaGlobal.power & (1 << phase));
|
bool power_on = (TasmotaGlobal.power & (1 << phase));
|
||||||
// if (Energy->active_power[phase] > Energy->Settings.phase[phase].max_power_limit) {
|
// 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_power_u > Energy->Settings.phase[phase].max_power_limit) {
|
||||||
if (!Energy->mplh_counter[phase]) {
|
if (!Energy->mpl_hold_counter[phase]) {
|
||||||
Energy->mplh_counter[phase] = Energy->Settings.phase[phase].max_power_limit_hold +1;
|
Energy->mpl_hold_counter[phase] = Energy->Settings.phase[phase].max_power_limit_hold +1;
|
||||||
}
|
}
|
||||||
Energy->mplh_counter[phase]--;
|
Energy->mpl_hold_counter[phase]--;
|
||||||
if (!Energy->mplh_counter[phase]) {
|
if (!Energy->mpl_hold_counter[phase]) {
|
||||||
ResponseTime_P(PSTR(",\"" D_JSON_MAXPOWERREACHED "%d\":%d}"), phase +1, energy_power_u);
|
ResponseTime_P(PSTR(",\"" D_JSON_MAXPOWERREACHED "%d\":%d}"), phase +1, energy_power_u);
|
||||||
MqttPublishPrefixTopicRulesProcess_P(STAT, S_RSLT_WARNING);
|
MqttPublishPrefixTopicRulesProcess_P(STAT, S_RSLT_WARNING);
|
||||||
EnergyMqttShow();
|
EnergyMqttShow();
|
||||||
@ -850,24 +850,24 @@ void EnergyMarginCheck(void) {
|
|||||||
} else {
|
} else {
|
||||||
ExecuteCommandPower(phase +1, POWER_OFF_FORCE, SRC_MAXPOWER);
|
ExecuteCommandPower(phase +1, POWER_OFF_FORCE, SRC_MAXPOWER);
|
||||||
}
|
}
|
||||||
if (!Energy->mplr_counter[phase]) {
|
if (!Energy->mpl_retry_counter[phase]) {
|
||||||
Energy->mplr_counter[phase] = Settings->param[P_MAX_POWER_RETRY] +1; // SetOption33 - Max Power Retry count
|
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)) {
|
else if (power_on && (energy_power_u <= Energy->Settings.phase[phase].max_power_limit)) {
|
||||||
Energy->mplh_counter[phase] = 0;
|
Energy->mpl_hold_counter[phase] = 0;
|
||||||
Energy->mplr_counter[phase] = 0;
|
Energy->mpl_retry_counter[phase] = 0;
|
||||||
Energy->mplw_counter[phase] = 0;
|
Energy->mpl_window_counter[phase] = 0;
|
||||||
}
|
}
|
||||||
if (!power_on) {
|
if (!power_on) {
|
||||||
if (Energy->mplw_counter[phase]) {
|
if (Energy->mpl_window_counter[phase]) {
|
||||||
Energy->mplw_counter[phase]--;
|
Energy->mpl_window_counter[phase]--;
|
||||||
} else {
|
} else {
|
||||||
if (Energy->mplr_counter[phase]) {
|
if (Energy->mpl_retry_counter[phase]) {
|
||||||
Energy->mplr_counter[phase]--;
|
Energy->mpl_retry_counter[phase]--;
|
||||||
if (Energy->mplr_counter[phase]) {
|
if (Energy->mpl_retry_counter[phase]) {
|
||||||
ResponseTime_P(PSTR(",\"" D_JSON_POWERMONITOR "%d\":\"%s\"}"), phase +1, GetStateText(1));
|
ResponseTime_P(PSTR(",\"" D_JSON_POWERMONITOR "%d\":\"%s\"}"), phase +1, GetStateText(1));
|
||||||
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR));
|
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR));
|
||||||
if (set_all_power) {
|
if (set_all_power) {
|
||||||
|
@ -83,16 +83,16 @@ extern "C" {
|
|||||||
{ "import_active", offsetof(tEnergy, import_active[0]), 0, 0, ctypes_float, 0 },
|
{ "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_2", offsetof(tEnergy, import_active[1]), 0, 0, ctypes_float, 0 },
|
||||||
{ "import_active_3", offsetof(tEnergy, import_active[2]), 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_current_flag", offsetof(tEnergy, max_current_flag[0]), 0, 0, ctypes_u8, 0 },
|
||||||
{ "max_energy_state", offsetof(tEnergy, max_energy_state), 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, 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, 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, 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, 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, ctypes_u8, 0 },
|
{ "min_voltage_flag", offsetof(tEnergy, min_voltage_flag[0]), 0, 0, ctypes_u8, 0 },
|
||||||
{ "mplh_counter", offsetof(tEnergy, mplh_counter), 0, 0, ctypes_u16, 0 },
|
{ "mpl_hold_counter", offsetof(tEnergy, mpl_hold_counter[0]), 0, 0, ctypes_u16, 0 },
|
||||||
{ "mplr_counter", offsetof(tEnergy, mplr_counter), 0, 0, ctypes_u8, 0 },
|
{ "mpl_retry_counter", offsetof(tEnergy, mpl_retry_counter[0]), 0, 0, ctypes_u8, 0 },
|
||||||
{ "mplw_counter", offsetof(tEnergy, mplw_counter), 0, 0, ctypes_u16, 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", offsetof(tEnergy, period_kWh[0]), 0, 0, ctypes_float, 0 },
|
||||||
{ "period_2", offsetof(tEnergy, period_kWh[1]), 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 },
|
{ "period_3", offsetof(tEnergy, period_kWh[2]), 0, 0, ctypes_float, 0 },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user