Skip to content

Commit b770d48

Browse files
stefanbodejosef109
authored andcommitted
Optimized behavior to publish shutter data with sensor request (arendst#22353)
* avoid shutter sensor data published ever * avoid shutter data report on sensor trigger
1 parent 6c11e29 commit b770d48

File tree

2 files changed

+39
-23
lines changed

2 files changed

+39
-23
lines changed

tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino

+22-14
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ struct SHUTTERGLOBAL {
195195
bool callibration_run = false; // if true a callibration is running and additional measures are captured
196196
uint8_t stopp_armed = 0; // Count each step power usage is below limit of 1 Watt
197197
uint16_t cycle_time = 0; // used for shuttersetup to get accurate timing
198+
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.
198199
} ShutterGlobal;
199200

200201
#define SHT_DIV_ROUND(__A, __B) (((__A) + (__B)/2) / (__B))
@@ -946,7 +947,7 @@ void ShutterRelayChanged(void)
946947

947948
void ShutterReportPosition(bool always, uint32_t index)
948949
{
949-
Response_P(PSTR("{"));
950+
950951
uint32_t i = 0;
951952
uint32_t n = TasmotaGlobal.shutters_present;
952953
uint8_t shutter_running = 0;
@@ -958,7 +959,7 @@ void ShutterReportPosition(bool always, uint32_t index)
958959

959960
// Allow function exit if nothing to report (99.9% use case)
960961
if (!always && !shutter_running) return;
961-
962+
Response_P(PSTR("{"));
962963
if( index != MAX_SHUTTERS_ESP32) {
963964
i = index;
964965
n = index+1;
@@ -976,7 +977,7 @@ void ShutterReportPosition(bool always, uint32_t index)
976977
uint32_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
977978
uint32_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
978979
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 );
979-
}
980+
}
980981
ResponseJsonEnd();
981982
if (always || shutter_running) {
982983
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); // RulesProcess() now re-entry protected
@@ -1196,6 +1197,7 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos)
11961197
Shutter[i].target_position = target_pos;
11971198
Shutter[i].start_position = Shutter[i].real_position;
11981199
TasmotaGlobal.rules_flag.shutter_moving = 1;
1200+
ShutterGlobal.sensor_data_reported = false;
11991201
ShutterAllowPreStartProcedure(i);
12001202
Shutter[i].time = Shutter[i].last_reported_time = 0;
12011203

@@ -2330,18 +2332,24 @@ bool Xdrv27(uint32_t function)
23302332
}
23312333
break;
23322334
case FUNC_JSON_APPEND:
2333-
for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) {
2334-
ResponseAppend_P(",");
2335-
uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
2336-
position = (ShutterSettings.shutter_options[i] & 1) ? 100 - position : position;
2337-
uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
2338-
target = (ShutterSettings.shutter_options[i] & 1) ? 100 - target : target;
2339-
ResponseAppend_P(JSON_SHUTTER_POS, i + 1, position, Shutter[i].direction, target, Shutter[i].tilt_real_pos );
2340-
#ifdef USE_DOMOTICZ
2341-
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
2342-
DomoticzSensor(DZ_SHUTTER, position);
2335+
if (!ShutterGlobal.sensor_data_reported) {
2336+
ShutterGlobal.sensor_data_reported = true;
2337+
for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) {
2338+
ResponseAppend_P(",");
2339+
uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
2340+
position = (ShutterSettings.shutter_options[i] & 1) ? 100 - position : position;
2341+
uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
2342+
target = (ShutterSettings.shutter_options[i] & 1) ? 100 - target : target;
2343+
ResponseAppend_P(JSON_SHUTTER_POS, i + 1, position, Shutter[i].direction, target, Shutter[i].tilt_real_pos );
2344+
if (Shutter[i].direction != 0) {
2345+
ShutterGlobal.sensor_data_reported = false;
2346+
}
2347+
#ifdef USE_DOMOTICZ
2348+
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
2349+
DomoticzSensor(DZ_SHUTTER, position);
2350+
}
2351+
#endif // USE_DOMOTICZ
23432352
}
2344-
#endif // USE_DOMOTICZ
23452353
}
23462354
break;
23472355
case FUNC_SET_POWER:

tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino

+17-9
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ int32_t current_stop_way = 0;
5252
int32_t next_possible_stop_position = 0;
5353
int32_t current_real_position = 0;
5454
int32_t current_pwm_velocity = 0;
55+
bool sensor_data_reported = false;
5556

5657
const char HTTP_MSG_SLIDER_SHUTTER[] PROGMEM =
5758
"<tr><td colspan=2>"
@@ -772,6 +773,7 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos)
772773
Shutter[i].target_position = target_pos;
773774
Shutter[i].start_position = Shutter[i].real_position;
774775
TasmotaGlobal.rules_flag.shutter_moving = 1;
776+
sensor_data_reported = false;
775777
ShutterAllowPreStartProcedure(i);
776778
Shutter[i].time = Shutter[i].last_reported_time = 0;
777779

@@ -1928,16 +1930,22 @@ bool Xdrv27(uint32_t function)
19281930
}
19291931
break;
19301932
case FUNC_JSON_APPEND:
1931-
for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) {
1932-
uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
1933-
uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
1934-
ResponseAppend_P(",");
1935-
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 );
1936-
#ifdef USE_DOMOTICZ
1937-
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
1938-
DomoticzSensor(DZ_SHUTTER, position);
1933+
if (!sensor_data_reported) {
1934+
sensor_data_reported = true;
1935+
for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) {
1936+
uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i);
1937+
uint8_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
1938+
ResponseAppend_P(",");
1939+
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 );
1940+
if (Shutter[i].direction != 0) {
1941+
sensor_data_reported = false;
1942+
}
1943+
#ifdef USE_DOMOTICZ
1944+
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
1945+
DomoticzSensor(DZ_SHUTTER, (Settings->shutter_options[i] & 1) ? 100 - position : position);
1946+
}
1947+
#endif // USE_DOMOTICZ
19391948
}
1940-
#endif // USE_DOMOTICZ
19411949
}
19421950
break;
19431951
case FUNC_SET_POWER:

0 commit comments

Comments
 (0)