diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f4a02d9f0..97aaa5ea7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -92,3 +92,4 @@ The following binary downloads have been compiled with ESP8266/Arduino library c - Add rule trigger on one level deeper using syntax with two ``#`` like ``on zigbeereceived#vibration_sensor#aqaracubeside=0 do ...`` - Add support for sensor DS18x20 on Shelly 1 and Shelly 1PM using Shelly Add-On adapter (#7469) - Add support for sensor DHT family on Shelly 1 and Shelly 1PM using Shelly Add-On adapter (#7469) +- Add switch modes 11 (PUSHHOLDMULTI) and 12 (PUSHHOLDMULTI_INV) (#7603) diff --git a/tasmota/CHANGELOG.md b/tasmota/CHANGELOG.md index 3ea8c832c..1ec4c144d 100644 --- a/tasmota/CHANGELOG.md +++ b/tasmota/CHANGELOG.md @@ -5,6 +5,7 @@ - Fix Hass sensor discovery part 1/4 by Federico Leoni (#7582, #7548) - Add support for sensor DS18x20 on Shelly 1 and Shelly 1PM using Shelly Add-On adapter (#7469) - Add support for sensor DHT family on Shelly 1 and Shelly 1PM using Shelly Add-On adapter (#7469) +- Add switch modes 11 (PUSHHOLDMULTI) and 12 (PUSHHOLDMULTI_INV) (#7603) ### 8.1.0.5 20200126 diff --git a/tasmota/support_switch.ino b/tasmota/support_switch.ino index 0cb88d05d..24470ff93 100644 --- a/tasmota/support_switch.ino +++ b/tasmota/support_switch.ino @@ -48,21 +48,32 @@ void SwitchPullupFlag(uint16 switch_bit) bitSet(Switch.no_pullup_mask, switch_bit); } -uint8_t SwitchLastState(uint8_t index) -{ - return Switch.last_state[index]; -} - -void SwitchSetVirtual(uint8_t index, uint8_t state) +void SwitchSetVirtual(uint32_t index, uint8_t state) { Switch.virtual_state[index] = state; } -uint8_t SwitchGetVirtual(uint8_t index) +uint8_t SwitchGetVirtual(uint32_t index) { return Switch.virtual_state[index]; } +uint8_t SwitchLastState(uint32_t index) +{ + return Switch.last_state[index]; +} + +bool SwitchState(uint32_t index) +{ + uint32_t switchmode = Settings.switchmode[index]; + return ((FOLLOW_INV == switchmode) || + (PUSHBUTTON_INV == switchmode) || + (PUSHBUTTONHOLD_INV == switchmode) || + (FOLLOWMULTI_INV == switchmode) || + (PUSHHOLDMULTI_INV == switchmode) + ) ^ Switch.last_state[index]; +} + /*********************************************************************************************/ void SwitchProbe(void) @@ -161,15 +172,15 @@ void SwitchHandler(uint8_t mode) } else SendKey(KEY_SWITCH, i +1, POWER_CLEAR); // Execute command via MQTT - break; - case PUSHHOLDMULTI_INV: + break; + case PUSHHOLDMULTI_INV: if (PRESSED == button){ Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 25; SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT } else SendKey(KEY_SWITCH, i +1, POWER_CLEAR); // Execute command via MQTT - break; + break; default: SendKey(KEY_SWITCH, i +1, POWER_HOLD); // Execute command via MQTT break; @@ -233,24 +244,24 @@ void SwitchHandler(uint8_t mode) if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) { if(Switch.hold_timer[i]!=0) SendKey(KEY_SWITCH, i +1, POWER_INV); // Execute command via MQTT - Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; + Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; } if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) { if(Switch.hold_timer[i] > loops_per_second * Settings.param[P_HOLD_TIME] / 25) - switchflag = POWER_TOGGLE; // Toggle with pushbutton - Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; - } + switchflag = POWER_TOGGLE; // Toggle with pushbutton + Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; + } break; case PUSHHOLDMULTI_INV: if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) { if(Switch.hold_timer[i]!=0) - SendKey(KEY_SWITCH, i +1, POWER_INV); // Execute command via MQTT + SendKey(KEY_SWITCH, i +1, POWER_INV); // Execute command via MQTT Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; } if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) { if(Switch.hold_timer[i] > loops_per_second * Settings.param[P_HOLD_TIME] / 25) switchflag = POWER_TOGGLE; // Toggle with pushbutton - Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; + Switch.hold_timer[i] = loops_per_second * Settings.param[P_HOLD_TIME] / 10; } break; } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 9095a09bf..0103430d4 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -664,8 +664,7 @@ bool MqttShowSensor(void) #else if (pin[GPIO_SWT1 +i] < 99) { #endif // USE_TM1638 - bool swm = ((FOLLOW_INV == Settings.switchmode[i]) || (PUSHBUTTON_INV == Settings.switchmode[i]) || (PUSHBUTTONHOLD_INV == Settings.switchmode[i]) || (FOLLOWMULTI_INV == Settings.switchmode[i])); - ResponseAppend_P(PSTR(",\"" D_JSON_SWITCH "%d\":\"%s\""), i +1, GetStateText(swm ^ SwitchLastState(i))); + ResponseAppend_P(PSTR(",\"" D_JSON_SWITCH "%d\":\"%s\""), i +1, GetStateText(SwitchState(i))); } } XsnsCall(FUNC_JSON_APPEND); diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index 2c6a70fa5..8da6354d9 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -232,7 +232,8 @@ 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, MAX_SWITCH_OPTION}; +enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, TOGGLEMULTI, + FOLLOWMULTI, FOLLOWMULTI_INV, PUSHHOLDMULTI, PUSHHOLDMULTI_INV, 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}; diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index 067745f29..27c7787e0 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -578,8 +578,7 @@ void RulesEvery50ms(void) #else if (pin[GPIO_SWT1 +i] < 99) { #endif // USE_TM1638 - bool swm = ((FOLLOW_INV == Settings.switchmode[i]) || (PUSHBUTTON_INV == Settings.switchmode[i]) || (PUSHBUTTONHOLD_INV == Settings.switchmode[i]) || (FOLLOWMULTI_INV == Settings.switchmode[i]) || (PUSHHOLDMULTI_INV == Settings.switchmode[i])); - snprintf_P(json_event, sizeof(json_event), PSTR("{\"" D_JSON_SWITCH "%d\":{\"Boot\":%d}}"), i +1, (swm ^ SwitchLastState(i))); + snprintf_P(json_event, sizeof(json_event), PSTR("{\"" D_JSON_SWITCH "%d\":{\"Boot\":%d}}"), i +1, (SwitchState(i))); RulesProcessEvent(json_event); } } diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index c874ab85c..d850dfaea 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -1588,7 +1588,7 @@ chknext: if (!strncmp(vname,"sw[",3)) { // tasmota switch state GetNumericResult(vname+3,OPER_EQU,&fvar,0); - fvar=SwitchLastState((uint8_t)fvar); + fvar=SwitchLastState((uint32_t)fvar); // skip ] bracket len++; goto exit;