From 8320a944d89aeb0d30f2e32d25d1f40055872cc0 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Thu, 8 Dec 2022 12:55:34 +0100 Subject: [PATCH 1/6] removed index from shuttermode --- tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 20971efe0..f8e24917b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -1366,12 +1366,14 @@ void CmndShutterMotorDelay(void) void CmndShutterMode(void) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= MAX_MODES)) { - ShutterGlobal.position_mode = XdrvMailbox.payload; - Settings->shutter_mode = XdrvMailbox.payload; - ShutterInit(); + if ( XdrvMailbox.index == 1) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= MAX_MODES)) { + ShutterGlobal.position_mode = XdrvMailbox.payload; + Settings->shutter_mode = XdrvMailbox.payload; + ShutterInit(); + } + ResponseCmndNumber(ShutterGlobal.position_mode); } - ResponseCmndNumber(ShutterGlobal.position_mode); } void CmndShutterRelay(void) From 27bbec0d405226291e47cd228ef67b37f188f530 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Thu, 8 Dec 2022 18:08:12 +0100 Subject: [PATCH 2/6] Update xdrv_27_shutter.ino --- tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index f8e24917b..84c79c5d9 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -1366,7 +1366,7 @@ void CmndShutterMotorDelay(void) void CmndShutterMode(void) { - if ( XdrvMailbox.index == 1) { + if (!XdrvMailbox.usridx && !XdrvMailbox.data_len) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= MAX_MODES)) { ShutterGlobal.position_mode = XdrvMailbox.payload; Settings->shutter_mode = XdrvMailbox.payload; From c98164a4003fcf3ae083c0d253cc5ef1a053420b Mon Sep 17 00:00:00 2001 From: stefanbode Date: Thu, 8 Dec 2022 18:36:17 +0100 Subject: [PATCH 3/6] Update xdrv_27_shutter.ino --- tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 84c79c5d9..172280883 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -1378,7 +1378,14 @@ void CmndShutterMode(void) void CmndShutterRelay(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_SHUTTERS)) { + if (!XdrvMailbox.usridx && !XdrvMailbox.data_len) { + // {"ShutterRelay1":"1","ShutterRelay2":"3","ShutterRelay3":"5"} + Response_P(PSTR("{")); + for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { + ResponseAppend_P(PSTR("%s\"" D_PRFX_SHUTTER D_CMND_SHUTTER_RELAY "%d\":\"%d\""), (i)?",":"", i+1,Settings->shutter_startrelay[i]); + } + ResponseAppend_P(PSTR("}")); + } else if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_SHUTTERS)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 64)) { Settings->shutter_startrelay[XdrvMailbox.index -1] = XdrvMailbox.payload; if (XdrvMailbox.payload > 0) { From d2472ef56fc9becd5ae8351097b91050b1ebf125 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Thu, 8 Dec 2022 18:54:45 +0100 Subject: [PATCH 4/6] Update xdrv_27_shutter.ino --- .../tasmota_xdrv_driver/xdrv_27_shutter.ino | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 172280883..f5f7766cc 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -1378,27 +1378,25 @@ void CmndShutterMode(void) void CmndShutterRelay(void) { - if (!XdrvMailbox.usridx && !XdrvMailbox.data_len) { - // {"ShutterRelay1":"1","ShutterRelay2":"3","ShutterRelay3":"5"} - Response_P(PSTR("{")); - for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { - ResponseAppend_P(PSTR("%s\"" D_PRFX_SHUTTER D_CMND_SHUTTER_RELAY "%d\":\"%d\""), (i)?",":"", i+1,Settings->shutter_startrelay[i]); + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 64) && (XdrvMailbox.index <= MAX_SHUTTERS)) { + Settings->shutter_startrelay[XdrvMailbox.index -1] = XdrvMailbox.payload; + if (XdrvMailbox.payload > 0) { + ShutterGlobal.RelayShutterMask |= 3 << (XdrvMailbox.payload - 1); + } else { + ShutterGlobal.RelayShutterMask ^= 3 << (Settings->shutter_startrelay[XdrvMailbox.index -1] - 1); } - ResponseAppend_P(PSTR("}")); - } else if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_SHUTTERS)) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 64)) { - Settings->shutter_startrelay[XdrvMailbox.index -1] = XdrvMailbox.payload; - if (XdrvMailbox.payload > 0) { - ShutterGlobal.RelayShutterMask |= 3 << (XdrvMailbox.payload - 1); - } else { - ShutterGlobal.RelayShutterMask ^= 3 << (Settings->shutter_startrelay[XdrvMailbox.index -1] - 1); - } - Settings->shutter_startrelay[XdrvMailbox.index -1] = XdrvMailbox.payload; - ShutterInit(); - // if payload is 0 to disable the relay there must be a reboot. Otherwhise does not work - } - ResponseCmndIdxNumber(Settings->shutter_startrelay[XdrvMailbox.index -1]); + Settings->shutter_startrelay[XdrvMailbox.index -1] = XdrvMailbox.payload; + ShutterInit(); + // if payload is 0 to disable the relay there must be a reboot. Otherwhise does not work } + uint32_t start = (!XdrvMailbox.usridx && !XdrvMailbox.data_len)?0:XdrvMailbox.index -1; + uint32_t end = (!XdrvMailbox.usridx && !XdrvMailbox.data_len)?TasmotaGlobal.shutters_present:XdrvMailbox.index; + // {"ShutterRelay1":"1","ShutterRelay2":"3","ShutterRelay3":"5"} + Response_P(PSTR("{")); + for (uint32_t i = start; i < end; i++) { + ResponseAppend_P(PSTR("%s\"" D_PRFX_SHUTTER D_CMND_SHUTTER_RELAY "%d\":\"%d\""), (i)?",":"", i+1,Settings->shutter_startrelay[i]); + } + ResponseAppend_P(PSTR("}")); } void CmndShutterButton(void) From c4bb3366a24b400af7b2a04b6d1d08058533b3c2 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Sat, 10 Dec 2022 23:52:53 +0100 Subject: [PATCH 5/6] Update xdrv_27_shutter.ino --- .../tasmota_xdrv_driver/xdrv_27_shutter.ino | 53 ++++++++----------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index f5f7766cc..07b839957 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -254,7 +254,7 @@ uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) //uint16_t addon = ( realpercent*10 - Settings->shuttercoeff[j-1][index] ) * Shutter[index].open_max * (calibrate_pos[j+1] - calibrate_pos[j]) / (Settings->shuttercoeff[j][index] -Settings->shuttercoeff[j-1][index]) / 100; //AddLog(LOG_LEVEL_ERROR, PSTR("SHT: Realpercent TEMP2: %d %%, delta %d, %d, coeff %d"), addon,( realpos - (Shutter[index].open_max * calibrate_pos[j] / 100) ) , (calibrate_pos[j+1] - calibrate_pos[j])* Shutter[index].open_max/100, (Settings->shuttercoeff[j][index] -Settings->shuttercoeff[j-1][index])); realpercent += SHT_DIV_ROUND(((int64_t)realpos - SHT_DIV_ROUND(Shutter[index].open_max * calibrate_pos[j], 100)) * (Settings->shuttercoeff[j][index] - Settings->shuttercoeff[j-1][index]), (calibrate_pos[j+1] - calibrate_pos[j])/10*Shutter[index].open_max) ; - } + } break; } } @@ -690,7 +690,7 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos) ShutterGlobal.start_reported = 0; Shutter[i].tilt_real_pos = tmax(tmin(Shutter[i].tilt_real_pos,Shutter[i].tilt_config[1]),Shutter[i].tilt_config[0]); Shutter[i].tilt_start_pos = Shutter[i].tilt_real_pos; - if (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0] != 0) { + if (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0] != 0) { Shutter[i].venetian_delay = SHT_DIV_ROUND((direction > 0 ? Shutter[i].tilt_config[1]-Shutter[i].tilt_real_pos : Shutter[i].tilt_real_pos-Shutter[i].tilt_config[0]) * Shutter[i].tilt_config[2], Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]); //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: real %d, start %d, counter %d,freq_max %d, dir %d, freq %d"),Shutter[i].real_position, Shutter[i].start_position ,RtcSettings.pulse_counter[i],ShutterGlobal.open_velocity_max , direction ,ShutterGlobal.open_velocity_max ); AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: VenetianDelay: %d, Pos: %d, Dir: %d, Delta: %d, Dur: %d, StartP: %d, TgtP: %d"), @@ -864,6 +864,7 @@ void ShutterButtonHandler(void) } if (NOT_PRESSED == button) { + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Button %d, hold %d, dir %d, index %d, payload %d"), shutter_index+1, button_index+1, Button.hold_timer[button_index],Shutter[shutter_index].direction,XdrvMailbox.index,XdrvMailbox.payload); if (Shutter[shutter_index].direction && (Button.hold_timer[button_index] > 0 && (!Settings->flag.button_single || Button.hold_timer[button_index] > 20))) { XdrvMailbox.index = shutter_index +1; XdrvMailbox.payload = XdrvMailbox.index; @@ -1062,7 +1063,7 @@ void ShutterToggle(bool dir) void CmndShutterOpen(void) { //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Payload open: %d, i %d"), XdrvMailbox.payload, XdrvMailbox.index); - if ((1 == XdrvMailbox.index) && (XdrvMailbox.payload != -99)) { + if ((!XdrvMailbox.usridx) && (XdrvMailbox.payload != -99)) { XdrvMailbox.index = XdrvMailbox.payload; } XdrvMailbox.payload = 100; @@ -1085,11 +1086,10 @@ void CmndShutterStopOpen(void) void CmndShutterClose(void) { //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Payload close: %d, i %d"), XdrvMailbox.payload, XdrvMailbox.index); - if ((1 == XdrvMailbox.index) && (XdrvMailbox.payload != -99)) { + if ((!XdrvMailbox.usridx) && (XdrvMailbox.payload != -99)) { XdrvMailbox.index = XdrvMailbox.payload; } XdrvMailbox.payload = 0; - XdrvMailbox.data_len = 0; TasmotaGlobal.last_source = SRC_WEBGUI; CmndShutterPosition(); } @@ -1143,14 +1143,15 @@ void CmndShutterStopToggleDir(void) void CmndShutterStop(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { + //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Try Stop %d: dir: %d"), XdrvMailbox.index, Shutter[XdrvMailbox.index -1].direction); if (!(Settings->shutter_options[XdrvMailbox.index-1] & 2)) { - if ((1 == XdrvMailbox.index) && (XdrvMailbox.payload != -99)) { + if ((!XdrvMailbox.usridx) && (XdrvMailbox.payload != -99)) { XdrvMailbox.index = XdrvMailbox.payload; } uint32_t i = XdrvMailbox.index -1; if (Shutter[i].direction != 0) { - AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop moving %d: dir: %d"), XdrvMailbox.index, Shutter[i].direction); + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop %d: dir: %d"), XdrvMailbox.index, Shutter[i].direction); Shutter[i].target_position = Shutter[i].real_position; } if (XdrvMailbox.command) @@ -1182,17 +1183,17 @@ void CmndShutterPosition(void) if (!(Settings->shutter_options[XdrvMailbox.index-1] & 2)) { uint32_t index = XdrvMailbox.index-1; //limit the payload - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Pos. in: payload %s (%d), payload %d, idx %d, src %d"), XdrvMailbox.data , XdrvMailbox.data_len, XdrvMailbox.payload , XdrvMailbox.index, TasmotaGlobal.last_source ); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Pos. payload <%s> (%d), payload %d, idx %d (%d), src %d"), XdrvMailbox.data , XdrvMailbox.data_len, XdrvMailbox.payload , XdrvMailbox.index, XdrvMailbox.usridx, TasmotaGlobal.last_source ); // value 0 with data_len > 0 can mean Open // special handling fo UP,DOWN,TOGGLE,STOP command comming with payload -99 - if ((XdrvMailbox.data_len > 1) && (XdrvMailbox.payload <= 0)) { - //UpperCase(XdrvMailbox.data, XdrvMailbox.data); - if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_UP) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_OPEN) || ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPOPEN))) { + // STOP will come with payload 0 because predefined value in TASMOTA + if ((XdrvMailbox.data_len > 3) && (XdrvMailbox.payload <= 0)) { + if ( ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPOPEN))) { CmndShutterOpen(); return; } - if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_DOWN) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_CLOSE) || ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPCLOSE))) { + if ( ((Shutter[index].direction==0) && !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPCLOSE))) { CmndShutterClose(); return; } @@ -1205,6 +1206,7 @@ void CmndShutterPosition(void) return; } if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOP) || ((Shutter[index].direction) && (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPOPEN) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOPCLOSE)))) { + // Back to normal: all -99 if not a clear position XdrvMailbox.payload = -99; CmndShutterStop(); return; @@ -1293,16 +1295,11 @@ void CmndShutterPosition(void) } // if (Shutter[i].direction[index] != new_shutterdirection) } else { target_pos_percent = ShutterRealToPercentPosition(Shutter[index].real_position, index); - ShutterReportPosition(true, index); } + index = (!XdrvMailbox.usridx && !XdrvMailbox.data_len)?MAX_SHUTTERS:index; + ShutterReportPosition(true, index); + ShutterGlobal.start_reported = 1; XdrvMailbox.index = index +1; // Fix random index for ShutterClose - - // As this function is called three times from outside the command handler - // XdrvMailbox.command may not point to a char string resulting in exception 29 on strcpy - char command[CMDSZ] = { 0 }; - XdrvMailbox.command = command; - strcpy(XdrvMailbox.command, D_CMND_SHUTTER_POSITION); - ResponseCmndIdxNumber((Settings->shutter_options[index] & 1) ? 100 - target_pos_percent : target_pos_percent); } else { ShutterReportPosition(true, MAX_SHUTTERS); if (XdrvMailbox.command) @@ -1683,22 +1680,18 @@ void CmndShutterSetTilt(void) if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { if (XdrvMailbox.payload != -99 ) { Shutter[XdrvMailbox.index -1].tilt_target_pos = tmin(tmax(XdrvMailbox.payload, Shutter[XdrvMailbox.index -1].tilt_config[0]), Shutter[XdrvMailbox.index -1].tilt_config[1]); - XdrvMailbox.payload = -99; } - if ((XdrvMailbox.data_len > 1) && (XdrvMailbox.payload <= 0)) { - if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_OPEN) ) { - Shutter[XdrvMailbox.index -1].tilt_target_pos = Shutter[XdrvMailbox.index -1].tilt_config[3]; // open position - XdrvMailbox.payload = -99; - } - if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_CLOSE) ) { - Shutter[XdrvMailbox.index -1].tilt_target_pos = Shutter[XdrvMailbox.index -1].tilt_config[4]; // close position - XdrvMailbox.payload = -99; - } + // assuming OPEN=100=tilt_config[3]/CLOSE=0=tilt_config[4] + if (XdrvMailbox.data_len > 3 && XdrvMailbox.payload >= 0 ) { + Shutter[XdrvMailbox.index -1].tilt_target_pos = Shutter[XdrvMailbox.index -1].tilt_config[XdrvMailbox.payload?3:4]; } } XdrvMailbox.data[0] = '\0'; AddLog(LOG_LEVEL_INFO, PSTR("SHT: TiltTarget %d, payload %d"), Shutter[XdrvMailbox.index -1].tilt_target_pos,XdrvMailbox.payload); Shutter[XdrvMailbox.index -1].tiltmoving = 1; + // Avoid shutterposition try to interpret "open/close or payload" + XdrvMailbox.data_len = 0; + XdrvMailbox.payload = -99; CmndShutterPosition(); } From c20d789fdede961dbe950c0cfaf8701a0b569161 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Sat, 10 Dec 2022 23:54:09 +0100 Subject: [PATCH 6/6] Update support.ino --- tasmota/tasmota_support/support.ino | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index bb92157b6..716e578bc 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -1024,18 +1024,20 @@ bool DecodeCommand(const char* haystack, void (* const MyCommand[])(void), const return false; } -const char kOptions[] PROGMEM = "OFF|" D_OFF "|FALSE|" D_FALSE "|STOP|" D_STOP "|" D_CELSIUS "|" // 0 +const char kOptions[] PROGMEM = "OFF|" D_OFF "|FALSE|" D_FALSE "|STOP|" D_STOP "|" D_CELSIUS "|DOWN|" D_CLOSE "|" // 0 "ON|" D_ON "|TRUE|" D_TRUE "|START|" D_START "|" D_FAHRENHEIT "|" D_USER "|" // 1 "TOGGLE|" D_TOGGLE "|" D_ADMIN "|" // 2 "BLINK|" D_BLINK "|" // 3 "BLINKOFF|" D_BLINKOFF "|" // 4 + "UP|" D_OPEN "|" // 100 "ALL" ; // 255 -const uint8_t sNumbers[] PROGMEM = { 0,0,0,0,0,0,0, +const uint8_t sNumbers[] PROGMEM = { 0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1, 2,2,2, 3,3, 4,4, + 100,100, 255 }; int GetStateNumber(const char *state_text)