From 2b1a9845d7cf3e63190e9f77044a482b437aab6c Mon Sep 17 00:00:00 2001 From: Ingo Flaschberger Date: Tue, 21 Apr 2020 16:18:18 +0200 Subject: [PATCH 1/3] Fix: update position for all shutter types --- tasmota/xdrv_27_shutter.ino | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index b7d4e1dda..41805eae2 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -296,16 +296,16 @@ void ShutterUpdatePosition(void) for (uint32_t i = 0; i < shutters_present; i++) { if (Shutter.direction[i] != 0) { int32_t stop_position_delta = 20; - if (Shutter.mode == SHT_OFF_ON__OPEN_CLOSE_STEPPER) { - // Calculate position with counter. Much more accurate and no need for motordelay workaround - // adding some steps to stop early - Shutter.real_position[i] = ShutterCounterBasedPosition(i); - if (!Shutter.start_reported) { - ShutterReportPosition(true); - XdrvRulesProcess(); - Shutter.start_reported = 1; - } + // Calculate position with counter. Much more accurate and no need for motordelay workaround + // adding some steps to stop early + Shutter.real_position[i] = ShutterCounterBasedPosition(i); + if (!Shutter.start_reported) { + ShutterReportPosition(true); + XdrvRulesProcess(); + Shutter.start_reported = 1; + } + if (Shutter.mode == SHT_OFF_ON__OPEN_CLOSE_STEPPER) { int32_t max_frequency = Shutter.direction[i] == 1 ? Shutter.max_pwm_frequency : Shutter.max_close_pwm_frequency[i]; int32_t max_freq_change_per_sec = Shutter.max_pwm_frequency*steps_per_second / (Shutter.motordelay[i]>0 ? Shutter.motordelay[i] : 1); int32_t min_runtime_ms = Shutter.pwm_frequency[i]*1000 / max_freq_change_per_sec; From 4518abaf322dd5a3e89535a7edea093cb79cb445 Mon Sep 17 00:00:00 2001 From: Ingo Flaschberger Date: Tue, 21 Apr 2020 16:19:42 +0200 Subject: [PATCH 2/3] Update Position / Trigger only active shutter --- tasmota/xdrv_27_shutter.ino | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 41805eae2..b5e1bf7b7 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -255,18 +255,24 @@ void ShutterInit(void) } } -void ShutterReportPosition(bool always) +void ShutterReportPosition(bool always, uint32_t index) { Response_P(PSTR("{")); rules_flag.shutter_moving = 0; - for (uint32_t i = 0; i < shutters_present; i++) { + uint32_t i = 0; + uint32_t n = shutters_present; + if( index != MAX_SHUTTERS) { + i = index; + n = index+1; + } + for (i; i < n; i++) { //AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Shutter %d: Real Pos: %d"), i+1,Shutter.real_position[i]); uint32_t position = ShutterRealToPercentPosition(Shutter.real_position[i], i); if (Shutter.direction[i] != 0) { rules_flag.shutter_moving = 1; ShutterLogPos(i); } - if (i) { ResponseAppend_P(PSTR(",")); } + if (i && index == MAX_SHUTTERS) { ResponseAppend_P(PSTR(",")); } uint32_t target = ShutterRealToPercentPosition(Shutter.target_position[i], i); ResponseAppend_P(JSON_SHUTTER_POS, i+1, (Settings.shutter_options[i] & 1) ? 100-position : position, Shutter.direction[i],(Settings.shutter_options[i] & 1) ? 100-target : target ); } @@ -300,7 +306,7 @@ void ShutterUpdatePosition(void) // adding some steps to stop early Shutter.real_position[i] = ShutterCounterBasedPosition(i); if (!Shutter.start_reported) { - ShutterReportPosition(true); + ShutterReportPosition(true, i); XdrvRulesProcess(); Shutter.start_reported = 1; } @@ -395,7 +401,7 @@ void ShutterUpdatePosition(void) MqttPublish(stopic, Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN Shutter.direction[i] = 0; - ShutterReportPosition(true); + ShutterReportPosition(true, i); rules_flag.shutter_moved = 1; XdrvRulesProcess(); } @@ -910,13 +916,13 @@ void CmndShutterPosition(void) } } else { target_pos_percent = ShutterRealToPercentPosition(Shutter.real_position[index], index); - ShutterReportPosition(true); + ShutterReportPosition(true, index); } XdrvMailbox.index = index +1; // Fix random index for ShutterClose if (XdrvMailbox.command) ResponseCmndIdxNumber((Settings.shutter_options[index] & 1) ? 100 - target_pos_percent : target_pos_percent); } else { - ShutterReportPosition(true); + ShutterReportPosition(true, MAX_SHUTTERS); if (XdrvMailbox.command) ResponseCmndIdxChar("Locked"); } @@ -1261,7 +1267,7 @@ bool Xdrv27(uint8_t function) break; case FUNC_EVERY_SECOND: //case FUNC_EVERY_250_MSECOND: - ShutterReportPosition(false); + ShutterReportPosition(false, MAX_SHUTTERS); break; case FUNC_COMMAND: From d9ff42f5b7f29d64b814d64a057daba7d9bc40d4 Mon Sep 17 00:00:00 2001 From: Ingo Flaschberger Date: Tue, 21 Apr 2020 16:20:20 +0200 Subject: [PATCH 3/3] Add ShutterSetOpen command --- tasmota/i18n.h | 1 + tasmota/xdrv_27_shutter.ino | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 534f5de00..53353ed00 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -557,6 +557,7 @@ #define D_CMND_SHUTTER_RELAY "Relay" #define D_CMND_SHUTTER_SETHALFWAY "SetHalfway" #define D_CMND_SHUTTER_SETCLOSE "SetClose" +#define D_CMND_SHUTTER_SETOPEN "SetOpen" #define D_CMND_SHUTTER_INVERT "Invert" #define D_CMND_SHUTTER_CLIBRATION "Calibration" #define D_CMND_SHUTTER_MOTORDELAY "MotorDelay" diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index b5e1bf7b7..3248611d1 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -39,14 +39,14 @@ enum ShutterButtonStates { SHT_NOT_PRESSED, SHT_PRESSED_MULTI, SHT_PRESSED_HOLD, const char kShutterCommands[] PROGMEM = D_PRFX_SHUTTER "|" D_CMND_SHUTTER_OPEN "|" D_CMND_SHUTTER_CLOSE "|" D_CMND_SHUTTER_TOGGLE "|" D_CMND_SHUTTER_STOP "|" D_CMND_SHUTTER_POSITION "|" D_CMND_SHUTTER_OPENTIME "|" D_CMND_SHUTTER_CLOSETIME "|" D_CMND_SHUTTER_RELAY "|" - D_CMND_SHUTTER_SETHALFWAY "|" D_CMND_SHUTTER_SETCLOSE "|" D_CMND_SHUTTER_INVERT "|" D_CMND_SHUTTER_CLIBRATION "|" + D_CMND_SHUTTER_SETHALFWAY "|" D_CMND_SHUTTER_SETCLOSE "|" D_CMND_SHUTTER_SETOPEN "|" D_CMND_SHUTTER_INVERT "|" D_CMND_SHUTTER_CLIBRATION "|" D_CMND_SHUTTER_MOTORDELAY "|" D_CMND_SHUTTER_FREQUENCY "|" D_CMND_SHUTTER_BUTTON "|" D_CMND_SHUTTER_LOCK "|" D_CMND_SHUTTER_ENABLEENDSTOPTIME "|" D_CMND_SHUTTER_INVERTWEBBUTTONS "|" D_CMND_SHUTTER_STOPOPEN "|" D_CMND_SHUTTER_STOPCLOSE "|" D_CMND_SHUTTER_STOPTOGGLE "|" D_CMND_SHUTTER_STOPPOSITION; void (* const ShutterCommand[])(void) PROGMEM = { &CmndShutterOpen, &CmndShutterClose, &CmndShutterToggle, &CmndShutterStop, &CmndShutterPosition, &CmndShutterOpenTime, &CmndShutterCloseTime, &CmndShutterRelay, - &CmndShutterSetHalfway, &CmndShutterSetClose, &CmndShutterInvert, &CmndShutterCalibration , &CmndShutterMotorDelay, + &CmndShutterSetHalfway, &CmndShutterSetClose, &CmndShutterSetOpen, &CmndShutterInvert, &CmndShutterCalibration , &CmndShutterMotorDelay, &CmndShutterFrequency, &CmndShutterButton, &CmndShutterLock, &CmndShutterEnableEndStopTime, &CmndShutterInvertWebButtons, &CmndShutterStopOpen, &CmndShutterStopClose, &CmndShutterStopToggle, &CmndShutterStopPosition}; @@ -1170,6 +1170,16 @@ void CmndShutterSetClose(void) } } +void CmndShutterSetOpen(void) +{ + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= shutters_present)) { + Shutter.real_position[XdrvMailbox.index -1] = Shutter.open_max[XdrvMailbox.index -1]; + ShutterStartInit(XdrvMailbox.index -1, 0, Shutter.open_max[XdrvMailbox.index -1]); + Settings.shutter_position[XdrvMailbox.index -1] = 100; + ResponseCmndIdxChar(D_CONFIGURATION_RESET); + } +} + void CmndShutterInvert(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= shutters_present)) {