mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 19:26:37 +00:00
Add absolute PowerDelta
Add absolute PowerDelta using command PowerDelta 101..32000 where 101 = 101-100 = 1W, 202 = 202-100 = 102W (#5901)
This commit is contained in:
parent
63320f76f8
commit
9f55ab6a2a
@ -1,6 +1,7 @@
|
|||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* 6.6.0.20 20191018
|
* 6.6.0.20 20191018
|
||||||
* Add command SetOption65 0/1 to disable (1) fast power cycle detection fixing unwanted brownout trigger
|
* Add command SetOption65 0/1 to disable (1) fast power cycle detection fixing unwanted brownout trigger
|
||||||
|
* Add absolute PowerDelta using command PowerDelta 101..32000 where 101 = 101-100 = 1W, 202 = 202-100 = 102W (#5901)
|
||||||
*
|
*
|
||||||
* 6.6.0.19 20191018
|
* 6.6.0.19 20191018
|
||||||
* Replace obsolete xsns_23_sdm120 with xnrg_08_sdm120 and consolidate define USE_SDM120
|
* Replace obsolete xsns_23_sdm120 with xnrg_08_sdm120 and consolidate define USE_SDM120
|
||||||
|
@ -259,7 +259,7 @@ struct SYSCFG {
|
|||||||
int16_t toffset[2]; // 30E
|
int16_t toffset[2]; // 30E
|
||||||
uint8_t display_font; // 312
|
uint8_t display_font; // 312
|
||||||
char state_text[4][11]; // 313
|
char state_text[4][11]; // 313
|
||||||
uint8_t ex_energy_power_delta; // 33F
|
uint8_t ex_energy_power_delta; // 33F - Free since 6.6.0.20
|
||||||
uint16_t domoticz_update_timer; // 340
|
uint16_t domoticz_update_timer; // 340
|
||||||
uint16_t pwm_range; // 342
|
uint16_t pwm_range; // 342
|
||||||
unsigned long domoticz_relay_idx[MAX_DOMOTICZ_IDX]; // 344
|
unsigned long domoticz_relay_idx[MAX_DOMOTICZ_IDX]; // 344
|
||||||
|
@ -104,9 +104,9 @@ struct ENERGY {
|
|||||||
bool power_on = true;
|
bool power_on = true;
|
||||||
|
|
||||||
#ifdef USE_ENERGY_MARGIN_DETECTION
|
#ifdef USE_ENERGY_MARGIN_DETECTION
|
||||||
float power_history[3] = { 0 };
|
uint16_t power_history[3] = { 0 };
|
||||||
uint8_t power_steady_counter = 8; // Allow for power on stabilization
|
uint8_t power_steady_counter = 8; // Allow for power on stabilization
|
||||||
uint8_t power_delta = 0;
|
bool power_delta = false;
|
||||||
bool min_power_flag = false;
|
bool min_power_flag = false;
|
||||||
bool max_power_flag = false;
|
bool max_power_flag = false;
|
||||||
bool min_voltage_flag = false;
|
bool min_voltage_flag = false;
|
||||||
@ -279,41 +279,39 @@ bool EnergyMargin(bool type, uint16_t margin, uint16_t value, bool &flag, bool &
|
|||||||
|
|
||||||
void EnergyMarginCheck(void)
|
void EnergyMarginCheck(void)
|
||||||
{
|
{
|
||||||
uint16_t energy_daily_u = 0;
|
|
||||||
uint16_t energy_power_u = 0;
|
|
||||||
uint16_t energy_voltage_u = 0;
|
|
||||||
uint16_t energy_current_u = 0;
|
|
||||||
bool flag;
|
|
||||||
bool jsonflg;
|
|
||||||
|
|
||||||
if (Energy.power_steady_counter) {
|
if (Energy.power_steady_counter) {
|
||||||
Energy.power_steady_counter--;
|
Energy.power_steady_counter--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t energy_power_u = (uint16_t)(Energy.active_power[0]);
|
||||||
|
|
||||||
if (Settings.energy_power_delta) {
|
if (Settings.energy_power_delta) {
|
||||||
float delta = abs(Energy.power_history[0] - Energy.active_power[0]);
|
uint16_t delta = abs(Energy.power_history[0] - energy_power_u);
|
||||||
// Any delta compared to minimal delta
|
uint16_t min_power = (Energy.power_history[0] > energy_power_u) ? energy_power_u : Energy.power_history[0];
|
||||||
float min_power = (Energy.power_history[0] > Energy.active_power[0]) ? Energy.active_power[0] : Energy.power_history[0];
|
|
||||||
if (((delta / min_power) * 100) > Settings.energy_power_delta) {
|
DEBUG_DRIVER_LOG(PSTR("NRG: Delta %d, Power %d"), delta, min_power);
|
||||||
Energy.power_delta = 1;
|
|
||||||
|
if ( ((Settings.energy_power_delta < 101) && (((delta * 100) / min_power) > Settings.energy_power_delta)) || // 1..100 = Percentage
|
||||||
|
((Settings.energy_power_delta > 100) && (delta > (Settings.energy_power_delta -100))) ) { // 101..32000 = Absolute
|
||||||
|
Energy.power_delta = true;
|
||||||
Energy.power_history[1] = Energy.active_power[0]; // We only want one report so reset history
|
Energy.power_history[1] = Energy.active_power[0]; // We only want one report so reset history
|
||||||
Energy.power_history[2] = Energy.active_power[0];
|
Energy.power_history[2] = Energy.active_power[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Energy.power_history[0] = Energy.power_history[1]; // Shift in history every second allowing power changes to settle for up to three seconds
|
Energy.power_history[0] = Energy.power_history[1]; // Shift in history every second allowing power changes to settle for up to three seconds
|
||||||
Energy.power_history[1] = Energy.power_history[2];
|
Energy.power_history[1] = Energy.power_history[2];
|
||||||
Energy.power_history[2] = Energy.active_power[0];
|
Energy.power_history[2] = energy_power_u;
|
||||||
|
|
||||||
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)) {
|
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)) {
|
||||||
energy_power_u = (uint16_t)(Energy.active_power[0]);
|
uint16_t energy_voltage_u = (uint16_t)(Energy.voltage[0]);
|
||||||
energy_voltage_u = (uint16_t)(Energy.voltage[0]);
|
uint16_t energy_current_u = (uint16_t)(Energy.current[0] * 1000);
|
||||||
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);
|
DEBUG_DRIVER_LOG(PSTR("NRG: W %d, U %d, I %d"), energy_power_u, energy_voltage_u, energy_current_u);
|
||||||
|
|
||||||
Response_P(PSTR("{"));
|
Response_P(PSTR("{"));
|
||||||
jsonflg = false;
|
bool flag;
|
||||||
|
bool jsonflg = false;
|
||||||
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));
|
ResponseAppend_P(PSTR("%s\"" D_CMND_POWERLOW "\":\"%s\""), (jsonflg)?",":"", GetStateText(flag));
|
||||||
jsonflg = true;
|
jsonflg = true;
|
||||||
@ -392,7 +390,7 @@ void EnergyMarginCheck(void)
|
|||||||
|
|
||||||
// Max Energy
|
// Max Energy
|
||||||
if (Settings.energy_max_energy) {
|
if (Settings.energy_max_energy) {
|
||||||
energy_daily_u = (uint16_t)(Energy.daily * 1000);
|
uint16_t energy_daily_u = (uint16_t)(Energy.daily * 1000);
|
||||||
if (!Energy.max_energy_state && (RtcTime.hour == Settings.energy_max_energy_start)) {
|
if (!Energy.max_energy_state && (RtcTime.hour == Settings.energy_max_energy_start)) {
|
||||||
Energy.max_energy_state = 1;
|
Energy.max_energy_state = 1;
|
||||||
ResponseTime_P(PSTR(",\"" D_JSON_ENERGYMONITOR "\":\"%s\"}"), GetStateText(1));
|
ResponseTime_P(PSTR(",\"" D_JSON_ENERGYMONITOR "\":\"%s\"}"), GetStateText(1));
|
||||||
@ -424,7 +422,7 @@ void EnergyMqttShow(void)
|
|||||||
tele_period = tele_period_save;
|
tele_period = tele_period_save;
|
||||||
ResponseJsonEnd();
|
ResponseJsonEnd();
|
||||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
|
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
|
||||||
Energy.power_delta = 0;
|
Energy.power_delta = false;
|
||||||
}
|
}
|
||||||
#endif // USE_ENERGY_MARGIN_DETECTION
|
#endif // USE_ENERGY_MARGIN_DETECTION
|
||||||
|
|
||||||
@ -708,10 +706,10 @@ void CmndModuleAddress(void)
|
|||||||
#ifdef USE_ENERGY_MARGIN_DETECTION
|
#ifdef USE_ENERGY_MARGIN_DETECTION
|
||||||
void CmndPowerDelta(void)
|
void CmndPowerDelta(void)
|
||||||
{
|
{
|
||||||
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 101)) {
|
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 32000)) {
|
||||||
Settings.energy_power_delta = XdrvMailbox.payload;
|
Settings.energy_power_delta = XdrvMailbox.payload;
|
||||||
}
|
}
|
||||||
EnergyCommandResponse(Settings.energy_power_delta, UNIT_PERCENTAGE);
|
EnergyCommandResponse(Settings.energy_power_delta, (Settings.energy_power_delta < 101) ? UNIT_PERCENTAGE : UNIT_WATT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CmndPowerLow(void)
|
void CmndPowerLow(void)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user