diff --git a/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino b/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino index af3120d62..ec73da332 100755 --- a/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino @@ -3156,28 +3156,38 @@ void SML_Init(void) { // add descriptor +1,1,c,0,10,H20 //toLogEOL(">>",lp); lp++; - index = *lp & 7; - lp += 2; + char *lp1; +#ifdef SML_REPLACE_VARS + char dstbuf[SML_SRCBSIZE*2]; + Replace_Cmd_Vars(lp, 1, dstbuf, sizeof(dstbuf)); + lp += SML_getlinelen(lp); + lp1 = dstbuf; +#else + lp1 = lp; + lp += SML_getlinelen(lp); +#endif + index = *lp1 & 7; + lp1 += 2; if (index < 1 || index > sml_globs.meters_used) { AddLog(LOG_LEVEL_INFO, PSTR("illegal meter number!")); goto next_line; } index--; mmp = &meter_desc[index]; - if (*lp == '[') { + if (*lp1 == '[') { // sign TCP mode srcpin = TCP_MODE_FLG; - lp++; + lp1++; char str[32]; uint8_t cnt; for (cnt = 0; cnt < sizeof(str) - 1; cnt++) { - if (!*lp || *lp == '\n' || *lp == ']') { + if (!*lp1 || *lp1 == '\n' || *lp1 == ']') { break; } - str[cnt] = *lp++; + str[cnt] = *lp1++; } str[cnt] = 0; - lp++; + lp1++; #ifdef USE_SML_TCP #ifdef USE_SML_TCP_IP_STR strcpy(mmp->ip_addr, str); @@ -3186,7 +3196,7 @@ void SML_Init(void) { #endif #endif } else { - srcpin = strtol(lp, &lp, 10); + srcpin = strtol(lp1, &lp1, 10); if (Gpio_used(abs(srcpin))) { AddLog(LOG_LEVEL_INFO, PSTR("SML: Error: Duplicate GPIO %d defined. Not usable for RX in meter number %d"), abs(srcpin), index + 1); dddef_exit: @@ -3196,53 +3206,53 @@ dddef_exit: } } mmp->srcpin = srcpin; - if (*lp != ',') goto next_line; - lp++; - mmp->type = *lp; - lp++; - if (*lp != ',') { - switch (*lp) { + if (*lp1 != ',') goto next_line; + lp1++; + mmp->type = *lp1; + lp1++; + if (*lp1 != ',') { + switch (*lp1) { case 'N': - lp++; - mmp->sopt = 0x10 | (*lp & 3); - lp++; + lp1++; + mmp->sopt = 0x10 | (*lp1 & 3); + lp1++; break; case 'E': - lp++; - mmp->sopt = 0x20 | (*lp & 3); - lp++; + lp1++; + mmp->sopt = 0x20 | (*lp1 & 3); + lp1++; break; case 'O': - lp++; - mmp->sopt = 0x30 | (*lp & 3); - lp++; + lp1++; + mmp->sopt = 0x30 | (*lp1 & 3); + lp1++; break; default: - mmp->sopt = *lp&7; - lp++; + mmp->sopt = *lp1&7; + lp1++; } } else { mmp->sopt = 0; } - lp++; - mmp->flag = strtol(lp, &lp, 10); - if (*lp != ',') goto next_line; - lp++; - mmp->params = strtol(lp, &lp, 10); - if (*lp != ',') goto next_line; - lp++; + lp1++; + mmp->flag = strtol(lp1, &lp1, 10); + if (*lp1 != ',') goto next_line; + lp1++; + mmp->params = strtol(lp1, &lp1, 10); + if (*lp1 != ',') goto next_line; + lp1++; mmp->prefix[SML_PREFIX_SIZE - 1] = 0; for (uint32_t cnt = 0; cnt < SML_PREFIX_SIZE; cnt++) { - if (*lp == SCRIPT_EOL || *lp == ',') { + if (*lp1 == SCRIPT_EOL || *lp1 == ',') { mmp->prefix[cnt] = 0; break; } - mmp->prefix[cnt] = *lp++; + mmp->prefix[cnt] = *lp1++; } - if (*lp == ',') { - lp++; + if (*lp1 == ',') { + lp1++; // get TRX pin - mmp->trxpin = strtol(lp, &lp, 10); + mmp->trxpin = strtol(lp1, &lp1, 10); if (mmp->srcpin != TCP_MODE_FLG) { if (Gpio_used(mmp->trxpin)) { AddLog(LOG_LEVEL_INFO, PSTR("SML: Error: Duplicate GPIO %d defined. Not usable for TX in meter number %d"), meter_desc[index].trxpin, index + 1); @@ -3250,19 +3260,19 @@ dddef_exit: } } // optional transmit enable pin - if (*lp == '(') { - lp++; - if (*lp == 'i') { - lp++; + if (*lp1 == '(') { + lp1++; + if (*lp1 == 'i') { + lp1++; mmp->trx_en.trxenpol = 1; } else { mmp->trx_en.trxenpol = 0; } - mmp->trx_en.trxenpin = strtol(lp, &lp, 10); - if (*lp != ')') { + mmp->trx_en.trxenpin = strtol(lp1, &lp1, 10); + if (*lp1 != ')') { goto dddef_exit; } - lp++; + lp1++; if (Gpio_used(mmp->trx_en.trxenpin)) { AddLog(LOG_LEVEL_INFO, PSTR("SML: Error: Duplicate GPIO %d defined. Not usable for TX enable in meter number %d"), meter_desc[index].trx_en.trxenpin, index + 1); goto dddef_exit; @@ -3273,15 +3283,15 @@ dddef_exit: } else { mmp->trx_en.trxen = 0; } - if (*lp != ',') goto next_line; - lp++; - mmp->tsecs = strtol(lp, &lp, 10); - if (*lp == ',') { - lp++; + if (*lp1 != ',') goto next_line; + lp1++; + mmp->tsecs = strtol(lp1, &lp1, 10); + if (*lp1 == ',') { + lp1++; // look ahead uint16_t txlen = 0; uint16_t tx_entries = 1; - char *txp = lp; + char *txp = lp1; while (*txp) { if (*txp == ',') tx_entries++; if (*txp == SCRIPT_EOL) { @@ -3303,7 +3313,7 @@ dddef_exit: memory += txlen + 2; if (mmp->txmem) { // now copy send blocks - char *txp = lp; + char *txp = lp1; uint16_t tind = 0; for (uint32_t cnt = 0; cnt < txlen; cnt++) { if (*txp == SCRIPT_EOL) { @@ -3318,11 +3328,11 @@ dddef_exit: mmp->index = 0; mmp->max_index = tx_entries; sml_globs.sml_send_blocks++; - lp += txlen; + lp1 += txlen; } } } - if (*lp == SCRIPT_EOL) lp--; + if (*lp1 == SCRIPT_EOL) lp1--; goto next_line; } char *lp1;