From 7465ff0c7f3341555d11c219e0a6b5f60c7ff6e8 Mon Sep 17 00:00:00 2001 From: gemu Date: Sat, 7 Jan 2023 11:32:26 +0100 Subject: [PATCH] some fixes on counters (#17628) --- tasmota/tasmota_xsns_sensor/xsns_53_sml.ino | 45 ++++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino b/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino index fdcea8b38..c65b1fbd3 100755 --- a/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino @@ -2822,7 +2822,7 @@ next_line: #ifdef ESP8266 #ifdef SPECIAL_SS char type = sml_globs.mp[meters].type; - if (type=='m' || type=='M' || type=='k' || type=='p' || type=='R' || type=='v') { + if (type == 'm' || type == 'M' || type == 'k' || type == 'p' || type == 'R' || type == 'v') { meter_desc[meters].meter_ss = new TasmotaSerial(sml_globs.mp[meters].srcpin,sml_globs.mp[meters].trxpin, 1, 0, meter_desc[meters].sibsiz); } else { meter_desc[meters].meter_ss = new TasmotaSerial(sml_globs.mp[meters].srcpin,sml_globs.mp[meters].trxpin, 1, 1, meter_desc[meters].sibsiz); @@ -3095,6 +3095,18 @@ void SetDBGLed(uint8_t srcpin, uint8_t ledpin) { } } +// force channel math on counters +void SML_Counter_Poll_1s(void) { + for (uint32_t meter = 0; meter < sml_globs.meters_used; meter++) { + if (sml_globs.mp[meter].type == 'c') { + SML_Decode(meter); + } + } +} + +#define CNT_PULSE_TIMEOUT 5000 + + // fast counter polling void SML_Counter_Poll(void) { uint16_t meters, cindex = 0; @@ -3152,10 +3164,15 @@ uint32_t ctime = millis(); } if (sml_counters[cindex].sml_cnt_updated) { - InjektCounterValue(sml_counters[cindex].sml_cnt_old_state, RtcSettings.pulse_counter[cindex], 60000.0 / (float)sml_counters[cindex].sml_counter_pulsewidth); + InjektCounterValue(meters, RtcSettings.pulse_counter[cindex], 60000.0 / (float)sml_counters[cindex].sml_counter_pulsewidth); sml_counters[cindex].sml_cnt_updated = 0; } - + // check timeout + uint32_t time = millis(); + if ((time - sml_counters[cindex].sml_counter_lfalltime) > CNT_PULSE_TIMEOUT) { + InjektCounterValue(meters, RtcSettings.pulse_counter[cindex], 0); + sml_counters[cindex].sml_counter_lfalltime = time; + } } cindex++; } @@ -3464,12 +3481,12 @@ bool XSNS_53_cmd(void) { uint8_t cindex = 0; for (uint8_t meters = 0; meters < sml_globs.meters_used; meters++) { if (sml_globs.mp[meters].type == 'c') { - InjektCounterValue(meters,RtcSettings.pulse_counter[cindex], 0.0); + InjektCounterValue(meters, RtcSettings.pulse_counter[cindex], 0.0); cindex++; } } } - ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"counter%d: %d\"}}"), index,RtcSettings.pulse_counter[index - 1]); + ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"counter%d: %d\"}}"), index, RtcSettings.pulse_counter[index - 1]); } else if (*cp=='r') { // restart ResponseTime_P(PSTR(",\"SML\":{\"CMD\":\"restart\"}}")); @@ -3508,13 +3525,16 @@ bool XSNS_53_cmd(void) { } void InjektCounterValue(uint8_t meter, uint32_t counter, float rate) { - int dec = (int)rate; - int frac = (int)((rate - (float)dec) * 1000.0); snprintf((char*)&meter_desc[meter].sbuff[0], meter_desc[meter].sbsiz, "1-0:1.8.0*255(%d)", counter); SML_Decode(meter); - snprintf((char*)&meter_desc[meter].sbuff[0], meter_desc[meter].sbsiz, "1-0:1.7.0*255(%d.%d)", dec, frac); + char freq[16]; + freq[0] = 0; + if (rate) { + DOUBLE2CHAR(rate, 4, freq); + } + snprintf((char*)&meter_desc[meter].sbuff[0], meter_desc[meter].sbsiz, "1-0:1.7.0*255(%s)", freq); SML_Decode(meter); } @@ -3545,7 +3565,6 @@ bool Xsns53(uint32_t function) { } } break; -#ifdef USE_SCRIPT case FUNC_EVERY_100_MSECOND: if (bitRead(Settings->rule_enabled, 0)) { if (sml_globs.ready) { @@ -3553,7 +3572,13 @@ bool Xsns53(uint32_t function) { } } break; -#endif // USE_SCRIPT + case FUNC_EVERY_SECOND: + if (bitRead(Settings->rule_enabled, 0)) { + if (sml_globs.ready) { + SML_Counter_Poll_1s(); + } + } + break; case FUNC_JSON_APPEND: if (sml_globs.ready) { if (sml_options & SML_OPTIONS_JSON_ENABLE) {