From 6d47bfc46ebb31ab2a797cedd2b9f68af8e1fe4e Mon Sep 17 00:00:00 2001 From: stefanbode Date: Mon, 15 Nov 2021 17:31:15 +0100 Subject: [PATCH 01/16] internal_dev --- tasmota/xdrv_27_shutter.ino | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index de3f20239..fd781e03f 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -345,7 +345,7 @@ void ShutterInit(void) break; } AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d min realpos_chg: %d, min tilt_chg %d"),i+1,Shutter[i].min_realPositionChange,Shutter[i].min_TiltChange); - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Openvel %d, Closevel: %d"),i, ShutterGlobal.open_velocity_max, Shutter[i].close_velocity_max); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Openvel %d, Closevel: %d"),i, ShutterGlobal.open_velocity_max, Shutter[i].close_velocity_max); AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Init. Pos %d, Inv %d, Locked %d, Endstop enab %d, webButt inv %d, Motordel: %d"), i+1, Shutter[i].real_position, (Settings->shutter_options[i]&1) ? 1 : 0, (Settings->shutter_options[i]&2) ? 1 : 0, (Settings->shutter_options[i]&4) ? 1 : 0, (Settings->shutter_options[i]&8) ? 1 : 0, Shutter[i].motordelay); @@ -529,11 +529,11 @@ void ShutterUpdatePosition(void) XdrvRulesProcess(0); ShutterGlobal.start_reported = 1; } - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d, cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d, TrgtTilt: %d, Tiltmove: %d"), - Shutter[i].time, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d(%d), cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d, TrgtTilt: %d, Tiltmove: %d"), + Shutter[i].time, Shutter[i].time-Shutter[i].pwm_value,current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction,Shutter[i].tilt_real_pos, Shutter[i].tilt_target_pos, Shutter[i].tiltmoving); - + Shutter[i].pwm_value = Shutter[i].time; if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) || ((int16_t)Shutter[i].tilt_real_pos * Shutter[i].direction * Shutter[i].tilt_config[2] >= (int16_t)Shutter[i].tilt_target_pos * Shutter[i].direction * Shutter[i].tilt_config[2] && Shutter[i].tiltmoving==1)) || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].accelerator=<%s>, max10s?"),i+1, rules_vars[i]); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start? var%d <99>=<%s>, max10s?"),i+1, rules_vars[i]); TasmotaGlobal.rules_flag.shutter_moving = 1; XdrvRulesProcess(0); uptime_Local = TasmotaGlobal.uptime; while (uptime_Local+10 > TasmotaGlobal.uptime && (String)rules_vars[i] == "99") { loop(); } - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start. Done")); + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start. Done")); #endif // USE_RULES } From 0cc6f85634446d0f0edcb55a76fcf21c615ad0ea Mon Sep 17 00:00:00 2001 From: stefanbode Date: Mon, 15 Nov 2021 18:12:14 +0100 Subject: [PATCH 02/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index fd781e03f..59d2202cb 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -102,6 +102,7 @@ struct SHUTTER { uint16_t venetian_delay = 0; // Delay in steps before venetian shutter start physical moving. Based on tilt position uint16_t min_realPositionChange = 0; // minimum change of the position before the shutter operates. different for PWM and time based operations uint16_t min_TiltChange = 0; // minimum change of the tilt before the shutter operates. different for PWM and time based operations + uint16_t missed_steps =0; } Shutter[MAX_SHUTTERS]; struct SHUTTERGLOBAL { @@ -530,10 +531,10 @@ void ShutterUpdatePosition(void) ShutterGlobal.start_reported = 1; } AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d(%d), cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d, TrgtTilt: %d, Tiltmove: %d"), - Shutter[i].time, Shutter[i].time-Shutter[i].pwm_value,current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, + Shutter[i].time, Shutter[i].time-Shutter[i].missed_steps,current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction,Shutter[i].tilt_real_pos, Shutter[i].tilt_target_pos, Shutter[i].tiltmoving); - Shutter[i].pwm_value = Shutter[i].time; + Shutter[i].missed_steps = Shutter[i].time+1; if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) || ((int16_t)Shutter[i].tilt_real_pos * Shutter[i].direction * Shutter[i].tilt_config[2] >= (int16_t)Shutter[i].tilt_target_pos * Shutter[i].direction * Shutter[i].tilt_config[2] && Shutter[i].tiltmoving==1)) || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].accelerator Date: Mon, 15 Nov 2021 18:43:11 +0100 Subject: [PATCH 03/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 59d2202cb..0722622eb 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -557,8 +557,7 @@ void ShutterUpdatePosition(void) CmndShutterPosition(); return; } else { - Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; - Shutter[i].tiltmoving = 0; + Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; } ShutterLogPos(i); @@ -1151,8 +1150,10 @@ void CmndShutterPosition(void) int8_t new_shutterdirection; if (abs(Shutter[index].target_position - Shutter[index].real_position ) > Shutter[index].min_realPositionChange) { new_shutterdirection = Shutter[index].real_position < Shutter[index].target_position ? 1 : -1; + Shutter[i].tiltmoving = 0; } else { new_shutterdirection = Shutter[index].tilt_real_pos < Shutter[index].tilt_target_pos ? 1 : -1; + Shutter[i].tiltmoving = 1; } if (Shutter[index].direction == -new_shutterdirection) { From a6b0cf9d318bc4b2210af265bf7bafe7aaed512a Mon Sep 17 00:00:00 2001 From: stefanbode Date: Mon, 15 Nov 2021 18:43:47 +0100 Subject: [PATCH 04/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 0722622eb..86160b565 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -557,7 +557,7 @@ void ShutterUpdatePosition(void) CmndShutterPosition(); return; } else { - Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; + Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; } ShutterLogPos(i); @@ -1150,10 +1150,10 @@ void CmndShutterPosition(void) int8_t new_shutterdirection; if (abs(Shutter[index].target_position - Shutter[index].real_position ) > Shutter[index].min_realPositionChange) { new_shutterdirection = Shutter[index].real_position < Shutter[index].target_position ? 1 : -1; - Shutter[i].tiltmoving = 0; + Shutter[index].tiltmoving = 0; } else { new_shutterdirection = Shutter[index].tilt_real_pos < Shutter[index].tilt_target_pos ? 1 : -1; - Shutter[i].tiltmoving = 1; + Shutter[index].tiltmoving = 1; } if (Shutter[index].direction == -new_shutterdirection) { From 0e2ad05c2cbc2bd1bc8314d2b1b951d9168d0e0d Mon Sep 17 00:00:00 2001 From: stefanbode Date: Mon, 15 Nov 2021 19:52:48 +0100 Subject: [PATCH 05/16] Update xdrv_27_shutter.ino --- 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 86160b565..967ec860e 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -328,7 +328,7 @@ void ShutterInit(void) Shutter[i].tilt_config[k] = Settings->shutter_tilt_config[k][i]; } Shutter[i].tilt_real_pos = Settings->shutter_tilt_pos[i]; - Shutter[i].tilt_velocity = Shutter[i].tilt_config[2] > 0 ? (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0])/Shutter[i].tilt_config[2] : 1; + Shutter[i].tilt_velocity = Shutter[i].tilt_config[2] > 0 ? ((Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0])/Shutter[i].tilt_config[2])+1 : 1; Shutter[i].close_velocity_max = ShutterGlobal.open_velocity_max*Shutter[i].open_time / Shutter[i].close_time; @@ -472,8 +472,11 @@ void ShutterDecellerateForStop(uint8_t i) void ShutterPowerOff(uint8_t i) { - AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop Shutter %d. Switchmode %d"), i+1,Shutter[i].switch_mode); // fix log to indicate correct shutter number + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop %d. Mode %d, time:%d"), i+1,Shutter[i].switch_mode, Shutter[i].time); // fix log to indicate correct shutter number ShutterDecellerateForStop(i); + if (Shutter[i].direction !=0) { + Shutter[i].direction = 0; + } switch (Shutter[i].switch_mode) { case SHT_SWITCH: if ((1 << (Settings->shutter_startrelay[i]-1)) & TasmotaGlobal.power) { @@ -513,10 +516,7 @@ void ShutterPowerOff(uint8_t i) ExecuteCommand(scmnd, SRC_BUTTON); break; } - if (Shutter[i].direction !=0) { - Shutter[i].direction = 0; - delay(MOTOR_STOP_TIME); - } + delay(MOTOR_STOP_TIME); } void ShutterUpdatePosition(void) @@ -632,8 +632,8 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos) if (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0] != 0) { Shutter[i].venetian_delay = (Shutter[i].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 , Shutter[i].direction ,ShutterGlobal.open_velocity_max ); - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: %d VenetianDelay: %d, Pos: %d, Dir: %d, Delta: %d, Durat: %d, Start: %d, Target: %d"), - // i, Shutter[i].venetian_delay, Shutter[i].tilt_real_pos,Shutter[i].direction,(Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]), Shutter[i].tilt_config[2],Shutter[i].tilt_start_pos,Shutter[i].tilt_target_pos); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: %d VenetianDelay: %d, Pos: %d, Dir: %d, Delta: %d, Durat: %d, Start: %d, Target: %d"), + i, Shutter[i].venetian_delay, Shutter[i].tilt_real_pos,Shutter[i].direction,(Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]), Shutter[i].tilt_config[2],Shutter[i].tilt_start_pos,Shutter[i].tilt_target_pos); } } AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Start shtr%d from %d to %d in direction %d"), i, Shutter[i].start_position, Shutter[i].target_position, Shutter[i].direction); @@ -686,7 +686,7 @@ void ShutterRelayChanged(void) // SRC_IGNORE added because INTERLOCK function bite causes this as last source for changing the relay. //uint8 manual_relays_changed = ((ShutterGlobal.RelayCurrentMask >> (Settings->shutter_startrelay[i] -1)) & 3) && SRC_IGNORE != TasmotaGlobal.last_source && SRC_SHUTTER != TasmotaGlobal.last_source && SRC_PULSETIMER != TasmotaGlobal.last_source ; uint8 manual_relays_changed = ((ShutterGlobal.RelayCurrentMask >> (Settings->shutter_startrelay[i] -1)) & 3) && SRC_SHUTTER != TasmotaGlobal.last_source && SRC_PULSETIMER != TasmotaGlobal.last_source ; - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Source %s, Powerstate %ld, RelayMask %d, ManualChange %d"), + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Source %s, Powerstate %ld, RelayMask %d, ManualChange %d"), i+1, GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource), powerstate_local,ShutterGlobal.RelayCurrentMask,manual_relays_changed); if (manual_relays_changed) { //ShutterGlobal.skip_relay_change = true; From 46c4045ce1c55c5f92d05246edf2a985cd6828df Mon Sep 17 00:00:00 2001 From: stefanbode Date: Mon, 15 Nov 2021 19:55:04 +0100 Subject: [PATCH 06/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 967ec860e..fcdff233c 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -687,7 +687,7 @@ void ShutterRelayChanged(void) //uint8 manual_relays_changed = ((ShutterGlobal.RelayCurrentMask >> (Settings->shutter_startrelay[i] -1)) & 3) && SRC_IGNORE != TasmotaGlobal.last_source && SRC_SHUTTER != TasmotaGlobal.last_source && SRC_PULSETIMER != TasmotaGlobal.last_source ; uint8 manual_relays_changed = ((ShutterGlobal.RelayCurrentMask >> (Settings->shutter_startrelay[i] -1)) & 3) && SRC_SHUTTER != TasmotaGlobal.last_source && SRC_PULSETIMER != TasmotaGlobal.last_source ; //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Source %s, Powerstate %ld, RelayMask %d, ManualChange %d"), - i+1, GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource), powerstate_local,ShutterGlobal.RelayCurrentMask,manual_relays_changed); + // i+1, GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource), powerstate_local,ShutterGlobal.RelayCurrentMask,manual_relays_changed); if (manual_relays_changed) { //ShutterGlobal.skip_relay_change = true; ShutterLimitRealAndTargetPositions(i); From a2c34214e0e312bfa75b9dbb50b6d351f8cdafc1 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 13:02:36 +0100 Subject: [PATCH 07/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 91 ++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index fcdff233c..7143c1170 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -59,7 +59,7 @@ const char kShutterCommands[] PROGMEM = D_PRFX_SHUTTER "|" 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_STOPTOGGLEDIR "|" D_CMND_SHUTTER_STOPPOSITION "|" D_CMND_SHUTTER_INCDEC "|" - D_CMND_SHUTTER_UNITTEST "|" D_CMND_SHUTTER_TILTCONFIG "|" D_CMND_SHUTTER_SETTILT "|"; + D_CMND_SHUTTER_UNITTEST "|" D_CMND_SHUTTER_TILTCONFIG "|" D_CMND_SHUTTER_SETTILT "|" D_CMND_SHUTTER_TILTINCDEC "|"; void (* const ShutterCommand[])(void) PROGMEM = { &CmndShutterOpen, &CmndShutterClose, &CmndShutterToggle, &CmndShutterToggleDir, &CmndShutterStop, &CmndShutterPosition, @@ -67,7 +67,7 @@ void (* const ShutterCommand[])(void) PROGMEM = { &CmndShutterSetHalfway, &CmndShutterSetClose, &CmndShutterSetOpen, &CmndShutterInvert, &CmndShutterCalibration , &CmndShutterMotorDelay, &CmndShutterFrequency, &CmndShutterButton, &CmndShutterLock, &CmndShutterEnableEndStopTime, &CmndShutterInvertWebButtons, &CmndShutterStopOpen, &CmndShutterStopClose, &CmndShutterStopToggle, &CmndShutterStopToggleDir, &CmndShutterStopPosition, &CmndShutterIncDec, - &CmndShutterUnitTest,&CmndShutterTiltConfig,&CmndShutterSetTilt}; + &CmndShutterUnitTest,&CmndShutterTiltConfig,&CmndShutterSetTilt,&CmndShutterTiltIncDec}; const char JSON_SHUTTER_POS[] PROGMEM = "\"" D_PRFX_SHUTTER "%d\":{\"Position\":%d,\"Direction\":%d,\"Target\":%d,\"Tilt\":%d}"; const char JSON_SHUTTER_BUTTON[] PROGMEM = "\"" D_PRFX_SHUTTER "%d\":{\"Button%d\":%d}"; @@ -102,7 +102,7 @@ struct SHUTTER { uint16_t venetian_delay = 0; // Delay in steps before venetian shutter start physical moving. Based on tilt position uint16_t min_realPositionChange = 0; // minimum change of the position before the shutter operates. different for PWM and time based operations uint16_t min_TiltChange = 0; // minimum change of the tilt before the shutter operates. different for PWM and time based operations - uint16_t missed_steps =0; + uint16_t last_reported_time =0; } Shutter[MAX_SHUTTERS]; struct SHUTTERGLOBAL { @@ -530,11 +530,12 @@ void ShutterUpdatePosition(void) XdrvRulesProcess(0); ShutterGlobal.start_reported = 1; } + int32_t deltatime = Shutter[i].time-Shutter[i].last_reported_time; + Shutter[i].last_reported_time = Shutter[i].time+1; AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d(%d), cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d, TrgtTilt: %d, Tiltmove: %d"), - Shutter[i].time, Shutter[i].time-Shutter[i].missed_steps,current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, + Shutter[i].time, deltatime, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction,Shutter[i].tilt_real_pos, Shutter[i].tilt_target_pos, Shutter[i].tiltmoving); - Shutter[i].missed_steps = Shutter[i].time+1; if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) || ((int16_t)Shutter[i].tilt_real_pos * Shutter[i].direction * Shutter[i].tilt_config[2] >= (int16_t)Shutter[i].tilt_target_pos * Shutter[i].direction * Shutter[i].tilt_config[2] && Shutter[i].tiltmoving==1)) || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].accelerator 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; - } - } - } - XdrvMailbox.data[0] = '\0'; - ResponseCmndNumber(Shutter[XdrvMailbox.index -1].tilt_target_pos); - Shutter[XdrvMailbox.index -1].tiltmoving = 1; - CmndShutterPosition(); -} - void CmndShutterFrequency(void) { if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 20000)) { @@ -1569,7 +1546,8 @@ void CmndShutterCalibration(void) } } -void ShutterOptionsSetHelper(uint16_t option){ +void ShutterOptionsSetHelper(uint16_t option) +{ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { if (XdrvMailbox.payload == 0) { Settings->shutter_options[XdrvMailbox.index -1] &= ~(option); @@ -1580,23 +1558,52 @@ void ShutterOptionsSetHelper(uint16_t option){ } } -void CmndShutterInvert(void) { +void CmndShutterInvert(void) +{ ShutterOptionsSetHelper(1); } -void CmndShutterLock(void) { +void CmndShutterLock(void) +{ ShutterOptionsSetHelper(2); } -void CmndShutterEnableEndStopTime(void) { +void CmndShutterEnableEndStopTime(void) +{ ShutterOptionsSetHelper(4); } -void CmndShutterInvertWebButtons(void) { +void CmndShutterInvertWebButtons(void) +{ ShutterOptionsSetHelper(8); } -void CmndShutterTiltConfig(void) { +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; + } + } + } + XdrvMailbox.data[0] = '\0'; + ResponseCmndNumber(Shutter[XdrvMailbox.index -1].tilt_target_pos); + Shutter[XdrvMailbox.index -1].tiltmoving = 1; + CmndShutterPosition(); +} + +void CmndShutterTiltConfig(void) +{ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { if (XdrvMailbox.data_len > 0) { uint8_t i = 0; @@ -1618,6 +1625,18 @@ void CmndShutterTiltConfig(void) { } } +void CmndShutterTiltIncDec(void) +{ + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Change in: payload %s (%d), payload %d, idx %d, src %d"), XdrvMailbox.data , XdrvMailbox.data_len, XdrvMailbox.payload , XdrvMailbox.index, TasmotaGlobal.last_source ); + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { + if (XdrvMailbox.data_len > 0) { + XdrvMailbox.payload = Shutter[XdrvMailbox.index -1].tilt_target_pos+XdrvMailbox.payload; + CmndShutterSetTilt(); + } + } + ResponseCmndNumber(Shutter[XdrvMailbox.index -1].tilt_target_pos); +} + /*********************************************************************************************\ * Interface \*********************************************************************************************/ From 65be8e6b59e06cd154d098511f9e5aa8a841da8f Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 13:04:02 +0100 Subject: [PATCH 08/16] Introduced: shuttertiltchange shuttertiltchange allows a change of the tilt. Most likely used with buttons --- tasmota/i18n.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index c08703e0f..1b8115d28 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -694,6 +694,7 @@ #define D_CMND_SHUTTER_UNITTEST "UnitTest" #define D_CMND_SHUTTER_TILTCONFIG "TiltConfig" #define D_CMND_SHUTTER_SETTILT "Tilt" +#define D_CMND_SHUTTER_TILTINCDEC "TiltChange" // Commands xdrv_32_hotplug.ino #define D_CMND_HOTPLUG "HotPlug" From 834244d2e10dda31ddacef4b96b2d599618be15d Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 13:46:22 +0100 Subject: [PATCH 09/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 7143c1170..110740746 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -47,6 +47,7 @@ int32_t current_stop_way = 0; int32_t next_possible_stop_position = 0; int32_t current_real_position = 0; int32_t current_pwm_velocity = 0; +int8_t savedata_original = 0; const uint8_t MAX_MODES = 7; enum Shutterposition_mode {SHT_UNDEF, SHT_TIME, SHT_TIME_UP_DOWN, SHT_TIME_GARAGE, SHT_COUNTER, SHT_PWM_VALUE, SHT_PWM_TIME,}; @@ -516,6 +517,8 @@ void ShutterPowerOff(uint8_t i) ExecuteCommand(scmnd, SRC_BUTTON); break; } + Settings->save_data = savedata_original; + TasmotaGlobal.save_data_counter = Settings->save_data; delay(MOTOR_STOP_TIME); } @@ -601,7 +604,7 @@ void ShutterAllowPreStartProcedure(uint8_t i) void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos) { - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: dir %d, delta1 %d, delta2 %d"),direction, (Shutter[i].open_max - Shutter[i].real_position) / Shutter[i].close_velocity, Shutter[i].real_position / Shutter[i].close_velocity); + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: dir %d, delta1 %d, delta2 %d"),direction, (Shutter[i].open_max - Shutter[i].real_position) / Shutter[i].close_velocity, Shutter[i].real_position / Shutter[i].close_velocity); if ( ( ( (1 == direction) && ((Shutter[i].open_max - Shutter[i].real_position) <= Shutter[i].min_realPositionChange)) || ( (-1 == direction) && (Shutter[i].real_position <= Shutter[i].min_realPositionChange)) ) && abs(Shutter[i].tilt_real_pos-Shutter[i].tilt_target_pos) <= Shutter[i].min_TiltChange) { @@ -617,12 +620,19 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos) break; #endif } + Shutter[i].accelerator = ShutterGlobal.open_velocity_max / (Shutter[i].motordelay>0 ? Shutter[i].motordelay : 1); Shutter[i].target_position = target_pos; Shutter[i].start_position = Shutter[i].real_position; TasmotaGlobal.rules_flag.shutter_moving = 1; ShutterAllowPreStartProcedure(i); Shutter[i].time = 0; + + // avoid file system writes during move to minimize missing steps + savedata_original = Settings->save_data; + Settings->save_data = 0; // will be restored after movement + TasmotaGlobal.save_data_counter = Settings->save_data; + Shutter[i].direction = direction; Shutter[i].last_reported_time = 1; ShutterGlobal.skip_relay_change = 0; @@ -633,11 +643,12 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos) if (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0] != 0) { Shutter[i].venetian_delay = (Shutter[i].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 , Shutter[i].direction ,ShutterGlobal.open_velocity_max ); - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: %d VenetianDelay: %d, Pos: %d, Dir: %d, Delta: %d, Durat: %d, Start: %d, Target: %d"), - i, Shutter[i].venetian_delay, Shutter[i].tilt_real_pos,Shutter[i].direction,(Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]), Shutter[i].tilt_config[2],Shutter[i].tilt_start_pos,Shutter[i].tilt_target_pos); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: VenetianDelay: %d, Pos: %d, Dir: %d, Delta: %d, Dur: %d, StartP: %d, TgtP: %d"), + Shutter[i].venetian_delay, Shutter[i].tilt_real_pos,Shutter[i].direction,(Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]), Shutter[i].tilt_config[2],Shutter[i].tilt_start_pos,Shutter[i].tilt_target_pos); } } - AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Start shtr%d from %d to %d in direction %d"), i, Shutter[i].start_position, Shutter[i].target_position, Shutter[i].direction); + //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Start shtr%d from %d to %d in dir: %d"), i, Shutter[i].start_position, Shutter[i].target_position, direction); + Shutter[i].direction = direction; // Last action. This causes RTC to start. } int32_t ShutterCalculatePosition(uint32_t i) @@ -957,7 +968,7 @@ void ShutterSetPosition(uint32_t device, uint32_t position) void ShutterToggle(bool dir) { - AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Payload toggle: %d, i %d, dir %d, lastdir %d"), XdrvMailbox.payload, XdrvMailbox.index, dir, Shutter[XdrvMailbox.index-1].lastdirection); + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Toggle: %d, i %d, dir %d, lastdir %d"), XdrvMailbox.payload, XdrvMailbox.index, dir, Shutter[XdrvMailbox.index-1].lastdirection); if ((1 == XdrvMailbox.index) && (XdrvMailbox.payload != -99)) { XdrvMailbox.index = XdrvMailbox.payload; } From 79979a27fb5c3ef8ca5c29b5f510d7d4734006af Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 14:00:49 +0100 Subject: [PATCH 10/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 110740746..7d988e193 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -626,15 +626,12 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos) Shutter[i].start_position = Shutter[i].real_position; TasmotaGlobal.rules_flag.shutter_moving = 1; ShutterAllowPreStartProcedure(i); - Shutter[i].time = 0; + Shutter[i].time = Shutter[i].last_reported_time = 0; // avoid file system writes during move to minimize missing steps savedata_original = Settings->save_data; Settings->save_data = 0; // will be restored after movement TasmotaGlobal.save_data_counter = Settings->save_data; - - Shutter[i].direction = direction; - Shutter[i].last_reported_time = 1; ShutterGlobal.skip_relay_change = 0; TasmotaGlobal.rules_flag.shutter_moved = 0; ShutterGlobal.start_reported = 0; From 6e120aa0b83f20adfa62418eefa630c8547ecf97 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 15:28:14 +0100 Subject: [PATCH 11/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 7d988e193..e9200c0b6 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -638,10 +638,10 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos) 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) { - Shutter[i].venetian_delay = (Shutter[i].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 , Shutter[i].direction ,ShutterGlobal.open_velocity_max ); + Shutter[i].venetian_delay = (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"), - Shutter[i].venetian_delay, Shutter[i].tilt_real_pos,Shutter[i].direction,(Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]), Shutter[i].tilt_config[2],Shutter[i].tilt_start_pos,Shutter[i].tilt_target_pos); + Shutter[i].venetian_delay, Shutter[i].tilt_real_pos,direction,(Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]), Shutter[i].tilt_config[2],Shutter[i].tilt_start_pos,Shutter[i].tilt_target_pos); } } //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Start shtr%d from %d to %d in dir: %d"), i, Shutter[i].start_position, Shutter[i].target_position, direction); From c8e03e2d3b81badc63067430b2565acff4bcab9e Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 17:05:45 +0100 Subject: [PATCH 12/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index e9200c0b6..9fcfa74d9 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -328,7 +328,8 @@ void ShutterInit(void) for (uint8_t k=0; k<5; k++) { Shutter[i].tilt_config[k] = Settings->shutter_tilt_config[k][i]; } - Shutter[i].tilt_real_pos = Settings->shutter_tilt_pos[i]; + Shutter[i].tilt_target_pos = Shutter[i].tilt_real_pos = Settings->shutter_tilt_pos[i]; + Shutter[i].tilt_velocity = Shutter[i].tilt_config[2] > 0 ? ((Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0])/Shutter[i].tilt_config[2])+1 : 1; Shutter[i].close_velocity_max = ShutterGlobal.open_velocity_max*Shutter[i].open_time / Shutter[i].close_time; @@ -553,7 +554,8 @@ void ShutterUpdatePosition(void) // manage venetian blinds Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 0 ? Shutter[i].tilt_config[0] : Shutter[i].tilt_target_pos; Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 100 ? Shutter[i].tilt_config[1] : Shutter[i].tilt_target_pos; - if (abs(Shutter[i].tilt_real_pos - Shutter[i].tilt_target_pos) > Shutter[i].min_TiltChange) { + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Pre: Tilt not match %d -> %d, moving: %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos,Shutter[i].tiltmoving); + if (abs(Shutter[i].tilt_real_pos - Shutter[i].tilt_target_pos) > Shutter[i].min_TiltChange && Shutter[i].tiltmoving == 0) { AddLog(LOG_LEVEL_INFO, PSTR("SHT: Tilt not match %d -> %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos); XdrvMailbox.payload = -99; XdrvMailbox.index = i+1; From 5e799716a7275807c4d0e3ccc220faf1acf05b1e Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 20:07:41 +0100 Subject: [PATCH 13/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 91 ++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 9fcfa74d9..609dd7628 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -125,6 +125,7 @@ void ShutterLogPos(uint32_t i) AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Real %d, Start %d, Stop %d, Dir %d, Delay %d, Rtc %s [s], Freq %d, PWM %d, Tilt %d"), i+1, Shutter[i].real_position, Shutter[i].start_position, Shutter[i].target_position, Shutter[i].direction, Shutter[i].motordelay, stemp2, Shutter[i].pwm_velocity, Shutter[i].pwm_value,Shutter[i].tilt_real_pos); + yield(); } void ExecuteCommandPowerShutter(uint32_t device, uint32_t state, uint32_t source) @@ -365,7 +366,7 @@ void ShutterInit(void) void ShutterReportPosition(bool always, uint32_t index) { Response_P(PSTR("{")); - TasmotaGlobal.rules_flag.shutter_moving = 0; + //TasmotaGlobal.rules_flag.shutter_moving = 0; uint32_t i = 0; uint32_t n = TasmotaGlobal.shutters_present; if( index != MAX_SHUTTERS) { @@ -376,7 +377,7 @@ void ShutterReportPosition(bool always, uint32_t index) //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Real Pos %d"), i+1,Shutter[i].real_position); uint32_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i); if (Shutter[i].direction != 0) { - TasmotaGlobal.rules_flag.shutter_moving = 1; + //TasmotaGlobal.rules_flag.shutter_moving = 1; ShutterLogPos(i); } if (i && index == MAX_SHUTTERS) { ResponseAppend_P(PSTR(",")); } @@ -479,6 +480,7 @@ void ShutterPowerOff(uint8_t i) if (Shutter[i].direction !=0) { Shutter[i].direction = 0; } + TasmotaGlobal.rules_flag.shutter_moving = 0; switch (Shutter[i].switch_mode) { case SHT_SWITCH: if ((1 << (Settings->shutter_startrelay[i]-1)) & TasmotaGlobal.power) { @@ -535,46 +537,48 @@ void ShutterUpdatePosition(void) ShutterGlobal.start_reported = 1; } int32_t deltatime = Shutter[i].time-Shutter[i].last_reported_time; - Shutter[i].last_reported_time = Shutter[i].time+1; - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d(%d), cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d, TrgtTilt: %d, Tiltmove: %d"), - Shutter[i].time, deltatime, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, - next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction,Shutter[i].tilt_real_pos, Shutter[i].tilt_target_pos, - Shutter[i].tiltmoving); - if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) || - ((int16_t)Shutter[i].tilt_real_pos * Shutter[i].direction * Shutter[i].tilt_config[2] >= (int16_t)Shutter[i].tilt_target_pos * Shutter[i].direction * Shutter[i].tilt_config[2] && Shutter[i].tiltmoving==1)) - || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].acceleratorshutter_position[i] = ShutterRealToPercentPosition(Shutter[i].real_position, i); - Shutter[i].start_position = Shutter[i].real_position; + if (deltatime >= 0) { + Shutter[i].last_reported_time = Shutter[i].time+1; + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d(%d), cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d, TrgtTilt: %d, Tiltmove: %d"), + Shutter[i].time, deltatime, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, + next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction,Shutter[i].tilt_real_pos, Shutter[i].tilt_target_pos, + Shutter[i].tiltmoving); + if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) || + ((int16_t)Shutter[i].tilt_real_pos * Shutter[i].direction * Shutter[i].tilt_config[2] >= (int16_t)Shutter[i].tilt_target_pos * Shutter[i].direction * Shutter[i].tilt_config[2] && Shutter[i].tiltmoving==1)) + || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].acceleratorshutter_position[i] = ShutterRealToPercentPosition(Shutter[i].real_position, i); + Shutter[i].start_position = Shutter[i].real_position; - // manage venetian blinds - Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 0 ? Shutter[i].tilt_config[0] : Shutter[i].tilt_target_pos; - Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 100 ? Shutter[i].tilt_config[1] : Shutter[i].tilt_target_pos; - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Pre: Tilt not match %d -> %d, moving: %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos,Shutter[i].tiltmoving); - if (abs(Shutter[i].tilt_real_pos - Shutter[i].tilt_target_pos) > Shutter[i].min_TiltChange && Shutter[i].tiltmoving == 0) { - AddLog(LOG_LEVEL_INFO, PSTR("SHT: Tilt not match %d -> %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos); - XdrvMailbox.payload = -99; - XdrvMailbox.index = i+1; - Shutter[i].tiltmoving = 1; - CmndShutterPosition(); - return; - } else { - Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; - } - ShutterLogPos(i); + // manage venetian blinds + Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 0 ? Shutter[i].tilt_config[0] : Shutter[i].tilt_target_pos; + Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 100 ? Shutter[i].tilt_config[1] : Shutter[i].tilt_target_pos; + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Pre: Tilt not match %d -> %d, moving: %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos,Shutter[i].tiltmoving); + if (abs(Shutter[i].tilt_real_pos - Shutter[i].tilt_target_pos) > Shutter[i].min_TiltChange && Shutter[i].tiltmoving == 0) { + AddLog(LOG_LEVEL_INFO, PSTR("SHT: Tilt not match %d -> %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos); + XdrvMailbox.payload = -99; + XdrvMailbox.index = i+1; + Shutter[i].tiltmoving = 1; + CmndShutterPosition(); + return; + } else { + Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; + } + ShutterLogPos(i); - // sending MQTT result to broker - snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1); - GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, scommand); - Response_P("%d", (Settings->shutter_options[i] & 1) ? 100 - Settings->shutter_position[i]: Settings->shutter_position[i]); - MqttPublish(stopic, Settings->flag.mqtt_power_retain); // CMND_POWERRETAIN - ShutterReportPosition(true, i); - TasmotaGlobal.rules_flag.shutter_moved = 1; - XdrvRulesProcess(0); + // sending MQTT result to broker + snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1); + GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, scommand); + Response_P("%d", (Settings->shutter_options[i] & 1) ? 100 - Settings->shutter_position[i]: Settings->shutter_position[i]); + MqttPublish(stopic, Settings->flag.mqtt_power_retain); // CMND_POWERRETAIN + ShutterReportPosition(true, i); + TasmotaGlobal.rules_flag.shutter_moved = 1; + XdrvRulesProcess(0); + } // timeloop } } } @@ -594,7 +598,7 @@ void ShutterAllowPreStartProcedure(uint8_t i) #ifdef USE_RULES uint32_t uptime_Local=0; AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start? var%d <99>=<%s>, max10s?"),i+1, rules_vars[i]); - TasmotaGlobal.rules_flag.shutter_moving = 1; + //TasmotaGlobal.rules_flag.shutter_moving = 1; XdrvRulesProcess(0); uptime_Local = TasmotaGlobal.uptime; while (uptime_Local+10 > TasmotaGlobal.uptime && (String)rules_vars[i] == "99") { @@ -1660,9 +1664,12 @@ bool Xdrv27(uint8_t function) case FUNC_PRE_INIT: ShutterInit(); break; - case FUNC_EVERY_50_MSECOND: + case FUNC_LOOP: ShutterUpdatePosition(); break; +// case FUNC_EVERY_50_MSECOND: +// ShutterUpdatePosition(); +// break; case FUNC_EVERY_SECOND: //case FUNC_EVERY_250_MSECOND: ShutterReportPosition(false, MAX_SHUTTERS); From d20ac1138ac9fe9f68a916155328d7d3e4290538 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 21:11:34 +0100 Subject: [PATCH 14/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 609dd7628..0f6cfb1b1 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -366,7 +366,6 @@ void ShutterInit(void) void ShutterReportPosition(bool always, uint32_t index) { Response_P(PSTR("{")); - //TasmotaGlobal.rules_flag.shutter_moving = 0; uint32_t i = 0; uint32_t n = TasmotaGlobal.shutters_present; if( index != MAX_SHUTTERS) { @@ -377,7 +376,6 @@ void ShutterReportPosition(bool always, uint32_t index) //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Real Pos %d"), i+1,Shutter[i].real_position); uint32_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i); if (Shutter[i].direction != 0) { - //TasmotaGlobal.rules_flag.shutter_moving = 1; ShutterLogPos(i); } if (i && index == MAX_SHUTTERS) { ResponseAppend_P(PSTR(",")); } @@ -385,7 +383,7 @@ void ShutterReportPosition(bool always, uint32_t index) ResponseAppend_P(JSON_SHUTTER_POS, i+1, (Settings->shutter_options[i] & 1) ? 100-position : position, Shutter[i].direction,(Settings->shutter_options[i] & 1) ? 100-target : target, Shutter[i].tilt_real_pos ); } ResponseJsonEnd(); - if (always || (TasmotaGlobal.rules_flag.shutter_moving)) { + if (always || Shutter[i].direction != 0) { MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); // RulesProcess() now re-entry protected } //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: rules_flag.shutter_moving: %d, moved %d"), TasmotaGlobal.rules_flag.shutter_moving, TasmotaGlobal.rules_flag.shutter_moved); @@ -480,7 +478,7 @@ void ShutterPowerOff(uint8_t i) if (Shutter[i].direction !=0) { Shutter[i].direction = 0; } - TasmotaGlobal.rules_flag.shutter_moving = 0; + TasmotaGlobal.rules_flag.shutter_moved = 1; switch (Shutter[i].switch_mode) { case SHT_SWITCH: if ((1 << (Settings->shutter_startrelay[i]-1)) & TasmotaGlobal.power) { @@ -598,7 +596,6 @@ void ShutterAllowPreStartProcedure(uint8_t i) #ifdef USE_RULES uint32_t uptime_Local=0; AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start? var%d <99>=<%s>, max10s?"),i+1, rules_vars[i]); - //TasmotaGlobal.rules_flag.shutter_moving = 1; XdrvRulesProcess(0); uptime_Local = TasmotaGlobal.uptime; while (uptime_Local+10 > TasmotaGlobal.uptime && (String)rules_vars[i] == "99") { @@ -637,6 +634,7 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos) // avoid file system writes during move to minimize missing steps savedata_original = Settings->save_data; Settings->save_data = 0; // will be restored after movement + TasmotaGlobal.save_data_counter = Settings->save_data; ShutterGlobal.skip_relay_change = 0; TasmotaGlobal.rules_flag.shutter_moved = 0; @@ -1664,12 +1662,9 @@ bool Xdrv27(uint8_t function) case FUNC_PRE_INIT: ShutterInit(); break; - case FUNC_LOOP: + case FUNC_EVERY_50_MSECOND: ShutterUpdatePosition(); break; -// case FUNC_EVERY_50_MSECOND: -// ShutterUpdatePosition(); -// break; case FUNC_EVERY_SECOND: //case FUNC_EVERY_250_MSECOND: ShutterReportPosition(false, MAX_SHUTTERS); From 8679cf52f5790209291d039388e78e2f35c0a90c Mon Sep 17 00:00:00 2001 From: stefanbode Date: Tue, 16 Nov 2021 21:21:04 +0100 Subject: [PATCH 15/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 0f6cfb1b1..a85ef0355 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -368,6 +368,7 @@ void ShutterReportPosition(bool always, uint32_t index) Response_P(PSTR("{")); uint32_t i = 0; uint32_t n = TasmotaGlobal.shutters_present; + uint8_t shutter_running = 0; if( index != MAX_SHUTTERS) { i = index; n = index+1; @@ -377,13 +378,14 @@ void ShutterReportPosition(bool always, uint32_t index) uint32_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i); if (Shutter[i].direction != 0) { ShutterLogPos(i); + shutter_running++; } if (i && index == MAX_SHUTTERS) { ResponseAppend_P(PSTR(",")); } uint32_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i); ResponseAppend_P(JSON_SHUTTER_POS, i+1, (Settings->shutter_options[i] & 1) ? 100-position : position, Shutter[i].direction,(Settings->shutter_options[i] & 1) ? 100-target : target, Shutter[i].tilt_real_pos ); } ResponseJsonEnd(); - if (always || Shutter[i].direction != 0) { + if (always || shutter_running) { MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); // RulesProcess() now re-entry protected } //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: rules_flag.shutter_moving: %d, moved %d"), TasmotaGlobal.rules_flag.shutter_moving, TasmotaGlobal.rules_flag.shutter_moved); From 152663e021e6217fdd885f29d44e1a41086c7c18 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 17 Nov 2021 11:28:27 +0100 Subject: [PATCH 16/16] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 79 ++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index a85ef0355..f7ddfb222 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -125,7 +125,6 @@ void ShutterLogPos(uint32_t i) AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Real %d, Start %d, Stop %d, Dir %d, Delay %d, Rtc %s [s], Freq %d, PWM %d, Tilt %d"), i+1, Shutter[i].real_position, Shutter[i].start_position, Shutter[i].target_position, Shutter[i].direction, Shutter[i].motordelay, stemp2, Shutter[i].pwm_velocity, Shutter[i].pwm_value,Shutter[i].tilt_real_pos); - yield(); } void ExecuteCommandPowerShutter(uint32_t device, uint32_t state, uint32_t source) @@ -537,48 +536,46 @@ void ShutterUpdatePosition(void) ShutterGlobal.start_reported = 1; } int32_t deltatime = Shutter[i].time-Shutter[i].last_reported_time; - if (deltatime >= 0) { - Shutter[i].last_reported_time = Shutter[i].time+1; - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d(%d), cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d, TrgtTilt: %d, Tiltmove: %d"), - Shutter[i].time, deltatime, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, - next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction,Shutter[i].tilt_real_pos, Shutter[i].tilt_target_pos, - Shutter[i].tiltmoving); - if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) || - ((int16_t)Shutter[i].tilt_real_pos * Shutter[i].direction * Shutter[i].tilt_config[2] >= (int16_t)Shutter[i].tilt_target_pos * Shutter[i].direction * Shutter[i].tilt_config[2] && Shutter[i].tiltmoving==1)) - || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].acceleratorshutter_position[i] = ShutterRealToPercentPosition(Shutter[i].real_position, i); - Shutter[i].start_position = Shutter[i].real_position; + Shutter[i].last_reported_time = Shutter[i].time+1; + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d(%d), cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d, TrgtTilt: %d, Tiltmove: %d"), + Shutter[i].time, deltatime, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position, + next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction,Shutter[i].tilt_real_pos, Shutter[i].tilt_target_pos, + Shutter[i].tiltmoving); + if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) || + ((int16_t)Shutter[i].tilt_real_pos * Shutter[i].direction * Shutter[i].tilt_config[2] >= (int16_t)Shutter[i].tilt_target_pos * Shutter[i].direction * Shutter[i].tilt_config[2] && Shutter[i].tiltmoving==1)) + || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].acceleratorshutter_position[i] = ShutterRealToPercentPosition(Shutter[i].real_position, i); + Shutter[i].start_position = Shutter[i].real_position; - // manage venetian blinds - Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 0 ? Shutter[i].tilt_config[0] : Shutter[i].tilt_target_pos; - Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 100 ? Shutter[i].tilt_config[1] : Shutter[i].tilt_target_pos; - //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Pre: Tilt not match %d -> %d, moving: %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos,Shutter[i].tiltmoving); - if (abs(Shutter[i].tilt_real_pos - Shutter[i].tilt_target_pos) > Shutter[i].min_TiltChange && Shutter[i].tiltmoving == 0) { - AddLog(LOG_LEVEL_INFO, PSTR("SHT: Tilt not match %d -> %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos); - XdrvMailbox.payload = -99; - XdrvMailbox.index = i+1; - Shutter[i].tiltmoving = 1; - CmndShutterPosition(); - return; - } else { - Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; - } - ShutterLogPos(i); + // manage venetian blinds + Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 0 ? Shutter[i].tilt_config[0] : Shutter[i].tilt_target_pos; + Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 100 ? Shutter[i].tilt_config[1] : Shutter[i].tilt_target_pos; + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Pre: Tilt not match %d -> %d, moving: %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos,Shutter[i].tiltmoving); + if (abs(Shutter[i].tilt_real_pos - Shutter[i].tilt_target_pos) > Shutter[i].min_TiltChange && Shutter[i].tiltmoving == 0) { + AddLog(LOG_LEVEL_INFO, PSTR("SHT: Tilt not match %d -> %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos); + XdrvMailbox.payload = -99; + XdrvMailbox.index = i+1; + Shutter[i].tiltmoving = 1; + CmndShutterPosition(); + return; + } else { + Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; + } + ShutterLogPos(i); - // sending MQTT result to broker - snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1); - GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, scommand); - Response_P("%d", (Settings->shutter_options[i] & 1) ? 100 - Settings->shutter_position[i]: Settings->shutter_position[i]); - MqttPublish(stopic, Settings->flag.mqtt_power_retain); // CMND_POWERRETAIN - ShutterReportPosition(true, i); - TasmotaGlobal.rules_flag.shutter_moved = 1; - XdrvRulesProcess(0); - } // timeloop + // sending MQTT result to broker + snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1); + GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, scommand); + Response_P("%d", (Settings->shutter_options[i] & 1) ? 100 - Settings->shutter_position[i]: Settings->shutter_position[i]); + MqttPublish(stopic, Settings->flag.mqtt_power_retain); // CMND_POWERRETAIN + ShutterReportPosition(true, i); + TasmotaGlobal.rules_flag.shutter_moved = 1; + XdrvRulesProcess(0); } } }