some fixes on counters (#17628)

This commit is contained in:
gemu 2023-01-07 11:32:26 +01:00 committed by GitHub
parent 2f1e36e1bf
commit 7465ff0c7f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 35 additions and 10 deletions

View File

@ -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) {