From 639968c0abd39ef7efd521caeb53bc00732eb8d2 Mon Sep 17 00:00:00 2001 From: Federico Leoni Date: Tue, 14 Apr 2020 18:14:16 -0300 Subject: [PATCH 1/2] Fix Set)ption13 on Buttons V2 --- tasmota/support_button_v2.ino | 51 ++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/tasmota/support_button_v2.ino b/tasmota/support_button_v2.ino index 0e706b44f..abf656bce 100644 --- a/tasmota/support_button_v2.ino +++ b/tasmota/support_button_v2.ino @@ -118,8 +118,6 @@ void ButtonHandler(void) uint8_t hold_time_extent = IMMINENT_RESET_FACTOR; // Extent hold time factor in case of iminnent Reset command uint16_t loops_per_second = 1000 / Settings.button_debounce; // ButtonDebounce (50) char scmnd[20]; - char scommand[CMDSZ]; - char stopic[TOPSZ]; // uint8_t maxdev = (devices_present > MAX_KEYS) ? MAX_KEYS : devices_present; // for (uint32_t button_index = 0; button_index < maxdev; button_index++) { @@ -190,12 +188,15 @@ void ButtonHandler(void) if ((PRESSED == button) && (NOT_PRESSED == Button.last_state[button_index])) { - if (Settings.flag.button_single && !Settings.flag3.mqtt_buttons) { // SetOption13 (0) - Allow only single button press for immediate action, SetOption73 (0) - Decouple button from relay and send just mqtt topic - AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_BUTTON "%d " D_IMMEDIATE), button_index +1); - if (!SendKey(KEY_BUTTON, button_index +1, POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set - ExecuteCommandPower(button_index +1, POWER_TOGGLE, SRC_BUTTON); // Execute Toggle command internally + if (Settings.flag.button_single) { // SetOption13 (0) - Allow only single button press for immediate action, SetOption73 (0) - Decouple button from relay and send just mqtt topic + if (!Settings.flag3.mqtt_buttons) { + AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_BUTTON "%d " D_IMMEDIATE), button_index +1); + if (!SendKey(KEY_BUTTON, button_index +1, POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set + ExecuteCommandPower(button_index +1, POWER_TOGGLE, SRC_BUTTON); // Execute Toggle command internally + } + } else { + MqttButtonTopic(button_index +1, 1, 0); // SetOption73 (0) - Decouple button from relay and send just mqtt topic } - } else { Button.press_counter[button_index] = (Button.window_timer[button_index]) ? Button.press_counter[button_index] +1 : 1; AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_BUTTON "%d " D_MULTI_PRESS " %d"), button_index +1, Button.press_counter[button_index]); @@ -217,12 +218,10 @@ void ButtonHandler(void) if (Button.hold_timer[button_index] == loops_per_second * Settings.param[P_HOLD_TIME] / 10) { // SetOption32 (40) - Button hold Button.press_counter[button_index] = 0; if (Settings.flag3.mqtt_buttons) { // SetOption73 (0) - Decouple button from relay and send just mqtt topic - snprintf_P(scommand, sizeof(scommand), PSTR("BUTTON%d"), button_index +1); - GetTopic_P(stopic, STAT, mqtt_topic, scommand); - Response_P(S_JSON_COMMAND_SVALUE, "ACTION", GetStateText(3)); - MqttPublish(stopic); - } - SendKey(KEY_BUTTON, button_index +1, POWER_HOLD); // Execute Hold command via MQTT if ButtonTopic is set + MqttButtonTopic(button_index +1, 3, 1); + } else { + SendKey(KEY_BUTTON, button_index +1, POWER_HOLD); // Execute Hold command via MQTT if ButtonTopic is set + } } else { if (Button.hold_timer[button_index] == loops_per_second * hold_time_extent * Settings.param[P_HOLD_TIME] / 10) { // SetOption32 (40) - Button held for factor times longer Button.press_counter[button_index] = 0; @@ -287,15 +286,7 @@ void ButtonHandler(void) } if (Settings.flag3.mqtt_buttons) { // SetOption73 (0) - Decouple button from relay and send just mqtt topic if (Button.press_counter[button_index] >= 1 && Button.press_counter[button_index] <= 5) { - char mqttstate[7]; - - GetTextIndexed(mqttstate, sizeof(mqttstate), Button.press_counter[button_index], kMultiPress); - SendKey(KEY_BUTTON, button_index +1, Button.press_counter[button_index] +9); - snprintf_P(scommand, sizeof(scommand), PSTR("BUTTON%d"), button_index +1); - GetTopic_P(stopic, STAT, mqtt_topic, scommand); - Response_P(S_JSON_COMMAND_SVALUE, "ACTION", mqttstate); - MqttPublish(stopic); - + MqttButtonTopic(button_index +1, Button.press_counter[button_index], 0); } } } @@ -306,12 +297,28 @@ void ButtonHandler(void) } } } + } } Button.last_state[button_index] = button; } } +void MqttButtonTopic(uint8_t index, uint8_t action, uint8_t hold) +{ + char scommand[CMDSZ]; + char stopic[TOPSZ]; + char mqttstate[7]; + + GetTextIndexed(mqttstate, sizeof(mqttstate), action, kMultiPress); + + SendKey(KEY_BUTTON, index, (hold) ? 3 : action +9); + snprintf_P(scommand, sizeof(scommand), PSTR("BUTTON%d"), index); + GetTopic_P(stopic, STAT, mqtt_topic, scommand); + Response_P(S_JSON_COMMAND_SVALUE, "ACTION", (hold) ? SettingsText(SET_STATE_TXT4) : mqttstate); + MqttPublish(stopic); +} + void ButtonLoop(void) { if (Button.present) { From ad18dc76e137170125e68d8b3f78bc89d8d0a5ec Mon Sep 17 00:00:00 2001 From: Federico Leoni Date: Tue, 14 Apr 2020 20:24:34 -0300 Subject: [PATCH 2/2] Update support_button_v2.ino --- tasmota/support_button_v2.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/support_button_v2.ino b/tasmota/support_button_v2.ino index abf656bce..d345b58d2 100644 --- a/tasmota/support_button_v2.ino +++ b/tasmota/support_button_v2.ino @@ -304,7 +304,7 @@ void ButtonHandler(void) } } -void MqttButtonTopic(uint8_t index, uint8_t action, uint8_t hold) +void MqttButtonTopic(uint8_t button_id, uint8_t action, uint8_t hold) { char scommand[CMDSZ]; char stopic[TOPSZ]; @@ -312,8 +312,8 @@ void MqttButtonTopic(uint8_t index, uint8_t action, uint8_t hold) GetTextIndexed(mqttstate, sizeof(mqttstate), action, kMultiPress); - SendKey(KEY_BUTTON, index, (hold) ? 3 : action +9); - snprintf_P(scommand, sizeof(scommand), PSTR("BUTTON%d"), index); + SendKey(KEY_BUTTON, button_id, (hold) ? 3 : action +9); + snprintf_P(scommand, sizeof(scommand), PSTR("BUTTON%d"), button_id); GetTopic_P(stopic, STAT, mqtt_topic, scommand); Response_P(S_JSON_COMMAND_SVALUE, "ACTION", (hold) ? SettingsText(SET_STATE_TXT4) : mqttstate); MqttPublish(stopic);