Fix TimedPower using state names

This commit is contained in:
Theo Arends 2024-01-16 15:07:23 +01:00
parent 2c5508ee96
commit 9d00897cb4

View File

@ -768,15 +768,19 @@ void CmndTimedPower(void) {
*/ */
if ((XdrvMailbox.index >= 0) && (XdrvMailbox.index <= TasmotaGlobal.devices_present)) { if ((XdrvMailbox.index >= 0) && (XdrvMailbox.index <= TasmotaGlobal.devices_present)) {
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
uint32_t parm[2]; uint32_t time = (XdrvMailbox.payload < 50) ? 50 : XdrvMailbox.payload;
uint32_t parms = ParseParameters(2, parm); int start_state = POWER_ON; // Default on
uint32_t time = (parm[0] < 50) ? 50 : parm[0]; // Lowest is 50ms (state_50msecond) if (ArgC() > 1) {
uint32_t start_state = POWER_ON; // Default on char state_text[XdrvMailbox.data_len];
if (2 == parms) { ArgV(state_text, 2);
start_state = parm[1] & 0x03; // POWER_OFF, POWER_ON, POWER_TOGGLE, POWER_BLINK start_state = GetStateNumber(Trim(state_text));
if (start_state < 0) {
start_state = atoi(state_text);
}
start_state &= 0x03; // POWER_OFF, POWER_ON, POWER_TOGGLE, POWER_BLINK
} }
const uint8_t end_state[] = { POWER_ON, POWER_OFF, POWER_TOGGLE, POWER_OFF }; const uint8_t end_state[] = { POWER_ON, POWER_OFF, POWER_TOGGLE, POWER_OFF };
char cmnd[32]; char cmnd[CMDSZ];
snprintf_P(cmnd, sizeof(cmnd), PSTR(D_CMND_POWER "%d %d"), XdrvMailbox.index, end_state[start_state]); 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) if (SetTimedCmnd(time, cmnd)) { // Skip if no more timers left (MAX_TIMED_CMND)
XdrvMailbox.payload = start_state; XdrvMailbox.payload = start_state;
@ -786,7 +790,7 @@ void CmndTimedPower(void) {
if (!XdrvMailbox.usridx) { if (!XdrvMailbox.usridx) {
ResetTimedCmnd(D_CMND_POWER); // Remove all POWER timed command ResetTimedCmnd(D_CMND_POWER); // Remove all POWER timed command
} else { } else {
char cmnd[32]; char cmnd[CMDSZ];
snprintf_P(cmnd, sizeof(cmnd), PSTR(D_CMND_POWER "%d"), XdrvMailbox.index); snprintf_P(cmnd, sizeof(cmnd), PSTR(D_CMND_POWER "%d"), XdrvMailbox.index);
ResetTimedCmnd(cmnd); // Remove POWER<index> timed command ResetTimedCmnd(cmnd); // Remove POWER<index> timed command
} }