mirror of https://github.com/arendst/Tasmota.git
parent
b886bd217b
commit
78989faf81
|
@ -682,6 +682,11 @@ bool MqttShowSensor(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
XsnsCall(FUNC_JSON_APPEND);
|
XsnsCall(FUNC_JSON_APPEND);
|
||||||
|
|
||||||
|
#ifdef USE_SCRIPT_JSON_EXPORT
|
||||||
|
XdrvCall(FUNC_JSON_APPEND);
|
||||||
|
#endif
|
||||||
|
|
||||||
bool json_data_available = (strlen(mqtt_data) - json_data_start);
|
bool json_data_available = (strlen(mqtt_data) - json_data_start);
|
||||||
if (strstr_P(mqtt_data, PSTR(D_JSON_PRESSURE)) != nullptr) {
|
if (strstr_P(mqtt_data, PSTR(D_JSON_PRESSURE)) != nullptr) {
|
||||||
ResponseAppend_P(PSTR(",\"" D_JSON_PRESSURE_UNIT "\":\"%s\""), PressureUnit().c_str());
|
ResponseAppend_P(PSTR(",\"" D_JSON_PRESSURE_UNIT "\":\"%s\""), PressureUnit().c_str());
|
||||||
|
|
|
@ -1050,6 +1050,9 @@ bool HandleRootStatusRefresh(void)
|
||||||
WSContentBegin(200, CT_HTML);
|
WSContentBegin(200, CT_HTML);
|
||||||
WSContentSend_P(PSTR("{t}"));
|
WSContentSend_P(PSTR("{t}"));
|
||||||
XsnsCall(FUNC_WEB_SENSOR);
|
XsnsCall(FUNC_WEB_SENSOR);
|
||||||
|
#ifdef USE_SCRIPT_WEB_DISPLAY
|
||||||
|
XdrvCall(FUNC_WEB_SENSOR);
|
||||||
|
#endif
|
||||||
WSContentSend_P(PSTR("</table>"));
|
WSContentSend_P(PSTR("</table>"));
|
||||||
|
|
||||||
if (devices_present) {
|
if (devices_present) {
|
||||||
|
|
|
@ -52,6 +52,9 @@ keywords if then else endif, or, and are better readable for beginners (others m
|
||||||
#define SCRIPT_MAXPERM (MAX_RULE_MEMS*10)-4/sizeof(float)
|
#define SCRIPT_MAXPERM (MAX_RULE_MEMS*10)-4/sizeof(float)
|
||||||
#define MAX_SCRIPT_SIZE MAX_RULE_SIZE*MAX_RULE_SETS
|
#define MAX_SCRIPT_SIZE MAX_RULE_SIZE*MAX_RULE_SETS
|
||||||
|
|
||||||
|
// offsets epoch readings by 1.1.2019 00:00:00 to fit into float with second resolution
|
||||||
|
#define EPOCH_OFFSET 1546300800
|
||||||
|
|
||||||
enum {OPER_EQU=1,OPER_PLS,OPER_MIN,OPER_MUL,OPER_DIV,OPER_PLSEQU,OPER_MINEQU,OPER_MULEQU,OPER_DIVEQU,OPER_EQUEQU,OPER_NOTEQU,OPER_GRTEQU,OPER_LOWEQU,OPER_GRT,OPER_LOW,OPER_PERC,OPER_XOR,OPER_AND,OPER_OR,OPER_ANDEQU,OPER_OREQU,OPER_XOREQU,OPER_PERCEQU};
|
enum {OPER_EQU=1,OPER_PLS,OPER_MIN,OPER_MUL,OPER_DIV,OPER_PLSEQU,OPER_MINEQU,OPER_MULEQU,OPER_DIVEQU,OPER_EQUEQU,OPER_NOTEQU,OPER_GRTEQU,OPER_LOWEQU,OPER_GRT,OPER_LOW,OPER_PERC,OPER_XOR,OPER_AND,OPER_OR,OPER_ANDEQU,OPER_OREQU,OPER_XOREQU,OPER_PERCEQU};
|
||||||
enum {SCRIPT_LOGLEVEL=1,SCRIPT_TELEPERIOD};
|
enum {SCRIPT_LOGLEVEL=1,SCRIPT_TELEPERIOD};
|
||||||
|
|
||||||
|
@ -78,10 +81,12 @@ enum {SCRIPT_LOGLEVEL=1,SCRIPT_TELEPERIOD};
|
||||||
LinkedList<MQTT_Subscription> subscriptions;
|
LinkedList<MQTT_Subscription> subscriptions;
|
||||||
#endif //SUPPORT_MQTT_EVENT
|
#endif //SUPPORT_MQTT_EVENT
|
||||||
|
|
||||||
|
#ifdef USE_DISPLAY
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
#include <renderer.h>
|
#include <renderer.h>
|
||||||
extern VButton *buttons[MAXBUTTONS];
|
extern VButton *buttons[MAXBUTTONS];
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
uint8_t data;
|
uint8_t data;
|
||||||
|
@ -134,6 +139,7 @@ struct SCRIPT_MEM {
|
||||||
uint8_t *vnp_offset;
|
uint8_t *vnp_offset;
|
||||||
char *glob_snp; // string vars pointer
|
char *glob_snp; // string vars pointer
|
||||||
char *scriptptr;
|
char *scriptptr;
|
||||||
|
char *section_ptr;
|
||||||
char *scriptptr_bu;
|
char *scriptptr_bu;
|
||||||
char *script_ram;
|
char *script_ram;
|
||||||
uint16_t script_size;
|
uint16_t script_size;
|
||||||
|
@ -1009,7 +1015,13 @@ char *isvar(char *lp, uint8_t *vtype,struct T_INDEX *tind,float *fp,char *sp,Jso
|
||||||
return lp+len;
|
return lp+len;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (fp) *fp=CharToFloat((char*)str_value);
|
if (fp) {
|
||||||
|
if (!strncmp(vn.c_str(),"Epoch",5)) {
|
||||||
|
*fp=atoi(str_value)-(uint32_t)EPOCH_OFFSET;
|
||||||
|
} else {
|
||||||
|
*fp=CharToFloat((char*)str_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
*vtype=NUM_RES;
|
*vtype=NUM_RES;
|
||||||
tind->bits.constant=1;
|
tind->bits.constant=1;
|
||||||
tind->bits.is_string=0;
|
tind->bits.is_string=0;
|
||||||
|
@ -1059,6 +1071,12 @@ chknext:
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'e':
|
||||||
|
if (!strncmp(vname,"epoch",5)) {
|
||||||
|
fvar=UtcTime()-(uint32_t)EPOCH_OFFSET;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
break;
|
||||||
#ifdef USE_SCRIPT_FATFS
|
#ifdef USE_SCRIPT_FATFS
|
||||||
case 'f':
|
case 'f':
|
||||||
if (!strncmp(vname,"fo(",3)) {
|
if (!strncmp(vname,"fo(",3)) {
|
||||||
|
@ -1634,6 +1652,7 @@ chknext:
|
||||||
if (sp) strlcpy(sp,Settings.mqtt_topic,glob_script_mem.max_ssize);
|
if (sp) strlcpy(sp,Settings.mqtt_topic,glob_script_mem.max_ssize);
|
||||||
goto strexit;
|
goto strexit;
|
||||||
}
|
}
|
||||||
|
#ifdef USE_DISPLAY
|
||||||
#ifdef USE_TOUCH_BUTTONS
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
if (!strncmp(vname,"tbut[",5)) {
|
if (!strncmp(vname,"tbut[",5)) {
|
||||||
GetNumericResult(vname+5,OPER_EQU,&fvar,0);
|
GetNumericResult(vname+5,OPER_EQU,&fvar,0);
|
||||||
|
@ -1649,6 +1668,7 @@ chknext:
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
|
@ -2733,7 +2753,10 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) {
|
||||||
if (!strncmp(lp,type,tlen)) {
|
if (!strncmp(lp,type,tlen)) {
|
||||||
// found section
|
// found section
|
||||||
section=1;
|
section=1;
|
||||||
if (check) return 99;
|
glob_script_mem.section_ptr=lp;
|
||||||
|
if (check) {
|
||||||
|
return 99;
|
||||||
|
}
|
||||||
// check for subroutine
|
// check for subroutine
|
||||||
if (*type=='#') {
|
if (*type=='#') {
|
||||||
// check for parameter
|
// check for parameter
|
||||||
|
@ -3387,6 +3410,7 @@ bool ScriptMqttData(void)
|
||||||
//This topic is subscribed by us, so serve it
|
//This topic is subscribed by us, so serve it
|
||||||
serviced = true;
|
serviced = true;
|
||||||
String value;
|
String value;
|
||||||
|
String lkey;
|
||||||
if (event_item.Key.length() == 0) { //If did not specify Key
|
if (event_item.Key.length() == 0) { //If did not specify Key
|
||||||
value = sData;
|
value = sData;
|
||||||
} else { //If specified Key, need to parse Key/Value from JSON data
|
} else { //If specified Key, need to parse Key/Value from JSON data
|
||||||
|
@ -3399,17 +3423,24 @@ bool ScriptMqttData(void)
|
||||||
if ((dot = key1.indexOf('.')) > 0) {
|
if ((dot = key1.indexOf('.')) > 0) {
|
||||||
key2 = key1.substring(dot+1);
|
key2 = key1.substring(dot+1);
|
||||||
key1 = key1.substring(0, dot);
|
key1 = key1.substring(0, dot);
|
||||||
|
lkey=key2;
|
||||||
if (!jsonData[key1][key2].success()) break; //Failed to get the key/value, ignore this message.
|
if (!jsonData[key1][key2].success()) break; //Failed to get the key/value, ignore this message.
|
||||||
value = (const char *)jsonData[key1][key2];
|
value = (const char *)jsonData[key1][key2];
|
||||||
} else {
|
} else {
|
||||||
if (!jsonData[key1].success()) break;
|
if (!jsonData[key1].success()) break;
|
||||||
value = (const char *)jsonData[key1];
|
value = (const char *)jsonData[key1];
|
||||||
|
lkey=key1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
value.trim();
|
value.trim();
|
||||||
|
|
||||||
char sbuffer[128];
|
char sbuffer[128];
|
||||||
snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=\"%s\"\n"), event_item.Event.c_str(), value.c_str());
|
|
||||||
|
if (!strncmp(lkey.c_str(),"Epoch",5)) {
|
||||||
|
uint32_t ep=atoi(value.c_str())-(uint32_t)EPOCH_OFFSET;
|
||||||
|
snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=%d\n"), event_item.Event.c_str(),ep);
|
||||||
|
} else {
|
||||||
|
snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=\"%s\"\n"), event_item.Event.c_str(), value.c_str());
|
||||||
|
}
|
||||||
//toLog(sbuffer);
|
//toLog(sbuffer);
|
||||||
execute_script(sbuffer);
|
execute_script(sbuffer);
|
||||||
}
|
}
|
||||||
|
@ -3542,6 +3573,93 @@ String ScriptUnsubscribe(const char * data, int data_len)
|
||||||
}
|
}
|
||||||
#endif // SUPPORT_MQTT_EVENT
|
#endif // SUPPORT_MQTT_EVENT
|
||||||
|
|
||||||
|
#ifdef USE_SCRIPT_WEB_DISPLAY
|
||||||
|
void ScriptWebShow(void) {
|
||||||
|
uint8_t web_script=Run_Scripter(">W",-2,0);
|
||||||
|
if (web_script==99) {
|
||||||
|
char line[128];
|
||||||
|
char tmp[128];
|
||||||
|
char *lp=glob_script_mem.section_ptr+2;
|
||||||
|
while (lp) {
|
||||||
|
while (*lp==SCRIPT_EOL) {
|
||||||
|
lp++;
|
||||||
|
}
|
||||||
|
if (!*lp || *lp=='#' || *lp=='>') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// send this line to web
|
||||||
|
memcpy(line,lp,sizeof(line));
|
||||||
|
line[sizeof(line)-1]=0;
|
||||||
|
char *cp=line;
|
||||||
|
for (uint32_t i=0; i<sizeof(line); i++) {
|
||||||
|
if (!*cp || *cp=='\n' || *cp=='\r') {
|
||||||
|
*cp=0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
Replace_Cmd_Vars(line,tmp,sizeof(tmp));
|
||||||
|
WSContentSend_PD(PSTR("{s}%s{e}"),tmp);
|
||||||
|
|
||||||
|
next_line:
|
||||||
|
if (*lp==SCRIPT_EOL) {
|
||||||
|
lp++;
|
||||||
|
} else {
|
||||||
|
lp = strchr(lp, SCRIPT_EOL);
|
||||||
|
if (!lp) break;
|
||||||
|
lp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //USE_SCRIPT_WEB_DISPLAY
|
||||||
|
|
||||||
|
#ifdef USE_SCRIPT_JSON_EXPORT
|
||||||
|
void ScriptJsonAppend(void) {
|
||||||
|
uint8_t web_script=Run_Scripter(">J",-2,0);
|
||||||
|
if (web_script==99) {
|
||||||
|
char line[128];
|
||||||
|
char tmp[128];
|
||||||
|
char *lp=glob_script_mem.section_ptr+2;
|
||||||
|
while (lp) {
|
||||||
|
while (*lp==SCRIPT_EOL) {
|
||||||
|
lp++;
|
||||||
|
}
|
||||||
|
if (!*lp || *lp=='#' || *lp=='>') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// send this line to mqtt
|
||||||
|
memcpy(line,lp,sizeof(line));
|
||||||
|
line[sizeof(line)-1]=0;
|
||||||
|
char *cp=line;
|
||||||
|
for (uint32_t i=0; i<sizeof(line); i++) {
|
||||||
|
if (!*cp || *cp=='\n' || *cp=='\r') {
|
||||||
|
*cp=0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
Replace_Cmd_Vars(line,tmp,sizeof(tmp));
|
||||||
|
ResponseAppend_P(PSTR("%s"),tmp);
|
||||||
|
|
||||||
|
next_line:
|
||||||
|
if (*lp==SCRIPT_EOL) {
|
||||||
|
lp++;
|
||||||
|
} else {
|
||||||
|
lp = strchr(lp, SCRIPT_EOL);
|
||||||
|
if (!lp) break;
|
||||||
|
lp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //USE_SCRIPT_JSON_EXPORT
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Interface
|
* Interface
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
@ -3667,6 +3785,19 @@ bool Xdrv10(uint8_t function)
|
||||||
result = ScriptMqttData();
|
result = ScriptMqttData();
|
||||||
break;
|
break;
|
||||||
#endif //SUPPORT_MQTT_EVENT
|
#endif //SUPPORT_MQTT_EVENT
|
||||||
|
#ifdef USE_SCRIPT_WEB_DISPLAY
|
||||||
|
case FUNC_WEB_SENSOR:
|
||||||
|
ScriptWebShow();
|
||||||
|
break;
|
||||||
|
#endif //USE_SCRIPT_WEB_DISPLAY
|
||||||
|
|
||||||
|
#ifdef USE_SCRIPT_JSON_EXPORT
|
||||||
|
case FUNC_JSON_APPEND:
|
||||||
|
ScriptJsonAppend();
|
||||||
|
break;
|
||||||
|
#endif //USE_SCRIPT_JSON_EXPORT
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue