From e3e692de38b7c5b1b31172b7a5740a00d8104d17 Mon Sep 17 00:00:00 2001 From: barbudor Date: Fri, 28 Jan 2022 23:27:20 +0100 Subject: [PATCH 1/4] support fahrenheit and plublish temp unit --- tasmota/xsns_62_esp32_mi_ble.ino | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tasmota/xsns_62_esp32_mi_ble.ino b/tasmota/xsns_62_esp32_mi_ble.ino index a1627cebe..7e7cf3ab2 100644 --- a/tasmota/xsns_62_esp32_mi_ble.ino +++ b/tasmota/xsns_62_esp32_mi_ble.ino @@ -2496,7 +2496,7 @@ void MI32GetOneSensorJson(int slot, int hidename){ #endif //USE_HOME_ASSISTANT ) { ResponseAppend_P(PSTR(",")); - ResponseAppendTHD(p->temp, p->hum); + ResponseAppendTHD(ConvertTempToFahrenheit(p->temp), p->hum); // convert if SO8 on tempHumSended = true; } } @@ -2508,8 +2508,9 @@ void MI32GetOneSensorJson(int slot, int hidename){ ||(hass_mode!=-1) #endif //USE_HOME_ASSISTANT ) { + float temp = ConvertTempToFahrenheit(p->temp); // convert if SO8 on ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE "\":%*_f"), - Settings->flag2.temperature_resolution, &p->temp); + Settings->flag2.temperature_resolution, &temp); } } } @@ -2691,6 +2692,9 @@ void MI32ShowSomeSensors(){ } cnt++; } + if (ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { + ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit()); + } ResponseAppend_P(PSTR("}")); MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR), Settings->flag.mqtt_sensor_retain); //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); @@ -2729,6 +2733,9 @@ void MI32ShowOneMISensor(){ mi_sensor_t *p; p = &MIBLEsensors[MI32.mqttCurrentSingleSlot]; + if (ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { + ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit()); + } ResponseAppend_P(PSTR("}")); char idstr[32]; @@ -3052,6 +3059,9 @@ void MI32ShowTriggeredSensors(){ } } if (cnt){ // if we got one, then publish + if (ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { + ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit()); + } ResponseAppend_P(PSTR("}")); if( #ifdef USE_HOME_ASSISTANT @@ -3133,7 +3143,7 @@ void MI32Show(bool json) switch(p->type){ case MI_FLORA:{ if (!isnan(p->temp)) { - WSContentSend_Temp(typeName, p->temp); + WSContentSend_Temp(typeName, ConvertTempToFahrenheit(p->temp)); // convert if SO8 on } if (p->moisture!=0xff) { WSContentSend_PD(HTTP_SNS_MOISTURE, typeName, p->moisture); @@ -3144,7 +3154,7 @@ void MI32Show(bool json) } break; default:{ if (!isnan(p->hum) && !isnan(p->temp)) { - WSContentSend_THD(typeName, p->temp, p->hum); + WSContentSend_THD(typeName, ConvertTempToFahrenheit(p->temp), p->hum); // convert if SO8 on } } } From 10cfc1166cab7b72d1b0a93675a37ab946aeb03d Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sun, 30 Jan 2022 08:53:56 +0100 Subject: [PATCH 2/4] some fixes --- tasmota/xdrv_10_scripter.ino | 379 ++++++++++++++++++++++------------- 1 file changed, 241 insertions(+), 138 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 0e90cccb2..0461a632a 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -59,6 +59,8 @@ keywords if then else endif, or, and are better readable for beginners (others m #ifndef SCRIPT_MAXSSIZE #define SCRIPT_MAXSSIZE 48 #endif + + #define SCRIPT_EOL '\n' #define SCRIPT_FLOAT_PRECISION 2 #define PMEM_SIZE sizeof(Settings->script_pram) @@ -134,19 +136,19 @@ Ticker Script_ticker4; void Script_ticker1_end(void) { Script_ticker1.detach(); - Run_Scripter(">ti1", 4, 0); + Run_Scripter1(">ti1", 4, 0); } void Script_ticker2_end(void) { Script_ticker2.detach(); - Run_Scripter(">ti2", 4, 0); + Run_Scripter1(">ti2", 4, 0); } void Script_ticker3_end(void) { Script_ticker3.detach(); - Run_Scripter(">ti3", 4, 0); + Run_Scripter1(">ti3", 4, 0); } void Script_ticker4_end(void) { Script_ticker4.detach(); - Run_Scripter(">ti4", 4, 0); + Run_Scripter1(">ti4", 4, 0); } #endif @@ -435,6 +437,7 @@ struct SCRIPT_MEM { char *glob_script = 0; char *fast_script = 0; char *event_script = 0; + char *html_script = 0; char *web_pages[5]; uint32_t script_lastmillis; bool event_handeled = false; @@ -489,6 +492,7 @@ char *ForceStringVar(char *lp,char *dstr); void send_download(void); uint8_t UfsReject(char *name); void fread_str(uint8_t fref, char *sp, uint16_t slen); +char *eval_sub(char *lp, float *fvar, char *rstr); void ScriptEverySecond(void) { @@ -514,11 +518,11 @@ void ScriptEverySecond(void) { } } } - Run_Scripter(">S", 2, 0); + Run_Scripter1(">S", 2, 0); #ifdef USE_HOMEKIT if (glob_script_mem.homekit_running == false) { - uint8_t homekit_found = Run_Scripter(">h", -2, 0); + uint8_t homekit_found = Run_Scripter1(">h", -2, 0); if (homekit_found == 99) { if (!TasmotaGlobal.global_state.wifi_down) { homekit_main(glob_script_mem.section_ptr, 0); @@ -988,7 +992,7 @@ char *script; #ifdef USE_SCRIPT_GLOBVARS if (glob_script_mem.udp_flags.udp_used) { Script_Init_UDP(); - if (Run_Scripter(">G", -2, 0) == 99) {glob_script_mem.glob_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.glob_script = 0;} + if (Run_Scripter1(">G", -2, 0) == 99) {glob_script_mem.glob_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.glob_script = 0;} } #endif //USE_SCRIPT_GLOBVARS @@ -1098,7 +1102,7 @@ void Script_PollUdp(void) { glob_script_mem.last_udp_ip = glob_script_mem.Script_PortUdp.remoteIP(); SetChanged(index); if (glob_script_mem.glob_script) { - Run_Scripter(glob_script_mem.glob_script, 0, 0); + Run_Scripter1(glob_script_mem.glob_script, 0, 0); } } } @@ -1937,7 +1941,8 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, tind->index = 0; tind->bits.data = 0; - if (isdigit(*lp) || (*lp=='-' && isdigit(*(lp+1))) || *lp=='.') { + //Serial.printf("Stack 2: %d\n",GetStack()); + if (isdigit(*lp) || (*lp == '-' && isdigit(*(lp+1))) || *lp == '.') { // isnumber if (fp) { if (*lp == '0' && *(lp + 1) == 'x') { @@ -1957,20 +1962,21 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, *vtype = NUM_RES; return lp; } - if (*lp=='"') { + + if (*lp == '"') { lp++; - while (*lp!='"') { - if (*lp==0 || *lp==SCRIPT_EOL) break; + while (*lp != '"') { + if (*lp == 0 || *lp == SCRIPT_EOL) break; uint8_t iob = *lp; - if (iob=='\\') { + if (iob == '\\') { lp++; - if (*lp=='t') { + if (*lp == 't') { iob = '\t'; - } else if (*lp=='n') { + } else if (*lp == 'n') { iob = '\n'; - } else if (*lp=='r') { + } else if (*lp == 'r') { iob = '\r'; - } else if (*lp=='\\') { + } else if (*lp == '\\') { iob = '\\'; } else { lp--; @@ -1995,9 +2001,9 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, } const char *term="\n\r ])=+-/*%>index = count; // overwrite with global var index - if (vtp[count].bits.is_string==0) { + if (vtp[count].bits.is_string == 0) { *vtype = NTYPE | index; if (vtp[count].bits.is_filter) { if (ja) { @@ -2062,6 +2069,9 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, } } +#define USE_JSON + +#ifdef USE_JSON if (gv && gv->jo) { // look for json input @@ -2176,9 +2186,13 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, } } } +#endif + chknext: + switch (vname[0]) { + case 'a': #ifdef USE_ANGLE_FUNC if (!strncmp(lp, "acos(", 5)) { @@ -2227,6 +2241,7 @@ chknext: len = 0; goto exit; } + if (!strncmp(lp, "acp(", 4)) { lp += 4; SCRIPT_SKIP_SPACES @@ -2577,7 +2592,7 @@ chknext: uint8_t find = fvar; if (find>=SFS_MAX) find = SFS_MAX - 1; uint8_t index = 0; - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; char *cp = str; if (glob_script_mem.file_flags[find].is_open) { if (glob_script_mem.file_flags[find].is_dir) { @@ -2677,7 +2692,7 @@ chknext: goto nfuncexit; } if (!strncmp(lp, "fd(", 3)) { - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp + 3, OPER_EQU, str, 0); ufsp->remove(str); goto nfuncexit; @@ -2722,7 +2737,7 @@ chknext: #endif //ESP32 && USE_WEBCAM #ifdef USE_SCRIPT_FATFS_EXT if (!strncmp(lp, "fe(", 3)) { - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp + 3, OPER_EQU, str, 0); // execute script File ef = ufsp->open(str, FS_FILE_READ); @@ -2743,7 +2758,7 @@ chknext: goto nfuncexit; } if (!strncmp(lp, "fmd(", 4)) { - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp + 4, OPER_EQU, str, 0); fvar = ufsp->mkdir(str); goto nfuncexit; @@ -2758,13 +2773,13 @@ chknext: goto nfuncexit; } if (!strncmp(lp, "frd(", 4)) { - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp + 4, OPER_EQU, str, 0); fvar = ufsp->rmdir(str); goto nfuncexit; } if (!strncmp(lp, "fx(", 3)) { - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp + 3, OPER_EQU, str, 0); if (ufsp->exists(str)) fvar = 1; else fvar = 0; @@ -2778,11 +2793,11 @@ chknext: } if (!strncmp(lp, "frn(", 4)) { // rename a file - char fn_from[glob_script_mem.max_ssize + 1]; + char fn_from[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp + 4, OPER_EQU, fn_from, 0); SCRIPT_SKIP_SPACES - char fn_to[glob_script_mem.max_ssize + 1]; + char fn_to[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp, OPER_EQU, fn_to, 0); SCRIPT_SKIP_SPACES @@ -2934,7 +2949,7 @@ chknext: SCRIPT_SKIP_SPACES if (find >= SFS_MAX) find = SFS_MAX - 1; - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; if (glob_script_mem.file_flags[find].is_open) { uint8_t first = 0; for (uint32_t cnt = 0; cnt < alen; cnt++) { @@ -2968,7 +2983,7 @@ chknext: #endif // USE_SCRIPT_FATFS_EXT if (!strncmp(lp, "fl1(", 4) || !strncmp(lp, "fl2(", 4) ) { uint8_t lknum = *(lp+2)&3; - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp + 4, OPER_EQU, str, 0); if (lknum<1 || lknum>2) lknum = 1; strlcpy(glob_script_mem.flink[lknum - 1], str, 14); @@ -3299,6 +3314,7 @@ chknext: } #endif // USE_SCRIPT_I2C break; + case 'l': if (!strncmp(lp, "lip", 3)) { if (sp) strlcpy(sp, (const char*)WiFi.localIP().toString().c_str(), glob_script_mem.max_ssize); @@ -3427,6 +3443,14 @@ chknext: } #endif //USE_MORITZ break; + + case 'n': + if (!strncmp(vname, "npwr", 4)) { + fvar = TasmotaGlobal.devices_present; + goto exit; + } + break; + case 'p': if (!strncmp(lp, "pin[", 4)) { // raw pin level @@ -3508,7 +3532,7 @@ chknext: if (!strncmp(lp, "pwr[", 4)) { GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); uint8_t index = fvar; - if (index<=TasmotaGlobal.devices_present) { + if (index <= TasmotaGlobal.devices_present) { fvar = bitRead(TasmotaGlobal.power, index - 1); } else { fvar = -1; @@ -3519,7 +3543,7 @@ chknext: if (!strncmp(lp, "pc[", 3)) { GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); uint8_t index = fvar; - if (index<1 || index>MAX_COUNTERS) index = 1; + if (index < 1 || index > MAX_COUNTERS) index = 1; fvar = RtcSettings.pulse_counter[index - 1]; len += 1; goto exit; @@ -3557,6 +3581,7 @@ chknext: } #endif break; + case 's': if (!strncmp(vname, "secs", 4)) { fvar = RtcTime.second; @@ -3679,7 +3704,7 @@ chknext: } } lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); - char str[glob_script_mem.max_ssize + 1]; + char str[SCRIPT_MAXSSIZE]; f2char(fvar, dprec, lzero, str); if (sp) strlcpy(sp, str, glob_script_mem.max_ssize); lp++; @@ -3920,7 +3945,7 @@ extern char *SML_GetSVal(uint32_t index); } if (!strncmp(lp, "sr(", 3)) { uint16_t size = glob_script_mem.max_ssize; - char str[size]; + char str[SCRIPT_MAXSSIZE]; memset(str, 0, size); lp += 3; uint8_t runt = 0; @@ -3956,12 +3981,13 @@ extern char *SML_GetSVal(uint32_t index); if (Script_Close_Serial()) { fvar = 0; } - lp+=4; + lp += 4; len = 0; goto exit; } #endif //USE_SCRIPT_SERIAL break; + case 't': if (!strncmp(vname, "time", 4)) { fvar = MinutesPastMidnight(); @@ -3991,25 +4017,25 @@ extern char *SML_GetSVal(uint32_t index); #ifdef USE_SCRIPT_TIMER if (!strncmp(lp, "ts1(", 4)) { lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); - if (fvar<10) fvar = 10; + if (fvar < 10) fvar = 10; Script_ticker1.attach_ms(fvar, Script_ticker1_end); goto nfuncexit; } if (!strncmp(lp, "ts2(", 4)) { lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); - if (fvar<10) fvar = 10; + if (fvar < 10) fvar = 10; Script_ticker2.attach_ms(fvar, Script_ticker2_end); goto nfuncexit; } if (!strncmp(lp, "ts3(", 4)) { lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); - if (fvar<10) fvar = 10; + if (fvar < 10) fvar = 10; Script_ticker3.attach_ms(fvar, Script_ticker3_end); goto nfuncexit; } if (!strncmp(lp, "ts4(", 4)) { lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); - if (fvar<10) fvar = 10; + if (fvar < 10) fvar = 10; Script_ticker4.attach_ms(fvar, Script_ticker4_end); goto nfuncexit; } @@ -4020,7 +4046,7 @@ extern char *SML_GetSVal(uint32_t index); if (!strncmp(lp, "tbut[", 5)) { GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); uint8_t index = fvar; - if (index<1 || index>MAX_TOUCH_BUTTONS) index = 1; + if (index < 1 || index > MAX_TOUCH_BUTTONS) index = 1; index--; if (buttons[index]) { fvar = buttons[index]->vpower.on_off; @@ -4033,11 +4059,13 @@ extern char *SML_GetSVal(uint32_t index); #endif //USE_TOUCH_BUTTONS #endif //USE_DISPLAY + + #if 0 if (!strncmp(lp, "test(", 5)) { lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); uint32_t cycles; - uint64_t accu=0; + uint64_t accu = 0; char sbuffer[32]; // PSTR performance test // this is best case since everything will be in cache @@ -4236,27 +4264,19 @@ extern char *SML_GetSVal(uint32_t index); } break; case '#': - { char sub[128]; - // subroutine - sub[0] = '='; - strncpy(sub + 1, lp, sizeof(sub) - 1); - char *xp = scripter_sub(sub, 0); - lp += (uint32_t)xp - (uint32_t)sub - 1; - - if (glob_script_mem.retstr) { - if (sp) strlcpy(sp, glob_script_mem.retstr, glob_script_mem.max_ssize); - free (glob_script_mem.retstr); - goto strexit; - } else { - fvar = glob_script_mem.retval; - goto exit; - } + len = 0; + lp = eval_sub(lp, &fvar, sp); + if (glob_script_mem.retstr) { + goto strexit; + } else { + goto exit; } break; default: break; } + // nothing valid found notfound: if (fp) *fp=0; @@ -4282,8 +4302,6 @@ strexit: return lp + len; } - - char *getop(char *lp, uint8_t *operand) { switch (*lp) { case '=': @@ -5005,7 +5023,34 @@ void esp_pwm(int32_t value, uint32 freq, uint32_t channel) { #endif // ESP32 } - +char *eval_sub(char *lp, float *fvar, char *rstr) { + scripter_sub(lp - 1, 0); + while (1) { + if (*lp == ')') { + lp++; + break; + } + if (*lp == SCRIPT_EOL || *lp == '+' || *lp == '-') { + break; + } + lp++; + } + if (glob_script_mem.retstr) { + if (rstr) { + strcpy(rstr, glob_script_mem.retstr); + } else { + *fvar = CharToFloat(glob_script_mem.retstr); + } + free (glob_script_mem.retstr); + } else { + if (fvar) { + *fvar = glob_script_mem.retval; + } else { + dtostrfd(glob_script_mem.retval, 6, rstr); + } + } + return lp; +} //#define IFTHEN_DEBUG @@ -5023,10 +5068,10 @@ char *scripter_sub(char *lp, uint8_t fromscriptcmd) { if (fromscriptcmd) { char *sp = glob_script_mem.scriptptr; glob_script_mem.scriptptr = glob_script_mem.scriptptr_bu; - Run_Scripter(slp, plen, 0); + Run_Scripter1(slp, plen, 0); glob_script_mem.scriptptr = sp; } else { - Run_Scripter(slp, plen, 0); + Run_Scripter1(slp, plen, 0); } lp = slp; return lp; @@ -5035,6 +5080,19 @@ char *scripter_sub(char *lp, uint8_t fromscriptcmd) { int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv); #define IF_NEST 8 + +int16_t Run_Scripter1(const char *type, int8_t tlen, const char *js) { +int16_t retval; + if (!glob_script_mem.scriptptr) { + return -99; + } + if (tasm_cmd_activ && tlen > 0) return 0; + struct GVARS gv; + gv.jo = 0; + retval = Run_script_sub(type, tlen, &gv); + return retval; +} + // execute section of scripter int16_t Run_Scripter(const char *type, int8_t tlen, const char *js) { int16_t retval; @@ -5098,6 +5156,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { // skip leading spaces startline: SCRIPT_SKIP_SPACES + while (*lp == '\t') {lp++;} // skip empty line SCRIPT_SKIP_EOL // skip comment @@ -5350,15 +5409,19 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } #ifdef USE_DISPLAY else if (!strncmp(lp, "dt", 2)) { - char dstbuf[256]; + //char dstbuf[256]; lp += 2; SCRIPT_SKIP_SPACES - Replace_Cmd_Vars(lp, 1, dstbuf, sizeof(dstbuf)); - char *savptr = XdrvMailbox.data; - XdrvMailbox.data = dstbuf; - XdrvMailbox.data_len = 0; - DisplayText(); - XdrvMailbox.data = savptr; + char *dstbuf = (char*)malloc(256); + if (dstbuf) { + Replace_Cmd_Vars(lp, 1, dstbuf, 256); + char *savptr = XdrvMailbox.data; + XdrvMailbox.data = dstbuf; + XdrvMailbox.data_len = 0; + DisplayText(); + XdrvMailbox.data = savptr; + free(dstbuf); + } goto next_line; } #endif //USE_DISPLAY @@ -5491,6 +5554,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { lp++; goto next_line; } +#ifdef USE_SCRIPT_WEB_DISPLAY else if (!strncmp(lp, "wcs", 3)) { lp+=4; // skip one space after cmd @@ -5505,20 +5569,30 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { WSContentFlush(); goto next_line; } +#endif else if (!strncmp(lp, "rapp", 3)) { lp+=4; // skip one space after cmd - char tmp[256]; - Replace_Cmd_Vars(lp ,1 , tmp, sizeof(tmp)); - ResponseAppend_P(PSTR("%s"), tmp); + char *tmp = (char*)malloc(256); + if (tmp) { + Replace_Cmd_Vars(lp ,1 , tmp, 256); + ResponseAppend_P(PSTR("%s"), tmp); + free(tmp); + } goto next_line; } + + #if defined(USE_SENDMAIL) || defined(USE_ESP32MAIL) else if (!strncmp(lp, "mail", 4)) { lp+=5; - char tmp[256]; - Replace_Cmd_Vars(lp ,1 , tmp, sizeof(tmp)); - SendMail(tmp); + //char tmp[256]; + char *tmp = (char*)malloc(256); + if (tmp) { + Replace_Cmd_Vars(lp ,1 , tmp, 256); + SendMail(tmp); + free(tmp); + } goto next_line; } #endif @@ -5601,11 +5675,11 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } // check for variable result - if (if_state[ifstck]==1) { + if (if_state[ifstck] == 1) { // evaluate exxpression lp = Evaluate_expression(lp, and_or, &if_result[ifstck], gv); SCRIPT_SKIP_SPACES - if (*lp=='{' && if_state[ifstck]==1) { + if (*lp == '{' && if_state[ifstck] == 1) { lp += 1; // then if_state[ifstck] = 2; if (if_exe[ifstck - 1]) if_exe[ifstck] = if_result[ifstck]; @@ -5614,7 +5688,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } else { char *vnp = lp; lp = isvar(lp, &vtype, &ind, &sysvar, 0, gv); - if (vtype!=VAR_NV) { + if (vtype != VAR_NV) { #ifdef USE_SCRIPT_GLOBVARS char varname[16]; uint32_t vnl = (uint32_t)lp - (uint32)vnp; @@ -5642,15 +5716,25 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } numeric = 1; lp = getop(lp, &lastop); - char *slp = lp; - glob_script_mem.glob_error = 0; - lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); - if (glob_script_mem.glob_error==1) { - // mismatch was string, not number - // get the string and convert to number - lp = isvar(slp, &vtype, &ind, 0, cmpstr, gv); - fvar = CharToFloat(cmpstr); +#ifdef SCRIPT_LM_SUB + if (*lp=='#') { + // subroutine + lp = eval_sub(lp, &fvar, 0); + } else { +#endif + char *slp = lp; + glob_script_mem.glob_error = 0; + //Serial.printf("Stack 1: %d\n",GetStack()); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); + if (glob_script_mem.glob_error == 1) { + // mismatch was string, not number + // get the string and convert to number + lp = isvar(slp, &vtype, &ind, 0, cmpstr, gv); + fvar = CharToFloat(cmpstr); + } +#ifdef SCRIPT_LM_SUB } +#endif switch (lastop) { case OPER_EQU: if (glob_script_mem.var_not_found) { @@ -5740,16 +5824,24 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { // string result char str[SCRIPT_MAXSSIZE]; lp = getop(lp, &lastop); - char *slp = lp; - glob_script_mem.glob_error = 0; - lp = GetStringArgument(lp, OPER_EQU, str, gv); - if ((!gv || !gv->jo) && glob_script_mem.glob_error) { - // mismatch - lp = GetNumericArgument(slp, OPER_EQU, &fvar, 0); - dtostrfd(fvar, 6, str); +#ifdef SCRIPT_LM_SUB + if (*lp=='#') { + // subroutine + lp = eval_sub(lp, 0, str); + } else { +#endif + char *slp = lp; glob_script_mem.glob_error = 0; + lp = GetStringArgument(lp, OPER_EQU, str, gv); + if ((!gv || !gv->jo) && glob_script_mem.glob_error) { + // mismatch + lp = GetNumericArgument(slp, OPER_EQU, &fvar, 0); + dtostrfd(fvar, 6, str); + glob_script_mem.glob_error = 0; + } +#ifdef SCRIPT_LM_SUB } - +#endif if (!glob_script_mem.var_not_found) { // var was changed SetChanged(globvindex); @@ -5802,15 +5894,14 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } // check for subroutine char *ctype = (char*)type; - if (*ctype=='#') { + if (*ctype == '#') { // check for parameter ctype += tlen; char nxttok = '('; - char *argptr = ctype+tlen; - + char *argptr = ctype + tlen; lp += tlen; do { - if (*ctype==nxttok && *lp==nxttok) { + if (*ctype == nxttok && *lp == nxttok) { float fparam; numeric = 1; glob_script_mem.glob_error = 0; @@ -5821,14 +5912,14 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { // get the string argptr = GetStringArgument((char*)ctype + 1, OPER_EQU, cmpstr, 0); } - if (*lp==nxttok) { + if (*lp == nxttok) { // fetch destination lp++; lp = isvar(lp, &vtype, &ind, 0, 0, gv); - if (vtype!=VAR_NV) { + if (vtype != VAR_NV) { // found variable as result uint8_t index = glob_script_mem.type[ind.index].index; - if ((vtype&STYPE)==0) { + if ((vtype & STYPE) == 0) { // numeric result dfvar = &glob_script_mem.fvars[index]; if (numeric) { @@ -5850,14 +5941,14 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } } } else { - if (*ctype==nxttok || (*lp!=SCRIPT_EOL && *lp!='?')) { + if (*ctype == nxttok || (*lp != SCRIPT_EOL && *lp != '?')) { // revert section = 0; } } nxttok = ' '; ctype = argptr; - } while (*lp==' ' && (section == 1) ); + } while (*lp == ' ' && (section == 1) ); } } } @@ -5916,7 +6007,7 @@ void ScripterEvery100ms(void) { } } if (bitRead(Settings->rule_enabled, 0)) { - if (glob_script_mem.fast_script) Run_Scripter(glob_script_mem.fast_script, 0, 0); + if (glob_script_mem.fast_script) Run_Scripter1(glob_script_mem.fast_script, 0, 0); } } @@ -6386,24 +6477,30 @@ void SaveScriptEnd(void) { Script_Close_Serial(); #endif - Run_Scripter(">B\n", 3, 0); - Run_Scripter(">BS", 3, 0); + set_callbacks(); + + Run_Scripter1(">B\n", 3, 0); + Run_Scripter1(">BS", 3, 0); //glob_script_mem.fast_script = Run_Scripter(">F", -2, 0); - if (Run_Scripter(">F", -2, 0) == 99) {glob_script_mem.fast_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.fast_script = 0;} - if (Run_Scripter(">E", -2, 0) == 99) {glob_script_mem.event_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.event_script = 0;} script_set_web_pages(); } } +void set_callbacks() { + if (Run_Scripter1(">F", -2, 0) == 99) {glob_script_mem.fast_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.fast_script = 0;} + if (Run_Scripter1(">E", -2, 0) == 99) {glob_script_mem.event_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.event_script = 0;} + if (Run_Scripter1(">C", -2, 0) == 99) {glob_script_mem.html_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.html_script = 0;} +} + void script_set_web_pages(void) { - if (Run_Scripter(">W", -2, 0) == 99) {glob_script_mem.web_pages[0] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[0] = 0;} - if (Run_Scripter(">w ", -3, 0) == 99) {glob_script_mem.web_pages[1] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[1] = 0;} - if (Run_Scripter(">w1 ", -4, 0) == 99) {glob_script_mem.web_pages[2] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[2] = 0;} - if (Run_Scripter(">w2 ", -4, 0) == 99) {glob_script_mem.web_pages[3] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[3] = 0;} - if (Run_Scripter(">w3 ", -4, 0) == 99) {glob_script_mem.web_pages[4] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[4] = 0;} + if (Run_Scripter1(">W", -2, 0) == 99) {glob_script_mem.web_pages[0] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[0] = 0;} + if (Run_Scripter1(">w ", -3, 0) == 99) {glob_script_mem.web_pages[1] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[1] = 0;} + if (Run_Scripter1(">w1 ", -4, 0) == 99) {glob_script_mem.web_pages[2] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[2] = 0;} + if (Run_Scripter1(">w2 ", -4, 0) == 99) {glob_script_mem.web_pages[3] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[3] = 0;} + if (Run_Scripter1(">w3 ", -4, 0) == 99) {glob_script_mem.web_pages[4] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[4] = 0;} } #endif // USE_WEBSERVER @@ -6623,7 +6720,7 @@ void Script_HueStatus(String *response, uint16_t hue_devs) { void Script_Check_Hue(String *response) { if (!bitRead(Settings->rule_enabled, 0)) return; - uint8_t hue_script_found = Run_Scripter(">H", -2, 0); + uint8_t hue_script_found = Run_Scripter1(">H", -2, 0); if (hue_script_found!=99) return; char tmp[256]; @@ -6885,7 +6982,7 @@ void Script_Handle_Hue(String *path) { WSSend(code, CT_APP_JSON, response); if (resp) { //Run_Scripter(">E", 2, 0); - if (glob_script_mem.event_script) Run_Scripter(glob_script_mem.event_script, 0, 0); + if (glob_script_mem.event_script) Run_Scripter1(glob_script_mem.event_script, 0, 0); } } #endif // hue interface @@ -6923,7 +7020,7 @@ bool Script_SubCmd(void) { *cp = 0; } //toLog(cmdbuff); - uint32_t res = Run_Scripter(cmdbuff, tlen + 1, 0); + uint32_t res = Run_Scripter1(cmdbuff, tlen + 1, 0); //AddLog(LOG_LEVEL_INFO,">>%d",res); if (res) { return false; @@ -6945,7 +7042,7 @@ void execute_script(char *script) { char *svd_sp = glob_script_mem.scriptptr; strcat(script, "\n#"); glob_script_mem.scriptptr = script; - Run_Scripter(">", 1, 0); + Run_Scripter1(">", 1, 0); glob_script_mem.scriptptr = svd_sp; } #define D_CMND_SCRIPT "Script" @@ -7734,12 +7831,14 @@ void Script_Check_HTML_Setvars(void) { *cp1 = '\"'; *(cp1 + tlen +1 ) = '\"'; } - //toLog(cmdbuf); execute_script(cmdbuf); - //Run_Scripter(">E", 2, 0); - if (glob_script_mem.event_script) Run_Scripter(glob_script_mem.event_script, 0, 0); +#ifdef USE_HTML_CALLBACK + if (glob_script_mem.html_script) Run_Scripter1(glob_script_mem.html_script, 0, 0); +#else + if (glob_script_mem.event_script) Run_Scripter1(glob_script_mem.event_script, 0, 0); +#endif } } @@ -7839,7 +7938,7 @@ const char SCRIPT_MSG_GOPT3[] PROGMEM = const char SCRIPT_MSG_GOPT4[] PROGMEM = //"hAxis:{minValue:new Date(0,1,1,0,0),maxValue:new Date(0,1,2,0,0),format:'HH:mm'}"; -"hAxis:{format:'HH:mm',minValue:new Date(0,0,0,0,0),maxValue:new Date(0,0,0,23,59)},theme: 'maximized'"; +"hAxis:{format:'HH:mm',minValue:new Date(0,0,0,0,0),maxValue:new Date(0,0,0,23,59)},theme: 'maximized',timeline:{tooltipDateFormat:'HH:mm'},"; const char SCRIPT_MSG_GOPT5[] PROGMEM = "new Date(0,0,0,%d,%d)"; @@ -8523,7 +8622,7 @@ exgc: uint16_t ipos = 0; lp = gc_get_arrays(lp, &arrays[0], &anum, &entries, &ipos); - if (anum>nanum) { + if (anum > nanum) { return lp1; //goto nextwebline; } @@ -8583,6 +8682,11 @@ exgc: } snprintf_P(options,sizeof(options), SCRIPT_MSG_GOPT4); } + if (tonly) { + WSContentSend_PD("]);"); + return lp1; + //goto nextwebline; + } } else { // we need to fetch the labels now WSContentSend_PD(SCRIPT_MSG_GTABLEa); @@ -8764,7 +8868,7 @@ exgc: #if defined(USE_SENDMAIL) || defined(USE_ESP32MAIL) void script_send_email_body(void(*func)(char *)) { -uint8_t msect = Run_Scripter(">m", -2, 0); +uint8_t msect = Run_Scripter1(">m", -2, 0); if (msect==99) { char tmp[256]; char *lp = glob_script_mem.section_ptr + 2; @@ -8798,7 +8902,7 @@ uint8_t msect = Run_Scripter(">m", -2, 0); #ifdef USE_SCRIPT_JSON_EXPORT void ScriptJsonAppend(void) { - uint8_t web_script = Run_Scripter(">J", -2, 0); + uint8_t web_script = Run_Scripter1(">J", -2, 0); if (web_script==99) { char tmp[256]; char *lp = glob_script_mem.section_ptr + 2; @@ -8864,7 +8968,7 @@ void script_task1(void *arg) { //if (timerule_enabled, 0)) { - if (esp32_tasks[0].tstart) Run_Scripter(esp32_tasks[0].tstart, 0, 0); + if (esp32_tasks[0].tstart) Run_Scripter1(esp32_tasks[0].tstart, 0, 0); } if (esp32_tasks[0].task_timer) { delay(esp32_tasks[0].task_timer); @@ -8878,7 +8982,7 @@ void script_task1(void *arg) { void script_task2(void *arg) { while (1) { if (bitRead(Settings->rule_enabled, 0)) { - if (esp32_tasks[1].tstart) Run_Scripter(esp32_tasks[1].tstart, 0, 0); + if (esp32_tasks[1].tstart) Run_Scripter1(esp32_tasks[1].tstart, 0, 0); } if (esp32_tasks[1].task_timer) { delay(esp32_tasks[1].task_timer); @@ -8903,12 +9007,12 @@ uint32_t scripter_create_task(uint32_t num, uint32_t time, uint32_t core, int32_ char *sp = 0; esp32_tasks[num].task_timer = time; if (!num) { - if (Run_Scripter(">t1", -3, 0) == 99) { + if (Run_Scripter1(">t1", -3, 0) == 99) { sp = glob_script_mem.section_ptr + 2; res = xTaskCreatePinnedToCore(script_task1, "T1", STASK_STACK, NULL, prio, &esp32_tasks[num].task_t, core); } } else { - if (Run_Scripter(">t2", -3, 0) == 99) { + if (Run_Scripter1(">t2", -3, 0) == 99) { sp = glob_script_mem.section_ptr + 2; res = xTaskCreatePinnedToCore(script_task2, "T2", STASK_STACK, NULL, prio, &esp32_tasks[num].task_t, core); } @@ -9245,7 +9349,7 @@ void btn_event_cb(lv_event_t * e); void btn_event_cb(lv_event_t * e) { lvgl_set_last(e->target, e->code); if (e->code == LV_EVENT_CLICKED) { - Run_Scripter(">lvb", 4, 0); + Run_Scripter1(">lvb", 4, 0); } } @@ -9254,7 +9358,7 @@ void slider_event_cb(lv_event_t * e) { lvgl_set_last(e->target, e->code); lvgl_last_slider = lv_slider_get_value(e->target); if (e->code == LV_EVENT_VALUE_CHANGED) { - Run_Scripter(">lvs", 4, 0); + Run_Scripter1(">lvs", 4, 0); } } @@ -9786,9 +9890,8 @@ bool Xdrv10(uint8_t function) // break; //case FUNC_INIT: if (bitRead(Settings->rule_enabled, 0)) { - Run_Scripter(">B\n", 3, 0); - if (Run_Scripter(">F", -2, 0) == 99) {glob_script_mem.fast_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.fast_script = 0;} - if (Run_Scripter(">E", -2, 0) == 99) {glob_script_mem.event_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.event_script = 0;} + set_callbacks(); + Run_Scripter1(">B\n", 3, 0); script_set_web_pages(); #if defined(USE_SCRIPT_HUE) && defined(USE_WEBSERVER) && defined(USE_EMULATION) && defined(USE_EMULATION_HUE) && defined(USE_LIGHT) Script_Check_Hue(0); @@ -9807,11 +9910,11 @@ bool Xdrv10(uint8_t function) break; case FUNC_SET_POWER: #ifdef SCRIPT_POWER_SECTION - if (bitRead(Settings->rule_enabled, 0)) Run_Scripter(">P", 2, 0); + if (bitRead(Settings->rule_enabled, 0)) Run_Scripter1(">P", 2, 0); #else if (bitRead(Settings->rule_enabled, 0)) { //Run_Scripter(">E", 2, 0); - if (glob_script_mem.event_script) Run_Scripter(glob_script_mem.event_script, 0, 0); + if (glob_script_mem.event_script) Run_Scripter1(glob_script_mem.event_script, 0, 0); result = glob_script_mem.event_handeled; } #endif //SCRIPT_POWER_SECTION @@ -9875,7 +9978,7 @@ bool Xdrv10(uint8_t function) case FUNC_SAVE_BEFORE_RESTART: if (bitRead(Settings->rule_enabled, 0)) { - Run_Scripter(">R", 2, 0); + Run_Scripter1(">R", 2, 0); Scripter_save_pvars(); } #ifdef USE_SCRIPT_GLOBVARS @@ -9910,7 +10013,7 @@ bool Xdrv10(uint8_t function) if (bitRead(Settings->rule_enabled, 0)) { if ((glob_script_mem.script_button[XdrvMailbox.index]&1)!=(XdrvMailbox.payload&1)) { glob_script_mem.script_button[XdrvMailbox.index] = XdrvMailbox.payload; - Run_Scripter(">b", 2, 0); + Run_Scripter1(">b", 2, 0); } } break; From 90675463b517645dce19efdf1b9496cc5189865f Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 30 Jan 2022 10:58:42 +0100 Subject: [PATCH 3/4] LVGL allow null pointer for lv_disp and lv_indev --- lib/libesp32_lvgl/lv_berry/src/lv_berry.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32_lvgl/lv_berry/src/lv_berry.c b/lib/libesp32_lvgl/lv_berry/src/lv_berry.c index ac003c519..b701cbb53 100644 --- a/lib/libesp32_lvgl/lv_berry/src/lv_berry.c +++ b/lib/libesp32_lvgl/lv_berry/src/lv_berry.c @@ -43,7 +43,7 @@ int lv0_init(bvm *vm); int lv0_init(bvm *vm) { // "+_p" indicates that there must be an non NULL argument, either passed as comptr or returned by the function // Here, there is no function, so calling the constructor without a non-null comptr argument is rejected - return be_call_c_func(vm, NULL, "+_p", NULL); + return be_call_c_func(vm, NULL, "=_p", NULL); } /*********************************************************************************************\ From d8ef44142474e4520f3951f88dc71293475d4bb6 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 30 Jan 2022 11:07:15 +0100 Subject: [PATCH 4/4] Small fixes to Berry audio --- lib/libesp32/berry/generate/be_const_strtab.h | 3 + .../berry/generate/be_const_strtab_def.h | 1988 +++++++++-------- .../be_fixed_be_class_audio_output_i2s.h | 5 +- .../berry_tasmota/src/be_audio_opus_lib.c | 20 +- .../berry_tasmota/src/be_i2s_audio_lib.cpp | 6 + tasmota/berry/alexa_avs/uuid.be | 15 + 6 files changed, 1039 insertions(+), 998 deletions(-) create mode 100644 tasmota/berry/alexa_avs/uuid.be diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index acd699c9d..fb8a56d9f 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -41,12 +41,15 @@ extern const bcstring be_const_str_EVENT_DELETE; extern const bcstring be_const_str_EVENT_DRAW_MAIN; extern const bcstring be_const_str_EVENT_DRAW_PART_BEGIN; extern const bcstring be_const_str_EVENT_DRAW_PART_END; +extern const bcstring be_const_str_EXTERNAL_I2S; extern const bcstring be_const_str_False; extern const bcstring be_const_str_GET; extern const bcstring be_const_str_HTTP_GET; extern const bcstring be_const_str_HTTP_POST; extern const bcstring be_const_str_I2C_Driver; extern const bcstring be_const_str_I2C_X3A; +extern const bcstring be_const_str_INTERNAL_DAC; +extern const bcstring be_const_str_INTERNAL_PDM; extern const bcstring be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback; extern const bcstring be_const_str_LVG_X3A_X20object_X3A; extern const bcstring be_const_str_Leds; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index c8f53f50e..4c7ce6911 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,769 +1,772 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_AudioFileSourceFS); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_True); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_due); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_i2c_enabled); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_STATE_DEFAULT); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_Unknown_X20command); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, NULL); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_consume_mono); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_Timer); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_response_append); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_exec_cmd); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str___lower__); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_lv_wifi_arcs); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_I2C_Driver); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, NULL); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_collect); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_SERIAL_6N2); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_contains); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_codedump); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_HTTP_GET); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_set); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_AudioOutputI2S); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_SERIAL_5E1); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_SERIAL_7O1); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_cosh); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_widget_instance_size); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str__end_transmission); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str__dirty); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_AudioGeneratorWAV); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, NULL); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_cb_event_closure); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_create_custom_widget); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_lv_coord_arr); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range); +be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_duration); +be_define_const_str(_X20, " ", 621580159u, 0, 1, NULL); +be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_input); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str__X2Fac); +be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_I2C_Driver); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_EXTERNAL_I2S); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_SERIAL_5O2); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, NULL); +be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_chars_in_string); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_tostring); +be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_has_X20already_X20an_X20event_X20callback); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_tasmota); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str__X3D_X3C_X3E_X21); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_Timer); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_resp_cmnd); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_add_fast_loop); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, NULL); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str__X2E); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_LVG_X3A_X20object_X3A); +be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_True); +be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_invalidate); +be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_class_init_obj); +be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_read_bytes); +be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_run_deferred); +be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, NULL); +be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_SERIAL_6E1); +be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_SERIAL_6E2); +be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_page_autoconf_ctl); +be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, NULL); +be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_line_dsc); +be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_path); +be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_tolower); +be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_ctypes_bytes_dyn); +be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_OpusDecoder); +be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting); +be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_json); be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, NULL); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_set_chg_current); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_connected); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_add_rule); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str__archive); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_files); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "Choose a device configuration:
", 1336654704u, 0, 49, NULL); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_shared_key); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, NULL); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_tomap); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_EVENT_DELETE); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_list_handlers); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_add_handler); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_LVG_X3A_X20object_X3A); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_input); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, NULL); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_begin_multicast); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_pi); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_erase); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_local); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "Choose a device configuration:
", 1336654704u, 0, 49, &be_const_str_HTTP_POST); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_AES_GCM); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_json_append); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_depower); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_add_anim); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_MD5); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_CFG_X3A_X20removing_X20autoconf_X20files); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_AudioGeneratorWAV); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, NULL); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_if); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_get_object_from_ptr); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "