Tune TimedPower

This commit is contained in:
Theo Arends 2024-01-16 11:02:24 +01:00
parent 789fd1e055
commit 77d54985d0
1 changed files with 25 additions and 17 deletions

View File

@ -512,6 +512,7 @@ void ResetTimedCmnd(const char *command) {
for (uint32_t i = 0; i < MAX_TIMED_CMND; i++) {
if (TasmotaGlobal.timed_cmnd[i].time != 0) {
if (!strncmp(command, TasmotaGlobal.timed_cmnd[i].command.c_str(), strlen(command))) {
// Stored command starts with command
TasmotaGlobal.timed_cmnd[i].time = 0;
TasmotaGlobal.timed_cmnd[i].command = (const char*) nullptr; // Force deallocation of the String internal memory
}
@ -737,35 +738,42 @@ void CmndPower(void)
void CmndTimedPower(void) {
/*
Allow timed power changes on a 50ms granularity
TimedPower<index> <milliseconds>[,0|1|2|3]
TimedPower0 3000 - Turn all power on and then off after 3 seconds
TimedPower1 2000 - Turn power1 on and then off after 2 seconds
TimedPower2 2000,0 - Turn power2 off and then on after 2 seconds
TimedPower1 2200,1 - Turn power1 on and then off after 2.2 seconds
TimedPower2 2000,2 - Toggle power2 and then toggle again after 2 seconds
TimedPower2 2500,3 - Blink power2 and then turn off after 2.5 seconds
TimedPower - Clear active power timers
TimedPower 2000 - Turn power1 on and then off after 2 seconds
TimedPower1 - Clear active Power1 timers
TimedPower0 3000 - Turn all power on and then off after 3 seconds
TimedPower1 2000 - Turn power1 on and then off after 2 seconds
TimedPower2 2000,0|off - Turn power2 off and then on after 2 seconds
TimedPower1 2200,1|on - Turn power1 on and then off after 2.2 seconds
TimedPower2 2000,2|toggle - Toggle power2 and then toggle again after 2 seconds
TimedPower2 2500,3|blink - Blink power2 and then turn off after 2.5 seconds
*/
if ((XdrvMailbox.index >= 0) && (XdrvMailbox.index <= TasmotaGlobal.devices_present)) {
if (XdrvMailbox.data_len > 0) {
uint32_t parm[2] = { 0, 0 };
uint32_t parm[2];
uint32_t parms = ParseParameters(2, parm);
uint32_t time = parm[0];
uint32_t start_state = 1; // Default on
uint32_t time = (parm[0] < 50) ? 50 : parm[0]; // Lowest is 50ms (state_50msecond)
uint32_t start_state = POWER_ON; // Default on
if (2 == parms) {
start_state = parm[1] & 0x03; // 0,1,2,3
start_state = parm[1] & 0x03; // POWER_OFF, POWER_ON, POWER_TOGGLE, POWER_BLINK
}
const uint8_t contra_state[] = { 1, 0, 2, 0 };
uint32_t end_state = contra_state[start_state];
const uint8_t end_state[] = { POWER_ON, POWER_OFF, POWER_TOGGLE, POWER_OFF };
char cmnd[32];
snprintf_P(cmnd, sizeof(cmnd), PSTR(D_CMND_POWER "%d %d"), XdrvMailbox.index, end_state);
if (SetTimedCmnd(time, cmnd)) {
snprintf_P(cmnd, sizeof(cmnd), PSTR(D_CMND_POWER "%d %d"), XdrvMailbox.index, end_state[start_state]);
if (SetTimedCmnd(time, cmnd)) { // Skip if no more timers left (MAX_TIMED_CMND)
XdrvMailbox.payload = start_state;
CmndPower();
}
} else {
// Remove all POWER timed command
ResetTimedCmnd(D_CMND_POWER);
if (!XdrvMailbox.usridx) {
ResetTimedCmnd(D_CMND_POWER); // Remove all POWER timed command
} else {
char cmnd[32];
snprintf_P(cmnd, sizeof(cmnd), PSTR(D_CMND_POWER "%d"), XdrvMailbox.index);
ResetTimedCmnd(cmnd); // Remove POWER<index> timed command
}
ResponseCmndDone();
}
}