Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimized behavior to publish shutter data with sensor request #22353

Merged
merged 2 commits into from
Oct 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 22 additions & 14 deletions tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ struct SHUTTERGLOBAL {
bool callibration_run = false; // if true a callibration is running and additional measures are captured
uint8_t stopp_armed = 0; // Count each step power usage is below limit of 1 Watt
uint16_t cycle_time = 0; // used for shuttersetup to get accurate timing
bool sensor_data_reported = false; // ensure that shutter sensor data reported every sedond is only reported if shutter is moving and there is a change.
} ShutterGlobal;

#define SHT_DIV_ROUND(__A, __B) (((__A) + (__B)/2) / (__B))
Expand Down Expand Up @@ -946,7 +947,7 @@ void ShutterRelayChanged(void)

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;
Expand All @@ -958,7 +959,7 @@ void ShutterReportPosition(bool always, uint32_t index)

// Allow function exit if nothing to report (99.9% use case)
if (!always && !shutter_running) return;

Response_P(PSTR("{"));
if( index != MAX_SHUTTERS_ESP32) {
i = index;
n = index+1;
Expand All @@ -976,7 +977,7 @@ void ShutterReportPosition(bool always, uint32_t index)
uint32_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
uint32_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
ResponseAppend_P(JSON_SHUTTER_POS, i + 1, (ShutterSettings.shutter_options[i] & 1) ? 100 - position : position, Shutter[i].direction,(ShutterSettings.shutter_options[i] & 1) ? 100 - target : target, Shutter[i].tilt_real_pos );
}
}
ResponseJsonEnd();
if (always || shutter_running) {
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); // RulesProcess() now re-entry protected
Expand Down Expand Up @@ -1196,6 +1197,7 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos)
Shutter[i].target_position = target_pos;
Shutter[i].start_position = Shutter[i].real_position;
TasmotaGlobal.rules_flag.shutter_moving = 1;
ShutterGlobal.sensor_data_reported = false;
ShutterAllowPreStartProcedure(i);
Shutter[i].time = Shutter[i].last_reported_time = 0;

Expand Down Expand Up @@ -2330,18 +2332,24 @@ bool Xdrv27(uint32_t function)
}
break;
case FUNC_JSON_APPEND:
for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) {
ResponseAppend_P(",");
uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
position = (ShutterSettings.shutter_options[i] & 1) ? 100 - position : position;
uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
target = (ShutterSettings.shutter_options[i] & 1) ? 100 - target : target;
ResponseAppend_P(JSON_SHUTTER_POS, i + 1, position, Shutter[i].direction, target, Shutter[i].tilt_real_pos );
#ifdef USE_DOMOTICZ
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
DomoticzSensor(DZ_SHUTTER, position);
if (!ShutterGlobal.sensor_data_reported) {
ShutterGlobal.sensor_data_reported = true;
for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) {
ResponseAppend_P(",");
uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
position = (ShutterSettings.shutter_options[i] & 1) ? 100 - position : position;
uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
target = (ShutterSettings.shutter_options[i] & 1) ? 100 - target : target;
ResponseAppend_P(JSON_SHUTTER_POS, i + 1, position, Shutter[i].direction, target, Shutter[i].tilt_real_pos );
if (Shutter[i].direction != 0) {
ShutterGlobal.sensor_data_reported = false;
}
#ifdef USE_DOMOTICZ
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
DomoticzSensor(DZ_SHUTTER, position);
}
#endif // USE_DOMOTICZ
}
#endif // USE_DOMOTICZ
}
break;
case FUNC_SET_POWER:
Expand Down
26 changes: 17 additions & 9 deletions tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,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;
bool sensor_data_reported = false;

const char HTTP_MSG_SLIDER_SHUTTER[] PROGMEM =
"<tr><td colspan=2>"
Expand Down Expand Up @@ -772,6 +773,7 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos)
Shutter[i].target_position = target_pos;
Shutter[i].start_position = Shutter[i].real_position;
TasmotaGlobal.rules_flag.shutter_moving = 1;
sensor_data_reported = false;
ShutterAllowPreStartProcedure(i);
Shutter[i].time = Shutter[i].last_reported_time = 0;

Expand Down Expand Up @@ -1928,16 +1930,22 @@ bool Xdrv27(uint32_t function)
}
break;
case FUNC_JSON_APPEND:
for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) {
uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
ResponseAppend_P(",");
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 );
#ifdef USE_DOMOTICZ
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
DomoticzSensor(DZ_SHUTTER, position);
if (!sensor_data_reported) {
sensor_data_reported = true;
for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) {
uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
ResponseAppend_P(",");
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 );
if (Shutter[i].direction != 0) {
sensor_data_reported = false;
}
#ifdef USE_DOMOTICZ
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
DomoticzSensor(DZ_SHUTTER, (Settings->shutter_options[i] & 1) ? 100 - position : position);
}
#endif // USE_DOMOTICZ
}
#endif // USE_DOMOTICZ
}
break;
case FUNC_SET_POWER:
Expand Down