mirror of https://github.com/arendst/Tasmota.git
some fixes on counters (#17628)
This commit is contained in:
parent
2f1e36e1bf
commit
7465ff0c7f
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue