mirror of https://github.com/arendst/Tasmota.git
scripter support for google charts in WEBUI
This commit is contained in:
parent
dcde10eac4
commit
e043788de8
|
@ -3592,6 +3592,11 @@ const char HTTP_FORM_SDC_HREF[] PROGMEM =
|
|||
|
||||
uint8_t reject(char *name) {
|
||||
|
||||
char *lcp = strrchr(name,'/');
|
||||
if (lcp) {
|
||||
name=lcp+1;
|
||||
}
|
||||
|
||||
while (*name=='/') name++;
|
||||
if (*name=='_') return 1;
|
||||
if (*name=='.') return 1;
|
||||
|
@ -4863,6 +4868,17 @@ const char SCRIPT_MSG_TEXTINP[] PROGMEM =
|
|||
const char SCRIPT_MSG_NUMINP[] PROGMEM =
|
||||
"<div><center><label><b>%s</b><input min='%s' max='%s' step='%s' value='%s' type='number' style='width:200px' onfocusin='pr(0)' onfocusout='pr(1)' onchange='siva(value,\"%s\")'></label></div>";
|
||||
|
||||
const char SCRIPT_MSG_GTABLE[] PROGMEM =
|
||||
"<script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>"
|
||||
"<script type='text/javascript'>google.charts.load('current',{packages:['corechart']});</script>"
|
||||
"<script language='JavaScript'>function drawChart(){var data=google.visualization.arrayToDataTable([";
|
||||
|
||||
const char SCRIPT_MSG_GTABLEb[] PROGMEM =
|
||||
"]);var options={title:'%s',isStacked:false};var chart=new google.visualization.%s(document.getElementById('chart%1d'));chart.draw(data,options);}"
|
||||
"google.charts.setOnLoadCallback(drawChart);</script>";
|
||||
|
||||
const char SCRIPT_MSG_GTE1[] PROGMEM = "'%s'";
|
||||
|
||||
|
||||
void ScriptGetVarname(char *nbuf,char *sp, uint32_t blen) {
|
||||
uint32_t cnt;
|
||||
|
@ -4882,6 +4898,7 @@ void ScriptWebShow(char mc) {
|
|||
char tmp[128];
|
||||
uint8_t optflg=0;
|
||||
char *lp=glob_script_mem.section_ptr+2;
|
||||
uint8_t chartindex=1;
|
||||
while (lp) {
|
||||
while (*lp==SCRIPT_EOL) {
|
||||
lp++;
|
||||
|
@ -5062,7 +5079,6 @@ void ScriptWebShow(char mc) {
|
|||
dtostrfd(max,4,maxstr);
|
||||
dtostrfd(step,4,stepstr);
|
||||
WSContentSend_PD(SCRIPT_MSG_NUMINP,label,minstr,maxstr,stepstr,vstr,vname);
|
||||
|
||||
} else {
|
||||
Replace_Cmd_Vars(lin,0,tmp,sizeof(tmp));
|
||||
if (optflg) {
|
||||
|
@ -5073,8 +5089,123 @@ void ScriptWebShow(char mc) {
|
|||
}
|
||||
} else {
|
||||
if (*lin==mc) {
|
||||
Replace_Cmd_Vars(lin+1,0,tmp,sizeof(tmp));
|
||||
WSContentSend_PD(PSTR("%s"),tmp);
|
||||
lin++;
|
||||
if (!strncmp(lin,"tb(",3)) {
|
||||
// get google table
|
||||
struct T_INDEX ind;
|
||||
uint8_t vtype;
|
||||
char *lp=lin+3;
|
||||
uint8 entries=0;
|
||||
#define MAX_GARRAY 4
|
||||
float *arrays[MAX_GARRAY];
|
||||
uint8_t anum=0;
|
||||
while (anum<MAX_GARRAY) {
|
||||
if (*lp==')' || *lp==0) break;
|
||||
char *lp1=lp;
|
||||
lp=isvar(lp,&vtype,&ind,0,0,0);
|
||||
if (vtype!=VAR_NV) {
|
||||
SCRIPT_SKIP_SPACES
|
||||
uint8_t index=glob_script_mem.type[ind.index].index;
|
||||
if ((vtype&STYPE)==0) {
|
||||
// numeric result
|
||||
//Serial.printf("numeric\n");
|
||||
if (glob_script_mem.type[index].bits.is_filter) {
|
||||
//Serial.printf("numeric array\n");
|
||||
uint8_t len=0;
|
||||
float *fa=Get_MFAddr(index,&len);
|
||||
//Serial.printf(">> 2 %d\n",(uint32_t)*fa);
|
||||
if (fa && len>=entries) {
|
||||
if (!entries) {entries = len;}
|
||||
// add array to list
|
||||
arrays[anum]=fa;
|
||||
anum++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
lp=lp1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//Serial.printf("arrays %d\n",anum);
|
||||
//Serial.printf("entries %d\n",entries);
|
||||
|
||||
WSContentSend_PD(SCRIPT_MSG_GTABLE);
|
||||
// we know how many arrays and the number of entries
|
||||
// we need to fetch the labels now
|
||||
WSContentSend_PD("[");
|
||||
for (uint32_t cnt=0; cnt<anum+1; cnt++) {
|
||||
char label[SCRIPT_MAXSSIZE];
|
||||
lp=GetStringResult(lp,OPER_EQU,label,0);
|
||||
SCRIPT_SKIP_SPACES
|
||||
WSContentSend_PD(SCRIPT_MSG_GTE1,label);
|
||||
//Serial.printf("labels %s\n",label);
|
||||
if (cnt<anum) { WSContentSend_PD(","); }
|
||||
}
|
||||
WSContentSend_PD("],");
|
||||
|
||||
// now we have to export the values
|
||||
// fetch label part only once in combo string
|
||||
char label[SCRIPT_MAXSSIZE];
|
||||
lp=GetStringResult(lp,OPER_EQU,label,0);
|
||||
SCRIPT_SKIP_SPACES
|
||||
char *lblp=label;
|
||||
|
||||
for (uint32_t cnt=0; cnt<entries; cnt++) {
|
||||
WSContentSend_PD("['");
|
||||
char lbl[16];
|
||||
strncpy(lbl,lblp,sizeof(lbl));
|
||||
for (uint32_t i=0; i<strlen(lblp); i++) {
|
||||
if (lblp[i]=='|') {
|
||||
lbl[i]=0;
|
||||
lblp+=i+1;
|
||||
break;
|
||||
}
|
||||
lbl[i]=lblp[i];
|
||||
}
|
||||
WSContentSend_PD(lbl);
|
||||
WSContentSend_PD("',");
|
||||
for (uint32_t ind=0; ind<anum; ind++) {
|
||||
char acbuff[32];
|
||||
float *fp=arrays[ind];
|
||||
dtostrfd(fp[cnt],glob_script_mem.script_dprec,acbuff);
|
||||
WSContentSend_PD("%s",acbuff);
|
||||
if (ind<anum-1) { WSContentSend_PD(","); }
|
||||
}
|
||||
WSContentSend_PD("]");
|
||||
if (cnt<entries-1) { WSContentSend_PD(","); }
|
||||
}
|
||||
|
||||
char header[SCRIPT_MAXSSIZE];
|
||||
lp=GetStringResult(lp,OPER_EQU,header,0);
|
||||
SCRIPT_SKIP_SPACES
|
||||
|
||||
const char *type;
|
||||
if (*lp!=')') {
|
||||
switch (*lp) {
|
||||
case 'l':
|
||||
type="LineChart";
|
||||
break;
|
||||
case 'b':
|
||||
type="BarChart";
|
||||
break;
|
||||
case 'p':
|
||||
type="PieChart";
|
||||
break;
|
||||
default:
|
||||
type="ColumnChart";
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
type="ColumnChart";
|
||||
}
|
||||
|
||||
WSContentSend_PD(SCRIPT_MSG_GTABLEb,header,type,chartindex);
|
||||
chartindex++;
|
||||
} else {
|
||||
Replace_Cmd_Vars(lin,0,tmp,sizeof(tmp));
|
||||
WSContentSend_PD(PSTR("%s"),tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5437,6 +5568,5 @@ bool Xdrv10(uint8_t function)
|
|||
}
|
||||
|
||||
|
||||
|
||||
#endif // Do not USE_RULES
|
||||
#endif // USE_SCRIPT
|
||||
|
|
Loading…
Reference in New Issue