mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-27 04:36:31 +00:00
Fix unwanted deep sleep initiation
Fix unwanted deep sleep initiation (#6961)
This commit is contained in:
parent
8fc16e2fe1
commit
1c3b29b835
@ -30,51 +30,48 @@
|
|||||||
|
|
||||||
#define XDRV_29 29
|
#define XDRV_29 29
|
||||||
|
|
||||||
#define MAX_DEEPSLEEP_CYCLE 3600 // Maximum time for a deepsleep
|
|
||||||
#define MIN_DEEPSLEEP_TIME 5
|
|
||||||
|
|
||||||
#define D_PRFX_DEEPSLEEP "DeepSleep"
|
#define D_PRFX_DEEPSLEEP "DeepSleep"
|
||||||
#define D_CMND_DEEPSLEEP_TIME "Time"
|
#define D_CMND_DEEPSLEEP_TIME "Time"
|
||||||
|
|
||||||
|
const uint32_t DEEPSLEEP_MAX = 10 * 366 * 24 * 60 * 60; // Allow max 10 years sleep
|
||||||
|
const uint32_t DEEPSLEEP_MAX_CYCLE = 60 * 60; // Maximum time for a deepsleep as defined by chip hardware
|
||||||
|
const uint32_t DEEPSLEEP_MIN_TIME = 5; // Allow 5 seconds skew
|
||||||
|
const uint32_t DEEPSLEEP_START_COUNTDOWN = 4; // Allow 4 seconds to update web console before deepsleep
|
||||||
|
|
||||||
const char kDeepsleepCommands[] PROGMEM = D_PRFX_DEEPSLEEP "|"
|
const char kDeepsleepCommands[] PROGMEM = D_PRFX_DEEPSLEEP "|"
|
||||||
D_CMND_DEEPSLEEP_TIME ;
|
D_CMND_DEEPSLEEP_TIME ;
|
||||||
|
|
||||||
void (* const DeepsleepCommand[])(void) PROGMEM = {
|
void (* const DeepsleepCommand[])(void) PROGMEM = {
|
||||||
&CmndDeepsleepTime };
|
&CmndDeepsleepTime };
|
||||||
|
|
||||||
const uint32_t MAX_DEEPSLEEP = 10 * 366 * 24 * 60 * 60; // Allow max 10 years sleep
|
|
||||||
|
|
||||||
uint32_t deepsleep_sleeptime = 0;
|
uint32_t deepsleep_sleeptime = 0;
|
||||||
uint8_t deepsleep_flag = 0;
|
uint8_t deepsleep_flag = 0;
|
||||||
|
|
||||||
bool DeepSleepEnabled(void)
|
bool DeepSleepEnabled(void)
|
||||||
{
|
{
|
||||||
if (Settings.deepsleep < 10) {
|
if ((Settings.deepsleep < 10) || (Settings.deepsleep > DEEPSLEEP_MAX)) {
|
||||||
return false;
|
Settings.deepsleep = 0; // Issue #6961
|
||||||
|
return false; // Disabled
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pin[GPIO_DEEPSLEEP] < 99) {
|
if (pin[GPIO_DEEPSLEEP] < 99) {
|
||||||
pinMode(pin[GPIO_DEEPSLEEP], INPUT_PULLUP);
|
pinMode(pin[GPIO_DEEPSLEEP], INPUT_PULLUP);
|
||||||
return (digitalRead(pin[GPIO_DEEPSLEEP])); // Disable DeepSleep if user holds pin GPIO_DEEPSLEEP low
|
return (digitalRead(pin[GPIO_DEEPSLEEP])); // Disable DeepSleep if user holds pin GPIO_DEEPSLEEP low
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true; // Enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeepSleepReInit(void)
|
void DeepSleepReInit(void)
|
||||||
{
|
{
|
||||||
// do a sanity check on deepsleep value
|
|
||||||
if ((0xFFFFFFFF == Settings.deepsleep) || (Settings.deepsleep > MAX_DEEPSLEEP)) {
|
|
||||||
Settings.deepsleep = 0; // issue #6961
|
|
||||||
}
|
|
||||||
if ((ResetReason() == REASON_DEEP_SLEEP_AWAKE) && DeepSleepEnabled()) {
|
if ((ResetReason() == REASON_DEEP_SLEEP_AWAKE) && DeepSleepEnabled()) {
|
||||||
if ((RtcSettings.ultradeepsleep > MAX_DEEPSLEEP_CYCLE) && (RtcSettings.ultradeepsleep < 1700000000)) {
|
if ((RtcSettings.ultradeepsleep > DEEPSLEEP_MAX_CYCLE) && (RtcSettings.ultradeepsleep < 1700000000)) {
|
||||||
// Go back to sleep after 60 minutes if requested deepsleep has not been reached
|
// Go back to sleep after 60 minutes if requested deepsleep has not been reached
|
||||||
RtcSettings.ultradeepsleep = RtcSettings.ultradeepsleep - MAX_DEEPSLEEP_CYCLE;
|
RtcSettings.ultradeepsleep = RtcSettings.ultradeepsleep - DEEPSLEEP_MAX_CYCLE;
|
||||||
AddLog_P2(LOG_LEVEL_ERROR, PSTR("DSL: Remain DeepSleep %d"), RtcSettings.ultradeepsleep);
|
AddLog_P2(LOG_LEVEL_ERROR, PSTR("DSL: Remain DeepSleep %d"), RtcSettings.ultradeepsleep);
|
||||||
RtcSettingsSave();
|
RtcSettingsSave();
|
||||||
RtcRebootReset();
|
RtcRebootReset();
|
||||||
ESP.deepSleep(100 * RtcSettings.deepsleep_slip * (MAX_DEEPSLEEP_CYCLE < RtcSettings.ultradeepsleep ? MAX_DEEPSLEEP_CYCLE : RtcSettings.ultradeepsleep), WAKE_RF_DEFAULT);
|
ESP.deepSleep(100 * RtcSettings.deepsleep_slip * (DEEPSLEEP_MAX_CYCLE < RtcSettings.ultradeepsleep ? DEEPSLEEP_MAX_CYCLE : RtcSettings.ultradeepsleep), WAKE_RF_DEFAULT);
|
||||||
yield();
|
yield();
|
||||||
// Sleeping
|
// Sleeping
|
||||||
}
|
}
|
||||||
@ -83,7 +80,7 @@ void DeepSleepReInit(void)
|
|||||||
RtcSettings.ultradeepsleep = 0;
|
RtcSettings.ultradeepsleep = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeepSleepCheck(void)
|
void DeepSleepPrepare(void)
|
||||||
{
|
{
|
||||||
// Deepsleep_slip is ideally 10.000 == 100%
|
// Deepsleep_slip is ideally 10.000 == 100%
|
||||||
// Typically the device has up to 4% slip. Anything else is a wrong setting in the deepsleep_slip
|
// Typically the device has up to 4% slip. Anything else is a wrong setting in the deepsleep_slip
|
||||||
@ -93,8 +90,7 @@ void DeepSleepCheck(void)
|
|||||||
(RtcSettings.deepsleep_slip < 9000) ||
|
(RtcSettings.deepsleep_slip < 9000) ||
|
||||||
(RtcSettings.deepsleep_slip > 11000) ||
|
(RtcSettings.deepsleep_slip > 11000) ||
|
||||||
(RtcSettings.nextwakeup > (UtcTime() + Settings.deepsleep))) {
|
(RtcSettings.nextwakeup > (UtcTime() + Settings.deepsleep))) {
|
||||||
AddLog_P2(LOG_LEVEL_ERROR, PSTR("DSL: Reset wrong settings wakeup: %ld, slip %ld"),
|
AddLog_P2(LOG_LEVEL_ERROR, PSTR("DSL: Reset wrong settings wakeup: %ld, slip %ld"), RtcSettings.nextwakeup, RtcSettings.deepsleep_slip );
|
||||||
RtcSettings.nextwakeup, RtcSettings.deepsleep_slip );
|
|
||||||
RtcSettings.nextwakeup = 0;
|
RtcSettings.nextwakeup = 0;
|
||||||
RtcSettings.deepsleep_slip = 10000;
|
RtcSettings.deepsleep_slip = 10000;
|
||||||
}
|
}
|
||||||
@ -115,15 +111,15 @@ void DeepSleepCheck(void)
|
|||||||
|
|
||||||
// It may happen that wakeup in just <5 seconds in future
|
// It may happen that wakeup in just <5 seconds in future
|
||||||
// In this case also add deepsleep to nextwakeup
|
// In this case also add deepsleep to nextwakeup
|
||||||
if (RtcSettings.nextwakeup <= (UtcTime() - MIN_DEEPSLEEP_TIME)) {
|
if (RtcSettings.nextwakeup <= (UtcTime() - DEEPSLEEP_MIN_TIME)) {
|
||||||
// ensure nextwakeup is at least in the future
|
// ensure nextwakeup is at least in the future
|
||||||
RtcSettings.nextwakeup += (((UtcTime() + MIN_DEEPSLEEP_TIME - RtcSettings.nextwakeup) / Settings.deepsleep) + 1) * Settings.deepsleep;
|
RtcSettings.nextwakeup += (((UtcTime() + DEEPSLEEP_MIN_TIME - RtcSettings.nextwakeup) / Settings.deepsleep) + 1) * Settings.deepsleep;
|
||||||
}
|
}
|
||||||
|
|
||||||
String dt = GetDT(RtcSettings.nextwakeup + LocalTime() - UtcTime()); // 2017-03-07T11:08:02
|
String dt = GetDT(RtcSettings.nextwakeup + LocalTime() - UtcTime()); // 2017-03-07T11:08:02
|
||||||
// Limit sleeptime to MAX_DEEPSLEEP_CYCLE
|
// Limit sleeptime to DEEPSLEEP_MAX_CYCLE
|
||||||
// uint32_t deepsleep_sleeptime = MAX_DEEPSLEEP_CYCLE < (RtcSettings.nextwakeup - UtcTime()) ? (uint32_t)MAX_DEEPSLEEP_CYCLE : RtcSettings.nextwakeup - UtcTime();
|
// uint32_t deepsleep_sleeptime = DEEPSLEEP_MAX_CYCLE < (RtcSettings.nextwakeup - UtcTime()) ? (uint32_t)DEEPSLEEP_MAX_CYCLE : RtcSettings.nextwakeup - UtcTime();
|
||||||
deepsleep_sleeptime = tmin((uint32_t)MAX_DEEPSLEEP_CYCLE ,RtcSettings.nextwakeup - UtcTime());
|
deepsleep_sleeptime = tmin((uint32_t)DEEPSLEEP_MAX_CYCLE ,RtcSettings.nextwakeup - UtcTime());
|
||||||
|
|
||||||
// stat/tasmota/STATUS = {"DeepSleep":{"Time":"2019-11-12T21:33:45","Epoch":1573590825}}
|
// stat/tasmota/STATUS = {"DeepSleep":{"Time":"2019-11-12T21:33:45","Epoch":1573590825}}
|
||||||
Response_P(PSTR("{\"" D_PRFX_DEEPSLEEP "\":{\"" D_JSON_TIME "\":\"%s\",\"Epoch\":%d}}"), (char*)dt.c_str(), RtcSettings.nextwakeup);
|
Response_P(PSTR("{\"" D_PRFX_DEEPSLEEP "\":{\"" D_JSON_TIME "\":\"%s\",\"Epoch\":%d}}"), (char*)dt.c_str(), RtcSettings.nextwakeup);
|
||||||
@ -150,9 +146,9 @@ void DeepSleepEverySecond(void)
|
|||||||
if (!deepsleep_flag) { return; }
|
if (!deepsleep_flag) { return; }
|
||||||
|
|
||||||
if (DeepSleepEnabled()) {
|
if (DeepSleepEnabled()) {
|
||||||
if (4 == deepsleep_flag) { // Allow 4 seconds to update web console before deepsleep
|
if (DEEPSLEEP_START_COUNTDOWN == deepsleep_flag) { // Allow 4 seconds to update web console before deepsleep
|
||||||
SettingsSaveAll();
|
SettingsSaveAll();
|
||||||
DeepSleepCheck();
|
DeepSleepPrepare();
|
||||||
}
|
}
|
||||||
deepsleep_flag--;
|
deepsleep_flag--;
|
||||||
if (deepsleep_flag <= 0) {
|
if (deepsleep_flag <= 0) {
|
||||||
@ -170,10 +166,10 @@ void DeepSleepEverySecond(void)
|
|||||||
void CmndDeepsleepTime(void)
|
void CmndDeepsleepTime(void)
|
||||||
{
|
{
|
||||||
if ((0 == XdrvMailbox.payload) ||
|
if ((0 == XdrvMailbox.payload) ||
|
||||||
((XdrvMailbox.payload > 10) && (XdrvMailbox.payload < MAX_DEEPSLEEP))) {
|
((XdrvMailbox.payload > 10) && (XdrvMailbox.payload < DEEPSLEEP_MAX))) {
|
||||||
Settings.deepsleep = XdrvMailbox.payload;
|
Settings.deepsleep = XdrvMailbox.payload;
|
||||||
RtcSettings.nextwakeup = 0;
|
RtcSettings.nextwakeup = 0;
|
||||||
deepsleep_flag = (0 == XdrvMailbox.payload) ? 0 : 4;
|
deepsleep_flag = (0 == XdrvMailbox.payload) ? 0 : DEEPSLEEP_START_COUNTDOWN;
|
||||||
if (deepsleep_flag) {
|
if (deepsleep_flag) {
|
||||||
if (!Settings.tele_period) {
|
if (!Settings.tele_period) {
|
||||||
Settings.tele_period = TELE_PERIOD; // Need teleperiod to go back to sleep
|
Settings.tele_period = TELE_PERIOD; // Need teleperiod to go back to sleep
|
||||||
@ -196,8 +192,8 @@ bool Xdrv29(uint8_t function)
|
|||||||
DeepSleepEverySecond();
|
DeepSleepEverySecond();
|
||||||
break;
|
break;
|
||||||
case FUNC_AFTER_TELEPERIOD:
|
case FUNC_AFTER_TELEPERIOD:
|
||||||
if (!deepsleep_flag) {
|
if (DeepSleepEnabled() && !deepsleep_flag) {
|
||||||
deepsleep_flag = 4; // Start deepsleep in 4 seconds
|
deepsleep_flag = DEEPSLEEP_START_COUNTDOWN; // Start deepsleep in 4 seconds
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FUNC_COMMAND:
|
case FUNC_COMMAND:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user