Update xdrv_27_shutter.ino

This commit is contained in:
stefanbode 2021-11-16 20:07:41 +01:00 committed by GitHub
parent 681f66f157
commit 5e799716a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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"), 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, 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); 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) 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) void ShutterReportPosition(bool always, uint32_t index)
{ {
Response_P(PSTR("{")); Response_P(PSTR("{"));
TasmotaGlobal.rules_flag.shutter_moving = 0; //TasmotaGlobal.rules_flag.shutter_moving = 0;
uint32_t i = 0; uint32_t i = 0;
uint32_t n = TasmotaGlobal.shutters_present; uint32_t n = TasmotaGlobal.shutters_present;
if( index != MAX_SHUTTERS) { 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); //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); uint32_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
if (Shutter[i].direction != 0) { if (Shutter[i].direction != 0) {
TasmotaGlobal.rules_flag.shutter_moving = 1; //TasmotaGlobal.rules_flag.shutter_moving = 1;
ShutterLogPos(i); ShutterLogPos(i);
} }
if (i && index == MAX_SHUTTERS) { ResponseAppend_P(PSTR(",")); } if (i && index == MAX_SHUTTERS) { ResponseAppend_P(PSTR(",")); }
@ -479,6 +480,7 @@ void ShutterPowerOff(uint8_t i)
if (Shutter[i].direction !=0) { if (Shutter[i].direction !=0) {
Shutter[i].direction = 0; Shutter[i].direction = 0;
} }
TasmotaGlobal.rules_flag.shutter_moving = 0;
switch (Shutter[i].switch_mode) { switch (Shutter[i].switch_mode) {
case SHT_SWITCH: case SHT_SWITCH:
if ((1 << (Settings->shutter_startrelay[i]-1)) & TasmotaGlobal.power) { if ((1 << (Settings->shutter_startrelay[i]-1)) & TasmotaGlobal.power) {
@ -535,46 +537,48 @@ void ShutterUpdatePosition(void)
ShutterGlobal.start_reported = 1; ShutterGlobal.start_reported = 1;
} }
int32_t deltatime = Shutter[i].time-Shutter[i].last_reported_time; int32_t deltatime = Shutter[i].time-Shutter[i].last_reported_time;
Shutter[i].last_reported_time = Shutter[i].time+1; if (deltatime >= 0) {
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].last_reported_time = Shutter[i].time+1;
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, 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"),
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].time, deltatime, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position,
Shutter[i].tiltmoving); 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,
if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) || Shutter[i].tiltmoving);
((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)) if ( ((Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction && Shutter[i].tiltmoving==0) ||
|| (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].accelerator<PWM_MIN)) { ((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))
if (Shutter[i].direction != 0) { || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].accelerator<PWM_MIN)) {
Shutter[i].lastdirection = Shutter[i].direction; if (Shutter[i].direction != 0) {
} Shutter[i].lastdirection = Shutter[i].direction;
ShutterPowerOff(i); }
ShutterLimitRealAndTargetPositions(i); ShutterPowerOff(i);
Settings->shutter_position[i] = ShutterRealToPercentPosition(Shutter[i].real_position, i); ShutterLimitRealAndTargetPositions(i);
Shutter[i].start_position = Shutter[i].real_position; Settings->shutter_position[i] = ShutterRealToPercentPosition(Shutter[i].real_position, i);
Shutter[i].start_position = Shutter[i].real_position;
// manage venetian blinds // 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] == 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; 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); //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) { 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); 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.payload = -99;
XdrvMailbox.index = i+1; XdrvMailbox.index = i+1;
Shutter[i].tiltmoving = 1; Shutter[i].tiltmoving = 1;
CmndShutterPosition(); CmndShutterPosition();
return; return;
} else { } else {
Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos; Settings->shutter_tilt_pos[i] = Shutter[i].tilt_real_pos;
} }
ShutterLogPos(i); ShutterLogPos(i);
// sending MQTT result to broker // sending MQTT result to broker
snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1); snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1);
GetTopic_P(stopic, STAT, TasmotaGlobal.mqtt_topic, scommand); 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]); 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 MqttPublish(stopic, Settings->flag.mqtt_power_retain); // CMND_POWERRETAIN
ShutterReportPosition(true, i); ShutterReportPosition(true, i);
TasmotaGlobal.rules_flag.shutter_moved = 1; TasmotaGlobal.rules_flag.shutter_moved = 1;
XdrvRulesProcess(0); XdrvRulesProcess(0);
} // timeloop
} }
} }
} }
@ -594,7 +598,7 @@ void ShutterAllowPreStartProcedure(uint8_t i)
#ifdef USE_RULES #ifdef USE_RULES
uint32_t uptime_Local=0; uint32_t uptime_Local=0;
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start? var%d <99>=<%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; //TasmotaGlobal.rules_flag.shutter_moving = 1;
XdrvRulesProcess(0); XdrvRulesProcess(0);
uptime_Local = TasmotaGlobal.uptime; uptime_Local = TasmotaGlobal.uptime;
while (uptime_Local+10 > TasmotaGlobal.uptime && (String)rules_vars[i] == "99") { while (uptime_Local+10 > TasmotaGlobal.uptime && (String)rules_vars[i] == "99") {
@ -1660,9 +1664,12 @@ bool Xdrv27(uint8_t function)
case FUNC_PRE_INIT: case FUNC_PRE_INIT:
ShutterInit(); ShutterInit();
break; break;
case FUNC_EVERY_50_MSECOND: case FUNC_LOOP:
ShutterUpdatePosition(); ShutterUpdatePosition();
break; break;
// case FUNC_EVERY_50_MSECOND:
// ShutterUpdatePosition();
// break;
case FUNC_EVERY_SECOND: case FUNC_EVERY_SECOND:
//case FUNC_EVERY_250_MSECOND: //case FUNC_EVERY_250_MSECOND:
ShutterReportPosition(false, MAX_SHUTTERS); ShutterReportPosition(false, MAX_SHUTTERS);