diff --git a/CHANGELOG.md b/CHANGELOG.md index c3d974890..901057b48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development ## [11.0.0.1] ### Added +- Command ``SspmMap 0`` to reset Sonoff SPM default mapping +- Command ``TcpConnect `` to add client connection mode (#14874) - ESP32 support for BLE Mi scale V1 (#13517) - ESP32 integrate Homekit in Bluetooth binary (#14818) - ESP32 Berry always enable rules @@ -21,6 +23,7 @@ All notable changes to this project will be documented in this file. - GPIO OptionE1 selection regression (#14821) - BL0939, BL0940 and BL0942 energy monitoring buffer miscompares resulting in wrong daily energy values regression from v9.5.0.8 (#14829) - Orno WE517 power meter phase 2 current reactive (#14841) +- Wiegand 34-bit rfid reading and presentation (#14834) ## [Released] diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 45636d317..6e56333fb 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -105,6 +105,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v11.0.0.1 ### Added +- Command ``SspmMap 0`` to reset Sonoff SPM default mapping +- Command ``TcpConnect `` to add client connection mode [#14874](https://github.com/arendst/Tasmota/issues/14874) - ESP32 Berry always enable rules - ESP32 Berry bootloop protection - ESP32 support for BLE Mi scale V1 [#13517](https://github.com/arendst/Tasmota/issues/13517) @@ -123,6 +125,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - SSPM energy yesterday when zero - GPIO OptionE1 selection regression [#14821](https://github.com/arendst/Tasmota/issues/14821) - BL0939, BL0940 and BL0942 energy monitoring buffer miscompares resulting in wrong daily energy values regression from v9.5.0.8 [#14829](https://github.com/arendst/Tasmota/issues/14829) +- Wiegand 34-bit rfid reading and presentation [#14834](https://github.com/arendst/Tasmota/issues/14834) - Orno WE517 power meter phase 2 current reactive [#14841](https://github.com/arendst/Tasmota/issues/14841) ### Removed diff --git a/lib/lib_basic/OneWire-Stickbreaker/OneWire.h b/lib/lib_basic/OneWire-Stickbreaker/OneWire.h index 2747bea4e..5f4b613c2 100644 --- a/lib/lib_basic/OneWire-Stickbreaker/OneWire.h +++ b/lib/lib_basic/OneWire-Stickbreaker/OneWire.h @@ -210,14 +210,14 @@ void directModeInput(IO_REG_TYPE pin) ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux); ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown); } -#elif ESP_IDF_VERSION_MAJOR > 3 // ESP32-S2 needs IDF 4.2 or later - int8_t rtc_io = esp32_gpioMux[pin].rtc; - uint32_t rtc_reg = (rtc_io != -1)?rtc_io_desc[rtc_io].reg:0; - if ( rtc_reg ) // RTC pins PULL settings - { - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].mux); - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].pullup | rtc_io_desc[rtc_io].pulldown); - } +//#elif ESP_IDF_VERSION_MAJOR > 3 // ESP32-S2 needs IDF 4.2 or later +// int8_t rtc_io = esp32_gpioMux[pin].rtc; +// uint32_t rtc_reg = (rtc_io != -1)?rtc_io_desc[rtc_io].reg:0; +// if ( rtc_reg ) // RTC pins PULL settings +// { +// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].mux); +// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].pullup | rtc_io_desc[rtc_io].pulldown); +// } #endif // Input if ( pin < 32 ) @@ -225,13 +225,13 @@ void directModeInput(IO_REG_TYPE pin) else GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32)); - uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers? - pinFunction |= FUN_IE; // input enable but required for output as well? - pinFunction |= ((uint32_t)PIN_FUNC_GPIO << MCU_SEL_S); +// uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers? +// pinFunction |= FUN_IE; // input enable but required for output as well? +// pinFunction |= ((uint32_t)PIN_FUNC_GPIO << MCU_SEL_S); - ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction; +// ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction; - GPIO.pin[pin].val = 0; +// GPIO.pin[pin].val = 0; } #endif } @@ -252,14 +252,14 @@ void directModeOutput(IO_REG_TYPE pin) ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux); ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown); } -#elif ESP_IDF_VERSION_MAJOR > 3 // ESP32-S2 needs IDF 4.2 or later - int8_t rtc_io = esp32_gpioMux[pin].rtc; - uint32_t rtc_reg = (rtc_io != -1)?rtc_io_desc[rtc_io].reg:0; - if ( rtc_reg ) // RTC pins PULL settings - { - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].mux); - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].pullup | rtc_io_desc[rtc_io].pulldown); - } +//#elif ESP_IDF_VERSION_MAJOR > 3 // ESP32-S2 needs IDF 4.2 or later +// int8_t rtc_io = esp32_gpioMux[pin].rtc; +// uint32_t rtc_reg = (rtc_io != -1)?rtc_io_desc[rtc_io].reg:0; +// if ( rtc_reg ) // RTC pins PULL settings +// { +// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].mux); +// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].pullup | rtc_io_desc[rtc_io].pulldown); +// } #endif // Output if ( pin < 32 ) @@ -267,13 +267,13 @@ void directModeOutput(IO_REG_TYPE pin) else // already validated to pins <= 33 GPIO.enable1_w1ts.val = ((uint32_t)1 << (pin - 32)); - uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers? - pinFunction |= FUN_IE; // input enable but required for output as well? - pinFunction |= ((uint32_t)PIN_FUNC_GPIO << MCU_SEL_S); +// uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers? +// pinFunction |= FUN_IE; // input enable but required for output as well? +// pinFunction |= ((uint32_t)PIN_FUNC_GPIO << MCU_SEL_S); - ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction; +// ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction; - GPIO.pin[pin].val = 0; +// GPIO.pin[pin].val = 0; } #endif } diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c index e09106849..3bc875f47 100644 --- a/lib/libesp32/berry/default/be_modtab.c +++ b/lib/libesp32/berry/default/be_modtab.c @@ -30,6 +30,7 @@ be_extern_native_module(cb); /* Tasmota specific */ be_extern_native_module(python_compat); be_extern_native_module(re); +be_extern_native_module(mqtt); be_extern_native_module(persist); be_extern_native_module(autoconf); be_extern_native_module(tapp); @@ -108,6 +109,7 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { &be_native_module(python_compat), &be_native_module(re), &be_native_module(path), + &be_native_module(mqtt), &be_native_module(persist), #ifdef USE_AUTOCONF &be_native_module(autoconf), @@ -157,7 +159,7 @@ extern void be_load_wirelib(bvm *vm); extern void be_load_onewirelib(bvm *vm); extern void be_load_serial_lib(bvm *vm); extern void be_load_Driver_class(bvm *vm); -extern void be_load_Timer_class(bvm *vm); +extern void be_load_Trigger_class(bvm *vm); extern void be_load_I2C_Driver_class(bvm *vm); extern void be_load_AXP192_class(bvm *vm); extern void be_load_md5_lib(bvm *vm); @@ -198,7 +200,7 @@ BERRY_API void be_load_custom_libs(bvm *vm) #if !BE_USE_PRECOMPILED_OBJECT /* be_load_xxxlib(vm); */ #endif - be_load_Timer_class(vm); + be_load_Trigger_class(vm); be_load_tasmota_ntvlib(vm); be_load_tasmota_log_reader_class(vm); be_load_Driver_class(vm); diff --git a/lib/libesp32/berry/default/berry_conf.h b/lib/libesp32/berry/default/berry_conf.h index d796dce02..8ee9cd0ba 100644 --- a/lib/libesp32/berry/default/berry_conf.h +++ b/lib/libesp32/berry/default/berry_conf.h @@ -175,6 +175,14 @@ **/ #define BE_USE_DEBUG_GC 0 +/* Macro: BE_USE_MEM_ALIGNED + * Some embedded processors have special memory areas + * with read/write constraints of being aligned to 32 bits boundaries. + * This options tries to move such memory areas to this region. + * Default: 0 + **/ +#define BE_USE_MEM_ALIGNED 1 + /* Macro: BE_USE_XXX_MODULE * These macros control whether the related module is compiled. * When they are true, they will enable related modules. At this @@ -215,8 +223,6 @@ extern "C" { extern void berry_free(void *ptr); extern void *berry_realloc(void *ptr, size_t size); extern void *berry_malloc32(size_t size); - extern void berry_free32(void *ptr); - extern void *berry_realloc32(void *ptr, size_t size); #ifdef __cplusplus } #endif diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index 834714ee9..f8108ccc8 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -100,7 +100,7 @@ extern const bcstring be_const_str_STATE_DEFAULT; extern const bcstring be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27; extern const bcstring be_const_str_Tasmota; extern const bcstring be_const_str_Tele; -extern const bcstring be_const_str_Timer; +extern const bcstring be_const_str_Trigger; extern const bcstring be_const_str_True; extern const bcstring be_const_str_Unknown; extern const bcstring be_const_str_Unknown_X20command; @@ -526,6 +526,7 @@ extern const bcstring be_const_str_length_X20in_X20bits_X20must_X20be_X20between extern const bcstring be_const_str_light; extern const bcstring be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27; extern const bcstring be_const_str_light_state; +extern const bcstring be_const_str_light_to_id; extern const bcstring be_const_str_lights; extern const bcstring be_const_str_line_dsc; extern const bcstring be_const_str_list; @@ -759,6 +760,7 @@ extern const bcstring be_const_str_strftime; extern const bcstring be_const_str_string; extern const bcstring be_const_str_strip; extern const bcstring be_const_str_strptime; +extern const bcstring be_const_str_subscribe; extern const bcstring be_const_str_success; extern const bcstring be_const_str_super; extern const bcstring be_const_str_sys; @@ -788,6 +790,7 @@ extern const bcstring be_const_str_touch_update; extern const bcstring be_const_str_toupper; extern const bcstring be_const_str_tr; extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_trig; extern const bcstring be_const_str_true; extern const bcstring be_const_str_try; extern const bcstring be_const_str_try_rule; @@ -795,6 +798,7 @@ extern const bcstring be_const_str_type; extern const bcstring be_const_str_type_error; extern const bcstring be_const_str_udp; extern const bcstring be_const_str_unknown_X20instruction; +extern const bcstring be_const_str_unsubscribe; extern const bcstring be_const_str_update; extern const bcstring be_const_str_upper; extern const bcstring be_const_str_url_encode; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index 777e7d55a..6f2bb82eb 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,746 +1,747 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__def); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__X2D_X2D_X3A_X2D_X2D); -be_define_const_str(_X20, " ", 621580159u, 0, 1, NULL); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_send); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_yield); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str__X23autoexec_X2Ebat); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_delete_all_configs); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_constructor_cb); -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_public_key); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str__X3D_X3C_X3E_X21); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_eth); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, NULL); -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_CFG_X3A_X20downloading_X20_X27_X25s_X27); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, NULL); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, NULL); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_EXTERNAL_I2S); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_isinstance); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_find_key_i); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_lower); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_leds); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_files); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_lv_coord_arr); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_json_fdump_list); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_list); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_get_current_module_path); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_get_vbus_voltage); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_rtc); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_create_segment); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_draw_line_dsc_init); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_set); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_stop); +be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_abs); +be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_set_gain); +be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, NULL); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_read12); +be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_floor); +be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_True); +be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_get_switch); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_atan2); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_ins_time); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_button_pressed); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_event_cb); +be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str__X2F); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_display_X2Eini); +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_MD5); +be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str__filename); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_destructor_cb); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_consume_mono); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_get_bat_charge_current); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_copy); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_PART_MAIN); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, NULL); +be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_rtc); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, NULL); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20); +be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found); +be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_get_temp); +be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_color); +be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_millis); +be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_animate); +be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_ctypes_bytes_dyn); +be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_set_ldo_voltage); +be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_select); be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, NULL); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_clear); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_set_huesat); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, NULL); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s); -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__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_init_draw_arc_dsc); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_day); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

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

", 1863865923u, 0, 16, &be_const_str_file); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20); -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_False); -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_add_anim); +be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_asstring); +be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_hex); +be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str__X3C_X3D); +be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_DIMMER); +be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29); +be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_set_light); +be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_attrdump); +be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_line_dsc); +be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_widget_ctor_impl); +be_define_const_str(_X3C, "<", 957132539u, 0, 1, NULL); +be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, &be_const_str_begin_multicast); +be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_lv_module_init); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_invalidate); +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_AudioFileSource); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, NULL); +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_back_forth); 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__X3F); -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_get_width); -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_assert); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, NULL); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_SERIAL_5E1); -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_to_gamma); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str__X3E_X3D); -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_pixel_count); -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, NULL); -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_f); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "", 4247924536u, 0, 19, &be_const_str_CFG_X3A_X20removing_X20autoconf_X20files); +be_define_const_str(_X3D, "=", 940354920u, 0, 1, &be_const_str__energy); +be_define_const_str(_X3D_X3C_X3E_X21, "=<>!", 2664470277u, 0, 4, &be_const_str_get_style_bg_color); +be_define_const_str(_X3D_X3D, "==", 2431966415u, 0, 2, &be_const_str_SERIAL_8O2); +be_define_const_str(_X3E, ">", 990687777u, 0, 1, &be_const_str_add_handler); +be_define_const_str(_X3E_X3D, ">=", 284975636u, 0, 2, NULL); +be_define_const_str(_X3F, "?", 973910158u, 0, 1, &be_const_str_update); +be_define_const_str(AES_GCM, "AES_GCM", 3832208678u, 0, 7, &be_const_str_digital_read); +be_define_const_str(AXP192, "AXP192", 757230128u, 0, 6, &be_const_str_full_state); +be_define_const_str(Animate_X20pc_X20is_X20out_X20of_X20range, "Animate pc is out of range", 1854929421u, 0, 26, &be_const_str_connect); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_c); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_strftime); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str__buffer); be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, NULL); -be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, &be_const_str_cb); -be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27); -be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, NULL); -be_define_const_str(Auto_X2Dconfiguration, "Auto-configuration", 1665006109u, 0, 18, NULL); -be_define_const_str(BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, "BRY: ERROR, bad json: ", 2715135809u, 0, 22, NULL); -be_define_const_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: Exception> '%s' - %s", 2246990964u, 0, 25, &be_const_str_web_send_decimal); -be_define_const_str(BRY_X3A_X20argument_X20must_X20be_X20a_X20function, "BRY: argument must be a function", 3917068408u, 0, 32, &be_const_str_group_def); -be_define_const_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, "BRY: could not save compiled file %s (%s)", 736659787u, 0, 41, &be_const_str_static); -be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, "BRY: failed to load _persist.json", 2991913445u, 0, 33, &be_const_str_try_rule); -be_define_const_str(BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, "BRY: invalid hue payload: ", 203709367u, 0, 26, &be_const_str__settings_def); -be_define_const_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, "BRY: method not allowed, use a closure like '/ args -> obj.func(args)'", 177121572u, 0, 70, &be_const_str_reset); -be_define_const_str(BUTTON_CONFIGURATION, "BUTTON_CONFIGURATION", 70820856u, 0, 20, &be_const_str_pc_rel); -be_define_const_str(CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, "CFG: 'init.bat' done, restarting", 1569670677u, 0, 32, &be_const_str_push_path); -be_define_const_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "CFG: Exception> '%s' - %s", 1228874553u, 0, 25, &be_const_str_SERIAL_8E2); +be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, &be_const_str_break); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, NULL); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str___lower__); +be_define_const_str(Auto_X2Dconfiguration, "Auto-configuration", 1665006109u, 0, 18, &be_const_str_create_segment); +be_define_const_str(BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, "BRY: ERROR, bad json: ", 2715135809u, 0, 22, &be_const_str_set_power); +be_define_const_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: Exception> '%s' - %s", 2246990964u, 0, 25, &be_const_str_I2C_Driver); +be_define_const_str(BRY_X3A_X20argument_X20must_X20be_X20a_X20function, "BRY: argument must be a function", 3917068408u, 0, 32, &be_const_str_SERIAL_7E2); +be_define_const_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, "BRY: could not save compiled file %s (%s)", 736659787u, 0, 41, NULL); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, "BRY: failed to load _persist.json", 2991913445u, 0, 33, &be_const_str_SERIAL_7O1); +be_define_const_str(BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, "BRY: invalid hue payload: ", 203709367u, 0, 26, &be_const_str_GET); +be_define_const_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, "BRY: method not allowed, use a closure like '/ args -> obj.func(args)'", 177121572u, 0, 70, &be_const_str_WS2812); +be_define_const_str(BUTTON_CONFIGURATION, "BUTTON_CONFIGURATION", 70820856u, 0, 20, &be_const_str_event_send); +be_define_const_str(CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, "CFG: 'init.bat' done, restarting", 1569670677u, 0, 32, &be_const_str_EC_C25519); +be_define_const_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "CFG: Exception> '%s' - %s", 1228874553u, 0, 25, &be_const_str_json_fdump_map); be_define_const_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, "CFG: No '*.autoconf' file found", 755798501u, 0, 31, NULL); -be_define_const_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, "CFG: could not run %s (%s - %s)", 1428829580u, 0, 31, &be_const_str_ceil); -be_define_const_str(CFG_X3A_X20downloading_X20_X27_X25s_X27, "CFG: downloading '%s'", 589480701u, 0, 21, &be_const_str_get_style_bg_color); -be_define_const_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, "CFG: exception '%s' - '%s'", 4095407913u, 0, 26, &be_const_str_consume_mono); -be_define_const_str(CFG_X3A_X20loaded_X20_X20, "CFG: loaded ", 3710273538u, 0, 13, &be_const_str__persist_X2Ejson); -be_define_const_str(CFG_X3A_X20loaded_X20_X27_X25s_X27, "CFG: loaded '%s'", 1699028828u, 0, 16, &be_const_str_get_pixel_color); -be_define_const_str(CFG_X3A_X20loading_X20, "CFG: loading ", 4010361503u, 0, 13, &be_const_str_SERIAL_8O2); -be_define_const_str(CFG_X3A_X20loading_X20_X27_X25s_X27, "CFG: loading '%s'", 2285306097u, 0, 17, &be_const_str_SK6812_GRBW); -be_define_const_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, "CFG: multiple autoconf files found, aborting ('%s' + '%s')", 197663371u, 0, 58, &be_const_str_autoexec); -be_define_const_str(CFG_X3A_X20ran_X20_X20, "CFG: ran ", 3579570472u, 0, 10, &be_const_str_add_header); -be_define_const_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, "CFG: removed file '%s'", 2048602473u, 0, 22, &be_const_str_widget_height_def); -be_define_const_str(CFG_X3A_X20removing_X20autoconf_X20files, "CFG: removing autoconf files", 4014704970u, 0, 28, &be_const_str__class); -be_define_const_str(CFG_X3A_X20removing_X20first_X20time_X20marker, "CFG: removing first time marker", 2125556683u, 0, 31, NULL); -be_define_const_str(CFG_X3A_X20return_code_X3D_X25i, "CFG: return_code=%i", 2059897320u, 0, 19, NULL); -be_define_const_str(CFG_X3A_X20running_X20, "CFG: running ", 2478334534u, 0, 13, &be_const_str_widget_event_cb); -be_define_const_str(CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, "CFG: skipping 'display.ini' because already present in file-system", 3965549264u, 0, 66, &be_const_str_counters); -be_define_const_str(COLOR_BLACK, "COLOR_BLACK", 264427940u, 0, 11, &be_const_str_RGB); -be_define_const_str(COLOR_WHITE, "COLOR_WHITE", 2536871270u, 0, 11, &be_const_str_lv_clock_icon); -be_define_const_str(CT, "CT", 1792671826u, 0, 2, &be_const_str_param); +be_define_const_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, "CFG: could not run %s (%s - %s)", 1428829580u, 0, 31, &be_const_str_deinit); +be_define_const_str(CFG_X3A_X20downloading_X20_X27_X25s_X27, "CFG: downloading '%s'", 589480701u, 0, 21, &be_const_str_get_string); +be_define_const_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, "CFG: exception '%s' - '%s'", 4095407913u, 0, 26, &be_const_str_iter); +be_define_const_str(CFG_X3A_X20loaded_X20_X20, "CFG: loaded ", 3710273538u, 0, 13, &be_const_str_cosh); +be_define_const_str(CFG_X3A_X20loaded_X20_X27_X25s_X27, "CFG: loaded '%s'", 1699028828u, 0, 16, NULL); +be_define_const_str(CFG_X3A_X20loading_X20, "CFG: loading ", 4010361503u, 0, 13, NULL); +be_define_const_str(CFG_X3A_X20loading_X20_X27_X25s_X27, "CFG: loading '%s'", 2285306097u, 0, 17, &be_const_str_set_xy); +be_define_const_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, "CFG: multiple autoconf files found, aborting ('%s' + '%s')", 197663371u, 0, 58, NULL); +be_define_const_str(CFG_X3A_X20ran_X20_X20, "CFG: ran ", 3579570472u, 0, 10, &be_const_str_ct); +be_define_const_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, "CFG: removed file '%s'", 2048602473u, 0, 22, &be_const_str_set); +be_define_const_str(CFG_X3A_X20removing_X20autoconf_X20files, "CFG: removing autoconf files", 4014704970u, 0, 28, &be_const_str_begin); +be_define_const_str(CFG_X3A_X20removing_X20first_X20time_X20marker, "CFG: removing first time marker", 2125556683u, 0, 31, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf); +be_define_const_str(CFG_X3A_X20return_code_X3D_X25i, "CFG: return_code=%i", 2059897320u, 0, 19, &be_const_str_gamma8); +be_define_const_str(CFG_X3A_X20running_X20, "CFG: running ", 2478334534u, 0, 13, &be_const_str_counters); +be_define_const_str(CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, "CFG: skipping 'display.ini' because already present in file-system", 3965549264u, 0, 66, &be_const_str_files); +be_define_const_str(COLOR_BLACK, "COLOR_BLACK", 264427940u, 0, 11, NULL); +be_define_const_str(COLOR_WHITE, "COLOR_WHITE", 2536871270u, 0, 11, &be_const_str_code); +be_define_const_str(CT, "CT", 1792671826u, 0, 2, &be_const_str__end_transmission); be_define_const_str(DIMMER, "DIMMER", 4049308363u, 0, 6, NULL); -be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, NULL); +be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, &be_const_str_Restart_X201); be_define_const_str(EVENT_DELETE, "EVENT_DELETE", 282828603u, 0, 12, NULL); -be_define_const_str(EVENT_DRAW_MAIN, "EVENT_DRAW_MAIN", 1955620614u, 0, 15, &be_const_str_OpusDecoder); -be_define_const_str(EVENT_DRAW_PART_BEGIN, "EVENT_DRAW_PART_BEGIN", 3391865024u, 0, 21, &be_const_str_elements_X20must_X20be_X20a_X20lv_point); -be_define_const_str(EVENT_DRAW_PART_END, "EVENT_DRAW_PART_END", 3301625292u, 0, 19, &be_const_str_exec_rules); -be_define_const_str(EXTERNAL_I2S, "EXTERNAL_I2S", 4067456169u, 0, 12, &be_const_str_Unknown); -be_define_const_str(False, "False", 2541049336u, 0, 5, &be_const_str__timers); -be_define_const_str(GET, "GET", 2531704439u, 0, 3, &be_const_str_base_class); +be_define_const_str(EVENT_DRAW_MAIN, "EVENT_DRAW_MAIN", 1955620614u, 0, 15, NULL); +be_define_const_str(EVENT_DRAW_PART_BEGIN, "EVENT_DRAW_PART_BEGIN", 3391865024u, 0, 21, NULL); +be_define_const_str(EVENT_DRAW_PART_END, "EVENT_DRAW_PART_END", 3301625292u, 0, 19, &be_const_str_imin); +be_define_const_str(EXTERNAL_I2S, "EXTERNAL_I2S", 4067456169u, 0, 12, &be_const_str_light); +be_define_const_str(False, "False", 2541049336u, 0, 5, &be_const_str_add_anim); +be_define_const_str(GET, "GET", 2531704439u, 0, 3, &be_const_str_day); be_define_const_str(HTTP_GET, "HTTP_GET", 1722467738u, 0, 8, NULL); -be_define_const_str(HTTP_POST, "HTTP_POST", 1999554144u, 0, 9, &be_const_str_RES_OK); -be_define_const_str(I2C_X3A, "I2C:", 813483371u, 0, 4, &be_const_str_RGBCT); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, NULL); -be_define_const_str(INTERNAL_DAC, "INTERNAL_DAC", 1097623719u, 0, 12, &be_const_str_set_reachable); -be_define_const_str(INTERNAL_PDM, "INTERNAL_PDM", 3043685628u, 0, 12, NULL); -be_define_const_str(LVG_X3A_X20call_X20to_X20unsupported_X20callback, "LVG: call to unsupported callback", 504176819u, 0, 33, &be_const_str_getbits); -be_define_const_str(LVG_X3A_X20object_X3A, "LVG: object:", 3824079937u, 0, 12, &be_const_str_b); -be_define_const_str(Leds, "Leds", 2709245275u, 0, 4, NULL); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, NULL); -be_define_const_str(None, "None", 810547195u, 0, 4, &be_const_str_has); -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_json_fdump); -be_define_const_str(OneWire, "OneWire", 2298990722u, 0, 7, &be_const_str_format); -be_define_const_str(OpusDecoder, "OpusDecoder", 3618742074u, 0, 11, NULL); -be_define_const_str(PART_MAIN, "PART_MAIN", 2473491508u, 0, 9, &be_const_str_classname); -be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_member); +be_define_const_str(HTTP_POST, "HTTP_POST", 1999554144u, 0, 9, &be_const_str_find); +be_define_const_str(I2C_X3A, "I2C:", 813483371u, 0, 4, &be_const_str_init); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_classname); +be_define_const_str(INTERNAL_DAC, "INTERNAL_DAC", 1097623719u, 0, 12, &be_const_str_depower); +be_define_const_str(INTERNAL_PDM, "INTERNAL_PDM", 3043685628u, 0, 12, &be_const_str_OpusDecoder); +be_define_const_str(LVG_X3A_X20call_X20to_X20unsupported_X20callback, "LVG: call to unsupported callback", 504176819u, 0, 33, &be_const_str_LVG_X3A_X20object_X3A); +be_define_const_str(LVG_X3A_X20object_X3A, "LVG: object:", 3824079937u, 0, 12, &be_const_str_SERIAL_7E1); +be_define_const_str(Leds, "Leds", 2709245275u, 0, 4, &be_const_str_add_event_cb); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_SERIAL_5O1); +be_define_const_str(None, "None", 810547195u, 0, 4, &be_const_str_add_cmd); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_name); +be_define_const_str(OneWire, "OneWire", 2298990722u, 0, 7, &be_const_str_reset); +be_define_const_str(OpusDecoder, "OpusDecoder", 3618742074u, 0, 11, &be_const_str_pin_used); +be_define_const_str(PART_MAIN, "PART_MAIN", 2473491508u, 0, 9, &be_const_str_set_x); +be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_arch); be_define_const_str(Parameter_X20error, "Parameter error", 3840042038u, 0, 15, NULL); -be_define_const_str(RELAY, "RELAY", 2163786658u, 0, 5, &be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27); -be_define_const_str(RES_OK, "RES_OK", 1233817284u, 0, 6, &be_const_str_bri); -be_define_const_str(RGB, "RGB", 3386082140u, 0, 3, &be_const_str_animate); -be_define_const_str(RGBCT, "RGBCT", 8076251u, 0, 5, &be_const_str_set_bits_per_sample); -be_define_const_str(RGBW, "RGBW", 3270986321u, 0, 4, &be_const_str_SERIAL_7E1); -be_define_const_str(Restart_X201, "Restart 1", 3504455855u, 0, 9, &be_const_str_set_text); -be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, &be_const_str_light); -be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, NULL); -be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, &be_const_str__end_transmission); -be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, &be_const_str_wifi_bars_icon); -be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, &be_const_str_compress); -be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str_set_timeouts); -be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, &be_const_str_closure); -be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str_can_show); -be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, &be_const_str_char); -be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str_delay); -be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str_WS2812_GRB); +be_define_const_str(RELAY, "RELAY", 2163786658u, 0, 5, &be_const_str_has_arg); +be_define_const_str(RES_OK, "RES_OK", 1233817284u, 0, 6, &be_const_str_fast_loop_enabled); +be_define_const_str(RGB, "RGB", 3386082140u, 0, 3, NULL); +be_define_const_str(RGBCT, "RGBCT", 8076251u, 0, 5, &be_const_str_get_vbus_voltage); +be_define_const_str(RGBW, "RGBW", 3270986321u, 0, 4, &be_const_str_remove); +be_define_const_str(Restart_X201, "Restart 1", 3504455855u, 0, 9, &be_const_str_byte); +be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, &be_const_str_push); +be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, &be_const_str_false); +be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, &be_const_str_a); +be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, &be_const_str_b); +be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, &be_const_str_add_light); +be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str_available); +be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, &be_const_str_cb); +be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str_has); +be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, &be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj); +be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str_ins_ramp); +be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str_clear); be_define_const_str(SERIAL_6O2, "SERIAL_6O2", 316486129u, 0, 10, NULL); -be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, &be_const_str_i2c_enabled); -be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str_set_percentage); -be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_item); -be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, NULL); +be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, &be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29); +be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str__X5B); +be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_format); +be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, &be_const_str__ccmd); be_define_const_str(SERIAL_7O1, "SERIAL_7O1", 1823802675u, 0, 10, NULL); -be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, &be_const_str_scale_uint); -be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, &be_const_str_id); -be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, NULL); -be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, &be_const_str_pc_abs); -be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, &be_const_str_global); +be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, NULL); +be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, NULL); +be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, &be_const_str_duration); +be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, NULL); +be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, NULL); be_define_const_str(SERIAL_8O1, "SERIAL_8O1", 289122742u, 0, 10, NULL); -be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, NULL); -be_define_const_str(SK6812_GRBW, "SK6812_GRBW", 81157857u, 0, 11, &be_const_str_event_cb); -be_define_const_str(STATE_DEFAULT, "STATE_DEFAULT", 712406428u, 0, 13, &be_const_str_set_exten); -be_define_const_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, "TAP: Loaded Tasmota App '%s'", 926477145u, 0, 28, &be_const_str_consume_silence); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_check_privileged_access); -be_define_const_str(Tele, "Tele", 1329980653u, 0, 4, NULL); -be_define_const_str(Timer, "Timer", 3948127682u, 0, 5, &be_const_str_int); -be_define_const_str(True, "True", 3453902341u, 0, 4, &be_const_str_real); -be_define_const_str(Unknown, "Unknown", 3424652889u, 0, 7, NULL); -be_define_const_str(Unknown_X20command, "Unknown command", 1830905432u, 0, 15, &be_const_str_setrange); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_wd); +be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, &be_const_str_out_X20of_X20range); +be_define_const_str(SK6812_GRBW, "SK6812_GRBW", 81157857u, 0, 11, NULL); +be_define_const_str(STATE_DEFAULT, "STATE_DEFAULT", 712406428u, 0, 13, &be_const_str__begin_transmission); +be_define_const_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, "TAP: Loaded Tasmota App '%s'", 926477145u, 0, 28, &be_const_str___upper__); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str__); +be_define_const_str(Tele, "Tele", 1329980653u, 0, 4, &be_const_str_pixel_size); +be_define_const_str(Trigger, "Trigger", 2783579555u, 0, 7, NULL); +be_define_const_str(True, "True", 3453902341u, 0, 4, &be_const_str_search); +be_define_const_str(Unknown, "Unknown", 3424652889u, 0, 7, &be_const_str__rules); +be_define_const_str(Unknown_X20command, "Unknown command", 1830905432u, 0, 15, &be_const_str_save_before_restart); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str__settings_ptr); be_define_const_str(WS2812_GRB, "WS2812_GRB", 1736405692u, 0, 10, NULL); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_setitem); -be_define_const_str(_X5B, "[", 3725336506u, 0, 1, &be_const_str_set_dcdc_enable); -be_define_const_str(_X5D, "]", 3624670792u, 0, 1, &be_const_str_atleast1); -be_define_const_str(_, "_", 3658226030u, 0, 1, NULL); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_sat); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_detect); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_draw_line_dsc); -be_define_const_str(_anonymous_, "_anonymous_", 1957281476u, 0, 11, NULL); -be_define_const_str(_archive, "_archive", 4004559404u, 0, 8, &be_const_str_available); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_point); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_insert); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_every_50ms); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_check_privileged_access); +be_define_const_str(_X5B, "[", 3725336506u, 0, 1, &be_const_str_cmd_res); +be_define_const_str(_X5D, "]", 3624670792u, 0, 1, NULL); +be_define_const_str(_, "_", 3658226030u, 0, 1, &be_const_str_init_draw_arc_dsc); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_fromptr); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str__fl); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, NULL); +be_define_const_str(_anonymous_, "_anonymous_", 1957281476u, 0, 11, &be_const_str_instance_size); +be_define_const_str(_archive, "_archive", 4004559404u, 0, 8, &be_const_str_exp); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_widget_destructor); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_get_cb_list); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_seti); be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_read_bytes); -be_define_const_str(_class, "_class", 2732146350u, 0, 6, &be_const_str_destructor_cb); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_resp_cmnd_failed); -be_define_const_str(_debug_present, "_debug_present", 4063411725u, 0, 14, &be_const_str_call_native); -be_define_const_str(_def, "_def", 1985022181u, 0, 4, &be_const_str_display_X2Eini); -be_define_const_str(_dirty, "_dirty", 283846766u, 0, 6, NULL); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_ins_ramp); -be_define_const_str(_energy, "_energy", 535372070u, 0, 7, &be_const_str_full_state); -be_define_const_str(_error, "_error", 1132109656u, 0, 6, &be_const_str_draw_arc); -be_define_const_str(_filename, "_filename", 1430813195u, 0, 9, NULL); -be_define_const_str(_fl, "_fl", 4042564892u, 0, 3, &be_const_str_do); -be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_setmember); -be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, NULL); -be_define_const_str(_lvgl, "_lvgl", 2689219483u, 0, 5, &be_const_str_dirty); -be_define_const_str(_p, "_p", 1594591802u, 0, 2, &be_const_str_lvgl_event_dispatch); -be_define_const_str(_persist_X2Ejson, "_persist.json", 2008425138u, 0, 13, &be_const_str_compile); -be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, &be_const_str_fast_loop_enabled); -be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_is_first_time); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_tostring); -be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, &be_const_str_content_send_style); -be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, &be_const_str_find); -be_define_const_str(_t, "_t", 1527481326u, 0, 2, NULL); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_area); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_make_cb); -be_define_const_str(a, "a", 3826002220u, 0, 1, NULL); -be_define_const_str(abs, "abs", 709362235u, 0, 3, NULL); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_content_flush); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_read32); -be_define_const_str(add_anim, "add_anim", 3980662668u, 0, 8, NULL); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_start); -be_define_const_str(add_event_cb, "add_event_cb", 633097693u, 0, 12, &be_const_str_draw_ctx); -be_define_const_str(add_fast_loop, "add_fast_loop", 3025842946u, 0, 13, &be_const_str_draw_line); -be_define_const_str(add_handler, "add_handler", 2055124119u, 0, 11, &be_const_str_atan); -be_define_const_str(add_header, "add_header", 927130612u, 0, 10, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); -be_define_const_str(add_light, "add_light", 3169328603u, 0, 9, &be_const_str_dump); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_resp_cmnd_error); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_battery_present); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_wire2); -be_define_const_str(alternate, "alternate", 1140253277u, 0, 9, &be_const_str_push); -be_define_const_str(animate, "animate", 3885786800u, 0, 7, &be_const_str_get_current_module_name); -be_define_const_str(animators, "animators", 279858213u, 0, 9, &be_const_str_bool); -be_define_const_str(arc_dsc, "arc_dsc", 2768816310u, 0, 7, &be_const_str_get_bat_charge_current); -be_define_const_str(arch, "arch", 2952804297u, 0, 4, NULL); -be_define_const_str(area, "area", 2601460036u, 0, 4, &be_const_str_set_style_line_color); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_get_battery_chargin_status); -be_define_const_str(arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, "arg must be a subclass of lv_obj", 1641882079u, 0, 32, &be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_font_seg7); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL); -be_define_const_str(argument_X20must_X20be_X20a_X20function, "argument must be a function", 527172389u, 0, 27, NULL); -be_define_const_str(argument_X20must_X20be_X20a_X20list, "argument must be a list", 3056915661u, 0, 23, &be_const_str_bus); +be_define_const_str(_class, "_class", 2732146350u, 0, 6, &be_const_str_get_percentage); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_add); +be_define_const_str(_debug_present, "_debug_present", 4063411725u, 0, 14, &be_const_str_minute); +be_define_const_str(_def, "_def", 1985022181u, 0, 4, NULL); +be_define_const_str(_dirty, "_dirty", 283846766u, 0, 6, &be_const_str_closure); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_set_mode_ct); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); +be_define_const_str(_energy, "_energy", 535372070u, 0, 7, &be_const_str_int); +be_define_const_str(_error, "_error", 1132109656u, 0, 6, NULL); +be_define_const_str(_filename, "_filename", 1430813195u, 0, 9, &be_const_str_pc_abs); +be_define_const_str(_fl, "_fl", 4042564892u, 0, 3, &be_const_str_set_width); +be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_json); +be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, &be_const_str_from_to); +be_define_const_str(_lvgl, "_lvgl", 2689219483u, 0, 5, &be_const_str_set_mode_rgb); +be_define_const_str(_p, "_p", 1594591802u, 0, 2, &be_const_str_success); +be_define_const_str(_persist_X2Ejson, "_persist.json", 2008425138u, 0, 13, &be_const_str_classof); +be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, NULL); +be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_web_send_decimal); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_set_alternate); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_content_send_style); +be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, &be_const_str_leds); +be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, &be_const_str_quality); +be_define_const_str(_t, "_t", 1527481326u, 0, 2, &be_const_str_end); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, NULL); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, NULL); +be_define_const_str(a, "a", 3826002220u, 0, 1, &be_const_str_add_header); +be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_arg_name); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL); +be_define_const_str(add, "add", 993596020u, 0, 3, NULL); +be_define_const_str(add_anim, "add_anim", 3980662668u, 0, 8, &be_const_str_ceil); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, NULL); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_exists); +be_define_const_str(add_event_cb, "add_event_cb", 633097693u, 0, 12, NULL); +be_define_const_str(add_fast_loop, "add_fast_loop", 3025842946u, 0, 13, NULL); +be_define_const_str(add_handler, "add_handler", 2055124119u, 0, 11, NULL); +be_define_const_str(add_header, "add_header", 927130612u, 0, 10, NULL); +be_define_const_str(add_light, "add_light", 3169328603u, 0, 9, &be_const_str_pixels_buffer); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_exec_tele); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, NULL); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_webserver); +be_define_const_str(alternate, "alternate", 1140253277u, 0, 9, &be_const_str_log); +be_define_const_str(animate, "animate", 3885786800u, 0, 7, NULL); +be_define_const_str(animators, "animators", 279858213u, 0, 9, &be_const_str_internal_error); +be_define_const_str(arc_dsc, "arc_dsc", 2768816310u, 0, 7, &be_const_str_finish); +be_define_const_str(arch, "arch", 2952804297u, 0, 4, &be_const_str_f); +be_define_const_str(area, "area", 2601460036u, 0, 4, NULL); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_exec_cmd); +be_define_const_str(arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, "arg must be a subclass of lv_obj", 1641882079u, 0, 32, NULL); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_fromb64); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_widget_group_def); +be_define_const_str(argument_X20must_X20be_X20a_X20function, "argument must be a function", 527172389u, 0, 27, &be_const_str_pixel_count); +be_define_const_str(argument_X20must_X20be_X20a_X20list, "argument must be a list", 3056915661u, 0, 23, &be_const_str_draw_arc_dsc); be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_introspect); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_number); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_json); -be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, NULL); -be_define_const_str(atleast1, "atleast1", 1956331672u, 0, 8, &be_const_str_str); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_copy); -be_define_const_str(autoexec, "autoexec", 3676861891u, 0, 8, NULL); -be_define_const_str(autorun, "autorun", 1447527407u, 0, 7, &be_const_str_pixels_buffer); -be_define_const_str(available, "available", 1727918744u, 0, 9, &be_const_str_publish); -be_define_const_str(b, "b", 3876335077u, 0, 1, NULL); -be_define_const_str(back_forth, "back_forth", 2665042062u, 0, 10, &be_const_str_enabled); -be_define_const_str(base_class, "base_class", 1107737279u, 0, 10, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); -be_define_const_str(battery_present, "battery_present", 3588397058u, 0, 15, &be_const_str_c); -be_define_const_str(before_del, "before_del", 815924436u, 0, 10, NULL); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_encrypt); -be_define_const_str(begin_multicast, "begin_multicast", 57647915u, 0, 15, &be_const_str_min); -be_define_const_str(bool, "bool", 3365180733u, 0, 4, &be_const_str_get_option); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_exec_rules); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_remove_timer); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_refr_size); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_due); +be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, &be_const_str_lv_signal_bars); +be_define_const_str(atleast1, "atleast1", 1956331672u, 0, 8, NULL); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_set_channels); +be_define_const_str(autoexec, "autoexec", 3676861891u, 0, 8, &be_const_str_return); +be_define_const_str(autorun, "autorun", 1447527407u, 0, 7, &be_const_str_bus); +be_define_const_str(available, "available", 1727918744u, 0, 9, &be_const_str_signal_change); +be_define_const_str(b, "b", 3876335077u, 0, 1, &be_const_str_read24); +be_define_const_str(back_forth, "back_forth", 2665042062u, 0, 10, &be_const_str_ismethod); +be_define_const_str(base_class, "base_class", 1107737279u, 0, 10, &be_const_str_concat); +be_define_const_str(battery_present, "battery_present", 3588397058u, 0, 15, &be_const_str_get_coords); +be_define_const_str(before_del, "before_del", 815924436u, 0, 10, &be_const_str_create_custom_widget); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); +be_define_const_str(begin_multicast, "begin_multicast", 57647915u, 0, 15, &be_const_str_every_second); +be_define_const_str(bool, "bool", 3365180733u, 0, 4, &be_const_str_file); be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(bri, "bri", 2112284244u, 0, 3, &be_const_str_imin); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_floor); -be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_lv_event_cb); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_ctor); +be_define_const_str(bri, "bri", 2112284244u, 0, 3, &be_const_str_delete_all_configs); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_compress); +be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, NULL); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_clear_first_time); be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL); -be_define_const_str(c, "c", 3859557458u, 0, 1, &be_const_str_path); -be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_hue); -be_define_const_str(call_native, "call_native", 1389147405u, 0, 11, &be_const_str_serial); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, NULL); -be_define_const_str(can_show, "can_show", 960091187u, 0, 8, &be_const_str_content_button); -be_define_const_str(cb, "cb", 1428787088u, 0, 2, &be_const_str_get_switch); -be_define_const_str(cb_do_nothing, "cb_do_nothing", 1488730702u, 0, 13, &be_const_str_xy); -be_define_const_str(cb_event_closure, "cb_event_closure", 3828267325u, 0, 16, &be_const_str_light_state); +be_define_const_str(c, "c", 3859557458u, 0, 1, &be_const_str_pi); +be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_content_send); +be_define_const_str(call_native, "call_native", 1389147405u, 0, 11, &be_const_str_response_append); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_reapply); +be_define_const_str(can_show, "can_show", 960091187u, 0, 8, &be_const_str_collect); +be_define_const_str(cb, "cb", 1428787088u, 0, 2, NULL); +be_define_const_str(cb_do_nothing, "cb_do_nothing", 1488730702u, 0, 13, NULL); +be_define_const_str(cb_event_closure, "cb_event_closure", 3828267325u, 0, 16, &be_const_str_gamma10); be_define_const_str(cb_obj, "cb_obj", 1195696482u, 0, 6, NULL); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_lv_wifi_bars_icon); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_tele); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_publish_result); -be_define_const_str(check_not_method, "check_not_method", 2597324607u, 0, 16, NULL); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_has_arg); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_group_def); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_start); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, NULL); +be_define_const_str(check_not_method, "check_not_method", 2597324607u, 0, 16, &be_const_str_get_height); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_debug); be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(class_init_obj, "class_init_obj", 178410604u, 0, 14, &be_const_str_update); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_top); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_model); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_discover); -be_define_const_str(clear_first_time, "clear_first_time", 632769909u, 0, 16, NULL); -be_define_const_str(clear_to, "clear_to", 3528002130u, 0, 8, &be_const_str_gamma8); -be_define_const_str(clock_icon, "clock_icon", 544669651u, 0, 10, &be_const_str_content_stop); -be_define_const_str(close, "close", 667630371u, 0, 5, NULL); -be_define_const_str(closure, "closure", 1548407746u, 0, 7, NULL); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); -be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, &be_const_str_remove_cmd); -be_define_const_str(code, "code", 4180765940u, 0, 4, &be_const_str_set_channels); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_var); +be_define_const_str(class_init_obj, "class_init_obj", 178410604u, 0, 14, &be_const_str_draw_arc); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_is_first_time); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_tasmota); +be_define_const_str(clear_first_time, "clear_first_time", 632769909u, 0, 16, &be_const_str_resize); +be_define_const_str(clear_to, "clear_to", 3528002130u, 0, 8, &be_const_str_lights); +be_define_const_str(clock_icon, "clock_icon", 544669651u, 0, 10, &be_const_str_draw_line_dsc); +be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_h); +be_define_const_str(closure, "closure", 1548407746u, 0, 7, &be_const_str_isinstance); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_dirty); +be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, NULL); +be_define_const_str(code, "code", 4180765940u, 0, 4, &be_const_str_get_style_line_color); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032); be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); be_define_const_str(color, "color", 1031692888u, 0, 5, NULL); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); -be_define_const_str(compress, "compress", 2818084237u, 0, 8, &be_const_str_connect); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_round_start); +be_define_const_str(compress, "compress", 2818084237u, 0, 8, &be_const_str_decode); be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); -be_define_const_str(connect, "connect", 2866859257u, 0, 7, &be_const_str_flush); -be_define_const_str(connected, "connected", 1424938192u, 0, 9, &be_const_str_contains); -be_define_const_str(connection_error, "connection_error", 1358926260u, 0, 16, &be_const_str_lights); +be_define_const_str(connect, "connect", 2866859257u, 0, 7, &be_const_str_i2c_enabled); +be_define_const_str(connected, "connected", 1424938192u, 0, 9, &be_const_str_get_alternate); +be_define_const_str(connection_error, "connection_error", 1358926260u, 0, 16, &be_const_str_io_error); be_define_const_str(constructor_cb, "constructor_cb", 2489105297u, 0, 14, NULL); -be_define_const_str(consume_mono, "consume_mono", 3577563453u, 0, 12, &be_const_str_deregister_obj); -be_define_const_str(consume_silence, "consume_silence", 1445390925u, 0, 15, &be_const_str_module); +be_define_const_str(consume_mono, "consume_mono", 3577563453u, 0, 12, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); +be_define_const_str(consume_silence, "consume_silence", 1445390925u, 0, 15, &be_const_str_getbits); be_define_const_str(consume_stereo, "consume_stereo", 1834661098u, 0, 14, NULL); -be_define_const_str(contains, "contains", 1825239352u, 0, 8, NULL); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_time_dump); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_init); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_load); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_from_to); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_get_string); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_h); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(coord_arr, "coord_arr", 4189963658u, 0, 9, &be_const_str_run_bat); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_cosh); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_every_100ms); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_fromstring); -be_define_const_str(couldn_X27t_X20not_X20initialize_X20noepixelbus, "couldn't not initialize noepixelbus", 2536490812u, 0, 35, &be_const_str_debug); -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_matrix); -be_define_const_str(counters, "counters", 4095866864u, 0, 8, &be_const_str_json_append); -be_define_const_str(create_custom_widget, "create_custom_widget", 1140594778u, 0, 20, &be_const_str_finish); -be_define_const_str(create_matrix, "create_matrix", 3528185923u, 0, 13, &be_const_str_tcpclient); -be_define_const_str(create_segment, "create_segment", 3863522719u, 0, 14, &be_const_str_iter); -be_define_const_str(ct, "ct", 1261010898u, 0, 2, &be_const_str_instance_size); -be_define_const_str(ctor, "ctor", 375399343u, 0, 4, NULL); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_font_embedded); -be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, NULL); -be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, &be_const_str_get_cb_list); -be_define_const_str(day, "day", 3830391293u, 0, 3, &be_const_str_pow); -be_define_const_str(debug, "debug", 1483009432u, 0, 5, &be_const_str_tan); -be_define_const_str(decode, "decode", 3007678287u, 0, 6, NULL); -be_define_const_str(decompress, "decompress", 2887031650u, 0, 10, &be_const_str_lv_point); -be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_escape); +be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_content_start); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, NULL); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_readline); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_remote_port); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, NULL); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, &be_const_str_import); +be_define_const_str(coord_arr, "coord_arr", 4189963658u, 0, 9, &be_const_str_global); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_imax); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_detect); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_enabled); +be_define_const_str(couldn_X27t_X20not_X20initialize_X20noepixelbus, "couldn't not initialize noepixelbus", 2536490812u, 0, 35, &be_const_str_memory); +be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_isnan); +be_define_const_str(counters, "counters", 4095866864u, 0, 8, &be_const_str_dac_voltage); +be_define_const_str(create_custom_widget, "create_custom_widget", 1140594778u, 0, 20, &be_const_str_decompress); +be_define_const_str(create_matrix, "create_matrix", 3528185923u, 0, 13, NULL); +be_define_const_str(create_segment, "create_segment", 3863522719u, 0, 14, &be_const_str_set_style_text_font); +be_define_const_str(ct, "ct", 1261010898u, 0, 2, &be_const_str_hue_status); +be_define_const_str(ctor, "ctor", 375399343u, 0, 4, &be_const_str_remote_ip); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_trig); +be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, &be_const_str_get_free_heap); +be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, NULL); +be_define_const_str(day, "day", 3830391293u, 0, 3, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); +be_define_const_str(debug, "debug", 1483009432u, 0, 5, &be_const_str_resp_cmnd); +be_define_const_str(decode, "decode", 3007678287u, 0, 6, &be_const_str_tasmota_log_reader); +be_define_const_str(decompress, "decompress", 2887031650u, 0, 10, &be_const_str_page_autoconf_ctl); +be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_find_op); be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_hue_status); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_shared_key); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_deregister_obj); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_fromstring); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); be_define_const_str(delete_all_configs, "delete_all_configs", 2382067578u, 0, 18, NULL); -be_define_const_str(depower, "depower", 3563819571u, 0, 7, NULL); -be_define_const_str(deregister_obj, "deregister_obj", 3909966993u, 0, 14, NULL); +be_define_const_str(depower, "depower", 3563819571u, 0, 7, &be_const_str_get_bri); +be_define_const_str(deregister_obj, "deregister_obj", 3909966993u, 0, 14, &be_const_str_get_aps_voltage); be_define_const_str(destructor_cb, "destructor_cb", 1930283190u, 0, 13, NULL); -be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_set_first_time); -be_define_const_str(detected_X20on_X20bus, "detected on bus", 1432002650u, 0, 15, &be_const_str_register_button_encoder); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, NULL); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_set_style_text_font); -be_define_const_str(dimmer, "dimmer", 794270539u, 0, 6, &be_const_str_lv_signal_bars); -be_define_const_str(dirty, "dirty", 2667581083u, 0, 5, &be_const_str_ins_goto); -be_define_const_str(discover, "discover", 1383599054u, 0, 8, &be_const_str_get_alternate); -be_define_const_str(display, "display", 1164572437u, 0, 7, NULL); -be_define_const_str(display_X2Eini, "display.ini", 2646174001u, 0, 11, &be_const_str_is_running); +be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_height_def); +be_define_const_str(detected_X20on_X20bus, "detected on bus", 1432002650u, 0, 15, &be_const_str_else); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_write8); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_module); +be_define_const_str(dimmer, "dimmer", 794270539u, 0, 6, &be_const_str_redirect); +be_define_const_str(dirty, "dirty", 2667581083u, 0, 5, &be_const_str_widget_struct_default); +be_define_const_str(discover, "discover", 1383599054u, 0, 8, &be_const_str_get_vbus_current); +be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_screenshot); +be_define_const_str(display_X2Eini, "display.ini", 2646174001u, 0, 11, NULL); be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(draw_arc, "draw_arc", 1828251676u, 0, 8, &be_const_str_find_op); +be_define_const_str(draw_arc, "draw_arc", 1828251676u, 0, 8, &be_const_str_remove_driver); be_define_const_str(draw_arc_dsc, "draw_arc_dsc", 2411410957u, 0, 12, NULL); -be_define_const_str(draw_arc_dsc_init, "draw_arc_dsc_init", 402724044u, 0, 17, NULL); -be_define_const_str(draw_ctx, "draw_ctx", 953366593u, 0, 8, &be_const_str_get_bat_power); -be_define_const_str(draw_line, "draw_line", 1634465686u, 0, 9, &be_const_str_tomap); -be_define_const_str(draw_line_dsc, "draw_line_dsc", 4220676203u, 0, 13, &be_const_str_engine); -be_define_const_str(draw_line_dsc_init, "draw_line_dsc_init", 3866693646u, 0, 18, &be_const_str_get_style_pad_right); -be_define_const_str(due, "due", 3895530293u, 0, 3, NULL); +be_define_const_str(draw_arc_dsc_init, "draw_arc_dsc_init", 402724044u, 0, 17, &be_const_str_lv_extra); +be_define_const_str(draw_ctx, "draw_ctx", 953366593u, 0, 8, NULL); +be_define_const_str(draw_line, "draw_line", 1634465686u, 0, 9, NULL); +be_define_const_str(draw_line_dsc, "draw_line_dsc", 4220676203u, 0, 13, &be_const_str_point_arr); +be_define_const_str(draw_line_dsc_init, "draw_line_dsc_init", 3866693646u, 0, 18, &be_const_str_get_current_module_path); +be_define_const_str(due, "due", 3895530293u, 0, 3, &be_const_str_engine); be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(duration, "duration", 799079693u, 0, 8, &be_const_str_remote_ip); -be_define_const_str(editable, "editable", 60532369u, 0, 8, &be_const_str_traceback); -be_define_const_str(elements_X20must_X20be_X20a_X20lv_point, "elements must be a lv_point", 1415796524u, 0, 27, &be_const_str_on); -be_define_const_str(elif, "elif", 3232090307u, 51, 4, &be_const_str_return); +be_define_const_str(duration, "duration", 799079693u, 0, 8, &be_const_str_widget_height_def); +be_define_const_str(editable, "editable", 60532369u, 0, 8, &be_const_str_upper); +be_define_const_str(elements_X20must_X20be_X20a_X20lv_point, "elements must be a lv_point", 1415796524u, 0, 27, &be_const_str_param); +be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); be_define_const_str(enabled, "enabled", 49525662u, 0, 7, NULL); -be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_set_auth); +be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_obj_class_create_obj); be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(energy_struct, "energy_struct", 1655792843u, 0, 13, &be_const_str_obj_event_base); +be_define_const_str(energy_struct, "energy_struct", 1655792843u, 0, 13, &be_const_str_get); be_define_const_str(engine, "engine", 3993360443u, 0, 6, NULL); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); -be_define_const_str(escape, "escape", 2652972038u, 0, 6, &be_const_str_lv_extra); -be_define_const_str(eth, "eth", 2191266556u, 0, 3, &be_const_str_io_error); -be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); -be_define_const_str(event_cb, "event_cb", 3128698017u, 0, 8, &be_const_str_get_power); -be_define_const_str(event_send, "event_send", 598925582u, 0, 10, &be_const_str_range); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_target); -be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_lv_event); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_json_fdump_any); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_return_X20code_X3D_X25i); +be_define_const_str(escape, "escape", 2652972038u, 0, 6, NULL); +be_define_const_str(eth, "eth", 2191266556u, 0, 3, &be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map); +be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_get_battery_chargin_status); +be_define_const_str(event_cb, "event_cb", 3128698017u, 0, 8, &be_const_str_hue); +be_define_const_str(event_send, "event_send", 598925582u, 0, 10, &be_const_str_signal_bars); +be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_range); +be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_remove_rule); +be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, NULL); be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_write_file); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_reapply); -be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, NULL); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_target_search); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_set_ldo_voltage); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, NULL); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_item); +be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, &be_const_str_groups); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL); be_define_const_str(f, "f", 3809224601u, 0, 1, NULL); be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(fast_loop, "fast_loop", 3414422702u, 0, 9, &be_const_str_hue_ntv); -be_define_const_str(fast_loop_enabled, "fast_loop_enabled", 2567964376u, 0, 17, &be_const_str_ip); -be_define_const_str(file, "file", 2867484483u, 0, 4, &be_const_str_millis); -be_define_const_str(file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, "file extension is not '.be' or '.bec'", 3095719639u, 0, 37, NULL); -be_define_const_str(files, "files", 1055342736u, 0, 5, NULL); -be_define_const_str(find, "find", 3186656602u, 0, 4, NULL); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_missing_X20name); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_y); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_height_def); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_r); -be_define_const_str(flush, "flush", 3002334877u, 0, 5, NULL); -be_define_const_str(font_embedded, "font_embedded", 1623675143u, 0, 13, &be_const_str_wifi_bars); -be_define_const_str(font_montserrat, "font_montserrat", 3790091262u, 0, 15, NULL); -be_define_const_str(font_seg7, "font_seg7", 1551771835u, 0, 9, &be_const_str_math); +be_define_const_str(fast_loop, "fast_loop", 3414422702u, 0, 9, &be_const_str_lv_solidified); +be_define_const_str(fast_loop_enabled, "fast_loop_enabled", 2567964376u, 0, 17, &be_const_str_montserrat_font); +be_define_const_str(file, "file", 2867484483u, 0, 4, NULL); +be_define_const_str(file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, "file extension is not '.be' or '.bec'", 3095719639u, 0, 37, &be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); +be_define_const_str(files, "files", 1055342736u, 0, 5, &be_const_str_setitem); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_kv); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_tob64); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_gamma); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function); +be_define_const_str(flush, "flush", 3002334877u, 0, 5, &be_const_str_get_option); +be_define_const_str(font_embedded, "font_embedded", 1623675143u, 0, 13, &be_const_str_strip); +be_define_const_str(font_montserrat, "font_montserrat", 3790091262u, 0, 15, &be_const_str_isrunning); +be_define_const_str(font_seg7, "font_seg7", 1551771835u, 0, 9, &be_const_str_open); be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_pi); -be_define_const_str(from_to, "from_to", 21625507u, 0, 7, &be_const_str_setbits); -be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, &be_const_str_instance_X20required); -be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, &be_const_str_offseta); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_web_add_main_button); -be_define_const_str(full_state, "full_state", 255687770u, 0, 10, &be_const_str_signal_change); -be_define_const_str(full_status, "full_status", 648242459u, 0, 11, &be_const_str_set_hue16sat); -be_define_const_str(function, "function", 2664841801u, 0, 8, &be_const_str_screenshot); -be_define_const_str(gamma, "gamma", 3492353034u, 0, 5, &be_const_str_isnan); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_geti); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_set_style_line_color); +be_define_const_str(from_to, "from_to", 21625507u, 0, 7, &be_const_str_has_X20already_X20an_X20event_X20callback); +be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, NULL); +be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, &be_const_str_tostring); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_matrix); +be_define_const_str(full_state, "full_state", 255687770u, 0, 10, &be_const_str_run_bat); +be_define_const_str(full_status, "full_status", 648242459u, 0, 11, NULL); +be_define_const_str(function, "function", 2664841801u, 0, 8, NULL); +be_define_const_str(gamma, "gamma", 3492353034u, 0, 5, &be_const_str_insert); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_set_style_bg_color); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_response_append); -be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_set_gain); -be_define_const_str(get_alternate, "get_alternate", 1450148894u, 0, 13, NULL); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, NULL); +be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_json_fdump_any); +be_define_const_str(get_alternate, "get_alternate", 1450148894u, 0, 13, &be_const_str_except); be_define_const_str(get_aps_voltage, "get_aps_voltage", 2293036435u, 0, 15, NULL); -be_define_const_str(get_bat_charge_current, "get_bat_charge_current", 1385293050u, 0, 22, &be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); -be_define_const_str(get_bat_current, "get_bat_current", 1912106073u, 0, 15, &be_const_str_strip); -be_define_const_str(get_bat_power, "get_bat_power", 3067374853u, 0, 13, &be_const_str_load_templates); -be_define_const_str(get_bat_voltage, "get_bat_voltage", 706676538u, 0, 15, &be_const_str_save_before_restart); -be_define_const_str(get_battery_chargin_status, "get_battery_chargin_status", 2233241571u, 0, 26, NULL); -be_define_const_str(get_bri, "get_bri", 2041809895u, 0, 7, &be_const_str_lv_module_init); -be_define_const_str(get_cb_list, "get_cb_list", 1605319182u, 0, 11, NULL); -be_define_const_str(get_coords, "get_coords", 1044089006u, 0, 10, NULL); -be_define_const_str(get_current_module_name, "get_current_module_name", 2379270740u, 0, 23, &be_const_str__X7D); -be_define_const_str(get_current_module_path, "get_current_module_path", 3206673408u, 0, 23, &be_const_str_invalidate); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_minute); -be_define_const_str(get_height, "get_height", 3571755523u, 0, 10, &be_const_str_lv_wifi_arcs); +be_define_const_str(get_bat_charge_current, "get_bat_charge_current", 1385293050u, 0, 22, &be_const_str_get_bat_voltage); +be_define_const_str(get_bat_current, "get_bat_current", 1912106073u, 0, 15, NULL); +be_define_const_str(get_bat_power, "get_bat_power", 3067374853u, 0, 13, NULL); +be_define_const_str(get_bat_voltage, "get_bat_voltage", 706676538u, 0, 15, &be_const_str_set_exten); +be_define_const_str(get_battery_chargin_status, "get_battery_chargin_status", 2233241571u, 0, 26, &be_const_str_split); +be_define_const_str(get_bri, "get_bri", 2041809895u, 0, 7, NULL); +be_define_const_str(get_cb_list, "get_cb_list", 1605319182u, 0, 11, &be_const_str_size); +be_define_const_str(get_coords, "get_coords", 1044089006u, 0, 10, &be_const_str_touch_update); +be_define_const_str(get_current_module_name, "get_current_module_name", 2379270740u, 0, 23, &be_const_str_value); +be_define_const_str(get_current_module_path, "get_current_module_path", 3206673408u, 0, 23, &be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_instance_X20required); +be_define_const_str(get_height, "get_height", 3571755523u, 0, 10, NULL); be_define_const_str(get_input_power_status, "get_input_power_status", 4102829177u, 0, 22, NULL); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_run_deferred); -be_define_const_str(get_log, "get_log", 3524441898u, 0, 7, &be_const_str_value); -be_define_const_str(get_object_from_ptr, "get_object_from_ptr", 2345019201u, 0, 19, &be_const_str_get_warning_level); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); -be_define_const_str(get_percentage, "get_percentage", 2880483992u, 0, 14, &be_const_str_get_style_line_color); -be_define_const_str(get_pixel_color, "get_pixel_color", 337490048u, 0, 15, &be_const_str_refr_size); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_point_arr); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); +be_define_const_str(get_log, "get_log", 3524441898u, 0, 7, &be_const_str_load_freetype_font); +be_define_const_str(get_object_from_ptr, "get_object_from_ptr", 2345019201u, 0, 19, NULL); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_set_time); +be_define_const_str(get_percentage, "get_percentage", 2880483992u, 0, 14, &be_const_str_get_pixel_color); +be_define_const_str(get_pixel_color, "get_pixel_color", 337490048u, 0, 15, NULL); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_lv_obj); be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, NULL); -be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, &be_const_str_set_style_bg_color); -be_define_const_str(get_style_bg_color, "get_style_bg_color", 964794381u, 0, 18, &be_const_str_read_sensors); -be_define_const_str(get_style_line_color, "get_style_line_color", 805371932u, 0, 20, NULL); -be_define_const_str(get_style_pad_right, "get_style_pad_right", 3150287466u, 0, 19, &be_const_str_webclient); -be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, NULL); -be_define_const_str(get_temp, "get_temp", 3370919486u, 0, 8, NULL); -be_define_const_str(get_vbus_current, "get_vbus_current", 1205347942u, 0, 16, NULL); -be_define_const_str(get_vbus_voltage, "get_vbus_voltage", 2398210401u, 0, 16, &be_const_str_redirect); -be_define_const_str(get_warning_level, "get_warning_level", 1737834441u, 0, 17, &be_const_str_log); -be_define_const_str(get_width, "get_width", 3293417300u, 0, 9, &be_const_str_set_width); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_set_bri); +be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, &be_const_str_ins_goto); +be_define_const_str(get_style_bg_color, "get_style_bg_color", 964794381u, 0, 18, &be_const_str_read13); +be_define_const_str(get_style_line_color, "get_style_line_color", 805371932u, 0, 20, &be_const_str_pin_mode); +be_define_const_str(get_style_pad_right, "get_style_pad_right", 3150287466u, 0, 19, &be_const_str_members); +be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, &be_const_str_is_dirty); +be_define_const_str(get_temp, "get_temp", 3370919486u, 0, 8, &be_const_str_listdir); +be_define_const_str(get_vbus_current, "get_vbus_current", 1205347942u, 0, 16, &be_const_str_gpio); +be_define_const_str(get_vbus_voltage, "get_vbus_voltage", 2398210401u, 0, 16, NULL); +be_define_const_str(get_warning_level, "get_warning_level", 1737834441u, 0, 17, &be_const_str_push_path); +be_define_const_str(get_width, "get_width", 3293417300u, 0, 9, &be_const_str_init_draw_line_dsc); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_hour); be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); -be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_set_style_pad_right); -be_define_const_str(gpio, "gpio", 2638155258u, 0, 4, &be_const_str_line_dsc); -be_define_const_str(group_def, "group_def", 1524213328u, 0, 9, &be_const_str_remove_driver); -be_define_const_str(groups, "groups", 2943077229u, 0, 6, &be_const_str_remove); -be_define_const_str(h, "h", 3977000791u, 0, 1, &be_const_str_list_handlers); -be_define_const_str(has, "has", 3988721635u, 0, 3, NULL); -be_define_const_str(has_X20already_X20an_X20event_X20callback, "has already an event callback", 2421565249u, 0, 29, NULL); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_rad); +be_define_const_str(global, "global", 503252654u, 0, 6, NULL); +be_define_const_str(gpio, "gpio", 2638155258u, 0, 4, &be_const_str_lv_point); +be_define_const_str(group_def, "group_def", 1524213328u, 0, 9, &be_const_str_manuf); +be_define_const_str(groups, "groups", 2943077229u, 0, 6, &be_const_str_tolower); +be_define_const_str(h, "h", 3977000791u, 0, 1, &be_const_str__X7B_X7D); +be_define_const_str(has, "has", 3988721635u, 0, 3, &be_const_str_keys); +be_define_const_str(has_X20already_X20an_X20event_X20callback, "has already an event callback", 2421565249u, 0, 29, &be_const_str_point); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_id); be_define_const_str(height_def, "height_def", 2348238838u, 0, 10, NULL); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_nan); -be_define_const_str(hour, "hour", 3053661199u, 0, 4, &be_const_str_widget_ctor_impl); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); +be_define_const_str(hour, "hour", 3053661199u, 0, 4, NULL); be_define_const_str(hs2rgb, "hs2rgb", 1040816349u, 0, 6, NULL); -be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", 2743526309u, 0, 70, &be_const_str_lv_wifi_arcs_icon); -be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", 3657552045u, 0, 72, NULL); -be_define_const_str(hue, "hue", 3817694041u, 0, 3, &be_const_str_reverse); -be_define_const_str(hue_ntv, "hue_ntv", 705068642u, 0, 7, &be_const_str_set_matrix_pixel_color); -be_define_const_str(hue_status, "hue_status", 437978812u, 0, 10, &be_const_str_tasmota); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); -be_define_const_str(id, "id", 926444256u, 0, 2, NULL); +be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", 2743526309u, 0, 70, NULL); +be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", 3657552045u, 0, 72, &be_const_str_tele); +be_define_const_str(hue, "hue", 3817694041u, 0, 3, &be_const_str_serial); +be_define_const_str(hue_ntv, "hue_ntv", 705068642u, 0, 7, &be_const_str_json_append); +be_define_const_str(hue_status, "hue_status", 437978812u, 0, 10, &be_const_str_wd); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_class); +be_define_const_str(id, "id", 926444256u, 0, 2, &be_const_str_running); be_define_const_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27, "id must be of type 'int'", 2097653458u, 0, 24, &be_const_str_instance); be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_is_dirty); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, NULL); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_to_gamma); be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_resp_cmnd_done); +be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_valuer_error); be_define_const_str(init_draw_arc_dsc, "init_draw_arc_dsc", 1655274348u, 0, 17, NULL); -be_define_const_str(init_draw_line_dsc, "init_draw_line_dsc", 2507936040u, 0, 18, &be_const_str_pop); -be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_issubclass); -be_define_const_str(ins_goto, "ins_goto", 1342843963u, 0, 8, NULL); -be_define_const_str(ins_ramp, "ins_ramp", 1068049360u, 0, 8, &be_const_str_ismethod); -be_define_const_str(ins_time, "ins_time", 2980245553u, 0, 8, NULL); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_pc); -be_define_const_str(instance, "instance", 193386898u, 0, 8, NULL); -be_define_const_str(instance_X20required, "instance required", 381192159u, 0, 17, &be_const_str_set_height); -be_define_const_str(instance_size, "instance_size", 4280269518u, 0, 13, &be_const_str_sec); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_name); -be_define_const_str(internal_error, "internal_error", 2519158169u, 0, 14, NULL); -be_define_const_str(introspect, "introspect", 164638290u, 0, 10, &be_const_str_read12); -be_define_const_str(invalidate, "invalidate", 2649734928u, 0, 10, &be_const_str_touch_update); +be_define_const_str(init_draw_line_dsc, "init_draw_line_dsc", 2507936040u, 0, 18, NULL); +be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); +be_define_const_str(ins_goto, "ins_goto", 1342843963u, 0, 8, &be_const_str_set_reachable); +be_define_const_str(ins_ramp, "ins_ramp", 1068049360u, 0, 8, &be_const_str_lv_); +be_define_const_str(ins_time, "ins_time", 2980245553u, 0, 8, &be_const_str_read_sensors); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_remove_light); +be_define_const_str(instance, "instance", 193386898u, 0, 8, &be_const_str_preinit); +be_define_const_str(instance_X20required, "instance required", 381192159u, 0, 17, &be_const_str_widget_instance_size); +be_define_const_str(instance_size, "instance_size", 4280269518u, 0, 13, NULL); +be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_top); +be_define_const_str(internal_error, "internal_error", 2519158169u, 0, 14, &be_const_str_read8); +be_define_const_str(introspect, "introspect", 164638290u, 0, 10, &be_const_str_show); +be_define_const_str(invalidate, "invalidate", 2649734928u, 0, 10, NULL); be_define_const_str(io_error, "io_error", 1970281036u, 0, 8, NULL); -be_define_const_str(ip, "ip", 1261996636u, 0, 2, NULL); -be_define_const_str(is_dirty, "is_dirty", 418034110u, 0, 8, NULL); -be_define_const_str(is_first_time, "is_first_time", 275242384u, 0, 13, NULL); -be_define_const_str(is_running, "is_running", 2226847261u, 0, 10, &be_const_str__X7B_X7D); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_set_rate); -be_define_const_str(ismethod, "ismethod", 3513438880u, 0, 8, &be_const_str_wire_scan); -be_define_const_str(isnan, "isnan", 2981347434u, 0, 5, &be_const_str_lv_obj_class); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_lv_signal_arcs); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_loop); -be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, NULL); -be_define_const_str(json, "json", 916562499u, 0, 4, NULL); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); -be_define_const_str(json_fdump, "json_fdump", 1694216580u, 0, 10, &be_const_str_pin); -be_define_const_str(json_fdump_any, "json_fdump_any", 3348629385u, 0, 14, &be_const_str_pixel_size); -be_define_const_str(json_fdump_list, "json_fdump_list", 3903879853u, 0, 15, &be_const_str_read13); -be_define_const_str(json_fdump_map, "json_fdump_map", 4091954653u, 0, 14, NULL); -be_define_const_str(k, "k", 3993778410u, 0, 1, &be_const_str_resp_cmnd_str); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_stop_iteration); -be_define_const_str(kv, "kv", 1497177492u, 0, 2, &be_const_str_write_bytes); -be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, &be_const_str_set_time); -be_define_const_str(leds, "leds", 558858555u, 0, 4, &be_const_str_lv); +be_define_const_str(ip, "ip", 1261996636u, 0, 2, &be_const_str_y); +be_define_const_str(is_dirty, "is_dirty", 418034110u, 0, 8, &be_const_str_nan); +be_define_const_str(is_first_time, "is_first_time", 275242384u, 0, 13, &be_const_str_target); +be_define_const_str(is_running, "is_running", 2226847261u, 0, 10, NULL); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_pop); +be_define_const_str(ismethod, "ismethod", 3513438880u, 0, 8, NULL); +be_define_const_str(isnan, "isnan", 2981347434u, 0, 5, NULL); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_offset); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); +be_define_const_str(item, "item", 2671260646u, 0, 4, &be_const_str_publish_result); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_offseta); +be_define_const_str(json, "json", 916562499u, 0, 4, &be_const_str_persist); +be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, &be_const_str_settings); +be_define_const_str(json_fdump, "json_fdump", 1694216580u, 0, 10, NULL); +be_define_const_str(json_fdump_any, "json_fdump_any", 3348629385u, 0, 14, &be_const_str_srand); +be_define_const_str(json_fdump_list, "json_fdump_list", 3903879853u, 0, 15, &be_const_str_target_search); +be_define_const_str(json_fdump_map, "json_fdump_map", 4091954653u, 0, 14, &be_const_str_map); +be_define_const_str(k, "k", 3993778410u, 0, 1, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_setmember); +be_define_const_str(kv, "kv", 1497177492u, 0, 2, &be_const_str_missing_X20name); +be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, &be_const_str_sin); +be_define_const_str(leds, "leds", 558858555u, 0, 4, &be_const_str_wifi_bars_icon); be_define_const_str(length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, "length in bits must be between 0 and 32", 2584509128u, 0, 39, NULL); -be_define_const_str(light, "light", 3801947695u, 0, 5, NULL); -be_define_const_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, "light must be of class 'light_state'", 3669350396u, 0, 36, NULL); -be_define_const_str(light_state, "light_state", 905783845u, 0, 11, NULL); -be_define_const_str(lights, "lights", 425118420u, 0, 6, &be_const_str_success); -be_define_const_str(line_dsc, "line_dsc", 4094490978u, 0, 8, &be_const_str_web_add_button); -be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_url_encode); -be_define_const_str(list_handlers, "list_handlers", 593774371u, 0, 13, NULL); -be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, &be_const_str_manuf); -be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_resize); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_set_pwm); -be_define_const_str(load_templates, "load_templates", 3513870133u, 0, 14, &be_const_str_select); -be_define_const_str(local, "local", 2621662984u, 0, 5, &be_const_str_set_useragent); -be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_map); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_running); +be_define_const_str(light, "light", 3801947695u, 0, 5, &be_const_str_widget_event_impl); +be_define_const_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, "light must be of class 'light_state'", 3669350396u, 0, 36, &be_const_str_set_dcdc_enable); +be_define_const_str(light_state, "light_state", 905783845u, 0, 11, &be_const_str_lv_wifi_arcs_icon); +be_define_const_str(light_to_id, "light_to_id", 1117015647u, 0, 11, NULL); +be_define_const_str(lights, "lights", 425118420u, 0, 6, NULL); +be_define_const_str(line_dsc, "line_dsc", 4094490978u, 0, 8, NULL); +be_define_const_str(list, "list", 217798785u, 0, 4, NULL); +be_define_const_str(list_handlers, "list_handlers", 593774371u, 0, 13, &be_const_str_resp_cmnd_done); +be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, &be_const_str_state); +be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_setbits); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_print); +be_define_const_str(load_templates, "load_templates", 3513870133u, 0, 14, NULL); +be_define_const_str(local, "local", 2621662984u, 0, 5, &be_const_str_lv_point_arr); +be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_lower); be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); -be_define_const_str(lv, "lv", 1529997255u, 0, 2, &be_const_str_set_mode_rgb); -be_define_const_str(lv_, "lv_", 663721032u, 0, 3, &be_const_str_save); -be_define_const_str(lv_clock_icon, "lv_clock_icon", 3257216210u, 0, 13, NULL); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_publish); +be_define_const_str(lv, "lv", 1529997255u, 0, 2, &be_const_str_set_text); +be_define_const_str(lv_, "lv_", 663721032u, 0, 3, NULL); +be_define_const_str(lv_clock_icon, "lv_clock_icon", 3257216210u, 0, 13, &be_const_str_on); be_define_const_str(lv_coord_arr, "lv_coord_arr", 1197238601u, 0, 12, NULL); -be_define_const_str(lv_event, "lv_event", 2434089968u, 0, 8, NULL); +be_define_const_str(lv_event, "lv_event", 2434089968u, 0, 8, &be_const_str_web_sensor); be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); -be_define_const_str(lv_extra, "lv_extra", 399561998u, 0, 8, &be_const_str_lv_point_arr); -be_define_const_str(lv_module_init, "lv_module_init", 1133027755u, 0, 14, &be_const_str_remove_timer); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_as); -be_define_const_str(lv_obj_class, "lv_obj_class", 4039656294u, 0, 12, NULL); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_rand); -be_define_const_str(lv_point_arr, "lv_point_arr", 3959768858u, 0, 12, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); -be_define_const_str(lv_signal_arcs, "lv_signal_arcs", 2839156988u, 0, 14, &be_const_str_remove_rule); -be_define_const_str(lv_signal_bars, "lv_signal_bars", 3513972559u, 0, 14, &be_const_str_class); -be_define_const_str(lv_solidified, "lv_solidified", 2274121310u, 0, 13, &be_const_str_pin_mode); -be_define_const_str(lv_wifi_arcs, "lv_wifi_arcs", 2082091963u, 0, 12, &be_const_str_tr); -be_define_const_str(lv_wifi_arcs_icon, "lv_wifi_arcs_icon", 1507982909u, 0, 17, &be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function); +be_define_const_str(lv_extra, "lv_extra", 399561998u, 0, 8, &be_const_str_wire); +be_define_const_str(lv_module_init, "lv_module_init", 1133027755u, 0, 14, NULL); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_set_timer); +be_define_const_str(lv_obj_class, "lv_obj_class", 4039656294u, 0, 12, &be_const_str_set_timeouts); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); +be_define_const_str(lv_point_arr, "lv_point_arr", 3959768858u, 0, 12, &be_const_str_set_first_time); +be_define_const_str(lv_signal_arcs, "lv_signal_arcs", 2839156988u, 0, 14, &be_const_str_p1); +be_define_const_str(lv_signal_bars, "lv_signal_bars", 3513972559u, 0, 14, NULL); +be_define_const_str(lv_solidified, "lv_solidified", 2274121310u, 0, 13, &be_const_str_set_rate); +be_define_const_str(lv_wifi_arcs, "lv_wifi_arcs", 2082091963u, 0, 12, &be_const_str_sinh); +be_define_const_str(lv_wifi_arcs_icon, "lv_wifi_arcs_icon", 1507982909u, 0, 17, NULL); be_define_const_str(lv_wifi_bars, "lv_wifi_bars", 2109539196u, 0, 12, NULL); -be_define_const_str(lv_wifi_bars_icon, "lv_wifi_bars_icon", 2805815540u, 0, 17, &be_const_str_null_cb); +be_define_const_str(lv_wifi_bars_icon, "lv_wifi_bars_icon", 2805815540u, 0, 17, &be_const_str_number); be_define_const_str(lvgl_event_dispatch, "lvgl_event_dispatch", 2104396622u, 0, 19, NULL); -be_define_const_str(make_cb, "make_cb", 71252785u, 0, 7, NULL); -be_define_const_str(manuf, "manuf", 4120929560u, 0, 5, NULL); +be_define_const_str(make_cb, "make_cb", 71252785u, 0, 7, &be_const_str_tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29); +be_define_const_str(manuf, "manuf", 4120929560u, 0, 5, &be_const_str_rad); be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); -be_define_const_str(math, "math", 4001929615u, 0, 4, &be_const_str_set_mode_ct); -be_define_const_str(matrix, "matrix", 365099244u, 0, 6, &be_const_str_members); +be_define_const_str(math, "math", 4001929615u, 0, 4, NULL); +be_define_const_str(matrix, "matrix", 365099244u, 0, 6, NULL); be_define_const_str(member, "member", 719708611u, 0, 6, NULL); -be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_size); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_widget_dtor_impl); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); -be_define_const_str(min, "min", 3381609815u, 0, 3, NULL); -be_define_const_str(minute, "minute", 954666857u, 0, 6, &be_const_str_month); -be_define_const_str(missing_X20name, "missing name", 3635024006u, 0, 12, &be_const_str_w); -be_define_const_str(model, "model", 2961925722u, 0, 5, &be_const_str_reverse_gamma10); +be_define_const_str(members, "members", 937576464u, 0, 7, NULL); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_public_key); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_pow); +be_define_const_str(min, "min", 3381609815u, 0, 3, &be_const_str_r); +be_define_const_str(minute, "minute", 954666857u, 0, 6, NULL); +be_define_const_str(missing_X20name, "missing name", 3635024006u, 0, 12, NULL); +be_define_const_str(model, "model", 2961925722u, 0, 5, NULL); be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); -be_define_const_str(month, "month", 3598321157u, 0, 5, NULL); +be_define_const_str(month, "month", 3598321157u, 0, 5, &be_const_str_static); be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); -be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_set_alternate); -be_define_const_str(nan, "nan", 797905850u, 0, 3, &be_const_str_quality); +be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_rounded); +be_define_const_str(nan, "nan", 797905850u, 0, 3, &be_const_str_set_useragent); be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(no_X20GPIO_X20specified_X20for_X20neopixelbus, "no GPIO specified for neopixelbus", 42078528u, 0, 33, &be_const_str_false); +be_define_const_str(no_X20GPIO_X20specified_X20for_X20neopixelbus, "no GPIO specified for neopixelbus", 42078528u, 0, 33, &be_const_str_run_deferred); be_define_const_str(null_cb, "null_cb", 2333536460u, 0, 7, NULL); -be_define_const_str(number, "number", 467038368u, 0, 6, NULL); -be_define_const_str(obj_class_create_obj, "obj_class_create_obj", 3304390632u, 0, 20, &be_const_str_pin_used); -be_define_const_str(obj_event_base, "obj_event_base", 1624064363u, 0, 14, NULL); -be_define_const_str(offset, "offset", 348705738u, 0, 6, NULL); -be_define_const_str(offseta, "offseta", 1663383089u, 0, 7, NULL); -be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); +be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_pop_path); +be_define_const_str(obj_class_create_obj, "obj_class_create_obj", 3304390632u, 0, 20, &be_const_str_shared_key); +be_define_const_str(obj_event_base, "obj_event_base", 1624064363u, 0, 14, &be_const_str_read); +be_define_const_str(offset, "offset", 348705738u, 0, 6, &be_const_str_rand); +be_define_const_str(offseta, "offseta", 1663383089u, 0, 7, &be_const_str_url_encode); +be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_set_chg_current); be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will cause a restart.\");'>", 232646018u, 0, 57, NULL); -be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will change the current configuration and cause a restart.\");'>", 3792412559u, 0, 94, &be_const_str_wire1); +be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will change the current configuration and cause a restart.\");'>", 3792412559u, 0, 94, NULL); be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(out_X20of_X20range, "out of range", 2236631477u, 0, 12, &be_const_str_stop); -be_define_const_str(p1, "p1", 2689521274u, 0, 2, &be_const_str_if); -be_define_const_str(p2, "p2", 2672743655u, 0, 2, &be_const_str_width); -be_define_const_str(page_autoconf_ctl, "page_autoconf_ctl", 2453381496u, 0, 17, &be_const_str_write_bit); -be_define_const_str(page_autoconf_mgr, "page_autoconf_mgr", 3643937031u, 0, 17, &be_const_str_split); -be_define_const_str(param, "param", 1309554226u, 0, 5, NULL); -be_define_const_str(path, "path", 2223459638u, 0, 4, &be_const_str_pop_path); -be_define_const_str(pc, "pc", 1313756516u, 0, 2, &be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); -be_define_const_str(pc_abs, "pc_abs", 920256495u, 0, 6, &be_const_str_x); -be_define_const_str(pc_rel, "pc_rel", 991921176u, 0, 6, &be_const_str_print); -be_define_const_str(percentage, "percentage", 2538831285u, 0, 10, &be_const_str_resolvecmnd); +be_define_const_str(out_X20of_X20range, "out of range", 2236631477u, 0, 12, NULL); +be_define_const_str(p1, "p1", 2689521274u, 0, 2, NULL); +be_define_const_str(p2, "p2", 2672743655u, 0, 2, &be_const_str_traceback); +be_define_const_str(page_autoconf_ctl, "page_autoconf_ctl", 2453381496u, 0, 17, &be_const_str_readbytes); +be_define_const_str(page_autoconf_mgr, "page_autoconf_mgr", 3643937031u, 0, 17, &be_const_str_stop_iteration); +be_define_const_str(param, "param", 1309554226u, 0, 5, &be_const_str_send_multicast); +be_define_const_str(path, "path", 2223459638u, 0, 4, &be_const_str_set_huesat); +be_define_const_str(pc, "pc", 1313756516u, 0, 2, NULL); +be_define_const_str(pc_abs, "pc_abs", 920256495u, 0, 6, &be_const_str_time_dump); +be_define_const_str(pc_rel, "pc_rel", 991921176u, 0, 6, NULL); +be_define_const_str(percentage, "percentage", 2538831285u, 0, 10, &be_const_str_real); be_define_const_str(persist, "persist", 3917083779u, 0, 7, NULL); be_define_const_str(persist_X2E_p_X20is_X20not_X20a_X20map, "persist._p is not a map", 1176528732u, 0, 23, NULL); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, &be_const_str_run); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, NULL); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_def); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, &be_const_str_widget_constructor); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_web_add_console_button); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, &be_const_str_time_str); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_tomap); be_define_const_str(pixel_count, "pixel_count", 2439130743u, 0, 11, NULL); -be_define_const_str(pixel_size, "pixel_size", 2209135785u, 0, 10, &be_const_str_web_add_config_button); -be_define_const_str(pixels_buffer, "pixels_buffer", 1229555807u, 0, 13, &be_const_str_sinh); -be_define_const_str(point, "point", 414084241u, 0, 5, NULL); -be_define_const_str(point_arr, "point_arr", 1140859857u, 0, 9, NULL); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_preinit); -be_define_const_str(pop_path, "pop_path", 2403243998u, 0, 8, &be_const_str_rounded); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); -be_define_const_str(preinit, "preinit", 2722007100u, 0, 7, &be_const_str_widget_ctor_cb); -be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_scan); +be_define_const_str(pixel_size, "pixel_size", 2209135785u, 0, 10, NULL); +be_define_const_str(pixels_buffer, "pixels_buffer", 1229555807u, 0, 13, NULL); +be_define_const_str(point, "point", 414084241u, 0, 5, &be_const_str_set_ldo_enable); +be_define_const_str(point_arr, "point_arr", 1140859857u, 0, 9, &be_const_str_subscribe); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); +be_define_const_str(pop_path, "pop_path", 2403243998u, 0, 8, NULL); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, &be_const_str_set_hue16sat); +be_define_const_str(preinit, "preinit", 2722007100u, 0, 7, &be_const_str__X7D); +be_define_const_str(print, "print", 372738696u, 0, 5, NULL); be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, NULL); -be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); +be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_w); be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, NULL); -be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); +be_define_const_str(push, "push", 2272264157u, 0, 4, &be_const_str_round_end); be_define_const_str(push_path, "push_path", 1155254157u, 0, 9, NULL); -be_define_const_str(quality, "quality", 2597670950u, 0, 7, NULL); -be_define_const_str(r, "r", 4144776981u, 0, 1, &be_const_str_return_X20code_X3D_X25i); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); +be_define_const_str(quality, "quality", 2597670950u, 0, 7, &be_const_str_skip); +be_define_const_str(r, "r", 4144776981u, 0, 1, NULL); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_tanh); be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_send_multicast); -be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); -be_define_const_str(read, "read", 3470762949u, 0, 4, &be_const_str_seg7_font); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); +be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_set_pwm); +be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); -be_define_const_str(read13, "read13", 12887293u, 0, 6, &be_const_str_search); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, &be_const_str_set_y); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_remote_port); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, &be_const_str_set_power); -be_define_const_str(read_sensors, "read_sensors", 892689201u, 0, 12, &be_const_str_set_ldo_enable); -be_define_const_str(readbytes, "readbytes", 2716426756u, 0, 9, &be_const_str_show); -be_define_const_str(readline, "readline", 1212709927u, 0, 8, NULL); -be_define_const_str(real, "real", 3604983901u, 0, 4, &be_const_str_unknown_X20instruction); -be_define_const_str(reapply, "reapply", 3778939332u, 0, 7, &be_const_str_tanh); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); -be_define_const_str(refr_size, "refr_size", 1958144468u, 0, 9, NULL); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, &be_const_str_register_obj); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_register_button_encoder); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, &be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); +be_define_const_str(read_sensors, "read_sensors", 892689201u, 0, 12, NULL); +be_define_const_str(readbytes, "readbytes", 2716426756u, 0, 9, &be_const_str_widget_struct_by_class); +be_define_const_str(readline, "readline", 1212709927u, 0, 8, &be_const_str_set_bri); +be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); +be_define_const_str(reapply, "reapply", 3778939332u, 0, 7, &be_const_str_write_bit); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_set_y); +be_define_const_str(refr_size, "refr_size", 1958144468u, 0, 9, &be_const_str_widget_event_cb); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, &be_const_str_widget_event); be_define_const_str(register_obj, "register_obj", 3982614770u, 0, 12, NULL); -be_define_const_str(remote_ip, "remote_ip", 2953154693u, 0, 9, &be_const_str_srand); +be_define_const_str(remote_ip, "remote_ip", 2953154693u, 0, 9, NULL); be_define_const_str(remote_port, "remote_port", 2163585967u, 0, 11, NULL); be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_while); -be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, &be_const_str_string); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_wifi); +be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, NULL); be_define_const_str(remove_light, "remove_light", 1783624394u, 0, 12, NULL); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); -be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, NULL); -be_define_const_str(reset, "reset", 1695364032u, 0, 5, &be_const_str_except); -be_define_const_str(reset_search, "reset_search", 1350414305u, 0, 12, NULL); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, &be_const_str_def); +be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, &be_const_str_signal_arcs); +be_define_const_str(reset, "reset", 1695364032u, 0, 5, NULL); +be_define_const_str(reset_search, "reset_search", 1350414305u, 0, 12, &be_const_str_set_rgb); be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); -be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_set_chg_current); +be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, &be_const_str_set_ct); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_for); be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_rotate); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, &be_const_str_state); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_strftime); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(return_X20code_X3D_X25i, "return code=%i", 2127454401u, 0, 14, &be_const_str_true); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, &be_const_str_strptime); +be_define_const_str(return_X20code_X3D_X25i, "return code=%i", 2127454401u, 0, 14, NULL); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); -be_define_const_str(rotate, "rotate", 2784296202u, 0, 6, NULL); -be_define_const_str(round_end, "round_end", 985288225u, 0, 9, NULL); -be_define_const_str(round_start, "round_start", 2949484384u, 0, 11, NULL); +be_define_const_str(rotate, "rotate", 2784296202u, 0, 6, &be_const_str_web_add_management_button); +be_define_const_str(round_end, "round_end", 985288225u, 0, 9, &be_const_str_value_error); +be_define_const_str(round_start, "round_start", 2949484384u, 0, 11, &be_const_str_xy); be_define_const_str(rounded, "rounded", 1920734138u, 0, 7, NULL); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_set_pixel_color); -be_define_const_str(rule, "rule", 4230889683u, 0, 4, NULL); -be_define_const_str(run, "run", 718098122u, 0, 3, NULL); -be_define_const_str(run_bat, "run_bat", 2536903298u, 0, 7, NULL); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_yield); +be_define_const_str(rule, "rule", 4230889683u, 0, 4, &be_const_str_tag); +be_define_const_str(run, "run", 718098122u, 0, 3, &be_const_str_if); +be_define_const_str(run_bat, "run_bat", 2536903298u, 0, 7, &be_const_str_toptr); be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); -be_define_const_str(running, "running", 343848780u, 0, 7, NULL); -be_define_const_str(sat, "sat", 3592196823u, 0, 3, NULL); -be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_set_x); -be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, &be_const_str_webserver); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, &be_const_str_sys); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_set_dc_voltage); -be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, &be_const_str_widget_event_impl); +be_define_const_str(running, "running", 343848780u, 0, 7, &be_const_str_set_pixel_color); +be_define_const_str(sat, "sat", 3592196823u, 0, 3, &be_const_str_x); +be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_scan); +be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, &be_const_str_web_add_handler); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); +be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); be_define_const_str(search, "search", 2150836393u, 0, 6, NULL); be_define_const_str(sec, "sec", 3139892658u, 0, 3, NULL); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, &be_const_str_sqrt); be_define_const_str(select, "select", 297952813u, 0, 6, NULL); be_define_const_str(send, "send", 1919010991u, 0, 4, NULL); -be_define_const_str(send_multicast, "send_multicast", 812185870u, 0, 14, &be_const_str_uuid4); -be_define_const_str(serial, "serial", 3687697785u, 0, 6, NULL); -be_define_const_str(set, "set", 3324446467u, 0, 3, &be_const_str_solidified); -be_define_const_str(set_alternate, "set_alternate", 1709680562u, 0, 13, NULL); +be_define_const_str(send_multicast, "send_multicast", 812185870u, 0, 14, &be_const_str_set_matrix_pixel_color); +be_define_const_str(serial, "serial", 3687697785u, 0, 6, &be_const_str_type); +be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); +be_define_const_str(set_alternate, "set_alternate", 1709680562u, 0, 13, &be_const_str_unsubscribe); be_define_const_str(set_auth, "set_auth", 1057170930u, 0, 8, NULL); -be_define_const_str(set_bits_per_sample, "set_bits_per_sample", 3747657551u, 0, 19, NULL); +be_define_const_str(set_bits_per_sample, "set_bits_per_sample", 3747657551u, 0, 19, &be_const_str_tr); be_define_const_str(set_bri, "set_bri", 2789118779u, 0, 7, NULL); -be_define_const_str(set_channels, "set_channels", 1370190620u, 0, 12, NULL); +be_define_const_str(set_channels, "set_channels", 1370190620u, 0, 12, &be_const_str_set_style_pad_right); be_define_const_str(set_chg_current, "set_chg_current", 336304386u, 0, 15, NULL); be_define_const_str(set_ct, "set_ct", 972363187u, 0, 6, NULL); -be_define_const_str(set_dc_voltage, "set_dc_voltage", 2181981936u, 0, 14, &be_const_str_toupper); -be_define_const_str(set_dcdc_enable, "set_dcdc_enable", 1594690786u, 0, 15, &be_const_str_widget_editable); +be_define_const_str(set_dc_voltage, "set_dc_voltage", 2181981936u, 0, 14, &be_const_str_web_send); +be_define_const_str(set_dcdc_enable, "set_dcdc_enable", 1594690786u, 0, 15, NULL); be_define_const_str(set_exten, "set_exten", 1721782768u, 0, 9, NULL); be_define_const_str(set_first_time, "set_first_time", 3111247550u, 0, 14, NULL); -be_define_const_str(set_gain, "set_gain", 3847781975u, 0, 8, &be_const_str_widget_cb); +be_define_const_str(set_gain, "set_gain", 3847781975u, 0, 8, NULL); be_define_const_str(set_height, "set_height", 1080207399u, 0, 10, NULL); be_define_const_str(set_hue16sat, "set_hue16sat", 1858983599u, 0, 12, NULL); -be_define_const_str(set_huesat, "set_huesat", 626496854u, 0, 10, &be_const_str_widget_constructor); +be_define_const_str(set_huesat, "set_huesat", 626496854u, 0, 10, &be_const_str_uuid4); be_define_const_str(set_ldo_enable, "set_ldo_enable", 2916502041u, 0, 14, NULL); -be_define_const_str(set_ldo_voltage, "set_ldo_voltage", 4090501160u, 0, 15, &be_const_str_continue); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, &be_const_str_time_str); -be_define_const_str(set_matrix_pixel_color, "set_matrix_pixel_color", 1197149462u, 0, 22, &be_const_str_widget_struct_by_class); -be_define_const_str(set_mode_ct, "set_mode_ct", 665073295u, 0, 11, &be_const_str_zero); +be_define_const_str(set_ldo_voltage, "set_ldo_voltage", 4090501160u, 0, 15, NULL); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, &be_const_str_sys); +be_define_const_str(set_matrix_pixel_color, "set_matrix_pixel_color", 1197149462u, 0, 22, NULL); +be_define_const_str(set_mode_ct, "set_mode_ct", 665073295u, 0, 11, NULL); be_define_const_str(set_mode_rgb, "set_mode_rgb", 852310875u, 0, 12, NULL); -be_define_const_str(set_percentage, "set_percentage", 2952022724u, 0, 14, &be_const_str_udp); +be_define_const_str(set_percentage, "set_percentage", 2952022724u, 0, 14, NULL); be_define_const_str(set_pixel_color, "set_pixel_color", 1275248356u, 0, 15, NULL); be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); be_define_const_str(set_pwm, "set_pwm", 3781811012u, 0, 7, NULL); -be_define_const_str(set_rate, "set_rate", 1154016838u, 0, 8, NULL); -be_define_const_str(set_reachable, "set_reachable", 3280367499u, 0, 13, &be_const_str_width_def); +be_define_const_str(set_rate, "set_rate", 1154016838u, 0, 8, &be_const_str_string); +be_define_const_str(set_reachable, "set_reachable", 3280367499u, 0, 13, NULL); be_define_const_str(set_rgb, "set_rgb", 3380244855u, 0, 7, NULL); be_define_const_str(set_style_bg_color, "set_style_bg_color", 1689513089u, 0, 18, NULL); -be_define_const_str(set_style_line_color, "set_style_line_color", 3665238976u, 0, 20, &be_const_str_settings); -be_define_const_str(set_style_pad_right, "set_style_pad_right", 3314069054u, 0, 19, &be_const_str__X7B); -be_define_const_str(set_style_text_font, "set_style_text_font", 1028590019u, 0, 19, &be_const_str_tag); -be_define_const_str(set_text, "set_text", 1849641155u, 0, 8, &be_const_str_set_xy); +be_define_const_str(set_style_line_color, "set_style_line_color", 3665238976u, 0, 20, NULL); +be_define_const_str(set_style_pad_right, "set_style_pad_right", 3314069054u, 0, 19, NULL); +be_define_const_str(set_style_text_font, "set_style_text_font", 1028590019u, 0, 19, NULL); +be_define_const_str(set_text, "set_text", 1849641155u, 0, 8, NULL); be_define_const_str(set_time, "set_time", 900236405u, 0, 8, NULL); -be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, &be_const_str_signal_bars); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); -be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, &be_const_str_wire); -be_define_const_str(set_width, "set_width", 484671920u, 0, 9, &be_const_str_tob64); +be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, &be_const_str_toupper); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_widget_cb); +be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, NULL); +be_define_const_str(set_width, "set_width", 484671920u, 0, 9, NULL); be_define_const_str(set_x, "set_x", 1849400772u, 0, 5, NULL); be_define_const_str(set_xy, "set_xy", 1155092615u, 0, 6, NULL); -be_define_const_str(set_y, "set_y", 1866178391u, 0, 5, &be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29); +be_define_const_str(set_y, "set_y", 1866178391u, 0, 5, NULL); be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_zip); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, &be_const_str_sin); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, &be_const_str_widget_width_def); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_do); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, &be_const_str_tcpclient); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, &be_const_str_super); be_define_const_str(settings, "settings", 1745255176u, 0, 8, NULL); -be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, &be_const_str_type_error); -be_define_const_str(show, "show", 2840060476u, 0, 4, &be_const_str_super); -be_define_const_str(signal_arcs, "signal_arcs", 1505996127u, 0, 11, &be_const_str_y1); +be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, &be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); +be_define_const_str(show, "show", 2840060476u, 0, 4, NULL); +be_define_const_str(signal_arcs, "signal_arcs", 1505996127u, 0, 11, NULL); be_define_const_str(signal_bars, "signal_bars", 3181573600u, 0, 11, NULL); be_define_const_str(signal_change, "signal_change", 3262299350u, 0, 13, NULL); be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); -be_define_const_str(size, "size", 597743964u, 0, 4, &be_const_str_wifi); +be_define_const_str(size, "size", 597743964u, 0, 4, &be_const_str_widget_dtor_impl); be_define_const_str(skip, "skip", 1097563074u, 0, 4, NULL); be_define_const_str(solidified, "solidified", 3257553487u, 0, 10, NULL); be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); -be_define_const_str(srand, "srand", 465518633u, 0, 5, &be_const_str_widget_struct_default); +be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); @@ -749,50 +750,53 @@ be_define_const_str(stop_iteration, "stop_iteration", 4173793901u, 0, 14, NULL); be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); be_define_const_str(strftime, "strftime", 187738851u, 0, 8, NULL); be_define_const_str(string, "string", 398550328u, 0, 6, NULL); -be_define_const_str(strip, "strip", 4246411473u, 0, 5, &be_const_str_type); -be_define_const_str(strptime, "strptime", 1277910361u, 0, 8, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); -be_define_const_str(success, "success", 979353360u, 0, 7, &be_const_str_nil); -be_define_const_str(super, "super", 4152230356u, 0, 5, &be_const_str_year); +be_define_const_str(strip, "strip", 4246411473u, 0, 5, NULL); +be_define_const_str(strptime, "strptime", 1277910361u, 0, 8, NULL); +be_define_const_str(subscribe, "subscribe", 2946386435u, 0, 9, NULL); +be_define_const_str(success, "success", 979353360u, 0, 7, NULL); +be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); be_define_const_str(sys, "sys", 3277365014u, 0, 3, NULL); -be_define_const_str(tag, "tag", 2516003219u, 0, 3, &be_const_str_widget_instance_size); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_write8); -be_define_const_str(target, "target", 845187144u, 0, 6, &be_const_str_wifi_arcs_icon); +be_define_const_str(tag, "tag", 2516003219u, 0, 3, &be_const_str_web_add_config_button); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, &be_const_str_udp); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); +be_define_const_str(target, "target", 845187144u, 0, 6, &be_const_str__X7B); be_define_const_str(target_search, "target_search", 1947846553u, 0, 13, NULL); be_define_const_str(tasmota, "tasmota", 424643812u, 0, 7, NULL); be_define_const_str(tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29, "tasmota.get_light() is deprecated, use light.get()", 3525753647u, 0, 50, NULL); be_define_const_str(tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29, "tasmota.set_light() is deprecated, use light.set()", 2124937871u, 0, 50, NULL); be_define_const_str(tasmota_log_reader, "tasmota_log_reader", 3555069257u, 0, 18, NULL); be_define_const_str(tcpclient, "tcpclient", 3828797983u, 0, 9, NULL); -be_define_const_str(tele, "tele", 3474458061u, 0, 4, NULL); +be_define_const_str(tele, "tele", 3474458061u, 0, 4, &be_const_str_width_def); be_define_const_str(the_X20second_X20argument_X20is_X20not_X20a_X20function, "the second argument is not a function", 3954574469u, 0, 37, NULL); be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(to_gamma, "to_gamma", 1597139862u, 0, 8, &be_const_str_widget_width_def); +be_define_const_str(to_gamma, "to_gamma", 1597139862u, 0, 8, NULL); be_define_const_str(tob64, "tob64", 373777640u, 0, 5, NULL); be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); -be_define_const_str(tomap, "tomap", 612167626u, 0, 5, &be_const_str_widget_event); -be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); +be_define_const_str(tomap, "tomap", 612167626u, 0, 5, &be_const_str_web_add_button); +be_define_const_str(top, "top", 2802900028u, 0, 3, &be_const_str_widget_editable); be_define_const_str(toptr, "toptr", 3379847454u, 0, 5, NULL); -be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, &be_const_str_v); -be_define_const_str(touch_update, "touch_update", 1918102068u, 0, 12, NULL); +be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); +be_define_const_str(touch_update, "touch_update", 1918102068u, 0, 12, &be_const_str_year); be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); be_define_const_str(tr, "tr", 1195724803u, 0, 2, NULL); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, &be_const_str_elif); +be_define_const_str(trig, "trig", 2073314619u, 0, 4, NULL); be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); -be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(type_error, "type_error", 3789613824u, 0, 10, NULL); -be_define_const_str(udp, "udp", 1253872004u, 0, 3, &be_const_str_write); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, &be_const_str_width); +be_define_const_str(type, "type", 1361572173u, 0, 4, &be_const_str_write_file); +be_define_const_str(type_error, "type_error", 3789613824u, 0, 10, &be_const_str_write_bytes); +be_define_const_str(udp, "udp", 1253872004u, 0, 3, NULL); be_define_const_str(unknown_X20instruction, "unknown instruction", 1093911841u, 0, 19, NULL); +be_define_const_str(unsubscribe, "unsubscribe", 4190043798u, 0, 11, NULL); be_define_const_str(update, "update", 672109684u, 0, 6, NULL); be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); be_define_const_str(url_encode, "url_encode", 528392145u, 0, 10, NULL); -be_define_const_str(uuid4, "uuid4", 1153582450u, 0, 5, &be_const_str_end); -be_define_const_str(v, "v", 4077666505u, 0, 1, &be_const_str_valuer_error); -be_define_const_str(value, "value", 1113510858u, 0, 5, NULL); +be_define_const_str(uuid4, "uuid4", 1153582450u, 0, 5, NULL); +be_define_const_str(v, "v", 4077666505u, 0, 1, NULL); +be_define_const_str(value, "value", 1113510858u, 0, 5, &be_const_str_wire2); be_define_const_str(value_error, "value_error", 773297791u, 0, 11, NULL); be_define_const_str(valuer_error, "valuer_error", 2567947105u, 0, 12, NULL); be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); @@ -800,12 +804,12 @@ be_define_const_str(w, "w", 4060888886u, 0, 1, NULL); be_define_const_str(wd, "wd", 1531424278u, 0, 2, NULL); be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); -be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, &be_const_str_web_sensor); +be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); -be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, &be_const_str_wifi_arcs); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); +be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); +be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, &be_const_str_widget_ctor_cb); be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); -be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); +be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, &be_const_str_x1); be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); be_define_const_str(webclient, "webclient", 4076389146u, 0, 9, NULL); be_define_const_str(webserver, "webserver", 1572454038u, 0, 9, NULL); @@ -813,11 +817,11 @@ be_define_const_str(while, "while", 231090382u, 53, 5, NULL); be_define_const_str(widget_cb, "widget_cb", 2763583055u, 0, 9, NULL); be_define_const_str(widget_constructor, "widget_constructor", 2543785934u, 0, 18, NULL); be_define_const_str(widget_ctor_cb, "widget_ctor_cb", 876007560u, 0, 14, NULL); -be_define_const_str(widget_ctor_impl, "widget_ctor_impl", 194252479u, 0, 16, NULL); -be_define_const_str(widget_destructor, "widget_destructor", 4207388345u, 0, 17, &be_const_str_widget_group_def); -be_define_const_str(widget_dtor_cb, "widget_dtor_cb", 3151545845u, 0, 14, NULL); +be_define_const_str(widget_ctor_impl, "widget_ctor_impl", 194252479u, 0, 16, &be_const_str_wire1); +be_define_const_str(widget_destructor, "widget_destructor", 4207388345u, 0, 17, NULL); +be_define_const_str(widget_dtor_cb, "widget_dtor_cb", 3151545845u, 0, 14, &be_const_str_zero); be_define_const_str(widget_dtor_impl, "widget_dtor_impl", 520430610u, 0, 16, NULL); -be_define_const_str(widget_editable, "widget_editable", 3821793286u, 0, 15, &be_const_str_try); +be_define_const_str(widget_editable, "widget_editable", 3821793286u, 0, 15, &be_const_str_write_gpio); be_define_const_str(widget_event, "widget_event", 1951408186u, 0, 12, NULL); be_define_const_str(widget_event_cb, "widget_event_cb", 1508466754u, 0, 15, NULL); be_define_const_str(widget_event_impl, "widget_event_impl", 2178430561u, 0, 17, NULL); @@ -825,7 +829,7 @@ be_define_const_str(widget_group_def, "widget_group_def", 1246968785u, 0, 16, NU be_define_const_str(widget_height_def, "widget_height_def", 3131667813u, 0, 17, NULL); be_define_const_str(widget_instance_size, "widget_instance_size", 2055354779u, 0, 20, NULL); be_define_const_str(widget_struct_by_class, "widget_struct_by_class", 3806373842u, 0, 22, NULL); -be_define_const_str(widget_struct_default, "widget_struct_default", 781673633u, 0, 21, NULL); +be_define_const_str(widget_struct_default, "widget_struct_default", 781673633u, 0, 21, &be_const_str_raise); be_define_const_str(widget_width_def, "widget_width_def", 3986078862u, 0, 16, NULL); be_define_const_str(width, "width", 2508680735u, 0, 5, NULL); be_define_const_str(width_def, "width_def", 1143717879u, 0, 9, NULL); @@ -837,19 +841,19 @@ be_define_const_str(wifi_bars_icon, "wifi_bars_icon", 3641522557u, 0, 14, NULL); be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); -be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, &be_const_str_import); +be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); -be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, &be_const_str_else); +be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, &be_const_str_while); be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); be_define_const_str(write_file, "write_file", 3177658879u, 0, 10, NULL); be_define_const_str(write_gpio, "write_gpio", 2267940334u, 0, 10, NULL); -be_define_const_str(x, "x", 4245442695u, 0, 1, &be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); +be_define_const_str(x, "x", 4245442695u, 0, 1, NULL); be_define_const_str(x1, "x1", 274927234u, 0, 2, NULL); be_define_const_str(xy, "xy", 1482915802u, 0, 2, NULL); be_define_const_str(y, "y", 4228665076u, 0, 1, NULL); -be_define_const_str(y1, "y1", 2355101727u, 0, 2, NULL); -be_define_const_str(year, "year", 2927578396u, 0, 4, NULL); +be_define_const_str(y1, "y1", 2355101727u, 0, 2, &be_const_str_as); +be_define_const_str(year, "year", 2927578396u, 0, 4, &be_const_str_zip); be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); be_define_const_str(zero, "zero", 2339366755u, 0, 4, NULL); be_define_const_str(zip, "zip", 2877453236u, 0, 3, NULL); @@ -863,430 +867,432 @@ be_define_const_str(_X7B_X7D, "{}", 1415952421u, 0, 2, NULL); be_define_const_str(_X7D, "}", 4161554600u, 0, 1, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_True, - (const bstring *)&be_const_str_Timer, - (const bstring *)&be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str__request_from, - (const bstring *)&be_const_str_last_modified, - (const bstring *)&be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E, - NULL, - (const bstring *)&be_const_str_AudioGeneratorWAV, - (const bstring *)&be_const_str_clear_first_time, - NULL, - NULL, - (const bstring *)&be_const_str_BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, - (const bstring *)&be_const_str__X2E, - (const bstring *)&be_const_str_SERIAL_7O2, - (const bstring *)&be_const_str_set_rgb, - (const bstring *)&be_const_str__X2Fstate_X2F, - (const bstring *)&be_const_str_out_X20of_X20range, - (const bstring *)&be_const_str_gpio, - (const bstring *)&be_const_str_add_cmd, - (const bstring *)&be_const_str_listdir, - (const bstring *)&be_const_str_get_object_from_ptr, - (const bstring *)&be_const_str_get_vbus_current, - (const bstring *)&be_const_str___upper__, - (const bstring *)&be_const_str_SERIAL_6N2, - (const bstring *)&be_const_str__drivers, - (const bstring *)&be_const_str__X28_X29, - (const bstring *)&be_const_str_signal_arcs, - (const bstring *)&be_const_str_AudioGeneratorMP3, - (const bstring *)&be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, - (const bstring *)&be_const_str_clear_to, - (const bstring *)&be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, - (const bstring *)&be_const_str_set_light, - (const bstring *)&be_const_str_animators, - (const bstring *)&be_const_str_p1, - (const bstring *)&be_const_str__filename, - (const bstring *)&be_const_str_BUTTON_CONFIGURATION, - NULL, - (const bstring *)&be_const_str_decrypt, - (const bstring *)&be_const_str_event, - (const bstring *)&be_const_str_a, - (const bstring *)&be_const_str__X0A, - (const bstring *)&be_const_str_classof, - (const bstring *)&be_const_str_add_rule, - (const bstring *)&be_const_str_EVENT_DRAW_PART_BEGIN, - (const bstring *)&be_const_str_every_second, - (const bstring *)&be_const_str_SERIAL_6E1, - (const bstring *)&be_const_str_elif, - (const bstring *)&be_const_str_asstring, - (const bstring *)&be_const_str_content_send, - (const bstring *)&be_const_str_detected_X20on_X20bus, - (const bstring *)&be_const_str_close, - NULL, - (const bstring *)&be_const_str_due, - (const bstring *)&be_const_str_SERIAL_5E2, - (const bstring *)&be_const_str_get_bri, - (const bstring *)&be_const_str_Wire, - (const bstring *)&be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, - (const bstring *)&be_const_str__X26lt_X3BNone_X26gt_X3B, - NULL, - NULL, - (const bstring *)&be_const_str__global_addr, - (const bstring *)&be_const_str__p, - (const bstring *)&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, - (const bstring *)&be_const_str_class_init_obj, - (const bstring *)&be_const_str_reset_search, - (const bstring *)&be_const_str_web_add_management_button, - (const bstring *)&be_const_str_read8, - (const bstring *)&be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, - (const bstring *)&be_const_str_hs2rgb, - (const bstring *)&be_const_str__X2B, - (const bstring *)&be_const_str_I2C_X3A, - (const bstring *)&be_const_str_lv_, - (const bstring *)&be_const_str_json_fdump_map, - (const bstring *)&be_const_str__X2Ew, - (const bstring *)&be_const_str_acos, - (const bstring *)&be_const_str__error, - (const bstring *)&be_const_str__X22, - (const bstring *)&be_const_str_get_bat_voltage, - (const bstring *)&be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D, - (const bstring *)&be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, - (const bstring *)&be_const_str_SERIAL_6N1, - (const bstring *)&be_const_str_cmd_res, - (const bstring *)&be_const_str_ctypes_bytes, - (const bstring *)&be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, - (const bstring *)&be_const_str_cb_event_closure, - (const bstring *)&be_const_str_get_coords, - (const bstring *)&be_const_str_check_not_method, - (const bstring *)&be_const_str_web_send, - (const bstring *)&be_const_str_content_start, - (const bstring *)&be_const_str_k, - (const bstring *)&be_const_str_value_error, - (const bstring *)&be_const_str_get_percentage, - (const bstring *)&be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, - (const bstring *)&be_const_str_montserrat_font, - (const bstring *)&be_const_str__X3D_X3D, - (const bstring *)&be_const_str_before_del, - (const bstring *)&be_const_str_LVG_X3A_X20object_X3A, - (const bstring *)&be_const_str_Parameter_X20error, - (const bstring *)&be_const_str_cmd, - (const bstring *)&be_const_str_SERIAL_5O2, - (const bstring *)&be_const_str_CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, - (const bstring *)&be_const_str_back_forth, - (const bstring *)&be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker, - (const bstring *)&be_const_str__archive, - (const bstring *)&be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, - (const bstring *)&be_const_str_CT, - (const bstring *)&be_const_str__X2F_X3Frst_X3D, - (const bstring *)&be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, - (const bstring *)&be_const_str_Auto_X2Dconfiguration, - (const bstring *)&be_const_str___lower__, - (const bstring *)&be_const_str_gen_cb, - (const bstring *)&be_const_str_SERIAL_6O1, - (const bstring *)&be_const_str__X3A, - (const bstring *)&be_const_str_gamma, - (const bstring *)&be_const_str_None, - (const bstring *)&be_const_str_get_light, - (const bstring *)&be_const_str_open, - (const bstring *)&be_const_str_WS2812, - NULL, - (const bstring *)&be_const_str__X3D, - (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_event_send, - NULL, - (const bstring *)&be_const_str_AudioOutputI2S, - (const bstring *)&be_const_str_widget_destructor, - (const bstring *)&be_const_str__X3C_X3D, - (const bstring *)&be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, - (const bstring *)&be_const_str__buffer, - (const bstring *)&be_const_str_read, - (const bstring *)&be_const_str_imax, - (const bstring *)&be_const_str_EC_C25519, - (const bstring *)&be_const_str_kv, - (const bstring *)&be_const_str_set_timer, - (const bstring *)&be_const_str__X2F, - (const bstring *)&be_const_str_SERIAL_7O1, - (const bstring *)&be_const_str__X23preinit_X2Ebe, - (const bstring *)&be_const_str_get_free_heap, - (const bstring *)&be_const_str_get_log, - (const bstring *)&be_const_str_dimmer, - (const bstring *)&be_const_str_COLOR_BLACK, - NULL, - NULL, - NULL, - (const bstring *)&be_const_str_cos, - (const bstring *)&be_const_str_round_end, - NULL, - (const bstring *)&be_const_str_MD5, - (const bstring *)&be_const_str__X2Ebe, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20function, - (const bstring *)&be_const_str_CFG_X3A_X20removing_X20autoconf_X20files, - (const bstring *)&be_const_str__X23autoexec_X2Ebe, - NULL, - (const bstring *)&be_const_str__ccmd, - NULL, - (const bstring *)&be_const_str_p2, - (const bstring *)&be_const_str_lv_wifi_bars, - (const bstring *)&be_const_str_SERIAL_5O1, - (const bstring *)&be_const_str_AES_GCM, - (const bstring *)&be_const_str_fromb64, - NULL, - (const bstring *)&be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_AudioGenerator, - (const bstring *)&be_const_str_DIMMER, - (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, - (const bstring *)&be_const_str_percentage, - (const bstring *)&be_const_str_SERIAL_7N1, - (const bstring *)&be_const_str_SERIAL_6E2, - (const bstring *)&be_const_str__X2Flights_X2F, - (const bstring *)&be_const_str_SERIAL_6O2, - (const bstring *)&be_const_str__energy, - NULL, - NULL, - NULL, - (const bstring *)&be_const_str_skip, - (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, - (const bstring *)&be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str__X3E, - (const bstring *)&be_const_str__X2Fac, - (const bstring *)&be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_CFG_X3A_X20return_code_X3D_X25i, - (const bstring *)&be_const_str_function, - (const bstring *)&be_const_str_OneWire, - (const bstring *)&be_const_str_EVENT_DELETE, - NULL, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, - (const bstring *)&be_const_str__X2Ep1, - (const bstring *)&be_const_str_set_ct, - (const bstring *)&be_const_str_digital_read, - (const bstring *)&be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, - NULL, - (const bstring *)&be_const_str_deg, - (const bstring *)&be_const_str_chars_in_string, - (const bstring *)&be_const_str_add_event_cb, - (const bstring *)&be_const_str__X2Etapp, - NULL, - (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, - NULL, - (const bstring *)&be_const_str__X23, - (const bstring *)&be_const_str_exec_cmd, - (const bstring *)&be_const_str_exp, - (const bstring *)&be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, - (const bstring *)&be_const_str_SERIAL_8O1, - (const bstring *)&be_const_str_add_light, - (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str__write, - (const bstring *)&be_const_str_codedump, - NULL, - (const bstring *)&be_const_str_PART_MAIN, - (const bstring *)&be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, - (const bstring *)&be_const_str_memory, - (const bstring *)&be_const_str_clock_icon, - (const bstring *)&be_const_str__fl, - (const bstring *)&be_const_str_get_bat_current, - (const bstring *)&be_const_str_CFG_X3A_X20running_X20, - (const bstring *)&be_const_str_Restart_X201, - (const bstring *)&be_const_str_page_autoconf_ctl, - (const bstring *)&be_const_str_display, (const bstring *)&be_const_str_addr, - (const bstring *)&be_const_str_input, - (const bstring *)&be_const_str_bytes, - (const bstring *)&be_const_str_keys, - (const bstring *)&be_const_str_dac_voltage, + (const bstring *)&be_const_str_SERIAL_6E2, + (const bstring *)&be_const_str_find_key_i, + (const bstring *)&be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, + (const bstring *)&be_const_str_cos, + (const bstring *)&be_const_str_get_power, + (const bstring *)&be_const_str_read32, (const bstring *)&be_const_str__lvgl, - (const bstring *)&be_const_str_SERIAL_7E2, - (const bstring *)&be_const_str__X2E_X2E, - NULL, - (const bstring *)&be_const_str_tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29, - (const bstring *)&be_const_str_INTERNAL_PDM, - (const bstring *)&be_const_str_has_X20already_X20an_X20event_X20callback, - (const bstring *)&be_const_str_lv_solidified, - (const bstring *)&be_const_str_page_autoconf_mgr, - (const bstring *)&be_const_str__X5D, - (const bstring *)&be_const_str_get_size, - (const bstring *)&be_const_str_EVENT_DRAW_MAIN, - (const bstring *)&be_const_str_get_aps_voltage, - (const bstring *)&be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, - (const bstring *)&be_const_str_arg_size, - (const bstring *)&be_const_str_AudioFileSource, - (const bstring *)&be_const_str_sqrt, - (const bstring *)&be_const_str_log10, - NULL, - (const bstring *)&be_const_str_web_add_handler, - (const bstring *)&be_const_str___iterator__, - (const bstring *)&be_const_str__X2Esize, - (const bstring *)&be_const_str_widget_dtor_cb, - NULL, - (const bstring *)&be_const_str_readline, - (const bstring *)&be_const_str_isrunning, - (const bstring *)&be_const_str_tolower, - NULL, - (const bstring *)&be_const_str_add_driver, - (const bstring *)&be_const_str_EVENT_DRAW_PART_END, - (const bstring *)&be_const_str_Tele, - (const bstring *)&be_const_str_SERIAL_8N2, - (const bstring *)&be_const_str__X2C, - (const bstring *)&be_const_str__X2Elen, - (const bstring *)&be_const_str_tasmota_log_reader, - (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X20, - (const bstring *)&be_const_str__X2Ep, - (const bstring *)&be_const_str_code, - (const bstring *)&be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range, - (const bstring *)&be_const_str__settings_ptr, - (const bstring *)&be_const_str_gamma10, - (const bstring *)&be_const_str__X25s_X2Eautoconf, - NULL, - (const bstring *)&be_const_str__dirty, - (const bstring *)&be_const_str_upper, - (const bstring *)&be_const_str_color, - (const bstring *)&be_const_str_internal_error, - (const bstring *)&be_const_str_begin, - NULL, - (const bstring *)&be_const_str_Unknown_X20command, - NULL, - (const bstring *)&be_const_str_x1, - (const bstring *)&be_const_str_get, - (const bstring *)&be_const_str_SERIAL_8E1, - (const bstring *)&be_const_str_draw_arc_dsc, - (const bstring *)&be_const_str_HTTP_GET, - (const bstring *)&be_const_str_add_handler, - (const bstring *)&be_const_str_SERIAL_5N1, - (const bstring *)&be_const_str_RGBW, - (const bstring *)&be_const_str__cmd, - (const bstring *)&be_const_str_create_matrix, - NULL, - (const bstring *)&be_const_str_collect, + (const bstring *)&be_const_str_AudioGeneratorMP3, + (const bstring *)&be_const_str_get_input_power_status, NULL, (const bstring *)&be_const_str_SERIAL_7N2, - (const bstring *)&be_const_str__X2Eautoconf, - (const bstring *)&be_const_str_editable, - (const bstring *)&be_const_str_COLOR_WHITE, - (const bstring *)&be_const_str_depower, - (const bstring *)&be_const_str_deinit, - (const bstring *)&be_const_str_duration, - NULL, - (const bstring *)&be_const_str_abs, - (const bstring *)&be_const_str__begin_transmission, - (const bstring *)&be_const_str__X2502d_X25s_X2502d, - (const bstring *)&be_const_str__X3Clambda_X3E, - (const bstring *)&be_const_str_GET, - (const bstring *)&be_const_str_connection_error, - (const bstring *)&be_const_str_call, - (const bstring *)&be_const_str_calldepth, - (const bstring *)&be_const_str_atan2, - (const bstring *)&be_const_str_local, - NULL, - (const bstring *)&be_const_str_resp_cmnd, - (const bstring *)&be_const_str__X2Ep2, - (const bstring *)&be_const_str_AudioOutput, - (const bstring *)&be_const_str_groups, - (const bstring *)&be_const_str__read, - (const bstring *)&be_const_str_gc, - (const bstring *)&be_const_str_obj_class_create_obj, - (const bstring *)&be_const_str_ins_time, - (const bstring *)&be_const_str_remove_light, - (const bstring *)&be_const_str_raise, - (const bstring *)&be_const_str_readbytes, - (const bstring *)&be_const_str_alternate, - (const bstring *)&be_const_str_offset, - (const bstring *)&be_const_str__X20, - (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, - (const bstring *)&be_const_str__X2Ebec, - NULL, - (const bstring *)&be_const_str_CFG_X3A_X20loading_X20, - (const bstring *)&be_const_str_draw_arc_dsc_init, - (const bstring *)&be_const_str__rules, - (const bstring *)&be_const_str_get_temp, - (const bstring *)&be_const_str_decode, - (const bstring *)&be_const_str_STATE_DEFAULT, - NULL, - (const bstring *)&be_const_str_arc_dsc, - (const bstring *)&be_const_str__X21_X3D, - (const bstring *)&be_const_str_web_add_console_button, - (const bstring *)&be_const_str__X2F_X2Eautoconf, - NULL, - NULL, - (const bstring *)&be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, - (const bstring *)&be_const_str_SERIAL_5N2, - (const bstring *)&be_const_str_I2C_Driver, - (const bstring *)&be_const_str_INTERNAL_DAC, - (const bstring *)&be_const_str_add, - (const bstring *)&be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, - (const bstring *)&be_const_str_font_montserrat, - (const bstring *)&be_const_str_get_height, - (const bstring *)&be_const_str_attrdump, - (const bstring *)&be_const_str__debug_present, - (const bstring *)&be_const_str__X5B, - (const bstring *)&be_const_str_autorun, - NULL, - (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, - (const bstring *)&be_const_str_hex, - (const bstring *)&be_const_str_arg, - (const bstring *)&be_const_str_CFG_X3A_X20ran_X20_X20, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, - (const bstring *)&be_const_str_toptr, - (const bstring *)&be_const_str_arg_name, - NULL, - (const bstring *)&be_const_str__X23init_X2Ebat, - (const bstring *)&be_const_str_create_custom_widget, - (const bstring *)&be_const_str_digital_write, - (const bstring *)&be_const_str_for, - (const bstring *)&be_const_str__available, - (const bstring *)&be_const_str_fast_loop, - (const bstring *)&be_const_str_rule, - (const bstring *)&be_const_str_round_start, - NULL, - NULL, - (const bstring *)&be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, - (const bstring *)&be_const_str_AXP192, - NULL, - (const bstring *)&be_const_str_decompress, - (const bstring *)&be_const_str_read24, - (const bstring *)&be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map, - (const bstring *)&be_const_str_exists, - (const bstring *)&be_const_str__X21_X3D_X3D, - (const bstring *)&be_const_str_SERIAL_8N1, - (const bstring *)&be_const_str__ptr, - (const bstring *)&be_const_str_get_input_power_status, - (const bstring *)&be_const_str_ct, - (const bstring *)&be_const_str_hour, - (const bstring *)&be_const_str__X23display_X2Eini, - (const bstring *)&be_const_str__global_def, - (const bstring *)&be_const_str_cb_do_nothing, - (const bstring *)&be_const_str_energy_struct, - (const bstring *)&be_const_str_count, NULL, + (const bstring *)&be_const_str__def, NULL, + (const bstring *)&be_const_str_RGBCT, + (const bstring *)&be_const_str_AudioGeneratorWAV, + (const bstring *)&be_const_str_resp_cmnd_error, + (const bstring *)&be_const_str_atleast1, + (const bstring *)&be_const_str_get_bat_current, + (const bstring *)&be_const_str_lv_wifi_bars, + (const bstring *)&be_const_str__global_addr, + (const bstring *)&be_const_str_get_log, NULL, + (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, + (const bstring *)&be_const_str_solidified, (const bstring *)&be_const_str_Tasmota, - (const bstring *)&be_const_str_fromptr, - (const bstring *)&be_const_str_asin, - (const bstring *)&be_const_str_POST, - (const bstring *)&be_const_str_load_freetype_font, - (const bstring *)&be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, - (const bstring *)&be_const_str_write_gpio, - (const bstring *)&be_const_str_begin_multicast, + (const bstring *)&be_const_str_wifi_bars, + (const bstring *)&be_const_str_elements_X20must_X20be_X20a_X20lv_point, + (const bstring *)&be_const_str__drivers, + (const bstring *)&be_const_str_EVENT_DRAW_MAIN, + (const bstring *)&be_const_str_INTERNAL_DAC, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, + (const bstring *)&be_const_str_try_rule, + (const bstring *)&be_const_str_decrypt, + (const bstring *)&be_const_str_Trigger, + (const bstring *)&be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, + (const bstring *)&be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, + (const bstring *)&be_const_str_arc_dsc, + (const bstring *)&be_const_str_get_warning_level, + (const bstring *)&be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, + (const bstring *)&be_const_str_set_bits_per_sample, + (const bstring *)&be_const_str_pc, NULL, + (const bstring *)&be_const_str_HTTP_GET, + (const bstring *)&be_const_str_Auto_X2Dconfiguration, + (const bstring *)&be_const_str_str, + (const bstring *)&be_const_str__X2E, + (const bstring *)&be_const_str_pc_rel, + (const bstring *)&be_const_str_widget_dtor_cb, + (const bstring *)&be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, + (const bstring *)&be_const_str_animators, + (const bstring *)&be_const_str_delay, + (const bstring *)&be_const_str_json_fdump_list, + (const bstring *)&be_const_str_introspect, + (const bstring *)&be_const_str_SERIAL_6O2, + (const bstring *)&be_const_str__X2Esize, + (const bstring *)&be_const_str_gc, + (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, + (const bstring *)&be_const_str_erase, + (const bstring *)&be_const_str_chars_in_string, + (const bstring *)&be_const_str_SERIAL_5N2, + (const bstring *)&be_const_str_consume_stereo, + (const bstring *)&be_const_str_create_matrix, + (const bstring *)&be_const_str_draw_line_dsc_init, + (const bstring *)&be_const_str_unknown_X20instruction, + (const bstring *)&be_const_str__X23, NULL, - (const bstring *)&be_const_str_coord_arr, - (const bstring *)&be_const_str_persist, - (const bstring *)&be_const_str_break, - (const bstring *)&be_const_str_exec_tele, - (const bstring *)&be_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, - (const bstring *)&be_const_str_byte, + (const bstring *)&be_const_str_lv_signal_arcs, + (const bstring *)&be_const_str__X0A, + NULL, + (const bstring *)&be_const_str_resolvecmnd, (const bstring *)&be_const_str_CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, - (const bstring *)&be_const_str__X22_X3A, - (const bstring *)&be_const_str_add_fast_loop, + (const bstring *)&be_const_str_set_height, + (const bstring *)&be_const_str_get_style_pad_right, + (const bstring *)&be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker, + (const bstring *)&be_const_str_SERIAL_5O2, NULL, - (const bstring *)&be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus, - (const bstring *)&be_const_str_lv_obj, - (const bstring *)&be_const_str__, + (const bstring *)&be_const_str_INTERNAL_PDM, + (const bstring *)&be_const_str_cmd, + (const bstring *)&be_const_str_AXP192, + (const bstring *)&be_const_str__X23autoexec_X2Ebat, + (const bstring *)&be_const_str__X3D, + (const bstring *)&be_const_str_SK6812_GRBW, NULL, - (const bstring *)&be_const_str_connected, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_seti, - (const bstring *)&be_const_str_Leds, - (const bstring *)&be_const_str__anonymous_, + (const bstring *)&be_const_str_assert, + (const bstring *)&be_const_str__X2Flights_X2F, + (const bstring *)&be_const_str_Unknown, + (const bstring *)&be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, + (const bstring *)&be_const_str_lv_wifi_arcs, + (const bstring *)&be_const_str_codedump, + (const bstring *)&be_const_str_light_state, + (const bstring *)&be_const_str_AES_GCM, + (const bstring *)&be_const_str_SERIAL_5E1, + (const bstring *)&be_const_str__X28_X29, + NULL, + (const bstring *)&be_const_str_before_del, + (const bstring *)&be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, + (const bstring *)&be_const_str_json_fdump, + NULL, + (const bstring *)&be_const_str_every_50ms, + NULL, + (const bstring *)&be_const_str_area, + (const bstring *)&be_const_str_is_running, + (const bstring *)&be_const_str_lv_obj_class, + NULL, + (const bstring *)&be_const_str_null_cb, + (const bstring *)&be_const_str__X23autoexec_X2Ebe, + (const bstring *)&be_const_str__X2Fstate_X2F, + (const bstring *)&be_const_str_content_button, + (const bstring *)&be_const_str__archive, + NULL, + (const bstring *)&be_const_str_resp_cmnd_str, + NULL, + (const bstring *)&be_const_str_CFG_X3A_X20return_code_X3D_X25i, + (const bstring *)&be_const_str_list_handlers, + (const bstring *)&be_const_str__persist_X2Ejson, + (const bstring *)&be_const_str__global_def, + (const bstring *)&be_const_str__X5D, + (const bstring *)&be_const_str_content_stop, + (const bstring *)&be_const_str__X2B, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, + (const bstring *)&be_const_str__ptr, (const bstring *)&be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27, + (const bstring *)&be_const_str_COLOR_WHITE, + (const bstring *)&be_const_str_lv_coord_arr, + (const bstring *)&be_const_str_rotate, + NULL, + (const bstring *)&be_const_str__error, + (const bstring *)&be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, + (const bstring *)&be_const_str_set_dc_voltage, + (const bstring *)&be_const_str_CFG_X3A_X20loading_X20, + (const bstring *)&be_const_str_OneWire, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_run, + (const bstring *)&be_const_str__X2Ep2, + (const bstring *)&be_const_str_get_current_module_name, + (const bstring *)&be_const_str_display, + (const bstring *)&be_const_str_RGB, + (const bstring *)&be_const_str__X2C, + (const bstring *)&be_const_str_model, + (const bstring *)&be_const_str_arg_size, + (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, + NULL, + (const bstring *)&be_const_str_nil, + (const bstring *)&be_const_str__X23init_X2Ebat, + (const bstring *)&be_const_str_count, + (const bstring *)&be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range, + (const bstring *)&be_const_str__X3Clambda_X3E, + (const bstring *)&be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, + (const bstring *)&be_const_str_ip, + (const bstring *)&be_const_str_issubclass, + (const bstring *)&be_const_str_Wire, + NULL, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, + (const bstring *)&be_const_str__X3E, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str__settings_def, + (const bstring *)&be_const_str_wifi_arcs_icon, + (const bstring *)&be_const_str_clock_icon, + (const bstring *)&be_const_str_draw_arc_dsc_init, + NULL, + (const bstring *)&be_const_str_set_auth, + (const bstring *)&be_const_str_month, + (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X20, + NULL, + (const bstring *)&be_const_str_SERIAL_6E1, + (const bstring *)&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, + (const bstring *)&be_const_str_get_width, + (const bstring *)&be_const_str_min, + (const bstring *)&be_const_str_allocated, + (const bstring *)&be_const_str__X2Ebec, + (const bstring *)&be_const_str_connection_error, + (const bstring *)&be_const_str_send, + NULL, + NULL, + (const bstring *)&be_const_str_SERIAL_7N1, + (const bstring *)&be_const_str_RGBW, + NULL, + (const bstring *)&be_const_str_SERIAL_8N1, + (const bstring *)&be_const_str_setrange, + (const bstring *)&be_const_str_font_embedded, + (const bstring *)&be_const_str_WS2812_GRB, + (const bstring *)&be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_draw_line, + (const bstring *)&be_const_str_atan, + (const bstring *)&be_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, + (const bstring *)&be_const_str_font_seg7, + (const bstring *)&be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str__X2F_X2Eautoconf, + (const bstring *)&be_const_str__class, + (const bstring *)&be_const_str_hs2rgb, + (const bstring *)&be_const_str_try, + NULL, + NULL, + (const bstring *)&be_const_str_make_cb, + (const bstring *)&be_const_str_Unknown_X20command, + (const bstring *)&be_const_str_add_driver, + (const bstring *)&be_const_str_every_100ms, + (const bstring *)&be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, + (const bstring *)&be_const_str_geti, + (const bstring *)&be_const_str_load_templates, + NULL, + (const bstring *)&be_const_str_call, + (const bstring *)&be_const_str_CFG_X3A_X20ran_X20_X20, + NULL, + (const bstring *)&be_const_str_compile, + (const bstring *)&be_const_str_close, + (const bstring *)&be_const_str_COLOR_BLACK, + (const bstring *)&be_const_str_call_native, + (const bstring *)&be_const_str_web_add_main_button, + (const bstring *)&be_const_str_Leds, + (const bstring *)&be_const_str_CT, + (const bstring *)&be_const_str__X2502d_X25s_X2502d, + (const bstring *)&be_const_str_AudioGenerator, + (const bstring *)&be_const_str_light_to_id, + (const bstring *)&be_const_str_set_percentage, + (const bstring *)&be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, + (const bstring *)&be_const_str_lv_event_cb, + (const bstring *)&be_const_str_cb_event_closure, + (const bstring *)&be_const_str_get_light, + NULL, + (const bstring *)&be_const_str_local, + (const bstring *)&be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, + (const bstring *)&be_const_str_asin, + (const bstring *)&be_const_str_math, (const bstring *)&be_const_str_RELAY, - (const bstring *)&be_const_str__X3C + (const bstring *)&be_const_str_get_object_from_ptr, + (const bstring *)&be_const_str_calldepth, + (const bstring *)&be_const_str_draw_ctx, + (const bstring *)&be_const_str_type_error, + (const bstring *)&be_const_str__X22, + (const bstring *)&be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, + (const bstring *)&be_const_str___iterator__, + (const bstring *)&be_const_str_encrypt, + NULL, + (const bstring *)&be_const_str__p, + (const bstring *)&be_const_str__available, + (const bstring *)&be_const_str_battery_present, + NULL, + NULL, + (const bstring *)&be_const_str_full_status, + NULL, + (const bstring *)&be_const_str_true, + (const bstring *)&be_const_str__timers, + (const bstring *)&be_const_str_POST, + (const bstring *)&be_const_str_resp_cmnd_failed, + (const bstring *)&be_const_str__X3C, + NULL, + (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, + (const bstring *)&be_const_str__X2Elen, + (const bstring *)&be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, + (const bstring *)&be_const_str_escape, + (const bstring *)&be_const_str_can_show, + (const bstring *)&be_const_str_SERIAL_8E1, + (const bstring *)&be_const_str_strptime, + NULL, + (const bstring *)&be_const_str__X3D_X3C_X3E_X21, + (const bstring *)&be_const_str_SERIAL_5E2, + (const bstring *)&be_const_str__X2F_X3Frst_X3D, + (const bstring *)&be_const_str_EVENT_DRAW_PART_END, + (const bstring *)&be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, + (const bstring *)&be_const_str_clear_to, + (const bstring *)&be_const_str_flush, + (const bstring *)&be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function, + (const bstring *)&be_const_str_deg, + (const bstring *)&be_const_str_wire_scan, + (const bstring *)&be_const_str_editable, + NULL, + (const bstring *)&be_const_str_event, + (const bstring *)&be_const_str_RES_OK, + (const bstring *)&be_const_str_member, + NULL, + (const bstring *)&be_const_str_check_not_method, + (const bstring *)&be_const_str_CFG_X3A_X20running_X20, + (const bstring *)&be_const_str_loop, + (const bstring *)&be_const_str_SERIAL_6N2, + (const bstring *)&be_const_str_add_rule, + (const bstring *)&be_const_str_AudioOutputI2S, + (const bstring *)&be_const_str_last_modified, + (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27, + NULL, + (const bstring *)&be_const_str__dirty, + (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20function, + (const bstring *)&be_const_str_tan, + (const bstring *)&be_const_str_dimmer, + (const bstring *)&be_const_str_SERIAL_7O2, + (const bstring *)&be_const_str_gen_cb, + (const bstring *)&be_const_str_Parameter_X20error, + (const bstring *)&be_const_str_dump, + NULL, + (const bstring *)&be_const_str_input, + (const bstring *)&be_const_str_save, + NULL, + (const bstring *)&be_const_str_OPTION_A, + (const bstring *)&be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27, + (const bstring *)&be_const_str_path, + (const bstring *)&be_const_str__X22_X3A, + (const bstring *)&be_const_str_lv_event, + (const bstring *)&be_const_str__X2E_X2E, + (const bstring *)&be_const_str__X2Ep1, + (const bstring *)&be_const_str_I2C_X3A, + (const bstring *)&be_const_str__X3E_X3D, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, + (const bstring *)&be_const_str__X23preinit_X2Ebe, + (const bstring *)&be_const_str_energy_struct, + NULL, + (const bstring *)&be_const_str_EXTERNAL_I2S, + (const bstring *)&be_const_str__X23display_X2Eini, + (const bstring *)&be_const_str_autorun, + (const bstring *)&be_const_str_contains, + (const bstring *)&be_const_str__debug_present, + (const bstring *)&be_const_str__request_from, + (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, + (const bstring *)&be_const_str_discover, + (const bstring *)&be_const_str_sat, + (const bstring *)&be_const_str_wifi_arcs, + (const bstring *)&be_const_str_obj_event_base, + (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, + NULL, + (const bstring *)&be_const_str_register_obj, + (const bstring *)&be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, + (const bstring *)&be_const_str__anonymous_, + (const bstring *)&be_const_str__X20, + (const bstring *)&be_const_str__X2Etapp, + (const bstring *)&be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_hue_ntv, + (const bstring *)&be_const_str_SERIAL_8E2, + (const bstring *)&be_const_str_eth, + (const bstring *)&be_const_str_y1, + (const bstring *)&be_const_str__X25s_X2Eautoconf, + (const bstring *)&be_const_str_constructor_cb, + (const bstring *)&be_const_str_connected, + (const bstring *)&be_const_str_get_bat_power, + (const bstring *)&be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_pin, + (const bstring *)&be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback, + (const bstring *)&be_const_str_var, + (const bstring *)&be_const_str_reverse, + (const bstring *)&be_const_str__X2Fac, + NULL, + (const bstring *)&be_const_str_continue, + (const bstring *)&be_const_str_acos, + (const bstring *)&be_const_str_SERIAL_8N2, + (const bstring *)&be_const_str_ctypes_bytes, + NULL, + NULL, + (const bstring *)&be_const_str_lv_clock_icon, + (const bstring *)&be_const_str_SERIAL_6N1, + (const bstring *)&be_const_str_remove_cmd, + (const bstring *)&be_const_str_char, + (const bstring *)&be_const_str_coord_arr, + (const bstring *)&be_const_str_v, + (const bstring *)&be_const_str__X21_X3D_X3D, + (const bstring *)&be_const_str__X21_X3D, + (const bstring *)&be_const_str_EVENT_DRAW_PART_BEGIN, + (const bstring *)&be_const_str_seg7_font, + NULL, + (const bstring *)&be_const_str_get_size, + (const bstring *)&be_const_str_lvgl_event_dispatch, + (const bstring *)&be_const_str_base_class, + (const bstring *)&be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, + NULL, + (const bstring *)&be_const_str_write, + (const bstring *)&be_const_str_list, + (const bstring *)&be_const_str__X2Eautoconf, + (const bstring *)&be_const_str_autoexec, + (const bstring *)&be_const_str_cb_do_nothing, + (const bstring *)&be_const_str_page_autoconf_mgr, + (const bstring *)&be_const_str__X2Ebe, + (const bstring *)&be_const_str_percentage, + (const bstring *)&be_const_str_k, + NULL, + (const bstring *)&be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E, + (const bstring *)&be_const_str__X2D_X2D_X3A_X2D_X2D, + (const bstring *)&be_const_str_STATE_DEFAULT, + (const bstring *)&be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, + NULL, + (const bstring *)&be_const_str_reset_search, + (const bstring *)&be_const_str_bri, + (const bstring *)&be_const_str_ctor, + (const bstring *)&be_const_str_scale_uint, + (const bstring *)&be_const_str__write, + (const bstring *)&be_const_str__X2Ew, + (const bstring *)&be_const_str_lv, + (const bstring *)&be_const_str_font_montserrat, + (const bstring *)&be_const_str_load, + (const bstring *)&be_const_str_webclient, + (const bstring *)&be_const_str_Tele, + (const bstring *)&be_const_str_False, + (const bstring *)&be_const_str_bool, + (const bstring *)&be_const_str_sec, + (const bstring *)&be_const_str__X3A, + (const bstring *)&be_const_str_BUTTON_CONFIGURATION, + (const bstring *)&be_const_str_rule, + (const bstring *)&be_const_str__cmd, + (const bstring *)&be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, + (const bstring *)&be_const_str_class_init_obj, + (const bstring *)&be_const_str_digital_write, + (const bstring *)&be_const_str_add_fast_loop, + (const bstring *)&be_const_str_None, + (const bstring *)&be_const_str__X26lt_X3BNone_X26gt_X3B, + (const bstring *)&be_const_str__X2Ep, + (const bstring *)&be_const_str_SERIAL_6O1, + (const bstring *)&be_const_str_EVENT_DELETE, + (const bstring *)&be_const_str_HTTP_POST, + (const bstring *)&be_const_str_content_flush, + NULL, + NULL, + (const bstring *)&be_const_str_SERIAL_5N1, + (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20list, + (const bstring *)&be_const_str__X3F, + (const bstring *)&be_const_str_consume_silence, + (const bstring *)&be_const_str_SERIAL_8O1, + (const bstring *)&be_const_str_alternate, + (const bstring *)&be_const_str_cb_obj, + NULL, + (const bstring *)&be_const_str_lv_wifi_bars_icon, + (const bstring *)&be_const_str_arg, + (const bstring *)&be_const_str__t, + (const bstring *)&be_const_str_function }; static const struct bconststrtab m_const_string_table = { - .size = 420, - .count = 863, + .size = 422, + .count = 867, .table = m_string_table }; diff --git a/lib/libesp32/berry/generate/be_fixed_mqtt.h b/lib/libesp32/berry/generate/be_fixed_mqtt.h new file mode 100644 index 000000000..6c402fbd1 --- /dev/null +++ b/lib/libesp32/berry/generate/be_fixed_mqtt.h @@ -0,0 +1,19 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(m_libmqtt_map) { + { be_const_key(unsubscribe, -1), be_const_ctype_func(be_mqtt_unsubscribe) }, + { be_const_key(subscribe, -1), be_const_ctype_func(be_mqtt_subscribe) }, + { be_const_key(publish, 1), be_const_func(be_mqtt_publish) }, +}; + +static be_define_const_map( + m_libmqtt_map, + 3 +); + +static be_define_const_module( + m_libmqtt, + "mqtt" +); + +BE_EXPORT_VARIABLE be_define_const_native_module(mqtt); diff --git a/lib/libesp32/berry/src/be_gc.c b/lib/libesp32/berry/src/be_gc.c index 9e1ca0b74..cd4e7b0b4 100644 --- a/lib/libesp32/berry/src/be_gc.c +++ b/lib/libesp32/berry/src/be_gc.c @@ -40,6 +40,7 @@ void be_gc_init(bvm *vm) { vm->gc.usage = sizeof(bvm); be_gc_setsteprate(vm, 200); + be_gc_init_memory_pools(vm); } void be_gc_deleteall(bvm *vm) @@ -543,6 +544,8 @@ void be_gc_collect(bvm *vm) return; /* the GC cannot run for some reason */ } #if BE_USE_PERF_COUNTERS + size_t slors_used_before_gc, slots_allocated_before_gc; + be_gc_memory_pools_info(vm, &slors_used_before_gc, &slots_allocated_before_gc); vm->counter_gc_kept = 0; vm->counter_gc_freed = 0; #endif @@ -563,8 +566,13 @@ void be_gc_collect(bvm *vm) reset_fixedlist(vm); /* step 5: calculate the next GC threshold */ vm->gc.threshold = next_threshold(vm->gc); + be_gc_memory_pools(vm); /* free unsued memory pools */ #if BE_USE_PERF_COUNTERS - if (vm->obshook != NULL) (*vm->obshook)(vm, BE_OBS_GC_END, vm->gc.usage, vm->counter_gc_kept, vm->counter_gc_freed); + size_t slors_used_after_gc, slots_allocated_after_gc; + be_gc_memory_pools_info(vm, &slors_used_after_gc, &slots_allocated_after_gc); + if (vm->obshook != NULL) (*vm->obshook)(vm, BE_OBS_GC_END, vm->gc.usage, vm->counter_gc_kept, vm->counter_gc_freed, + slors_used_before_gc, slots_allocated_before_gc, + slors_used_after_gc, slots_allocated_after_gc); #else if (vm->obshook != NULL) (*vm->obshook)(vm, BE_OBS_GC_END, vm->gc.usage); #endif diff --git a/lib/libesp32/berry/src/be_mem.c b/lib/libesp32/berry/src/be_mem.c index 9cfe364df..a41ff1092 100644 --- a/lib/libesp32/berry/src/be_mem.c +++ b/lib/libesp32/berry/src/be_mem.c @@ -26,6 +26,12 @@ #define realloc BE_EXPLICIT_REALLOC #endif +static void* malloc_from_pool(bvm *vm, size_t size); +static void free_from_pool(bvm *vm, void* ptr, size_t old_size); + +#define POOL16_SIZE 16 +#define POOL32_SIZE 32 + BERRY_API void* be_os_malloc(size_t size) { return malloc(size); @@ -41,39 +47,310 @@ BERRY_API void* be_os_realloc(void *ptr, size_t size) return realloc(ptr, size); } -static void* _realloc(void *ptr, size_t old_size, size_t new_size) -{ - if (old_size == new_size) { /* the block unchanged */ - return ptr; - } - if (ptr && new_size) { /* realloc block */ - return realloc(ptr, new_size); - } - if (new_size) { /* alloc a new block */ - be_assert(ptr == NULL && old_size == 0); - return malloc(new_size); - } - be_assert(new_size == 0); - -#if BE_USE_DEBUG_GC - memset(ptr, 0xFF, old_size); /* fill the structure with invalid pointers */ -#endif - free(ptr); - return NULL; -} - BERRY_API void* be_realloc(bvm *vm, void *ptr, size_t old_size, size_t new_size) { - void *block = _realloc(ptr, old_size, new_size); - if (!block && new_size) { /* allocation failure */ + void *block = NULL; + // serial_debug("be_realloc ptr=%p old_size=%i new_size=%i\n", ptr, old_size, new_size); + + bbool gc_occured = bfalse; /* if allocation failed, retry after forced GC */ + if (old_size == new_size) { /* the block unchanged, this also captures creation of a zero byte object */ + return ptr; + } + /* from now on, block == NULL means allocation failure */ + + while (1) { + /* Case 1: new allocation */ + if (!ptr || (old_size == 0)) { + block = malloc_from_pool(vm, new_size); + } + + /* Case 2: deallocate */ + else if (new_size == 0) { +#if BE_USE_DEBUG_GC + memset(ptr, 0xFF, old_size); /* fill the structure with invalid pointers */ +#endif + free_from_pool(vm, ptr, old_size); + break; /* early exit */ + } + + /* Case 3: reallocate with a different size */ + else if (new_size && old_size) { // TODO we already know they are not null TODO + if (new_size <= POOL32_SIZE || old_size <=POOL32_SIZE) { + /* complex case with different pools */ + if (new_size <= POOL16_SIZE && old_size <= POOL16_SIZE) { + // no change of slot + block = ptr; + break; + } else if (new_size > POOL16_SIZE && old_size > POOL16_SIZE && new_size <= POOL32_SIZE && old_size <= POOL32_SIZE) { + // no change of slot + block = ptr; + break; + } else { + /* one of the buffer is out of pool, the other not */ + block = malloc_from_pool(vm, new_size); + if (block) { + /* copy memory */ + size_t min_size = old_size < new_size ? old_size : new_size; + memmove(block, ptr, min_size); + // serial_debug("memmove from %p to %p size=%i\n", ptr, block, min_size); + free_from_pool(vm, ptr, old_size); + } + } + } else { + block = realloc(ptr, new_size); + // serial_debug("realloc from %p to %p size=%i", ptr, block, new_size); + } + } /* end of reallocation */ + + /* exit allocator, do we need to GC ? */ + if (block) { break; } /* all good */ + if (gc_occured) { /* already tried gc, can't do much anymore */ + be_throw(vm, BE_MALLOC_FAIL); /* lack of heap space */ + } + // serial_debug("be_realloc force_gc\n"); + /* force GC now */ vm->gc.status |= GC_ALLOC; be_gc_collect(vm); /* try to allocate again after GC */ vm->gc.status &= ~GC_ALLOC; - block = _realloc(ptr, old_size, new_size); - if (!block) { /* lack of heap space */ - be_throw(vm, BE_MALLOC_FAIL); - } + gc_occured = btrue; /* don't try again GC */ } vm->gc.usage = vm->gc.usage + new_size - old_size; /* update allocated count */ + + // serial_debug("be_realloc ret=%p\n", block); return block; } + +BERRY_API void* be_move_to_aligned(bvm *vm, void *ptr, size_t size) { +#if BE_USE_MEM_ALIGNED + if (size <= POOL32_SIZE) { + return ptr; /* if in memory pool, don't move it so be_free() will continue to work */ + } + void* iram = berry_malloc32(size); + if (iram) { + memcpy(iram, ptr, size); /* new_size is always smaller than initial mem zone */ + free(ptr); // TODO gc size is now wrong + return iram; + } +#endif + return ptr; +} + +/* Special allocator for structures under 32 bytes */ +typedef uint8_t mem16[16]; /* memory line of 16 bytes */ +typedef uint8_t mem32[32]; /* memory line of 32 bytes */ +#define POOL16_SLOTS 31 +#define POOL16_BITMAP_FULL ((1UL<gc.pool16; + while (pool16) { + /* look for an empty slot */ + if (pool16->bitmap != 0x0000) { + /* there is a free slot */ +#ifdef __GNUC__ + int bit = __builtin_ffs(pool16->bitmap) - 1; +#else + int bit = ffs(pool16->bitmap) - 1; +#endif + if (bit >= 0) { + /* we found a free slot */ + // bitClear(pool16->bitmap, bit); + pool16->bitmap &= ~(1UL << bit); + // serial_debug("malloc_from_pool found slot in pool %p, bit %i, ptr=%p\n", pool16, bit, &pool16->lines[bit]); + return &pool16->lines[bit]; + } + } + pool16 = pool16->next; + } + /* no slot available, we allocate a new pool */ + pool16 = (gc16_t*) malloc(sizeof(gc16_t)); + if (!pool16) { return NULL; } /* out of memory */ + pool16->next = vm->gc.pool16; + pool16->bitmap = POOL16_BITMAP_FULL - 1; /* allocate first line */ + vm->gc.pool16 = pool16; /* insert at head of linked list */ + // serial_debug("malloc_from_pool allocated new pool %p, size=%i p=%p\n", pool16, sizeof(gc16_t), &pool16->lines[0]); + return &pool16->lines[0]; + } + + if (size <= POOL32_SIZE) { + /* allocate in pool 32 */ + gc32_t* pool32 = vm->gc.pool32; + while (pool32) { + /* look for an empty slot */ + if (pool32->bitmap != 0x0000) { + /* there is a free slot */ +#ifdef __GNUC__ + int bit = __builtin_ffs(pool32->bitmap) - 1; +#else + int bit = ffs(pool32->bitmap) - 1; +#endif + if (bit >= 0) { + /* we found a free slot */ + // bitClear(pool32->bitmap, bit); + pool32->bitmap &= ~(1UL << bit); + // serial_debug("malloc_from_pool found slot in pool %p, bit %i, ptr=%p\n", pool32, bit, &pool32->lines[bit]); + return &pool32->lines[bit]; + } + } + pool32 = pool32->next; + } + /* no slot available, we allocate a new pool */ + pool32 = (gc32_t*) malloc(sizeof(gc32_t)); + if (!pool32) { return NULL; } /* out of memory */ + pool32->next = vm->gc.pool32; + pool32->bitmap = POOL32_BITMAP_FULL - 1; /* allocate first line */ + vm->gc.pool32 = pool32; /* insert at head of linked list */ + // serial_debug("malloc_from_pool allocated new pool %p, size=%i p=%p\n", pool32, sizeof(gc32_t), &pool32->lines[0]); + return &pool32->lines[0]; + } + + return malloc(size); /* default to system malloc */ +} + +static void free_from_pool(bvm *vm, void* ptr, size_t old_size) { + if (old_size <= POOL16_SIZE) { + gc16_t* pool16 = vm->gc.pool16; + while (pool16) { + int32_t offset = (uint8_t*)ptr - (uint8_t*) &pool16->lines[0]; + // serial_debug("free_from_pool ptr=%p pool=%p offset=%i\n", ptr,pool16, offset); + if ((offset >= 0) && (offset < POOL16_SLOTS*16) && ((offset & 0x0F) == 0)) { + int bit = offset >> 4; + // serial_debug("free_from_pool ptr=%p fond pool=%p bit=%i\n", ptr, pool16, bit); + // bitSet(pool16->bitmap, bit); + pool16->bitmap |= 1UL << bit; + return; + } + pool16 = pool16->next; + } + } + else if (old_size <= POOL32_SIZE) { + gc32_t* pool32 = vm->gc.pool32; + while (pool32) { + int32_t offset = (uint8_t*)ptr - (uint8_t*) &pool32->lines[0]; + // serial_debug("free_from_pool pool=%p offset=%i\n", pool32, offset); + if ((offset >= 0) && (offset < POOL16_SLOTS*16) && ((offset & 0x1F) == 0)) { + int bit = offset >> 5; + // serial_debug("free_from_pool ptr=%p fond pool=%p bit=%i\n", ptr, pool32, bit); + // bitSet(pool32->bitmap, bit); + pool32->bitmap |= 1UL << bit; + return; + } + pool32 = pool32->next; + } + } + else { + // serial_debug("free_from_pool free=%p\n", ptr); + free(ptr); + } +} + +BERRY_API void be_gc_memory_pools(bvm *vm) { + gc16_t** prev16 = &vm->gc.pool16; + gc16_t* pool16 = vm->gc.pool16; + while (pool16) { + if (pool16->bitmap == POOL16_BITMAP_FULL) { + /* pool is empty, we can free it */ + *prev16 = pool16->next; + gc16_t* pool_to_freed = pool16; + pool16 = pool16->next; /* move to next */ + free(pool_to_freed); + } else { + prev16 = &pool16->next; + pool16 = pool16->next; /* move to next */ + } + } + gc32_t** prev32 = &vm->gc.pool32; + gc32_t* pool32 = vm->gc.pool32; + while (pool32) { + if (pool32->bitmap == POOL32_BITMAP_FULL) { + /* pool is empty, we can free it */ + *prev32 = pool32->next; + gc32_t* pool_to_freed = pool32; + pool32 = pool32->next; /* move to next */ + free(pool_to_freed); + } else { + prev32 = &pool32->next; + pool32 = pool32->next; /* move to next */ + } + } +} + +BERRY_API void be_gc_init_memory_pools(bvm *vm) { + vm->gc.pool16 = NULL; + vm->gc.pool32 = NULL; +} + +BERRY_API void be_gc_free_memory_pools(bvm *vm) { + gc16_t* pool16 = vm->gc.pool16; + while (pool16) { + gc16_t* pool_to_freed = pool16; + pool16 = pool16->next; + be_os_free(pool_to_freed); + pool16 = pool16->next; + } + vm->gc.pool16 = NULL; + + gc32_t* pool32 = vm->gc.pool32; + while (pool32) { + gc32_t* pool_to_freed = pool32; + pool32 = pool32->next; + be_os_free(pool_to_freed); + pool32 = pool32->next; + } + vm->gc.pool32 = NULL; +} + +/* https://github.com/hcs0/Hackers-Delight/blob/master/pop.c.txt - count number of 1-bits */ +static int pop0(uint32_t n) { + n = (n & 0x55555555u) + ((n >> 1) & 0x55555555u); + n = (n & 0x33333333u) + ((n >> 2) & 0x33333333u); + n = (n & 0x0f0f0f0fu) + ((n >> 4) & 0x0f0f0f0fu); + n = (n & 0x00ff00ffu) + ((n >> 8) & 0x00ff00ffu); + n = (n & 0x0000ffffu) + ((n >>16) & 0x0000ffffu); + return n; +} + +#ifdef __GNUC__ + #define count_bits_1(v) __builtin_popcount(v) +#else + #define count_bits_1(v) pop0(v) +#endif + + +BERRY_API void be_gc_memory_pools_info(bvm *vm, size_t* slots_used, size_t* slots_allocated) { + size_t used = 0; + size_t allocated = 0; + + gc16_t* pool16 = vm->gc.pool16; + while (pool16) { + allocated += POOL16_SLOTS; + used += POOL16_SLOTS - count_bits_1(pool16->bitmap); + pool16 = pool16->next; + } + + gc32_t* pool32 = vm->gc.pool32; + while (pool32) { + allocated += POOL32_SLOTS; + used += POOL32_SLOTS - count_bits_1(pool32->bitmap); + pool32 = pool32->next; + } + if (slots_used) { *slots_used = used; } + if (slots_allocated) { *slots_allocated = allocated; } +} \ No newline at end of file diff --git a/lib/libesp32/berry/src/be_mem.h b/lib/libesp32/berry/src/be_mem.h index 88d305862..9545cec49 100644 --- a/lib/libesp32/berry/src/be_mem.h +++ b/lib/libesp32/berry/src/be_mem.h @@ -21,6 +21,14 @@ BERRY_API void* be_os_malloc(size_t size); BERRY_API void be_os_free(void *ptr); BERRY_API void* be_os_realloc(void *ptr, size_t size); BERRY_API void* be_realloc(bvm *vm, void *ptr, size_t old_size, size_t new_size); +BERRY_API void be_gc_memory_pools(bvm *vm); +BERRY_API void be_gc_free_memory_pools(bvm *vm); +BERRY_API void be_gc_init_memory_pools(bvm *vm); +BERRY_API void be_gc_memory_pools_info(bvm *vm, size_t* slots_used, size_t* slots_allocated); + +/* The following moves a portion of memory to constraint regions with 32-bits read/write acess */ +/* Effective only if `BE_USE_MEM_ALIGNED` is set to `1`*/ +BERRY_API void* be_move_to_aligned(bvm *vm, void *ptr, size_t size); #ifdef __cplusplus } diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index ba5b408d8..dd16c68d7 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -312,16 +312,23 @@ static void end_func(bparser *parser) be_code_ret(finfo, NULL); /* append a return to last code */ end_block(parser); /* close block */ setupvals(finfo); /* close upvals */ - proto->code = be_vector_release_32(vm, &finfo->code); /* compact all vectors and return NULL if empty */ + proto->code = be_vector_release(vm, &finfo->code); /* compact all vectors and return NULL if empty */ proto->codesize = finfo->pc; - proto->ktab = be_vector_release_32(vm, &finfo->kvec); + proto->ktab = be_vector_release(vm, &finfo->kvec); proto->nconst = be_vector_count(&finfo->kvec); proto->ptab = be_vector_release(vm, &finfo->pvec); proto->nproto = be_vector_count(&finfo->pvec); +#if BE_USE_MEM_ALIGNED + proto->code = be_move_to_aligned(vm, proto->code, proto->codesize * sizeof(binstruction)); /* move `code` to 4-bytes aligned memory region */ + proto->ktab = be_move_to_aligned(vm, proto->ktab, proto->nconst * sizeof(bvalue)); /* move `ktab` to 4-bytes aligned memory region */ +#endif /* BE_USE_MEM_ALIGNED */ #if BE_DEBUG_RUNTIME_INFO - proto->lineinfo = be_vector_release_32(vm, &finfo->linevec); + proto->lineinfo = be_vector_release(vm, &finfo->linevec); /* move `lineinfo` to 4-bytes aligned memory region */ proto->nlineinfo = be_vector_count(&finfo->linevec); -#endif +#if BE_USE_MEM_ALIGNED + proto->lineinfo = be_move_to_aligned(vm, proto->lineinfo, proto->nlineinfo * sizeof(blineinfo)); +#endif /* BE_USE_MEM_ALIGNED */ +#endif /* BE_DEBUG_RUNTIME_INFO */ #if BE_DEBUG_VAR_INFO proto->varinfo = be_vector_release(vm, &finfo->varvec); proto->nvarinfo = be_vector_count(&finfo->varvec); diff --git a/lib/libesp32/berry/src/be_vector.c b/lib/libesp32/berry/src/be_vector.c index 63cbeff3c..65ac83350 100644 --- a/lib/libesp32/berry/src/be_vector.c +++ b/lib/libesp32/berry/src/be_vector.c @@ -114,32 +114,6 @@ void* be_vector_release(bvm *vm, bvector *vector) return vector->data; } -/* free not used */ -void* be_vector_release_32(bvm *vm, bvector *vector) -{ - size_t size = vector->size; - int count = be_vector_count(vector); - if (count == 0) { - be_free(vm, vector->data, vector->capacity * size); - vector->capacity = 0; - vector->data = NULL; - vector->end = NULL; - } else if (count < vector->capacity) { - vector->data = be_realloc(vm, - vector->data, vector->capacity * size, count * size); // TODO - can we skip that step? - void* iram = berry_malloc32(count * size); - if (iram) { - memcpy(iram, vector->data, count * size); - free(vector->data); - vector->data = iram; - } - // vm->gc.usage = vm->gc.usage + count * size - vector->capacity * size; /* update allocated count */ - vector->end = (char*)vector->data + ((size_t)count - 1) * size; - vector->capacity = count; - } - return vector->data; -} - /* use binary search to find the vector capacity between 0-1024 */ static int binary_search(int value) { diff --git a/lib/libesp32/berry/src/be_vm.c b/lib/libesp32/berry/src/be_vm.c index 622930526..75c94d0fb 100644 --- a/lib/libesp32/berry/src/be_vm.c +++ b/lib/libesp32/berry/src/be_vm.c @@ -491,6 +491,7 @@ BERRY_API void be_vm_delete(bvm *vm) be_stack_delete(vm, &vm->tracestack); be_free(vm, vm->stack, (vm->stacktop - vm->stack) * sizeof(bvalue)); be_globalvar_deinit(vm); + be_gc_free_memory_pools(vm); #if BE_USE_DEBUG_HOOK /* free native hook */ if (var_istype(&vm->hook, BE_COMPTR)) @@ -904,7 +905,11 @@ newframe: /* a new call frame */ if (var_isinstance(a) && var_isstr(b)) { binstance *obj = var_toobj(a); bstring *attr = var_tostr(b); - if (!be_instance_setmember(vm, obj, attr, c)) { + bvalue result = *c; + if (var_isfunction(&result)) { + var_markstatic(&result); + } + if (!be_instance_setmember(vm, obj, attr, &result)) { reg = vm->reg; vm_error(vm, "attribute_error", "class '%s' cannot assign to attribute '%s'", diff --git a/lib/libesp32/berry/src/be_vm.h b/lib/libesp32/berry/src/be_vm.h index 35176cead..97d5a04d1 100644 --- a/lib/libesp32/berry/src/be_vm.h +++ b/lib/libesp32/berry/src/be_vm.h @@ -46,10 +46,14 @@ typedef struct { int status; } bcallframe; +struct gc16_t; /* memory pool for 0-16 bytes or less objects */ +struct gc32_t; /* memory pool for 17-32 bytes */ struct bgc { bgcobject *list; /* the GC-object list */ bgcobject *gray; /* the gray object list */ bgcobject *fixed; /* the fixed objecct list */ + struct gc16_t* pool16; + struct gc32_t* pool32; size_t usage; /* the count of bytes currently allocated */ size_t threshold; /* he threshold of allocation for the next GC */ bbyte steprate; /* the rate of increase in the distribution between two GCs (percentage) */ @@ -80,7 +84,6 @@ struct bupval { } u; int refcnt; }; - struct bvm { bglobaldesc gbldesc; /* global description */ bvalue *stack; /* stack space */ diff --git a/lib/libesp32/berry_tasmota/src/be_hue_bridge_lib.c b/lib/libesp32/berry_tasmota/src/be_hue_bridge_lib.c index bda0f8ca7..eaffff5b2 100644 --- a/lib/libesp32/berry_tasmota/src/be_hue_bridge_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_hue_bridge_lib.c @@ -6,6 +6,363 @@ #if defined(USE_EMULATION) && defined(USE_EMULATION_HUE) +/******************************************************************** +** Solidified function: full_status +********************************************************************/ +be_local_closure(hue_bridge_monad_full_status, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str(hue_ntv), + /* K1 */ be_nested_str(lights), + /* K2 */ be_nested_str(contains), + /* K3 */ be_nested_str(full_state), + /* K4 */ be_nested_str(light), + /* K5 */ be_nested_str(name), + /* K6 */ be_nested_str(model), + /* K7 */ be_nested_str(manuf), + }), + &be_const_str_full_status, + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x5C140200, // 0003 MOVE R5 R1 + 0x7C0C0400, // 0004 CALL R3 2 + 0x780E0009, // 0005 JMPF R3 #0010 + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x940C0601, // 0007 GETIDX R3 R3 R1 + 0x8C100503, // 0008 GETMET R4 R2 K3 + 0x5C180200, // 0009 MOVE R6 R1 + 0x941C0704, // 000A GETIDX R7 R3 K4 + 0x94200705, // 000B GETIDX R8 R3 K5 + 0x94240706, // 000C GETIDX R9 R3 K6 + 0x94280707, // 000D GETIDX R10 R3 K7 + 0x7C100C00, // 000E CALL R4 6 + 0x80040800, // 000F RET 1 R4 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: hue_status +********************************************************************/ +be_local_closure(hue_bridge_monad_hue_status, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str(hue_ntv), + /* K1 */ be_nested_str(lights), + /* K2 */ be_nested_str(contains), + /* K3 */ be_nested_str(light_state), + /* K4 */ be_nested_str(light), + }), + &be_const_str_hue_status, + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x5C140200, // 0003 MOVE R5 R1 + 0x7C0C0400, // 0004 CALL R3 2 + 0x780E0005, // 0005 JMPF R3 #000C + 0x8C0C0503, // 0006 GETMET R3 R2 K3 + 0x88140101, // 0007 GETMBR R5 R0 K1 + 0x94140A01, // 0008 GETIDX R5 R5 R1 + 0x94140B04, // 0009 GETIDX R5 R5 K4 + 0x7C0C0400, // 000A CALL R3 2 + 0x80040600, // 000B RET 1 R3 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_light +********************************************************************/ +be_local_closure(hue_bridge_monad_add_light, /* name */ + be_nested_proto( + 10, /* nstack */ + 6, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str(int), + /* K1 */ be_nested_str(value_error), + /* K2 */ be_nested_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27), + /* K3 */ be_nested_str(light_state), + /* K4 */ be_nested_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str(missing_X20name), + /* K7 */ be_nested_str(Unknown), + /* K8 */ be_nested_str(Tasmota), + /* K9 */ be_nested_str(lights), + /* K10 */ be_nested_str(light), + /* K11 */ be_nested_str(name), + /* K12 */ be_nested_str(model), + /* K13 */ be_nested_str(manuf), + }), + &be_const_str_add_light, + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0x60180004, // 0000 GETGBL R6 G4 + 0x5C1C0200, // 0001 MOVE R7 R1 + 0x7C180200, // 0002 CALL R6 1 + 0x20180D00, // 0003 NE R6 R6 K0 + 0x781A0000, // 0004 JMPF R6 #0006 + 0xB0060302, // 0005 RAISE 1 K1 K2 + 0x6018000F, // 0006 GETGBL R6 G15 + 0x5C1C0400, // 0007 MOVE R7 R2 + 0xB8220600, // 0008 GETNGBL R8 K3 + 0x7C180400, // 0009 CALL R6 2 + 0x741A0000, // 000A JMPT R6 #000C + 0xB0060304, // 000B RAISE 1 K1 K4 + 0x60180008, // 000C GETGBL R6 G8 + 0x5C1C0600, // 000D MOVE R7 R3 + 0x7C180200, // 000E CALL R6 1 + 0x5C0C0C00, // 000F MOVE R3 R6 + 0x6018000C, // 0010 GETGBL R6 G12 + 0x5C1C0600, // 0011 MOVE R7 R3 + 0x7C180200, // 0012 CALL R6 1 + 0x1C180D05, // 0013 EQ R6 R6 K5 + 0x781A0000, // 0014 JMPF R6 #0016 + 0xB0060306, // 0015 RAISE 1 K1 K6 + 0x5C180800, // 0016 MOVE R6 R4 + 0x741A0000, // 0017 JMPT R6 #0019 + 0x58100007, // 0018 LDCONST R4 K7 + 0x5C180A00, // 0019 MOVE R6 R5 + 0x741A0000, // 001A JMPT R6 #001C + 0x58140008, // 001B LDCONST R5 K8 + 0x88180109, // 001C GETMBR R6 R0 K9 + 0x601C0013, // 001D GETGBL R7 G19 + 0x7C1C0000, // 001E CALL R7 0 + 0x981E1402, // 001F SETIDX R7 K10 R2 + 0x981E1603, // 0020 SETIDX R7 K11 R3 + 0x60200008, // 0021 GETGBL R8 G8 + 0x5C240800, // 0022 MOVE R9 R4 + 0x7C200200, // 0023 CALL R8 1 + 0x981E1808, // 0024 SETIDX R7 K12 R8 + 0x60200008, // 0025 GETGBL R8 G8 + 0x5C240A00, // 0026 MOVE R9 R5 + 0x7C200200, // 0027 CALL R8 1 + 0x981E1A08, // 0028 SETIDX R7 K13 R8 + 0x98180207, // 0029 SETIDX R6 R1 R7 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_light +********************************************************************/ +be_local_closure(hue_bridge_monad_remove_light, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str(lights), + /* K1 */ be_nested_str(remove), + }), + &be_const_str_remove_light, + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(hue_bridge_monad_init, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str(lights), + }), + &be_const_str_init, + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040013, // 0000 GETGBL R1 G19 + 0x7C040000, // 0001 CALL R1 0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: discover +********************************************************************/ +be_local_closure(hue_bridge_monad_discover, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str(hue_ntv), + /* K1 */ be_nested_str(json), + /* K2 */ be_nested_str(string), + /* K3 */ be_nested_str(lights), + /* K4 */ be_nested_str(keys), + /* K5 */ be_nested_str(full_status), + /* K6 */ be_nested_str(_X22), + /* K7 */ be_nested_str(_X22_X3A), + /* K8 */ be_nested_str(push), + /* K9 */ be_nested_str(stop_iteration), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str(concat), + /* K12 */ be_nested_str(_X2C), + }), + &be_const_str_discover, + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0xA40E0400, // 0002 IMPORT R3 K2 + 0x60100012, // 0003 GETGBL R4 G18 + 0x7C100000, // 0004 CALL R4 0 + 0x60140010, // 0005 GETGBL R5 G16 + 0x88180103, // 0006 GETMBR R6 R0 K3 + 0x8C180D04, // 0007 GETMET R6 R6 K4 + 0x7C180200, // 0008 CALL R6 1 + 0x7C140200, // 0009 CALL R5 1 + 0xA802000F, // 000A EXBLK 0 #001B + 0x5C180A00, // 000B MOVE R6 R5 + 0x7C180000, // 000C CALL R6 0 + 0x8C1C0105, // 000D GETMET R7 R0 K5 + 0x5C240C00, // 000E MOVE R9 R6 + 0x7C1C0400, // 000F CALL R7 2 + 0x781E0008, // 0010 JMPF R7 #001A + 0x60200008, // 0011 GETGBL R8 G8 + 0x5C240C00, // 0012 MOVE R9 R6 + 0x7C200200, // 0013 CALL R8 1 + 0x00220C08, // 0014 ADD R8 K6 R8 + 0x00201107, // 0015 ADD R8 R8 K7 + 0x001C1007, // 0016 ADD R7 R8 R7 + 0x8C200908, // 0017 GETMET R8 R4 K8 + 0x5C280E00, // 0018 MOVE R10 R7 + 0x7C200400, // 0019 CALL R8 2 + 0x7001FFEF, // 001A JMP #000B + 0x58140009, // 001B LDCONST R5 K9 + 0xAC140200, // 001C CATCH R5 1 0 + 0xB0080000, // 001D RAISE 2 R0 R0 + 0x6014000C, // 001E GETGBL R5 G12 + 0x5C180800, // 001F MOVE R6 R4 + 0x7C140200, // 0020 CALL R5 1 + 0x24140B0A, // 0021 GT R5 R5 K10 + 0x78160003, // 0022 JMPF R5 #0027 + 0x8C14090B, // 0023 GETMET R5 R4 K11 + 0x581C000C, // 0024 LDCONST R7 K12 + 0x7C140400, // 0025 CALL R5 2 + 0x80040A00, // 0026 RET 1 R5 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: light_to_id +********************************************************************/ +be_local_closure(hue_bridge_monad_light_to_id, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str(lights), + /* K1 */ be_nested_str(keys), + /* K2 */ be_nested_str(light), + /* K3 */ be_nested_str(stop_iteration), + }), + &be_const_str_light_to_id, + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x60080010, // 0000 GETGBL R2 G16 + 0x880C0100, // 0001 GETMBR R3 R0 K0 + 0x8C0C0701, // 0002 GETMET R3 R3 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x7C080200, // 0004 CALL R2 1 + 0xA8020009, // 0005 EXBLK 0 #0010 + 0x5C0C0400, // 0006 MOVE R3 R2 + 0x7C0C0000, // 0007 CALL R3 0 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x94100803, // 0009 GETIDX R4 R4 R3 + 0x94100902, // 000A GETIDX R4 R4 K2 + 0x1C100204, // 000B EQ R4 R1 R4 + 0x78120001, // 000C JMPF R4 #000F + 0xA8040001, // 000D EXBLK 1 1 + 0x80040600, // 000E RET 1 R3 + 0x7001FFF5, // 000F JMP #0006 + 0x58080003, // 0010 LDCONST R2 K3 + 0xAC080200, // 0011 CATCH R2 1 0 + 0xB0080000, // 0012 RAISE 2 R0 R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: cmd ********************************************************************/ @@ -228,37 +585,6 @@ be_local_closure(hue_bridge_monad_cmd, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: remove_light -********************************************************************/ -be_local_closure(hue_bridge_monad_remove_light, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str(lights), - /* K1 */ be_nested_str(remove), - }), - &be_const_str_remove_light, - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: groups ********************************************************************/ @@ -322,301 +648,24 @@ be_local_closure(hue_bridge_monad_groups, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: hue_status -********************************************************************/ -be_local_closure(hue_bridge_monad_hue_status, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str(hue_ntv), - /* K1 */ be_nested_str(lights), - /* K2 */ be_nested_str(contains), - /* K3 */ be_nested_str(light_state), - /* K4 */ be_nested_str(light), - }), - &be_const_str_hue_status, - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x8C0C0702, // 0002 GETMET R3 R3 K2 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C0C0400, // 0004 CALL R3 2 - 0x780E0005, // 0005 JMPF R3 #000C - 0x8C0C0503, // 0006 GETMET R3 R2 K3 - 0x88140101, // 0007 GETMBR R5 R0 K1 - 0x94140A01, // 0008 GETIDX R5 R5 R1 - 0x94140B04, // 0009 GETIDX R5 R5 K4 - 0x7C0C0400, // 000A CALL R3 2 - 0x80040600, // 000B RET 1 R3 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_light -********************************************************************/ -be_local_closure(hue_bridge_monad_add_light, /* name */ - be_nested_proto( - 10, /* nstack */ - 6, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str(int), - /* K1 */ be_nested_str(value_error), - /* K2 */ be_nested_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27), - /* K3 */ be_nested_str(light_state), - /* K4 */ be_nested_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str(missing_X20name), - /* K7 */ be_nested_str(Unknown), - /* K8 */ be_nested_str(Tasmota), - /* K9 */ be_nested_str(lights), - /* K10 */ be_nested_str(light), - /* K11 */ be_nested_str(name), - /* K12 */ be_nested_str(model), - /* K13 */ be_nested_str(manuf), - }), - &be_const_str_add_light, - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x60180004, // 0000 GETGBL R6 G4 - 0x5C1C0200, // 0001 MOVE R7 R1 - 0x7C180200, // 0002 CALL R6 1 - 0x20180D00, // 0003 NE R6 R6 K0 - 0x781A0000, // 0004 JMPF R6 #0006 - 0xB0060302, // 0005 RAISE 1 K1 K2 - 0x6018000F, // 0006 GETGBL R6 G15 - 0x5C1C0400, // 0007 MOVE R7 R2 - 0xB8220600, // 0008 GETNGBL R8 K3 - 0x7C180400, // 0009 CALL R6 2 - 0x741A0000, // 000A JMPT R6 #000C - 0xB0060304, // 000B RAISE 1 K1 K4 - 0x60180008, // 000C GETGBL R6 G8 - 0x5C1C0600, // 000D MOVE R7 R3 - 0x7C180200, // 000E CALL R6 1 - 0x5C0C0C00, // 000F MOVE R3 R6 - 0x6018000C, // 0010 GETGBL R6 G12 - 0x5C1C0600, // 0011 MOVE R7 R3 - 0x7C180200, // 0012 CALL R6 1 - 0x1C180D05, // 0013 EQ R6 R6 K5 - 0x781A0000, // 0014 JMPF R6 #0016 - 0xB0060306, // 0015 RAISE 1 K1 K6 - 0x5C180800, // 0016 MOVE R6 R4 - 0x741A0000, // 0017 JMPT R6 #0019 - 0x58100007, // 0018 LDCONST R4 K7 - 0x5C180A00, // 0019 MOVE R6 R5 - 0x741A0000, // 001A JMPT R6 #001C - 0x58140008, // 001B LDCONST R5 K8 - 0x88180109, // 001C GETMBR R6 R0 K9 - 0x601C0013, // 001D GETGBL R7 G19 - 0x7C1C0000, // 001E CALL R7 0 - 0x981E1402, // 001F SETIDX R7 K10 R2 - 0x981E1603, // 0020 SETIDX R7 K11 R3 - 0x60200008, // 0021 GETGBL R8 G8 - 0x5C240800, // 0022 MOVE R9 R4 - 0x7C200200, // 0023 CALL R8 1 - 0x981E1808, // 0024 SETIDX R7 K12 R8 - 0x60200008, // 0025 GETGBL R8 G8 - 0x5C240A00, // 0026 MOVE R9 R5 - 0x7C200200, // 0027 CALL R8 1 - 0x981E1A08, // 0028 SETIDX R7 K13 R8 - 0x98180207, // 0029 SETIDX R6 R1 R7 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(hue_bridge_monad_init, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str(lights), - }), - &be_const_str_init, - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040013, // 0000 GETGBL R1 G19 - 0x7C040000, // 0001 CALL R1 0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: discover -********************************************************************/ -be_local_closure(hue_bridge_monad_discover, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str(hue_ntv), - /* K1 */ be_nested_str(json), - /* K2 */ be_nested_str(string), - /* K3 */ be_nested_str(lights), - /* K4 */ be_nested_str(keys), - /* K5 */ be_nested_str(full_status), - /* K6 */ be_nested_str(_X22), - /* K7 */ be_nested_str(_X22_X3A), - /* K8 */ be_nested_str(push), - /* K9 */ be_nested_str(stop_iteration), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str(concat), - /* K12 */ be_nested_str(_X2C), - }), - &be_const_str_discover, - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0xA40E0400, // 0002 IMPORT R3 K2 - 0x60100012, // 0003 GETGBL R4 G18 - 0x7C100000, // 0004 CALL R4 0 - 0x60140010, // 0005 GETGBL R5 G16 - 0x88180103, // 0006 GETMBR R6 R0 K3 - 0x8C180D04, // 0007 GETMET R6 R6 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x7C140200, // 0009 CALL R5 1 - 0xA802000F, // 000A EXBLK 0 #001B - 0x5C180A00, // 000B MOVE R6 R5 - 0x7C180000, // 000C CALL R6 0 - 0x8C1C0105, // 000D GETMET R7 R0 K5 - 0x5C240C00, // 000E MOVE R9 R6 - 0x7C1C0400, // 000F CALL R7 2 - 0x781E0008, // 0010 JMPF R7 #001A - 0x60200008, // 0011 GETGBL R8 G8 - 0x5C240C00, // 0012 MOVE R9 R6 - 0x7C200200, // 0013 CALL R8 1 - 0x00220C08, // 0014 ADD R8 K6 R8 - 0x00201107, // 0015 ADD R8 R8 K7 - 0x001C1007, // 0016 ADD R7 R8 R7 - 0x8C200908, // 0017 GETMET R8 R4 K8 - 0x5C280E00, // 0018 MOVE R10 R7 - 0x7C200400, // 0019 CALL R8 2 - 0x7001FFEF, // 001A JMP #000B - 0x58140009, // 001B LDCONST R5 K9 - 0xAC140200, // 001C CATCH R5 1 0 - 0xB0080000, // 001D RAISE 2 R0 R0 - 0x6014000C, // 001E GETGBL R5 G12 - 0x5C180800, // 001F MOVE R6 R4 - 0x7C140200, // 0020 CALL R5 1 - 0x24140B0A, // 0021 GT R5 R5 K10 - 0x78160003, // 0022 JMPF R5 #0027 - 0x8C14090B, // 0023 GETMET R5 R4 K11 - 0x581C000C, // 0024 LDCONST R7 K12 - 0x7C140400, // 0025 CALL R5 2 - 0x80040A00, // 0026 RET 1 R5 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: full_status -********************************************************************/ -be_local_closure(hue_bridge_monad_full_status, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str(hue_ntv), - /* K1 */ be_nested_str(lights), - /* K2 */ be_nested_str(contains), - /* K3 */ be_nested_str(full_state), - /* K4 */ be_nested_str(light), - /* K5 */ be_nested_str(name), - /* K6 */ be_nested_str(model), - /* K7 */ be_nested_str(manuf), - }), - &be_const_str_full_status, - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x8C0C0702, // 0002 GETMET R3 R3 K2 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C0C0400, // 0004 CALL R3 2 - 0x780E0009, // 0005 JMPF R3 #0010 - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x940C0601, // 0007 GETIDX R3 R3 R1 - 0x8C100503, // 0008 GETMET R4 R2 K3 - 0x5C180200, // 0009 MOVE R6 R1 - 0x941C0704, // 000A GETIDX R7 R3 K4 - 0x94200705, // 000B GETIDX R8 R3 K5 - 0x94240706, // 000C GETIDX R9 R3 K6 - 0x94280707, // 000D GETIDX R10 R3 K7 - 0x7C100C00, // 000E CALL R4 6 - 0x80040800, // 000F RET 1 R4 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: hue_bridge_monad ********************************************************************/ be_local_class(hue_bridge_monad, 1, NULL, - be_nested_map(9, + be_nested_map(10, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(lights, 1), be_const_var(0) }, - { be_const_key(groups, -1), be_const_closure(hue_bridge_monad_groups_closure) }, - { be_const_key(remove_light, 3), be_const_closure(hue_bridge_monad_remove_light_closure) }, - { be_const_key(discover, -1), be_const_closure(hue_bridge_monad_discover_closure) }, + { be_const_key(lights, -1), be_const_var(0) }, + { be_const_key(groups, 6), be_const_closure(hue_bridge_monad_groups_closure) }, { be_const_key(hue_status, -1), be_const_closure(hue_bridge_monad_hue_status_closure) }, { be_const_key(add_light, -1), be_const_closure(hue_bridge_monad_add_light_closure) }, - { be_const_key(cmd, 7), be_const_closure(hue_bridge_monad_cmd_closure) }, + { be_const_key(remove_light, 8), be_const_closure(hue_bridge_monad_remove_light_closure) }, { be_const_key(init, -1), be_const_closure(hue_bridge_monad_init_closure) }, - { be_const_key(full_status, -1), be_const_closure(hue_bridge_monad_full_status_closure) }, + { be_const_key(cmd, -1), be_const_closure(hue_bridge_monad_cmd_closure) }, + { be_const_key(light_to_id, -1), be_const_closure(hue_bridge_monad_light_to_id_closure) }, + { be_const_key(discover, -1), be_const_closure(hue_bridge_monad_discover_closure) }, + { be_const_key(full_status, 1), be_const_closure(hue_bridge_monad_full_status_closure) }, })), be_str_literal("hue_bridge_monad") ); diff --git a/lib/libesp32/berry_tasmota/src/be_mqtt_lib.cpp b/lib/libesp32/berry_tasmota/src/be_mqtt_lib.cpp new file mode 100644 index 000000000..8ec29eb69 --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/be_mqtt_lib.cpp @@ -0,0 +1,21 @@ +/******************************************************************** + * Berry module `mqtt` + * + *******************************************************************/ + +#include "be_constobj.h" +#include "be_mapping.h" + +extern int be_mqtt_publish(bvm *vm); + +extern void be_mqtt_subscribe(const char* topic); BE_FUNC_CTYPE_DECLARE(be_mqtt_subscribe, "", "s") +extern void be_mqtt_unsubscribe(const char* topic); BE_FUNC_CTYPE_DECLARE(be_mqtt_unsubscribe, "", "s") + +/* @const_object_info_begin +module mqtt (scope: global) { + publish, func(be_mqtt_publish) + subscribe, ctype_func(be_mqtt_subscribe) + unsubscribe, ctype_func(be_mqtt_unsubscribe) +} +@const_object_info_end */ +#include "be_fixed_mqtt.h" diff --git a/lib/libesp32/berry_tasmota/src/be_tasmotalib.c b/lib/libesp32/berry_tasmota/src/be_tasmotalib.c index 413273790..33c72ecc4 100644 --- a/lib/libesp32/berry_tasmota/src/be_tasmotalib.c +++ b/lib/libesp32/berry_tasmota/src/be_tasmotalib.c @@ -487,8 +487,8 @@ be_local_closure(Tasmota_exec_tele, /* name */ /* K6 */ be_nested_str(Tele), /* K7 */ be_const_int(0), /* K8 */ be_nested_str(try_rule), - /* K9 */ be_nested_str(k), - /* K10 */ be_nested_str(v), + /* K9 */ be_nested_str(trig), + /* K10 */ be_nested_str(f), /* K11 */ be_const_int(1), }), &be_const_str_exec_tele, @@ -559,7 +559,7 @@ be_local_closure(Tasmota_run_deferred, /* name */ /* K1 */ be_const_int(0), /* K2 */ be_nested_str(size), /* K3 */ be_nested_str(time_reached), - /* K4 */ be_nested_str(due), + /* K4 */ be_nested_str(trig), /* K5 */ be_nested_str(f), /* K6 */ be_nested_str(remove), /* K7 */ be_const_int(1), @@ -1123,45 +1123,51 @@ be_local_closure(Tasmota_time_str, /* name */ ********************************************************************/ be_local_closure(Tasmota_remove_rule, /* name */ be_nested_proto( - 6, /* nstack */ - 2, /* argc */ + 7, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str(_rules), /* K1 */ be_const_int(0), - /* K2 */ be_nested_str(k), - /* K3 */ be_nested_str(remove), - /* K4 */ be_const_int(1), + /* K2 */ be_nested_str(trig), + /* K3 */ be_nested_str(id), + /* K4 */ be_nested_str(remove), + /* K5 */ be_const_int(1), }), &be_const_str_remove_rule, &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0011, // 0001 JMPF R2 #0014 - 0x58080001, // 0002 LDCONST R2 K1 - 0x600C000C, // 0003 GETGBL R3 G12 - 0x88100100, // 0004 GETMBR R4 R0 K0 - 0x7C0C0200, // 0005 CALL R3 1 - 0x140C0403, // 0006 LT R3 R2 R3 - 0x780E000B, // 0007 JMPF R3 #0014 - 0x880C0100, // 0008 GETMBR R3 R0 K0 - 0x940C0602, // 0009 GETIDX R3 R3 R2 - 0x880C0702, // 000A GETMBR R3 R3 K2 - 0x1C0C0601, // 000B EQ R3 R3 R1 - 0x780E0004, // 000C JMPF R3 #0012 - 0x880C0100, // 000D GETMBR R3 R0 K0 - 0x8C0C0703, // 000E GETMET R3 R3 K3 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x70020000, // 0011 JMP #0013 - 0x00080504, // 0012 ADD R2 R2 K4 - 0x7001FFEE, // 0013 JMP #0003 - 0x80000000, // 0014 RET 0 + ( &(const binstruction[26]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x780E0016, // 0001 JMPF R3 #0019 + 0x580C0001, // 0002 LDCONST R3 K1 + 0x6010000C, // 0003 GETGBL R4 G12 + 0x88140100, // 0004 GETMBR R5 R0 K0 + 0x7C100200, // 0005 CALL R4 1 + 0x14100604, // 0006 LT R4 R3 R4 + 0x78120010, // 0007 JMPF R4 #0019 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x94100803, // 0009 GETIDX R4 R4 R3 + 0x88100902, // 000A GETMBR R4 R4 K2 + 0x1C100801, // 000B EQ R4 R4 R1 + 0x78120009, // 000C JMPF R4 #0017 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x94100803, // 000E GETIDX R4 R4 R3 + 0x88100903, // 000F GETMBR R4 R4 K3 + 0x1C100802, // 0010 EQ R4 R4 R2 + 0x78120004, // 0011 JMPF R4 #0017 + 0x88100100, // 0012 GETMBR R4 R0 K0 + 0x8C100904, // 0013 GETMET R4 R4 K4 + 0x5C180600, // 0014 MOVE R6 R3 + 0x7C100400, // 0015 CALL R4 2 + 0x70020000, // 0016 JMP #0018 + 0x000C0705, // 0017 ADD R3 R3 K5 + 0x7001FFE9, // 0018 JMP #0003 + 0x80000000, // 0019 RET 0 }) ) ); @@ -1550,8 +1556,8 @@ be_local_closure(Tasmota_add_cmd, /* name */ ********************************************************************/ be_local_closure(Tasmota_add_rule, /* name */ be_nested_proto( - 9, /* nstack */ - 3, /* argc */ + 10, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1563,36 +1569,37 @@ be_local_closure(Tasmota_add_rule, /* name */ /* K1 */ be_nested_str(_rules), /* K2 */ be_nested_str(function), /* K3 */ be_nested_str(push), - /* K4 */ be_nested_str(kv), + /* K4 */ be_nested_str(Trigger), /* K5 */ be_nested_str(value_error), /* K6 */ be_nested_str(the_X20second_X20argument_X20is_X20not_X20a_X20function), }), &be_const_str_add_rule, &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0x8C0C0100, // 0000 GETMET R3 R0 K0 - 0x5C140400, // 0001 MOVE R5 R2 - 0x7C0C0400, // 0002 CALL R3 2 - 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x740E0002, // 0004 JMPT R3 #0008 - 0x600C0012, // 0005 GETGBL R3 G18 - 0x7C0C0000, // 0006 CALL R3 0 - 0x90020203, // 0007 SETMBR R0 K1 R3 - 0x600C0004, // 0008 GETGBL R3 G4 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x1C0C0702, // 000B EQ R3 R3 K2 - 0x780E0007, // 000C JMPF R3 #0015 - 0x880C0101, // 000D GETMBR R3 R0 K1 - 0x8C0C0703, // 000E GETMET R3 R3 K3 - 0x8C140104, // 000F GETMET R5 R0 K4 + ( &(const binstruction[24]) { /* code */ + 0x8C100100, // 0000 GETMET R4 R0 K0 + 0x5C180400, // 0001 MOVE R6 R2 + 0x7C100400, // 0002 CALL R4 2 + 0x88100101, // 0003 GETMBR R4 R0 K1 + 0x74120002, // 0004 JMPT R4 #0008 + 0x60100012, // 0005 GETGBL R4 G18 + 0x7C100000, // 0006 CALL R4 0 + 0x90020204, // 0007 SETMBR R0 K1 R4 + 0x60100004, // 0008 GETGBL R4 G4 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C100200, // 000A CALL R4 1 + 0x1C100902, // 000B EQ R4 R4 K2 + 0x78120008, // 000C JMPF R4 #0016 + 0x88100101, // 000D GETMBR R4 R0 K1 + 0x8C100903, // 000E GETMET R4 R4 K3 + 0xB81A0800, // 000F GETNGBL R6 K4 0x5C1C0200, // 0010 MOVE R7 R1 0x5C200400, // 0011 MOVE R8 R2 - 0x7C140600, // 0012 CALL R5 3 - 0x7C0C0400, // 0013 CALL R3 2 - 0x70020000, // 0014 JMP #0016 - 0xB0060B06, // 0015 RAISE 1 K5 K6 - 0x80000000, // 0016 RET 0 + 0x5C240600, // 0012 MOVE R9 R3 + 0x7C180600, // 0013 CALL R6 3 + 0x7C100400, // 0014 CALL R4 2 + 0x70020000, // 0015 JMP #0017 + 0xB0060B06, // 0016 RAISE 1 K5 K6 + 0x80000000, // 0017 RET 0 }) ) ); @@ -1622,8 +1629,8 @@ be_local_closure(Tasmota_exec_rules, /* name */ /* K6 */ be_const_int(3), /* K7 */ be_const_int(0), /* K8 */ be_nested_str(try_rule), - /* K9 */ be_nested_str(k), - /* K10 */ be_nested_str(v), + /* K9 */ be_nested_str(trig), + /* K10 */ be_nested_str(f), /* K11 */ be_const_int(1), }), &be_const_str_exec_rules, @@ -1907,7 +1914,7 @@ be_local_closure(Tasmota_set_timer, /* name */ /* K0 */ be_nested_str(check_not_method), /* K1 */ be_nested_str(_timers), /* K2 */ be_nested_str(push), - /* K3 */ be_nested_str(Timer), + /* K3 */ be_nested_str(Trigger), /* K4 */ be_nested_str(millis), }), &be_const_str_set_timer, diff --git a/lib/libesp32/berry_tasmota/src/be_timer_class.c b/lib/libesp32/berry_tasmota/src/be_trigger_class.c similarity index 83% rename from lib/libesp32/berry_tasmota/src/be_timer_class.c rename to lib/libesp32/berry_tasmota/src/be_trigger_class.c index 6664e408e..82cb3e64a 100644 --- a/lib/libesp32/berry_tasmota/src/be_timer_class.c +++ b/lib/libesp32/berry_tasmota/src/be_trigger_class.c @@ -1,18 +1,18 @@ /******************************************************************** * Tasmota lib * - * class Timer + * class Trigger *******************************************************************/ #include "be_constobj.h" /******************************************************************** ** Solidified function: tostring ********************************************************************/ -be_local_closure(Timer_tostring, /* name */ +be_local_closure(Trigger_tostring, /* name */ be_nested_proto( 10, /* nstack */ 1, /* argc */ - 0, /* varg */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ @@ -22,7 +22,7 @@ be_local_closure(Timer_tostring, /* name */ /* K0 */ be_nested_str(string), /* K1 */ be_nested_str(format), /* K2 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K3 */ be_nested_str(due), + /* K3 */ be_nested_str(trig), /* K4 */ be_nested_str(f), /* K5 */ be_nested_str(id), }), @@ -57,18 +57,18 @@ be_local_closure(Timer_tostring, /* name */ /******************************************************************** ** Solidified function: init ********************************************************************/ -be_local_closure(Timer_init, /* name */ +be_local_closure(Trigger_init, /* name */ be_nested_proto( 4, /* nstack */ 4, /* argc */ - 0, /* varg */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str(due), + /* K0 */ be_nested_str(trig), /* K1 */ be_nested_str(f), /* K2 */ be_nested_str(id), }), @@ -86,25 +86,25 @@ be_local_closure(Timer_init, /* name */ /******************************************************************** -** Solidified class: Timer +** Solidified class: Trigger ********************************************************************/ -be_local_class(Timer, +be_local_class(Trigger, 3, NULL, be_nested_map(5, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(tostring, 4), be_const_closure(Timer_tostring_closure) }, + { be_const_key(tostring, 3), be_const_closure(Trigger_tostring_closure) }, { be_const_key(id, 2), be_const_var(2) }, { be_const_key(f, -1), be_const_var(1) }, - { be_const_key(due, -1), be_const_var(0) }, - { be_const_key(init, -1), be_const_closure(Timer_init_closure) }, + { be_const_key(init, -1), be_const_closure(Trigger_init_closure) }, + { be_const_key(trig, -1), be_const_var(0) }, })), - be_str_literal("Timer") + be_str_literal("Trigger") ); /*******************************************************************/ -void be_load_Timer_class(bvm *vm) { - be_pushntvclass(vm, &be_class_Timer); - be_setglobal(vm, "Timer"); +void be_load_Trigger_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Trigger); + be_setglobal(vm, "Trigger"); be_pop(vm, 1); } diff --git a/lib/libesp32/berry_tasmota/src/embedded/Tasmota.be b/lib/libesp32/berry_tasmota/src/embedded/Tasmota.be index 63a62d6a7..eed4f75bd 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/Tasmota.be +++ b/lib/libesp32/berry_tasmota/src/embedded/Tasmota.be @@ -1,17 +1,17 @@ #- Native code used for testing and code solidification -# #- Do not use it -# -class Timer - var due, f, id - def init(due, f, id) - self.due = due +class Trigger + var trig, f, id + def init(trig, f, id) + self.trig = trig self.f = f self.id = id end def tostring() import string return string.format(" closure - # Classs KV has two members k and v - def kv(k, v) - class KV - var k, v - def init(k,v) - self.k = k - self.v = v - end - end - - return KV(k, v) - end - # add `chars_in_string(s:string,c:string) -> int`` # looks for any char in c, and return the position of the first char # or -1 if not found @@ -130,23 +116,23 @@ class Tasmota end # Rules - def add_rule(pat,f) + def add_rule(pat, f, id) self.check_not_method(f) if !self._rules self._rules=[] end if type(f) == 'function' - self._rules.push(self.kv(pat, f)) + self._rules.push(Trigger(pat, f, id)) else raise 'value_error', 'the second argument is not a function' end end - def remove_rule(pat) + def remove_rule(pat, id) if self._rules var i = 0 while i < size(self._rules) - if self._rules[i].k == pat + if self._rules[i].trig == pat && self._rules[i].id == id self._rules.remove(i) #- don't increment i since we removed the object -# else i += 1 @@ -214,8 +200,8 @@ class Tasmota if self._rules var i = 0 while i < size(self._rules) - var kv = self._rules[i] - ret = self.try_rule(ev,kv.k,kv.v) || ret #- call should be first to avoid evaluation shortcut if ret is already true -# + var tr = self._rules[i] + ret = self.try_rule(ev,tr.trig,tr.f) || ret #- call should be first to avoid evaluation shortcut if ret is already true -# i += 1 end end @@ -239,8 +225,8 @@ class Tasmota var i = 0 while i < size(self._rules) - var kv = self._rules[i] - ret = self.try_rule(ev,kv.k,kv.v) || ret #- call should be first to avoid evaluation shortcut -# + var tr = self._rules[i] + ret = self.try_rule(ev,tr.trig,tr.f) || ret #- call should be first to avoid evaluation shortcut -# i += 1 end return ret @@ -251,7 +237,7 @@ class Tasmota def set_timer(delay,f,id) self.check_not_method(f) if !self._timers self._timers=[] end - self._timers.push(Timer(self.millis(delay),f,id)) + self._timers.push(Trigger(self.millis(delay),f,id)) end # run every 50ms tick @@ -259,7 +245,7 @@ class Tasmota if self._timers var i=0 while ibegin(Pin(GPIO_SPI_CLK, 1), Pin(GPIO_SPI_MISO, 1), Pin(GPIO_SPI_MOSI, 1), -1); + } + +#endif // ESP32 + } else { + AddLog(LOG_LEVEL_INFO, PSTR("error: spi pins not defined")); + } + break; + } + pinMode(glob_script_mem.spi.sclk , OUTPUT); + digitalWrite(glob_script_mem.spi.sclk , 0); + + lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); + glob_script_mem.spi.mosi = fvar; + if (glob_script_mem.spi.mosi >= 0) { + pinMode(glob_script_mem.spi.mosi , OUTPUT); + digitalWrite(glob_script_mem.spi.mosi , 0); + } + + lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); + glob_script_mem.spi.miso = fvar; + if (glob_script_mem.spi.miso >= 0) { + pinMode(glob_script_mem.spi.miso , INPUT_PULLUP); + } + + if (Is_gpio_used(glob_script_mem.spi.mosi) || Is_gpio_used(glob_script_mem.spi.miso) + || Is_gpio_used(glob_script_mem.spi.sclk) ) { + AddLog(LOG_LEVEL_INFO, PSTR("warning: pins already used")); + } + break; + + case 1: + // set cs + lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); + index = fvar; + index &= 3; + lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); + glob_script_mem.spi.cs[index] = fvar; + pinMode(glob_script_mem.spi.cs[index] , OUTPUT); + digitalWrite(glob_script_mem.spi.cs[index] , 1); + if (Is_gpio_used(glob_script_mem.spi.cs[index])) { + AddLog(LOG_LEVEL_INFO, PSTR("warning: pins already used")); + } + break; + + case 2: + // transfer bytes + lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); + uint8_t index = fvar; + lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); + uint32_t val = fvar; + lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); + script_sspi_trans(index & 3, val, fvar); + break; + } + len = 0; + goto exit; + } +#endif // USE_SCRIPT_SPI break; case 't': @@ -5402,7 +5507,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } else { glob_script_mem.retstr = 0; } - section = 0; + section = 99; goto next_line; } else if (!strncmp(lp, "break", 5)) { lp += 5; @@ -5413,7 +5518,8 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } floop = 0; } else { - section = 0; + section = 99; + // leave immediately } goto next_line; } else if (!strncmp(lp, "dp", 2) && isdigit(*(lp + 2))) { @@ -5973,6 +6079,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } // next line next_line: + if (section == 99) return 0; if (*lp==SCRIPT_EOL) { lp++; } else { @@ -5990,6 +6097,55 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { return -1; } + +#ifdef USE_SCRIPT_SPI +// transfer 1-3 bytes +uint32_t script_sspi_trans(uint32_t cs_index, uint32_t val, uint32_t size) { + uint32_t out = 0; + + digitalWrite(glob_script_mem.spi.cs[cs_index], 0); + + if (glob_script_mem.spi.sclk < 0) { + // use existing hardware spi + glob_script_mem.spi.spip->beginTransaction(glob_script_mem.spi.settings); + if (size == 1) { + out = glob_script_mem.spi.spip->transfer(val); + } + if (size == 2) { + out = glob_script_mem.spi.spip->transfer16(val); + } + if (size == 3) { + out = glob_script_mem.spi.spip->transfer(val >> 16); + out <<= 16; + out |= glob_script_mem.spi.spip->transfer16(val); + } + //SPI.transferBytes(); + glob_script_mem.spi.spip->endTransaction(); + digitalWrite(glob_script_mem.spi.cs[cs_index], 1); + return out; + } + + if (size < 1 || size > 3) size = 1; + uint32_t bit = 1 << ((size * 8) - 1); + while (bit) { + digitalWrite(glob_script_mem.spi.sclk, 0); + if (glob_script_mem.spi.mosi >= 0) { + if (val & bit) digitalWrite(glob_script_mem.spi.mosi, 1); + else digitalWrite(glob_script_mem.spi.mosi, 0); + } + digitalWrite(glob_script_mem.spi.sclk, 1); + if (glob_script_mem.spi.miso >= 0) { + if (digitalRead(glob_script_mem.spi.miso)) { + out |= bit; + } + } + bit >>= 1; + } + digitalWrite(glob_script_mem.spi.cs[cs_index], 1); + return out; +} +#endif // USE_SCRIPT_SPI + #ifdef USE_SCRIPT_SERIAL bool Script_Close_Serial() { if (glob_script_mem.sp) { @@ -6004,7 +6160,7 @@ bool Script_Close_Serial() { #endif //USE_SCRIPT_SERIAL bool Is_gpio_used(uint8_t gpiopin) { - if ((gpiopin < nitems(TasmotaGlobal.gpio_pin)) && (TasmotaGlobal.gpio_pin[gpiopin] > 0)) { + if (gpiopin >= 0 && (gpiopin < nitems(TasmotaGlobal.gpio_pin)) && (TasmotaGlobal.gpio_pin[gpiopin] > 0)) { return true; } return false; diff --git a/tasmota/xdrv_23_zigbee_0_constants.ino b/tasmota/xdrv_23_zigbee_0_constants.ino index d7a5a7aad..ac2aae6ed 100644 --- a/tasmota/xdrv_23_zigbee_0_constants.ino +++ b/tasmota/xdrv_23_zigbee_0_constants.ino @@ -52,7 +52,8 @@ enum ZnpSubsystem { Z_SAPI = 0x06, Z_UTIL = 0x07, Z_DEBUG = 0x08, - Z_APP = 0x09 + Z_APP = 0x09, + Z_APP_CNF = 0x0F, // new in ZStacK 3 }; #endif // USE_ZIGBEE_ZNP @@ -1103,6 +1104,14 @@ enum Z_Util { Z_UTIL_ZCL_KEY_ESTABLISH_IND = 0xE1 }; +enum Z_App_Cnf { + Z_APP_CNF_BDB_START_COMMISSIONING = 0x05, + Z_APP_CNF_BDB_SET_CHANNEL = 0x08, + Z_APP_CNF_BDB_SET_TC_REQUIRE_KEY_EXCHANGE = 0x09, + Z_APP_CNF_BDB_COMMISSIONING_NOTIFICATION = 0x80, + Z_APP_CNF_BDB_SET_NWK_FRAME_COUNTER = 0xFF, +}; + enum ZCL_Global_Commands { ZCL_READ_ATTRIBUTES = 0x00, ZCL_READ_ATTRIBUTES_RESPONSE = 0x01, diff --git a/tasmota/xdrv_23_zigbee_1_headers.ino b/tasmota/xdrv_23_zigbee_1_headers.ino index 3e541aa7d..063c6ddc6 100644 --- a/tasmota/xdrv_23_zigbee_1_headers.ino +++ b/tasmota/xdrv_23_zigbee_1_headers.ino @@ -80,6 +80,7 @@ const uint8_t ZIGBEE_LABEL_INIT_DEVICE = 14; // Init ZNP as end-device const uint8_t ZIGBEE_LABEL_START_DEVICE = 15; // Start ZNP as end-device const uint8_t ZIGBEE_LABEL_START_ROUTER_DEVICE = 16; // Start common to router and device const uint8_t ZIGBEE_LABEL_ZB3_INIT = 17; // check parameters for ZB3 +const uint8_t ZIGBEE_LABEL_COORD_STARTED = 18; // Coordinator has started const uint8_t ZIGBEE_LABEL_FACT_RESET_ROUTER_DEVICE_POST = 19; // common post configuration for router and device const uint8_t ZIGBEE_LABEL_READY = 20; // goto label 20 for main loop const uint8_t ZIGBEE_LABEL_MAIN_LOOP = 21; // main loop diff --git a/tasmota/xdrv_23_zigbee_7_0_statemachine.ino b/tasmota/xdrv_23_zigbee_7_0_statemachine.ino index 3fd21ad51..13f301b29 100644 --- a/tasmota/xdrv_23_zigbee_7_0_statemachine.ino +++ b/tasmota/xdrv_23_zigbee_7_0_statemachine.ino @@ -223,6 +223,16 @@ const uint32_t ZB_ALL_CHANNELS = 0x07FFF800; ZBR(ZBS_W_ALL_CHANN, Z_SREQ | Z_SYS, SYS_OSAL_NV_WRITE, CONF_CHANLIST,0x00, 0x00, 0x04 /* len */, Z_B0(ZB_ALL_CHANNELS), Z_B1(ZB_ALL_CHANNELS), Z_B2(ZB_ALL_CHANNELS), Z_B3(ZB_ALL_CHANNELS), /*0x00, 0x08, 0x00, 0x00*/ ) // 21098400000400F8FF7F + +// Configure BDB Channels +ZBR(ZBS_W_BDB_CHANN, Z_SREQ | Z_APP_CNF, Z_APP_CNF_BDB_SET_CHANNEL, 0x01 /*primary*/, + Z_B0(USE_ZIGBEE_CHANNEL_MASK), Z_B1(USE_ZIGBEE_CHANNEL_MASK), Z_B2(USE_ZIGBEE_CHANNEL_MASK), Z_B3(USE_ZIGBEE_CHANNEL_MASK), + /*0x00, 0x08, 0x00, 0x00*/ ) // 2F0801xxxxxxxx +// Configure BDB Channels secondary channel to zeroes +ZBM(ZBS_W_BDB_CHANN2, Z_SREQ | Z_APP_CNF, Z_APP_CNF_BDB_SET_CHANNEL, 0x00 /*secondary*/, + 0x00, 0x08, 0x00, 0x00 ) // 2F080000000000 +ZBM(ZBR_W_BDB_CHANN_OK, Z_SRSP | Z_APP_CNF, Z_APP_CNF_BDB_SET_CHANNEL, Z_SUCCESS ) // 6F0800 + // Write Logical Type = 00 = coordinator ZBM(ZBS_W_LOGTYP_COORD, Z_SREQ | Z_SYS, SYS_OSAL_NV_WRITE, CONF_LOGICAL_TYPE,0x00, 0x00, 0x01 /* len */, 0x00 ) // 21098700000100 // Write Logical Type = 01 = router @@ -263,6 +273,10 @@ ZBM(AREQ_STARTUPFROMAPP, Z_AREQ | Z_ZDO, ZDO_STATE_CHANGE_IND ) // 45C00xx - ZBM(AREQ_STARTUPFROMAPP_COORD, Z_AREQ | Z_ZDO, ZDO_STATE_CHANGE_IND, ZDO_DEV_ZB_COORD ) // 45C009 + 08 = starting, 09 = started ZBM(AREQ_STARTUPFROMAPP_ROUTER, Z_AREQ | Z_ZDO, ZDO_STATE_CHANGE_IND, ZDO_DEV_ROUTER ) // 45C009 + 02 = looking PanID, 07 = started ZBM(AREQ_STARTUPFROMAPP_DEVICE, Z_AREQ | Z_ZDO, ZDO_STATE_CHANGE_IND, ZDO_DEV_END_DEVICE ) // 45C009 + 02 = looking PanID, 06 = started +// BDB START Commissioning +ZBM(ZBS_BDB_START_COMMIS, Z_SREQ | Z_APP_CNF, Z_APP_CNF_BDB_START_COMMISSIONING, 0x04 /*mode*/) // 2F0504 +ZBM(ZBR_BDB_START_COMMIS, Z_SRSP | Z_APP_CNF, Z_APP_CNF_BDB_START_COMMISSIONING, Z_SUCCESS) // 6F0500 + // GetDeviceInfo ZBM(ZBS_GETDEVICEINFO, Z_SREQ | Z_UTIL, Z_UTIL_GET_DEVICE_INFO ) // 2700 ZBM(ZBR_GETDEVICEINFO, Z_SRSP | Z_UTIL, Z_UTIL_GET_DEVICE_INFO, Z_SUCCESS ) // Ex= 6700.00.6263151D004B1200.0000.07.09.00 @@ -296,8 +310,10 @@ ZBM(AREQ_ZDO_NODEDESCRSP, Z_AREQ | Z_ZDO, ZDO_NODE_DESC_RSP) // 4582 // Z_ZDO:activeEpReq ZBM(ZBS_ZDO_ACTIVEEPREQ, Z_SREQ | Z_ZDO, ZDO_ACTIVE_EP_REQ, 0x00, 0x00, 0x00, 0x00) // 250500000000 ZBM(ZBR_ZDO_ACTIVEEPREQ, Z_SRSP | Z_ZDO, ZDO_ACTIVE_EP_REQ, Z_SUCCESS) // 65050000 -ZBM(ZBR_ZDO_ACTIVEEPRSP_NONE, Z_AREQ | Z_ZDO, ZDO_ACTIVE_EP_RSP, 0x00, 0x00 /* srcAddr */, Z_SUCCESS, - 0x00, 0x00 /* nwkaddr */, 0x00 /* activeepcount */) // 45050000 - no Ep running +// ZBM(ZBR_ZDO_ACTIVEEPRSP_NONE, Z_AREQ | Z_ZDO, ZDO_ACTIVE_EP_RSP, 0x00, 0x00 /* srcAddr */, Z_SUCCESS, +// 0x00, 0x00 /* nwkaddr */, 0x00 /* activeepcount */) // 45050000 - no Ep running +// Change #14819 - we now allow some EP to be alreaady declared +ZBM(ZBR_ZDO_ACTIVEEPRSP_SUCESS, Z_AREQ | Z_ZDO, ZDO_ACTIVE_EP_RSP, 0x00, 0x00 /* srcAddr */, Z_SUCCESS) // 45050000xxxx - no Ep running ZBM(ZBR_ZDO_ACTIVEEPRSP_OK, Z_AREQ | Z_ZDO, ZDO_ACTIVE_EP_RSP, 0x00, 0x00 /* srcAddr */, Z_SUCCESS, 0x00, 0x00 /* nwkaddr */, 0x02 /* activeepcount */, 0x0B, 0x01 /* the actual endpoints */) // 25050000 - no Ep running @@ -371,6 +387,10 @@ void ZNP_UpdateConfig(uint8_t zb_channel, uint16_t zb_pan_id, uint64_t zb_ext_pa ZBW(ZBS_W_CHANN, Z_SREQ | Z_SYS, SYS_OSAL_NV_WRITE, CONF_CHANLIST,0x00, 0x00, 0x04 /* len */, Z_B0(zb_channel_mask), Z_B1(zb_channel_mask), Z_B2(zb_channel_mask), Z_B3(zb_channel_mask), /*0x00, 0x08, 0x00, 0x00*/ ) // 210984000004xxxxxxxx + // Write BDB Channel ID - ZStack3 specific + ZBW(ZBS_W_BDB_CHANN, Z_SREQ | Z_APP_CNF, Z_APP_CNF_BDB_SET_CHANNEL, 0x01 /*primary*/, + Z_B0(zb_channel_mask), Z_B1(zb_channel_mask), Z_B2(zb_channel_mask), Z_B3(zb_channel_mask), + /*0x00, 0x08, 0x00, 0x00*/ ) // 2F0801xxxxxxxx // Write precfgkey ZBW(ZBS_W_PFGK, Z_SREQ | Z_SYS, SYS_OSAL_NV_WRITE, CONF_PRECFGKEY,0x00, 0x00, 0x10 /* len */, @@ -401,7 +421,7 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { ZI_WAIT(15500) // wait for 15 seconds for Tasmota to stabilize //ZI_MQTT_STATE(ZIGBEE_STATUS_BOOT, "Booting") - ZI_LOG(LOG_LEVEL_INFO, D_LOG_ZIGBEE "rebooting CC2530 device") + ZI_LOG(LOG_LEVEL_INFO, D_LOG_ZIGBEE "rebooting ZNP device") ZI_CALL(&ZNP_Reset_Device, 0) // LOW = reset ZI_WAIT(100) // wait for .1 second @@ -434,34 +454,54 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { ZI_SEND(ZBS_PFGKEN) // check PFGKEN ZI_WAIT_RECV(1000, ZBR_PFGKEN) + ZI_LABEL(ZIGBEE_LABEL_START_COORD) + // Check if the MCU is running ZStack3, it so goto ZIGBEE_LABEL_ZB3_INIT, or continue ZI_CALL(&Z_GotoZB3, ZIGBEE_LABEL_ZB3_INIT) + // ====================================================================== + // Start procedure for ZStack 1.2 + // ====================================================================== ZI_SEND(ZBS_PFGK) // check PFGK on ZB1.2 ZI_WAIT_RECV(1000, ZBR_PFGK) - ZI_GOTO(ZIGBEE_LABEL_START_COORD) - ZI_LABEL(ZIGBEE_LABEL_ZB3_INIT) - ZI_SEND(ZBS_PFGK3) // check PFGK on ZB3 - ZI_WAIT_RECV(1000, ZBR_PFGK3) - //ZI_LOG(LOG_LEVEL_INFO, D_LOG_ZIGBEE "zigbee configuration ok") // all is good, we can start - - ZI_LABEL(ZIGBEE_LABEL_START_COORD) // START ZNP App ZI_MQTT_STATE(ZIGBEE_STATUS_STARTING, kConfiguredCoord) - ZI_ON_ERROR_GOTO(ZIGBEE_LABEL_ABORT) - // Z_ZDO:startupFromApp - //ZI_LOG(LOG_LEVEL_INFO, D_LOG_ZIGBEE "starting zigbee coordinator") - ZI_SEND(ZBS_STARTUPFROMAPP) // start coordinator + ZI_ON_ERROR_GOTO(ZIGBEE_LABEL_ABORT) // set any failure to ABORT + ZI_SEND(ZBS_STARTUPFROMAPP) // start coordinator ZI_WAIT_RECV(5000, ZBR_STARTUPFROMAPP) // wait for sync ack of command ZI_WAIT_UNTIL_FUNC(20000, AREQ_STARTUPFROMAPP, &ZNP_ReceiveStateChange) // wait for async message that coordinator started, max 20s + ZI_GOTO(ZIGBEE_LABEL_COORD_STARTED) + + // ====================================================================== + // Start procedure for ZStack 3 + // ====================================================================== + ZI_LABEL(ZIGBEE_LABEL_ZB3_INIT) + ZI_SEND(ZBS_PFGK3) // check PFGK on ZB3 + ZI_WAIT_RECV(1000, ZBR_PFGK3) + + ZI_MQTT_STATE(ZIGBEE_STATUS_STARTING, kConfiguredCoord) + ZI_ON_ERROR_GOTO(ZIGBEE_LABEL_ABORT) // set any failure to ABORT + // Set channel mask for primary and secondary, using BDB_SET_CHANNEL + ZI_SEND(ZBS_W_BDB_CHANN) // set channel for primary network + ZI_WAIT_RECV(2000, ZBR_W_BDB_CHANN_OK) + ZI_SEND(ZBS_W_BDB_CHANN2) // no channel for secondary network + ZI_WAIT_RECV(2000, ZBR_W_BDB_CHANN_OK) + // all is good, we can start + ZI_SEND(ZBS_BDB_START_COMMIS) // start coordinator + ZI_WAIT_RECV(5000, ZBR_BDB_START_COMMIS) // wait for sync ack of command + ZI_WAIT_UNTIL_FUNC(20000, AREQ_STARTUPFROMAPP, &ZNP_ReceiveStateChange) // wait for async message that coordinator started, max 20s + + // ====================================================================== + // Coordinator has started, to post-configuration + // ====================================================================== + ZI_LABEL(ZIGBEE_LABEL_COORD_STARTED) // Coordinator has started ZI_SEND(ZBS_GETDEVICEINFO) // GetDeviceInfo ZI_WAIT_RECV_FUNC(2000, ZBR_GETDEVICEINFO, &ZNP_ReceiveDeviceInfo) - //ZI_WAIT_RECV(2000, ZBR_GETDEVICEINFO) // memorize info ZI_SEND(ZBS_ZDO_NODEDESCREQ) // Z_ZDO:nodeDescReq ZI_WAIT_RECV(1000, ZBR_ZDO_NODEDESCREQ) ZI_WAIT_UNTIL(5000, AREQ_ZDO_NODEDESCRSP) ZI_SEND(ZBS_ZDO_ACTIVEEPREQ) // Z_ZDO:activeEpReq ZI_WAIT_RECV(1000, ZBR_ZDO_ACTIVEEPREQ) - ZI_WAIT_UNTIL(1000, ZBR_ZDO_ACTIVEEPRSP_NONE) + ZI_WAIT_UNTIL(1000, ZBR_ZDO_ACTIVEEPRSP_SUCESS) ZI_SEND(ZBS_AF_REGISTER01) // Z_AF register for endpoint 01, profile 0x0104 Home Automation ZI_WAIT_RECV(1000, ZBR_AF_REGISTER) ZI_SEND(ZBS_AF_REGISTER0B) // Z_AF register for endpoint 0B, profile 0x0104 Home Automation @@ -495,6 +535,9 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { ZI_WAIT_FOREVER() ZI_GOTO(ZIGBEE_LABEL_READY) + // ====================================================================== + // Wrong configuration, do a factory reset and push configuration + // ====================================================================== ZI_LABEL(ZIGBEE_LABEL_FACT_RESET_COORD) // reformat device ZI_MQTT_STATE(ZIGBEE_STATUS_RESET_CONF, kResetting) //ZI_LOG(LOG_LEVEL_INFO, D_LOG_ZIGBEE "zigbee bad configuration of device, doing a factory reset") diff --git a/tasmota/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino index 2f3b9688f..0e1abe0a4 100644 --- a/tasmota/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/xdrv_23_zigbee_8_parsers.ino @@ -51,7 +51,7 @@ void EZ_RSTACK(uint8_t reset_code) { default: reason_str = PSTR("Unknown"); break; } Response_P(PSTR("{\"" D_JSON_ZIGBEE_STATE "\":{" - "\"Status\":%d,\"Message\":\"EFR32 booted\",\"RestartReason\":\"%s\"" + "\"Status\":%d,\"Message\":\"EFR32 EZSP booted\",\"RestartReason\":\"%s\"" ",\"Code\":%d}}"), ZIGBEE_STATUS_BOOT, reason_str, reset_code); @@ -418,7 +418,7 @@ int32_t ZNP_Reboot(int32_t res, SBuffer &buf) { } Response_P(PSTR("{\"" D_JSON_ZIGBEE_STATE "\":{" - "\"Status\":%d,\"Message\":\"CCxxxx booted\",\"RestartReason\":\"%s\"" + "\"Status\":%d,\"Message\":\"CCxxxx ZNP booted\",\"RestartReason\":\"%s\"" ",\"MajorRel\":%d,\"MinorRel\":%d}}"), ZIGBEE_STATUS_BOOT, reason_str, major_rel, minor_rel); diff --git a/tasmota/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino index 144327d85..ae987ba69 100644 --- a/tasmota/xdrv_29_deepsleep.ino +++ b/tasmota/xdrv_29_deepsleep.ino @@ -178,7 +178,7 @@ bool Xdrv29(uint8_t function) DeepSleepEverySecond(); break; case FUNC_AFTER_TELEPERIOD: - if (DeepSleepEnabled() && !deepsleep_flag) { + if (DeepSleepEnabled() && !deepsleep_flag && (Settings->tele_period == 10 || Settings->tele_period == 300 || millis() > 20000 )) { deepsleep_flag = DEEPSLEEP_START_COUNTDOWN; // Start deepsleep in 4 seconds } break; diff --git a/tasmota/xdrv_41_tcp_bridge.ino b/tasmota/xdrv_41_tcp_bridge.ino index c24fae5ec..75ca5ce91 100644 --- a/tasmota/xdrv_41_tcp_bridge.ino +++ b/tasmota/xdrv_41_tcp_bridge.ino @@ -41,11 +41,11 @@ IPAddress ip_filter; TasmotaSerial *TCPSerial = nullptr; const char kTCPCommands[] PROGMEM = "TCP" "|" // prefix - "Start" "|" "Baudrate" "|" "Config" + "Start" "|" "Baudrate" "|" "Config" "|" "Connect" ; void (* const TCPCommand[])(void) PROGMEM = { - &CmndTCPStart, &CmndTCPBaudrate, &CmndTCPConfig + &CmndTCPStart, &CmndTCPBaudrate, &CmndTCPConfig, &CmndTCPConnect }; // @@ -216,6 +216,45 @@ void CmndTCPConfig(void) { ResponseCmndChar_P(GetSerialConfig(0x7F & Settings->tcp_config).c_str()); } +// +// Command `Connect` +// Params: port, +// +void CmndTCPConnect(void) { + int32_t tcp_port = XdrvMailbox.payload; + + if (ArgC() == 2) { + char sub_string[XdrvMailbox.data_len]; + WiFiClient new_client; + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Connecting to %s on port %d"), ArgV(sub_string, 2),tcp_port); + if (new_client.connect(ArgV(sub_string, 2),tcp_port)) { + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "connected!")); + } else { + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "error connecting!")); + } + + // find an empty slot + uint32_t i; + for (i=0; i= nitems(client_tcp)) { + i = client_next++ % nitems(client_tcp); + WiFiClient &client = client_tcp[i]; + client.stop(); + client = new_client; + } + } else { + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Usage: port,ip_address")); + } + + ResponseCmndDone(); +} + /*********************************************************************************************\ * Interface \*********************************************************************************************/ diff --git a/tasmota/xdrv_52_3_berry_mqtt.ino b/tasmota/xdrv_52_3_berry_mqtt.ino new file mode 100644 index 000000000..e02b45f28 --- /dev/null +++ b/tasmota/xdrv_52_3_berry_mqtt.ino @@ -0,0 +1,89 @@ +/* + xdrv_52_3_berry_mqtt.ino - Berry scripting language, native fucnctions + + Copyright (C) 2021 Stephan Hadinger, Berry language by Guan Wenliang https://github.com/Skiars/berry + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// Mappgin from internal light and a generic `light_state` Berry class + +#ifdef USE_BERRY + +#include "berry.h" + +// Berry: `tasmota.publish(topic, payload [, retain:bool, start:int, len:int]) -> nil`` +// is_method is true if called from Tasmota class, false if called from mqtt module +int32_t be_mqtt_publish(struct bvm *vm, bool is_method) { + int32_t top = be_top(vm); // Get the number of arguments + if (top >= 2+is_method && be_isstring(vm, 1+is_method) && (be_isstring(vm, 2+is_method) || be_isbytes(vm, 2+is_method))) { // 2 mandatory string arguments + bool retain = false; + int32_t payload_start = 0; + int32_t len = -1; // send all of it + if (top >= 3+is_method) { retain = be_tobool(vm, 3+is_method); } + if (top >= 4+is_method) { + payload_start = be_toint(vm, 4+is_method); + if (payload_start < 0) payload_start = 0; + } + if (top >= 5+is_method) { len = be_toint(vm, 5+is_method); } + const char * topic = be_tostring(vm, 1+is_method); + const char * payload = nullptr; + size_t payload_len = 0; + + if (be_isstring(vm, 2+is_method)) { + payload = be_tostring(vm, 2+is_method); + payload_len = strlen(payload); + } else { + payload = (const char *) be_tobytes(vm, 2+is_method, &payload_len); + } + if (!payload) { be_raise(vm, "value_error", "Empty payload"); } + + // adjust start and len + if (payload_start >= payload_len) { len = 0; } // send empty packet + else if (len < 0) { len = payload_len - payload_start; } // send all packet, adjust len + else if (payload_start + len > payload_len) { len = payload_len - payload_start; } // len is too long, adjust + // adjust start + payload = payload + payload_start; + + be_pop(vm, be_top(vm)); // clear stack to avoid any indirect warning message in subsequent calls to Berry + + MqttPublishPayload(topic, payload, len, retain); + + be_return_nil(vm); // Return + } + be_raise(vm, kTypeError, nullptr); +} + +extern "C" { + int32_t l_publish(struct bvm *vm); + int32_t l_publish(struct bvm *vm) { + return be_mqtt_publish(vm, true); + } +} + +int32_t be_mqtt_publish(struct bvm *vm) { + return be_mqtt_publish(vm, false); +} + +void be_mqtt_subscribe(const char* topic) { + if (!topic) { return; } + MqttSubscribe(topic); +} + +void be_mqtt_unsubscribe(const char* topic) { + if (!topic) { return; } + MqttUnsubscribe(topic); +} + +#endif // USE_BERRY diff --git a/tasmota/xdrv_52_3_berry_tasmota.ino b/tasmota/xdrv_52_3_berry_tasmota.ino index 4792eafab..2eb5bd738 100644 --- a/tasmota/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/xdrv_52_3_berry_tasmota.ino @@ -68,49 +68,6 @@ const uint32_t BERRY_MAX_REPL_LOGS = 1024; // max number of print output recor * \*********************************************************************************************/ extern "C" { - // Berry: `tasmota.publish(topic, payload [, retain:bool, start:int, len:int]) -> nil`` - // - int32_t l_publish(struct bvm *vm); - int32_t l_publish(struct bvm *vm) { - int32_t top = be_top(vm); // Get the number of arguments - if (top >= 3 && be_isstring(vm, 2) && (be_isstring(vm, 3) || be_isbytes(vm, 3))) { // 2 mandatory string arguments - bool retain = false; - int32_t payload_start = 0; - int32_t len = -1; // send all of it - if (top >= 4) { retain = be_tobool(vm, 4); } - if (top >= 5) { - payload_start = be_toint(vm, 5); - if (payload_start < 0) payload_start = 0; - } - if (top >= 6) { len = be_toint(vm, 6); } - const char * topic = be_tostring(vm, 2); - const char * payload = nullptr; - size_t payload_len = 0; - - if (be_isstring(vm, 3)) { - payload = be_tostring(vm, 3); - payload_len = strlen(payload); - } else { - payload = (const char *) be_tobytes(vm, 3, &payload_len); - } - if (!payload) { be_raise(vm, "value_error", "Empty payload"); } - - // adjust start and len - if (payload_start >= payload_len) { len = 0; } // send empty packet - else if (len < 0) { len = payload_len - payload_start; } // send all packet, adjust len - else if (payload_start + len > payload_len) { len = payload_len - payload_start; } // len is too long, adjust - // adjust start - payload = payload + payload_start; - - be_pop(vm, be_top(vm)); // clear stack to avoid any indirect warning message in subsequent calls to Berry - - MqttPublishPayload(topic, payload, len, retain); - - be_return_nil(vm); // Return - } - be_raise(vm, kTypeError, nullptr); - } - // Berry: `tasmota.publish_result(payload:string, subtopic:string) -> nil`` // int32_t l_publish_result(struct bvm *vm); @@ -220,11 +177,10 @@ extern "C" { if (UsePSRAM()) { be_map_insert_int(vm, "psram", ESP.getPsramSize() / 1024); be_map_insert_int(vm, "psram_free", ESP.getFreePsram() / 1024); - } else { - // IRAM information - int32_t iram_free = (int32_t)heap_caps_get_free_size(MALLOC_CAP_32BIT) - (int32_t)heap_caps_get_free_size(MALLOC_CAP_8BIT); - be_map_insert_int(vm, "iram_free", iram_free / 1024); } + // IRAM information + int32_t iram_free = (int32_t)heap_caps_get_free_size(MALLOC_CAP_32BIT) - (int32_t)heap_caps_get_free_size(MALLOC_CAP_8BIT); + be_map_insert_int(vm, "iram_free", iram_free / 1024); be_pop(vm, 1); be_return(vm); } diff --git a/tasmota/xdrv_52_9_berry.ino b/tasmota/xdrv_52_9_berry.ino index e1bcc6ff3..b234070f9 100644 --- a/tasmota/xdrv_52_9_berry.ino +++ b/tasmota/xdrv_52_9_berry.ino @@ -89,21 +89,7 @@ extern "C" { #ifdef USE_BERRY_IRAM return special_malloc32(size); #else - return special_malloc(size); - #endif - } - void *berry_realloc32(void *ptr, size_t size) { - #ifdef USE_BERRY_IRAM - return special_realloc32(ptr, size); - #else - return special_realloc(ptr, size); - #endif - } - void *berry_calloc32(size_t num, size_t size) { - #ifdef USE_BERRY_IRAM - return special_calloc32(num, size); - #else - return special_calloc(num, size); + return NULL; /* return NULL to indicate that IRAM is not enabled */ #endif } @@ -234,8 +220,14 @@ void BerryObservability(bvm *vm, int event...) { uint32_t gc_elapsed = millis() - gc_time; uint32_t vm_scanned = va_arg(param, uint32_t); uint32_t vm_freed = va_arg(param, uint32_t); - AddLog(LOG_LEVEL_DEBUG_MORE, D_LOG_BERRY "GC from %i to %i bytes, objects freed %i/%i (in %d ms)", - vm_usage, vm_usage2, vm_freed, vm_scanned, gc_elapsed); + size_t slots_used_before_gc = va_arg(param, size_t); + size_t slots_allocated_before_gc = va_arg(param, size_t); + size_t slots_used_after_gc = va_arg(param, size_t); + size_t slots_allocated_after_gc = va_arg(param, size_t); + AddLog(LOG_LEVEL_DEBUG_MORE, D_LOG_BERRY "GC from %i to %i bytes, objects freed %i/%i (in %d ms) - slots from %i/%i to %i/%i", + vm_usage, vm_usage2, vm_freed, vm_scanned, gc_elapsed, + slots_used_before_gc, slots_allocated_before_gc, + slots_used_after_gc, slots_allocated_after_gc); // make new threshold tighter when we reach high memory usage if (!UsePSRAM() && vm->gc.threshold > 20*1024) { vm->gc.threshold = vm->gc.usage + 10*1024; // increase by only 10 KB diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 27773eed1..f51f79d02 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -32,7 +32,7 @@ * Green led is controlled by ARM processor indicating SD-Card access. * ESP32 is used as interface between eWelink and ARM processor in SPM-Main unit communicating over proprietary serial protocol. * Power on sequence for two SPM-4Relay modules is 00-00-15-10-(0F)-(13)-(13)-(19)-0C-09-04-09-04-0B-0B - * Up to six months of daily energy are stored onthe SD-Card. Previous data is lost. + * Up to 180 days of daily energy are stored on the SD-Card. Previous data is lost. * Tasmota support is based on Sonoff SPM v1.0.0 ARM firmware. * Energy history cannot be guaranteed using either SD-Card or internal flash. As a solution Tasmota stores the total energy and yesterday energy just after midnight. * @@ -55,6 +55,7 @@ * SspmHistory - Retrieve daily energy of last six month (as defined by ARM firmware) * SspmIAmHere - Blink ERROR in SPM-4Relay where relay resides * SspmLog [x] - Retrieve relay power state change and cause logging + * SspmMap 0 - Start a scan to fill default mapping * SspmMap 2,3,1,.. - Map scanned module number to physical module number using positional numbering * SspmOverload 0 - Set default overload detection parameters as read from module during initial scan * SspmOverload ,,,, @@ -1409,11 +1410,21 @@ void SSPMHandleReceivedData(void) { Sspm->min_voltage = SSPMGetValue(&SspmBuffer[46]); // x.xxV } uint32_t module_id = SspmBuffer[19] << 8 | SspmBuffer[20]; - if (0 == Sspm->Settings.module_map[Sspm->module_max]) { - Sspm->Settings.module_map[Sspm->module_max] = module_id; - } +// if (0 == Sspm->Settings.module_map[Sspm->module_max]) { +// Sspm->Settings.module_map[Sspm->module_max] = module_id; +// } int mapped = SSPMGetModuleNumberFromMapIfFound(module_id); - if (-1 == mapped) { Sspm->map_change = true; } + if (-1 == mapped) { + // Scanned module not in mapped list. Append if possible + for (uint32_t module = Sspm->module_max; module < SSPM_MAX_MODULES; module++) { + if (0 == Sspm->Settings.module_map[module]) { + Sspm->Settings.module_map[module] = module_id; + mapped = module; + break; + } + } + Sspm->map_change = true; + } mapped++; AddLog(LOG_LEVEL_INFO, PSTR("SPM: 4Relay %d (mapped to %d) type %d version %d.%d.%d found with id %12_H"), Sspm->module_max +1, mapped, SspmBuffer[35], SspmBuffer[36], SspmBuffer[37], SspmBuffer[38], Sspm->module[Sspm->module_max]); @@ -2212,9 +2223,16 @@ void CmndSSPMReset(void) { void CmndSSPMMap(void) { // Map scanned module number to physical module number using positional numbering - // SspmMap 1,3,4,2 + // SspmMap 0 - start a scan to fill default mapping + // SspmMap 1,3,4,2 - map modules // TODO: Might need input checks on count and valid different numbers - if (Sspm->module_max) { // Valid after initial scan + if (0 == XdrvMailbox.payload) { + for (uint32_t module = 0; module < SSPM_MAX_MODULES; module++) { + Sspm->Settings.module_map[module] = 0; // Clear mapping slots + } + CmndSSPMScan(); // Start scan to fill default mapping + } + else if (Sspm->module_max) { // Valid after initial scan char *p; uint32_t i = 0; for (char* str = strtok_r(XdrvMailbox.data, ",", &p); str && i < Sspm->module_max; str = strtok_r(nullptr, ",", &p)) { diff --git a/tasmota/xnrg_22_bl6523.ino b/tasmota/xnrg_22_bl6523.ino new file mode 100644 index 000000000..f9714b052 --- /dev/null +++ b/tasmota/xnrg_22_bl6523.ino @@ -0,0 +1,357 @@ +/* + xnrg_22_bl6523.ino - BL6523 based Watt hour meter support for Tasmota + + Copyright (C) 2022 Jeevas Vasudevan + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_ENERGY_SENSOR +#ifdef USE_BL6523 +/*********************************************************************************************\ + * Chinese BL6523 based Watt hour meter + * + * This meter provides accurate Voltage, Frequency, Ampere, Wattage, Power Factor, KWh + * To use Tasmota the user needs to add an ESP8266 or ESP32 + * Three lines need to be connected via 1KOhh resistors to ESP from the main board(RX,TX GND) + * + * Connection Eg (ESP8266) - Non - Isolated: + * BL6523 RX ->1KOhm-> ESP IO4(D2) (Should be Input Capable) + * BL6523 TX ->1KOhm-> ESP IO5(D1) (Should be Input Capable) + * BL6523 GND -> ESP GND + * + * Connection Eg (ESP32) - Non - Isolated: + * BL6523 RX ->1KOhm-> ESP IO4 (Should be Input Capable) + * BL6523 TX ->1KOhm-> ESP IO5 (Should be Input Capable) + * BL6523 GND -> ESP GND + * + * To build add the below to user_config_override.h + * #define USE_ENERGY_SENSOR // Enable Energy sensor framework + * #define USE_BL6523 // Add support for Chinese BL6523 based Watt hour meter (+1k code)¸ + * + * After Installation use the below template sample: + * {"NAME":"BL6523 Smart Meter","GPIO":[0,0,0,0,7488,7520,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +\*********************************************************************************************/ + +#define XNRG_22 22 + +#include + +#define BL6523_RX_DATASET_SIZE 2 +#define BL6523_TX_DATASET_SIZE 4 + +#define BL6523_BAUD 4800 +#define BL6523_REG_AMPS 0x05 +#define BL6523_REG_VOLTS 0x07 +#define BL6523_REG_FREQ 0x09 +#define BL6523_REG_WATTS 0x0A +#define BL6523_REG_POWF 0x08 +#define BL6523_REG_WATTHR 0x0C + +#define SINGLE_PHASE 0 +#define RX_WAIT 100 + +#define BL6523_IREF 297899 +#define BL6523_UREF 13304 +#define BL6523_FREF 3907 +#define BL6523_PREF 707 +#define BL6523_PWHRREF_D 33 // Substract this from BL6523_PREF to get WattHr Div. + +TasmotaSerial *Bl6523RxSerial; +TasmotaSerial *Bl6523TxSerial; + +struct BL6523 +{ + uint8_t type = 1; + uint8_t valid = 0; + uint8_t got_data_stone = 0; + bool discovery_triggered = false; +} Bl6523; + +bool Bl6523ReadData(void) +{ + uint32_t powf_word = 0, powf_buf = 0, i = 0; + float powf = 0.0f; + + if (!Bl6523RxSerial->available()) + { + AddLog(LOG_LEVEL_DEBUG, PSTR("BL6:No Rx Data available" )); + return false; + } + + while ((Bl6523RxSerial->peek() != 0x35) && Bl6523RxSerial->available()) + { + Bl6523RxSerial->read(); + } + + if (Bl6523RxSerial->available() < BL6523_RX_DATASET_SIZE) + { + AddLog(LOG_LEVEL_DEBUG, PSTR("BL6:Rx less than expected" )); + return false; + } + + uint8_t rx_buffer[BL6523_RX_DATASET_SIZE]; + Bl6523RxSerial->readBytes(rx_buffer, BL6523_RX_DATASET_SIZE); + Bl6523RxSerial->flush(); // Make room for another burst + + AddLogBuffer(LOG_LEVEL_DEBUG_MORE, rx_buffer, BL6523_RX_DATASET_SIZE); + + i=0; + while (Bl6523TxSerial->available() < BL6523_TX_DATASET_SIZE) + { + // sleep till TX buffer is full + delay(10); + if ( i++ > RX_WAIT ){ + break; + } + } + + + uint8_t tx_buffer[BL6523_TX_DATASET_SIZE]; + Bl6523TxSerial->readBytes(tx_buffer, BL6523_TX_DATASET_SIZE); + Bl6523TxSerial->flush(); // Make room for another burst + + + AddLogBuffer(LOG_LEVEL_DEBUG_MORE, tx_buffer, BL6523_TX_DATASET_SIZE); + + /* Checksum: (Addr+Data_L+Data_M+Data_H) & 0xFF, then byte invert */ + uint8_t crc = rx_buffer[1]; //Addr + for (uint32_t i = 0; i < (BL6523_TX_DATASET_SIZE - 1); i++) + { + crc += tx_buffer[i]; //Add Data_L,Data_M and Data_H to Addr + } + crc &= 0xff; // Bitwise AND 0xFF + crc = ~crc; // Invert the byte + if (crc != tx_buffer[BL6523_TX_DATASET_SIZE - 1]) + { + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("BL6:" D_CHECKSUM_FAILURE)); + Bl6523TxSerial->flush(); + Bl6523RxSerial->flush(); + return false; + } + + /* WRITE DATA (format: command(write->0xCA) address data_low data_mid data_high checksum ) +WRITE Sample(RX): +RX: CA 3E 55 00 00 6C (WRPROT - allow) +RX: CA 14 00 00 10 DB (MODE) +RX: CA 15 04 00 00 E6 (GAIN - IB 16x gain ) +RX: CA 19 08 00 00 DE (WA_CFDIV ) +RX: CA 3E AA 00 00 17 (WRPROT - disable) +*/ + + /* READ DATA (format: command(read->0x35) address data_low data_mid data_high checksum ) +READ Sample(RX-TX) Data: +RX: 35 05 TX: E4 00 00 16 (IA rms ) +RX: 35 07 TX: D5 A3 2E 52 (V rms ) +RX: 35 09 TX: F0 FB 02 09 (FREQ) +RX: 35 0A TX: 00 00 00 F5 (WATT) +RX: 35 08 TX: 00 00 00 F7 (PF) +RX: 35 0C TX: 00 00 00 F3 (WATT_HR) +*/ + +switch(rx_buffer[1]) { + case BL6523_REG_AMPS : + Energy.current[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_current_calibration; // 1.260 A + break; + case BL6523_REG_VOLTS : + Energy.voltage[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_voltage_calibration; // 230.2 V + break; + case BL6523_REG_FREQ : + Energy.frequency[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_frequency_calibration; // 50.0 Hz + break; + case BL6523_REG_WATTS : + Energy.active_power[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / Settings->energy_power_calibration; // -196.3 W + break; + case BL6523_REG_POWF : + /* Power factor =(sign bit)*((PF[22]×2^-1)+(PF[21]×2^-2)+。。。) + Eg., reg value 0x7FFFFF(HEX) -> PF 1, 0x800000(HEX) -> -1, 0x400000(HEX) -> 0.5 + */ + powf = 0.0f; + powf_buf = ((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]); + powf_word = (powf_buf >> 23) ? ~(powf_buf & 0x7fffff) : powf_buf & 0x7fffff; //Extract the 23 bits and invert if sign bit(24) is set + for (int i = 0; i < 23; i++){ // Accumulate powf from 23 bits + powf += ((powf_word >> (22-i)) * pow(2,(0-(i+1)))); + powf_word = powf_word & (0x7fffff >> (1+i)); + } + powf = (powf_buf >> 23) ? (0.0f - (powf)) : powf; // Negate if sign bit(24) is set + Energy.power_factor[SINGLE_PHASE] = powf; + break; + case BL6523_REG_WATTHR : + Energy.import_active[SINGLE_PHASE] = (float)((tx_buffer[2] << 16) | (tx_buffer[1] << 8) | tx_buffer[0]) / ( Settings->energy_power_calibration - BL6523_PWHRREF_D ); // 6.216 kWh => used in EnergyUpdateTotal() + break; + default : + break; +} + Energy.data_valid[SINGLE_PHASE] = 0; + EnergyUpdateTotal(); + if (!Bl6523.discovery_triggered) + { + TasmotaGlobal.discovery_counter = 1; // force TasDiscovery() + Bl6523.discovery_triggered = true; + } + return true; + +} + +/*********************************************************************************************/ + +void Bl6523Update(void) +{ // Every 250 millisecond + if (Bl6523ReadData()) + { + Bl6523.valid = 60; + } + else + { + if (Bl6523.valid) { + Bl6523.valid--; + } + } +} + +/*********************************************************************************************/ + +void Bl6523Init(void) +{ + + Bl6523.type = 0; + Bl6523RxSerial = new TasmotaSerial(Pin(GPIO_BL6523_RX), -1, 1); + Bl6523TxSerial = new TasmotaSerial(Pin(GPIO_BL6523_TX), -1, 1); + if ((Bl6523RxSerial->begin(BL6523_BAUD)) && (Bl6523TxSerial->begin(BL6523_BAUD))) + { + if (Bl6523RxSerial->hardwareSerial()) + { + ClaimSerial(); + } + if (Bl6523TxSerial->hardwareSerial()) + { + ClaimSerial(); + } + Bl6523.type = 1; + Energy.phase_count = 1; + AddLog(LOG_LEVEL_DEBUG, PSTR("BL6:Init Success" )); + } + else + { + AddLog(LOG_LEVEL_DEBUG, PSTR("BL6:Init Failure!" )); + TasmotaGlobal.energy_driver = ENERGY_NONE; + } + +} + +bool Bl6523Command(void) { + bool serviced = true; + + int32_t value = (int32_t)(CharToFloat(XdrvMailbox.data) * 1000); // 1.234 = 1234, -1.234 = -1234 + uint32_t abs_value = abs(value) / 10; // 1.23 = 123, -1.23 = 123 + + if ((CMND_POWERCAL == Energy.command_code) || (CMND_VOLTAGECAL == Energy.command_code) || (CMND_CURRENTCAL == Energy.command_code)) { + // Service in xdrv_03_energy.ino + } + else if (CMND_POWERSET == Energy.command_code) { + if (XdrvMailbox.data_len) { + if ((abs_value > 100) && (abs_value < 200000)) { // Between 1.00 and 2000.00 W + Settings->energy_power_calibration = abs_value; + } + } + } + else if (CMND_VOLTAGESET == Energy.command_code) { + if (XdrvMailbox.data_len) { + if ((abs_value > 10000) && (abs_value < 26000)) { // Between 100.00 and 260.00 V + Settings->energy_voltage_calibration = abs_value; + } + } + } + else if (CMND_CURRENTSET == Energy.command_code) { + if (XdrvMailbox.data_len) { + if ((abs_value > 1000) && (abs_value < 1000000)) { // Between 10.00 mA and 10.00000 A + Settings->energy_current_calibration = abs_value; + } + } + } + else if (CMND_FREQUENCYSET == Energy.command_code) { + if (XdrvMailbox.data_len) { + if ((abs_value > 4500) && (abs_value < 6500)) { // Between 45.00 and 65.00 Hz + Settings->energy_frequency_calibration = abs_value; + } + } + } + else if (CMND_ENERGYCONFIG == Energy.command_code) { + AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: Config index %d, payload %d, value %d, data '%s'"), + XdrvMailbox.index, XdrvMailbox.payload, value, XdrvMailbox.data ? XdrvMailbox.data : "null" ); + + // EnergyConfig1 to 3 = Set Energy.current[channel] in A like 0.417 for 417mA + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index < 4)) { + //Bl6523.current[XdrvMailbox.index -1] = value; + } + // EnergyConfig4 to 6 = Set Energy.active_power[channel] in W like 100 for 100W + if ((XdrvMailbox.index > 3) && (XdrvMailbox.index < 7)) { + //Bl6523.power[XdrvMailbox.index -4] = value; + } + } + else serviced = false; // Unknown command + + return serviced; +} + +void Bl6523DrvInit(void) +{ + if (PinUsed(GPIO_BL6523_RX) && PinUsed(GPIO_BL6523_TX)) { + AddLog(LOG_LEVEL_DEBUG, PSTR("BL6:PreInit Success" )); + TasmotaGlobal.energy_driver = XNRG_22; + if (HLW_PREF_PULSE == Settings->energy_power_calibration) { + Settings->energy_frequency_calibration = BL6523_FREF; + Settings->energy_voltage_calibration = BL6523_UREF; + Settings->energy_current_calibration = BL6523_IREF; + Settings->energy_power_calibration = BL6523_PREF; + } + + } + else + { + AddLog(LOG_LEVEL_DEBUG, PSTR("BL6:PreInit Failure!" )); + TasmotaGlobal.energy_driver = ENERGY_NONE; + } + +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xnrg22(uint8_t function) +{ + bool result = false; + + switch (function) + { + case FUNC_EVERY_250_MSECOND: + Bl6523Update(); + break; + case FUNC_COMMAND: + result = Bl6523Command(); + break; + case FUNC_INIT: + Bl6523Init(); + break; + case FUNC_PRE_INIT: + Bl6523DrvInit(); + break; + } + + return result; +} + +#endif // USE_BL6523 +#endif // USE_ENERGY_SENSOR \ No newline at end of file diff --git a/tasmota/xsns_82_wiegand.ino b/tasmota/xsns_82_wiegand.ino index beaf49153..9908e7a55 100644 --- a/tasmota/xsns_82_wiegand.ino +++ b/tasmota/xsns_82_wiegand.ino @@ -37,7 +37,13 @@ * Rule: * on wiegand#uid=4302741608 do publish cmnd/ailight/power 2 endon * - * contains: + * 20220215 + * - fix 34-bit size parity chk + * - fix 64-bit representation after removal of %llu support (Tasmota does not support 64-bit decimal output specifier (%llu) saving 60k code) + * - change internal rfid size from uint64_t to uint32_t + * - limited max amount of kaypad presses to a 32-bit number (at least 999999999) + * --- + * 20201101 * - fix for #11047 Wiegand 26/34 missed some key press if they are press at normal speed * - removed testing code for tests without attached hardware * - added SetOption123 0-Wiegand UID decimal (default) 1-Wiegand UID hexadecimal @@ -102,23 +108,21 @@ class Wiegand { #if (DEV_WIEGAND_TEST_MODE!=1) private: #endif //(DEV_WIEGAND_TEST_MODE==1) - uint64_t CheckAndConvertRfid(uint64_t,uint16_t); + uint32_t CheckAndConvertRfid(uint64_t,uint16_t); uint8_t CalculateParities(uint64_t, int); bool WiegandConversion (uint64_t , uint16_t ); - void setOutputFormat(void); // fix output HEX format void HandleKeyPad(void); //handle one tag for multi key strokes - static void handleD0Interrupt(void); static void handleD1Interrupt(void); static void handleDxInterrupt(int in); // fix #11047 static void ClearRFIDBuffer(int); - uint64_t rfid; + uint32_t rfid; uint32_t tagSize; const char* outFormat; - uint64_t mqttRFIDKeypadBuffer; - uint64_t webRFIDKeypadBuffer; + uint32_t mqttRFIDKeypadBuffer; + uint32_t webRFIDKeypadBuffer; static volatile uint64_t rfidBuffer; static volatile uint16_t bitCount; @@ -145,15 +149,14 @@ volatile bool Wiegand::CodeComplete; volatile RFID_store Wiegand::rfid_found[WIEGAND_RFID_ARRAY_SIZE]; volatile int Wiegand::currentFoundRFIDcount; - - void IRAM_ATTR Wiegand::ClearRFIDBuffer(int endIndex = WIEGAND_RFID_ARRAY_SIZE) { - currentFoundRFIDcount=WIEGAND_RFID_ARRAY_SIZE-endIndex; // clear all buffers - for (int i= 0; i < endIndex; i++) { - rfid_found[i].RFID=0; - rfid_found[i].bitCount=0; - } + currentFoundRFIDcount = WIEGAND_RFID_ARRAY_SIZE - endIndex; // clear all buffers + for (uint32_t i = 0; i < endIndex; i++) { + rfid_found[i].RFID=0; + rfid_found[i].bitCount=0; + } } + void IRAM_ATTR Wiegand::handleD1Interrupt() { // Receive a 1 bit. (D0=high & D1=low) handleDxInterrupt(1); } @@ -163,9 +166,9 @@ void IRAM_ATTR Wiegand::handleD0Interrupt() { // Receive a 0 bit. (D0=low & D1= } void IRAM_ATTR Wiegand::handleDxInterrupt(int in) { - unsigned long curTime = micros(); // to be sure I will use micros() instead of millis() overflow is handle by using the minus operator to compare - unsigned long diffTime= curTime - lastFoundTime; - if ( (diffTime > CodeGapTime) && (bitCount > 0)) { + uint32_t curTime = micros(); // to be sure I will use micros() instead of millis() overflow is handle by using the minus operator to compare + uint32_t diffTime = curTime - lastFoundTime; + if ((diffTime > CodeGapTime) && (bitCount > 0)) { // previous RFID tag (key pad numer)is complete. Will be detected by the code ending gap // one bit will take the time of impulse_time + impulse_gap_time. it (bitTime) will be recalculated each time an impulse is detected // the devices will add some inter_code_gap_time to separate codes this will be much longer than the bit_time. (WIEGAND_CODE_GAP_FACTOR) @@ -188,7 +191,7 @@ void IRAM_ATTR Wiegand::handleDxInterrupt(int in) { FirstBitTimeStamp = (curTime != 0) ? curTime : 1; // accept 1µs differenct to avoid a miss the first timestamp if curTime is 0. } else if (bitCount == 2) { // only calculate once per RFID tag, but restrict to values, which are in within a plausible range - bitTime = ((diffTime > (WIEGAND_BIT_TIME_DEFAULT/4)) && (diffTime < (4*WIEGAND_BIT_TIME_DEFAULT))) ? diffTime : WIEGAND_BIT_TIME_DEFAULT; + bitTime = ((diffTime > (WIEGAND_BIT_TIME_DEFAULT / 4)) && (diffTime < (4 * WIEGAND_BIT_TIME_DEFAULT))) ? diffTime : WIEGAND_BIT_TIME_DEFAULT; CodeGapTime = WIEGAND_CODE_GAP_FACTOR * bitTime; } //save current rfid in array otherwise we will never see the last found tag @@ -243,7 +246,7 @@ void Wiegand::Init() { #endif // DEV_WIEGAND_TEST_MODE>0 } -uint64_t Wiegand::CheckAndConvertRfid(uint64_t rfidIn, uint16_t bitCount) { +uint32_t Wiegand::CheckAndConvertRfid(uint64_t rfidIn, uint16_t bitCount) { uint8_t evenParityBit = 0; uint8_t oddParityBit = (uint8_t) (rfidIn & 0x1); // Last bit = odd parity uint8_t calcParity = 0; @@ -264,8 +267,8 @@ uint64_t Wiegand::CheckAndConvertRfid(uint64_t rfidIn, uint16_t bitCount) { break; case 34: - evenParityBit = (rfidIn & 0x400000000) ? 0x80 : 0; - rfidIn = (rfidIn & 0x3FFFFFFFE) >>1; + evenParityBit = (rfidIn & 0x200000000) ? 0x80 : 0; + rfidIn = (rfidIn & 0x1FFFFFFFE) >>1; break; default: @@ -273,8 +276,8 @@ uint64_t Wiegand::CheckAndConvertRfid(uint64_t rfidIn, uint16_t bitCount) { } calcParity = CalculateParities(rfidIn, bitCount); // Check result on http://www.ccdesignworks.com/wiegand_calc.htm with raw tag as input if (calcParity != (evenParityBit | oddParityBit)) { // Parity bit is wrong + AddLog(LOG_LEVEL_DEBUG, PSTR("WIE: %_X parity error"), &rfidIn); // Print up to uint64_t rfidIn=0; - AddLog(LOG_LEVEL_DEBUG, PSTR("WIE: %llu parity error"), rfidIn); } #if (DEV_WIEGAND_TEST_MODE)>0 AddLog(LOG_LEVEL_INFO, PSTR("WIE: even (left) parity: %u "), (evenParityBit>>7)); @@ -282,10 +285,10 @@ uint64_t Wiegand::CheckAndConvertRfid(uint64_t rfidIn, uint16_t bitCount) { AddLog(LOG_LEVEL_INFO, PSTR("WIE: odd (right) parity: %u "), oddParityBit); AddLog(LOG_LEVEL_INFO, PSTR("WIE: odd (calc) parity: %u "), (calcParity & 0x01)); #endif // DEV_WIEGAND_TEST_MODE>0 - return rfidIn; + return (uint32_t)rfidIn; } -uint8_t Wiegand::CalculateParities(uint64_t tagWithoutParities, int tag_size=26) { +uint8_t Wiegand::CalculateParities(uint64_t tagWithoutParities, int tag_size = 26) { // tag_size is the size of the final tag including the 2 parity bits // So length if the tagWithoutParities should be (tag_size-2) !! That will be not profed and // lead to wrong results if the input value is larger! @@ -295,7 +298,7 @@ uint8_t Wiegand::CalculateParities(uint64_t tagWithoutParities, int tag_size=26) tag_size -= 2; if (tag_size <= 0) { return retValue; } // Prohibit div zero exception and other wrong inputs uint8_t parity = 1; // Check for odd parity on LSB - for (uint8_t i = 0; i < (tag_size / 2); i++) { + for (uint32_t i = 0; i < (tag_size / 2); i++) { parity ^= (tagWithoutParities & 1); tagWithoutParities >>= 1; } @@ -314,53 +317,47 @@ uint8_t Wiegand::CalculateParities(uint64_t tagWithoutParities, int tag_size=26) bool Wiegand::WiegandConversion (uint64_t rfidBuffer, uint16_t bitCount) { bool bRet = false; #if (DEV_WIEGAND_TEST_MODE)>0 - AddLog(LOG_LEVEL_INFO, PSTR("WIE: Raw tag %llu, Bit count %u"), rfidBuffer, bitCount); + AddLog(LOG_LEVEL_INFO, PSTR("WIE: Raw tag %_X, Bit count %u"), &rfidBuffer, bitCount); // Print up to uint64_t #endif // DEV_WIEGAND_TEST_MODE>0 - if ((24 == bitCount) || (26 == bitCount) || (32 == bitCount) || (34 == bitCount)) { - // 24, 26, 32, 34-bit Wiegand codes - rfid = CheckAndConvertRfid(rfidBuffer, bitCount); - tagSize = bitCount; + if ((24 == bitCount) || (26 == bitCount) || (32 == bitCount) || (34 == bitCount)) { + // 24, 26, 32, 34-bit Wiegand codes + rfid = CheckAndConvertRfid(rfidBuffer, bitCount); + tagSize = bitCount; + bRet = true; + } + else if (4 == bitCount) { + // 4-bit Wiegand codes for keypads + rfid = (uint32_t)(rfidBuffer & 0x0000000F); + tagSize = bitCount; + bRet = true; + } + else if (8 == bitCount) { + // 8-bit Wiegand codes for keypads with integrity + // 8-bit Wiegand keyboard data, high nibble is the "NOT" of low nibble + // eg if key 1 pressed, data=E1 in binary 11100001 , high nibble=1110 , low nibble = 0001 + char highNibble = (rfidBuffer & 0xf0) >>4; + char lowNibble = (rfidBuffer & 0x0f); + if (lowNibble == (~highNibble & 0x0f)) { // Check if low nibble matches the "NOT" of high nibble. + rfid = (uint32_t)(lowNibble); bRet = true; - } - else if (4 == bitCount) { - // 4-bit Wiegand codes for keypads - rfid = (int)(rfidBuffer & 0x0000000F); - tagSize = bitCount; - bRet = true; - } - else if (8 == bitCount) { - // 8-bit Wiegand codes for keypads with integrity - // 8-bit Wiegand keyboard data, high nibble is the "NOT" of low nibble - // eg if key 1 pressed, data=E1 in binary 11100001 , high nibble=1110 , low nibble = 0001 - char highNibble = (rfidBuffer & 0xf0) >>4; - char lowNibble = (rfidBuffer & 0x0f); - if (lowNibble == (~highNibble & 0x0f)) { // Check if low nibble matches the "NOT" of high nibble. - rfid = (int)(lowNibble); - bRet = true; - } else { - bRet = false; - } - tagSize = bitCount; } else { - // Time reached but unknown bitCount, clear and start again - tagSize = 0; bRet = false; } + tagSize = bitCount; + } else { + // Time reached but unknown bitCount, clear and start again + tagSize = 0; + bRet = false; + } #if (DEV_WIEGAND_TEST_MODE)>0 - AddLog(LOG_LEVEL_INFO, PSTR("WIE: Tag out %llu, tag size %u "), rfid, tagSize); + AddLog(LOG_LEVEL_INFO, PSTR("WIE: Tag out %u, tag size %u "), rfid, tagSize); #endif // DEV_WIEGAND_TEST_MODE>0 return bRet; } -void Wiegand::setOutputFormat(void) -{ - if (GetOption(WIEGAND_OPTION_HEX) == 0) { outFormat = "u"; } - else { outFormat = "X" WIEGAND_OPTION_HEX_POSTFIX ; } -} - void Wiegand::HandleKeyPad(void) { // will be called if a valid key pad input was recognized - if (GetOption(WIEGAND_OPTION_KEYPAD_TO_TAG) == 0) { // handle all key pad inputs as ONE Tag until # is recognized - if ( (tagSize == 4) || (tagSize == 8) ) { + if (GetOption(WIEGAND_OPTION_KEYPAD_TO_TAG) == 0) { // handle all key pad inputs as ONE Tag until # is recognized + if ((tagSize == 4) || (tagSize == 8)) { //only handle Keypad strokes if it is requested if (rfid >= 0x0a) { // # * as end of input detected -> all key values which are larger than 9 rfid = mqttRFIDKeypadBuffer; // original tagsize of 4 or 8 will be kept. @@ -368,7 +365,7 @@ void Wiegand::HandleKeyPad(void) { // will be called if a valid key pad input wa mqttRFIDKeypadBuffer = 0; } else { - mqttRFIDKeypadBuffer = (mqttRFIDKeypadBuffer*10)+rfid; //left shift + new key + mqttRFIDKeypadBuffer = (mqttRFIDKeypadBuffer * 10) + rfid; //left shift + new key webRFIDKeypadBuffer = mqttRFIDKeypadBuffer; // visualising the current typed keys rfid = 0; tagSize = 0; @@ -382,38 +379,33 @@ void Wiegand::HandleKeyPad(void) { // will be called if a valid key pad input wa } void Wiegand::ScanForTag() { - unsigned long startTime = micros(); + uint32_t startTime = micros(); handleDxInterrupt(3); - if (currentFoundRFIDcount > 0) { - unsigned int lastFoundRFIDcount = currentFoundRFIDcount; - #if (DEV_WIEGAND_TEST_MODE)>0 - AddLog(LOG_LEVEL_INFO, PSTR("WIE: ScanForTag(). bitTime: %0lu lastFoundTime: %0lu RFIDS in buffer: %lu"), bitTime, lastFoundTime, currentFoundRFIDcount); - #endif - // format MQTT output -// setOutputFormat(); -// char sFormat[50]; -// snprintf( sFormat, 50, PSTR(",\"Wiegand\":{\"UID\":%%0ll%s,\"" D_JSON_SIZE "\":%%%s}}"), outFormat, outFormat); - for (int i= 0; i < WIEGAND_RFID_ARRAY_SIZE; i++) - { - if (rfid_found[i].RFID != 0 || (rfid_found[i].RFID == 0 && i == 0)) { - uint64_t oldTag = rfid; + if (currentFoundRFIDcount > 0) { + uint32_t lastFoundRFIDcount = currentFoundRFIDcount; +#if (DEV_WIEGAND_TEST_MODE)>0 + AddLog(LOG_LEVEL_INFO, PSTR("WIE: ScanForTag(). bitTime: %u lastFoundTime: %u RFIDS in buffer: %u"), bitTime, lastFoundTime, currentFoundRFIDcount); +#endif + for (uint32_t i = 0; i < WIEGAND_RFID_ARRAY_SIZE; i++) { + if (rfid_found[i].RFID != 0 || (rfid_found[i].RFID == 0 && i == 0)) { + uint32_t oldTag = rfid; bool validKey = WiegandConversion(rfid_found[i].RFID, rfid_found[i].bitCount); - #if (DEV_WIEGAND_TEST_MODE)>0 - AddLog(LOG_LEVEL_INFO, PSTR("WIE: ValidKey: %d Previous tag %llu"), validKey, oldTag); - #endif // DEV_WIEGAND_TEST_MODE>0 +#if (DEV_WIEGAND_TEST_MODE)>0 + AddLog(LOG_LEVEL_INFO, PSTR("WIE: ValidKey %d, Previous tag %u"), validKey, oldTag); +#endif // DEV_WIEGAND_TEST_MODE>0 if (validKey) { // Only in case of valid key do action. Issue#10585 HandleKeyPad(); //support one tag for multi key input - if (tagSize>0) { //do output only for rfids which are complete + if (tagSize > 0) { //do output only for rfids which are complete if (oldTag == rfid) { AddLog(LOG_LEVEL_DEBUG, PSTR("WIE: Old tag")); } -// ResponseTime_P(sFormat, rfid, tagSize); -// Tasmota does not support 64-bit decimal output specifier (%llu) saving 60k code + ResponseTime_P(PSTR(",\"Wiegand\":{\"UID\":")); if (GetOption(WIEGAND_OPTION_HEX) == 0) { - ResponseTime_P(PSTR(",\"Wiegand\":{\"UID\":%lu,\"" D_JSON_SIZE "\":%d}}"), (uint32_t)rfid, tagSize); + ResponseAppend_P(PSTR("%u"), rfid); } else { - ResponseTime_P(PSTR(",\"Wiegand\":{\"UID\":\"%2_X" WIEGAND_OPTION_HEX_POSTFIX "\",\"" D_JSON_SIZE "\":\"%X" WIEGAND_OPTION_HEX_POSTFIX "\"}}"), &rfid, tagSize); + ResponseAppend_P(PSTR("\"%X" WIEGAND_OPTION_HEX_POSTFIX "\""), rfid); } + ResponseAppend_P(PSTR(",\"" D_JSON_SIZE "\":%d}}"), tagSize); MqttPublishTeleSensor(); } } @@ -422,33 +414,29 @@ void Wiegand::ScanForTag() { if (currentFoundRFIDcount > lastFoundRFIDcount) { // if that happens: we need to move the id found during the loop to top of the array // and correct the currentFoundRFIDcount - AddLog(LOG_LEVEL_INFO, PSTR("WIE: ScanForTag() %lu tags added while working on buffer"), (currentFoundRFIDcount-lastFoundRFIDcount)); + AddLog(LOG_LEVEL_INFO, PSTR("WIE: ScanForTag() %u tags added while working on buffer"), (currentFoundRFIDcount - lastFoundRFIDcount)); } ClearRFIDBuffer(); //reset array - #if (DEV_WIEGAND_TEST_MODE)>0 - AddLog(LOG_LEVEL_INFO, PSTR("WIE: ScanForTag() time elapsed %lu"), (micros() - startTime)); - #endif +#if (DEV_WIEGAND_TEST_MODE)>0 + AddLog(LOG_LEVEL_INFO, PSTR("WIE: ScanForTag() time elapsed %u"), (micros() - startTime)); +#endif } - } #ifdef USE_WEBSERVER void Wiegand::Show(void) { -// setOutputFormat(); -// char sFormat [30]; -// snprintf( sFormat, 30,PSTR("{s}Wiegand UID{m}%%ll%s {e}"), outFormat); -// if (tagSize>0) { WSContentSend_PD(sFormat, rfid); } -// else { WSContentSend_PD(sFormat, webRFIDKeypadBuffer); } -// Tasmota does not support 64-bit decimal output specifier (%llu) saving 60k code - if (GetOption(WIEGAND_OPTION_HEX) == 0) { - WSContentSend_P(PSTR("{s}Wiegand UID{m}%lu{e}"), (tagSize>0) ? (uint32_t)rfid : (uint32_t)webRFIDKeypadBuffer); - } else { - WSContentSend_P(PSTR("{s}Wiegand UID{m}%2_X" WIEGAND_OPTION_HEX_POSTFIX "{e}"), (tagSize>0) ? &rfid : &webRFIDKeypadBuffer); - } - #if (DEV_WIEGAND_TEST_MODE)>0 - AddLog(LOG_LEVEL_INFO, PSTR("WIE: Tag %llu, Bits %u"), rfid, bitCount); - #endif // DEV_WIEGAND_TEST_MODE>0 + WSContentSend_P(PSTR("{s}Wiegand UID{m}")); + if (GetOption(WIEGAND_OPTION_HEX) == 0) { + WSContentSend_P(PSTR("%u"), (tagSize > 0) ? rfid : webRFIDKeypadBuffer); + } else { + WSContentSend_P(PSTR("%X" WIEGAND_OPTION_HEX_POSTFIX), (tagSize > 0) ? rfid : webRFIDKeypadBuffer); + } + WSContentSend_P(PSTR("{e}")); + +#if (DEV_WIEGAND_TEST_MODE)>0 + AddLog(LOG_LEVEL_INFO, PSTR("WIE: Tag %u, Bits %u"), rfid, bitCount); +#endif // DEV_WIEGAND_TEST_MODE>0 } #endif // USE_WEBSERVER diff --git a/tools/decode-status.py b/tools/decode-status.py index 1988fbb06..8295f4ce8 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -262,7 +262,7 @@ a_features = [[ "USE_MCP2515","USE_TASMESH","USE_WIFI_RANGE_EXTENDER","USE_INFLUXDB", "USE_HRG15","USE_VINDRIKTNING","USE_SCD40","USE_HM330X", "USE_HDC2010","USE_LSC_MCSL","USE_SONOFF_SPM","USE_SHIFT595", - "USE_SDM230","USE_CM110x","","", + "USE_SDM230","USE_CM110x","USE_BL6523","", "","","","", "","","","" ]] @@ -292,7 +292,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v20220115 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v11.0.0.1 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj))