diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 30ed26598..330512c9d 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -1508,9 +1508,9 @@ chknext: lp=GetNumericResult(lp,OPER_EQU,&fvar2,0); SCRIPT_SKIP_SPACES fvar=fvar1; - if ((*opp=='<' && fvar1' && fvar1>fvar2) || - (*opp=='=' && fvar1==fvar2)) + if ((*opp=='<' && fvar1' && fvar1>fvar2) || + (*opp=='=' && fvar1==fvar2)) { if (*lp!='<' && *lp!='>' && *lp!='=' && *lp!=')' && *lp!=SCRIPT_EOL) { float fvar3; @@ -1759,13 +1759,18 @@ chknext: float fvar3; lp=GetNumericResult(lp,OPER_EQU,&fvar3,0); fvar=SML_SetBaud(fvar1,fvar3); - } else { + } else if (fvar2==1) { char str[SCRIPT_MAXSSIZE]; lp=GetStringResult(lp,OPER_EQU,str,0); fvar=SML_Write(fvar1,str); + } else { +#ifdef ED300L + fvar=SML_Status(fvar1); +#else + fvar=0; +#endif } lp++; - fvar=0; len=0; goto exit; } diff --git a/tasmota/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino index 53e6fff25..c5f2d3cc2 100755 --- a/tasmota/xsns_53_sml.ino +++ b/tasmota/xsns_53_sml.ino @@ -901,6 +901,11 @@ uint8_t dchars[16]; } } +#ifdef ED300L +uint8_t sml_status[MAX_METERS]; +uint8_t g_mindex; +#endif + // skip sml entries uint8_t *skip_sml(uint8_t *cp,int16_t *res) { uint8_t len,len1,type; @@ -933,6 +938,14 @@ double dval; // scan for values // check status +#ifdef ED300L + unsigned char *cpx=cp-5; + // decode OBIS 0180 amd extract direction info + if (*cp==0x64 && *cpx==0 && *(cpx+1)==0x01 && *(cpx+2)==0x08 && *(cpx+3)==0) { + sml_status[g_mindex]=*(cp+3); + } +#endif + cp=skip_sml(cp,&result); // check time cp=skip_sml(cp,&result); @@ -941,6 +954,7 @@ double dval; // check scaler cp=skip_sml(cp,&result); scaler=result; + // get value type=*cp&0x70; len=*cp&0x0f; @@ -1033,6 +1047,15 @@ double dval; } else if (scaler==3) { dval*=1000; } + #ifdef ED300L + // decode current power OBIS 00 0F 07 00 + if (*cpx==0x00 && *(cpx+1)==0x0f && *(cpx+2)==0x07 && *(cpx+3)==0) { + if (sml_status[g_mindex]&0x20) { + // and invert sign on solar feed + dval*=-1; + } + } + #endif return dval; } @@ -1465,6 +1488,9 @@ void SML_Decode(uint8_t index) { if (found) { // matches, get value mp++; +#ifdef ED300L + g_mindex=mindex; +#endif if (*mp=='#') { // get string value mp++; @@ -2061,6 +2087,17 @@ uint32_t SML_SetBaud(uint32_t meter, uint32_t br) { return 1; } +uint32_t SML_Status(uint32_t meter) { + if (meter<1 || meter>meters_used) return 0; + meter--; +#ifdef ED300L + return sml_status[meter]; +#else + return 0; +#endif +} + + uint32_t SML_Write(uint32_t meter,char *hstr) { if (meter<1 || meter>meters_used) return 0; meter--;