ed300L support

This commit is contained in:
gemu2015 2020-03-29 16:29:22 +02:00
parent 257dd18796
commit 61b97350da
2 changed files with 47 additions and 5 deletions

View File

@ -1508,9 +1508,9 @@ chknext:
lp=GetNumericResult(lp,OPER_EQU,&fvar2,0);
SCRIPT_SKIP_SPACES
fvar=fvar1;
if ((*opp=='<' && fvar1<fvar2) ||
(*opp=='>' && fvar1>fvar2) ||
(*opp=='=' && fvar1==fvar2))
if ((*opp=='<' && fvar1<fvar2) ||
(*opp=='>' && 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;
}

View File

@ -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--;