diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 959c83d8d..c0d3a1434 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -5,6 +5,7 @@ * Add additional time offset to Wifi Retry based on device mac address (#2089) * Add command Color6 RRGGBB for Clock hour marker color and command Rotation pixels for Clock rotation (#2092) * Add HTML language header in local language (#2123) + * Add command PowerDelta 0..100 (percentage) to Energy monitoring devices to report on active power load change (#2157) * Fix MAX31850 higher temperatures (#1269) * * 5.12.0d diff --git a/sonoff/i18n.h b/sonoff/i18n.h index 7508e3bf8..4bfa45866 100644 --- a/sonoff/i18n.h +++ b/sonoff/i18n.h @@ -275,6 +275,7 @@ // Commands xdrv_03_energy.ino #define D_CMND_POWERLOW "PowerLow" #define D_CMND_POWERHIGH "PowerHigh" +#define D_CMND_POWERDELTA "PowerDelta" #define D_CMND_VOLTAGELOW "VoltageLow" #define D_CMND_VOLTAGEHIGH "VoltageHigh" #define D_CMND_CURRENTLOW "CurrentLow" @@ -359,6 +360,7 @@ enum UnitNames { UNIT_MILLISECOND, UNIT_MINUTE, UNIT_PPM, + UNIT_PERCENTAGE, UNIT_PRESSURE, UNIT_SECOND, UNIT_SECTORS, @@ -376,6 +378,7 @@ const char kUnitNames[] PROGMEM = D_UNIT_MILLISECOND "|" D_UNIT_MINUTE "|" D_UNIT_PARTS_PER_MILLION "|" + "%|" D_UNIT_PRESSURE "|" D_UNIT_SECOND "|" D_UNIT_SECTORS "|" diff --git a/sonoff/settings.h b/sonoff/settings.h index 3cdedb488..54c5116ab 100644 --- a/sonoff/settings.h +++ b/sonoff/settings.h @@ -149,9 +149,7 @@ struct SYSCFG { uint8_t ledstate; // 2FB uint8_t param[PARAM8_SIZE]; // 2FC was domoticz_in_topic until 5.1.6 char state_text[4][11]; // 313 - - byte free_33F[1]; // 33F - + uint8_t energy_power_delta; // 33F uint16_t domoticz_update_timer; // 340 uint16_t pwm_range; // 342 diff --git a/sonoff/settings.ino b/sonoff/settings.ino index 72bbcf5fc..503ebfb86 100644 --- a/sonoff/settings.ino +++ b/sonoff/settings.ino @@ -509,6 +509,7 @@ void SettingsDefaultSet2() // Settings.domoticz_switch_idx[i] = 0; } + Settings.energy_power_delta = 80; Settings.energy_power_calibration = HLW_PREF_PULSE; Settings.energy_voltage_calibration = HLW_UREF_PULSE; Settings.energy_current_calibration = HLW_IREF_PULSE; @@ -889,6 +890,7 @@ void SettingsDelta() } if (Settings.version < 0x050C0005) { Settings.light_rotation = 0; + Settings.energy_power_delta = 80; char fingerprint[60]; memcpy(fingerprint, Settings.mqtt_fingerprint, sizeof(fingerprint)); char *p = fingerprint; diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h index df588119c..c90b31550 100644 --- a/sonoff/sonoff.h +++ b/sonoff/sonoff.h @@ -71,11 +71,12 @@ typedef unsigned long power_t; // Power (Relay) type //#define PWM_FREQ 910 // 100..1000 Hz led refresh (iTead value) #define PWM_FREQ 880 // 100..1000 Hz led refresh (BN-SZ01 value) -#define MAX_POWER_HOLD 10 // Time in SECONDS to allow max agreed power (Pow) -#define MAX_POWER_WINDOW 30 // Time in SECONDS to disable allow max agreed power (Pow) -#define SAFE_POWER_HOLD 10 // Time in SECONDS to allow max unit safe power (Pow) -#define SAFE_POWER_WINDOW 30 // Time in MINUTES to disable allow max unit safe power (Pow) -#define MAX_POWER_RETRY 5 // Retry count allowing agreed power limit overflow (Pow) +#define DEFAULT_POWER_DELTA 80 // Power change percentage +#define MAX_POWER_HOLD 10 // Time in SECONDS to allow max agreed power +#define MAX_POWER_WINDOW 30 // Time in SECONDS to disable allow max agreed power +#define SAFE_POWER_HOLD 10 // Time in SECONDS to allow max unit safe power +#define SAFE_POWER_WINDOW 30 // Time in MINUTES to disable allow max unit safe power +#define MAX_POWER_RETRY 5 // Retry count allowing agreed power limit overflow #define STATES 20 // State loops per second #define SYSLOG_TIMER 600 // Seconds to restore syslog_level diff --git a/sonoff/xdrv_03_energy.ino b/sonoff/xdrv_03_energy.ino index bf29ed6be..656c2ee8e 100644 --- a/sonoff/xdrv_03_energy.ino +++ b/sonoff/xdrv_03_energy.ino @@ -29,12 +29,14 @@ enum EnergyHardware { ENERGY_NONE, ENERGY_HLW8012, ENERGY_CSE7766, ENERGY_PZEM004T }; enum EnergyCommands { + CMND_POWERDELTA, CMND_POWERLOW, CMND_POWERHIGH, CMND_VOLTAGELOW, CMND_VOLTAGEHIGH, CMND_CURRENTLOW, CMND_CURRENTHIGH, CMND_POWERCAL, CMND_POWERSET, CMND_VOLTAGECAL, CMND_VOLTAGESET, CMND_CURRENTCAL, CMND_CURRENTSET, CMND_ENERGYRESET, CMND_MAXENERGY, CMND_MAXENERGYSTART, CMND_MAXPOWER, CMND_MAXPOWERHOLD, CMND_MAXPOWERWINDOW, CMND_SAFEPOWER, CMND_SAFEPOWERHOLD, CMND_SAFEPOWERWINDOW }; const char kEnergyCommands[] PROGMEM = + D_CMND_POWERDELTA "|" D_CMND_POWERLOW "|" D_CMND_POWERHIGH "|" D_CMND_VOLTAGELOW "|" D_CMND_VOLTAGEHIGH "|" D_CMND_CURRENTLOW "|" D_CMND_CURRENTHIGH "|" D_CMND_POWERCAL "|" D_CMND_POWERSET "|" D_CMND_VOLTAGECAL "|" D_CMND_VOLTAGESET "|" D_CMND_CURRENTCAL "|" D_CMND_CURRENTSET "|" D_CMND_ENERGYRESET "|" D_CMND_MAXENERGY "|" D_CMND_MAXENERGYSTART "|" @@ -44,6 +46,7 @@ const char kEnergyCommands[] PROGMEM = float energy_voltage = 0; // 123.1 V float energy_current = 0; // 123.123 A float energy_power = 0; // 123.1 W +float energy_power_last = 0; float energy_power_factor = 0; // 0.12 float energy_daily = 0; // 12.123 kWh float energy_total = 0; // 12345.12345 kWh @@ -679,6 +682,13 @@ void EnergyMarginCheck() } } + if (!jsonflg && Settings.energy_power_delta) { + float diff = abs(energy_power_last - energy_power); + float max_power = (energy_power_last > energy_power) ? energy_power_last : energy_power; + energy_power_last = energy_power; + if (((diff / max_power) * 100) > Settings.energy_power_delta) EnergyMqttShow(); + } + #if FEATURE_POWER_LIMIT // Max Power if (Settings.energy_max_power_limit) { @@ -768,7 +778,14 @@ boolean EnergyCommand() unsigned long nvalue = 0; int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kEnergyCommands); - if (CMND_POWERLOW == command_code) { + if (CMND_POWERDELTA == command_code) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 101)) { + Settings.energy_power_delta = (1 == XdrvMailbox.payload) ? DEFAULT_POWER_DELTA : XdrvMailbox.payload; + } + nvalue = Settings.energy_power_delta; + unit = UNIT_PERCENTAGE; + } + else if (CMND_POWERLOW == command_code) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 3601)) { Settings.energy_min_power = XdrvMailbox.payload; }