From 1b451e722f38a4e3bd659c9737019af03dec4347 Mon Sep 17 00:00:00 2001 From: kabongsteve Date: Sat, 4 Jan 2020 12:36:05 +1100 Subject: [PATCH] Improve multiple shutter operation and MQTT --- tasmota/i18n.h | 2 + tasmota/xdrv_27_shutter.ino | 84 +++++++++++++++++++++---------------- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index f5fa90e82..fb54edd4a 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -500,6 +500,8 @@ #define D_PRFX_SHUTTER "Shutter" #define D_CMND_SHUTTER_OPEN "Open" #define D_CMND_SHUTTER_CLOSE "Close" +#define D_CMND_SHUTTER_UP "Up" +#define D_CMND_SHUTTER_DOWN "Down" #define D_CMND_SHUTTER_STOP "Stop" #define D_CMND_SHUTTER_POSITION "Position" #define D_CMND_SHUTTER_OPENTIME "OpenDuration" diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index aa7d13e3c..afa07e35d 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -242,6 +242,39 @@ void ShutterInit(void) } } + +void ShutterReportPosition(bool always = false) +{ + uint16_t shutter_moving = 0; + Response_P(PSTR("{")); + for (uint8_t i = 0; i < shutters_present; i++) { + //AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Shutter %d: Real Pos: %d"), i+1,Shutter.real_position[i]); + uint8_t position = ShutterRealToPercentPosition(Shutter.real_position[i], i); + if (Shutter.direction[i] != 0) { + char stemp2[10]; + uint8_t position = ShutterRealToPercentPosition(Shutter.real_position[i], i); + dtostrfd((float)Shutter.time[i] / steps_per_second, 2, stemp2); + shutter_moving = 1; + //Settings.shutter_position[i] = Settings.shuttercoeff[2][i] * 5 > Shutter.real_position[i] ? Shutter.real_position[i] / Settings.shuttercoeff[2][i] : (Shutter.real_position[i]-Settings.shuttercoeff[0,i]) / Settings.shuttercoeff[1][i]; + AddLog_P2(LOG_LEVEL_INFO, MSG_SHUTTER_POS, i+1, Shutter.real_position[i], Shutter.start_position[i], Shutter.target_position[i], Shutter.direction[i], Shutter.motordelay[i],stemp2,Shutter.pwm_frequency); + } + ResponseAppend_P(JSON_SHUTTER_POS, i+1, Settings.shutter_invert[i] ? 100-position : position, Shutter.direction[i]); + if (i < shutters_present - 1) + ResponseAppend_P(PSTR(", ")); + } + ResponseJsonEnd(); + if (always || shutter_moving == 1) { + MqttPublishPrefixTopic_P(RESULT_OR_TELE, mqtt_data); + } + if (rules_flag.shutter_moving > shutter_moving) { + rules_flag.shutter_moved = 1; + } else { + rules_flag.shutter_moved = 0; + } + rules_flag.shutter_moving = shutter_moving; + //AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: rules_flag.shutter_moving: %d, moved %d"), rules_flag.shutter_moving, rules_flag.shutter_moved); +} + void ShutterUpdatePosition(void) { @@ -344,11 +377,7 @@ void ShutterUpdatePosition(void) MqttPublish(stopic, Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN Shutter.direction[i] = 0; - uint8_t position = Settings.shutter_invert[i] ? 100 - Settings.shutter_position[i]: Settings.shutter_position[i]; - Response_P(PSTR("{")); - ResponseAppend_P(JSON_SHUTTER_POS, i+1, position, 0 /*Shutter.direction[i]*/); - ResponseJsonEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, mqtt_data); + ShutterReportPosition(true); XdrvRulesProcess(); } } @@ -415,33 +444,6 @@ void ShutterWaitForMotorStop(uint8_t i) } } -void ShutterReportPosition(void) -{ - uint16_t shutter_moving = 0; - for (uint8_t i = 0; i < shutters_present; i++) { - //AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Shutter %d: Real Pos: %d"), i+1,Shutter.real_position[i]); - if (Shutter.direction[i] != 0) { - char stemp2[10]; - uint8_t position = ShutterRealToPercentPosition(Shutter.real_position[i], i); - dtostrfd((float)Shutter.time[i] / steps_per_second, 2, stemp2); - shutter_moving = 1; - //Settings.shutter_position[i] = Settings.shuttercoeff[2][i] * 5 > Shutter.real_position[i] ? Shutter.real_position[i] / Settings.shuttercoeff[2][i] : (Shutter.real_position[i]-Settings.shuttercoeff[0,i]) / Settings.shuttercoeff[1][i]; - AddLog_P2(LOG_LEVEL_INFO, MSG_SHUTTER_POS, i+1, Shutter.real_position[i], Shutter.start_position[i], Shutter.target_position[i], Shutter.direction[i], Shutter.motordelay[i],stemp2,Shutter.pwm_frequency); - Response_P(PSTR("{")); - ResponseAppend_P(JSON_SHUTTER_POS, i+1, Settings.shutter_invert[i] ? 100-position : position, Shutter.direction[i]); - ResponseJsonEnd(); - MqttPublishPrefixTopic_P(RESULT_OR_TELE, mqtt_data); - } - } - if (rules_flag.shutter_moving > shutter_moving) { - rules_flag.shutter_moved = 1; - } else { - rules_flag.shutter_moved = 0; - } - rules_flag.shutter_moving = shutter_moving; - //AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: rules_flag.shutter_moving: %d, moved %d"), rules_flag.shutter_moving, rules_flag.shutter_moved); -} - int32_t ShutterCounterBasedPosition(uint8 i) { return ((int32_t)RtcSettings.pulse_counter[i]*Shutter.direction[i]*2000 / Shutter.max_pwm_frequency)+Shutter.start_position[i]; @@ -660,10 +662,20 @@ void CmndShutterPosition(void) // value 0 with data_len > 0 can mean Open if (XdrvMailbox.data_len > 1 && XdrvMailbox.payload <=0) { - UpperCase(XdrvMailbox.data, XdrvMailbox.data); - if (!strcmp(XdrvMailbox.data,"UP")) { CmndShutterOpen(); return; } - if (!strcmp(XdrvMailbox.data,"DOWN")) { CmndShutterClose(); return; } - if (!strcmp(XdrvMailbox.data,"STOP")) { CmndShutterStop(); return; } + //UpperCase(XdrvMailbox.data, XdrvMailbox.data); + if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_UP) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_OPEN)) { + CmndShutterOpen(); + return; + } + if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_DOWN) || !strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_CLOSE)) { + CmndShutterClose(); + return; + } + if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_STOP)) { + XdrvMailbox.payload = -99; + CmndShutterStop(); + return; + } } int8_t target_pos_percent = XdrvMailbox.payload < 0 ? 0 : (XdrvMailbox.payload > 100 ? 100 : XdrvMailbox.payload);