SwitchState10

Add Switch#State=10 to SwitchMode11&12;
Revert changes done by arendst (Switchmode17&18) as new proposal for integrating POWER_DELAYED into existing switch modes 11 & 12
This commit is contained in:
Seestern93 2021-08-29 23:03:14 +02:00
parent 535900f9f3
commit 1d5fd6f20a
4 changed files with 16 additions and 32 deletions

View File

@ -158,7 +158,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t ds18x20_mean : 1; // bit 12 (v9.3.1.2) - SetOption126 - (DS18x20) Enable arithmetic mean over teleperiod for JSON temperature (1)
uint32_t wifi_no_sleep : 1; // bit 13 (v9.5.0.2) - SetOption127 - (Wifi) Keep wifi in no-sleep mode, prevents some occasional unresponsiveness
uint32_t disable_referer_chk : 1; // bit 14 (v9.5.0.5) - SetOption128 - (Web) Allow access without referer check
uint32_t switch_dimmer_act_at_rls : 1; // bit 15 (v9.5.0.7) - SetOption129 - (Switch) With Switchmode11 & 12, State#2 is tiggered at push (0, default) or release (1)
uint32_t spare15 : 1; // bit 15
uint32_t spare16 : 1; // bit 16
uint32_t spare17 : 1; // bit 17
uint32_t spare18 : 1; // bit 18

View File

@ -37,7 +37,7 @@ const uint8_t AC_PERIOD = (20 + SWITCH_FAST_PROBE_INTERVAL - 1) / SWITCH_FAST_PR
#define POWER_NONE 99
const char kSwitchPressStates[] PROGMEM =
"||||POWER_INCREMENT|POWER_INV|POWER_CLEAR|POWER_RELEASE|POWER_100|";
"||||POWER_INCREMENT|POWER_INV|POWER_CLEAR|POWER_RELEASE|POWER_100|POWER_DELAYED";
#include <Ticker.h>
@ -237,32 +237,20 @@ void SwitchHandler(uint32_t mode) {
uint32_t mqtt_action = POWER_NONE;
uint32_t switchmode = Settings->switchmode[i];
bool push_hold_multi_delay = ((PUSHHOLDMULTIDELAY == switchmode) || (PUSHHOLDMULTIDELAY_INV == switchmode));
if (push_hold_multi_delay) {
switchmode -= (PUSHHOLDMULTIDELAY - PUSHHOLDMULTI);
}
bool push_hold_multi = ((PUSHHOLDMULTI == switchmode) || (PUSHHOLDMULTI_INV == switchmode));
if (Switch.hold_timer[i] & ((push_hold_multi) ? SM_TIMER_MASK : SM_NO_TIMER_MASK)) {
if (Switch.hold_timer[i] & (((switchmode == PUSHHOLDMULTI) | (switchmode == PUSHHOLDMULTI_INV)) ? SM_TIMER_MASK: SM_NO_TIMER_MASK)) {
Switch.hold_timer[i]--;
if ((Switch.hold_timer[i] & SM_TIMER_MASK) == loops_per_second * Settings->param[P_HOLD_TIME] / 25) {
bool do_sendkey = false;
switch (switchmode) {
case PUSHHOLDMULTI:
do_sendkey = (NOT_PRESSED == Switch.last_state[i]);
break;
case PUSHHOLDMULTI_INV:
do_sendkey = (PRESSED == Switch.last_state[i]);
break;
}
if (do_sendkey) {
SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT
} else if (push_hold_multi_delay && ((Switch.hold_timer[i] & ~SM_TIMER_MASK) == SM_FIRST_PRESS)) {
switchflag = POWER_TOGGLE; // Toggle with pushbutton
Switch.hold_timer[i] = 0;
if ((switchmode == PUSHHOLDMULTI) | (switchmode == PUSHHOLDMULTI_INV)){
if (((switchmode == PUSHHOLDMULTI) & (NOT_PRESSED == Switch.last_state[i])) | ((switchmode == PUSHHOLDMULTI_INV) & (PRESSED == Switch.last_state[i]))) {
SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT
}
else if ((Switch.hold_timer[i] & ~SM_TIMER_MASK) == SM_FIRST_PRESS) {
switchflag = POWER_DELAYED; // Toggle with pushbutton
Switch.hold_timer[i] = 0;
}
}
}
if (0 == (Switch.hold_timer[i] & ((push_hold_multi) ? SM_TIMER_MASK: SM_NO_TIMER_MASK))) {
if (0 == (Switch.hold_timer[i] & (((switchmode == PUSHHOLDMULTI) | (switchmode == PUSHHOLDMULTI_INV)) ? SM_TIMER_MASK: SM_NO_TIMER_MASK))) {
switch (switchmode) {
case TOGGLEMULTI:
switchflag = POWER_TOGGLE; // Toggle after hold
@ -365,9 +353,7 @@ void SwitchHandler(uint32_t mode) {
if ((Switch.hold_timer[i] & SM_TIMER_MASK) > loops_per_second * Settings->param[P_HOLD_TIME] / 25) {
if ((Switch.hold_timer[i] & ~SM_TIMER_MASK) != SM_SECOND_PRESS) {
Switch.hold_timer[i]= SM_FIRST_PRESS;
if (!push_hold_multi_delay) {
switchflag = POWER_TOGGLE; // Toggle with pushbutton
}
switchflag = POWER_TOGGLE; // Toggle with pushbutton
}
else{
SendKey(KEY_SWITCH, i +1, POWER_100); // Execute command via MQTT
@ -393,9 +379,7 @@ void SwitchHandler(uint32_t mode) {
if ((Switch.hold_timer[i] & SM_TIMER_MASK)> loops_per_second * Settings->param[P_HOLD_TIME] / 25) {
if ((Switch.hold_timer[i] & ~SM_TIMER_MASK) != SM_SECOND_PRESS) {
Switch.hold_timer[i]= SM_FIRST_PRESS;
if (!push_hold_multi_delay) {
switchflag = POWER_TOGGLE; // Toggle with pushbutton
}
switchflag = POWER_TOGGLE; // Toggle with pushbutton
}
else{
SendKey(KEY_SWITCH, i +1, POWER_100); // Execute command via MQTT

View File

@ -515,6 +515,7 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
// state 6 = POWER_CLEAR = button released
// state 7 = POWER_RELEASE = button released
// state 9 = CLEAR_RETAIN = clear retain flag
// state 10 = POWER_DELAYED = button released delayed
char stopic[TOPSZ];
char scommand[CMDSZ];

View File

@ -280,8 +280,7 @@ enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_D
enum WifiConfigOptions {WIFI_RESTART, EX_WIFI_SMARTCONFIG, WIFI_MANAGER, EX_WIFI_WPSCONFIG, WIFI_RETRY, WIFI_WAIT, WIFI_SERIAL, WIFI_MANAGER_RESET_ONLY, MAX_WIFI_OPTION};
enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, TOGGLEMULTI,
FOLLOWMULTI, FOLLOWMULTI_INV, PUSHHOLDMULTI, PUSHHOLDMULTI_INV, PUSHON, PUSHON_INV, PUSH_IGNORE, PUSHNOTUSED, PUSHHOLDMULTIDELAY,
PUSHHOLDMULTIDELAY_INV, MAX_SWITCH_OPTION};
FOLLOWMULTI, FOLLOWMULTI_INV, PUSHHOLDMULTI, PUSHHOLDMULTI_INV, PUSHON, PUSHON_INV, PUSH_IGNORE, MAX_SWITCH_OPTION};
enum LedStateOptions {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQTTPUB, LED_POWER_MQTTPUB, LED_MQTT, LED_POWER_MQTT, MAX_LED_OPTION};