From 03f2e0b6e98c64ea9fa5284c7267f0ca5f6cad14 Mon Sep 17 00:00:00 2001 From: rogg Date: Tue, 23 Aug 2022 20:38:11 -0700 Subject: [PATCH 01/46] Use Wifi.hostByName() for ESP8266 Saves ~1K on ESP8266. Also, the check for resolving to 255.255.255.255 is already done by Wifi.hostByName(). --- tasmota/tasmota_support/support_wifi.ino | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index af50e53ac..d1fd40d95 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -817,14 +817,16 @@ void wifiKeepAlive(void) { #endif // ESP8266 bool WifiHostByName(const char* aHostname, IPAddress& aResult) { +#ifdef ESP8266 + if (WiFi.hostByName(aHostname, aResult, Settings->dns_timeout)) { + return true; + } +#else // DnsClient can't do one-shot mDNS queries so use WiFi.hostByName() for *.local size_t hostname_len = strlen(aHostname); if (strstr_P(aHostname, PSTR(".local")) == &aHostname[hostname_len] - 6) { if (WiFi.hostByName(aHostname, aResult)) { - // Host name resolved - if (0xFFFFFFFF != (uint32_t)aResult) { - return true; - } + return true; } } else { // Use this instead of WiFi.hostByName or connect(host_name,.. to block less if DNS server is not found @@ -834,6 +836,7 @@ bool WifiHostByName(const char* aHostname, IPAddress& aResult) { return true; } } +#endif AddLog(LOG_LEVEL_DEBUG, PSTR("DNS: Unable to resolve '%s'"), aHostname); return false; } From eb96127efd126701a70f894fe218a6251341507f Mon Sep 17 00:00:00 2001 From: barbudor Date: Sun, 28 Aug 2022 16:49:52 +0200 Subject: [PATCH 02/46] allow SerialBuffer up to 2048 --- tasmota/include/tasmota.h | 4 +++- tasmota/tasmota_support/support_command.ino | 13 ++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index 0ec8fa05f..a9e21c796 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -195,7 +195,9 @@ const uint8_t OTA_ATTEMPTS = 10; // Number of times to try fetching t const uint8_t OTA_ATTEMPTS = 5; // Number of times to try fetching the new firmware #endif // ESP8266 -const uint16_t INPUT_BUFFER_SIZE = 520; // Max number of characters in serial command buffer +const uint16_t INPUT_BUFFER_SIZE = 520; // Max number of characters in Tasmota serial command buffer +const uint16_t MIN_INPUT_BUFFER_SIZE = 256; // Max number of characters in Tasmota serial command buffer +const uint16_t MAX_INPUT_BUFFER_SIZE = 2048; // Max number of characters in Arduino serial command buffer const uint16_t FLOATSZ = 16; // Max number of characters in float result from dtostrfd (max 32) const uint16_t CMDSZ = 24; // Max number of characters in command const uint16_t TOPSZ = 151; // Max number of characters in topic string diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 22ebd743a..e29c3ccb9 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -1830,16 +1830,19 @@ void CmndSerialConfig(void) void CmndSerialBuffer(void) { // Allow non-pesistent serial receive buffer size change - // between 256 (default) and 520 (INPUT_BUFFER_SIZE) characters + // between MIN_INPUT_BUFFER_SIZE and MAX_INPUT_BUFFER_SIZE characters size_t size = 0; if (XdrvMailbox.data_len > 0) { size = XdrvMailbox.payload; - if (XdrvMailbox.payload < 256) { - size = 256; - } - if ((1 == XdrvMailbox.payload) || (XdrvMailbox.payload > INPUT_BUFFER_SIZE)) { + if (1 == XdrvMailbox.payload) { size = INPUT_BUFFER_SIZE; } + else if (XdrvMailbox.payload < MIN_INPUT_BUFFER_SIZE) { + size = MIN_INPUT_BUFFER_SIZE; + } + else if (XdrvMailbox.payload > MAX_INPUT_BUFFER_SIZE) { + size = MAX_INPUT_BUFFER_SIZE; + } Serial.setRxBufferSize(size); } #ifdef ESP8266 From 9c06a3713e3d218bbca42690c9d37e04c1ebabf8 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 28 Aug 2022 17:35:13 +0200 Subject: [PATCH 03/46] Show all temperature sensors on display Show alternating temperature sensors on Sonoff THR3xxD display (#15856) --- .../xdrv_87_tm1621_sonoff.ino | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino b/tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino index 844033f59..5b967fa31 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino @@ -46,6 +46,8 @@ struct Tm1621 { uint8_t pin_wr; uint8_t state; uint8_t device; + uint8_t temp_sensors; + uint8_t temp_sensors_rotate; bool celsius; bool fahrenheit; bool humidity; @@ -223,6 +225,38 @@ void TM1621Init(void) { TM1621SendRows(); } +float TM1621GetTemperatureValues(uint32_t index) { + char *start = ResponseData(); + int data_start = ResponseLength(); + + XsnsCall(FUNC_JSON_APPEND); + XdrvCall(FUNC_JSON_APPEND); + + if (data_start == ResponseLength()) { return NAN; } + + float value = NAN; + uint32_t idx = 0; + char *data = start; // Invalid JSON ,"HTU21":{"Temperature":30.7,"Humidity":39.0,"DewPoint":15.2},"BME680":{"Temperature":30.0,"Humidity":50.4,"DewPoint":18.5,"Pressure":1009.6,"Gas":1660.52},"ESP32":{"Temperature":53.3} + while (data) { + data = strstr_P(data, PSTR(D_JSON_TEMPERATURE)); + if (data) { + idx++; + data += 13; // strlen("Temperature") + 2; + float new_value = CharToFloat(data); + if (idx == index) { + value = new_value; + if (Tm1621.temp_sensors) { + break; + } + } + } + } + if (0 == Tm1621.temp_sensors) { + Tm1621.temp_sensors = idx; + } + return value; +} + void TM1621Show(void) { if (TM1621_POWR316D == Tm1621.device) { static uint32_t display = 0; @@ -250,8 +284,26 @@ void TM1621Show(void) { snprintf_P(Tm1621.row[1], sizeof(Tm1621.row[1]), PSTR(" ")); if (!isnan(TasmotaGlobal.temperature_celsius)) { float temperature = ConvertTempToFahrenheit(TasmotaGlobal.temperature_celsius); + if (TasmotaGlobal.humidity == 0.0f) { // No humidity so check for more temperature sensors + if (0 == Tm1621.temp_sensors) { + TM1621GetTemperatureValues(100); // Find max number of temperature sensors + } + if (Tm1621.temp_sensors > 1) { + if (Tm1621.temp_sensors > 2) { + Tm1621.temp_sensors_rotate++; + if (Tm1621.temp_sensors_rotate > Tm1621.temp_sensors) { + Tm1621.temp_sensors_rotate = 1; + } + temperature = TM1621GetTemperatureValues(Tm1621.temp_sensors_rotate); + ext_snprintf_P(Tm1621.row[1], sizeof(Tm1621.row[1]), PSTR("%d"), Tm1621.temp_sensors_rotate); + } else { + float temperature2 = TM1621GetTemperatureValues(2); + ext_snprintf_P(Tm1621.row[1], sizeof(Tm1621.row[1]), PSTR("%1_f"), &temperature2); + } + } + } ext_snprintf_P(Tm1621.row[0], sizeof(Tm1621.row[0]), PSTR("%1_f"), &temperature); - if (Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit + if (Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit Tm1621.fahrenheit = true; } else { Tm1621.celsius = true; From 3a1bbda4a501da3617e19ceade10c9d4842edd12 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 28 Aug 2022 18:22:06 +0200 Subject: [PATCH 04/46] refactor tm1621 --- tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino b/tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino index 5b967fa31..1feafe243 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_87_tm1621_sonoff.ino @@ -242,9 +242,8 @@ float TM1621GetTemperatureValues(uint32_t index) { if (data) { idx++; data += 13; // strlen("Temperature") + 2; - float new_value = CharToFloat(data); if (idx == index) { - value = new_value; + value = CharToFloat(data); if (Tm1621.temp_sensors) { break; } From adaf167b7e5d3976ccbd391c6c212eab0b563e24 Mon Sep 17 00:00:00 2001 From: Dan BENDAVID <38190460+DanBendavid@users.noreply.github.com> Date: Sun, 28 Aug 2022 20:36:50 +0200 Subject: [PATCH 05/46] Update WT32_SC01.ini This display.ini is working on my WT32-SC01 with 16MB PSRam. --- tasmota/displaydesc/WT32_SC01.ini | 34 +++++++++++++++++++------------ 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/tasmota/displaydesc/WT32_SC01.ini b/tasmota/displaydesc/WT32_SC01.ini index 5e93545d3..b3122edf2 100644 --- a/tasmota/displaydesc/WT32_SC01.ini +++ b/tasmota/displaydesc/WT32_SC01.ini @@ -1,28 +1,36 @@ -:H,WT32-SC01,480,320,16,SPI,1,*,*,*,*,*,*,*,80 +:H,ST7796,480,320,16,SPI,1,*,*,*,*,*,*,*,40 :S,2,1,1,0,40,20 :I -01,80 -F0,1,C3 -F0,1,96 -C5,1,1C +EF,3,03,80,02 +CF,3,00,C1,30 +ED,4,64,03,12,81 +E8,3,85,00,78 +CB,5,39,2C,00,34,02 +F7,1,20 +EA,2,00,00 +C0,1,23 +C1,1,10 +C5,2,3e,28 +C7,1,86 36,1,48 +37,1,00 3A,1,55 -B0,1,80 -B4,1,01 -B6,3,80,02,3B -B7,1,C6 -F0,1,69 -F0,1,3C +B1,2,00,18 +B6,3,08,82,27 +F2,1,00 +26,1,01 +E0,0F,0F,31,2B,0C,0E,08,4E,F1,37,07,10,03,0E,09,00 +E1,0F,00,0E,14,03,11,07,31,C1,48,08,0F,0C,31,36,0F 11,80 29,80 :o,28 :O,29 +:A,2A,2B,2C :R,36 :0,28,00,00,01 :1,88,00,00,02 :2,E8,00,00,03 :3,48,00,00,00 :i,20,21 -:A,2A,2B,2C :TI1,38,*,* -# \ No newline at end of file +# From 23ba25c6652906bdedb7b3c8761a8f4fe9f99f4f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 29 Aug 2022 14:31:05 +0200 Subject: [PATCH 06/46] Refactor WifiHostByName() --- tasmota/tasmota_support/support_wifi.ino | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index d1fd40d95..9bce4cda4 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -819,17 +819,23 @@ void wifiKeepAlive(void) { bool WifiHostByName(const char* aHostname, IPAddress& aResult) { #ifdef ESP8266 if (WiFi.hostByName(aHostname, aResult, Settings->dns_timeout)) { - return true; + // Host name resolved + if (0xFFFFFFFF != (uint32_t)aResult) { + return true; + } } #else // DnsClient can't do one-shot mDNS queries so use WiFi.hostByName() for *.local size_t hostname_len = strlen(aHostname); if (strstr_P(aHostname, PSTR(".local")) == &aHostname[hostname_len] - 6) { if (WiFi.hostByName(aHostname, aResult)) { - return true; + // Host name resolved + if (0xFFFFFFFF != (uint32_t)aResult) { + return true; + } } } else { - // Use this instead of WiFi.hostByName or connect(host_name,.. to block less if DNS server is not found + // Use this instead of WiFi.hostByName or connect(host_name,.. to block less if DNS server is not found uint32_t dns_address = (!TasmotaGlobal.global_state.eth_down) ? Settings->eth_ipv4_address[3] : Settings->ipv4_address[3]; DnsClient.begin((IPAddress)dns_address); if (1 == DnsClient.getHostByName(aHostname, aResult)) { From d4f35305393c27968e9499c8b97d0787b3ccaaa4 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 29 Aug 2022 19:27:06 +0200 Subject: [PATCH 07/46] Berry stricter strict mode --- lib/libesp32/berry/src/be_parser.c | 7 ++++++- lib/libesp32/berry/src/be_var.c | 15 +++++++++++++++ lib/libesp32/berry/src/be_var.h | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 3f2fc20d0..f9267d5cc 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -469,6 +469,12 @@ static int new_upval(bvm *vm, bfuncinfo *finfo, bstring *name, bexpdesc *var) static void new_var(bparser *parser, bstring *name, bexpdesc *var) { bfuncinfo *finfo = parser->finfo; + if (comp_is_strict(parser->vm)) { + /* check if we are masking a builtin */ + if (be_builtin_class_find(parser->vm, name) >= 0) { + push_error(parser, "strict: redefinition of builtin '%s'", str(name)); + } + } if (finfo->prev || finfo->binfo->prev || parser->islocal) { init_exp(var, ETLOCAL, 0); var->v.idx = new_localvar(parser, name); /* if local, contains the index in current local var list */ @@ -982,7 +988,6 @@ static void compound_assign(bparser *parser, int op, bexpdesc *l, bexpdesc *r) /* A new implicit local variable is created if no global has the same name (excluding builtins) */ /* This means that you can override a builtin silently */ /* This also means that a function cannot create a global, they must preexist or create with `global` module */ -/* TODO add warning in strict mode */ static int check_newvar(bparser *parser, bexpdesc *e) { if (e->type == ETGLOBAL) { diff --git a/lib/libesp32/berry/src/be_var.c b/lib/libesp32/berry/src/be_var.c index 1a8e5b18c..cf4ffa95b 100644 --- a/lib/libesp32/berry/src/be_var.c +++ b/lib/libesp32/berry/src/be_var.c @@ -132,6 +132,21 @@ int be_builtin_find(bvm *vm, bstring *name) return -1; /* not found */ } +/* find in the list of builtins or classes - used by strict to avoid accidental change of those */ +int be_builtin_class_find(bvm *vm, bstring *name) +{ + bvalue *res = be_map_findstr(vm, builtin(vm).vtab, name); + if (res) { + return var_toidx(res); + } else { + int idx = global_native_class_find(vm, name); + if (idx >= 0) { + return idx; + } + } + return -1; /* not found */ +} + bstring* be_builtin_name(bvm *vm, int index) { bmap *map = builtin(vm).vtab; diff --git a/lib/libesp32/berry/src/be_var.h b/lib/libesp32/berry/src/be_var.h index 6b9908a6b..565e587e3 100644 --- a/lib/libesp32/berry/src/be_var.h +++ b/lib/libesp32/berry/src/be_var.h @@ -23,6 +23,7 @@ int be_global_new(bvm *vm, bstring *name); bvalue* be_global_var(bvm *vm, int index); void be_global_release_space(bvm *vm); int be_builtin_find(bvm *vm, bstring *name); +int be_builtin_class_find(bvm *vm, bstring *name); bstring* be_builtin_name(bvm *vm, int index); int be_builtin_new(bvm *vm, bstring *name); void be_bulitin_release_space(bvm *vm); From 475b4f3fe34c7dba8273b05bea62e097f5ee7466 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Sat, 27 Aug 2022 09:27:09 +0200 Subject: [PATCH 08/46] Rework flowmeter --- .../xsns_96_flowratemeter.ino | 250 +++++++++++++----- 1 file changed, 183 insertions(+), 67 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino index 4e43bd6b8..2cbe54947 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino @@ -29,30 +29,34 @@ #define FLOWRATEMETER_WEIGHT_AVG_SAMPLE 20 // number of samples for smooth weigted average #define FLOWRATEMETER_MIN_FREQ 1 // Hz -#define D_JSON_FLOWRATEMETER_RATE "Rate" -#define D_JSON_FLOWRATEMETER_VALUE "Value" -#define D_JSON_FLOWRATEMETER_UNIT "Unit" -#define D_JSON_FLOWRATEMETER_VALUE_AVG "average" -#define D_JSON_FLOWRATEMETER_VALUE_RAW "raw" +#define D_UNIT_CUBIC_METER "m³" + +#define D_JSON_FLOWRATEMETER_RATE "Rate" +#define D_JSON_FLOWRATEMETER_VALUE "Source" +#define D_JSON_FLOWRATEMETER_UNIT "Unit" +#define D_JSON_FLOWRATEMETER_AMOUNT_TODAY "AmountToday" +#define D_JSON_FLOWRATEMETER_AMOUNT_UNIT "AmountUnit" +#define D_JSON_FLOWRATEMETER_DURATION_TODAY "DurationToday" +#define D_JSON_FLOWRATEMETER_VALUE_AVG "average" +#define D_JSON_FLOWRATEMETER_VALUE_RAW "raw" - -#ifdef USE_WEBSERVER -const char HTTP_SNS_FLOWRATEMETER[] PROGMEM = - "{s}" D_FLOWRATEMETER_NAME "-%d{m}%*_f %s{e}" - ; -#endif // USE_WEBSERVER - +#define FLOWRATEMETER_INVALID (uint32_t)-1 int32_t flowratemeter_period[MAX_FLOWRATEMETER] = {0}; float flowratemeter_period_avg[MAX_FLOWRATEMETER] = {0}; uint32_t flowratemeter_count[MAX_FLOWRATEMETER] = {0}; -volatile uint32_t flowratemeter_last_irq[MAX_FLOWRATEMETER] = {0}; +volatile uint32_t flowratemeter_last_irq[MAX_FLOWRATEMETER] = {FLOWRATEMETER_INVALID}; + +int32_t flowratemeter_period_sum[MAX_FLOWRATEMETER]; +int32_t flowratemeter_period_sum_dT[MAX_FLOWRATEMETER]; +int32_t flowratemeter_period_duration[MAX_FLOWRATEMETER]; + -bool flowratemeter_valuesread = false; bool flowratemeter_raw_value = false; +#define FlowRateMeterIsValid(time, meter) flowratemeter_last_irq[meter] != FLOWRATEMETER_INVALID && flowratemeter_last_irq[meter] < time void IRAM_ATTR FlowRateMeterIR(uint16_t irq) { @@ -62,12 +66,16 @@ void IRAM_ATTR FlowRateMeterIR(uint16_t irq) GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); #endif if (irq < MAX_FLOWRATEMETER) { - if ((time - flowratemeter_last_irq[irq]) < (1000000 / FLOWRATEMETER_MIN_FREQ)) { - flowratemeter_period[irq] = time - flowratemeter_last_irq[irq]; - } else { - flowratemeter_period[irq] = 0; + if (FlowRateMeterIsValid(time, irq)) { + if ((time - flowratemeter_last_irq[irq]) < (1000000 / FLOWRATEMETER_MIN_FREQ)) { + flowratemeter_period_sum_dT[irq] = millis(); + flowratemeter_period_sum[irq]++; + flowratemeter_period[irq] = time - flowratemeter_last_irq[irq]; + flowratemeter_period_duration[irq] += flowratemeter_period[irq] / 100; + } else { + flowratemeter_period[irq] = 0; + } } - flowratemeter_valuesread = true; flowratemeter_last_irq[irq] = time; } } @@ -81,20 +89,36 @@ void IRAM_ATTR FlowRateMeter2IR(void) FlowRateMeterIR(1); } +void FlowRateMeterMidnightReset(void) +{ + uint32_t t = millis(); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + flowratemeter_period_sum[i] = 0; + flowratemeter_period_duration[i] = 0; + flowratemeter_period_sum_dT[i] = t; + } +} + void FlowRateMeterRead(void) { for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { - if ((micros() - flowratemeter_last_irq[i]) >= (1000000 / FLOWRATEMETER_MIN_FREQ)) { - flowratemeter_period[i] = 0; - flowratemeter_period_avg[i] = 0; - } + uint32_t time = micros(); + if (PinUsed(GPIO_FLOWRATEMETER_IN, i) && FlowRateMeterIsValid(time, i)) { + if ((time - flowratemeter_last_irq[i]) >= (1000000 / FLOWRATEMETER_MIN_FREQ)) { + // invalid in case of pulse outage + flowratemeter_period[i] = 0; + flowratemeter_period_avg[i] = 0; + flowratemeter_count[i] = 0; + flowratemeter_last_irq[i] = FLOWRATEMETER_INVALID; + } - // exponentially weighted average - if (flowratemeter_count[i] <= FLOWRATEMETER_WEIGHT_AVG_SAMPLE) { - flowratemeter_count[i]++; + // exponentially weighted average + if (flowratemeter_count[i] <= FLOWRATEMETER_WEIGHT_AVG_SAMPLE) { + flowratemeter_count[i]++; + } + flowratemeter_period_avg[i] -= flowratemeter_period_avg[i] / flowratemeter_count[i]; + flowratemeter_period_avg[i] += float(flowratemeter_period[i]) / flowratemeter_count[i]; } - flowratemeter_period_avg[i] -= flowratemeter_period_avg[i] / flowratemeter_count[i]; - flowratemeter_period_avg[i] += float(flowratemeter_period[i]) / flowratemeter_count[i]; } } @@ -102,7 +126,7 @@ void FlowRateMeterInit(void) { void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowRateMeter1IR, FlowRateMeter2IR}; - flowratemeter_valuesread = false; + FlowRateMeterMidnightReset(); for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { pinMode(Pin(GPIO_FLOWRATEMETER_IN, i), INPUT); @@ -111,50 +135,139 @@ void FlowRateMeterInit(void) } } -void FlowRateMeterShow(bool json) +void FlowRateMeterGetValue(uint32_t meter, float *rate_float, float *amount_today) { - if (json) { - ResponseAppend_P(PSTR(",\"" D_FLOWRATEMETER_NAME "\":{\"" D_JSON_FLOWRATEMETER_RATE "\":[")); - } - - for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { - float flowratemeter_rate_avg_float = 0; - - if (flowratemeter_period[i]) { - flowratemeter_rate_avg_float = - ((Settings->SensorBits1.flowratemeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) - / (flowratemeter_raw_value ? flowratemeter_period[i] : flowratemeter_period_avg[i]) - * (Settings->flowratemeter_calibration[i] ? (float)Settings->flowratemeter_calibration[i] : 1000.0); - } - - if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { - if (json) { - ResponseAppend_P(PSTR("%s%*_f"), - i ? PSTR(",") : PSTR(""), - Settings->flag2.frequency_resolution, &flowratemeter_rate_avg_float - ); - -#ifdef USE_WEBSERVER - } else { - WSContentSend_PD(HTTP_SNS_FLOWRATEMETER, - i+1, - Settings->flag2.frequency_resolution, &flowratemeter_rate_avg_float, - Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE - ); -#endif // USE_WEBSERVER - } + if (nullptr != rate_float) { + *rate_float = 0; + if (meter < MAX_FLOWRATEMETER && flowratemeter_period[meter]) { + *rate_float = + (1000000.0 / 60.0 / 2.0) + / (flowratemeter_raw_value ? flowratemeter_period[meter] : flowratemeter_period_avg[meter]) + * (Settings->flowratemeter_calibration[meter] ? (float)Settings->flowratemeter_calibration[meter] : 1000.0); } } - if (json) { - ResponseAppend_P(PSTR("],\"" D_JSON_FLOWRATEMETER_VALUE "\":\"%s\""), - flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) - ); - ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}"), - Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE) - ); + + if (nullptr != amount_today) { + *amount_today = 0; + if (meter < MAX_FLOWRATEMETER && flowratemeter_period_sum[meter]) { + uint32_t _flowratemeter_period = (uint32_t)((float)flowratemeter_period_sum_dT[meter] / (float)flowratemeter_period_sum[meter] * 1000.0); + float lmin = (((1000000.0 / 60.0) / 2.0) / _flowratemeter_period * (Settings->flowratemeter_calibration[meter] ? (float)Settings->flowratemeter_calibration[meter] : 1000.0)); + *amount_today = (lmin / 60000) * flowratemeter_period_sum_dT[meter]; + } } } +void FlowRateMeterShow(bool json) +{ + uint16_t flowmeter_count = 0; + const char* open_square_bracket; + const char* close_square_bracket; + float flowratemeter_rate_float[MAX_FLOWRATEMETER]; + float floatrate_amount_today[MAX_FLOWRATEMETER]; + + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + FlowRateMeterGetValue(i, &flowratemeter_rate_float[i], &floatrate_amount_today[i]); + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + flowmeter_count++; + } + } + if (flowmeter_count > 1) { + open_square_bracket = PSTR("["); + close_square_bracket = PSTR("]"); + } else { + open_square_bracket = PSTR(""); + close_square_bracket = PSTR(""); + } + + if (json) { + ResponseAppend_P(PSTR(",\"" D_FLOWRATEMETER_NAME "\":{\"" D_JSON_FLOWRATEMETER_RATE "\":%s"), open_square_bracket); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float rate = Settings->SensorBits1.flowratemeter_unit ? flowratemeter_rate_float[i] * 60 / 1000 : flowratemeter_rate_float[i]; + ResponseAppend_P(PSTR("%s%*_f"), i ? PSTR(",") : PSTR(""), Settings->flag2.frequency_resolution, &rate); + } + } + ResponseAppend_P(PSTR("%s,\"" D_JSON_FLOWRATEMETER_AMOUNT_TODAY "\":%s"), close_square_bracket, open_square_bracket); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; + ResponseAppend_P(PSTR("%s%*_f"), i ? PSTR(",") : PSTR(""), Settings->flag2.frequency_resolution, &amount_today); + } + } + ResponseAppend_P(PSTR("%s,\"" D_JSON_FLOWRATEMETER_DURATION_TODAY "\":%s"), close_square_bracket, open_square_bracket); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + ResponseAppend_P(PSTR("%s%ld"), i ? PSTR(",") : PSTR(""), flowratemeter_period_duration[i] / 10000); + } + } + ResponseAppend_P(PSTR("%s,\"" D_JSON_FLOWRATEMETER_VALUE "\":\"%s\""), + close_square_bracket, + flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) + ); + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_AMOUNT_UNIT "\":\"%s\""), + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBIC_METER) : PSTR(D_UNIT_LITERS)); + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}"), + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE)); +#ifdef USE_WEBSERVER + } else { + // {s} = , {m} = , {e} = + if (flowmeter_count > 1) { + // head + WSContentSend_PD(PSTR("{s}  ")); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + WSContentSend_PD(PSTR("%d "), + Settings->flag5.gui_table_align ? PSTR("right") : PSTR("center"), + i+1 + ); + } + } + WSContentSend_PD(PSTR(" ")); + } + + // Flowrate + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME "{m} ")); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float rate = Settings->SensorBits1.flowratemeter_unit ? flowratemeter_rate_float[i] * 60 / 1000 : flowratemeter_rate_float[i]; + WSContentSend_PD(PSTR("%*_f "), + Settings->flag5.gui_table_align ? PSTR("right") : PSTR("center"), + Settings->flag2.frequency_resolution, &rate + ); + } + } + WSContentSend_PD(PSTR("%s{e}"), Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE)); + + // Amount today + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " Amount Today" "{m} ")); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; + WSContentSend_PD(PSTR("%*_f "), + Settings->flag5.gui_table_align ? PSTR("right") : PSTR("center"), + Settings->flag2.frequency_resolution, &amount_today + ); + } + } + WSContentSend_PD(PSTR("%s{e}"), Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBIC_METER) : PSTR(D_UNIT_LITERS)); + + // Duration today + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " Duration Today" "{m} ")); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; + WSContentSend_PD(PSTR("%s "), + (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("center"), + GetDuration(flowratemeter_period_duration[i] / 10000).c_str() + ); + } + } + WSContentSend_PD(PSTR("{e}")); +#endif // USE_WEBSERVER + } +} + + /*********************************************************************************************\ * Supported commands for Sensor96: * @@ -246,6 +359,9 @@ bool Xsns96(uint8_t function) case FUNC_INIT: FlowRateMeterInit(); break; + case FUNC_SAVE_AT_MIDNIGHT: + FlowRateMeterMidnightReset(); + break; case FUNC_EVERY_250_MSECOND: FlowRateMeterRead(); break; From 2b163ad4ea7f9d80e0c91d727bee77fad6f5e31c Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Tue, 30 Aug 2022 11:46:19 +0200 Subject: [PATCH 09/46] Flowrate meter add flow amount/duration --- CHANGELOG.md | 1 + tasmota/language/af_AF.h | 5 ++++- tasmota/language/bg_BG.h | 3 +++ tasmota/language/ca_AD.h | 3 +++ tasmota/language/cs_CZ.h | 3 +++ tasmota/language/de_DE.h | 3 +++ tasmota/language/el_GR.h | 3 +++ tasmota/language/en_GB.h | 3 +++ tasmota/language/es_ES.h | 3 +++ tasmota/language/fr_FR.h | 3 +++ tasmota/language/fy_NL.h | 3 +++ tasmota/language/he_HE.h | 3 +++ tasmota/language/hu_HU.h | 3 +++ tasmota/language/it_IT.h | 3 +++ tasmota/language/ko_KO.h | 3 +++ tasmota/language/nl_NL.h | 3 +++ tasmota/language/pl_PL.h | 3 +++ tasmota/language/pt_BR.h | 3 +++ tasmota/language/pt_PT.h | 3 +++ tasmota/language/ro_RO.h | 3 +++ tasmota/language/ru_RU.h | 3 +++ tasmota/language/sk_SK.h | 3 +++ tasmota/language/sv_SE.h | 3 +++ tasmota/language/tr_TR.h | 3 +++ tasmota/language/uk_UA.h | 3 +++ tasmota/language/vi_VN.h | 3 +++ tasmota/language/zh_CN.h | 3 +++ tasmota/language/zh_TW.h | 3 +++ tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino | 7 ++----- 29 files changed, 85 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2ce50ee4..1e679b257 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - TasmotaModbus library from v3.5.0 to v3.6.0 (#16351) - Button debouncing V3 by adopting switch debounce code (#16339) - Thermostat max allowed temperature from 100 to 200C (#16363) +- Flowrate meter add flow amount/duration, show values in table format ### Fixed - Removed whitespace from JSON values with no decimals (#16365) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index a02170f37..72fe31896 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1076,7 +1077,9 @@ #define D_FP_UNKNOWNERROR "Fout" // Any other error // xsns_96_flowratemeter.ino -#define D_FLOWRATEMETER_NAME "Flowmeter" +#define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 581d0b6fc..949dbdb16 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index 6dfeec7e9..bbdb4eee1 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Posant l'adreça a" #define D_OUT_OF_RANGE "Fora de rang" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Cabal" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 8cc9a3255..71d42ddfc 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 44c63ba50..e9a9f6609 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Neue Adresse" #define D_OUT_OF_RANGE "Außerhalb Bereich" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Durchflussmesser" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Menge heute" +#define D_FLOWRATEMETER_DURATION_TODAY "Dauer heute" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index ab3479641..028c9a49d 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 25d605ab3..60b9e8942 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index c0209fe37..e9a5c46fe 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Cambiando dirección a" #define D_OUT_OF_RANGE "Fuera de Rango" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 21dcf9060..b94af9891 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Positionner l'adresse à" #define D_OUT_OF_RANGE "Hors limites" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 0212d2f2c..fbe031e89 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 9f0a2df84..6c5cbb225 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index b748b0dbc..d31d0957d 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 560cb299f..e54d71f59 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/ora" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Imposta indirizzo a" #define D_OUT_OF_RANGE "Fuori intervallo" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Portata" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 40ebaec62..92400dfe5 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 2b69901e2..729aa5e0e 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Nieuw adres" #define D_OUT_OF_RANGE "Buiten beriek" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 992419ee1..fa9c391c2 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Ustawiam adres na" #define D_OUT_OF_RANGE "Poza zakresem" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 763efdea3..b845055a4 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Mudança de endereço para" #define D_OUT_OF_RANGE "Fora de Alcance" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 2d216a4a6..4b03eb70b 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Mudança de endereço para" #define D_OUT_OF_RANGE "Fora de Alcance" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 8d2d409e2..93f2381b1 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index e5f0a0e81..81e66fa2c 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index c24ab53cb..f1a60f325 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index c36612aed..fa52fe7fe 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 319791d99..90337d4cb 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index ea736ffea..8258e3a0a 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 26de9f0a7..3422ab65d 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index e74e51008..2a8158b8c 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 2fe003a1c..00b247f74 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino index 2cbe54947..16a635e9e 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino @@ -25,12 +25,9 @@ #define XSNS_96 96 - #define FLOWRATEMETER_WEIGHT_AVG_SAMPLE 20 // number of samples for smooth weigted average #define FLOWRATEMETER_MIN_FREQ 1 // Hz -#define D_UNIT_CUBIC_METER "m³" - #define D_JSON_FLOWRATEMETER_RATE "Rate" #define D_JSON_FLOWRATEMETER_VALUE "Source" #define D_JSON_FLOWRATEMETER_UNIT "Unit" @@ -239,7 +236,7 @@ void FlowRateMeterShow(bool json) WSContentSend_PD(PSTR("%s{e}"), Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE)); // Amount today - WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " Amount Today" "{m} ")); + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " " D_FLOWRATEMETER_AMOUNT_TODAY "{m} ")); for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; @@ -252,7 +249,7 @@ void FlowRateMeterShow(bool json) WSContentSend_PD(PSTR("%s{e}"), Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBIC_METER) : PSTR(D_UNIT_LITERS)); // Duration today - WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " Duration Today" "{m} ")); + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " " D_FLOWRATEMETER_DURATION_TODAY "{m} ")); for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; From cb4a5ed736b706434e691a75bec94e75be2785f9 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 30 Aug 2022 18:11:04 +0200 Subject: [PATCH 10/46] Berry extend max bytes size to 512Kb when PSRAM is available --- lib/libesp32/berry/default/berry_conf.h | 8 ++++++++ lib/libesp32/berry/src/be_byteslib.c | 3 +-- lib/libesp32/berry/src/be_vm.c | 1 + lib/libesp32/berry/src/be_vm.h | 1 + tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino | 4 ++++ 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry/default/berry_conf.h b/lib/libesp32/berry/default/berry_conf.h index c70af7945..4d46eb3df 100644 --- a/lib/libesp32/berry/default/berry_conf.h +++ b/lib/libesp32/berry/default/berry_conf.h @@ -41,6 +41,14 @@ **/ #define BE_USE_SINGLE_FLOAT 1 // use `float` not `double` +/* Macro: BE_BYTES_MAX_SIZE + * Maximum size in bytes of a `bytes()` object. + * Putting too much pressure on the memory allocator can do + * harm, so we limit the maximum size. + * Default: 32kb + **/ +#define BE_BYTES_MAX_SIZE (32*1024) /* 32 kb default value */ + /* Macro: BE_USE_PRECOMPILED_OBJECT * Use precompiled objects to avoid creating these objects at * runtime. Enable this macro can greatly optimize RAM usage. diff --git a/lib/libesp32/berry/src/be_byteslib.c b/lib/libesp32/berry/src/be_byteslib.c index 11857963a..299cc2fcd 100644 --- a/lib/libesp32/berry/src/be_byteslib.c +++ b/lib/libesp32/berry/src/be_byteslib.c @@ -18,7 +18,6 @@ #include #define BYTES_DEFAULT_SIZE 28 // default pre-reserved size for buffer (keep 4 bytes for len/size) -#define BYTES_MAX_SIZE (32*1024) // max 32Kb #define BYTES_OVERHEAD 4 // bytes overhead to be added when allocating (used to store len and size) #define BYTES_HEADROOM 8 // keep a natural headroom of 8 bytes when resizing @@ -506,7 +505,7 @@ void m_write_attributes(bvm *vm, int rel_idx, const buf_impl * attr) void bytes_realloc(bvm *vm, buf_impl * attr, int32_t size) { if (!attr->fixed && size < 4) { size = 4; } - if (size > BYTES_MAX_SIZE) { size = BYTES_MAX_SIZE; } + if (size > vm->bytesmaxsize) { size = vm->bytesmaxsize; } size_t oldsize = attr->bufptr ? attr->size : 0; attr->bufptr = (uint8_t*) be_realloc(vm, attr->bufptr, oldsize, size); /* malloc */ attr->size = size; diff --git a/lib/libesp32/berry/src/be_vm.c b/lib/libesp32/berry/src/be_vm.c index de738fb4d..ffc55977a 100644 --- a/lib/libesp32/berry/src/be_vm.c +++ b/lib/libesp32/berry/src/be_vm.c @@ -477,6 +477,7 @@ BERRY_API bvm* be_vm_new(void) be_gc_setpause(vm, 1); be_loadlibs(vm); vm->compopt = 0; + vm->bytesmaxsize = BE_BYTES_MAX_SIZE; vm->obshook = NULL; vm->ctypefunc = NULL; #if BE_USE_PERF_COUNTERS diff --git a/lib/libesp32/berry/src/be_vm.h b/lib/libesp32/berry/src/be_vm.h index 816d10cd1..474e74a7d 100644 --- a/lib/libesp32/berry/src/be_vm.h +++ b/lib/libesp32/berry/src/be_vm.h @@ -105,6 +105,7 @@ struct bvm { struct bgc gc; bctypefunc ctypefunc; /* handler to ctype_func */ bbyte compopt; /* compilation options */ + uint32_t bytesmaxsize; /* max allowed size for bytes() object, default 32kb but can be increased */ bobshook obshook; bmicrosfnct microsfnct; /* fucntion to get time as a microsecond resolution */ #if BE_USE_PERF_COUNTERS diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino index 51d18abad..36ac8b4e0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino @@ -316,6 +316,10 @@ void BerryInit(void) { comp_set_strict(berry.vm); /* Enable strict mode in Berry compiler, equivalent of `import strict` */ be_set_ctype_func_hanlder(berry.vm, be_call_ctype_func); + if (UsePSRAM()) { // if PSRAM is available, raise the max size to 512kb + berry.vm->bytesmaxsize = 512 * 1024; + } + be_load_custom_libs(berry.vm); // load classes and modules // Set the GC threshold to 3584 bytes to avoid the first useless GC From 3791ecd2a0dab5cfb9952f9b747fe4f8c420c2b2 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 30 Aug 2022 18:46:22 +0200 Subject: [PATCH 11/46] Support for Ethernet in ESP32 safeboot firmware --- CHANGELOG.md | 1 + tasmota/include/tasmota_configurations_ESP32.h | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2ce50ee4..e80cd862f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Support for SGP40 gas and air quality sensor (#16341) - Support for Modbus writing using ModbusBridge by JeroenSt (#16351) +- Support for Ethernet in ESP32 safeboot firmware ### Changed - TasmotaModbus library from v3.5.0 to v3.6.0 (#16351) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 9f33d3544..4544f7da6 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -182,6 +182,7 @@ #define USE_WEBCLIENT #define USE_WEBCLIENT_HTTPS #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge console Tee (+0k8 code) +#define USE_ETHERNET #endif // FIRMWARE_SAFEBOOT From b3552317214467fbd31e0262b4e4bf7d2e7a123b Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 31 Aug 2022 10:09:22 +0200 Subject: [PATCH 12/46] Fix unstable ETH on Olimex POE --- .../xdrv_82_esp32_ethernet.ino | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino b/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino index b7cfada24..264cd8f3c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino @@ -154,6 +154,31 @@ void EthernetInit(void) { int eth_power = Pin(GPIO_ETH_PHY_POWER); int eth_mdc = Pin(GPIO_ETH_PHY_MDC); int eth_mdio = Pin(GPIO_ETH_PHY_MDIO); +#ifdef ESP32 + // fix an disconnection issue after rebooting Olimex POE - this forces a clean state for all GPIO involved in RMII + gpio_reset_pin((gpio_num_t)GPIO_ETH_PHY_POWER); + gpio_reset_pin((gpio_num_t)GPIO_ETH_PHY_MDC); + gpio_reset_pin((gpio_num_t)GPIO_ETH_PHY_MDIO); + gpio_reset_pin(GPIO_NUM_19); // EMAC_TXD0 - hardcoded + gpio_reset_pin(GPIO_NUM_21); // EMAC_TX_EN - hardcoded + gpio_reset_pin(GPIO_NUM_22); // EMAC_TXD1 - hardcoded + gpio_reset_pin(GPIO_NUM_25); // EMAC_RXD0 - hardcoded + gpio_reset_pin(GPIO_NUM_26); // EMAC_RXD1 - hardcoded + gpio_reset_pin(GPIO_NUM_27); // EMAC_RX_CRS_DV - hardcoded + switch (Settings->eth_clk_mode) { + case 0: // ETH_CLOCK_GPIO0_IN + case 1: // ETH_CLOCK_GPIO0_OUT + gpio_reset_pin(GPIO_NUM_0); + break; + case 2: // ETH_CLOCK_GPIO16_OUT + gpio_reset_pin(GPIO_NUM_16); + break; + case 3: // ETH_CLOCK_GPIO17_OUT + gpio_reset_pin(GPIO_NUM_17); + break; + } + delay(1); +#endif if (!ETH.begin(Settings->eth_address, eth_power, eth_mdc, eth_mdio, (eth_phy_type_t)Settings->eth_type, (eth_clock_mode_t)Settings->eth_clk_mode)) { AddLog(LOG_LEVEL_DEBUG, PSTR("ETH: Bad PHY type or init error")); return; From 74cbc47614f7fd5d0b6287ad480a76322803bd64 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 31 Aug 2022 10:12:25 +0200 Subject: [PATCH 13/46] Be more specific to target ESP32 --- tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino b/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino index 264cd8f3c..525e878cc 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino @@ -154,7 +154,7 @@ void EthernetInit(void) { int eth_power = Pin(GPIO_ETH_PHY_POWER); int eth_mdc = Pin(GPIO_ETH_PHY_MDC); int eth_mdio = Pin(GPIO_ETH_PHY_MDIO); -#ifdef ESP32 +#if CONFIG_IDF_TARGET_ESP32 // fix an disconnection issue after rebooting Olimex POE - this forces a clean state for all GPIO involved in RMII gpio_reset_pin((gpio_num_t)GPIO_ETH_PHY_POWER); gpio_reset_pin((gpio_num_t)GPIO_ETH_PHY_MDC); @@ -178,7 +178,7 @@ void EthernetInit(void) { break; } delay(1); -#endif +#endif // CONFIG_IDF_TARGET_ESP32 if (!ETH.begin(Settings->eth_address, eth_power, eth_mdc, eth_mdio, (eth_phy_type_t)Settings->eth_type, (eth_clock_mode_t)Settings->eth_clk_mode)) { AddLog(LOG_LEVEL_DEBUG, PSTR("ETH: Bad PHY type or init error")); return; From 0e59ddc4673d0fa8700a30e4b42fef9473e56d6c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 31 Aug 2022 11:08:45 +0200 Subject: [PATCH 14/46] Update changelogs --- CHANGELOG.md | 5 +++-- RELEASENOTES.md | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70ec56618..8b2c6a528 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,14 @@ All notable changes to this project will be documented in this file. ### Added - Support for SGP40 gas and air quality sensor (#16341) - Support for Modbus writing using ModbusBridge by JeroenSt (#16351) -- Support for Ethernet in ESP32 safeboot firmware +- Support for Ethernet in ESP32 safeboot firmware (#16388) +- Flowrate meter flow amount/duration, show values in table format (#16385) ### Changed - TasmotaModbus library from v3.5.0 to v3.6.0 (#16351) - Button debouncing V3 by adopting switch debounce code (#16339) - Thermostat max allowed temperature from 100 to 200C (#16363) -- Flowrate meter add flow amount/duration, show values in table format +- Using command ``SerialBuffer`` raise max allowed buffer size to 2048 characters (#16374) ### Fixed - Removed whitespace from JSON values with no decimals (#16365) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ff53be16d..048e367ef 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -113,6 +113,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for SGP40 gas and air quality sensor [#16341](https://github.com/arendst/Tasmota/issues/16341) - Support for Modbus writing using ModbusBridge by JeroenSt [#16351](https://github.com/arendst/Tasmota/issues/16351) - Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` [#16252](https://github.com/arendst/Tasmota/issues/16252) +- Flowrate meter flow amount/duration, show values in table format [#16385](https://github.com/arendst/Tasmota/issues/16385) +- Support for Ethernet in ESP32 safeboot firmware [#16388](https://github.com/arendst/Tasmota/issues/16388) - ESP32-S3 support for internal temperature sensor ### Breaking Changed @@ -122,6 +124,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - TasmotaModbus library from v3.5.0 to v3.6.0 [#16351](https://github.com/arendst/Tasmota/issues/16351) - Button debouncing V3 by adopting switch debounce code [#16339](https://github.com/arendst/Tasmota/issues/16339) - Thermostat max allowed temperature from 100 to 200C [#16363](https://github.com/arendst/Tasmota/issues/16363) +- Using command ``SerialBuffer`` raise max allowed buffer size to 2048 characters [#16374](https://github.com/arendst/Tasmota/issues/16374) ### Fixed - RTC not detected when lights are present [#16242](https://github.com/arendst/Tasmota/issues/16242) @@ -130,5 +133,4 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Lost module name in GUI regression from v12.0.2.4 - 20220803 [#16324](https://github.com/arendst/Tasmota/issues/16324) - Removed whitespace from JSON values with no decimals [#16365](https://github.com/arendst/Tasmota/issues/16365) - ### Removed From e23dd638e06adc757767f8373804c70d79820bde Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Wed, 31 Aug 2022 14:32:43 +0200 Subject: [PATCH 15/46] Update italian language Please check and merge --- tasmota/language/it_IT.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index e54d71f59..ba49afae4 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 19.07.2022 + * Updated until v9.4.0.1 - Last update 31.08.2022 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -934,7 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/ora" -#define D_UNIT_CUBIC_METER "m³" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Imposta indirizzo a" #define D_OUT_OF_RANGE "Fuori intervallo" @@ -1077,9 +1077,9 @@ #define D_FP_UNKNOWNERROR "Errore" // Any other error // xsns_96_flowratemeter.ino -#define D_FLOWRATEMETER_NAME "Portata" -#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" -#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" +#define D_FLOWRATEMETER_NAME "Portata" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Valore odierno" +#define D_FLOWRATEMETER_DURATION_TODAY "Durata odierna" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names From 71c3b98b35ec03926203c9f5ce30cc3d40ba4735 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 31 Aug 2022 15:51:21 +0200 Subject: [PATCH 16/46] Add download link for v5.14.0 --- RELEASENOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 048e367ef..f4912f2dc 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -14,7 +14,7 @@ Pay attention to the following version breaks due to dynamic settings updates: 1. Migrate to **Sonoff-Tasmota 3.9.x** 2. Migrate to **Sonoff-Tasmota 4.x** -3. Migrate to **Sonoff-Tasmota 5.14** +3. Migrate to **Sonoff-Tasmota 5.14** (http://ota.tasmota.com/tasmota/release_5.14.0/sonoff.bin) - NOTICE underscore as a dash is not supported in older versions 4. Migrate to **Sonoff-Tasmota 6.7.1** (http://ota.tasmota.com/tasmota/release_6.7.1/sonoff.bin) - NOTICE underscore as a dash is not supported in older versions 5. Migrate to **Tasmota 7.2.0** (http://ota.tasmota.com/tasmota/release-7.2.0/tasmota.bin) From a1e5f53ddd775d041f0017cec6824adddfc43009 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 31 Aug 2022 19:21:00 +0200 Subject: [PATCH 17/46] Berry fix json crash --- lib/libesp32/berry/src/be_strlib.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/libesp32/berry/src/be_strlib.c b/lib/libesp32/berry/src/be_strlib.c index 23fdf978f..2c5424634 100644 --- a/lib/libesp32/berry/src/be_strlib.c +++ b/lib/libesp32/berry/src/be_strlib.c @@ -263,6 +263,9 @@ BERRY_API bint be_str2int(const char *str, const char **endstr) while ((c = be_char2hex(*str++)) >= 0) { sum = sum * 16 + c; } + if (endstr) { + *endstr = str - 1; + } return sum; } else { /* decimal literal */ From d0f5c80ae1e11e791d0d9c0a09944947e2896ebf Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 31 Aug 2022 21:04:35 +0200 Subject: [PATCH 18/46] Zigbee fix regression when reporting a command --- .../xdrv_23_zigbee_1z_libs.ino | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_1z_libs.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_1z_libs.ino index 34dfd2e57..335431b53 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_1z_libs.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_1z_libs.ino @@ -317,6 +317,7 @@ public: // if suffix == 0, we don't care and find the first match Z_attribute & findOrCreateAttribute(uint16_t cluster, uint16_t attr_id, uint8_t suffix = 0); Z_attribute & findOrCreateAttribute(const char * name, uint8_t suffix = 0); + Z_attribute & findOrCreateCmd(uint16_t cluster, uint8_t cmd_id, bool direction, uint8_t suffix = 0); // always care about suffix Z_attribute & findOrCreateAttribute(const Z_attribute &attr); // replace attribute with new value, suffix does care @@ -558,27 +559,25 @@ bool Z_attribute::equalsKey(const Z_attribute & attr2, bool ignore_key_suffix) c } bool Z_attribute::equalsId(uint16_t _cluster, uint16_t _attr_id, uint8_t suffix) const { - if (!key_is_str) { - if ((this->cluster == _cluster) && (this->attr_id == _attr_id) && (!this->key_is_cmd)) { - if (suffix) { - if (key_suffix == suffix) { return true; } - } else { - return true; - } + if (key_is_cmd || key_is_str) { return false; } + if ((this->cluster == _cluster) && (this->attr_id == _attr_id) && (!this->key_is_cmd)) { + if (suffix) { + if (key_suffix == suffix) { return true; } + } else { + return true; } } return false; } bool Z_attribute::equalsCmd(uint16_t _cluster, uint8_t _cmd_id, bool _direction, uint8_t suffix) const { - if (!key_is_str) { - uint16_t _attr_id = _cmd_id | (_direction ? 0x100 : 0x000); - if ((this->cluster == _cluster) && (this->attr_id == _attr_id) && (!this->key_is_cmd)) { - if (suffix) { - if (key_suffix == suffix) { return true; } - } else { - return true; - } + if (!key_is_cmd ||key_is_str) { return false; } + uint16_t _attr_id = _cmd_id | (_direction ? 0x100 : 0x000); + if ((this->cluster == _cluster) && (this->attr_id == _attr_id) && (!this->key_is_cmd)) { + if (suffix) { + if (key_suffix == suffix) { return true; } + } else { + return true; } } return false; @@ -813,7 +812,7 @@ Z_attribute & Z_attribute_list::addAttributeCmd(uint16_t cluster, uint8_t cmd_id Z_attribute & attr = addToLast(); attr.cluster = cluster; attr.attr_id = cmd_id | (direction ? 0x100 : 0); - attr.key_is_str = true; + attr.key_is_cmd = true; if (!suffix) { attr.key_suffix = countAttribute(attr.cluster, attr.attr_id); } else { attr.key_suffix = suffix; } return attr; @@ -891,7 +890,7 @@ const Z_attribute * Z_attribute_list::findAttribute(const Z_attribute &attr) con const Z_attribute * Z_attribute_list::findAttribute(uint16_t cluster, uint16_t attr_id, uint8_t suffix) const { for (const auto & attr : *this) { - if (attr.equalsId(cluster, attr_id, suffix)) { return &attr; } + if (attr.equalsId(cluster, attr_id, suffix) && !attr.key_is_cmd) { return &attr; } } return nullptr; } @@ -916,6 +915,11 @@ Z_attribute & Z_attribute_list::findOrCreateAttribute(uint16_t cluster, uint16_t return found ? *found : addAttribute(cluster, attr_id, suffix); } +Z_attribute & Z_attribute_list::findOrCreateCmd(uint16_t cluster, uint8_t cmd_id, bool direction, uint8_t suffix) { + Z_attribute * found = findAttributeCmd(cluster, cmd_id, direction, suffix); + return found ? *found : addAttributeCmd(cluster, cmd_id, direction, suffix); +} + const Z_attribute * Z_attribute_list::findAttribute(const char * name, uint8_t suffix) const { for (const auto & attr : *this) { if (attr.equalsKey(name, suffix)) { return &attr; } @@ -938,7 +942,9 @@ Z_attribute & Z_attribute_list::findOrCreateAttribute(const char * name, uint8_t // same but passing a Z_attribute as key Z_attribute & Z_attribute_list::findOrCreateAttribute(const Z_attribute &attr) { Z_attribute & ret = attr.key_is_str ? findOrCreateAttribute(attr.key, attr.key_suffix) - : findOrCreateAttribute(attr.cluster, attr.attr_id, attr.key_suffix); + : attr.key_is_cmd ? + findOrCreateCmd(attr.cluster, attr.attr_id & 0xFF, attr.attr_id & 0x100 ? true : false, attr.key_suffix) + : findOrCreateAttribute(attr.cluster, attr.attr_id, attr.key_suffix); ret.key_suffix = attr.key_suffix; return ret; } From c2cfc973d70ee56cee6a9f67c20659895bfedf1d Mon Sep 17 00:00:00 2001 From: renzhe Date: Thu, 1 Sep 2022 12:20:58 +0800 Subject: [PATCH 19/46] translate some chinese --- tasmota/language/zh_CN.h | 66 ++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index e74e51008..7e6e2da7e 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -130,7 +130,7 @@ #define D_MULTI_PRESS "多次按键" #define D_NOISE "嘈杂" #define D_NONE "无" -#define D_O2 "Oxygen" +#define D_O2 "氧" #define D_OFF "关" #define D_OFFLINE "离线" #define D_OK "好" @@ -140,7 +140,7 @@ #define D_PASSWORD "密码" #define D_PH "pH" #define D_MQ "MQ" -#define D_PARTITION "Partition" // As in flash and firmware partition +#define D_PARTITION "分区" // As in flash and firmware partition #define D_PORT "端口" #define D_POWER_FACTOR "功率因数" #define D_POWERUSAGE "功率" @@ -177,14 +177,14 @@ #define D_TO "to" #define D_TOGGLE "切换" #define D_TOPIC "主题" -#define D_TOTAL_USAGE "Total Usage" +#define D_TOTAL_USAGE "总共使用" #define D_TRANSMIT "发送" #define D_TRUE "True" #define D_TVOC "TVOC" #define D_UPGRADE "升级" #define D_UPLOAD "上传" #define D_UPTIME "运行时间" -#define D_USED "used" +#define D_USED "已使用" #define D_USER "用户名" #define D_UTC_TIME "UTC" #define D_UV_INDEX "紫外线指数" @@ -202,9 +202,9 @@ #define D_VOLUME "Volume" #define D_WEIGHT "重量" #define D_WARMLIGHT "暖" -#define D_WEB_SERVER "Web Server" -#define D_SOC "State of Charge" -#define D_SOH "State of Health" +#define D_WEB_SERVER "Web服务器" +#define D_SOC "充电状态" +#define D_SOH "充电健康" // tasmota.ino #define D_WARNING_MINIMAL_VERSION "警告:精简固件不支持持久保存设置" @@ -216,7 +216,7 @@ #define D_SET_BAUDRATE_TO "设置波特率为:" #define D_RECEIVED_TOPIC "接收到的主题:" #define D_DATA_SIZE "数据大小:" -#define D_ANALOG_INPUT "Analog" +#define D_ANALOG_INPUT "模拟" // support.ino #define D_OSWATCH "osWatch" @@ -300,18 +300,18 @@ #define D_WPA_PSK "WPA PSK" #define D_WPA2_PSK "WPA2 PSK" #define D_AP1_SSID "WiFi 名称" -#define D_AP1_SSID_HELP "Type or Select your WiFi Network" +#define D_AP1_SSID_HELP "输入或选择您的WiFi网络" #define D_AP2_SSID "WiFi 名称 2" -#define D_AP2_SSID_HELP "Type your Alternative WiFi Network" +#define D_AP2_SSID_HELP "输入您的备用WiFi网络" #define D_AP_PASSWORD "WiFi 密码" -#define D_AP_PASSWORD_HELP "Enter your WiFi Password" -#define D_SELECT_YOUR_WIFI_NETWORK "Select your WiFi Network" -#define D_SHOW_MORE_WIFI_NETWORKS "Scan for all WiFi Networks" -#define D_SHOW_MORE_OPTIONS "More Options" -#define D_CHECK_CREDENTIALS "Please, check your credentials" -#define D_SUCCESSFUL_WIFI_CONNECTION "Successful WiFi Connection" -#define D_NOW_YOU_CAN_CLOSE_THIS_WINDOW "Now you can close this window" -#define D_REDIRECTING_TO_NEW_IP "Redirecting to new device's IP address" +#define D_AP_PASSWORD_HELP "输入您的WiFi密码" +#define D_SELECT_YOUR_WIFI_NETWORK "选择你的Wifi网络" +#define D_SHOW_MORE_WIFI_NETWORKS "扫描所有WiFi网络" +#define D_SHOW_MORE_OPTIONS "更多选项" +#define D_CHECK_CREDENTIALS "请检查您的密码" +#define D_SUCCESSFUL_WIFI_CONNECTION "WiFi连接成功" +#define D_NOW_YOU_CAN_CLOSE_THIS_WINDOW "您现在可以关闭这个窗口" +#define D_REDIRECTING_TO_NEW_IP "重定向到新设备的 IP 地址" #define D_MQTT_PARAMETERS "MQTT 设置" #define D_CLIENT "客户端" @@ -319,7 +319,7 @@ #define D_LOGGING_PARAMETERS "日志设置" #define D_SERIAL_LOG_LEVEL "串口日志级别" -#define D_MQTT_LOG_LEVEL "Mqtt log level" +#define D_MQTT_LOG_LEVEL "Mqtt 日志级别" #define D_WEB_LOG_LEVEL "Web 日志级别" #define D_SYS_LOG_LEVEL "Syslog 日志级别" #define D_MORE_DEBUG "全部调试" @@ -330,7 +330,7 @@ #define D_OTHER_PARAMETERS "其他设置" #define D_TEMPLATE "模板" #define D_ACTIVATE "启用" -#define D_DEVICE_NAME "Device Name" +#define D_DEVICE_NAME "设备名称" #define D_WEB_ADMIN_PASSWORD "WEB 管理密码" #define D_MQTT_ENABLE "启用 MQTT" #define D_MQTT_TLS_ENABLE "MQTT TLS" @@ -376,15 +376,15 @@ #define D_OTA_URL "OTA 地址" #define D_START_UPGRADE "开始升级" #define D_UPGRADE_BY_FILE_UPLOAD "通过文件升级" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "切换到安全启动分区" #define D_UPLOAD_STARTED "开始上传" #define D_UPGRADE_STARTED "开始升级" #define D_UPLOAD_DONE "上传完成" -#define D_UPLOAD_TRANSFER "Upload transfer" -#define D_TRANSFER_STARTED "Transfer started" +#define D_UPLOAD_TRANSFER "上传中" +#define D_TRANSFER_STARTED "传输开始" #define D_UPLOAD_ERR_1 "没有选择任何文件" #define D_UPLOAD_ERR_2 "没有足够空间" -#define D_UPLOAD_ERR_3 "Invalid file signature" +#define D_UPLOAD_ERR_3 "无效的文件签名" #define D_UPLOAD_ERR_4 "固件大小超过 flash 容量" #define D_UPLOAD_ERR_5 "上传缓冲区不足,请先刷入精简固件再升级" #define D_UPLOAD_ERR_6 "上传失败。 启用日志级别 3 调试" @@ -395,7 +395,7 @@ #define D_UPLOAD_ERR_11 "擦除 RF 芯片失败" #define D_UPLOAD_ERR_12 "写入 RF 芯片失败" #define D_UPLOAD_ERR_13 "解码 RF 固件失败" -#define D_UPLOAD_ERR_14 "Not compatible" +#define D_UPLOAD_ERR_14 "不兼容" #define D_UPLOAD_ERROR_CODE "上传错误代码" #define D_ENTER_COMMAND "输入命令" @@ -485,12 +485,12 @@ // xdrv_23_zigbee #define D_ZIGBEE_PERMITJOIN_ACTIVE "允许设备连入" -#define D_ZIGBEE_MAPPING_TITLE "Tasmota Zigbee Mapping" +#define D_ZIGBEE_MAPPING_TITLE "Tasmota Zigbee 映射" #define D_ZIGBEE_NOT_STARTED "Zigbee 未启动" -#define D_ZIGBEE_MAPPING_IN_PROGRESS_SEC "Mapping in progress (%d s. remaining)" -#define D_ZIGBEE_MAPPING_NOT_PRESENT "No mapping" -#define D_ZIGBEE_MAP_REFRESH "Zigbee Map Refresh" -#define D_ZIGBEE_MAP "Zigbee Map" +#define D_ZIGBEE_MAPPING_IN_PROGRESS_SEC "正在处理中 (等待 %d s.)" +#define D_ZIGBEE_MAPPING_NOT_PRESENT "无映射" +#define D_ZIGBEE_MAP_REFRESH "Zigbee 映射刷新" +#define D_ZIGBEE_MAP "Zigbee 映射" #define D_ZIGBEE_PERMITJOIN "Zigbee 允许连入" #define D_ZIGBEE_GENERATE_KEY "正在生成 Zigbee 网络随机秘钥" #define D_ZIGBEE_UNKNOWN_DEVICE "未知设备" @@ -940,8 +940,8 @@ #define D_SENSOR_DETECTED "detected" //SDM220, SDM120, SDM72, LE01MR, SDM230 -#define D_EXPORT_POWER "Export Power" -#define D_IMPORT_POWER "Import Power" +#define D_EXPORT_POWER "输出功率" +#define D_IMPORT_POWER "输入功率" #define D_PHASE_ANGLE "相位角" #define D_IMPORT_ACTIVE "有功输入" #define D_EXPORT_ACTIVE "有功输出" @@ -950,7 +950,7 @@ #define D_TOTAL_REACTIVE "总无功功率" #define D_UNIT_KWARH "千乏时" #define D_UNIT_ANGLE "度" -#define D_TOTAL_ACTIVE "Total Active" +#define D_TOTAL_ACTIVE "总功率" #define D_RESETTABLE_TOTAL_ACTIVE "Total Active (RST)" //SOLAXX1 From 7fb00daa52f9ee7edaa3bed5b8eae4d0a64475c8 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 1 Sep 2022 08:14:37 +0200 Subject: [PATCH 20/46] Zigbee prepare for Green Power support --- CHANGELOG.md | 1 + .../xdrv_23_zigbee_0_constants.ino | 2 + .../xdrv_23_zigbee_5_0_constants.ino | 1064 +++++++++-------- .../xdrv_23_zigbee_5_1_attributes.ino | 29 +- .../xdrv_23_zigbee_5_2_converters.ino | 52 +- .../xdrv_23_zigbee_7_0_statemachine.ino | 16 +- .../xdrv_23_zigbee_8_parsers.ino | 4 +- .../xdrv_23_zigbee_9_serial.ino | 11 +- .../xdrv_23_zigbee_A_impl.ino | 34 +- 9 files changed, 666 insertions(+), 547 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b2c6a528..cfe3871bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Support for Modbus writing using ModbusBridge by JeroenSt (#16351) - Support for Ethernet in ESP32 safeboot firmware (#16388) - Flowrate meter flow amount/duration, show values in table format (#16385) +- Zigbee prepare for Green Power support ### Changed - TasmotaModbus library from v3.5.0 to v3.6.0 (#16351) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_0_constants.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_0_constants.ino index ac2aae6ed..cffd37e59 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_0_constants.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_0_constants.ino @@ -923,6 +923,8 @@ enum Z_App_Profiles { Z_PROF_TA = 0x0107, // Telecom Applications Z_PROF_PHHC = 0x0108, // Personal Home & Hospital Care Z_PROF_AMI = 0x0109, // Advanced Metering Initiative + // Green Power + Z_PROF_GP = 0xa1e0, // Green Power profile }; enum Z_Device_Ids { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_0_constants.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_0_constants.ino index 9e476650c..d244032fe 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_0_constants.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_0_constants.ino @@ -240,12 +240,16 @@ const char Z_strings[] PROGMEM = "BinaryRelinquishDefault" "\x00" "BinaryStatusFlags" "\x00" "BinaryValue" "\x00" + "BlockedGPDID" "\x00" "CIE" "\x00" "CO" "\x00" "CT" "\x00" "CalculationPeriod" "\x00" + "CcommissioningExitMode" "\x00" "CheckinInterval" "\x00" "CheckinIntervalMin" "\x00" + "ClientActiveFunctionality" "\x00" + "ClientFunctionality" "\x00" "ClosedLimit" "\x00" "Color" "\x00" "ColorCapabilities" "\x00" @@ -275,6 +279,8 @@ const char Z_strings[] PROGMEM = "ColorTempStep" "\x00" "ColorTempStepDown" "\x00" "ColorTempStepUp" "\x00" + "CommissioningWindow" "\x00" + "CommunicationMode" "\x00" "CompanyName" "\x00" "CompensationText" "\x00" "ConfigStatus" "\x00" @@ -415,6 +421,7 @@ const char Z_strings[] PROGMEM = "LineCurrent" "\x00" "LineCurrentPhB" "\x00" "LineCurrentPhC" "\x00" + "LinkKey" "\x00" "LocalTemperature" "\x00" "LocalTemperatureCalibration" "\x00" "LocalTime" "\x00" @@ -458,7 +465,10 @@ const char Z_strings[] PROGMEM = "MaxCoolSetpointLimit" "\x00" "MaxHeatSetpointLimit" "\x00" "MaxPINCodeLength" "\x00" + "MaxProxyTableEntries" "\x00" "MaxRFIDCodeLength" "\x00" + "MaxSearchCounter" "\x00" + "MaxSinkTableEntries" "\x00" "MaxTempExperienced" "\x00" "Measured11thHarmonicCurrent" "\x00" "Measured1stHarmonicCurrent" "\x00" @@ -510,6 +520,8 @@ const char Z_strings[] PROGMEM = "MultiValue" "\x00" "MultipleScheduling" "\x00" "NeutralCurrent" "\x00" + "NotificationRetryNumber" "\x00" + "NotificationRetryTimer" "\x00" "NumberOfDevices" "\x00" "NumberOfHolidaySchedulesSupported" "\x00" "NumberOfLogRecordsSupported" "\x00" @@ -596,6 +608,7 @@ const char Z_strings[] PROGMEM = "ProductCode" "\x00" "ProductRevision" "\x00" "ProductURL" "\x00" + "ProxyTable" "\x00" "QualityMeasure" "\x00" "RGB" "\x00" "RHDehumidificationSetpoint" "\x00" @@ -661,6 +674,11 @@ const char Z_strings[] PROGMEM = "SceneValid" "\x00" "ScheduleMode" "\x00" "SeaPressure" "\x00" + "SecurityLevel" "\x00" + "ServerActiveFunctionality" "\x00" + "ServerFunctionality" "\x00" + "SharedSecurityKey" "\x00" + "SharedSecurityKeyType" "\x00" "ShortPollInterval" "\x00" "Shutter" "\x00" "ShutterClose" "\x00" @@ -668,6 +686,7 @@ const char Z_strings[] PROGMEM = "ShutterOpen" "\x00" "ShutterStop" "\x00" "ShutterTilt" "\x00" + "SinkTable" "\x00" "SoftwareRevision" "\x00" "StackVersion" "\x00" "StandardTime" "\x00" @@ -921,519 +940,538 @@ enum Z_offsets { Zo_BinaryRelinquishDefault = 3108, Zo_BinaryStatusFlags = 3132, Zo_BinaryValue = 3150, - Zo_CIE = 3162, - Zo_CO = 3166, - Zo_CT = 3169, - Zo_CalculationPeriod = 3172, - Zo_CheckinInterval = 3190, - Zo_CheckinIntervalMin = 3206, - Zo_ClosedLimit = 3225, - Zo_Color = 3237, - Zo_ColorCapabilities = 3243, - Zo_ColorLoopActive = 3261, - Zo_ColorLoopDirection = 3277, - Zo_ColorLoopStartEnhancedHue = 3296, - Zo_ColorLoopStoredEnhancedHue = 3322, - Zo_ColorLoopTime = 3349, - Zo_ColorMode = 3363, - Zo_ColorMove = 3373, - Zo_ColorPointBIntensity = 3383, - Zo_ColorPointBX = 3404, - Zo_ColorPointBY = 3417, - Zo_ColorPointGIntensity = 3430, - Zo_ColorPointGX = 3451, - Zo_ColorPointGY = 3464, - Zo_ColorPointRIntensity = 3477, - Zo_ColorPointRX = 3498, - Zo_ColorPointRY = 3511, - Zo_ColorStep = 3524, - Zo_ColorTempMove = 3534, - Zo_ColorTempMoveDown = 3548, - Zo_ColorTempMoveStop = 3566, - Zo_ColorTempMoveUp = 3584, - Zo_ColorTempPhysicalMaxMireds = 3600, - Zo_ColorTempPhysicalMinMireds = 3627, - Zo_ColorTempStep = 3654, - Zo_ColorTempStepDown = 3668, - Zo_ColorTempStepUp = 3686, - Zo_CompanyName = 3702, - Zo_CompensationText = 3714, - Zo_ConfigStatus = 3731, - Zo_Contact = 3744, - Zo_ControlSequenceOfOperation = 3752, - Zo_Coordinate1 = 3779, - Zo_Coordinate2 = 3791, - Zo_Coordinate3 = 3803, - Zo_CurrentGroup = 3815, - Zo_CurrentPositionLift = 3828, - Zo_CurrentPositionLiftPercentage = 3848, - Zo_CurrentPositionTilt = 3878, - Zo_CurrentPositionTiltPercentage = 3898, - Zo_CurrentScene = 3928, - Zo_CurrentTemperature = 3941, - Zo_CurrentTemperatureSetPoint = 3960, - Zo_CurrentZoneSensitivityLevel = 3987, - Zo_CustomerName = 4015, - Zo_DCCurrent = 4028, - Zo_DCCurrentDivisor = 4038, - Zo_DCCurrentMax = 4055, - Zo_DCCurrentMin = 4068, - Zo_DCCurrentMultiplier = 4081, - Zo_DCCurrentOverload = 4101, - Zo_DCOverloadAlarmsMask = 4119, - Zo_DCPower = 4140, - Zo_DCPowerDivisor = 4148, - Zo_DCPowerMax = 4163, - Zo_DCPowerMin = 4174, - Zo_DCPowerMultiplier = 4185, - Zo_DCVoltage = 4203, - Zo_DCVoltageDivisor = 4213, - Zo_DCVoltageMax = 4230, - Zo_DCVoltageMin = 4243, - Zo_DCVoltageMultiplier = 4256, - Zo_DCVoltageOverload = 4276, - Zo_DataQualityID = 4294, - Zo_DateCode = 4308, - Zo_DecelerationTimeLift = 4317, - Zo_DefaultMoveRate = 4338, - Zo_DehumidificationCooling = 4354, - Zo_DehumidificationHysteresis = 4378, - Zo_DehumidificationLockout = 4405, - Zo_DehumidificationMaxCool = 4429, - Zo_DeviceEnabled = 4453, - Zo_DeviceTempAlarmMask = 4467, - Zo_Dimmer = 4487, - Zo_DimmerDown = 4494, - Zo_DimmerMove = 4505, - Zo_DimmerOptions = 4516, - Zo_DimmerRemainingTime = 4530, - Zo_DimmerStep = 4550, - Zo_DimmerStepDown = 4561, - Zo_DimmerStepUp = 4576, - Zo_DimmerStop = 4589, - Zo_DimmerUp = 4600, - Zo_DisableLocalConfig = 4609, - Zo_DoorClosedEvents = 4628, - Zo_DoorOpenEvents = 4645, - Zo_DoorState = 4660, - Zo_DriftCompensation = 4670, - Zo_DstEnd = 4688, - Zo_DstShift = 4695, - Zo_DstStart = 4704, - Zo_ElectricalMeasurementType = 4713, - Zo_EnergyFormatting = 4739, - Zo_EnergyRemote = 4756, - Zo_EnergyTotal = 4769, - Zo_EnhancedColorMode = 4781, - Zo_EnhancedCurrentHue = 4799, - Zo_EurotronicErrors = 4818, - Zo_EurotronicHostFlags = 4835, - Zo_FanMode = 4855, - Zo_FanModeSequence = 4863, - Zo_FastPollTimeout = 4879, - Zo_FastPollTimeoutMax = 4895, - Zo_Fire = 4914, - Zo_FlowMaxMeasuredValue = 4919, - Zo_FlowMinMeasuredValue = 4940, - Zo_FlowRate = 4961, - Zo_FlowTolerance = 4970, - Zo_GenericDeviceClass = 4984, - Zo_GenericDeviceType = 5003, - Zo_GetAllGroups = 5021, - Zo_GetGroup = 5034, - Zo_GetSceneMembership = 5043, - Zo_GlassBreak = 5062, - Zo_GroupNameSupport = 5073, - Zo_HVACSystemTypeConfiguration = 5090, - Zo_HWVersion = 5118, - Zo_HarmonicCurrentMultiplier = 5128, - Zo_HighTempDwellTripPoint = 5154, - Zo_HighTempThreshold = 5177, - Zo_Hue = 5195, - Zo_HueMove = 5199, - Zo_HueSat = 5207, - Zo_HueStep = 5214, - Zo_HueStepDown = 5222, - Zo_HueStepUp = 5234, - Zo_Humidity = 5244, - Zo_HumidityMaxMeasuredValue = 5253, - Zo_HumidityMinMeasuredValue = 5278, - Zo_HumidityTolerance = 5303, - Zo_IASCIEAddress = 5321, - Zo_Identify = 5335, - Zo_IdentifyQuery = 5344, - Zo_IdentifyTime = 5358, - Zo_Illuminance = 5371, - Zo_IlluminanceLevelStatus = 5383, - Zo_IlluminanceLightSensorType = 5406, - Zo_IlluminanceMaxMeasuredValue = 5433, - Zo_IlluminanceMinMeasuredValue = 5461, - Zo_IlluminanceTargetLevel = 5489, - Zo_IlluminanceTolerance = 5512, - Zo_InstalledClosedLimitLift = 5533, - Zo_InstalledClosedLimitTilt = 5558, - Zo_InstalledOpenLimitLift = 5583, - Zo_InstalledOpenLimitTilt = 5606, - Zo_IntermediateSetpointsLift = 5629, - Zo_IntermediateSetpointsTilt = 5655, - Zo_IntrinsicBallastFactor = 5681, - Zo_LampAlarmMode = 5704, - Zo_LampBurnHours = 5718, - Zo_LampBurnHoursTripPoint = 5732, - Zo_LampManufacturer = 5755, - Zo_LampRatedHours = 5772, - Zo_LampType = 5787, - Zo_LastConfiguredBy = 5796, - Zo_LastMessageLQI = 5813, - Zo_LastMessageRSSI = 5828, - Zo_LastSetTime = 5844, - Zo_LegrandHeatingMode = 5856, - Zo_LegrandMode = 5875, - Zo_LegrandOpt1 = 5887, - Zo_LegrandOpt2 = 5899, - Zo_LegrandOpt3 = 5911, - Zo_LidlPower = 5923, - Zo_LineCurrent = 5933, - Zo_LineCurrentPhB = 5945, - Zo_LineCurrentPhC = 5960, - Zo_LocalTemperature = 5975, - Zo_LocalTemperatureCalibration = 5992, - Zo_LocalTime = 6020, - Zo_LocationAge = 6030, - Zo_LocationDescription = 6042, - Zo_LocationMethod = 6062, - Zo_LocationPower = 6077, - Zo_LocationType = 6091, - Zo_LockAlarmMask = 6104, - Zo_LockDefaultConfigurationRegister = 6118, - Zo_LockEnableInsideStatusLED = 6151, - Zo_LockEnableLocalProgramming = 6177, - Zo_LockEnableLogging = 6204, - Zo_LockEnableOneTouchLocking = 6222, - Zo_LockEnablePrivacyModeButton = 6248, - Zo_LockKeypadOperationEventMask = 6276, - Zo_LockKeypadProgrammingEventMask = 6305, - Zo_LockLEDSettings = 6336, - Zo_LockLanguage = 6352, - Zo_LockManualOperationEventMask = 6365, - Zo_LockOperatingMode = 6394, - Zo_LockRFIDOperationEventMask = 6412, - Zo_LockRFIDProgrammingEventMask = 6439, - Zo_LockRFOperationEventMask = 6468, - Zo_LockRFProgrammingEventMask = 6493, - Zo_LockSoundVolume = 6520, - Zo_LockState = 6536, - Zo_LockSupportedOperatingModes = 6546, - Zo_LockType = 6574, - Zo_LongPollInterval = 6583, - Zo_LongPollIntervalMin = 6600, - Zo_LowTempDwellTripPoint = 6620, - Zo_LowTempThreshold = 6642, - Zo_MainsAlarmMask = 6659, - Zo_MainsFrequency = 6674, - Zo_MainsVoltage = 6689, - Zo_MainsVoltageDwellTripPoint = 6702, - Zo_MainsVoltageMaxThreshold = 6729, - Zo_MainsVoltageMinThreshold = 6754, - Zo_Manufacturer = 6779, - Zo_MaxCoolSetpointLimit = 6792, - Zo_MaxHeatSetpointLimit = 6813, - Zo_MaxPINCodeLength = 6834, - Zo_MaxRFIDCodeLength = 6851, - Zo_MaxTempExperienced = 6869, - Zo_Measured11thHarmonicCurrent = 6888, - Zo_Measured1stHarmonicCurrent = 6916, - Zo_Measured3rdHarmonicCurrent = 6943, - Zo_Measured5thHarmonicCurrent = 6970, - Zo_Measured7thHarmonicCurrent = 6997, - Zo_Measured9thHarmonicCurrent = 7024, - Zo_MeasuredPhase11thHarmonicCurrent = 7051, - Zo_MeasuredPhase1stHarmonicCurrent = 7084, - Zo_MeasuredPhase3rdHarmonicCurrent = 7116, - Zo_MeasuredPhase5thHarmonicCurrent = 7148, - Zo_MeasuredPhase7thHarmonicCurrent = 7180, - Zo_MeasuredPhase9thHarmonicCurrent = 7212, - Zo_MeterTypeID = 7244, - Zo_MinCoolSetpointLimit = 7256, - Zo_MinHeatSetpointLimit = 7277, - Zo_MinPINCodeLength = 7298, - Zo_MinRFIDCodeLength = 7315, - Zo_MinSetpointDeadBand = 7333, - Zo_MinTempExperienced = 7353, - Zo_Mode = 7372, - Zo_Model = 7377, - Zo_ModelId = 7383, - Zo_MotorStepSize = 7391, - Zo_Movement = 7405, - Zo_MullerLightMode = 7414, - Zo_MultiApplicationType = 7430, - Zo_MultiDescription = 7451, - Zo_MultiInApplicationType = 7468, - Zo_MultiInDescription = 7491, - Zo_MultiInNumberOfStates = 7510, - Zo_MultiInOutOfService = 7532, - Zo_MultiInReliability = 7552, - Zo_MultiInStatusFlags = 7571, - Zo_MultiInValue = 7590, - Zo_MultiNumberOfStates = 7603, - Zo_MultiOutApplicationType = 7623, - Zo_MultiOutDescription = 7647, - Zo_MultiOutNumberOfStates = 7667, - Zo_MultiOutOfService = 7690, - Zo_MultiOutOutOfService = 7708, - Zo_MultiOutReliability = 7729, - Zo_MultiOutRelinquishDefault = 7749, - Zo_MultiOutStatusFlags = 7775, - Zo_MultiOutValue = 7795, - Zo_MultiReliability = 7809, - Zo_MultiRelinquishDefault = 7826, - Zo_MultiStatusFlags = 7849, - Zo_MultiValue = 7866, - Zo_MultipleScheduling = 7877, - Zo_NeutralCurrent = 7896, - Zo_NumberOfDevices = 7911, - Zo_NumberOfHolidaySchedulesSupported = 7927, - Zo_NumberOfLogRecordsSupported = 7961, - Zo_NumberOfPINUsersSupported = 7989, - Zo_NumberOfPrimaries = 8015, - Zo_NumberOfRFIDUsersSupported = 8033, - Zo_NumberOfResets = 8060, - Zo_NumberOfTotalUsersSupported = 8075, - Zo_NumberOfWeekDaySchedulesSupportedPerUser = 8103, - Zo_NumberOfYearDaySchedulesSupportedPerUser = 8144, - Zo_NumberOfZoneSensitivityLevelsSupported = 8185, - Zo_NumberRSSIMeasurements = 8224, - Zo_NumberofActuationsLift = 8247, - Zo_NumberofActuationsTilt = 8270, - Zo_Occupancy = 8293, - Zo_OccupancySensorType = 8303, - Zo_OccupiedCoolingSetpoint = 8323, - Zo_OccupiedHeatingSetpoint = 8347, - Zo_OffTransitionTime = 8371, - Zo_OffWaitTime = 8389, - Zo_OnLevel = 8401, - Zo_OnOff = 8409, - Zo_OnOffTransitionTime = 8415, - Zo_OnTime = 8435, - Zo_OnTransitionTime = 8442, - Zo_OpenPeriod = 8459, - Zo_OppleMode = 8470, - Zo_OutdoorTemperature = 8480, - Zo_OverTempTotalDwell = 8499, - Zo_PICoolingDemand = 8518, - Zo_PIHeatingDemand = 8534, - Zo_PIROccupiedToUnoccupiedDelay = 8550, - Zo_PIRUnoccupiedToOccupiedDelay = 8579, - Zo_PIRUnoccupiedToOccupiedThreshold = 8608, - Zo_POD = 8641, - Zo_Panic = 8645, - Zo_PartNumber = 8651, - Zo_PathLossExponent = 8662, - Zo_PersistentMemoryWrites = 8679, - Zo_PersonalAlarm = 8702, - Zo_PhaseHarmonicCurrentMultiplier = 8716, - Zo_PhysicalClosedLimit = 8747, - Zo_PhysicalClosedLimitLift = 8767, - Zo_PhysicalClosedLimitTilt = 8791, - Zo_PhysicalEnvironment = 8815, - Zo_Power = 8835, - Zo_PowerDivisor = 8841, - Zo_PowerFactor = 8854, - Zo_PowerFactorPhB = 8866, - Zo_PowerFactorPhC = 8881, - Zo_PowerMultiplier = 8896, - Zo_PowerOffEffect = 8912, - Zo_PowerOnRecall = 8927, - Zo_PowerOnTimer = 8941, - Zo_PowerSource = 8954, - Zo_PowerThreshold = 8966, - Zo_Pressure = 8981, - Zo_PressureMaxMeasuredValue = 8990, - Zo_PressureMaxScaledValue = 9015, - Zo_PressureMinMeasuredValue = 9038, - Zo_PressureMinScaledValue = 9063, - Zo_PressureScale = 9086, - Zo_PressureScaledTolerance = 9100, - Zo_PressureScaledValue = 9124, - Zo_PressureTolerance = 9144, - Zo_Primary1Intensity = 9162, - Zo_Primary1X = 9180, - Zo_Primary1Y = 9190, - Zo_Primary2Intensity = 9200, - Zo_Primary2X = 9218, - Zo_Primary2Y = 9228, - Zo_Primary3Intensity = 9238, - Zo_Primary3X = 9256, - Zo_Primary3Y = 9266, - Zo_Primary4Intensity = 9276, - Zo_Primary4X = 9294, - Zo_Primary4Y = 9304, - Zo_Primary5Intensity = 9314, - Zo_Primary5X = 9332, - Zo_Primary5Y = 9342, - Zo_Primary6Intensity = 9352, - Zo_Primary6X = 9370, - Zo_Primary6Y = 9380, - Zo_ProductCode = 9390, - Zo_ProductRevision = 9402, - Zo_ProductURL = 9418, - Zo_QualityMeasure = 9429, - Zo_RGB = 9444, - Zo_RHDehumidificationSetpoint = 9448, - Zo_RMSCurrent = 9475, - Zo_RMSCurrentMax = 9486, - Zo_RMSCurrentMaxPhB = 9500, - Zo_RMSCurrentMaxPhC = 9517, - Zo_RMSCurrentMin = 9534, - Zo_RMSCurrentMinPhB = 9548, - Zo_RMSCurrentMinPhC = 9565, - Zo_RMSCurrentPhB = 9582, - Zo_RMSCurrentPhC = 9596, - Zo_RMSExtremeOverVoltage = 9610, - Zo_RMSExtremeOverVoltagePeriod = 9632, - Zo_RMSExtremeOverVoltagePeriodPhB = 9660, - Zo_RMSExtremeOverVoltagePeriodPhC = 9691, - Zo_RMSExtremeUnderVoltage = 9722, - Zo_RMSExtremeUnderVoltagePeriod = 9745, - Zo_RMSExtremeUnderVoltagePeriodPhB = 9774, - Zo_RMSExtremeUnderVoltagePeriodPhC = 9806, - Zo_RMSVoltage = 9838, - Zo_RMSVoltageMax = 9849, - Zo_RMSVoltageMaxPhB = 9863, - Zo_RMSVoltageMaxPhC = 9880, - Zo_RMSVoltageMin = 9897, - Zo_RMSVoltageMinPhB = 9911, - Zo_RMSVoltageMinPhC = 9928, - Zo_RMSVoltagePhB = 9945, - Zo_RMSVoltagePhC = 9959, - Zo_RMSVoltageSag = 9973, - Zo_RMSVoltageSagPeriod = 9987, - Zo_RMSVoltageSagPeriodPhB = 10007, - Zo_RMSVoltageSagPeriodPhC = 10030, - Zo_RMSVoltageSwell = 10053, - Zo_RMSVoltageSwellPeriod = 10069, - Zo_RMSVoltageSwellPeriodPhB = 10091, - Zo_RMSVoltageSwellPeriodPhC = 10116, - Zo_ReactiveCurrent = 10141, - Zo_ReactiveCurrentPhB = 10157, - Zo_ReactiveCurrentPhC = 10176, - Zo_ReactivePower = 10195, - Zo_ReactivePowerPhB = 10209, - Zo_ReactivePowerPhC = 10226, - Zo_RecallScene = 10243, - Zo_RelativeHumidity = 10255, - Zo_RelativeHumidityDisplay = 10272, - Zo_RelativeHumidityMode = 10296, - Zo_RemainingTime = 10317, - Zo_RemoteSensing = 10331, - Zo_RemoveAllGroups = 10345, - Zo_RemoveAllScenes = 10361, - Zo_RemoveGroup = 10377, - Zo_RemoveScene = 10389, - Zo_ReportingPeriod = 10401, - Zo_ResetAlarm = 10417, - Zo_ResetAllAlarms = 10428, - Zo_SWBuildID = 10443, - Zo_Sat = 10453, - Zo_SatMove = 10457, - Zo_SatStep = 10465, - Zo_SceneCount = 10473, - Zo_SceneNameSupport = 10484, - Zo_SceneValid = 10501, - Zo_ScheduleMode = 10512, - Zo_SeaPressure = 10525, - Zo_ShortPollInterval = 10537, - Zo_Shutter = 10555, - Zo_ShutterClose = 10563, - Zo_ShutterLift = 10576, - Zo_ShutterOpen = 10588, - Zo_ShutterStop = 10600, - Zo_ShutterTilt = 10612, - Zo_SoftwareRevision = 10624, - Zo_StackVersion = 10641, - Zo_StandardTime = 10654, - Zo_StartUpOnOff = 10667, - Zo_Status = 10680, - Zo_StoreScene = 10687, - Zo_SwitchActions = 10698, - Zo_SwitchType = 10712, - Zo_SystemMode = 10723, - Zo_TRVBoost = 10734, - Zo_TRVChildProtection = 10743, - Zo_TRVMirrorDisplay = 10762, - Zo_TRVMode = 10779, - Zo_TRVWindowOpen = 10787, - Zo_TempTarget = 10801, - Zo_Temperature = 10812, - Zo_TemperatureDisplayMode = 10824, - Zo_TemperatureMaxMeasuredValue = 10847, - Zo_TemperatureMinMeasuredValue = 10875, - Zo_TemperatureTolerance = 10903, - Zo_TerncyDuration = 10924, - Zo_TerncyRotate = 10939, - Zo_ThSetpoint = 10952, - Zo_ThermostatAlarmMask = 10963, - Zo_ThermostatKeypadLockout = 10983, - Zo_ThermostatOccupancy = 11007, - Zo_ThermostatRunningMode = 11027, - Zo_ThermostatScheduleProgrammingVisibility = 11049, - Zo_Time = 11089, - Zo_TimeEpoch = 11094, - Zo_TimeStatus = 11104, - Zo_TimeZone = 11115, - Zo_TotalActivePower = 11124, - Zo_TotalApparentPower = 11141, - Zo_TotalProfileNum = 11160, - Zo_TotalReactivePower = 11176, - Zo_TuyaCalibration = 11195, - Zo_TuyaCalibrationTime = 11211, - Zo_TuyaMCUVersion = 11231, - Zo_TuyaMotorReversal = 11246, - Zo_TuyaMovingState = 11264, - Zo_TuyaQuery = 11280, - Zo_UnoccupiedCoolingSetpoint = 11290, - Zo_UnoccupiedHeatingSetpoint = 11316, - Zo_UtilityName = 11342, - Zo_ValidUntilTime = 11354, - Zo_ValvePosition = 11369, - Zo_VelocityLift = 11383, - Zo_ViewGroup = 11396, - Zo_ViewScene = 11406, - Zo_Water = 11416, - Zo_WhitePointX = 11422, - Zo_WhitePointY = 11434, - Zo_WindowCoveringType = 11446, - Zo_X = 11465, - Zo_Y = 11467, - Zo_ZCLVersion = 11469, - Zo_ZoneID = 11480, - Zo_ZoneState = 11487, - Zo_ZoneStatus = 11497, - Zo_ZoneStatusChange = 11508, - Zo_ZoneType = 11525, - Zo__ = 11534, - Zo_xx = 11536, - Zo_xx000A00 = 11539, - Zo_xx0A = 11548, - Zo_xx0A00 = 11553, - Zo_xx19 = 11560, - Zo_xx190A = 11565, - Zo_xx190A00 = 11572, - Zo_xxxx = 11581, - Zo_xxxx00 = 11586, - Zo_xxxx0A00 = 11593, - Zo_xxxxyy = 11602, - Zo_xxxxyyyy = 11609, - Zo_xxxxyyyy0A00 = 11618, - Zo_xxxxyyzz = 11631, - Zo_xxyy = 11640, - Zo_xxyy0A00 = 11645, - Zo_xxyyyy = 11654, - Zo_xxyyyy000000000000 = 11661, - Zo_xxyyyy0A0000000000 = 11680, - Zo_xxyyyyzz = 11699, - Zo_xxyyyyzzzz = 11708, - Zo_xxyyzzzz = 11719, + Zo_BlockedGPDID = 3162, + Zo_CIE = 3175, + Zo_CO = 3179, + Zo_CT = 3182, + Zo_CalculationPeriod = 3185, + Zo_CcommissioningExitMode = 3203, + Zo_CheckinInterval = 3226, + Zo_CheckinIntervalMin = 3242, + Zo_ClientActiveFunctionality = 3261, + Zo_ClientFunctionality = 3287, + Zo_ClosedLimit = 3307, + Zo_Color = 3319, + Zo_ColorCapabilities = 3325, + Zo_ColorLoopActive = 3343, + Zo_ColorLoopDirection = 3359, + Zo_ColorLoopStartEnhancedHue = 3378, + Zo_ColorLoopStoredEnhancedHue = 3404, + Zo_ColorLoopTime = 3431, + Zo_ColorMode = 3445, + Zo_ColorMove = 3455, + Zo_ColorPointBIntensity = 3465, + Zo_ColorPointBX = 3486, + Zo_ColorPointBY = 3499, + Zo_ColorPointGIntensity = 3512, + Zo_ColorPointGX = 3533, + Zo_ColorPointGY = 3546, + Zo_ColorPointRIntensity = 3559, + Zo_ColorPointRX = 3580, + Zo_ColorPointRY = 3593, + Zo_ColorStep = 3606, + Zo_ColorTempMove = 3616, + Zo_ColorTempMoveDown = 3630, + Zo_ColorTempMoveStop = 3648, + Zo_ColorTempMoveUp = 3666, + Zo_ColorTempPhysicalMaxMireds = 3682, + Zo_ColorTempPhysicalMinMireds = 3709, + Zo_ColorTempStep = 3736, + Zo_ColorTempStepDown = 3750, + Zo_ColorTempStepUp = 3768, + Zo_CommissioningWindow = 3784, + Zo_CommunicationMode = 3804, + Zo_CompanyName = 3822, + Zo_CompensationText = 3834, + Zo_ConfigStatus = 3851, + Zo_Contact = 3864, + Zo_ControlSequenceOfOperation = 3872, + Zo_Coordinate1 = 3899, + Zo_Coordinate2 = 3911, + Zo_Coordinate3 = 3923, + Zo_CurrentGroup = 3935, + Zo_CurrentPositionLift = 3948, + Zo_CurrentPositionLiftPercentage = 3968, + Zo_CurrentPositionTilt = 3998, + Zo_CurrentPositionTiltPercentage = 4018, + Zo_CurrentScene = 4048, + Zo_CurrentTemperature = 4061, + Zo_CurrentTemperatureSetPoint = 4080, + Zo_CurrentZoneSensitivityLevel = 4107, + Zo_CustomerName = 4135, + Zo_DCCurrent = 4148, + Zo_DCCurrentDivisor = 4158, + Zo_DCCurrentMax = 4175, + Zo_DCCurrentMin = 4188, + Zo_DCCurrentMultiplier = 4201, + Zo_DCCurrentOverload = 4221, + Zo_DCOverloadAlarmsMask = 4239, + Zo_DCPower = 4260, + Zo_DCPowerDivisor = 4268, + Zo_DCPowerMax = 4283, + Zo_DCPowerMin = 4294, + Zo_DCPowerMultiplier = 4305, + Zo_DCVoltage = 4323, + Zo_DCVoltageDivisor = 4333, + Zo_DCVoltageMax = 4350, + Zo_DCVoltageMin = 4363, + Zo_DCVoltageMultiplier = 4376, + Zo_DCVoltageOverload = 4396, + Zo_DataQualityID = 4414, + Zo_DateCode = 4428, + Zo_DecelerationTimeLift = 4437, + Zo_DefaultMoveRate = 4458, + Zo_DehumidificationCooling = 4474, + Zo_DehumidificationHysteresis = 4498, + Zo_DehumidificationLockout = 4525, + Zo_DehumidificationMaxCool = 4549, + Zo_DeviceEnabled = 4573, + Zo_DeviceTempAlarmMask = 4587, + Zo_Dimmer = 4607, + Zo_DimmerDown = 4614, + Zo_DimmerMove = 4625, + Zo_DimmerOptions = 4636, + Zo_DimmerRemainingTime = 4650, + Zo_DimmerStep = 4670, + Zo_DimmerStepDown = 4681, + Zo_DimmerStepUp = 4696, + Zo_DimmerStop = 4709, + Zo_DimmerUp = 4720, + Zo_DisableLocalConfig = 4729, + Zo_DoorClosedEvents = 4748, + Zo_DoorOpenEvents = 4765, + Zo_DoorState = 4780, + Zo_DriftCompensation = 4790, + Zo_DstEnd = 4808, + Zo_DstShift = 4815, + Zo_DstStart = 4824, + Zo_ElectricalMeasurementType = 4833, + Zo_EnergyFormatting = 4859, + Zo_EnergyRemote = 4876, + Zo_EnergyTotal = 4889, + Zo_EnhancedColorMode = 4901, + Zo_EnhancedCurrentHue = 4919, + Zo_EurotronicErrors = 4938, + Zo_EurotronicHostFlags = 4955, + Zo_FanMode = 4975, + Zo_FanModeSequence = 4983, + Zo_FastPollTimeout = 4999, + Zo_FastPollTimeoutMax = 5015, + Zo_Fire = 5034, + Zo_FlowMaxMeasuredValue = 5039, + Zo_FlowMinMeasuredValue = 5060, + Zo_FlowRate = 5081, + Zo_FlowTolerance = 5090, + Zo_GenericDeviceClass = 5104, + Zo_GenericDeviceType = 5123, + Zo_GetAllGroups = 5141, + Zo_GetGroup = 5154, + Zo_GetSceneMembership = 5163, + Zo_GlassBreak = 5182, + Zo_GroupNameSupport = 5193, + Zo_HVACSystemTypeConfiguration = 5210, + Zo_HWVersion = 5238, + Zo_HarmonicCurrentMultiplier = 5248, + Zo_HighTempDwellTripPoint = 5274, + Zo_HighTempThreshold = 5297, + Zo_Hue = 5315, + Zo_HueMove = 5319, + Zo_HueSat = 5327, + Zo_HueStep = 5334, + Zo_HueStepDown = 5342, + Zo_HueStepUp = 5354, + Zo_Humidity = 5364, + Zo_HumidityMaxMeasuredValue = 5373, + Zo_HumidityMinMeasuredValue = 5398, + Zo_HumidityTolerance = 5423, + Zo_IASCIEAddress = 5441, + Zo_Identify = 5455, + Zo_IdentifyQuery = 5464, + Zo_IdentifyTime = 5478, + Zo_Illuminance = 5491, + Zo_IlluminanceLevelStatus = 5503, + Zo_IlluminanceLightSensorType = 5526, + Zo_IlluminanceMaxMeasuredValue = 5553, + Zo_IlluminanceMinMeasuredValue = 5581, + Zo_IlluminanceTargetLevel = 5609, + Zo_IlluminanceTolerance = 5632, + Zo_InstalledClosedLimitLift = 5653, + Zo_InstalledClosedLimitTilt = 5678, + Zo_InstalledOpenLimitLift = 5703, + Zo_InstalledOpenLimitTilt = 5726, + Zo_IntermediateSetpointsLift = 5749, + Zo_IntermediateSetpointsTilt = 5775, + Zo_IntrinsicBallastFactor = 5801, + Zo_LampAlarmMode = 5824, + Zo_LampBurnHours = 5838, + Zo_LampBurnHoursTripPoint = 5852, + Zo_LampManufacturer = 5875, + Zo_LampRatedHours = 5892, + Zo_LampType = 5907, + Zo_LastConfiguredBy = 5916, + Zo_LastMessageLQI = 5933, + Zo_LastMessageRSSI = 5948, + Zo_LastSetTime = 5964, + Zo_LegrandHeatingMode = 5976, + Zo_LegrandMode = 5995, + Zo_LegrandOpt1 = 6007, + Zo_LegrandOpt2 = 6019, + Zo_LegrandOpt3 = 6031, + Zo_LidlPower = 6043, + Zo_LineCurrent = 6053, + Zo_LineCurrentPhB = 6065, + Zo_LineCurrentPhC = 6080, + Zo_LinkKey = 6095, + Zo_LocalTemperature = 6103, + Zo_LocalTemperatureCalibration = 6120, + Zo_LocalTime = 6148, + Zo_LocationAge = 6158, + Zo_LocationDescription = 6170, + Zo_LocationMethod = 6190, + Zo_LocationPower = 6205, + Zo_LocationType = 6219, + Zo_LockAlarmMask = 6232, + Zo_LockDefaultConfigurationRegister = 6246, + Zo_LockEnableInsideStatusLED = 6279, + Zo_LockEnableLocalProgramming = 6305, + Zo_LockEnableLogging = 6332, + Zo_LockEnableOneTouchLocking = 6350, + Zo_LockEnablePrivacyModeButton = 6376, + Zo_LockKeypadOperationEventMask = 6404, + Zo_LockKeypadProgrammingEventMask = 6433, + Zo_LockLEDSettings = 6464, + Zo_LockLanguage = 6480, + Zo_LockManualOperationEventMask = 6493, + Zo_LockOperatingMode = 6522, + Zo_LockRFIDOperationEventMask = 6540, + Zo_LockRFIDProgrammingEventMask = 6567, + Zo_LockRFOperationEventMask = 6596, + Zo_LockRFProgrammingEventMask = 6621, + Zo_LockSoundVolume = 6648, + Zo_LockState = 6664, + Zo_LockSupportedOperatingModes = 6674, + Zo_LockType = 6702, + Zo_LongPollInterval = 6711, + Zo_LongPollIntervalMin = 6728, + Zo_LowTempDwellTripPoint = 6748, + Zo_LowTempThreshold = 6770, + Zo_MainsAlarmMask = 6787, + Zo_MainsFrequency = 6802, + Zo_MainsVoltage = 6817, + Zo_MainsVoltageDwellTripPoint = 6830, + Zo_MainsVoltageMaxThreshold = 6857, + Zo_MainsVoltageMinThreshold = 6882, + Zo_Manufacturer = 6907, + Zo_MaxCoolSetpointLimit = 6920, + Zo_MaxHeatSetpointLimit = 6941, + Zo_MaxPINCodeLength = 6962, + Zo_MaxProxyTableEntries = 6979, + Zo_MaxRFIDCodeLength = 7000, + Zo_MaxSearchCounter = 7018, + Zo_MaxSinkTableEntries = 7035, + Zo_MaxTempExperienced = 7055, + Zo_Measured11thHarmonicCurrent = 7074, + Zo_Measured1stHarmonicCurrent = 7102, + Zo_Measured3rdHarmonicCurrent = 7129, + Zo_Measured5thHarmonicCurrent = 7156, + Zo_Measured7thHarmonicCurrent = 7183, + Zo_Measured9thHarmonicCurrent = 7210, + Zo_MeasuredPhase11thHarmonicCurrent = 7237, + Zo_MeasuredPhase1stHarmonicCurrent = 7270, + Zo_MeasuredPhase3rdHarmonicCurrent = 7302, + Zo_MeasuredPhase5thHarmonicCurrent = 7334, + Zo_MeasuredPhase7thHarmonicCurrent = 7366, + Zo_MeasuredPhase9thHarmonicCurrent = 7398, + Zo_MeterTypeID = 7430, + Zo_MinCoolSetpointLimit = 7442, + Zo_MinHeatSetpointLimit = 7463, + Zo_MinPINCodeLength = 7484, + Zo_MinRFIDCodeLength = 7501, + Zo_MinSetpointDeadBand = 7519, + Zo_MinTempExperienced = 7539, + Zo_Mode = 7558, + Zo_Model = 7563, + Zo_ModelId = 7569, + Zo_MotorStepSize = 7577, + Zo_Movement = 7591, + Zo_MullerLightMode = 7600, + Zo_MultiApplicationType = 7616, + Zo_MultiDescription = 7637, + Zo_MultiInApplicationType = 7654, + Zo_MultiInDescription = 7677, + Zo_MultiInNumberOfStates = 7696, + Zo_MultiInOutOfService = 7718, + Zo_MultiInReliability = 7738, + Zo_MultiInStatusFlags = 7757, + Zo_MultiInValue = 7776, + Zo_MultiNumberOfStates = 7789, + Zo_MultiOutApplicationType = 7809, + Zo_MultiOutDescription = 7833, + Zo_MultiOutNumberOfStates = 7853, + Zo_MultiOutOfService = 7876, + Zo_MultiOutOutOfService = 7894, + Zo_MultiOutReliability = 7915, + Zo_MultiOutRelinquishDefault = 7935, + Zo_MultiOutStatusFlags = 7961, + Zo_MultiOutValue = 7981, + Zo_MultiReliability = 7995, + Zo_MultiRelinquishDefault = 8012, + Zo_MultiStatusFlags = 8035, + Zo_MultiValue = 8052, + Zo_MultipleScheduling = 8063, + Zo_NeutralCurrent = 8082, + Zo_NotificationRetryNumber = 8097, + Zo_NotificationRetryTimer = 8121, + Zo_NumberOfDevices = 8144, + Zo_NumberOfHolidaySchedulesSupported = 8160, + Zo_NumberOfLogRecordsSupported = 8194, + Zo_NumberOfPINUsersSupported = 8222, + Zo_NumberOfPrimaries = 8248, + Zo_NumberOfRFIDUsersSupported = 8266, + Zo_NumberOfResets = 8293, + Zo_NumberOfTotalUsersSupported = 8308, + Zo_NumberOfWeekDaySchedulesSupportedPerUser = 8336, + Zo_NumberOfYearDaySchedulesSupportedPerUser = 8377, + Zo_NumberOfZoneSensitivityLevelsSupported = 8418, + Zo_NumberRSSIMeasurements = 8457, + Zo_NumberofActuationsLift = 8480, + Zo_NumberofActuationsTilt = 8503, + Zo_Occupancy = 8526, + Zo_OccupancySensorType = 8536, + Zo_OccupiedCoolingSetpoint = 8556, + Zo_OccupiedHeatingSetpoint = 8580, + Zo_OffTransitionTime = 8604, + Zo_OffWaitTime = 8622, + Zo_OnLevel = 8634, + Zo_OnOff = 8642, + Zo_OnOffTransitionTime = 8648, + Zo_OnTime = 8668, + Zo_OnTransitionTime = 8675, + Zo_OpenPeriod = 8692, + Zo_OppleMode = 8703, + Zo_OutdoorTemperature = 8713, + Zo_OverTempTotalDwell = 8732, + Zo_PICoolingDemand = 8751, + Zo_PIHeatingDemand = 8767, + Zo_PIROccupiedToUnoccupiedDelay = 8783, + Zo_PIRUnoccupiedToOccupiedDelay = 8812, + Zo_PIRUnoccupiedToOccupiedThreshold = 8841, + Zo_POD = 8874, + Zo_Panic = 8878, + Zo_PartNumber = 8884, + Zo_PathLossExponent = 8895, + Zo_PersistentMemoryWrites = 8912, + Zo_PersonalAlarm = 8935, + Zo_PhaseHarmonicCurrentMultiplier = 8949, + Zo_PhysicalClosedLimit = 8980, + Zo_PhysicalClosedLimitLift = 9000, + Zo_PhysicalClosedLimitTilt = 9024, + Zo_PhysicalEnvironment = 9048, + Zo_Power = 9068, + Zo_PowerDivisor = 9074, + Zo_PowerFactor = 9087, + Zo_PowerFactorPhB = 9099, + Zo_PowerFactorPhC = 9114, + Zo_PowerMultiplier = 9129, + Zo_PowerOffEffect = 9145, + Zo_PowerOnRecall = 9160, + Zo_PowerOnTimer = 9174, + Zo_PowerSource = 9187, + Zo_PowerThreshold = 9199, + Zo_Pressure = 9214, + Zo_PressureMaxMeasuredValue = 9223, + Zo_PressureMaxScaledValue = 9248, + Zo_PressureMinMeasuredValue = 9271, + Zo_PressureMinScaledValue = 9296, + Zo_PressureScale = 9319, + Zo_PressureScaledTolerance = 9333, + Zo_PressureScaledValue = 9357, + Zo_PressureTolerance = 9377, + Zo_Primary1Intensity = 9395, + Zo_Primary1X = 9413, + Zo_Primary1Y = 9423, + Zo_Primary2Intensity = 9433, + Zo_Primary2X = 9451, + Zo_Primary2Y = 9461, + Zo_Primary3Intensity = 9471, + Zo_Primary3X = 9489, + Zo_Primary3Y = 9499, + Zo_Primary4Intensity = 9509, + Zo_Primary4X = 9527, + Zo_Primary4Y = 9537, + Zo_Primary5Intensity = 9547, + Zo_Primary5X = 9565, + Zo_Primary5Y = 9575, + Zo_Primary6Intensity = 9585, + Zo_Primary6X = 9603, + Zo_Primary6Y = 9613, + Zo_ProductCode = 9623, + Zo_ProductRevision = 9635, + Zo_ProductURL = 9651, + Zo_ProxyTable = 9662, + Zo_QualityMeasure = 9673, + Zo_RGB = 9688, + Zo_RHDehumidificationSetpoint = 9692, + Zo_RMSCurrent = 9719, + Zo_RMSCurrentMax = 9730, + Zo_RMSCurrentMaxPhB = 9744, + Zo_RMSCurrentMaxPhC = 9761, + Zo_RMSCurrentMin = 9778, + Zo_RMSCurrentMinPhB = 9792, + Zo_RMSCurrentMinPhC = 9809, + Zo_RMSCurrentPhB = 9826, + Zo_RMSCurrentPhC = 9840, + Zo_RMSExtremeOverVoltage = 9854, + Zo_RMSExtremeOverVoltagePeriod = 9876, + Zo_RMSExtremeOverVoltagePeriodPhB = 9904, + Zo_RMSExtremeOverVoltagePeriodPhC = 9935, + Zo_RMSExtremeUnderVoltage = 9966, + Zo_RMSExtremeUnderVoltagePeriod = 9989, + Zo_RMSExtremeUnderVoltagePeriodPhB = 10018, + Zo_RMSExtremeUnderVoltagePeriodPhC = 10050, + Zo_RMSVoltage = 10082, + Zo_RMSVoltageMax = 10093, + Zo_RMSVoltageMaxPhB = 10107, + Zo_RMSVoltageMaxPhC = 10124, + Zo_RMSVoltageMin = 10141, + Zo_RMSVoltageMinPhB = 10155, + Zo_RMSVoltageMinPhC = 10172, + Zo_RMSVoltagePhB = 10189, + Zo_RMSVoltagePhC = 10203, + Zo_RMSVoltageSag = 10217, + Zo_RMSVoltageSagPeriod = 10231, + Zo_RMSVoltageSagPeriodPhB = 10251, + Zo_RMSVoltageSagPeriodPhC = 10274, + Zo_RMSVoltageSwell = 10297, + Zo_RMSVoltageSwellPeriod = 10313, + Zo_RMSVoltageSwellPeriodPhB = 10335, + Zo_RMSVoltageSwellPeriodPhC = 10360, + Zo_ReactiveCurrent = 10385, + Zo_ReactiveCurrentPhB = 10401, + Zo_ReactiveCurrentPhC = 10420, + Zo_ReactivePower = 10439, + Zo_ReactivePowerPhB = 10453, + Zo_ReactivePowerPhC = 10470, + Zo_RecallScene = 10487, + Zo_RelativeHumidity = 10499, + Zo_RelativeHumidityDisplay = 10516, + Zo_RelativeHumidityMode = 10540, + Zo_RemainingTime = 10561, + Zo_RemoteSensing = 10575, + Zo_RemoveAllGroups = 10589, + Zo_RemoveAllScenes = 10605, + Zo_RemoveGroup = 10621, + Zo_RemoveScene = 10633, + Zo_ReportingPeriod = 10645, + Zo_ResetAlarm = 10661, + Zo_ResetAllAlarms = 10672, + Zo_SWBuildID = 10687, + Zo_Sat = 10697, + Zo_SatMove = 10701, + Zo_SatStep = 10709, + Zo_SceneCount = 10717, + Zo_SceneNameSupport = 10728, + Zo_SceneValid = 10745, + Zo_ScheduleMode = 10756, + Zo_SeaPressure = 10769, + Zo_SecurityLevel = 10781, + Zo_ServerActiveFunctionality = 10795, + Zo_ServerFunctionality = 10821, + Zo_SharedSecurityKey = 10841, + Zo_SharedSecurityKeyType = 10859, + Zo_ShortPollInterval = 10881, + Zo_Shutter = 10899, + Zo_ShutterClose = 10907, + Zo_ShutterLift = 10920, + Zo_ShutterOpen = 10932, + Zo_ShutterStop = 10944, + Zo_ShutterTilt = 10956, + Zo_SinkTable = 10968, + Zo_SoftwareRevision = 10978, + Zo_StackVersion = 10995, + Zo_StandardTime = 11008, + Zo_StartUpOnOff = 11021, + Zo_Status = 11034, + Zo_StoreScene = 11041, + Zo_SwitchActions = 11052, + Zo_SwitchType = 11066, + Zo_SystemMode = 11077, + Zo_TRVBoost = 11088, + Zo_TRVChildProtection = 11097, + Zo_TRVMirrorDisplay = 11116, + Zo_TRVMode = 11133, + Zo_TRVWindowOpen = 11141, + Zo_TempTarget = 11155, + Zo_Temperature = 11166, + Zo_TemperatureDisplayMode = 11178, + Zo_TemperatureMaxMeasuredValue = 11201, + Zo_TemperatureMinMeasuredValue = 11229, + Zo_TemperatureTolerance = 11257, + Zo_TerncyDuration = 11278, + Zo_TerncyRotate = 11293, + Zo_ThSetpoint = 11306, + Zo_ThermostatAlarmMask = 11317, + Zo_ThermostatKeypadLockout = 11337, + Zo_ThermostatOccupancy = 11361, + Zo_ThermostatRunningMode = 11381, + Zo_ThermostatScheduleProgrammingVisibility = 11403, + Zo_Time = 11443, + Zo_TimeEpoch = 11448, + Zo_TimeStatus = 11458, + Zo_TimeZone = 11469, + Zo_TotalActivePower = 11478, + Zo_TotalApparentPower = 11495, + Zo_TotalProfileNum = 11514, + Zo_TotalReactivePower = 11530, + Zo_TuyaCalibration = 11549, + Zo_TuyaCalibrationTime = 11565, + Zo_TuyaMCUVersion = 11585, + Zo_TuyaMotorReversal = 11600, + Zo_TuyaMovingState = 11618, + Zo_TuyaQuery = 11634, + Zo_UnoccupiedCoolingSetpoint = 11644, + Zo_UnoccupiedHeatingSetpoint = 11670, + Zo_UtilityName = 11696, + Zo_ValidUntilTime = 11708, + Zo_ValvePosition = 11723, + Zo_VelocityLift = 11737, + Zo_ViewGroup = 11750, + Zo_ViewScene = 11760, + Zo_Water = 11770, + Zo_WhitePointX = 11776, + Zo_WhitePointY = 11788, + Zo_WindowCoveringType = 11800, + Zo_X = 11819, + Zo_Y = 11821, + Zo_ZCLVersion = 11823, + Zo_ZoneID = 11834, + Zo_ZoneState = 11841, + Zo_ZoneStatus = 11851, + Zo_ZoneStatusChange = 11862, + Zo_ZoneType = 11879, + Zo__ = 11888, + Zo_xx = 11890, + Zo_xx000A00 = 11893, + Zo_xx0A = 11902, + Zo_xx0A00 = 11907, + Zo_xx19 = 11914, + Zo_xx190A = 11919, + Zo_xx190A00 = 11926, + Zo_xxxx = 11935, + Zo_xxxx00 = 11940, + Zo_xxxx0A00 = 11947, + Zo_xxxxyy = 11956, + Zo_xxxxyyyy = 11963, + Zo_xxxxyyyy0A00 = 11972, + Zo_xxxxyyzz = 11985, + Zo_xxyy = 11994, + Zo_xxyy0A00 = 11999, + Zo_xxyyyy = 12008, + Zo_xxyyyy000000000000 = 12015, + Zo_xxyyyy0A0000000000 = 12034, + Zo_xxyyyyzz = 12053, + Zo_xxyyyyzzzz = 12062, + Zo_xxyyzzzz = 12073, }; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino index bae1ad62e..7d9daf00c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_1_attributes.ino @@ -187,8 +187,8 @@ const uint8_t Z_EXPORT_DATA = 0x80; enum Cx_cluster_short { Cx0000, Cx0001, Cx0002, Cx0003, Cx0004, Cx0005, Cx0006, Cx0007, Cx0008, Cx0009, Cx000A, Cx000B, Cx000C, Cx000D, Cx000E, Cx000F, - Cx0010, Cx0011, Cx0012, Cx0013, Cx0014, Cx001A, Cx0020, Cx0100, - Cx0101, Cx0102, Cx0201, Cx0202, Cx0203, Cx0204, + Cx0010, Cx0011, Cx0012, Cx0013, Cx0014, Cx001A, Cx0020, Cx0021, + Cx0100, Cx0101, Cx0102, Cx0201, Cx0202, Cx0203, Cx0204, Cx0300, Cx0301, Cx0400, Cx0401, Cx0402, Cx0403, Cx0404, Cx0405, Cx0406, Cx0500, Cx0702, Cx0B01, Cx0B04, Cx0B05, CxEF00, CxFC01, CxFC40, CxFCC0, CxFCCC, @@ -197,8 +197,8 @@ enum Cx_cluster_short { const uint16_t Cx_cluster[] PROGMEM = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, - 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x001A, 0x0020, 0x0100, - 0x0101, 0x0102, 0x0201, 0x0202, 0x0203, 0x0204, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x001A, 0x0020, 0x0021, + 0x0100, 0x0101, 0x0102, 0x0201, 0x0202, 0x0203, 0x0204, 0x0300, 0x0301, 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0500, 0x0702, 0x0B01, 0x0B04, 0x0B05, 0xEF00, 0xFC01, 0xFC40, 0xFCC0, 0xFCCC, @@ -746,6 +746,27 @@ const Z_AttributeConverter Z_PostProcess[] PROGMEM = { { Zuint32, Cx0020, 0x0005, Z_(LongPollIntervalMin), Cm1, 0 }, { Zuint16, Cx0020, 0x0006, Z_(FastPollTimeoutMax), Cm1, 0 }, + // Green Power + { Zuint8, Cx0021, 0x0000, Z_(MaxSinkTableEntries), Cm1, 0 }, + { Zoctstr16,Cx0021, 0x0001, Z_(SinkTable), Cm1, 0 }, + { Zmap8, Cx0021, 0x0002, Z_(CommunicationMode), Cm1, 0 }, + { Zmap8, Cx0021, 0x0003, Z_(CcommissioningExitMode),Cm1, 0 }, + { Zuint16, Cx0021, 0x0004, Z_(CommissioningWindow), Cm1, 0 }, + { Zmap8, Cx0021, 0x0005, Z_(SecurityLevel), Cm1, 0 }, + { Zmap24, Cx0021, 0x0006, Z_(ServerFunctionality), Cm1, 0 }, + { Zmap24, Cx0021, 0x0007, Z_(ServerActiveFunctionality), Cm1, 0 }, + { Zuint8, Cx0021, 0x0010, Z_(MaxProxyTableEntries), Cm1, 0 }, + { Zoctstr16,Cx0021, 0x0011, Z_(ProxyTable), Cm1, 0 }, + { Zuint8, Cx0021, 0x0012, Z_(NotificationRetryNumber),Cm1, 0 }, + { Zuint8, Cx0021, 0x0013, Z_(NotificationRetryTimer),Cm1, 0 }, + { Zuint8, Cx0021, 0x0014, Z_(MaxSearchCounter), Cm1, 0 }, + { Zoctstr16,Cx0021, 0x0015, Z_(BlockedGPDID), Cm1, 0 }, + { Zmap24, Cx0021, 0x0016, Z_(ClientFunctionality), Cm1, 0 }, + { Zmap24, Cx0021, 0x0017, Z_(ClientActiveFunctionality), Cm1, 0 }, + { Zmap8, Cx0021, 0x0020, Z_(SharedSecurityKeyType),Cm1, 0 }, + { Zkey128, Cx0021, 0x0021, Z_(SharedSecurityKey), Cm1, 0 }, + { Zkey128, Cx0021, 0x0022, Z_(LinkKey), Cm1, 0 }, + // Shade Configuration cluster { Zuint16, Cx0100, 0x0000, Z_(PhysicalClosedLimit), Cm1, 0 }, { Zuint8, Cx0100, 0x0001, Z_(MotorStepSize), Cm1, 0 }, diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino index 065c847fd..4bcef8961 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino @@ -108,7 +108,7 @@ public: manuf(manuf_code), transactseq(transact_seq), cmd(cmd_id), payload(buf_len ? buf_len : 250), // allocate the data frame from source or preallocate big enough cluster(clusterid), groupaddr(groupaddr), - shortaddr(srcaddr), _srcendpoint(srcendpoint), dstendpoint(dstendpoint), _wasbroadcast(wasbroadcast), + shortaddr(srcaddr), srcendpoint(srcendpoint), dstendpoint(dstendpoint), _wasbroadcast(wasbroadcast), _linkquality(linkquality), _securityuse(securityuse), _seqnumber(seqnumber) { _frame_control.d8 = frame_control; @@ -128,7 +128,7 @@ public: "\"manuf\":\"0x%04X\",\"transact\":%d," "\"cmdid\":\"0x%02X\",\"payload\":\"%_B\"}}"), groupaddr, cluster, shortaddr, - _srcendpoint, dstendpoint, _wasbroadcast, + srcendpoint, dstendpoint, _wasbroadcast, _linkquality, _securityuse, _seqnumber, _frame_control, _frame_control.b.frame_type, _frame_control.b.direction, _frame_control.b.disable_def_resp, @@ -207,7 +207,7 @@ public: inline uint16_t getClusterId(void) const { return cluster; } inline uint8_t getLinkQuality(void) const { return _linkquality; } inline uint8_t getCmdId(void) const { return cmd; } - inline uint16_t getSrcEndpoint(void) const { return _srcendpoint; } + inline uint16_t getSrcEndpoint(void) const { return srcendpoint; } const SBuffer &getPayload(void) const { return payload; } uint16_t getManufCode(void) const { return manuf; } @@ -234,9 +234,11 @@ public: bool direct = false; // true if direct, false if discover router bool transacSet = false; // is transac already set + uint8_t srcendpoint = 0x00; // 0x00 is invalid for the src endpoint + bool direction = false; // false = client to server (default), true = server to client (rare) + // below private attributes are not used when sending a message private: - uint8_t _srcendpoint = 0x00; // 0x00 is invalid for the src endpoint ZCLHeaderFrameControl_t _frame_control = { .d8 = 0 }; bool _wasbroadcast = false; uint8_t _linkquality = 0x00; @@ -531,6 +533,16 @@ uint32_t parseSingleAttribute(Z_attribute & attr, const SBuffer &buf, attr.setUInt(uint16_val); } break; + case Zdata24: // data16 + case Zmap24: // map16 + { + uint32_t uint32_val = buf.get16(i); + uint8_t high = buf.get8(i+2); + uint32_val = uint32_val | (high << 16); + // i += 3; + attr.setUInt(uint32_val); + } + break; case Zdata32: // data32 case Zmap32: // map32 { @@ -549,7 +561,7 @@ uint32_t parseSingleAttribute(Z_attribute & attr, const SBuffer &buf, } break; - // TODO + // All other fixed size, convert to a HEX dump case ZToD: // ToD case Zdate: // date case ZclusterId: // clusterId @@ -558,17 +570,19 @@ uint32_t parseSingleAttribute(Z_attribute & attr, const SBuffer &buf, case ZEUI64: // EUI64 case Zkey128: // key128 case Zsemi: // semi (float on 2 bytes) + { + attr.setBuf(buf, i, len); + } + // i += 16; break; // Other un-implemented data types - case Zdata24: // data24 case Zdata40: // data40 case Zdata48: // data48 case Zdata56: // data56 case Zdata64: // data64 break; // map - case Zmap24: // map24 case Zmap40: // map40 case Zmap48: // map48 case Zmap56: // map56 @@ -621,7 +635,7 @@ void ZCLFrame::parseReportAttributes(Z_attribute_list& attr_list) { ZCLFrame zcl(2); // message is 2 bytes zcl.shortaddr = shortaddr; zcl.cluster = cluster; - zcl.dstendpoint = _srcendpoint; + zcl.dstendpoint = srcendpoint; zcl.cmd = ZCL_DEFAULT_RESPONSE; zcl.manuf = manuf; zcl.clusterSpecific = false; /* not cluster specific */ @@ -768,7 +782,7 @@ void ZCLFrame::computeSyntheticAttributes(Z_attribute_list& attr_list) { if (attr_rgb == nullptr) { // make sure we didn't already computed it uint8_t brightness = 255; if (device.valid()) { - const Z_Data_Light & light = device.data.find(_srcendpoint); + const Z_Data_Light & light = device.data.find(srcendpoint); if ((&light != &z_data_unk) && (light.validDimmer())) { // Dimmer has a valid value brightness = changeUIntScale(light.getDimmer(), 0, 254, 0, 255); // range is 0..255 @@ -798,7 +812,7 @@ void ZCLFrame::computeSyntheticAttributes(Z_attribute_list& attr_list) { } break; case 0x05000002: // ZoneStatus - const Z_Data_Alarm & alarm = (const Z_Data_Alarm&) zigbee_devices.getShortAddr(shortaddr).data.find(Z_Data_Type::Z_Alarm, _srcendpoint); + const Z_Data_Alarm & alarm = (const Z_Data_Alarm&) zigbee_devices.getShortAddr(shortaddr).data.find(Z_Data_Type::Z_Alarm, srcendpoint); if (&alarm != nullptr) { alarm.convertZoneStatus(attr_list, attr.getUInt()); } @@ -821,12 +835,12 @@ void ZCLFrame::generateCallBacks(Z_attribute_list& attr_list) { uint32_t occupancy = attr.getUInt(); if (occupancy) { uint32_t pir_timer = OCCUPANCY_TIMEOUT; - const Z_Data_PIR & pir_found = (const Z_Data_PIR&) zigbee_devices.getShortAddr(shortaddr).data.find(Z_Data_Type::Z_PIR, _srcendpoint); + const Z_Data_PIR & pir_found = (const Z_Data_PIR&) zigbee_devices.getShortAddr(shortaddr).data.find(Z_Data_Type::Z_PIR, srcendpoint); if (&pir_found != nullptr) { pir_timer = pir_found.getTimeoutSeconds() * 1000; } if (pir_timer > 0) { - zigbee_devices.setTimer(shortaddr, 0 /* groupaddr */, pir_timer, cluster, _srcendpoint, Z_CAT_VIRTUAL_OCCUPANCY, 0, &Z_OccupancyCallback); + zigbee_devices.setTimer(shortaddr, 0 /* groupaddr */, pir_timer, cluster, srcendpoint, Z_CAT_VIRTUAL_OCCUPANCY, 0, &Z_OccupancyCallback); } } else { zigbee_devices.resetTimersForDevice(shortaddr, 0 /* groupaddr */, Z_CAT_VIRTUAL_OCCUPANCY); @@ -1049,7 +1063,7 @@ void ZCLFrame::parseResponse_inner(uint8_t cmd, bool cluster_specific, uint8_t s // "StatusMessage" attr_list.addAttributePMEM(PSTR(D_JSON_ZIGBEE_STATUS_MSG)).setStr(getZigbeeStatusMessage(status).c_str()); // Add Endpoint - attr_list.addAttributePMEM(PSTR(D_CMND_ZIGBEE_ENDPOINT)).setUInt(_srcendpoint); + attr_list.addAttributePMEM(PSTR(D_CMND_ZIGBEE_ENDPOINT)).setUInt(srcendpoint); // Add Group if non-zero if (groupaddr) { // TODO what about group zero attr_list.group_id = groupaddr; @@ -1082,16 +1096,16 @@ void Z_ResetDebounce(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, u void ZCLFrame::parseClusterSpecificCommand(Z_attribute_list& attr_list) { // Check if debounce is active and if the packet is a duplicate Z_Device & device = zigbee_devices.getShortAddr(shortaddr); - if ((device.debounce_endpoint != 0) && (device.debounce_endpoint == _srcendpoint) && (device.debounce_transact == transactseq)) { + if ((device.debounce_endpoint != 0) && (device.debounce_endpoint == srcendpoint) && (device.debounce_transact == transactseq)) { // this is a duplicate, drop the packet - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Discarding duplicate command from 0x%04X, endpoint %d"), shortaddr, _srcendpoint); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Discarding duplicate command from 0x%04X, endpoint %d"), shortaddr, srcendpoint); } else { // reset the duplicate marker, parse the packet normally, and set a timer to reset the marker later (which will discard any existing timer for the same device/endpoint) - device.debounce_endpoint = _srcendpoint; + device.debounce_endpoint = srcendpoint; device.debounce_transact = transactseq; - zigbee_devices.setTimer(shortaddr, 0 /* groupaddr */, USE_ZIGBEE_DEBOUNCE_COMMANDS, 0 /*clusterid*/, _srcendpoint, Z_CAT_DEBOUNCE_CMD, 0, &Z_ResetDebounce); + zigbee_devices.setTimer(shortaddr, 0 /* groupaddr */, USE_ZIGBEE_DEBOUNCE_COMMANDS, 0 /*clusterid*/, srcendpoint, Z_CAT_DEBOUNCE_CMD, 0, &Z_ResetDebounce); - convertClusterSpecific(attr_list, cluster, cmd, _frame_control.b.direction, shortaddr, _srcendpoint, payload); + convertClusterSpecific(attr_list, cluster, cmd, _frame_control.b.direction, shortaddr, srcendpoint, payload); if (!Settings->flag5.zb_disable_autoquery) { // read attributes unless disabled if (!_frame_control.b.direction) { // only handle server->client (i.e. device->coordinator) @@ -1107,7 +1121,7 @@ void ZCLFrame::parseClusterSpecificCommand(Z_attribute_list& attr_list) { ZCLFrame zcl(2); // message is 4 bytes zcl.shortaddr = shortaddr; zcl.cluster = cluster; - zcl.dstendpoint = _srcendpoint; + zcl.dstendpoint = srcendpoint; zcl.cmd = ZCL_DEFAULT_RESPONSE; zcl.manuf = manuf; zcl.clusterSpecific = false; /* not cluster specific */ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino index eb7e2074a..34e97ec14 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino @@ -315,16 +315,22 @@ ZBM(ZBR_ZDO_ACTIVEEPREQ, Z_SRSP | Z_ZDO, ZDO_ACTIVE_EP_REQ, Z_SUCCESS) // 65050 // 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 + 0x00, 0x00 /* nwkaddr */, 0x03 /* activeepcount */, 0xF2, 0x0B, 0x01 /* the actual endpoints */) // 4585000000000003F20B01 // Z_AF:register profile:104, ep:01 ZBM(ZBS_AF_REGISTER01, Z_SREQ | Z_AF, AF_REGISTER, 0x01 /* endpoint */, Z_B0(Z_PROF_HA), Z_B1(Z_PROF_HA), // 24000401050000000000 0x05, 0x00 /* AppDeviceId */, 0x00 /* AppDevVer */, 0x00 /* LatencyReq */, - 0x00 /* AppNumInClusters */, 0x00 /* AppNumInClusters */) + 0x00 /* AppNumInClusters */, 0x00 /* AppNumOutClusters */) ZBM(ZBR_AF_REGISTER, Z_SRSP | Z_AF, AF_REGISTER, Z_SUCCESS) // 640000 ZBM(ZBS_AF_REGISTER0B, Z_SREQ | Z_AF, AF_REGISTER, 0x0B /* endpoint */, Z_B0(Z_PROF_HA), Z_B1(Z_PROF_HA), // 2400040B050000000000 0x05, 0x00 /* AppDeviceId */, 0x00 /* AppDevVer */, 0x00 /* LatencyReq */, - 0x00 /* AppNumInClusters */, 0x00 /* AppNumInClusters */) + 0x00 /* AppNumInClusters */, 0x00 /* AppNumOutClusters */) +// Green Power endpoint 242 0xF2 +ZBM(ZBS_AF_REGISTERF2, Z_SREQ | Z_AF, AF_REGISTER, 0xF2 /* endpoint */, Z_B0(Z_PROF_GP), Z_B1(Z_PROF_GP), // + 0x05, 0x61 /* AppDeviceId */, 0x00 /* AppDevVer */, 0x00 /* LatencyReq */, + 0x00 /* AppNumInClusters */, + 0x01 /* AppNumOutClusters */, + 0x21,0x00) // 0x0021 // Z_AF:register profile:104, ep:01 - main clusters for router or device ZBM(ZBS_AF_REGISTER_ALL, Z_SREQ | Z_AF, AF_REGISTER, 0x01 /* endpoint */, Z_B0(Z_PROF_HA), Z_B1(Z_PROF_HA), // 24000401050000000000 0x05, 0x00 /* AppDeviceId */, 0x00 /* AppDevVer */, 0x00 /* LatencyReq */, @@ -333,7 +339,7 @@ ZBM(ZBS_AF_REGISTER_ALL, Z_SREQ | Z_AF, AF_REGISTER, 0x01 /* endpoint */, Z_B0(Z 0x07,0x00, 0x08,0x00, 0x0A,0x00, 0x02,0x01, // 0x0007, 0x0008, 0x000A, 0X0102 0x00,0x03, 0x00,0x04, 0x02,0x04, 0x03,0x04, // 0x0300, 0x0400, 0x0402, 0x0403 0x05,0x04, 0x06,0x04, // 0x0405, 0x0406 - 0x00 /* AppNumInClusters */) + 0x00 /* AppNumOutClusters */) // Z_ZDO:mgmtPermitJoinReq ZBM(ZBS_PERMITJOINREQ_CLOSE, Z_SREQ | Z_ZDO, ZDO_MGMT_PERMIT_JOIN_REQ, 0x02 /* AddrMode */, // 25360200000000 @@ -506,6 +512,8 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { ZI_WAIT_RECV(1000, ZBR_AF_REGISTER) ZI_SEND(ZBS_AF_REGISTER0B) // Z_AF register for endpoint 0B, profile 0x0104 Home Automation ZI_WAIT_RECV(1000, ZBR_AF_REGISTER) + ZI_SEND(ZBS_AF_REGISTERF2) // Z_AF register for endpoint F2, profile 0xa1e0 Green Power + ZI_WAIT_RECV(1000, ZBR_AF_REGISTER) // Write again channels, see https://github.com/Koenkk/zigbee-herdsman/blob/37bea20ba04ee5d4938abc21a7569b43f831de32/src/adapter/z-stack/adapter/startZnp.ts#L244-L245 ZI_SEND(ZBS_W_CHANN) // write CHANNEL ZI_WAIT_RECV(1000, ZBR_WNV_OK) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_8_parsers.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_8_parsers.ino index 4edf32a09..4e82814ba 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_8_parsers.ino @@ -2232,7 +2232,7 @@ void ZCLFrame::autoResponder(const uint16_t *attr_list_ids, size_t attr_len) { ",\"Endpoint\":%d" ",\"Response\":%s}" ), - shortaddr, cluster, _srcendpoint, + shortaddr, cluster, srcendpoint, attr_list.toString().c_str()); // send @@ -2240,7 +2240,7 @@ void ZCLFrame::autoResponder(const uint16_t *attr_list_ids, size_t attr_len) { ZCLFrame zcl(buf.len()); // message is 4 bytes zcl.shortaddr = shortaddr; zcl.cluster = cluster; - zcl.dstendpoint = _srcendpoint; + zcl.dstendpoint = srcendpoint; zcl.cmd = ZCL_READ_ATTRIBUTES_RESPONSE; zcl.clusterSpecific = false; /* not cluster specific */ zcl.needResponse = false; /* noresponse */ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_9_serial.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_9_serial.ino index c532e2363..05a049c8c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_9_serial.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_9_serial.ino @@ -775,14 +775,19 @@ void ZigbeeZCLSend_Raw(const ZCLFrame &zcl) { buf.add8(zcl.dstendpoint); // dest endpoint } buf.add16(0x0000); // dest Pan ID, 0x0000 = intra-pan - buf.add8(0x01); // source endpoint + if (zcl.srcendpoint) { + buf.add8(zcl.srcendpoint); // source endpoint + } else { + buf.add8(1); // set endpoint to 1 if not specified + } buf.add16(zcl.cluster); buf.add8(zcl.transactseq); // transactseq - buf.add8(0x30); // 30 options + buf.add8(zcl.direct ? 0x00 : 0x30); // 30 options buf.add8(0x1E); // 1E radius buf.add16(3 + zcl.payload.len() + (zcl.manuf ? 2 : 0)); - buf.add8((zcl.needResponse ? 0x00 : 0x10) | (zcl.clusterSpecific ? 0x01 : 0x00) | (zcl.manuf ? 0x04 : 0x00)); // Frame Control Field + buf.add8((zcl.needResponse ? 0x00 : 0x10) | (zcl.clusterSpecific ? 0x01 : 0x00) | + (zcl.manuf ? 0x04 : 0x00) | (zcl.direction ? 0x08 : 0x00)); // Frame Control Field if (zcl.manuf) { buf.add16(zcl.manuf); // add Manuf Id if not null } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino index 1318d11a3..96f15cdc2 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino @@ -730,8 +730,17 @@ void CmndZbSend(void) { // parse "Device" and "Group" JsonParserToken val_device = root[PSTR(D_CMND_ZIGBEE_DEVICE)]; if (val_device) { - zcl.shortaddr = zigbee_devices.parseDeviceFromName(val_device.getStr()).shortaddr; - if (!zcl.validShortaddr()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_INVALID_PARAM)); return; } + uint16_t parsed_shortaddr = BAD_SHORTADDR; + zcl.shortaddr = zigbee_devices.parseDeviceFromName(val_device.getStr(), &parsed_shortaddr).shortaddr; + if (!zcl.validShortaddr()) { + if (parsed_shortaddr != BAD_SHORTADDR) { + // we still got a short address + zcl.shortaddr = parsed_shortaddr; + } else { + ResponseCmndChar_P(PSTR(D_ZIGBEE_INVALID_PARAM)); + return; + } + } } if (!zcl.validShortaddr()) { // if not found, check if we have a group JsonParserToken val_group = root[PSTR(D_CMND_ZIGBEE_GROUP)]; @@ -760,6 +769,10 @@ void CmndZbSend(void) { ResponseCmndChar_P(PSTR("Missing endpoint")); return; } + // Special case for Green Power, if dstendpoint is 0xF2, then source endpoint should also be 0xF2 + if (zcl.dstendpoint == 0xF2) { + zcl.srcendpoint = 0xF2; + } // from here endpoint is valid and non-zero // cluster may be already specified or 0xFFFF @@ -1517,6 +1530,7 @@ void CmndZbPermitJoin(void) { // ZNP Version #ifdef USE_ZIGBEE_ZNP + // put all routers in pairing mode SBuffer buf(34); buf.add8(Z_SREQ | Z_ZDO); // 25 buf.add8(ZDO_MGMT_PERMIT_JOIN_REQ); // 36 @@ -1527,6 +1541,22 @@ void CmndZbPermitJoin(void) { ZigbeeZNPSend(buf.getBuffer(), buf.len()); + // send Green Power pairing mode + ZCLFrame zcl(4); // message is 4 bytes max + + zcl.cmd = 0x02; // GP Proxy Commissioning Mode + zcl.cluster = 0x0021; // GP cluster + zcl.shortaddr = 0xFFFC; // Broadcast to all routers + zcl.srcendpoint = 0xF2; // GP endpoint + zcl.dstendpoint = 0xF2; // GP endpoint + zcl.needResponse = false; // as per GP spec The Disable default response sub-field of the Frame Control Field of the ZCL header shall be set to 0b1." + zcl.clusterSpecific = true; // command + zcl.direct = true; // broadcast so no need to discover routes + zcl.direction = true; // server to client + zcl.payload.add8(0x0B); // Action=1, gpsCommissioningExitMode=0b101 (window expiration + GP Proxy Commissioning Mode) + zcl.payload.add16(duration); + zigbeeZCLSendCmd(zcl); + #endif // USE_ZIGBEE_ZNP // EZSP VERSION From 14642fb2147b17a2382fa15341aff8c7ac7e20e1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 1 Sep 2022 09:43:20 +0200 Subject: [PATCH 21/46] Update changelogs --- CHANGELOG.md | 2 +- RELEASENOTES.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfe3871bb..5afd4066a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ All notable changes to this project will be documented in this file. - Support for Modbus writing using ModbusBridge by JeroenSt (#16351) - Support for Ethernet in ESP32 safeboot firmware (#16388) - Flowrate meter flow amount/duration, show values in table format (#16385) -- Zigbee prepare for Green Power support +- Zigbee prepare for Green Power support (#16407) ### Changed - TasmotaModbus library from v3.5.0 to v3.6.0 (#16351) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f4912f2dc..c128647a0 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -113,6 +113,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for SGP40 gas and air quality sensor [#16341](https://github.com/arendst/Tasmota/issues/16341) - Support for Modbus writing using ModbusBridge by JeroenSt [#16351](https://github.com/arendst/Tasmota/issues/16351) - Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` [#16252](https://github.com/arendst/Tasmota/issues/16252) +- Zigbee prepare for Green Power support [#16407](https://github.com/arendst/Tasmota/issues/16407) - Flowrate meter flow amount/duration, show values in table format [#16385](https://github.com/arendst/Tasmota/issues/16385) - Support for Ethernet in ESP32 safeboot firmware [#16388](https://github.com/arendst/Tasmota/issues/16388) - ESP32-S3 support for internal temperature sensor From 684584a5e525586a890e192cd11890728a4e8f2b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 2 Sep 2022 11:24:47 +0200 Subject: [PATCH 22/46] Command ``SetOption146 1`` to enable display of ESP32 internal temperature --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/include/tasmota_types.h | 2 +- .../xsns_127_esp32_sensors.ino | 96 ++++++++++--------- tools/decode-status.py | 5 +- 5 files changed, 58 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5afd4066a..ae972b3c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Support for Ethernet in ESP32 safeboot firmware (#16388) - Flowrate meter flow amount/duration, show values in table format (#16385) - Zigbee prepare for Green Power support (#16407) +- Command ``SetOption146 1`` to enable display of ESP32 internal temperature ### Changed - TasmotaModbus library from v3.5.0 to v3.6.0 (#16351) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c128647a0..efcc3a1c2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -109,6 +109,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v12.1.1.1 ### Added +- Command ``SetOption146 1`` to enable display of ESP32 internal temperature - Command ``StatusRetain`` [#11109](https://github.com/arendst/Tasmota/issues/11109) - Support for SGP40 gas and air quality sensor [#16341](https://github.com/arendst/Tasmota/issues/16341) - Support for Modbus writing using ModbusBridge by JeroenSt [#16351](https://github.com/arendst/Tasmota/issues/16351) diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index b6eaad2cc..16a29c6ae 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -179,7 +179,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption146 .. SetOption177 - uint32_t spare00 : 1; // bit 0 + uint32_t use_esp32_temperature : 1; // bit 0 (v12.1.1.1) - SetOption146 - (ESP32) Show ESP32 internal temperature sensor uint32_t spare01 : 1; // bit 1 uint32_t spare02 : 1; // bit 2 uint32_t spare03 : 1; // bit 3 diff --git a/tasmota/tasmota_xsns_sensor/xsns_127_esp32_sensors.ino b/tasmota/tasmota_xsns_sensor/xsns_127_esp32_sensors.ino index 93c9b24eb..6da0baaca 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_127_esp32_sensors.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_127_esp32_sensors.ino @@ -54,63 +54,71 @@ void Esp32SensorInit(void) { #endif // CONFIG_IDF_TARGET_ESP32 void Esp32SensorShow(bool json) { - static bool add_global_temp = false; + bool json_end = false; - if (json) { - add_global_temp = !ResponseContains_P(PSTR(D_JSON_TEMPERATURE)); + if (Settings->flag6.use_esp32_temperature) { // SetOption146 - (ESP32) Show ESP32 internal temperature sensor + float c = CpuTemperature(); // in Celsius + float t = ConvertTempToFahrenheit(c); + + if (json) { + if (!ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { + UpdateGlobalTemperature(c); + } + ResponseAppend_P(PSTR(",\"ESP32\":{\"" D_JSON_TEMPERATURE "\":%*_f"), Settings->flag2.temperature_resolution, &t); + json_end = true; + +#ifdef USE_DOMOTICZ +// Instead of below code use a rule like 'on tele-esp32#temperature do dzsend1 9988,%value% endon' +// where 9988 is the domoticz sensor Idx +// if (0 == TasmotaGlobal.tele_period) { +// if (!ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { // Only send if no other sensor already did +// DomoticzFloatSensor(DZ_TEMP, t); +// } +// } +#endif // USE_DOMOTICZ + +#ifdef USE_WEBSERVER + } else { + WSContentSend_Temp("ESP32", t); +#endif // USE_WEBSERVER + } } - float c = CpuTemperature(); // in Celsius - if (add_global_temp) { - UpdateGlobalTemperature(c); - } - float t = ConvertTempToFahrenheit(c); #if CONFIG_IDF_TARGET_ESP32 - int value = 0; if (HEData.present) { + int value = 0; for (uint32_t i = 0; i < HALLEFFECT_SAMPLE_COUNT; i++) { value += hallRead(); } value /= HALLEFFECT_SAMPLE_COUNT; + + if (json) { + if (!json_end) { + ResponseAppend_P(PSTR(",\"ESP32\":{")); + } else { + ResponseAppend_P(PSTR(",")); + } + ResponseAppend_P(PSTR("\"" D_JSON_HALLEFFECT "\":%d"), value); + json_end = true; + +#ifdef USE_DOMOTICZ +// Instead of below code use a rule like 'on tele-esp32#halleffect do dzsend1 9988,%value% endon' +// where 9988 is the domoticz sensor Idx +// if (0 == TasmotaGlobal.tele_period) { +// DomoticzSensor(DZ_COUNT, value); +// } +#endif // USE_DOMOTICZ + +#ifdef USE_WEBSERVER + } else { + WSContentSend_P(HTTP_SNS_HALL_EFFECT, "ESP32", value); +#endif // USE_WEBSERVER + } } #endif // CONFIG_IDF_TARGET_ESP32 - if (json) { - bool temperature_present = (ResponseContains_P(PSTR(D_JSON_TEMPERATURE))); - ResponseAppend_P(PSTR(",\"ESP32\":{\"" D_JSON_TEMPERATURE "\":%*_f"), Settings->flag2.temperature_resolution, &t); - -#if CONFIG_IDF_TARGET_ESP32 - if (HEData.present) { - ResponseAppend_P(PSTR(",\"" D_JSON_HALLEFFECT "\":%d"), value); - } -#endif // CONFIG_IDF_TARGET_ESP32 - + if (json_end) { ResponseJsonEnd(); -#ifdef USE_DOMOTICZ - if (0 == TasmotaGlobal.tele_period) { - if (!temperature_present) { // Only send if no other sensor already did - DomoticzFloatSensor(DZ_TEMP, t); - } - -#if CONFIG_IDF_TARGET_ESP32 - if (HEData.present) { - DomoticzSensor(DZ_COUNT, value); - } -#endif // CONFIG_IDF_TARGET_ESP32 - - } -#endif // USE_DOMOTICZ -#ifdef USE_WEBSERVER - } else { - WSContentSend_Temp("ESP32", t); - -#if CONFIG_IDF_TARGET_ESP32 - if (HEData.present) { - WSContentSend_P(HTTP_SNS_HALL_EFFECT, "ESP32", value); - } -#endif // CONFIG_IDF_TARGET_ESP32 - -#endif // USE_WEBSERVER } } diff --git a/tools/decode-status.py b/tools/decode-status.py index 8923981d3..92de04297 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -201,7 +201,8 @@ a_setoption = [[ "(Zigbee) Include time in `ZbReceived` messages like other sensors", "(MQTT) Retain on Status" ],[ - "","","","", + "(ESP32) Show ESP32 internal temperature sensor", + "","","", "","","","", "","","","", "","","","", @@ -319,7 +320,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v12.1.0.1 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v12.1.1.1 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From 86e45969bde16bf221f012e1209b57db62ba2c2b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 2 Sep 2022 13:13:47 +0200 Subject: [PATCH 23/46] Support for DFRobot SEN0390 V30B ambient light sensor Add support for DFRobot SEN0390 V30B ambient light sensor (#16105) --- BUILDS.md | 329 +++++++++--------- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/include/tasmota_configurations.h | 1 + .../include/tasmota_configurations_ESP32.h | 2 + tasmota/my_user_config.h | 1 + tasmota/tasmota_support/support_features.ino | 4 +- .../tasmota_xsns_sensor/xsns_99_luxv30b.ino | 212 +++++++++++ tools/decode-status.py | 2 +- 9 files changed, 387 insertions(+), 166 deletions(-) create mode 100644 tasmota/tasmota_xsns_sensor/xsns_99_luxv30b.ino diff --git a/BUILDS.md b/BUILDS.md index 0850b2a2f..579d82d83 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -6,176 +6,177 @@ l = lite, t = tasmota, k = knx, s = sensors, i = ir, d = display Note: `minimal` variant is not listed as it shouldn't be used outside of the [upgrading](https://tasmota.github.io/docs/Upgrading/) process. -| Feature or Sensor | l | t | k | s | i | d | Remarks -|-----------------------|---|-------|---|---|---|---|-------- -| MY_LANGUAGE en_GB | x | x / x | x | x | x | x | -| USE_IMPROV | x | x / x | x | x | x | x | -| USE_UFILESYS | - | - / x | - | - | - | - | -| USE_ARDUINO_OTA | - | - / - | - | - | - | - | -| USE_DOMOTICZ | - | x / x | x | x | x | - | -| USE_HOME_ASSISTANT | - | - / - | - | - | - | - | -| USE_TASMOTA_DISCOVERY | x | x / x | x | x | x | x | -| USE_MQTT_TLS* | - | - / x | - | - | - | - | -| USE_MQTT_AWS_IOT | - | - / - | - | - | - | - | -| USE_4K_RSA | - | - / - | - | - | - | - | -| USE_TELEGRAM | - | - / - | - | - | - | - | -| USE_KNX | - | - / x | x | - | - | - | -| USE_WEBSERVER | x | x / x | x | x | x | x | -| USE_WEBSEND_RESPONSE | - | - / - | - | - | - | - | -| USE_EMULATION_HUE | x | x / x | - | x | - | - | -| USE_EMULATION_WEMO | x | x / x | - | x | - | - | -| USE_DISCOVERY | - | - / - | - | - | - | - | -| WEBSERVER_ADVERTISE | - | x / - | x | - | - | x | -| MQTT_HOST_DISCOVERY | - | - / - | - | - | - | - | -| USE_TIMERS | x | x / x | x | x | x | x | -| USE_TIMERS_WEB | x | x / x | x | x | x | x | -| USE_SUNRISE | x | x / x | x | x | x | x | -| USE_RULES | x | x / x | x | x | x | x | -| USE_SCRIPT | - | - / - | - | - | - | - | -| USE_EXPRESSION | - | - / - | - | - | - | - | -| SUPPORT_IF_STATEMENT | - | - / - | - | - | - | - | -| USE_HOTPLUG | - | - / - | - | - | - | - | -| USE_PROMETHEUS | - | - / - | - | - | - | - | -| USE_PING | - | - / - | - | - | - | - | -| | | | | | | | -| Feature or Sensor | l | t | k | s | i | d | Remarks -| ROTARY_V1 | - | x / x | - | x | - | - | -| USE_SONOFF_RF | - | x / - | x | x | - | - | -| USE_RF_FLASH | - | x / - | x | x | - | - | -| USE_SONOFF_SC | - | x / - | x | x | - | - | -| USE_TUYA_MCU | x | x / - | x | x | - | x | -| USE_ARMTRONIX_DIMMERS | - | x / - | x | - | - | - | -| USE_PS_16_DZ | - | x / - | x | - | - | - | -| USE_SONOFF_IFAN | - | x / - | x | - | - | - | -| USE_BUZZER | - | x / x | x | x | - | - | -| USE_ARILUX_RF | - | x / - | x | - | - | - | -| USE_SHUTTER | - | x / x | x | - | - | - | -| USE_DEEPSLEEP | - | x / x | - | x | - | - | -| USE_EXS_DIMMER | - | x / - | x | - | - | - | -| USE_DEVICE_GROUPS | - | x / x | - | - | - | - | -| USE_PWM_DIMMER | - | x / - | x | - | - | - | -| USE_KEELOQ | - | - / - | - | - | - | - | -| USE_SONOFF_D1 | - | x / - | x | - | - | - | -| USE_SHELLY_DIMMER | - | x / - | - | - | - | - | -| USE_AC_ZERO_CROSS_DIMMER | - | x / x | x | x | x | x | -| | | | | | | | -| Feature or Sensor | l | t | k | s | i | d | Remarks -| USE_LIGHT | x | x / x | x | x | x | x | -| USE_WS2812 | - | x / x | x | x | - | x | -| USE_WS2812_DMA | - | - / - | - | - | - | - | -| USE_MY92X1 | - | x / - | x | x | - | x | -| USE_SM16716 | - | x / - | x | x | - | x | -| USE_SM2135 | - | x / - | x | x | - | x | -| USE_SM2335 | - | x / - | x | x | - | x | -| USE_BP5758D | - | x / - | x | x | - | x | -| USE_SONOFF_L1 | - | x / - | x | x | - | x | -| USE_ELECTRIQ_MOODL | - | x / - | x | x | - | x | -| | | | | | | | -| USE_ENERGY_SENSOR | x | x / x | x | x | - | - | -| USE_ENERGY_DUMMY | x | x / x | x | x | - | - | -| USE_PZEM004T | - | x / x | x | x | - | - | -| USE_PZEM_AC | - | x / x | x | x | - | - | -| USE_PZEM_DC | - | x / x | x | x | - | - | -| USE_MCP39F501 | x | x / - | x | x | - | - | -| USE_SDM72 | - | - / x | - | x | - | - | -| USE_SDM120 | - | - / x | - | x | - | - | -| USE_SDM230 | - | - / x | - | - | - | - | -| USE_SDM630 | - | - / x | - | x | - | - | -| USE_DDS2382 | - | - / x | - | x | - | - | -| USE_DDSU666 | - | - / x | - | x | - | - | -| USE_SOLAX_X1 | - | - / - | - | - | - | - | -| USE_LE01MR | - | - / - | - | - | - | - | -| USE_BL09XX | x | x / x | x | x | - | - | -| USE_TELEINFO | - | - / - | - | - | - | - | -| USE_IEM3000 | - | - / - | - | - | - | - | -| USE_WE517 | - | - / - | - | - | - | - | -| | | | | | | | -| USE_ADC_VCC | x | - / - | - | - | x | - | -| USE_COUNTER | - | x / x | x | x | - | x | -| USE_DS18x20 | - | x / x | x | x | - | x | -| USE_DHT | - | x / x | x | x | - | x | -| USE_MAX31855 | - | - / x | - | x | - | - | -| USE_MAX31865 | - | - / - | - | - | - | - | -| USE_THERMOSTAT | - | - / - | - | - | - | - | -| USE_LMT01 | - | - / x | - | x | - | - | -| | | | | | | | -| Feature or Sensor | l | t | k | s | i | d | Remarks -| USE_I2C | - | x / x | x | x | - | x | -| USE_SHT | - | - / x | - | x | - | - | -| USE_HTU | - | - / x | - | x | - | - | -| USE_BMP | - | - / x | - | x | - | - | -| USE_BME68X | - | - / x | - | x | - | - | -| USE_BH1750 | - | - / x | - | x | - | - | -| USE_VEML6070 | - | - / x | - | x | - | - | -| USE_ADS1115 | - | - / x | - | x | - | - | -| USE_INA219 | - | - / x | - | x | - | - | -| USE_INA226 | - | - / - | - | - | - | - | -| USE_SHT3X | - | - / x | - | x | - | - | -| USE_TSL2561 | - | - / - | - | - | - | - | -| USE_TSL2591 | - | - / - | - | - | - | - | -| USE_MGS | - | - / x | - | x | - | - | -| USE_SGP30 | - | - / x | - | x | - | - | -| USE_SGP40 | - | - / x | - | x | - | - | -| USE_SI1145 | - | - / - | - | - | - | - | -| USE_LM75AD | - | - / x | - | x | - | - | -| USE_APDS9960 | - | - / - | - | - | - | - | -| USE_MCP230xx | - | - / - | - | - | - | - | -| USE_PCA9685 | - | - / - | - | - | - | - | -| USE_MPR121 | - | - / - | - | - | - | - | -| USE_CCS811 | - | - / - | - | x | - | - | -| USE_CCS811_V2 | - | - / x | - | - | - | - | -| USE_MPU6050 | - | - / - | - | - | - | - | -| USE_DS3231 | - | - / - | - | - | - | - | -| USE_MGC3130 | - | - / - | - | - | - | - | -| USE_MAX44009 | - | - / - | - | - | - | - | -| USE_SCD30 | - | - / x | - | x | - | - | -| USE_SCD40 | - | - / x | - | - | - | - | -| USE_SPS30 | - | - / - | - | - | - | - | -| USE_ADE7880 | - | - / - | - | - | - | - | -| USE_ADE7953 | - | x / x | x | x | - | x | -| USE_VL53L0X | - | - / x | - | x | - | - | -| USE_VL53L1X | - | - / - | - | - | - | - | -| USE_MLX90614 | - | - / - | - | - | - | - | -| USE_CHIRP | - | - / - | - | - | - | - | -| USE_PAJ7620 | - | - / - | - | - | - | - | -| USE_PCF8574 | - | - / - | - | - | - | - | -| | | | | | | | -| Feature or Sensor | l | t | k | s | i | d | Remarks -| USE_HIH6 | - | - / x | - | x | - | - | -| USE_DHT12 | - | - / x | - | x | - | - | -| USE_DS1624 | - | - / x | - | x | - | - | -| USE_AHT1x | - | - / - | - | - | - | - | -| USE_HDC1080 | - | - / - | - | - | - | - | -| USE_WEMOS_MOTOR_V1 | - | - / x | - | x | - | - | -| USE_IAQ | - | - / x | - | x | - | - | -| USE_AS3935 | - | - / x | - | x | - | - | -| USE_VEML6075 | - | - / - | - | - | - | - | -| USE_VEML7700 | - | - / - | - | - | - | - | -| USE_MCP9808 | - | - / - | - | - | - | - | -| USE_MLX90640 | - | - / - | - | - | - | - | -| USE_HP303B | - | - / - | - | - | - | - | -| USE_EZOCO2 | - | - / - | - | - | - | - | -| USE_EZODO | - | - / - | - | - | - | - | -| USE_EZOEC | - | - / - | - | - | - | - | -| USE_EZOFLO | - | - / - | - | - | - | - | -| USE_EZOHUM | - | - / - | - | - | - | - | -| USE_EZOO2 | - | - / - | - | - | - | - | -| USE_EZOORP | - | - / - | - | - | - | - | -| USE_EZOPH | - | - / - | - | - | - | - | -| USE_EZOPMP | - | - / - | - | - | - | - | -| USE_EZOPRS | - | - / - | - | - | - | - | -| USE_EZORGB | - | - / - | - | - | - | - | -| USE_EZORTD | - | - / - | - | - | - | - | -| USE_SEESAW_SOIL | - | - / - | - | - | - | - | -| USE_TOF10120 | - | - / - | - | - | - | - | -| USE_BM8563 | - | - / - | - | - | - | - | -| USE_AM2320 | - | - / - | - | - | - | - | +| Feature or Sensor | l | t | k | s | i | d | Remarks +|---------------------------|---|-------|---|---|---|---|-------- +| MY_LANGUAGE en_GB | x | x / x | x | x | x | x | +| USE_IMPROV | x | x / x | x | x | x | x | +| USE_UFILESYS | - | - / x | - | - | - | - | +| USE_ARDUINO_OTA | - | - / - | - | - | - | - | +| USE_DOMOTICZ | - | x / x | x | x | x | - | +| USE_HOME_ASSISTANT | - | - / - | - | - | - | - | +| USE_TASMOTA_DISCOVERY | x | x / x | x | x | x | x | +| USE_MQTT_TLS* | - | - / x | - | - | - | - | +| USE_MQTT_AWS_IOT | - | - / - | - | - | - | - | +| USE_4K_RSA | - | - / - | - | - | - | - | +| USE_TELEGRAM | - | - / - | - | - | - | - | +| USE_KNX | - | - / x | x | - | - | - | +| USE_WEBSERVER | x | x / x | x | x | x | x | +| USE_WEBSEND_RESPONSE | - | - / - | - | - | - | - | +| USE_EMULATION_HUE | x | x / x | - | x | - | - | +| USE_EMULATION_WEMO | x | x / x | - | x | - | - | +| USE_DISCOVERY | - | - / - | - | - | - | - | +| WEBSERVER_ADVERTISE | - | x / - | x | - | - | x | +| MQTT_HOST_DISCOVERY | - | - / - | - | - | - | - | +| USE_TIMERS | x | x / x | x | x | x | x | +| USE_TIMERS_WEB | x | x / x | x | x | x | x | +| USE_SUNRISE | x | x / x | x | x | x | x | +| USE_RULES | x | x / x | x | x | x | x | +| USE_SCRIPT | - | - / - | - | - | - | - | +| USE_EXPRESSION | - | - / - | - | - | - | - | +| SUPPORT_IF_STATEMENT | - | - / - | - | - | - | - | +| USE_HOTPLUG | - | - / - | - | - | - | - | +| USE_PROMETHEUS | - | - / - | - | - | - | - | +| USE_PING | - | - / - | - | - | - | - | +| | | | | | | | +| Feature or Sensor | l | t | k | s | i | d | Remarks +| ROTARY_V1 | - | x / x | - | x | - | - | +| USE_SONOFF_RF | - | x / - | x | x | - | - | +| USE_RF_FLASH | - | x / - | x | x | - | - | +| USE_SONOFF_SC | - | x / - | x | x | - | - | +| USE_TUYA_MCU | x | x / - | x | x | - | x | +| USE_ARMTRONIX_DIMMERS | - | x / - | x | - | - | - | +| USE_PS_16_DZ | - | x / - | x | - | - | - | +| USE_SONOFF_IFAN | - | x / - | x | - | - | - | +| USE_BUZZER | - | x / x | x | x | - | - | +| USE_ARILUX_RF | - | x / - | x | - | - | - | +| USE_SHUTTER | - | x / x | x | - | - | - | +| USE_DEEPSLEEP | - | x / x | - | x | - | - | +| USE_EXS_DIMMER | - | x / - | x | - | - | - | +| USE_DEVICE_GROUPS | - | x / x | - | - | - | - | +| USE_PWM_DIMMER | - | x / - | x | - | - | - | +| USE_KEELOQ | - | - / - | - | - | - | - | +| USE_SONOFF_D1 | - | x / - | x | - | - | - | +| USE_SHELLY_DIMMER | - | x / - | - | - | - | - | +| USE_AC_ZERO_CROSS_DIMMER | - | x / x | x | x | x | x | +| | | | | | | | +| Feature or Sensor | l | t | k | s | i | d | Remarks +| USE_LIGHT | x | x / x | x | x | x | x | +| USE_WS2812 | - | x / x | x | x | - | x | +| USE_WS2812_DMA | - | - / - | - | - | - | - | +| USE_MY92X1 | - | x / - | x | x | - | x | +| USE_SM16716 | - | x / - | x | x | - | x | +| USE_SM2135 | - | x / - | x | x | - | x | +| USE_SM2335 | - | x / - | x | x | - | x | +| USE_BP5758D | - | x / - | x | x | - | x | +| USE_SONOFF_L1 | - | x / - | x | x | - | x | +| USE_ELECTRIQ_MOODL | - | x / - | x | x | - | x | +| | | | | | | | +| USE_ENERGY_SENSOR | x | x / x | x | x | - | - | +| USE_ENERGY_DUMMY | x | x / x | x | x | - | - | +| USE_PZEM004T | - | x / x | x | x | - | - | +| USE_PZEM_AC | - | x / x | x | x | - | - | +| USE_PZEM_DC | - | x / x | x | x | - | - | +| USE_MCP39F501 | x | x / - | x | x | - | - | +| USE_SDM72 | - | - / x | - | x | - | - | +| USE_SDM120 | - | - / x | - | x | - | - | +| USE_SDM230 | - | - / x | - | - | - | - | +| USE_SDM630 | - | - / x | - | x | - | - | +| USE_DDS2382 | - | - / x | - | x | - | - | +| USE_DDSU666 | - | - / x | - | x | - | - | +| USE_SOLAX_X1 | - | - / - | - | - | - | - | +| USE_LE01MR | - | - / - | - | - | - | - | +| USE_BL09XX | x | x / x | x | x | - | - | +| USE_TELEINFO | - | - / - | - | - | - | - | +| USE_IEM3000 | - | - / - | - | - | - | - | +| USE_WE517 | - | - / - | - | - | - | - | +| | | | | | | | +| USE_ADC_VCC | x | - / - | - | - | x | - | +| USE_COUNTER | - | x / x | x | x | - | x | +| USE_DS18x20 | - | x / x | x | x | - | x | +| USE_DHT | - | x / x | x | x | - | x | +| USE_MAX31855 | - | - / x | - | x | - | - | +| USE_MAX31865 | - | - / - | - | - | - | - | +| USE_THERMOSTAT | - | - / - | - | - | - | - | +| USE_LMT01 | - | - / x | - | x | - | - | +| | | | | | | | +| Feature or Sensor | l | t | k | s | i | d | Remarks +| USE_I2C | - | x / x | x | x | - | x | +| USE_SHT | - | - / x | - | x | - | - | +| USE_HTU | - | - / x | - | x | - | - | +| USE_BMP | - | - / x | - | x | - | - | +| USE_BME68X | - | - / x | - | x | - | - | +| USE_BH1750 | - | - / x | - | x | - | - | +| USE_VEML6070 | - | - / x | - | x | - | - | +| USE_ADS1115 | - | - / x | - | x | - | - | +| USE_INA219 | - | - / x | - | x | - | - | +| USE_INA226 | - | - / - | - | - | - | - | +| USE_SHT3X | - | - / x | - | x | - | - | +| USE_TSL2561 | - | - / - | - | - | - | - | +| USE_TSL2591 | - | - / - | - | - | - | - | +| USE_MGS | - | - / x | - | x | - | - | +| USE_SGP30 | - | - / x | - | x | - | - | +| USE_SGP40 | - | - / x | - | x | - | - | +| USE_SI1145 | - | - / - | - | - | - | - | +| USE_LM75AD | - | - / x | - | x | - | - | +| USE_APDS9960 | - | - / - | - | - | - | - | +| USE_MCP230xx | - | - / - | - | - | - | - | +| USE_PCA9685 | - | - / - | - | - | - | - | +| USE_MPR121 | - | - / - | - | - | - | - | +| USE_CCS811 | - | - / - | - | x | - | - | +| USE_CCS811_V2 | - | - / x | - | - | - | - | +| USE_MPU6050 | - | - / - | - | - | - | - | +| USE_DS3231 | - | - / - | - | - | - | - | +| USE_MGC3130 | - | - / - | - | - | - | - | +| USE_MAX44009 | - | - / - | - | - | - | - | +| USE_SCD30 | - | - / x | - | x | - | - | +| USE_SCD40 | - | - / x | - | - | - | - | +| USE_SPS30 | - | - / - | - | - | - | - | +| USE_ADE7880 | - | - / - | - | - | - | - | +| USE_ADE7953 | - | x / x | x | x | - | x | +| USE_VL53L0X | - | - / x | - | x | - | - | +| USE_VL53L1X | - | - / - | - | - | - | - | +| USE_MLX90614 | - | - / - | - | - | - | - | +| USE_CHIRP | - | - / - | - | - | - | - | +| USE_PAJ7620 | - | - / - | - | - | - | - | +| USE_PCF8574 | - | - / - | - | - | - | - | +| | | | | | | | +| Feature or Sensor | l | t | k | s | i | d | Remarks +| USE_HIH6 | - | - / x | - | x | - | - | +| USE_DHT12 | - | - / x | - | x | - | - | +| USE_DS1624 | - | - / x | - | x | - | - | +| USE_AHT1x | - | - / - | - | - | - | - | +| USE_HDC1080 | - | - / - | - | - | - | - | +| USE_WEMOS_MOTOR_V1 | - | - / x | - | x | - | - | +| USE_IAQ | - | - / x | - | x | - | - | +| USE_AS3935 | - | - / x | - | x | - | - | +| USE_VEML6075 | - | - / - | - | - | - | - | +| USE_VEML7700 | - | - / - | - | - | - | - | +| USE_MCP9808 | - | - / - | - | - | - | - | +| USE_MLX90640 | - | - / - | - | - | - | - | +| USE_HP303B | - | - / - | - | - | - | - | +| USE_EZOCO2 | - | - / - | - | - | - | - | +| USE_EZODO | - | - / - | - | - | - | - | +| USE_EZOEC | - | - / - | - | - | - | - | +| USE_EZOFLO | - | - / - | - | - | - | - | +| USE_EZOHUM | - | - / - | - | - | - | - | +| USE_EZOO2 | - | - / - | - | - | - | - | +| USE_EZOORP | - | - / - | - | - | - | - | +| USE_EZOPH | - | - / - | - | - | - | - | +| USE_EZOPMP | - | - / - | - | - | - | - | +| USE_EZOPRS | - | - / - | - | - | - | - | +| USE_EZORGB | - | - / - | - | - | - | - | +| USE_EZORTD | - | - / - | - | - | - | - | +| USE_SEESAW_SOIL | - | - / - | - | - | - | - | +| USE_TOF10120 | - | - / - | - | - | - | - | +| USE_BM8563 | - | - / - | - | - | - | - | +| USE_AM2320 | - | - / - | - | - | - | - | | USE_T67XX | - | - / - | - | - | - | - | | USE_HM330X | - | - / - | - | - | - | - | | USE_HDC2010 | - | - / - | - | - | - | - | | USE_PCF85363 | - | - / - | - | - | - | - | | USE_DS3502 | - | - / - | - | - | - | - | | USE_HYT | - | - / - | - | - | - | - | +| USE_LUXV30B | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_SPI | - | - / - | - | - | - | x | diff --git a/CHANGELOG.md b/CHANGELOG.md index ae972b3c4..b18d77223 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Flowrate meter flow amount/duration, show values in table format (#16385) - Zigbee prepare for Green Power support (#16407) - Command ``SetOption146 1`` to enable display of ESP32 internal temperature +- Support for DFRobot SEN0390 V30B ambient light sensor (#16105) ### Changed - TasmotaModbus library from v3.5.0 to v3.6.0 (#16351) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index efcc3a1c2..a578efce2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -113,6 +113,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Command ``StatusRetain`` [#11109](https://github.com/arendst/Tasmota/issues/11109) - Support for SGP40 gas and air quality sensor [#16341](https://github.com/arendst/Tasmota/issues/16341) - Support for Modbus writing using ModbusBridge by JeroenSt [#16351](https://github.com/arendst/Tasmota/issues/16351) +- Support for DFRobot SEN0390 V30B ambient light sensor [#16105](https://github.com/arendst/Tasmota/issues/16105) - Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` [#16252](https://github.com/arendst/Tasmota/issues/16252) - Zigbee prepare for Green Power support [#16407](https://github.com/arendst/Tasmota/issues/16407) - Flowrate meter flow amount/duration, show values in table format [#16385](https://github.com/arendst/Tasmota/issues/16385) diff --git a/tasmota/include/tasmota_configurations.h b/tasmota/include/tasmota_configurations.h index 5da4fddb7..5fbf62f63 100644 --- a/tasmota/include/tasmota_configurations.h +++ b/tasmota/include/tasmota_configurations.h @@ -153,6 +153,7 @@ //#define USE_HDC2010 // [I2cDriver64] Enable HDC2010 temperature/humidity sensor (I2C address 0x40) (+1k5 code) //#define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) //#define USE_HYT // [I2CDriver68] Enable HYTxxx temperature and humidity sensor (I2C address 0x28) (+0k5 code) +//#define USE_LUXV30B // [I2CDriver70] Enable RFRobot SEN0390 LuxV30b ambient light sensor (I2C address 0x4A) (+0k5 code) //#define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 4544f7da6..34db4eff8 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -410,6 +410,7 @@ //#define USE_T67XX // [I2cDriver61] Enable Telaire T67XX CO2 sensor (I2C address 0x15) (+1k3 code) //#define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) //#define USE_HYT // [I2CDriver68] Enable HYTxxx temperature and humidity sensor (I2C address 0x28) (+0k5 code) +//#define USE_LUXV30B // [I2CDriver70] Enable RFRobot SEN0390 LuxV30b ambient light sensor (I2C address 0x4A) (+0k5 code) //#define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) @@ -617,6 +618,7 @@ //#define USE_SEESAW_SOIL // [I2cDriver56] Enable Capacitice Soil Moisture & Temperature Sensor (I2C addresses 0x36 - 0x39) (+1k3 code) //#define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) //#define USE_HYT // [I2CDriver68] Enable HYTxxx temperature and humidity sensor (I2C address 0x28) (+0k5 code) +//#define USE_LUXV30B // [I2CDriver70] Enable RFRobot SEN0390 LuxV30b ambient light sensor (I2C address 0x4A) (+0k5 code) //#define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index e29a81bc7..90fbf28a3 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -681,6 +681,7 @@ // #define USE_HDC2010 // [I2cDriver64] Enable HDC2010 temperature/humidity sensor (I2C address 0x40) (+1k5 code) // #define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) // #define USE_HYT // [I2CDriver68] Enable HYTxxx temperature and humidity sensor (I2C address 0x28) (+0k5 code) +// #define USE_LUXV30B // [I2CDriver70] Enable RFRobot SEN0390 LuxV30b ambient light sensor (I2C address 0x4A) (+0k5 code) // #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) diff --git a/tasmota/tasmota_support/support_features.ino b/tasmota/tasmota_support/support_features.ino index 5341e07f3..73ecc03d7 100644 --- a/tasmota/tasmota_support/support_features.ino +++ b/tasmota/tasmota_support/support_features.ino @@ -828,7 +828,9 @@ void ResponseAppendFeatures(void) #if defined(USE_I2C) && defined(USE_SGP40) feature9 |= 0x00000001; // xsns_98_sgp40.ino #endif -// feature9 |= 0x00000002; +#if defined(USE_I2C) && defined(USE_LUXV30B) + feature9 |= 0x00000002; +#endif // feature9 |= 0x00000004; // feature9 |= 0x00000008; diff --git a/tasmota/tasmota_xsns_sensor/xsns_99_luxv30b.ino b/tasmota/tasmota_xsns_sensor/xsns_99_luxv30b.ino new file mode 100644 index 000000000..b833a5c07 --- /dev/null +++ b/tasmota/tasmota_xsns_sensor/xsns_99_luxv30b.ino @@ -0,0 +1,212 @@ +/* + xsns_99_luxv30b.ino - Driver for DFRobot V30B lux sensor + + Copyright (C) 2022 Marius Bezuidenhout + + 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_I2C +#ifdef USE_LUXV30B +/************************************************************************************************** + * DFRobot SEN0390 V30B ambient light sensor + * + * https://wiki.dfrobot.com/Ambient_Light_Sensor_0_200klx_SKU_SEN0390 + * https://github.com/DFRobot/DFRobot_B_LUX_V30B/ + * + * I2C Address: 0x4A + * ================================================================================================ + * This driver use the I2C mode. Uses address 0x94 and 0x95. Its address cannot be changed. + * + * Supply Voltage: 2.7-6V + * Operating Current: 0.7mA + * Detection Range: 0-200klx + * Accuracy: 0.054lx + * Operating Temperature Range: -40°C~+85°C + * I2C Address: 0x4A + * + * Pin assignments: + * + * ------------------------------------------ + * | Num | Label | Description | + * 1 VCC 2.7-6V + + * 2 SCL I2C Serial Clock Line + * 3 SDA I2C Serial Data + * 4 GND Ground + * 5 EN Sensor Chip-select Enable/Disable port, High to enable, Low to disable sensor + * + * + * You can write the desired configuration to the configuration register(address:0x04), setting + * different acquisition accuracy. + * You can read the light intensity data from the data register(address:0x00~0x03). + * ------------------------------------------------------------------------------------------ + * | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + * ------------------------------------------------------------------------------------------ + * | 0 | MANUAL | 0 | 0 | CDR | TIM | + * ------------------------------------------------------------------------------------------ + * MANUAL :Manual configuration register. + * 0 represents the default automatic mode.In this mode ,CDR and TIM are automatically assigned. + * 1 represents the configuration of manual mode.In this mode,CDR and TIM can be set by the user. + * CDR :Shunt ratio register. + * 0 represents the default of not dividing,all the current of the photodiode into the ADC + * 1 represents the division of 8,as long as 1/8 of the current of the photodiode changes to ADC. + * This mode is used in high brightness situations. + * TIM[2:0]:Acquisition time. + * ------------------------------------------------------------------------------------------------ + * TIM[2:0] | TIME(ms) | Introduction | + * ------------------------------------------------------------------------------------------------ + * 000 | 800 | Preferred mode in low light environment | + * ------------------------------------------------------------------------------------------------ + * 001 | 400 | --- | + * ------------------------------------------------------------------------------------------------ + * 010 | 200 | --- | + * ------------------------------------------------------------------------------------------------ + * 011 | 100 | In the strong light environment, select the mode preferentially | + * ------------------------------------------------------------------------------------------------ + * 100 | 50 | Manual mode only | + * ------------------------------------------------------------------------------------------------ + * 101 | 250 | Manual mode only | + * ------------------------------------------------------------------------------------------------ + * 110 | 12.5 | Manual mode only | + * ------------------------------------------------------------------------------------------------ + * 111 | 6.25 | Manual mode only | + * ------------------------------------------------------------------------------------------------ + * Accuracy that can be set in manual mode: + * ------------------------------------------------------------------------------------------------------------- + * | Light conditions | | TIM & CDR | + * ------------------------------------------------------------------------------------------------------------- + * | Minimum accuracy | Maximum accuracy | Maximum | Acquisition time(ms) | TIM | CDR | + * —------------------------------------------------------------------------------------------------------------ + * 0.054 11.52 2938 800 000 0 + * 0.09 23.04 5875 400 001 0 + * 0.18 46.08 11750 200 010 0 + * 0.36 92.16 23501 100 011 0 + * 0.36 92.16 23501 800 000 1 + * 0.72 184.32 47002 50 100 0 + * 0.72 184.32 47002 400 001 1 + * 1.44 368.64 94003 25 101 0 + * 1.44 368.64 94003 200 010 1 + * 2.88 737.28 200000 12.5 110 0 + * 2.88 737.28 200000 100 011 1 + * 5.76 737.28 200000 6.25 111 0 + * 5.76 737.28 200000 50 100 1 + * 11.52 737.28 200000 25 101 1 + * 23.04 737.28 200000 12.5 110 1 + * 46.08 737.28 200000 6.25 111 1 + * —------------------------------------------------------------------------------------------------------------ + * *************************************************************************************************/ + +#define XSNS_99 99 +#define XI2C_70 70 // See I2CDEVICES.md + +#define LUXV30B_ADDR 0x4A // Two wire library uses 7-bit addresses throughout +#define LUXV30B_DATAREG 0x00 // Address of the data register +#define LUXV30B_CONFREG 0x04 // Address of the configuration register + +class LuxV30b { + public: + LuxV30b(); + void Detect(); + bool Found(); + void Read(); + void Show(uint8_t function); + private: + float Lux(); + bool _found; + uint32_t _lux; +}; + +LuxV30b::LuxV30b() { + _found = false; + _lux = 0; +} + +void LuxV30b::Detect() { + if (!I2cSetDevice(LUXV30B_ADDR)) { return; } + + _found = true; + I2cSetActiveFound(LUXV30B_ADDR, "LUXV30B"); +} + +bool LuxV30b::Found() { + return _found; +} + +void LuxV30b::Read() { + _lux = I2cRead8(LUXV30B_ADDR, 0); + delay(8); + _lux |= I2cRead8(LUXV30B_ADDR, 1) << 8; + delay(8); + _lux |= I2cRead8(LUXV30B_ADDR, 2) << 16; + delay(8); + _lux |= I2cRead8(LUXV30B_ADDR, 3) << 24; +} + +float LuxV30b::Lux() { + return ((float)_lux * 1.4) / 1000; +} + +void LuxV30b::Show(uint8_t function) { +// if (0 < Lux()) { + if (_lux) { + char lux[FLOATSZ]; + dtostrfd(Lux(), 2, lux); + if (FUNC_JSON_APPEND == function) { + ResponseAppend_P(PSTR(",\"LUXV30B\":{\"" D_JSON_ILLUMINANCE "\":%s}"), lux); +#ifdef USE_DOMOTICZ +// Instead of below code use a rule like 'on tele-luxv30b#illuminance do dzsend1 9988,%value% endon' +// where 9988 is the domoticz sensor Idx +// if (0 == TasmotaGlobal.tele_period) { DomoticzSensor(DZ_ILLUMINANCE, lux); } +#endif // USE_DOMOTICZ +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(PSTR("{s}LUXV30B " D_ILLUMINANCE "{m}%s " D_UNIT_LUX "{e}"), lux); +#endif // USE_WEBSERVER + } + } +} + +LuxV30b Luxv30b; + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns99(uint8_t function) { + if (!I2cEnabled(XI2C_70)) { return false; } + + bool result = false; + + if (FUNC_INIT == function) { + Luxv30b.Detect(); + } + else if (Luxv30b.Found()) { + switch (function) { + case FUNC_EVERY_SECOND: + Luxv30b.Read(); + break; + case FUNC_JSON_APPEND: +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: +#endif // USE_WEBSERVER + Luxv30b.Show(function); + break; + } + } + return result; +} + +#endif // USE_LUXV30B +#endif // USE_I2C \ No newline at end of file diff --git a/tools/decode-status.py b/tools/decode-status.py index 92de04297..465bd4712 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -285,7 +285,7 @@ a_features = [[ "USE_PCF85363","USE_DS3502","USE_IMPROV","USE_FLOWRATEMETER", "USE_BP5758D","USE_HYT","USE_SM2335","USE_DISPLAY_TM1621_SONOFF" ],[ - "USE_SGP40","","","", + "USE_SGP40","USE_LUXV30B","","", "","","","", "","","","", "","","","", From 5639b48c1ad02d0065e50cd306f1c86a616507b0 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 2 Sep 2022 13:14:59 +0200 Subject: [PATCH 24/46] Update I2CDEVICES.md --- I2CDEVICES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/I2CDEVICES.md b/I2CDEVICES.md index ef3ec0da8..0841866c9 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -103,4 +103,5 @@ Index | Define | Driver | Device | Address(es) | Description 66 | USE_PCF85363 | xsns_99 | PCF85363 | 0x51 | Real time clock 67 | USE_DS3502 | xdrv_61 | DS3502 | 0x28 - 0x2B | Digital potentiometer 68 | USE_HYT | xsns_97 | HYTxxx | 0x28 | Temperature and Humidity sensor - 69 | USE_SGP40 | xsns_98 | SGP40 | 0x59 | Gas (TVOC) and air quality + 69 | USE_SGP40 | xsns_98 | SGP40 | 0x59 | Gas (TVOC) and air quality + 70 | USE_LUXV30B | xsns_99 | LUXV30B | 0x4A | DFRobot SEN0390 V30B lux sensor From a43eaef01be11431d00d16ee41388d87402e7b20 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 2 Sep 2022 15:26:44 +0200 Subject: [PATCH 25/46] Add influxdb support to zigbee (#16417) --- tasmota/include/tasmota_configurations.h | 2 ++ tasmota/include/tasmota_configurations_ESP32.h | 2 ++ .../tasmota_xdrv_driver/xdrv_23_zigbee_2a_devices_impl.ino | 4 ++++ tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino | 6 +++--- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/tasmota/include/tasmota_configurations.h b/tasmota/include/tasmota_configurations.h index 5fbf62f63..58cb80798 100644 --- a/tasmota/include/tasmota_configurations.h +++ b/tasmota/include/tasmota_configurations.h @@ -500,6 +500,8 @@ #undef FALLBACK_MODULE #define FALLBACK_MODULE SONOFF_ZB_BRIDGE // [Module2] Select default module on fast reboot where USER_MODULE is user template +#define USE_INFLUXDB // Enable influxdb support (+5k code) + #undef SERIAL_LOG_LEVEL #define SERIAL_LOG_LEVEL LOG_LEVEL_NONE // [SerialLog] (LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 34db4eff8..dc827d7e1 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -459,6 +459,8 @@ #undef FALLBACK_MODULE #define FALLBACK_MODULE WEMOS // [Module2] Select default module on fast reboot where USER_MODULE is user template +#define USE_INFLUXDB // Enable influxdb support (+5k code) + #undef USE_DOMOTICZ #undef USE_HOME_ASSISTANT #define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_2a_devices_impl.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_2a_devices_impl.ino index 80156abaa..ab3057106 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_2a_devices_impl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_2a_devices_impl.ino @@ -565,6 +565,10 @@ void Z_Device::jsonPublishAttrList(const char * json_prefix, const Z_attribute_l ResponseAppend_P(PSTR("}")); } +#ifdef USE_INFLUXDB + InfluxDbProcess(1); // Use a copy of ResponseData +#endif + if (Settings->flag4.zigbee_distinct_topics) { char subtopic[TOPSZ]; if (Settings->flag4.zb_topic_fname && friendlyName && strlen(friendlyName)) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino b/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino index 48adb935c..d98011399 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino @@ -373,7 +373,7 @@ void InfluxDbProcessJson(bool use_copy = false) { } void InfluxDbProcess(bool use_copy) { - if (Settings->sbflag1.influxdb_sensor) { + if (Settings->sbflag1.influxdb_sensor) { // IfxSensor InfluxDbProcessJson(use_copy); } } @@ -476,9 +476,9 @@ void CmndInfluxDbState(void) { void CmndInfluxDbSensor(void) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { - Settings->sbflag1.influxdb_sensor = XdrvMailbox.payload; + Settings->sbflag1.influxdb_sensor = XdrvMailbox.payload; // IfxSensor } - ResponseCmndStateText(Settings->sbflag1.influxdb_sensor); + ResponseCmndStateText(Settings->sbflag1.influxdb_sensor); // IfxSensor } void CmndInfluxDbLog(void) { From 2cca11f54bc649c3e115665aa5b6c92fe461ccbc Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 2 Sep 2022 17:12:42 +0200 Subject: [PATCH 26/46] Fix OTA upload when filesystem is added Fix OTA upload when filesystem is added. An OTA upload to OTA server fails without this test as it overrules the user upload script. --- pio-tools/post_esp32.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index ab3440ea7..d4a425ac2 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -168,7 +168,9 @@ def esp32_create_combined_bin(source, target, env): else: print("Upload new safeboot binary only") - if(fs_offset != -1): +# if(fs_offset != -1): + upload_port = env.subst("$UPLOAD_PORT") + if("upload-tasmota.php" not in upload_port) and (fs_offset != -1): fs_bin = join(env.subst("$BUILD_DIR"),"littlefs.bin") if exists(fs_bin): before_reset = env.BoardConfig().get("upload.before_reset", "default_reset") From d3fbc98601659276e8cab5f395816fa4a514bd3c Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 2 Sep 2022 22:27:46 +0200 Subject: [PATCH 27/46] ZIgbee extend ZNP timeout --- tasmota/berry/zigbee/tubezb_cc2652_flasher.be | 176 ++++++++++++++++++ .../xdrv_23_zigbee_7_0_statemachine.ino | 4 +- 2 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 tasmota/berry/zigbee/tubezb_cc2652_flasher.be diff --git a/tasmota/berry/zigbee/tubezb_cc2652_flasher.be b/tasmota/berry/zigbee/tubezb_cc2652_flasher.be new file mode 100644 index 000000000..f96d7b8a6 --- /dev/null +++ b/tasmota/berry/zigbee/tubezb_cc2652_flasher.be @@ -0,0 +1,176 @@ + +################################################################################# +# +# class `sonoff_zb_pro_flasher` +# +################################################################################# + +class tubezb_cc2652_flasher + static CCFG_address = 0x057FD8 + static CCFG_reference = 0xC5FE0FC5 # DIO 15 for BSL + + ################################################################################# + # Flashing from Intel HEX files + ################################################################################# + var filename # filename of hex file + var f # file object + var file_checked # was the file already parsed. It cannot be flashed if not previously parsed and validated + var file_validated # was the file already validated. It cannot be flashed if not previously parsed and validated + var file_hex # intelhex object + var flasher # low-level flasher object (cc2652_flasher instance) + + def init() + self.file_checked = false + self.file_validated = false + end + + def load(filename) + import intelhex + + if type(filename) != 'string' raise "value_error", "invalid file name" end + self.filename = filename + self.file_hex = intelhex(filename) # prepare the parser object + self.file_checked = false + self.file_validated = false + end + + ################################################################################# + # check that the HEX file is valid + # parse it completely once, and verify some values + ################################################################################# + def check() + self.file_hex.parse(/ -> self._check_pre(), + / address, len, data, offset -> self._check_cb(address, len, data, offset), + / -> self._check_post() + ) + end + + ################################################################################# + # Flash the firmware to the device + # + ################################################################################# + def flash() + if !self.file_checked + print("FLH: firmware not checked, use `cc.check()`") + raise "flash_error", "firmware not checked" + end + if !self.file_validated + print("FLH: firmware not validated, use `cc.check()`") + raise "flash_error", "firmware not validated" + end + + import cc2652_flasher # this stops zigbee and configures serial + self.flasher = cc2652_flasher + + try + self.file_hex.parse(/ -> self._flash_pre(), + / address, len, data, offset -> self._flash_cb(address, len, data, offset), + / -> self._flash_post() + ) + except .. as e, m + self.file_checked = false + self.file_validated = false + raise e, m + end + end + + ################################################################################# + # Dump firmware to local file + # + ################################################################################# + def dump_to_file(filename) + import cc2652_flasher # this stops zigbee and configures serial + self.flasher = cc2652_flasher + print("FLH: Dump started (takes 3 minutes during which Tasmota is unresponsive)") + self.flasher.start() + self.flasher.ping() + self.flasher.flash_dump_to_file(filename, 0x000000, 0x58000) + print("FLH: Dump completed") + end + + ################################################################################# + # low-level + ################################################################################# + def _flash_pre() + print("FLH: Flashing started (takes 5 minutes during which Tasmota is unresponsive)") + self.flasher.start() + self.flasher.ping() + # erase flash + self.flasher.flash_erase() + end + + def _flash_post() + print("FLH: Flashing completed: OK") + var flash_crc = self.flasher.cmd_crc32(0x0,0x30000) + print("FLH: Flash crc32 0x000000 - 0x2FFFF = " + str(flash_crc)); + # tasmota.log("FLH: Verification of HEX file OK", 2) + end + + def _flash_cb(addr, sz, data, offset) + var payload = data[offset .. offset + sz - 1] + + # final check + if size(payload) != sz raise "flash_error", "incomplete payload" end + + self.flasher.flash_write(addr, payload) + end + + + # start verification (log only) + def _check_pre() + print("FLH: Starting verification of HEX file") + # tasmota.log("FLH: Starting verification of HEX file", 2) + end + + # don't flash so ignore data + # check CCFG at location 0x57FD8 (4 bytes) + def _check_cb(addr, sz, data, offset) + # import string + + # check than sz is a multiple of 4 + if (sz % 4 != 0) + import string + raise "value_error", string.format("size of payload is not a mutliple of 4: 0x%06X", addr) + end + + # print(string.format("> addr=0x%06X sz=0x%02X data=%s", addr, sz, data[offset..offset+sz-1])) + var CCFG = self.CCFG_address + if addr <= CCFG && addr+sz > CCFG+4 + # we have CCFG in the buffer + var ccfg_bytes = data.get(4 + CCFG - addr, 4) + + if ccfg_bytes != self.CCFG_reference + import string + raise "value_error", string.format("incorrect CCFG, BSL is not set to DIO_8 LOW (0x%08X expected 0x%08X)", ccfg_bytes, self.CCFG_reference) end + self.file_validated = true # if we are here, it means that the file looks correct + end + end + + def _check_post() + print("FLH: Verification of HEX file OK") + # tasmota.log("FLH: Verification of HEX file OK", 2) + self.file_checked = true + end + +end + +return tubezb_cc2652_flasher() + + +#- +# Flash local firmware + +import sonoff_zb_pro_flasher as cc +cc.load("SonoffZBPro_coord_20220219.hex") +cc.check() +cc.flash() + +-# + +#- +# Dump local firmware + +import sonoff_zb_pro_flasher as cc +cc.dump_to_file("SonoffZBPro_dump.bin") + +-# diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino index 34e97ec14..08211a1d0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino @@ -473,7 +473,7 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { ZI_MQTT_STATE(ZIGBEE_STATUS_STARTING, kConfiguredCoord) 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_RECV(10000, 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) @@ -493,7 +493,7 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { 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_RECV(10000, 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 // ====================================================================== From c73d7835546c5e353900f03de4fa494ac3012a82 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 2 Sep 2022 22:36:11 +0200 Subject: [PATCH 28/46] ZIgbee add GP UI indicator --- .../xdrv_23_zigbee_2_devices.ino | 8 ++-- .../xdrv_23_zigbee_A_impl.ino | 42 +++++++++++-------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_2_devices.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_2_devices.ino index 869ee7679..ed8ff9e42 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_2_devices.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_2_devices.ino @@ -734,7 +734,7 @@ public: // other status - device wide data is 8 bytes // START OF DEVICE WIDE DATA uint32_t last_seen; // Last seen time (epoch) - uint32_t batt_last_seen; // Time when we last received battery status (epoch), 0 means unknown, 0xFFFFFFFF means that the device has no battery + uint32_t batt_last_seen; // Time when we last received battery status (epoch), 0 means unknown, 0xFFFFFFFF means that the device has no battery, 0xFFFFFFFE means the device is Green Power, all values above 0xFFFFFFF0 are reserved uint32_t batt_last_probed; // Time when the device was last probed for batteyr values uint8_t lqi; // lqi from last message, 0xFF means unknown uint8_t batt_percent; // battery percentage (0..100), 0xFF means unknwon @@ -783,7 +783,7 @@ public: inline bool validLqi(void) const { return 0xFF != lqi; } inline bool validBatteryPercent(void) const { return 0xFF != batt_percent; } inline bool validLastSeen(void) const { return 0x0 != last_seen; } - inline bool validBattLastSeen(void) const { return (0x0 != batt_last_seen) && (0xFFFFFFFF != batt_last_seen); } + inline bool validBattLastSeen(void) const { return (0x0 != batt_last_seen) && (batt_last_seen < 0xFFFFFFF0); } inline void setReachable(bool _reachable) { reachable = _reachable; } inline bool getReachable(void) const { return reachable; } @@ -806,7 +806,9 @@ public: } } inline void setHasNoBattery(void) { batt_last_seen = 0xFFFFFFFF; } - inline bool hasNoBattery(void) const { return 0xFFFFFFFF == batt_last_seen; } + inline bool hasNoBattery(void) const { return batt_last_seen >= 0xFFFFFFF0; } + inline void setGP(void) { batt_last_seen = 0xFFFFFFFE; } // Green Power + inline bool isGP(void) const { return 0xFFFFFFFE == batt_last_seen; } // Add an endpoint to a device bool addEndpoint(uint8_t endpoint); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino index 96f15cdc2..37b000b00 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_A_impl.ino @@ -1872,6 +1872,10 @@ const char ZB_WEB_U[] PROGMEM = "" "\0" // +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + //=ZB_WEB_GP + "GP" + "\0" + // +++++++++++++++++++++++++++++++++++++++++++++++++++++++ //=ZB_WEB_LAST_SEEN "🕗%02d%c" "\0" @@ -1911,16 +1915,17 @@ enum { ZB_WEB_MAP_REFRESH=1164, ZB_WEB_STATUS_LINE=1230, ZB_WEB_BATTERY=1338, - ZB_WEB_LAST_SEEN=1410, - ZB_WEB_COLOR_RGB=1458, - ZB_WEB_LINE_START=1518, - ZB_WEB_LIGHT_CT=1558, - ZB_WEB_END_STATUS=1613, - ZB_WEB_LINE_END=1630, + ZB_WEB_GP=1410, + ZB_WEB_LAST_SEEN=1466, + ZB_WEB_COLOR_RGB=1514, + ZB_WEB_LINE_START=1574, + ZB_WEB_LIGHT_CT=1614, + ZB_WEB_END_STATUS=1669, + ZB_WEB_LINE_END=1686, }; -// Compressed from 1649 to 1124, -31.8% -const char ZB_WEB[] PROGMEM = "\x00\x68\x3D\x0E\xCA\xB1\xC1\x33\xF0\xF6\xD1\xEE\x3D\x3D\x46\x41\x33\xF0\xE8\x6D" +// Compressed from 1705 to 1156, -32.2% +const char ZB_WEB[] PROGMEM = "\x00\x6B\x3D\x0E\xCA\xB1\xC1\x33\xF0\xF6\xD1\xEE\x3D\x3D\x46\x41\x33\xF0\xE8\x6D" "\xA1\x15\x08\x79\xF6\x51\xDD\x3C\xCC\x6F\xFD\x47\x58\x62\xB4\x21\x0E\xF1\xED\x1F" "\xD1\x28\x51\xE6\x72\x99\x0C\x36\x1E\x0C\x67\x51\xD7\xED\x36\xB3\xCC\xE7\x99\xF4" "\x7D\x1E\xE2\x04\x3C\x40\x2B\x04\x3C\x28\x10\xB0\x93\x99\xA4\x30\xD8\x08\x36\x8E" @@ -1968,15 +1973,16 @@ const char ZB_WEB[] PROGMEM = "\x00\x68\x3D\x0E\xCA\xB1\xC1\x33\xF0\xF6\xD1\xEE\ "\x35\x16\xA3\xEB\xC7\xD8\x21\xE7\x1E\xD3\xEC\xFC\x9C\x2F\x9E\x9A\x08\x52\xCF\x60" "\xEA\x3D\x80\x85\x82\x9E\xC3\xE8\x43\xE8\xFA\x3E\xBC\x08\x9D\x2A\x01\x03\xAC\xEB" "\x1C\x11\xE6\x7D\x08\x30\xD8\x08\x7C\xFA\x1F\x47\x1D\x11\xB0\xFA\x38\xE8\x8D\x87" - "\xD1\xC7\x44\x6C\x3D\x87\xE1\xE8\x76\x69\xF9\x38\x5F\x3D\x28\x40\x43\xC2\xC1\x43" - "\x01\x3F\x47\x91\xB0\xE4\x22\x30\x73\x77\xC7\x83\xE9\xD1\x08\x7D\x07\x38\x5F\x40" - "\x8D\xAA\x9B\x01\x1B\x46\x0C\x23\xCC\xF2\x3E\x8E\x3A\x22\x36\x1F\x47\x1D\x11\x1B" - "\x0F\xA3\x8E\x88\x8D\x80\x83\x9D\x82\x44\xF0\x47\xE1\xF0\x10\xF8\x78\x41\xE0\x5E" - "\x19\x7C\x7C\x3D\x87\x30\xF6\x1F\x87\xE8\xF2\x59\xEF\x9E\x0A\x70\xBE\x08\x5D\x17" - "\x2A\x01\x42\xE0\xC4\x83\x2A\x2B\x47\xD0\x87\xB0\xFC\x3D\x3C\x36\xC2\x08\xFC\x3F" - "\x47\x91\xC5\xF5\xF3\xC1\xDC\x3D\x0E\xC2\x04\x19\x87\xD0\x84\x68\x08\x5D\x18\x29" - "\xC2\xF8\x21\x74\x1D\xCE\xCA\x10\xFC\x3E\xBC\x7B\x59\xEE\x9C\x2F\x82\x3F\x4E\xE8" - "\x10\x79\x39\x9C\x2F\x9B"; + "\xD1\xC7\x44\x6C\x3D\x87\xE1\xE8\x76\x69\xF9\x38\x5F\x04\x1E\x86\xD8\x21\x68\xA4" + "\x3D\xF6\xF9\x10\xCC\x1F\x7F\x3E\xC1\x2B\xA1\xDE\x73\x08\x8C\x1C\xC3\xC1\xF6\x7E" + "\x11\x0F\x10\xC0\x42\xE8\x77\xCE\x17\xCF\x4A\x10\x10\xF4\x30\x50\xCE\x4F\xD1\xE4" + "\x6C\x39\x08\x8C\x1C\xDD\xF1\xE0\xFA\x74\x42\x1F\x41\xCE\x17\xD0\x23\x70\x1A\x6C" + "\x04\x6D\xF8\x30\x8F\x33\xC8\xFA\x38\xE8\x88\xD8\x7D\x1C\x74\x44\x6C\x3E\x8E\x3A" + "\x22\x36\x02\x0E\xE6\x09\x13\xC1\x1F\x8B\x40\x43\xE2\xC1\x07\x81\x78\x65\xF1\xF0" + "\xF6\x1C\xC3\xD8\x7E\x1F\xA3\xC9\x67\xBE\x78\x29\xC2\xF8\x21\x74\x6A\x01\x0B\x86" + "\x92\x0C\xA9\x1F\x42\x1E\xC3\xF0\xF4\xF0\xDB\x08\x23\xF0\xFD\x1E\x47\x17\xD7\xCF" + "\x07\x70\xF4\x3B\x08\x10\x66\x1F\x42\x11\xA0\x22\x70\x4E\x08\x3D\x0A\xF3\xB2\x84" + "\x3F\x0F\xAF\x1E\xD6\x7B\xA7\x0B\xE0\x8F\xD3\xF2\x04\x1E\x5C\x67\x0B\xE6"; // ++++++++++++++++++++^^^^^^^^^^^^^^^^^^^++++++++++++++++++++ // ++++++++++++++++++++ DO NOT EDIT ABOVE ++++++++++++++++++++ @@ -2136,6 +2142,8 @@ void ZigbeeShow(bool json) changeUIntScale(device.batt_percent, 0, 100, 0, 14), (color & 0xFF0000) >> 16, (color & 0x00FF00) >> 8, (color & 0x0000FF) ); + } else if (device.isGP()) { // display GP in green for Green Power + snprintf_P(sbatt, sizeof(sbatt), msg[ZB_WEB_GP]); } uint32_t num_bars = 0; From 34084c6e7521f2f9acc67809770b990007fc70c7 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Sat, 3 Sep 2022 15:32:24 +0200 Subject: [PATCH 29/46] generate berry structures before every build process --- pio-tools/gen-berry-structures.py | 12 ++++++++++++ platformio_tasmota32.ini | 1 + 2 files changed, 13 insertions(+) create mode 100644 pio-tools/gen-berry-structures.py diff --git a/pio-tools/gen-berry-structures.py b/pio-tools/gen-berry-structures.py new file mode 100644 index 000000000..6fd1611e8 --- /dev/null +++ b/pio-tools/gen-berry-structures.py @@ -0,0 +1,12 @@ +Import("env") +import os +import subprocess +from os.path import join + +# generate all precompiled Berry structures from multiple modules +CURRENT_DIR = os.getcwd() +BERRY_GEN_DIR = join(CURRENT_DIR, "lib", "libesp32","berry") +os.chdir(BERRY_GEN_DIR) +cmd = ("python3",join("tools","coc","coc"),"-o","generate","src","default",join("..","berry_tasmota","src"),join("..","berry_mapping","src"),join("..","berry_int64","src"),join("..","..","libesp32_lvgl","lv_binding_berry","src"),join("..","..","libesp32_lvgl","lv_binding_berry","generate"),"-c",join("default","berry_conf.h")) +returncode = subprocess.call(cmd, shell=False) +os.chdir(CURRENT_DIR) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 81bdf580b..cb4b74838 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -35,6 +35,7 @@ build_flags = ${esp_defaults.build_flags} -Wl,--wrap=_Z11analogWritehi ; `analogWrite(unsigned char, int)` use the Tasmota version of analogWrite for deeper integration and phase control -Wl,--wrap=ledcReadFreq ; `uint32_t ledcReadFreq(uint8_t chan)` extra_scripts = pre:pio-tools/add_c_flags.py + pio-tools/gen-berry-structures.py post:pio-tools/post_esp32.py ${esp_defaults.extra_scripts} From 055b5a9726fd297b4c29309e1496cc2ddb870a68 Mon Sep 17 00:00:00 2001 From: blakadder Date: Sat, 3 Sep 2022 17:11:58 +0200 Subject: [PATCH 30/46] add more SSD1306 descriptors --- .../displaydesc/SSD1306_128x32_display.ini | 26 +++++++++++++++++ ...display.ini => SSD1306_128x64_display.ini} | 6 ++-- tasmota/displaydesc/SSD1306_70x42_display.ini | 28 +++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 tasmota/displaydesc/SSD1306_128x32_display.ini rename tasmota/displaydesc/{SD1306_display.ini => SSD1306_128x64_display.ini} (73%) create mode 100644 tasmota/displaydesc/SSD1306_70x42_display.ini diff --git a/tasmota/displaydesc/SSD1306_128x32_display.ini b/tasmota/displaydesc/SSD1306_128x32_display.ini new file mode 100644 index 000000000..13605af8a --- /dev/null +++ b/tasmota/displaydesc/SSD1306_128x32_display.ini @@ -0,0 +1,26 @@ +: SSD1306 0.91 OLED 128x32 +:H,SSD1306_128x32,128,32,1,I2C,3c,*,*,* +:S,0,2,1,0,10,10 +:I +AE +D5,80 +A8,1F +D3,00 +40 +8D,14 +20,00 +A1 +C8 +DA,02 +81,8F +D9,F1 +DB,40 +A4 +A6 +AF +:o,AE +:O,AF +:D,81 +:A,00,10,40,00,00 +:i,A6,A7 +# \ No newline at end of file diff --git a/tasmota/displaydesc/SD1306_display.ini b/tasmota/displaydesc/SSD1306_128x64_display.ini similarity index 73% rename from tasmota/displaydesc/SD1306_display.ini rename to tasmota/displaydesc/SSD1306_128x64_display.ini index 15bafcac1..321bdbeea 100644 --- a/tasmota/displaydesc/SD1306_display.ini +++ b/tasmota/displaydesc/SSD1306_128x64_display.ini @@ -1,9 +1,9 @@ -:H,SD1306,128,64,1,I2C,3c,*,*,* +:H,SSD1306,128,64,1,I2C,3c,*,*,* :S,0,2,1,0,30,20 :I AE D5,80 -A8,3f +A8,3F D3,00 40 8D,14 @@ -12,7 +12,7 @@ A1 C8 DA,12 81,9F -D9F1 +D9,F1 DB,40 A4 A6 diff --git a/tasmota/displaydesc/SSD1306_70x42_display.ini b/tasmota/displaydesc/SSD1306_70x42_display.ini new file mode 100644 index 000000000..f1381d356 --- /dev/null +++ b/tasmota/displaydesc/SSD1306_70x42_display.ini @@ -0,0 +1,28 @@ +: EastRising 0.42 OLED 72x40 +: used on 01space ESP32-C3-0.42 OLED +:H,SSD1306_72X40,72,40,1,I2C,3c,*,*,* +:S,1,2,1,0,10,10 +:I +AE +D5,80 +A8,27 +D3,00 +AD,30 +8D,14 +40 +20,00 +A1 +C8 +DA,12 +D9,22 +DB,20 +2E +A4 +A6 +AF +:o,AE +:O,AF +:D,81 +:i,A6,A7 +:A,00,10,40,00,1C +# \ No newline at end of file From a68d2726c5fabb7ee80fa9f603d84c63c8d304ea Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Sat, 3 Sep 2022 17:22:27 +0200 Subject: [PATCH 31/46] refactor BERRY_GEN_DIR --- pio-tools/gen-berry-structures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pio-tools/gen-berry-structures.py b/pio-tools/gen-berry-structures.py index 6fd1611e8..49bb8e3d0 100644 --- a/pio-tools/gen-berry-structures.py +++ b/pio-tools/gen-berry-structures.py @@ -5,7 +5,7 @@ from os.path import join # generate all precompiled Berry structures from multiple modules CURRENT_DIR = os.getcwd() -BERRY_GEN_DIR = join(CURRENT_DIR, "lib", "libesp32","berry") +BERRY_GEN_DIR = join(env.subst("$PROJECT_DIR"), "lib", "libesp32","berry") os.chdir(BERRY_GEN_DIR) cmd = ("python3",join("tools","coc","coc"),"-o","generate","src","default",join("..","berry_tasmota","src"),join("..","berry_mapping","src"),join("..","berry_int64","src"),join("..","..","libesp32_lvgl","lv_binding_berry","src"),join("..","..","libesp32_lvgl","lv_binding_berry","generate"),"-c",join("default","berry_conf.h")) returncode = subprocess.call(cmd, shell=False) From eea3b0ed109088fc00fea62f6633b0d5ce167360 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 3 Sep 2022 22:04:56 +0200 Subject: [PATCH 32/46] add Pio env --- pio-tools/gen-berry-structures.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pio-tools/gen-berry-structures.py b/pio-tools/gen-berry-structures.py index 49bb8e3d0..b739fe17a 100644 --- a/pio-tools/gen-berry-structures.py +++ b/pio-tools/gen-berry-structures.py @@ -1,4 +1,6 @@ Import("env") +env = DefaultEnvironment() +platform = env.PioPlatform() import os import subprocess from os.path import join From 91ed1ea2c669ee012612b3fd1331390557d6637c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 4 Sep 2022 14:48:58 +0200 Subject: [PATCH 33/46] Add filter for larger deviations Add filter for larger deviations due to I2C misreads --- .../tasmota_xsns_sensor/xsns_99_luxv30b.ino | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_99_luxv30b.ino b/tasmota/tasmota_xsns_sensor/xsns_99_luxv30b.ino index b833a5c07..3c3cd89e9 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_99_luxv30b.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_99_luxv30b.ino @@ -126,6 +126,7 @@ class LuxV30b { float Lux(); bool _found; uint32_t _lux; + uint32_t _lux_last; }; LuxV30b::LuxV30b() { @@ -145,13 +146,18 @@ bool LuxV30b::Found() { } void LuxV30b::Read() { - _lux = I2cRead8(LUXV30B_ADDR, 0); - delay(8); - _lux |= I2cRead8(LUXV30B_ADDR, 1) << 8; - delay(8); - _lux |= I2cRead8(LUXV30B_ADDR, 2) << 16; - delay(8); - _lux |= I2cRead8(LUXV30B_ADDR, 3) << 24; + uint32_t lux = I2cRead8(LUXV30B_ADDR, 0); +// delay(8); + lux |= I2cRead8(LUXV30B_ADDR, 1) << 8; +// delay(8); + lux |= I2cRead8(LUXV30B_ADDR, 2) << 16; +// delay(8); + lux |= I2cRead8(LUXV30B_ADDR, 3) << 24; + + _lux = (lux > (_lux_last << 4)) ? _lux_last : lux; // Filter large deviations due to misreads + _lux_last = lux; + +// AddLog(LOG_LEVEL_DEBUG, PSTR("SCD: Raw %d/%d"), lux, _lux); } float LuxV30b::Lux() { From e6ded2bffe4e0c8eb579232fb1be19e955868090 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 4 Sep 2022 15:20:21 +0200 Subject: [PATCH 34/46] octal flash needs flashed in mode `dout` (#16436) * octal flash needs flashed in mode `dout` flash modes `qio, qout, dio` can all be flashed in mode `dio` --- pio-tools/post_esp32.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index d4a425ac2..5ec9093ed 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -136,9 +136,11 @@ def esp32_create_combined_bin(source, target, env): flash_freq = str(flash_freq).replace("L", "") flash_freq = str(int(int(flash_freq) / 1000000)) + "m" flash_mode = env.BoardConfig().get("build.flash_mode", "dio") - if flash_mode == "qio": + memory_type = env.BoardConfig().get("build.arduino.memory_type", "qio_qspi") + + if flash_mode == "qio" or flash_mode == "qout": flash_mode = "dio" - elif flash_mode == "qout": + if memory_type == "opi_opi" or memory_type == "opi_qspi": flash_mode = "dout" cmd = [ "--chip", From d6ac106ac2e4b758adaa0955fe55873cea133fc4 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 4 Sep 2022 16:14:32 +0200 Subject: [PATCH 35/46] Refactor SCD30 driver --- tasmota/tasmota_xsns_sensor/xsns_42_scd30.ino | 422 +++++++----------- 1 file changed, 172 insertions(+), 250 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_42_scd30.ino b/tasmota/tasmota_xsns_sensor/xsns_42_scd30.ino index dff0e8445..901a5c1f1 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_42_scd30.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_42_scd30.ino @@ -19,67 +19,56 @@ */ #ifdef USE_I2C #ifdef USE_SCD30 +/*********************************************************************************************\ + * SCD30 NDIR CO2 Temperature and Humidity sensor +\*********************************************************************************************/ -#define XSNS_42 42 -#define XI2C_29 29 // See I2CDEVICES.md +#define XSNS_42 42 +#define XI2C_29 29 // See I2CDEVICES.md //#define SCD30_DEBUG -#define SCD30_ADDRESS 0x61 +#define SCD30_ADDRESS 0x61 -#define SCD30_MAX_MISSED_READS 3 -#define SCD30_STATE_NO_ERROR 0 -#define SCD30_STATE_ERROR_DATA_CRC 1 -#define SCD30_STATE_ERROR_READ_MEAS 2 -#define SCD30_STATE_ERROR_SOFT_RESET 3 -#define SCD30_STATE_ERROR_I2C_RESET 4 -#define SCD30_STATE_ERROR_UNKNOWN 5 +#define SCD30_MAX_MISSED_READS 3 +#define SCD30_STATE_NO_ERROR 0 +#define SCD30_STATE_ERROR_DATA_CRC 1 +#define SCD30_STATE_ERROR_READ_MEAS 2 +#define SCD30_STATE_ERROR_SOFT_RESET 3 +#define SCD30_STATE_ERROR_I2C_RESET 4 +#define SCD30_STATE_ERROR_UNKNOWN 5 + +const char kScd30Commands[] PROGMEM = "Scd30|" // Prefix + "Alt|Auto|Cal|FW|Int|Pres|TOff"; +void (*const kScd30Command[])(void) PROGMEM = { + &CmndScd30Altitude, &CmndScd30AutoMode, &CmndScd30Calibrate, &CmndScd30Firmware, &CmndScd30Interval, &CmndScd30Pressure, &CmndScd30TempOffset }; + +/********************************************************************************************/ -#include "Arduino.h" #include -#define D_CMND_SCD30 "SCD30" - -const char S_JSON_SCD30_COMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_SCD30 "%s\":%d}"; -const char S_JSON_SCD30_COMMAND_NFW_VALUE[] PROGMEM = "{\"" D_CMND_SCD30 "%s\":%d.%d}"; -const char S_JSON_SCD30_COMMAND[] PROGMEM = "{\"" D_CMND_SCD30 "%s\"}"; -const char kSCD30_Commands[] PROGMEM = "Alt|Auto|Cal|FW|Int|Pres|TOff"; - -/*********************************************************************************************\ - * enumerationsines -\*********************************************************************************************/ - -enum SCD30_Commands { // commands useable in console or rules - CMND_SCD30_ALTITUDE, - CMND_SCD30_AUTOMODE, - CMND_SCD30_CALIBRATE, - CMND_SCD30_FW, - CMND_SCD30_INTERVAL, - CMND_SCD30_PRESSURE, - CMND_SCD30_TEMPOFFSET -}; - FrogmoreScd30 scd30; -bool scd30InitOnce = false; -bool scd30Found = false; -bool scd30IsDataValid = false; -int scd30ErrorState = SCD30_STATE_NO_ERROR; -uint16_t scd30Interval_sec; -int scd30Loop_count = 0; -int scd30DataNotAvailable_count = 0; -int scd30GoodMeas_count = 0; -int scd30Reset_count = 0; -int scd30CrcError_count = 0; -int scd30Co2Zero_count = 0; -int scd30i2cReset_count = 0; -uint16_t scd30_CO2 = 0; -uint16_t scd30_CO2EAvg = 0; -float scd30_Humid = 0.0f; -float scd30_Temp = 0.0f; +struct { + float humidity = 0.0f; + float temperature = 0.0f; + int error_state = SCD30_STATE_NO_ERROR; + int loop_count = 0; + int data_not_available_count = 0; + int good_measure_count = 0; + int reset_count = 0; + int error_count = 0; + int co2_zero_count = 0; + int i2c_reset_count = 0; + uint16_t interval; + uint16_t co2 = 0; + uint16_t co2e_avg = 0; + bool init_once; + bool found = false; + bool data_valid = false; +} Scd30; -void Scd30Detect(void) -{ +void Scd30Detect(void) { if (!I2cSetDevice(SCD30_ADDRESS)) { return; } scd30.begin(); @@ -87,57 +76,55 @@ void Scd30Detect(void) uint8_t major = 0; uint8_t minor = 0; if (scd30.getFirmwareVersion(&major, &minor)) { return; } - uint16_t interval_sec; - if (scd30.getMeasurementInterval(&scd30Interval_sec)) { return; } + if (scd30.getMeasurementInterval(&Scd30.interval)) { return; } if (scd30.beginMeasuring()) { return; } I2cSetActiveFound(SCD30_ADDRESS, "SCD30"); - scd30Found = true; + Scd30.found = true; - AddLog(LOG_LEVEL_DEBUG, PSTR("SCD: FW v%d.%d"), major, minor); +// AddLog(LOG_LEVEL_DEBUG, PSTR("SCD: FW v%d.%d"), major, minor); } // gets data from the sensor every 3 seconds or so to give the sensor time to gather new data -void Scd30Update(void) -{ - scd30Loop_count++; - if (scd30Loop_count > (scd30Interval_sec - 1)) { +void Scd30Update(void) { + Scd30.loop_count++; + if (Scd30.loop_count > (Scd30.interval - 1)) { uint32_t error = 0; - switch (scd30ErrorState) { + switch (Scd30.error_state) { case SCD30_STATE_NO_ERROR: { - error = scd30.readMeasurement(&scd30_CO2, &scd30_CO2EAvg, &scd30_Temp, &scd30_Humid); + error = scd30.readMeasurement(&Scd30.co2, &Scd30.co2e_avg, &Scd30.temperature, &Scd30.humidity); switch (error) { case ERROR_SCD30_NO_ERROR: - scd30Loop_count = 0; - scd30IsDataValid = true; - scd30GoodMeas_count++; + Scd30.loop_count = 0; + Scd30.data_valid = true; + Scd30.good_measure_count++; break; case ERROR_SCD30_NO_DATA: - scd30DataNotAvailable_count++; + Scd30.data_not_available_count++; break; case ERROR_SCD30_CRC_ERROR: - scd30ErrorState = SCD30_STATE_ERROR_DATA_CRC; - scd30CrcError_count++; + Scd30.error_state = SCD30_STATE_ERROR_DATA_CRC; + Scd30.error_count++; #ifdef SCD30_DEBUG AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: CRC error, CRC error: %ld, CO2 zero: %ld, good: %ld, no data: %ld, sc30_reset: %ld, i2c_reset: %ld"), - scd30CrcError_count, scd30Co2Zero_count, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, scd30i2cReset_count); + Scd30.error_count, Scd30.co2_zero_count, Scd30.good_measure_count, Scd30.data_not_available_count, Scd30.reset_count, Scd30.i2c_reset_count); #endif break; case ERROR_SCD30_CO2_ZERO: - scd30Co2Zero_count++; + Scd30.co2_zero_count++; #ifdef SCD30_DEBUG AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: CO2 zero, CRC error: %ld, CO2 zero: %ld, good: %ld, no data: %ld, sc30_reset: %ld, i2c_reset: %ld"), - scd30CrcError_count, scd30Co2Zero_count, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, scd30i2cReset_count); + Scd30.error_count, Scd30.co2_zero_count, Scd30.good_measure_count, Scd30.data_not_available_count, Scd30.reset_count, Scd30.i2c_reset_count); #endif break; default: { - scd30ErrorState = SCD30_STATE_ERROR_READ_MEAS; + Scd30.error_state = SCD30_STATE_ERROR_READ_MEAS; #ifdef SCD30_DEBUG - AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: Update: ReadMeasurement error: 0x%lX, counter: %ld"), error, scd30Loop_count); + AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: Update: ReadMeasurement error: 0x%lX, counter: %ld"), error, Scd30.loop_count); #endif return; } @@ -147,24 +134,24 @@ void Scd30Update(void) break; case SCD30_STATE_ERROR_DATA_CRC: { - //scd30IsDataValid = false; + //Scd30.data_valid = false; #ifdef SCD30_DEBUG AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld"), - scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, scd30i2cReset_count); - AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: got CRC error, try again, counter: %ld"), scd30Loop_count); + Scd30.error_state, Scd30.good_measure_count, Scd30.data_not_available_count, Scd30.reset_count, Scd30.i2c_reset_count); + AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: got CRC error, try again, counter: %ld"), Scd30.loop_count); #endif - scd30ErrorState = ERROR_SCD30_NO_ERROR; + Scd30.error_state = ERROR_SCD30_NO_ERROR; } break; case SCD30_STATE_ERROR_READ_MEAS: { - //scd30IsDataValid = false; + //Scd30.data_valid = false; #ifdef SCD30_DEBUG AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld"), - scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, scd30i2cReset_count); - AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: not answering, sending soft reset, counter: %ld"), scd30Loop_count); + Scd30.error_state, Scd30.good_measure_count, Scd30.data_not_available_count, Scd30.reset_count, Scd30.i2c_reset_count); + AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: not answering, sending soft reset, counter: %ld"), Scd30.loop_count); #endif - scd30Reset_count++; + Scd30.reset_count++; error = scd30.softReset(); if (error) { #ifdef SCD30_DEBUG @@ -172,218 +159,154 @@ void Scd30Update(void) #endif error >>= 8; if (error == 4) { - scd30ErrorState = SCD30_STATE_ERROR_SOFT_RESET; + Scd30.error_state = SCD30_STATE_ERROR_SOFT_RESET; } else { - scd30ErrorState = SCD30_STATE_ERROR_UNKNOWN; + Scd30.error_state = SCD30_STATE_ERROR_UNKNOWN; } } else { - scd30ErrorState = ERROR_SCD30_NO_ERROR; + Scd30.error_state = ERROR_SCD30_NO_ERROR; } } break; case SCD30_STATE_ERROR_SOFT_RESET: { - //scd30IsDataValid = false; + //Scd30.data_valid = false; #ifdef SCD30_DEBUG AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld"), - scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, scd30i2cReset_count); + Scd30.error_state, Scd30.good_measure_count, Scd30.data_not_available_count, Scd30.reset_count, Scd30.i2c_reset_count); AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: clearing i2c bus")); #endif - scd30i2cReset_count++; + Scd30.i2c_reset_count++; error = scd30.clearI2CBus(); if (error) { - scd30ErrorState = SCD30_STATE_ERROR_I2C_RESET; + Scd30.error_state = SCD30_STATE_ERROR_I2C_RESET; #ifdef SCD30_DEBUG AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: error clearing i2c bus: 0x%lX"), error); #endif } else { - scd30ErrorState = ERROR_SCD30_NO_ERROR; + Scd30.error_state = ERROR_SCD30_NO_ERROR; } } break; default: { - //scd30IsDataValid = false; + //Scd30.data_valid = false; #ifdef SCD30_DEBUG - AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: unknown error state: 0x%lX"), scd30ErrorState); + AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: unknown error state: 0x%lX"), Scd30.error_state); #endif - scd30ErrorState = SCD30_STATE_ERROR_SOFT_RESET; // try again + Scd30.error_state = SCD30_STATE_ERROR_SOFT_RESET; // try again } } - if (scd30Loop_count > (SCD30_MAX_MISSED_READS * scd30Interval_sec)) { - scd30IsDataValid = false; + if (Scd30.loop_count > (SCD30_MAX_MISSED_READS * Scd30.interval)) { + Scd30.data_valid = false; } } } - -int Scd30GetCommand(int command_code, uint16_t *pvalue) -{ - switch (command_code) - { - case CMND_SCD30_ALTITUDE: - return scd30.getAltitudeCompensation(pvalue); - break; - - case CMND_SCD30_AUTOMODE: - return scd30.getCalibrationType(pvalue); - break; - - case CMND_SCD30_CALIBRATE: - return scd30.getForcedRecalibrationFactor(pvalue); - break; - - case CMND_SCD30_INTERVAL: - return scd30.getMeasurementInterval(pvalue); - break; - - case CMND_SCD30_PRESSURE: - return scd30.getAmbientPressure(pvalue); - break; - - case CMND_SCD30_TEMPOFFSET: - return scd30.getTemperatureOffset(pvalue); - break; - - default: - // else for Unknown command - break; - } - return 0; // Fix GCC 10.1 warning -} - -int Scd30SetCommand(int command_code, uint16_t value) -{ - switch (command_code) - { - case CMND_SCD30_ALTITUDE: - return scd30.setAltitudeCompensation(value); - break; - - case CMND_SCD30_AUTOMODE: - return scd30.setCalibrationType(value); - break; - - case CMND_SCD30_CALIBRATE: - return scd30.setForcedRecalibrationFactor(value); - break; - - case CMND_SCD30_INTERVAL: - { - int error = scd30.setMeasurementInterval(value); - if (!error) - { - scd30Interval_sec = value; - } - - return error; - } - break; - - case CMND_SCD30_PRESSURE: - return scd30.setAmbientPressure(value); - break; - - case CMND_SCD30_TEMPOFFSET: - return scd30.setTemperatureOffset(value); - break; - - default: - // else for Unknown command - break; - } - return 0; // Fix GCC 10.1 warning -} - /*********************************************************************************************\ - * Command Sensor42 + * Command Scd30 \*********************************************************************************************/ -bool Scd30CommandSensor() -{ - char command[CMDSZ]; - bool serviced = true; - uint8_t prefix_len = strlen(D_CMND_SCD30); - - if (!strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_SCD30), prefix_len)) { // prefix - int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic + prefix_len, kSCD30_Commands); - - switch (command_code) { - case CMND_SCD30_ALTITUDE: - case CMND_SCD30_AUTOMODE: - case CMND_SCD30_CALIBRATE: - case CMND_SCD30_INTERVAL: - case CMND_SCD30_PRESSURE: - case CMND_SCD30_TEMPOFFSET: - { - uint16_t value = 0; - if (XdrvMailbox.data_len > 0) - { - value = XdrvMailbox.payload; - Scd30SetCommand(command_code, value); - } - else - { - Scd30GetCommand(command_code, &value); - } - - Response_P(S_JSON_SCD30_COMMAND_NVALUE, command, value); - } - break; - - case CMND_SCD30_FW: - { - uint8_t major = 0; - uint8_t minor = 0; - int error; - error = scd30.getFirmwareVersion(&major, &minor); - if (error) - { -#ifdef SCD30_DEBUG - AddLog(LOG_LEVEL_ERROR, PSTR("SCD30: error getting FW version: 0x%lX"), error); -#endif - serviced = false; - } - else - { - Response_P(S_JSON_SCD30_COMMAND_NFW_VALUE, command, major, minor); - } - } - break; - - default: - // else for Unknown command - serviced = false; - break; - } +void CmndScd30Altitude(void) { + uint16_t value = 0; + if (XdrvMailbox.data_len > 0) { + value = XdrvMailbox.payload; + scd30.setAltitudeCompensation(value); } else { - serviced = false; + scd30.getAltitudeCompensation(&value); } - return serviced; -} + ResponseCmndNumber(value); +}; -void Scd30Show(bool json) -{ - if (scd30IsDataValid) - { - float t = ConvertTemp(scd30_Temp); - float h = ConvertHumidity(scd30_Humid); +void CmndScd30AutoMode(void) { + uint16_t value = 0; + if (XdrvMailbox.data_len > 0) { + value = XdrvMailbox.payload; + scd30.setCalibrationType(value); + } else { + scd30.getCalibrationType(&value); + } + ResponseCmndNumber(value); +}; + +void CmndScd30Calibrate(void) { + uint16_t value = 0; + if (XdrvMailbox.data_len > 0) { + value = XdrvMailbox.payload; + scd30.setForcedRecalibrationFactor(value); + } else { + scd30.getForcedRecalibrationFactor(&value); + } + ResponseCmndNumber(value); +}; + +void CmndScd30Firmware(void) { + uint8_t major = 0; + uint8_t minor = 0; + int error = scd30.getFirmwareVersion(&major, &minor); + if (!error) { + float firmware = major + ((float)minor / 100); + ResponseCmndFloat(firmware, 2); + } +}; + +void CmndScd30Interval(void) { + uint16_t value = 0; + if (XdrvMailbox.data_len > 0) { + value = XdrvMailbox.payload; + int error = scd30.setMeasurementInterval(value); + if (!error) { + Scd30.interval = value; + } + } + scd30.getMeasurementInterval(&value); + ResponseCmndNumber(value); +}; + +void CmndScd30Pressure(void) { + uint16_t value = 0; + if (XdrvMailbox.data_len > 0) { + value = XdrvMailbox.payload; + scd30.setAmbientPressure(value); + } else { + scd30.getAmbientPressure(&value); + } + ResponseCmndNumber(value); +}; + +void CmndScd30TempOffset(void) { + uint16_t value = 0; + if (XdrvMailbox.data_len > 0) { + value = XdrvMailbox.payload; + scd30.setTemperatureOffset(value); + } else { + scd30.getTemperatureOffset(&value); + } + ResponseCmndNumber(value); +}; + +/********************************************************************************************/ + +void Scd30Show(bool json) { + if (Scd30.data_valid) { + float t = ConvertTemp(Scd30.temperature); + float h = ConvertHumidity(Scd30.humidity); if (json) { - ResponseAppend_P(PSTR(",\"SCD30\":{\"" D_JSON_CO2 "\":%d,\"" D_JSON_ECO2 "\":%d,"), scd30_CO2, scd30_CO2EAvg); + ResponseAppend_P(PSTR(",\"SCD30\":{\"" D_JSON_CO2 "\":%d,\"" D_JSON_ECO2 "\":%d,"), Scd30.co2, Scd30.co2e_avg); ResponseAppendTHD(t, h); ResponseJsonEnd(); #ifdef USE_DOMOTICZ if (0 == TasmotaGlobal.tele_period) { - DomoticzSensor(DZ_AIRQUALITY, scd30_CO2); + DomoticzSensor(DZ_AIRQUALITY, Scd30.co2); DomoticzTempHumPressureSensor(t, h); } #endif // USE_DOMOTICZ #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_SNS_CO2EAVG, "SCD30", scd30_CO2EAvg); - WSContentSend_PD(HTTP_SNS_CO2, "SCD30", scd30_CO2); + WSContentSend_PD(HTTP_SNS_CO2EAVG, "SCD30", Scd30.co2e_avg); + WSContentSend_PD(HTTP_SNS_CO2, "SCD30", Scd30.co2); WSContentSend_THD("SCD30", t, h); #endif // USE_WEBSERVER } @@ -394,8 +317,7 @@ void Scd30Show(bool json) * Interface \*********************************************************************************************/ -bool Xsns42(byte function) -{ +bool Xsns42(byte function) { if (!I2cEnabled(XI2C_29)) { return false; } bool result = false; @@ -406,26 +328,26 @@ bool Xsns42(byte function) Scd30Detect(); } */ - if (!scd30InitOnce && (FUNC_EVERY_SECOND == function) && (TasmotaGlobal.uptime > 2)) { - scd30InitOnce = true; + if (!Scd30.init_once && (FUNC_EVERY_SECOND == function) && (TasmotaGlobal.uptime > 2)) { + Scd30.init_once = true; Scd30Detect(); } - else if (scd30Found) { + else if (Scd30.found) { switch (function) { case FUNC_EVERY_SECOND: Scd30Update(); break; case FUNC_COMMAND: - result = Scd30CommandSensor(); + result = DecodeCommand(kScd30Commands, kScd30Command); break; case FUNC_JSON_APPEND: Scd30Show(1); break; - #ifdef USE_WEBSERVER +#ifdef USE_WEBSERVER case FUNC_WEB_SENSOR: Scd30Show(0); break; - #endif // USE_WEBSERVER +#endif // USE_WEBSERVER } } return result; From 580069a613c81978a9f42bcb806a9f7dd85f4dc8 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Mon, 5 Sep 2022 16:21:50 +0200 Subject: [PATCH 36/46] empty generate folder --- lib/libesp32/berry/generate/be_const_strtab.h | 1510 ------------- .../berry/generate/be_const_strtab_def.h | 1952 ----------------- lib/libesp32/berry/generate/be_fixed_ULP.h | 24 - .../be_fixed_be_class_AudioFileSource.h | 17 - .../be_fixed_be_class_AudioFileSourceFS.h | 18 - .../be_fixed_be_class_AudioGenerator.h | 17 - .../be_fixed_be_class_AudioGeneratorMP3.h | 22 - .../be_fixed_be_class_AudioGeneratorWAV.h | 22 - .../be_fixed_be_class_AudioOpusDecoder.h | 20 - .../generate/be_fixed_be_class_AudioOutput.h | 28 - .../be_fixed_be_class_AudioOutputI2S.h | 22 - .../berry/generate/be_fixed_be_class_BLE.h | 24 - .../berry/generate/be_fixed_be_class_MI32.h | 22 - .../generate/be_fixed_be_class_OneWire.h | 28 - .../berry/generate/be_fixed_be_class_Wire.h | 31 - .../generate/be_fixed_be_class_aes_gcm.h | 22 - .../berry/generate/be_fixed_be_class_bytes.h | 50 - .../generate/be_fixed_be_class_ccronexpr.h | 21 - .../generate/be_fixed_be_class_ctypes_bytes.h | 22 - .../be_fixed_be_class_ctypes_bytes_dyn.h | 18 - .../generate/be_fixed_be_class_ec_c25519.h | 18 - .../berry/generate/be_fixed_be_class_int64.h | 36 - .../generate/be_fixed_be_class_light_state.h | 40 - .../berry/generate/be_fixed_be_class_list.h | 38 - .../generate/be_fixed_be_class_lv_anim.h | 20 - .../berry/generate/be_fixed_be_class_lv_arc.h | 18 - .../berry/generate/be_fixed_be_class_lv_bar.h | 18 - .../berry/generate/be_fixed_be_class_lv_btn.h | 18 - .../generate/be_fixed_be_class_lv_btnmatrix.h | 18 - .../generate/be_fixed_be_class_lv_canvas.h | 18 - .../generate/be_fixed_be_class_lv_chart.h | 18 - .../generate/be_fixed_be_class_lv_checkbox.h | 18 - .../generate/be_fixed_be_class_lv_color.h | 20 - .../be_fixed_be_class_lv_colorwheel.h | 18 - .../generate/be_fixed_be_class_lv_disp.h | 20 - .../generate/be_fixed_be_class_lv_dropdown.h | 18 - .../generate/be_fixed_be_class_lv_font.h | 19 - .../generate/be_fixed_be_class_lv_group.h | 20 - .../berry/generate/be_fixed_be_class_lv_img.h | 18 - .../generate/be_fixed_be_class_lv_imgbtn.h | 18 - .../generate/be_fixed_be_class_lv_indev.h | 20 - .../generate/be_fixed_be_class_lv_label.h | 18 - .../berry/generate/be_fixed_be_class_lv_led.h | 18 - .../generate/be_fixed_be_class_lv_line.h | 18 - .../generate/be_fixed_be_class_lv_meter.h | 18 - .../generate/be_fixed_be_class_lv_msgbox.h | 18 - .../berry/generate/be_fixed_be_class_lv_obj.h | 21 - .../generate/be_fixed_be_class_lv_qrcode.h | 18 - .../generate/be_fixed_be_class_lv_roller.h | 18 - .../generate/be_fixed_be_class_lv_slider.h | 18 - .../generate/be_fixed_be_class_lv_spinbox.h | 18 - .../generate/be_fixed_be_class_lv_spinner.h | 20 - .../generate/be_fixed_be_class_lv_style.h | 20 - .../generate/be_fixed_be_class_lv_switch.h | 18 - .../generate/be_fixed_be_class_lv_table.h | 18 - .../generate/be_fixed_be_class_lv_textarea.h | 18 - .../generate/be_fixed_be_class_lv_theme.h | 19 - .../generate/be_fixed_be_class_lv_timer.h | 20 - .../berry/generate/be_fixed_be_class_map.h | 29 - .../berry/generate/be_fixed_be_class_md5.h | 20 - .../berry/generate/be_fixed_be_class_range.h | 24 - .../berry/generate/be_fixed_be_class_serial.h | 47 - .../generate/be_fixed_be_class_tasmota.h | 104 - .../be_fixed_be_class_tasmota_log_reader.h | 19 - .../generate/be_fixed_be_class_tcpclient.h | 26 - .../generate/be_fixed_be_class_tcpserver.h | 22 - .../berry/generate/be_fixed_be_class_udp.h | 26 - .../generate/be_fixed_be_class_webclient.h | 33 - .../generate/be_fixed_be_class_zb_coord_ntv.h | 29 - .../generate/be_fixed_be_class_zb_device.h | 20 - ...be_fixed_be_class_zcl_attribute_list_ntv.h | 24 - .../be_fixed_be_class_zcl_attribute_ntv.h | 23 - .../be_fixed_be_class_zcl_frame_ntv.h | 19 - lib/libesp32/berry/generate/be_fixed_cb.h | 21 - lib/libesp32/berry/generate/be_fixed_crc.h | 20 - lib/libesp32/berry/generate/be_fixed_crypto.h | 18 - lib/libesp32/berry/generate/be_fixed_debug.h | 22 - .../berry/generate/be_fixed_display.h | 21 - lib/libesp32/berry/generate/be_fixed_flash.h | 22 - lib/libesp32/berry/generate/be_fixed_gc.h | 18 - lib/libesp32/berry/generate/be_fixed_global.h | 20 - lib/libesp32/berry/generate/be_fixed_gpio.h | 24 - .../berry/generate/be_fixed_hue_ntv.h | 18 - .../berry/generate/be_fixed_introspect.h | 23 - lib/libesp32/berry/generate/be_fixed_json.h | 18 - lib/libesp32/berry/generate/be_fixed_light.h | 21 - lib/libesp32/berry/generate/be_fixed_lv.h | 18 - .../berry/generate/be_fixed_lv_tasmota.h | 29 - .../berry/generate/be_fixed_m_builtin.h | 66 - lib/libesp32/berry/generate/be_fixed_math.h | 43 - lib/libesp32/berry/generate/be_fixed_mqtt.h | 22 - lib/libesp32/berry/generate/be_fixed_os.h | 2 - lib/libesp32/berry/generate/be_fixed_path.h | 2 - .../berry/generate/be_fixed_solidify.h | 17 - lib/libesp32/berry/generate/be_fixed_strict.h | 17 - lib/libesp32/berry/generate/be_fixed_string.h | 28 - lib/libesp32/berry/generate/be_fixed_sys.h | 17 - .../berry/generate/be_fixed_tasmota_path.h | 21 - lib/libesp32/berry/generate/be_fixed_time.h | 2 - .../berry/generate/be_fixed_undefined.h | 17 - .../berry/generate/be_fixed_unishox.h | 18 - .../berry/generate/be_fixed_webserver.h | 32 - lib/libesp32/berry/generate/be_fixed_zigbee.h | 17 - 103 files changed, 5754 deletions(-) delete mode 100644 lib/libesp32/berry/generate/be_const_strtab.h delete mode 100644 lib/libesp32/berry/generate/be_const_strtab_def.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_ULP.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_AudioFileSource.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_AudioFileSourceFS.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_AudioGenerator.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_AudioGeneratorMP3.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_AudioGeneratorWAV.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_AudioOpusDecoder.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_AudioOutput.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_AudioOutputI2S.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_BLE.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_MI32.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_OneWire.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_Wire.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_aes_gcm.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_bytes.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_ccronexpr.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_ctypes_bytes.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_ctypes_bytes_dyn.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_ec_c25519.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_int64.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_light_state.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_list.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_anim.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_arc.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_bar.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_btn.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_btnmatrix.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_canvas.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_chart.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_checkbox.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_color.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_colorwheel.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_disp.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_dropdown.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_font.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_group.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_img.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_imgbtn.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_indev.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_label.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_led.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_line.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_meter.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_msgbox.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_obj.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_qrcode.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_roller.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_slider.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_spinbox.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_spinner.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_style.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_switch.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_table.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_textarea.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_theme.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_lv_timer.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_map.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_md5.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_range.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_serial.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_tasmota.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_tasmota_log_reader.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_tcpclient.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_tcpserver.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_udp.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_webclient.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_zb_coord_ntv.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_zb_device.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_zcl_attribute_list_ntv.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_zcl_attribute_ntv.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_zcl_frame_ntv.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_cb.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_crc.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_crypto.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_debug.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_display.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_flash.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_gc.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_global.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_gpio.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_hue_ntv.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_introspect.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_json.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_light.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_lv.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_lv_tasmota.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_m_builtin.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_math.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_mqtt.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_os.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_path.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_solidify.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_strict.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_string.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_sys.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_tasmota_path.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_time.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_undefined.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_unishox.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_webserver.h delete mode 100644 lib/libesp32/berry/generate/be_fixed_zigbee.h diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h deleted file mode 100644 index 4fddf3e64..000000000 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ /dev/null @@ -1,1510 +0,0 @@ -extern const bcstring be_const_str_; -extern const bcstring be_const_str_00; -extern const bcstring be_const_str_0x_X2502X; -extern const bcstring be_const_str_AA50; -extern const bcstring be_const_str_AXP192; -extern const bcstring be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range; -extern const bcstring be_const_str_Auto_X2Dconfiguration; -extern const bcstring be_const_str_BECDFE; -extern const bcstring be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20; -extern const bcstring be_const_str_BRY_X3A_X20Exception_X3E_X20_X27; -extern const bcstring be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s; -extern const bcstring be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function; -extern const bcstring be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29; -extern const bcstring be_const_str_BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27; -extern const bcstring be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29; -extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29; -extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson; -extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29; -extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s; -extern const bcstring be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20; -extern const bcstring 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; -extern const bcstring be_const_str_BUTTON_CONFIGURATION; -extern const bcstring be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s; -extern const bcstring be_const_str_CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found; -extern const bcstring be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting; -extern const bcstring be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29; -extern const bcstring be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27; -extern const bcstring be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27; -extern const bcstring be_const_str_CFG_X3A_X20loaded_X20_X20; -extern const bcstring be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27; -extern const bcstring be_const_str_CFG_X3A_X20loading_X20; -extern const bcstring be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27; -extern const bcstring be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29; -extern const bcstring be_const_str_CFG_X3A_X20ran_X20_X20; -extern const bcstring be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27; -extern const bcstring be_const_str_CFG_X3A_X20removing_X20autoconf_X20files; -extern const bcstring be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker; -extern const bcstring be_const_str_CFG_X3A_X20return_code_X3D_X25i; -extern const bcstring be_const_str_CFG_X3A_X20running_X20; -extern const bcstring be_const_str_CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem; -extern const bcstring be_const_str_CT; -extern const bcstring be_const_str_DIMMER; -extern const bcstring be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF; -extern const bcstring be_const_str_EVENT_DELETE; -extern const bcstring be_const_str_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; -extern const bcstring be_const_str_False; -extern const bcstring be_const_str_GET; -extern const bcstring be_const_str_HTTP_GET; -extern const bcstring be_const_str_HTTP_POST; -extern const bcstring be_const_str_I2C_Driver; -extern const bcstring be_const_str_I2C_X3A; -extern const bcstring be_const_str_Invalid_X20ota_X20partition_X20number; -extern const bcstring be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback; -extern const bcstring be_const_str_Leds; -extern const bcstring be_const_str_MAX_RMT; -extern const bcstring be_const_str_MD5; -extern const bcstring be_const_str_MI32; -extern const bcstring be_const_str_No_X20SPIFFS_X20partition_X20found; -extern const bcstring be_const_str_None; -extern const bcstring be_const_str_OPTION_A; -extern const bcstring be_const_str_POST; -extern const bcstring be_const_str_Parameter_X20error; -extern const bcstring be_const_str_Partition; -extern const bcstring be_const_str_Partition_info; -extern const bcstring be_const_str_Partition_otadata; -extern const bcstring be_const_str_RELAY; -extern const bcstring be_const_str_RGB; -extern const bcstring be_const_str_RGBCT; -extern const bcstring be_const_str_RGBW; -extern const bcstring be_const_str_Restart_X201; -extern const bcstring be_const_str_SERIAL_5E1; -extern const bcstring be_const_str_SERIAL_5E2; -extern const bcstring be_const_str_SERIAL_5N1; -extern const bcstring be_const_str_SERIAL_5N2; -extern const bcstring be_const_str_SERIAL_5O1; -extern const bcstring be_const_str_SERIAL_5O2; -extern const bcstring be_const_str_SERIAL_6E1; -extern const bcstring be_const_str_SERIAL_6E2; -extern const bcstring be_const_str_SERIAL_6N1; -extern const bcstring be_const_str_SERIAL_6N2; -extern const bcstring be_const_str_SERIAL_6O1; -extern const bcstring be_const_str_SERIAL_6O2; -extern const bcstring be_const_str_SERIAL_7E1; -extern const bcstring be_const_str_SERIAL_7E2; -extern const bcstring be_const_str_SERIAL_7N1; -extern const bcstring be_const_str_SERIAL_7N2; -extern const bcstring be_const_str_SERIAL_7O1; -extern const bcstring be_const_str_SERIAL_7O2; -extern const bcstring be_const_str_SERIAL_8E1; -extern const bcstring be_const_str_SERIAL_8E2; -extern const bcstring be_const_str_SERIAL_8N1; -extern const bcstring be_const_str_SERIAL_8N2; -extern const bcstring be_const_str_SERIAL_8O1; -extern const bcstring be_const_str_SERIAL_8O2; -extern const bcstring be_const_str_SK6812_GRBW; -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_Too_X20many_X20partiition_X20slots; -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; -extern const bcstring be_const_str_WS2812; -extern const bcstring be_const_str_WS2812_GRB; -extern const bcstring be_const_str_Wire; -extern const bcstring be_const_str__; -extern const bcstring be_const_str__X0A; -extern const bcstring be_const_str__X0A_X29_X3E; -extern const bcstring be_const_str__X20; -extern const bcstring be_const_str__X20_X20; -extern const bcstring be_const_str__X20_X28; -extern const bcstring be_const_str__X21_X3D; -extern const bcstring be_const_str__X21_X3D_X3D; -extern const bcstring be_const_str__X22; -extern const bcstring be_const_str__X22_X3A; -extern const bcstring be_const_str__X23; -extern const bcstring be_const_str__X23autoexec_X2Ebat; -extern const bcstring be_const_str__X23autoexec_X2Ebe; -extern const bcstring be_const_str__X23display_X2Eini; -extern const bcstring be_const_str__X23init_X2Ebat; -extern const bcstring be_const_str__X23preinit_X2Ebe; -extern const bcstring be_const_str__X25; -extern const bcstring be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d; -extern const bcstring be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x; -extern const bcstring be_const_str__X25s_X2Eautoconf; -extern const bcstring be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B; -extern const bcstring be_const_str__X26lt_X3BNone_X26gt_X3B; -extern const bcstring be_const_str__X27_X20_X2D_X20; -extern const bcstring be_const_str__X28_X29; -extern const bcstring be_const_str__X29; -extern const bcstring be_const_str__X2A; -extern const bcstring be_const_str__X2B; -extern const bcstring be_const_str__X2C; -extern const bcstring 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; -extern const bcstring be_const_str__X2D; -extern const bcstring be_const_str__X2D_X2A; -extern const bcstring be_const_str__X2E; -extern const bcstring be_const_str__X2E_X2E; -extern const bcstring be_const_str__X2Eautoconf; -extern const bcstring be_const_str__X2Ebe; -extern const bcstring be_const_str__X2Ebec; -extern const bcstring be_const_str__X2Elen; -extern const bcstring be_const_str__X2Ep; -extern const bcstring be_const_str__X2Esize; -extern const bcstring be_const_str__X2Etapp; -extern const bcstring be_const_str__X2Ew; -extern const bcstring be_const_str__X2F; -extern const bcstring be_const_str__X2F_X2Eautoconf; -extern const bcstring be_const_str__X2F_X3Frst_X3D; -extern const bcstring be_const_str__X2Fac; -extern const bcstring be_const_str__X2Flights_X2F; -extern const bcstring be_const_str__X2Fstate_X2F; -extern const bcstring be_const_str__X3A; -extern const bcstring be_const_str__X3C; -extern const bcstring be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E; -extern const bcstring be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E; -extern const bcstring be_const_str__X3C_X3D; -extern const bcstring be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E; -extern const bcstring be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E; -extern const bcstring be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E; -extern const bcstring be_const_str__X3Cinstance_X3A_X20Partition_X28_X5B_X0A; -extern const bcstring be_const_str__X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E; -extern const bcstring be_const_str__X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E; -extern const bcstring be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29; -extern const bcstring be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E; -extern const bcstring be_const_str__X3Clambda_X3E; -extern const bcstring be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E; -extern const bcstring be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E; -extern const bcstring be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E; -extern const bcstring be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E; -extern const bcstring 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; -extern const bcstring be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E; -extern const bcstring be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E; -extern const bcstring 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; -extern const bcstring 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; -extern const bcstring 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; -extern const bcstring be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E; -extern const bcstring be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E; -extern const bcstring be_const_str__X3D; -extern const bcstring be_const_str__X3D_X3C_X3E_X21; -extern const bcstring be_const_str__X3D_X3D; -extern const bcstring be_const_str__X3E; -extern const bcstring be_const_str__X3E_X3D; -extern const bcstring be_const_str__X3F; -extern const bcstring be_const_str__X5B; -extern const bcstring be_const_str__X5D; -extern const bcstring be_const_str__X5D_X2C_X0A_X20_X20; -extern const bcstring be_const_str__X7B; -extern const bcstring be_const_str__X7B_X7D; -extern const bcstring be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D; -extern const bcstring be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D; -extern const bcstring be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D; -extern const bcstring be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D; -extern const bcstring be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D; -extern const bcstring be_const_str__X7D; -extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str___lower__; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str__anonymous_; -extern const bcstring be_const_str__archive; -extern const bcstring be_const_str__available; -extern const bcstring be_const_str__begin_transmission; -extern const bcstring be_const_str__buffer; -extern const bcstring be_const_str__ccmd; -extern const bcstring be_const_str__change_buffer; -extern const bcstring be_const_str__class; -extern const bcstring be_const_str__cmd; -extern const bcstring be_const_str__crons; -extern const bcstring be_const_str__debug_present; -extern const bcstring be_const_str__def; -extern const bcstring be_const_str__dirty; -extern const bcstring be_const_str__drivers; -extern const bcstring be_const_str__end_transmission; -extern const bcstring be_const_str__energy; -extern const bcstring be_const_str__error; -extern const bcstring be_const_str__filename; -extern const bcstring be_const_str__fl; -extern const bcstring be_const_str__global_addr; -extern const bcstring be_const_str__global_def; -extern const bcstring be_const_str__p; -extern const bcstring be_const_str__persist_X2Ejson; -extern const bcstring be_const_str__ptr; -extern const bcstring be_const_str__read; -extern const bcstring be_const_str__request_from; -extern const bcstring be_const_str__rmt; -extern const bcstring be_const_str__rules; -extern const bcstring be_const_str__settings_def; -extern const bcstring be_const_str__settings_ptr; -extern const bcstring be_const_str__subscribe; -extern const bcstring be_const_str__t; -extern const bcstring be_const_str__timers; -extern const bcstring be_const_str__unsubscribe; -extern const bcstring be_const_str__validate; -extern const bcstring be_const_str__write; -extern const bcstring be_const_str_a; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_accept; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_active_otadata; -extern const bcstring be_const_str_adc_config; -extern const bcstring be_const_str_add; -extern const bcstring be_const_str_add_anim; -extern const bcstring be_const_str_add_cb_event_closure; -extern const bcstring be_const_str_add_cmd; -extern const bcstring be_const_str_add_cron; -extern const bcstring be_const_str_add_driver; -extern const bcstring be_const_str_add_fast_loop; -extern const bcstring be_const_str_add_handler; -extern const bcstring be_const_str_add_header; -extern const bcstring be_const_str_add_light; -extern const bcstring be_const_str_add_rule; -extern const bcstring be_const_str_addr; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_alternate; -extern const bcstring be_const_str_animate; -extern const bcstring be_const_str_animators; -extern const bcstring be_const_str_app; -extern const bcstring be_const_str_arch; -extern const bcstring be_const_str_arg; -extern const bcstring be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj; -extern const bcstring be_const_str_arg_name; -extern const bcstring be_const_str_arg_size; -extern const bcstring be_const_str_argument_X20must_X20be_X20a_X20function; -extern const bcstring be_const_str_argument_X20must_X20be_X20a_X20list; -extern const bcstring be_const_str_argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize; -extern const bcstring be_const_str_as; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_assert; -extern const bcstring be_const_str_assign_rmt; -extern const bcstring be_const_str_asstring; -extern const bcstring be_const_str_atan; -extern const bcstring be_const_str_atan2; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str_autoexec; -extern const bcstring be_const_str_autorun; -extern const bcstring be_const_str_available; -extern const bcstring be_const_str_b; -extern const bcstring be_const_str_back_forth; -extern const bcstring be_const_str_base_class; -extern const bcstring be_const_str_battery_present; -extern const bcstring be_const_str_before_del; -extern const bcstring be_const_str_begin; -extern const bcstring be_const_str_begin_multicast; -extern const bcstring be_const_str_bool; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_bri; -extern const bcstring be_const_str_bus; -extern const bcstring be_const_str_button_pressed; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_bytes; -extern const bcstring be_const_str_c; -extern const bcstring be_const_str_call; -extern const bcstring be_const_str_call_native; -extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_can_show; -extern const bcstring be_const_str_cb; -extern const bcstring be_const_str_cb_do_nothing; -extern const bcstring be_const_str_cb_event_closure; -extern const bcstring be_const_str_cb_obj; -extern const bcstring be_const_str_ccronexpr; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_chars_in_string; -extern const bcstring be_const_str_check_not_method; -extern const bcstring be_const_str_check_privileged_access; -extern const bcstring be_const_str_class; -extern const bcstring be_const_str_class_init_obj; -extern const bcstring be_const_str_classname; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_clear_first_time; -extern const bcstring be_const_str_clear_to; -extern const bcstring be_const_str_close; -extern const bcstring be_const_str_closure; -extern const bcstring be_const_str_cmd; -extern const bcstring be_const_str_cmd_res; -extern const bcstring be_const_str_code; -extern const bcstring be_const_str_codedump; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_compress; -extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_connect; -extern const bcstring be_const_str_connected; -extern const bcstring be_const_str_connection_error; -extern const bcstring be_const_str_constructor_cb; -extern const bcstring be_const_str_contains; -extern const bcstring be_const_str_content_button; -extern const bcstring be_const_str_content_flush; -extern const bcstring be_const_str_content_response; -extern const bcstring be_const_str_content_send; -extern const bcstring be_const_str_content_send_style; -extern const bcstring be_const_str_content_start; -extern const bcstring be_const_str_content_stop; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_coord_arr; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_coredump; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus; -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_counters; -extern const bcstring be_const_str_crc; -extern const bcstring be_const_str_crc16; -extern const bcstring be_const_str_crc32; -extern const bcstring be_const_str_crc32_ota_seq; -extern const bcstring be_const_str_crc8; -extern const bcstring be_const_str_create_custom_widget; -extern const bcstring be_const_str_create_matrix; -extern const bcstring be_const_str_create_segment; -extern const bcstring be_const_str_ct; -extern const bcstring be_const_str_ctor; -extern const bcstring be_const_str_ctypes_bytes; -extern const bcstring be_const_str_ctypes_bytes_dyn; -extern const bcstring be_const_str_dac_voltage; -extern const bcstring be_const_str_data; -extern const bcstring be_const_str_day; -extern const bcstring be_const_str_debug; -extern const bcstring be_const_str_decompress; -extern const bcstring be_const_str_def; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_delay; -extern const bcstring be_const_str_delete_all_configs; -extern const bcstring be_const_str_deregister_obj; -extern const bcstring be_const_str_destructor_cb; -extern const bcstring be_const_str_detect; -extern const bcstring be_const_str_detected_X20on_X20bus; -extern const bcstring be_const_str_devices; -extern const bcstring be_const_str_digital_read; -extern const bcstring be_const_str_digital_write; -extern const bcstring be_const_str_dirty; -extern const bcstring be_const_str_discover; -extern const bcstring be_const_str_display; -extern const bcstring be_const_str_display_X2Eini; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_duration; -extern const bcstring be_const_str_editable; -extern const bcstring be_const_str_efuse_em; -extern const bcstring be_const_str_elements_X20must_X20be_X20a_X20lv_point; -extern const bcstring be_const_str_elif; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_enabled; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str_energy_struct; -extern const bcstring be_const_str_engine; -extern const bcstring be_const_str_erase; -extern const bcstring be_const_str_escape; -extern const bcstring be_const_str_esphttpd; -extern const bcstring be_const_str_eth; -extern const bcstring be_const_str_event; -extern const bcstring be_const_str_event_cb; -extern const bcstring be_const_str_every_100ms; -extern const bcstring be_const_str_every_250ms; -extern const bcstring be_const_str_every_50ms; -extern const bcstring be_const_str_every_second; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_exec_cmd; -extern const bcstring be_const_str_exec_rules; -extern const bcstring be_const_str_exec_tele; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_f; -extern const bcstring be_const_str_factory; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_fast_loop; -extern const bcstring be_const_str_fast_loop_enabled; -extern const bcstring be_const_str_fat; -extern const bcstring be_const_str_file; -extern const bcstring be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27; -extern const bcstring be_const_str_files; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_find_key_i; -extern const bcstring be_const_str_find_op; -extern const bcstring be_const_str_finish; -extern const bcstring be_const_str_flags; -extern const bcstring be_const_str_flash; -extern const bcstring be_const_str_floor; -extern const bcstring be_const_str_flush; -extern const bcstring be_const_str_for; -extern const bcstring be_const_str_format; -extern const bcstring be_const_str_from_to; -extern const bcstring be_const_str_fromb64; -extern const bcstring be_const_str_frombytes; -extern const bcstring be_const_str_fromhex; -extern const bcstring be_const_str_fromptr; -extern const bcstring be_const_str_fromstring; -extern const bcstring be_const_str_full_state; -extern const bcstring be_const_str_full_status; -extern const bcstring be_const_str_fulltopic; -extern const bcstring be_const_str_function; -extern const bcstring be_const_str_gamma; -extern const bcstring be_const_str_gamma10; -extern const bcstring be_const_str_gamma8; -extern const bcstring be_const_str_gc; -extern const bcstring be_const_str_gen_cb; -extern const bcstring be_const_str_get; -extern const bcstring be_const_str_get_MAC; -extern const bcstring be_const_str_get_active; -extern const bcstring be_const_str_get_alternate; -extern const bcstring be_const_str_get_aps_voltage; -extern const bcstring be_const_str_get_bat_charge_current; -extern const bcstring be_const_str_get_bat_current; -extern const bcstring be_const_str_get_bat_power; -extern const bcstring be_const_str_get_bat_voltage; -extern const bcstring be_const_str_get_battery_chargin_status; -extern const bcstring be_const_str_get_bri; -extern const bcstring be_const_str_get_cb_list; -extern const bcstring be_const_str_get_current_module_name; -extern const bcstring be_const_str_get_current_module_path; -extern const bcstring be_const_str_get_event_cb; -extern const bcstring be_const_str_get_factory_slot; -extern const bcstring be_const_str_get_free_heap; -extern const bcstring be_const_str_get_image_size; -extern const bcstring be_const_str_get_input_power_status; -extern const bcstring be_const_str_get_light; -extern const bcstring be_const_str_get_log; -extern const bcstring be_const_str_get_mem; -extern const bcstring be_const_str_get_name; -extern const bcstring be_const_str_get_object_from_ptr; -extern const bcstring be_const_str_get_option; -extern const bcstring be_const_str_get_ota_slot; -extern const bcstring be_const_str_get_pixel_color; -extern const bcstring be_const_str_get_power; -extern const bcstring be_const_str_get_size; -extern const bcstring be_const_str_get_string; -extern const bcstring be_const_str_get_switch; -extern const bcstring be_const_str_get_switches; -extern const bcstring be_const_str_get_temp; -extern const bcstring be_const_str_get_vbus_current; -extern const bcstring be_const_str_get_vbus_voltage; -extern const bcstring be_const_str_get_warning_level; -extern const bcstring be_const_str_getbits; -extern const bcstring be_const_str_getfloat; -extern const bcstring be_const_str_geti; -extern const bcstring be_const_str_global; -extern const bcstring be_const_str_gpio; -extern const bcstring be_const_str_gpio_init; -extern const bcstring be_const_str_group_def; -extern const bcstring be_const_str_groups; -extern const bcstring be_const_str_h; -extern const bcstring be_const_str_has; -extern const bcstring be_const_str_has_arg; -extern const bcstring be_const_str_has_factory; -extern const bcstring be_const_str_hasclient; -extern const bcstring be_const_str_height_def; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_hour; -extern const bcstring be_const_str_hs2rgb; -extern const bcstring be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf; -extern const bcstring be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson; -extern const bcstring be_const_str_hue; -extern const bcstring be_const_str_hue_ntv; -extern const bcstring be_const_str_hue_status; -extern const bcstring be_const_str_i2c_enabled; -extern const bcstring be_const_str_id; -extern const bcstring be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27; -extern const bcstring be_const_str_if; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_imin; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_ins_goto; -extern const bcstring be_const_str_ins_ramp; -extern const bcstring be_const_str_ins_time; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_instance; -extern const bcstring be_const_str_instance_X20required; -extern const bcstring be_const_str_instance_size; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_int64; -extern const bcstring be_const_str_internal_error; -extern const bcstring be_const_str_introspect; -extern const bcstring be_const_str_invalid_X20GPIO_X20number; -extern const bcstring be_const_str_invalid_X20magic_X20number_X20_X2502X; -extern const bcstring be_const_str_invalidate_spiffs; -extern const bcstring be_const_str_io_error; -extern const bcstring be_const_str_is_dirty; -extern const bcstring be_const_str_is_factory; -extern const bcstring be_const_str_is_first_time; -extern const bcstring be_const_str_is_ota; -extern const bcstring be_const_str_is_running; -extern const bcstring be_const_str_is_spiffs; -extern const bcstring be_const_str_isinstance; -extern const bcstring be_const_str_ismapped; -extern const bcstring be_const_str_ismethod; -extern const bcstring be_const_str_isnan; -extern const bcstring be_const_str_issubclass; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_json; -extern const bcstring be_const_str_json_append; -extern const bcstring be_const_str_json_fdump; -extern const bcstring be_const_str_json_fdump_any; -extern const bcstring be_const_str_json_fdump_list; -extern const bcstring be_const_str_json_fdump_map; -extern const bcstring be_const_str_keys; -extern const bcstring be_const_str_label; -extern const bcstring be_const_str_last_modified; -extern const bcstring be_const_str_leds; -extern const bcstring be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032; -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_list; -extern const bcstring be_const_str_list_handlers; -extern const bcstring be_const_str_listdir; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_load_otadata; -extern const bcstring be_const_str_load_templates; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_lv; -extern const bcstring be_const_str_lv_; -extern const bcstring be_const_str_lv_coord_arr; -extern const bcstring be_const_str_lv_event; -extern const bcstring be_const_str_lv_event_cb; -extern const bcstring be_const_str_lv_extra; -extern const bcstring be_const_str_lv_module_init; -extern const bcstring be_const_str_lv_obj; -extern const bcstring be_const_str_lv_obj_class; -extern const bcstring be_const_str_lv_point; -extern const bcstring be_const_str_lv_point_arr; -extern const bcstring be_const_str_lv_solidified; -extern const bcstring be_const_str_lv_style_prop_arr; -extern const bcstring be_const_str_lv_timer_cb; -extern const bcstring be_const_str_lvgl_event_dispatch; -extern const bcstring be_const_str_lvgl_timer_dispatch; -extern const bcstring be_const_str_make_cb; -extern const bcstring be_const_str_manuf; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_math; -extern const bcstring be_const_str_matrix; -extern const bcstring be_const_str_maxota; -extern const bcstring be_const_str_md5; -extern const bcstring be_const_str_member; -extern const bcstring be_const_str_members; -extern const bcstring be_const_str_memory; -extern const bcstring be_const_str_millis; -extern const bcstring be_const_str_min; -extern const bcstring be_const_str_missing_X20name; -extern const bcstring be_const_str_model; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_month; -extern const bcstring be_const_str_mqtt; -extern const bcstring be_const_str_mqtt_data; -extern const bcstring be_const_str_mqtt_listener; -extern const bcstring be_const_str_name; -extern const bcstring be_const_str_nan; -extern const bcstring be_const_str_next; -extern const bcstring be_const_str_next_cron; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus; -extern const bcstring be_const_str_no_X20more_X20RMT_X20channel_X20available; -extern const bcstring be_const_str_now; -extern const bcstring be_const_str_null_cb; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_nvs; -extern const bcstring be_const_str_nvskeys; -extern const bcstring be_const_str_o; -extern const bcstring be_const_str_obj_class_create_obj; -extern const bcstring be_const_str_offset; -extern const bcstring be_const_str_offseta; -extern const bcstring be_const_str_on; -extern const bcstring be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E; -extern const bcstring be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_ota_; -extern const bcstring be_const_str_ota_max; -extern const bcstring be_const_str_otadata; -extern const bcstring be_const_str_out_X20of_X20range; -extern const bcstring be_const_str_page_autoconf_ctl; -extern const bcstring be_const_str_page_autoconf_mgr; -extern const bcstring be_const_str_parse; -extern const bcstring be_const_str_partition_core; -extern const bcstring be_const_str_path; -extern const bcstring be_const_str_pc; -extern const bcstring be_const_str_pc_abs; -extern const bcstring be_const_str_pc_rel; -extern const bcstring be_const_str_persist; -extern const bcstring be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map; -extern const bcstring be_const_str_phy; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_pin; -extern const bcstring be_const_str_pin_mode; -extern const bcstring be_const_str_pin_used; -extern const bcstring be_const_str_pixel_count; -extern const bcstring be_const_str_pixel_size; -extern const bcstring be_const_str_pixels_buffer; -extern const bcstring be_const_str_point_arr; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_pop_path; -extern const bcstring be_const_str_pow; -extern const bcstring be_const_str_power_off; -extern const bcstring be_const_str_preinit; -extern const bcstring be_const_str_print; -extern const bcstring be_const_str_ptr; -extern const bcstring be_const_str_publish; -extern const bcstring be_const_str_publish_result; -extern const bcstring be_const_str_publish_rule; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_push_path; -extern const bcstring be_const_str_r; -extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_range; -extern const bcstring be_const_str_raw; -extern const bcstring be_const_str_read; -extern const bcstring be_const_str_read12; -extern const bcstring be_const_str_read13; -extern const bcstring be_const_str_read24; -extern const bcstring be_const_str_read32; -extern const bcstring be_const_str_read8; -extern const bcstring be_const_str_read_bytes; -extern const bcstring be_const_str_read_sensors; -extern const bcstring be_const_str_readbytes; -extern const bcstring be_const_str_readline; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_reapply; -extern const bcstring be_const_str_redirect; -extern const bcstring be_const_str_register_obj; -extern const bcstring be_const_str_remote_ip; -extern const bcstring be_const_str_remote_port; -extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_remove_cmd; -extern const bcstring be_const_str_remove_cron; -extern const bcstring be_const_str_remove_driver; -extern const bcstring be_const_str_remove_fast_loop; -extern const bcstring be_const_str_remove_light; -extern const bcstring be_const_str_remove_rule; -extern const bcstring be_const_str_remove_timer; -extern const bcstring be_const_str_remove_trailing_zeroes; -extern const bcstring be_const_str_replace; -extern const bcstring be_const_str_reset; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_resolvecmnd; -extern const bcstring be_const_str_resp_cmnd; -extern const bcstring be_const_str_resp_cmnd_done; -extern const bcstring be_const_str_resp_cmnd_error; -extern const bcstring be_const_str_resp_cmnd_failed; -extern const bcstring be_const_str_resp_cmnd_str; -extern const bcstring be_const_str_response_append; -extern const bcstring be_const_str_return; -extern const bcstring be_const_str_return_X20code_X3D_X25i; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_reverse_gamma10; -extern const bcstring be_const_str_rotate; -extern const bcstring be_const_str_rtc; -extern const bcstring be_const_str_rule; -extern const bcstring be_const_str_run; -extern const bcstring be_const_str_run_bat; -extern const bcstring be_const_str_run_cron; -extern const bcstring be_const_str_run_deferred; -extern const bcstring be_const_str_running; -extern const bcstring be_const_str_sat; -extern const bcstring be_const_str_save; -extern const bcstring be_const_str_save_before_restart; -extern const bcstring be_const_str_scale_uint; -extern const bcstring be_const_str_scan; -extern const bcstring be_const_str_sec; -extern const bcstring be_const_str_send; -extern const bcstring be_const_str_send_multicast; -extern const bcstring be_const_str_seq0; -extern const bcstring be_const_str_seq1; -extern const bcstring be_const_str_serial; -extern const bcstring be_const_str_set; -extern const bcstring be_const_str_set_active; -extern const bcstring be_const_str_set_alternate; -extern const bcstring be_const_str_set_auth; -extern const bcstring be_const_str_set_bat; -extern const bcstring be_const_str_set_bri; -extern const bcstring be_const_str_set_chg_current; -extern const bcstring be_const_str_set_ct; -extern const bcstring be_const_str_set_dc_voltage; -extern const bcstring be_const_str_set_dcdc_enable; -extern const bcstring be_const_str_set_exten; -extern const bcstring be_const_str_set_first_time; -extern const bcstring be_const_str_set_hue16sat; -extern const bcstring be_const_str_set_huesat; -extern const bcstring be_const_str_set_hum; -extern const bcstring be_const_str_set_ldo_enable; -extern const bcstring be_const_str_set_ldo_voltage; -extern const bcstring be_const_str_set_light; -extern const bcstring be_const_str_set_matrix_pixel_color; -extern const bcstring be_const_str_set_mem; -extern const bcstring be_const_str_set_mode_ct; -extern const bcstring be_const_str_set_mode_rgb; -extern const bcstring be_const_str_set_ota_max; -extern const bcstring be_const_str_set_pixel_color; -extern const bcstring be_const_str_set_power; -extern const bcstring be_const_str_set_pwm; -extern const bcstring be_const_str_set_reachable; -extern const bcstring be_const_str_set_rgb; -extern const bcstring be_const_str_set_temp; -extern const bcstring be_const_str_set_timeouts; -extern const bcstring be_const_str_set_timer; -extern const bcstring be_const_str_set_useragent; -extern const bcstring be_const_str_set_xy; -extern const bcstring be_const_str_setbits; -extern const bcstring be_const_str_setfloat; -extern const bcstring be_const_str_seti; -extern const bcstring be_const_str_setitem; -extern const bcstring be_const_str_setmember; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_settings; -extern const bcstring be_const_str_show; -extern const bcstring be_const_str_signal_change; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_sleep; -extern const bcstring be_const_str_slots; -extern const bcstring be_const_str_solidified; -extern const bcstring be_const_str_spiffs; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_start; -extern const bcstring be_const_str_state; -extern const bcstring be_const_str_static; -extern const bcstring be_const_str_stop; -extern const bcstring be_const_str_stop_iteration; -extern const bcstring be_const_str_str; -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_style_prop_arr; -extern const bcstring be_const_str_subscribe; -extern const bcstring be_const_str_subtype; -extern const bcstring be_const_str_subtype_to_string; -extern const bcstring be_const_str_success; -extern const bcstring be_const_str_sum; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_switch_factory; -extern const bcstring be_const_str_sys; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_tanh; -extern const bcstring be_const_str_target; -extern const bcstring be_const_str_tasmota; -extern const bcstring be_const_str_tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29; -extern const bcstring be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29; -extern const bcstring be_const_str_tasmota_log_reader; -extern const bcstring be_const_str_tcpclient; -extern const bcstring be_const_str_tcpserver; -extern const bcstring be_const_str_tele; -extern const bcstring be_const_str_test; -extern const bcstring be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function; -extern const bcstring be_const_str_time_dump; -extern const bcstring be_const_str_time_reached; -extern const bcstring be_const_str_time_str; -extern const bcstring be_const_str_timer_cb; -extern const bcstring be_const_str_to_gamma; -extern const bcstring be_const_str_tob64; -extern const bcstring be_const_str_tobytes; -extern const bcstring be_const_str_tohex; -extern const bcstring be_const_str_toint; -extern const bcstring be_const_str_tolower; -extern const bcstring be_const_str_tomap; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_topic; -extern const bcstring be_const_str_toptr; -extern const bcstring be_const_str_tostring; -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_compile; -extern const bcstring be_const_str_try_get_bec_version; -extern const bcstring be_const_str_try_remove_file; -extern const bcstring be_const_str_try_rule; -extern const bcstring be_const_str_try_run_compiled; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str_type_error; -extern const bcstring be_const_str_type_to_string; -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; -extern const bcstring be_const_str_uuid4; -extern const bcstring be_const_str_value; -extern const bcstring be_const_str_value_error; -extern const bcstring be_const_str_valuer_error; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str_w; -extern const bcstring be_const_str_wake_period; -extern const bcstring be_const_str_wd; -extern const bcstring be_const_str_web_add_button; -extern const bcstring be_const_str_web_add_config_button; -extern const bcstring be_const_str_web_add_console_button; -extern const bcstring be_const_str_web_add_handler; -extern const bcstring be_const_str_web_add_main_button; -extern const bcstring be_const_str_web_add_management_button; -extern const bcstring be_const_str_web_send; -extern const bcstring be_const_str_web_send_decimal; -extern const bcstring be_const_str_web_sensor; -extern const bcstring be_const_str_webclient; -extern const bcstring be_const_str_webserver; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_widget_cb; -extern const bcstring be_const_str_widget_constructor; -extern const bcstring be_const_str_widget_ctor_cb; -extern const bcstring be_const_str_widget_ctor_impl; -extern const bcstring be_const_str_widget_destructor; -extern const bcstring be_const_str_widget_dtor_cb; -extern const bcstring be_const_str_widget_dtor_impl; -extern const bcstring be_const_str_widget_editable; -extern const bcstring be_const_str_widget_event; -extern const bcstring be_const_str_widget_event_cb; -extern const bcstring be_const_str_widget_event_impl; -extern const bcstring be_const_str_widget_group_def; -extern const bcstring be_const_str_widget_height_def; -extern const bcstring be_const_str_widget_instance_size; -extern const bcstring be_const_str_widget_struct_by_class; -extern const bcstring be_const_str_widget_struct_default; -extern const bcstring be_const_str_widget_width_def; -extern const bcstring be_const_str_width_def; -extern const bcstring be_const_str_wifi; -extern const bcstring be_const_str_wire; -extern const bcstring be_const_str_wire1; -extern const bcstring be_const_str_wire2; -extern const bcstring be_const_str_wire_scan; -extern const bcstring be_const_str_write; -extern const bcstring be_const_str_write8; -extern const bcstring be_const_str_write_bit; -extern const bcstring be_const_str_write_bytes; -extern const bcstring be_const_str_write_file; -extern const bcstring be_const_str_write_flash; -extern const bcstring be_const_str_write_gpio; -extern const bcstring be_const_str_x; -extern const bcstring be_const_str_xy; -extern const bcstring be_const_str_y; -extern const bcstring be_const_str_year; -extern const bcstring be_const_str_yield; -extern const bcstring be_const_str_zero; -extern const bcstring be_const_str_zip; - -/* weak strings */ -extern const bcstring be_const_str__X20for_X20_X27obj_X27_X3A; -extern const bcstring be_const_str__X21; -extern const bcstring be_const_str__X22Device_X22_X3A_X220x_X2504X_X22; -extern const bcstring be_const_str__X22Endpoint_X22_X3A_X25i; -extern const bcstring be_const_str__X22Group_X22_X3A_X220x_X2504X_X22; -extern const bcstring be_const_str__X22LinkQuality_X22_X3A_X25i; -extern const bcstring be_const_str__X23000000; -extern const bcstring be_const_str__X23FFFFFF; -extern const bcstring be_const_str__X2502d_X25s_X2502d; -extern const bcstring be_const_str__X2504X_X25s_X2502X; -extern const bcstring be_const_str__X2504X_X2F_X2504X; -extern const bcstring be_const_str__X27_X20not_X20found; -extern const bcstring be_const_str__X28_X25s_X29; -extern const bcstring be_const_str__X2C_X22text_X22_X3A; -extern const bcstring be_const_str__X2C_X22val_X22_X3A_X25i; -extern const bcstring be_const_str__X2C_X25s_X3A_X22_X2504X_X2F_X2504X_X22; -extern const bcstring be_const_str__X2D_X2D_X3A_X2D_X2D; -extern const bcstring be_const_str__X2Ep1; -extern const bcstring be_const_str__X2Ep2; -extern const bcstring be_const_str_0; -extern const bcstring be_const_str_0x_X2504X; -extern const bcstring be_const_str_9; -extern const bcstring be_const_str__X3Cinstance_X3A_X20_X25s_X280x_X2504X_X2C_X200x_X2508X_X2508X_X2C_X20name_X3A_X27_X25s_X27_X2C_X20model_X3A_X27_X25s_X27_X2C_X20manufacturer_X3A_X27_X25s_X27_X29_X3E; -extern const bcstring be_const_str__X3Cundefined_X3E; -extern const bcstring be_const_str_A; -extern const bcstring be_const_str_AES_GCM; -extern const bcstring be_const_str_ALIGN_BOTTOM_MID; -extern const bcstring be_const_str_ALIGN_CENTER; -extern const bcstring be_const_str_ALIGN_LEFT_MID; -extern const bcstring be_const_str_ARC_MODE_NORMAL; -extern const bcstring be_const_str_ARC_MODE_REVERSE; -extern const bcstring be_const_str_ARC_MODE_SYMMETRICAL; -extern const bcstring be_const_str_Animate_back_forth; -extern const bcstring be_const_str_Animate_engine; -extern const bcstring be_const_str_Animate_from_to; -extern const bcstring be_const_str_Animate_ins_goto; -extern const bcstring be_const_str_Animate_ins_ramp; -extern const bcstring be_const_str_Animate_rotate; -extern const bcstring be_const_str_AudioFileSource; -extern const bcstring be_const_str_AudioFileSourceFS; -extern const bcstring be_const_str_AudioGenerator; -extern const bcstring be_const_str_AudioGeneratorMP3; -extern const bcstring be_const_str_AudioGeneratorWAV; -extern const bcstring be_const_str_AudioOpusDecoder; -extern const bcstring be_const_str_AudioOutput; -extern const bcstring be_const_str_AudioOutputI2S; -extern const bcstring be_const_str_Autoconf; -extern const bcstring be_const_str_BLE; -extern const bcstring be_const_str_COLOR_; -extern const bcstring be_const_str_COLOR_BLACK; -extern const bcstring be_const_str_COLOR_WHITE; -extern const bcstring be_const_str_Driver; -extern const bcstring be_const_str_EC_C25519; -extern const bcstring be_const_str_EVENT_CLICKED; -extern const bcstring be_const_str_EVENT_DRAW_MAIN; -extern const bcstring be_const_str_EVENT_DRAW_PART_BEGIN; -extern const bcstring be_const_str_EVENT_DRAW_PART_END; -extern const bcstring be_const_str_EVENT_VALUE_CHANGED; -extern const bcstring be_const_str_EXTERNAL_I2S; -extern const bcstring be_const_str_F; -extern const bcstring be_const_str_FALSE; -extern const bcstring be_const_str_HASPmota; -extern const bcstring be_const_str_HSP_X3A_X20Could_X20not_X20find_X20function_X20set_; -extern const bcstring be_const_str_HSP_X3A_X20Unsupported_X20font_X3A; -extern const bcstring be_const_str_HSP_X3A_X20cannot_X20find_X20object_X20of_X20type_X20; -extern const bcstring be_const_str_HSP_X3A_X20cannot_X20specify_X20_X27obj_X27_X20for_X20_X27id_X27_X3A0; -extern const bcstring be_const_str_HSP_X3A_X20failed_X20to_X20compile_X20_X27_X25s_X27_X20_X2D_X20_X25s_X20_X28_X25s_X29; -extern const bcstring be_const_str_HSP_X3A_X20failed_X20to_X20run_X20self_X2E_text_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29; -extern const bcstring be_const_str_HSP_X3A_X20failed_X20to_X20run_X20self_X2E_val_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29; -extern const bcstring be_const_str_HSP_X3A_X20invalid_X20_X27id_X27_X3A_X20; -extern const bcstring be_const_str_HSP_X3A_X20unable_X20to_X20run_X20berry_X20code_X20_X22_X25s_X22_X20_X2D_X20_X27_X25s_X27_X20_X2D_X20_X25s; -extern const bcstring be_const_str_HSP_X3A_X20unknown_X20attribute_X3A; -extern const bcstring be_const_str_INTERNAL_DAC; -extern const bcstring be_const_str_INTERNAL_PDM; -extern const bcstring be_const_str_LABEL_LONG_CLIP; -extern const bcstring be_const_str_LABEL_LONG_DOT; -extern const bcstring be_const_str_LABEL_LONG_SCROLL; -extern const bcstring be_const_str_LABEL_LONG_SCROLL_CIRCULAR; -extern const bcstring be_const_str_LABEL_LONG_WRAP; -extern const bcstring be_const_str_LVGL_glob; -extern const bcstring be_const_str_Leds_animator; -extern const bcstring be_const_str_Leds_matrix; -extern const bcstring be_const_str_Leds_ntv; -extern const bcstring be_const_str_Leds_segment; -extern const bcstring be_const_str_OBJ_FLAG_CLICKABLE; -extern const bcstring be_const_str_OBJ_FLAG_HIDDEN; -extern const bcstring be_const_str_OneWire; -extern const bcstring be_const_str_PART_INDICATOR; -extern const bcstring be_const_str_PART_MAIN; -extern const bcstring be_const_str_Persist; -extern const bcstring be_const_str_RES_OK; -extern const bcstring be_const_str_ROLLER_MODE_NORMAL; -extern const bcstring be_const_str_SCR_LOAD_ANIM_NONE; -extern const bcstring be_const_str_SIZE_CONTENT; -extern const bcstring be_const_str_STATE_CHECKED; -extern const bcstring be_const_str_STATE_DEFAULT; -extern const bcstring be_const_str_TASMOTA; -extern const bcstring be_const_str_TEXT_ALIGN_CENTER; -extern const bcstring be_const_str_TEXT_ALIGN_LEFT; -extern const bcstring be_const_str_TEXT_ALIGN_RIGHT; -extern const bcstring be_const_str_TRUE; -extern const bcstring be_const_str_Tapp; -extern const bcstring be_const_str_X; -extern const bcstring be_const_str__action; -extern const bcstring be_const_str__anim_end; -extern const bcstring be_const_str__anim_start; -extern const bcstring be_const_str__arc_anim_end_angle; -extern const bcstring be_const_str__arc_anim_start_angle; -extern const bcstring be_const_str__attr_id; -extern const bcstring be_const_str__attr_ignore; -extern const bcstring be_const_str__attr_map; -extern const bcstring be_const_str__cluster; -extern const bcstring be_const_str__deinit; -extern const bcstring be_const_str__dir; -extern const bcstring be_const_str__direction; -extern const bcstring be_const_str__event_map; -extern const bcstring be_const_str__get_bytes; -extern const bcstring be_const_str__get_key; -extern const bcstring be_const_str__get_val; -extern const bcstring be_const_str__groupaddr; -extern const bcstring be_const_str__handlers; -extern const bcstring be_const_str__init; -extern const bcstring be_const_str__iscmd; -extern const bcstring be_const_str__load; -extern const bcstring be_const_str__lqi; -extern const bcstring be_const_str__lv_class; -extern const bcstring be_const_str__lv_label; -extern const bcstring be_const_str__lv_obj; -extern const bcstring be_const_str__lv_part2_selector; -extern const bcstring be_const_str__lv_scr; -extern const bcstring be_const_str__lvgl; -extern const bcstring be_const_str__obj_id; -extern const bcstring be_const_str__oh; -extern const bcstring be_const_str__page; -extern const bcstring be_const_str__page_id; -extern const bcstring be_const_str__set_bytes; -extern const bcstring be_const_str__set_key; -extern const bcstring be_const_str__set_val; -extern const bcstring be_const_str__splash; -extern const bcstring be_const_str__src_ep; -extern const bcstring be_const_str__text_rule; -extern const bcstring be_const_str__text_rule_format; -extern const bcstring be_const_str__text_rule_formula; -extern const bcstring be_const_str__text_rule_function; -extern const bcstring be_const_str__val_rule; -extern const bcstring be_const_str__val_rule_formula; -extern const bcstring be_const_str__val_rule_function; -extern const bcstring be_const_str_abort; -extern const bcstring be_const_str_action; -extern const bcstring be_const_str_add_event_cb; -extern const bcstring be_const_str_add_flag; -extern const bcstring be_const_str_add_state; -extern const bcstring be_const_str_adv_block; -extern const bcstring be_const_str_adv_cb; -extern const bcstring be_const_str_adv_watch; -extern const bcstring be_const_str_angle; -extern const bcstring be_const_str_anim_get; -extern const bcstring be_const_str_anim_ntv; -extern const bcstring be_const_str_arc_dsc; -extern const bcstring be_const_str_area; -extern const bcstring be_const_str_atleast1; -extern const bcstring be_const_str_attr_id; -extern const bcstring be_const_str_attribute_error; -extern const bcstring be_const_str_auto_size; -extern const bcstring be_const_str_b0; -extern const bcstring be_const_str_back; -extern const bcstring be_const_str_berry_run; -extern const bcstring be_const_str_bg_color; -extern const bcstring be_const_str_bg_end_angle; -extern const bcstring be_const_str_bg_grad_color; -extern const bcstring be_const_str_bg_grad_dir; -extern const bcstring be_const_str_bg_opa; -extern const bcstring be_const_str_bg_start_angle; -extern const bcstring be_const_str_border_color; -extern const bcstring be_const_str_border_side; -extern const bcstring be_const_str_border_width; -extern const bcstring be_const_str_center; -extern const bcstring be_const_str_changed; -extern const bcstring be_const_str_check_label; -extern const bcstring be_const_str_clear_flag; -extern const bcstring be_const_str_clear_state; -extern const bcstring be_const_str_clock; -extern const bcstring be_const_str_clock_icon; -extern const bcstring be_const_str_cluster; -extern const bcstring be_const_str_color; -extern const bcstring be_const_str_color_X24; -extern const bcstring be_const_str_comment; -extern const bcstring be_const_str_conn_cb; -extern const bcstring be_const_str_consume_mono; -extern const bcstring be_const_str_consume_silence; -extern const bcstring be_const_str_consume_stereo; -extern const bcstring be_const_str_crop; -extern const bcstring be_const_str_dark; -extern const bcstring be_const_str_decode; -extern const bcstring be_const_str_decrypt; -extern const bcstring be_const_str_def_templ_name; -extern const bcstring be_const_str_del; -extern const bcstring be_const_str_depower; -extern const bcstring be_const_str_dim; -extern const bcstring be_const_str_dimmer; -extern const bcstring be_const_str_direction; -extern const bcstring be_const_str_dispatch; -extern const bcstring be_const_str_do_action; -extern const bcstring be_const_str_dots; -extern const bcstring be_const_str_down; -extern const bcstring be_const_str_draw_arc; -extern const bcstring be_const_str_draw_arc_dsc; -extern const bcstring be_const_str_draw_arc_dsc_init; -extern const bcstring be_const_str_draw_ctx; -extern const bcstring be_const_str_draw_line; -extern const bcstring be_const_str_draw_line_dsc; -extern const bcstring be_const_str_draw_line_dsc_init; -extern const bcstring be_const_str_driver_name; -extern const bcstring be_const_str_encrypt; -extern const bcstring be_const_str_end_angle; -extern const bcstring be_const_str_end_angle1; -extern const bcstring be_const_str_end_value; -extern const bcstring be_const_str_event_dispatch; -extern const bcstring be_const_str_event_send; -extern const bcstring be_const_str_expand; -extern const bcstring be_const_str_file_X20_X27; -extern const bcstring be_const_str_font_embedded; -extern const bcstring be_const_str_font_montserrat; -extern const bcstring be_const_str_font_seg7; -extern const bcstring be_const_str_get_; -extern const bcstring be_const_str_get_action; -extern const bcstring be_const_str_get_adjustable; -extern const bcstring be_const_str_get_align; -extern const bcstring be_const_str_get_angle; -extern const bcstring be_const_str_get_arc_line_width; -extern const bcstring be_const_str_get_click; -extern const bcstring be_const_str_get_coords; -extern const bcstring be_const_str_get_dir; -extern const bcstring be_const_str_get_direction; -extern const bcstring be_const_str_get_disp; -extern const bcstring be_const_str_get_enabled; -extern const bcstring be_const_str_get_height; -extern const bcstring be_const_str_get_hidden; -extern const bcstring be_const_str_get_hor_res; -extern const bcstring be_const_str_get_line_width; -extern const bcstring be_const_str_get_line_width1; -extern const bcstring be_const_str_get_max; -extern const bcstring be_const_str_get_max_value; -extern const bcstring be_const_str_get_min; -extern const bcstring be_const_str_get_min_value; -extern const bcstring be_const_str_get_mode; -extern const bcstring be_const_str_get_obj; -extern const bcstring be_const_str_get_options; -extern const bcstring be_const_str_get_pad_all; -extern const bcstring be_const_str_get_pad_bottom; -extern const bcstring be_const_str_get_pad_left; -extern const bcstring be_const_str_get_pad_right; -extern const bcstring be_const_str_get_pad_top; -extern const bcstring be_const_str_get_page_cur; -extern const bcstring be_const_str_get_percentage; -extern const bcstring be_const_str_get_qr_dark_color; -extern const bcstring be_const_str_get_qr_light_color; -extern const bcstring be_const_str_get_qr_size; -extern const bcstring be_const_str_get_qr_text; -extern const bcstring be_const_str_get_radius2; -extern const bcstring be_const_str_get_scr; -extern const bcstring be_const_str_get_selected; -extern const bcstring be_const_str_get_selected_str; -extern const bcstring be_const_str_get_show_selected; -extern const bcstring be_const_str_get_speed; -extern const bcstring be_const_str_get_style_bg_color; -extern const bcstring be_const_str_get_style_line_color; -extern const bcstring be_const_str_get_style_line_width; -extern const bcstring be_const_str_get_style_pad_bottom; -extern const bcstring be_const_str_get_style_pad_left; -extern const bcstring be_const_str_get_style_pad_right; -extern const bcstring be_const_str_get_style_pad_top; -extern const bcstring be_const_str_get_style_radius; -extern const bcstring be_const_str_get_style_text_align; -extern const bcstring be_const_str_get_style_text_color; -extern const bcstring be_const_str_get_text; -extern const bcstring be_const_str_get_text_color; -extern const bcstring be_const_str_get_text_font; -extern const bcstring be_const_str_get_text_rule; -extern const bcstring be_const_str_get_text_rule_format; -extern const bcstring be_const_str_get_text_rule_formula; -extern const bcstring be_const_str_get_toggle; -extern const bcstring be_const_str_get_type; -extern const bcstring be_const_str_get_val; -extern const bcstring be_const_str_get_val_rule; -extern const bcstring be_const_str_get_val_rule_formula; -extern const bcstring be_const_str_get_value; -extern const bcstring be_const_str_get_value_color; -extern const bcstring be_const_str_get_value_font; -extern const bcstring be_const_str_get_value_ofs_x; -extern const bcstring be_const_str_get_value_ofs_y; -extern const bcstring be_const_str_get_value_str; -extern const bcstring be_const_str_get_ver_res; -extern const bcstring be_const_str_get_width; -extern const bcstring be_const_str_get_x; -extern const bcstring be_const_str_get_y; -extern const bcstring be_const_str_groupaddr; -extern const bcstring be_const_str_has_flag; -extern const bcstring be_const_str_has_state; -extern const bcstring be_const_str_height; -extern const bcstring be_const_str_hold; -extern const bcstring be_const_str_hres; -extern const bcstring be_const_str_hue_bridge_monad; -extern const bcstring be_const_str_image_recolor; -extern const bcstring be_const_str_image_recolor_opa; -extern const bcstring be_const_str_img; -extern const bcstring be_const_str_info; -extern const bcstring be_const_str_init_draw_arc_dsc; -extern const bcstring be_const_str_init_draw_line_dsc; -extern const bcstring be_const_str_invalidate; -extern const bcstring be_const_str_io_erorr; -extern const bcstring be_const_str_ip; -extern const bcstring be_const_str_is_color_attribute; -extern const bcstring be_const_str_isrunning; -extern const bcstring be_const_str_key; -extern const bcstring be_const_str_key_suffix; -extern const bcstring be_const_str_key_tostring; -extern const bcstring be_const_str_layer_top; -extern const bcstring be_const_str_left; -extern const bcstring be_const_str_line_color; -extern const bcstring be_const_str_line_dsc; -extern const bcstring be_const_str_load_font; -extern const bcstring be_const_str_load_freetype_font; -extern const bcstring be_const_str_local; -extern const bcstring be_const_str_long; -extern const bcstring be_const_str_longaddr; -extern const bcstring be_const_str_loop; -extern const bcstring be_const_str_lost; -extern const bcstring be_const_str_lqi; -extern const bcstring be_const_str_lv_anim; -extern const bcstring be_const_str_lv_arc; -extern const bcstring be_const_str_lv_bar; -extern const bcstring be_const_str_lv_btn; -extern const bcstring be_const_str_lv_btnmatrix; -extern const bcstring be_const_str_lv_canvas; -extern const bcstring be_const_str_lv_chart; -extern const bcstring be_const_str_lv_checkbox; -extern const bcstring be_const_str_lv_clock; -extern const bcstring be_const_str_lv_clock_icon; -extern const bcstring be_const_str_lv_color; -extern const bcstring be_const_str_lv_colorwheel; -extern const bcstring be_const_str_lv_disp; -extern const bcstring be_const_str_lv_dropdown; -extern const bcstring be_const_str_lv_font; -extern const bcstring be_const_str_lv_group; -extern const bcstring be_const_str_lv_img; -extern const bcstring be_const_str_lv_imgbtn; -extern const bcstring be_const_str_lv_indev; -extern const bcstring be_const_str_lv_label; -extern const bcstring be_const_str_lv_led; -extern const bcstring be_const_str_lv_line; -extern const bcstring be_const_str_lv_meter; -extern const bcstring be_const_str_lv_msgbox; -extern const bcstring be_const_str_lv_qrcode; -extern const bcstring be_const_str_lv_roller; -extern const bcstring be_const_str_lv_signal_arcs; -extern const bcstring be_const_str_lv_signal_bars; -extern const bcstring be_const_str_lv_slider; -extern const bcstring be_const_str_lv_spinbox; -extern const bcstring be_const_str_lv_spinner; -extern const bcstring be_const_str_lv_style; -extern const bcstring be_const_str_lv_switch; -extern const bcstring be_const_str_lv_table; -extern const bcstring be_const_str_lv_textarea; -extern const bcstring be_const_str_lv_theme; -extern const bcstring be_const_str_lv_timer; -extern const bcstring be_const_str_lv_wifi_arcs; -extern const bcstring be_const_str_lv_wifi_arcs_icon; -extern const bcstring be_const_str_lv_wifi_bars; -extern const bcstring be_const_str_lv_wifi_bars_icon; -extern const bcstring be_const_str_lvh_; -extern const bcstring be_const_str_lvh_arc; -extern const bcstring be_const_str_lvh_bar; -extern const bcstring be_const_str_lvh_btn; -extern const bcstring be_const_str_lvh_btnmatrix; -extern const bcstring be_const_str_lvh_checkbox; -extern const bcstring be_const_str_lvh_dropdown; -extern const bcstring be_const_str_lvh_img; -extern const bcstring be_const_str_lvh_label; -extern const bcstring be_const_str_lvh_line; -extern const bcstring be_const_str_lvh_obj; -extern const bcstring be_const_str_lvh_page; -extern const bcstring be_const_str_lvh_page_cur_idx; -extern const bcstring be_const_str_lvh_pages; -extern const bcstring be_const_str_lvh_qrcode; -extern const bcstring be_const_str_lvh_roller; -extern const bcstring be_const_str_lvh_scr; -extern const bcstring be_const_str_lvh_slider; -extern const bcstring be_const_str_lvh_spinner; -extern const bcstring be_const_str_lvh_switch; -extern const bcstring be_const_str_lvh_textarea; -extern const bcstring be_const_str_manufacturer; -extern const bcstring be_const_str_match; -extern const bcstring be_const_str_minute; -extern const bcstring be_const_str_montserrat; -extern const bcstring be_const_str_montserrat_font; -extern const bcstring be_const_str_new_head; -extern const bcstring be_const_str_new_tail; -extern const bcstring be_const_str_no_bytes; -extern const bcstring be_const_str_obj; -extern const bcstring be_const_str_obj_event_base; -extern const bcstring be_const_str_p; -extern const bcstring be_const_str_p_X25ib_X25i; -extern const bcstring be_const_str_p1; -extern const bcstring be_const_str_p2; -extern const bcstring be_const_str_p_X5Cd_X2B; -extern const bcstring be_const_str_pad_all; -extern const bcstring be_const_str_pad_bottom; -extern const bcstring be_const_str_pad_left; -extern const bcstring be_const_str_pad_right; -extern const bcstring be_const_str_pad_top; -extern const bcstring be_const_str_page; -extern const bcstring be_const_str_page_dir_to; -extern const bcstring be_const_str_pages_X2Ejsonl; -extern const bcstring be_const_str_pages_list_sorted; -extern const bcstring be_const_str_param; -extern const bcstring be_const_str_parentid; -extern const bcstring be_const_str_parse_color; -extern const bcstring be_const_str_parse_hex; -extern const bcstring be_const_str_parse_obj; -extern const bcstring be_const_str_parse_page; -extern const bcstring be_const_str_payload; -extern const bcstring be_const_str_payload_ptr; -extern const bcstring be_const_str_pct; -extern const bcstring be_const_str_percentage; -extern const bcstring be_const_str_point; -extern const bcstring be_const_str_post_init; -extern const bcstring be_const_str_prev; -extern const bcstring be_const_str_public_key; -extern const bcstring be_const_str_qr_dark_color; -extern const bcstring be_const_str_qr_light_color; -extern const bcstring be_const_str_qr_size; -extern const bcstring be_const_str_qrcode; -extern const bcstring be_const_str_quality; -extern const bcstring be_const_str_r16; -extern const bcstring be_const_str_radius; -extern const bcstring be_const_str_re; -extern const bcstring be_const_str_re_page_target; -extern const bcstring be_const_str_refr_now; -extern const bcstring be_const_str_refr_pos; -extern const bcstring be_const_str_refr_size; -extern const bcstring be_const_str_register_button_encoder; -extern const bcstring be_const_str_register_event; -extern const bcstring be_const_str_register_event_cb; -extern const bcstring be_const_str_release; -extern const bcstring be_const_str_reset_search; -extern const bcstring be_const_str_return_X20_X2F_X20val_X20_X2D_X3E_X20_X28; -extern const bcstring be_const_str_right; -extern const bcstring be_const_str_robotocondensed; -extern const bcstring be_const_str_rotation; -extern const bcstring be_const_str_round_end; -extern const bcstring be_const_str_round_start; -extern const bcstring be_const_str_rounded; -extern const bcstring be_const_str_scr; -extern const bcstring be_const_str_scr_act; -extern const bcstring be_const_str_scr_load_anim; -extern const bcstring be_const_str_screenshot; -extern const bcstring be_const_str_scroll; -extern const bcstring be_const_str_search; -extern const bcstring be_const_str_seg7_font; -extern const bcstring be_const_str_select; -extern const bcstring be_const_str_set_; -extern const bcstring be_const_str_set_MAC; -extern const bcstring be_const_str_set_action; -extern const bcstring be_const_str_set_adjustable; -extern const bcstring be_const_str_set_align; -extern const bcstring be_const_str_set_angle; -extern const bcstring be_const_str_set_bits_per_sample; -extern const bcstring be_const_str_set_channels; -extern const bcstring be_const_str_set_chr; -extern const bcstring be_const_str_set_click; -extern const bcstring be_const_str_set_dir; -extern const bcstring be_const_str_set_direction; -extern const bcstring be_const_str_set_enabled; -extern const bcstring be_const_str_set_gain; -extern const bcstring be_const_str_set_height; -extern const bcstring be_const_str_set_hidden; -extern const bcstring be_const_str_set_line_width; -extern const bcstring be_const_str_set_line_width1; -extern const bcstring be_const_str_set_long_mode; -extern const bcstring be_const_str_set_max; -extern const bcstring be_const_str_set_min; -extern const bcstring be_const_str_set_mode; -extern const bcstring be_const_str_set_obj; -extern const bcstring be_const_str_set_options; -extern const bcstring be_const_str_set_pad_all2; -extern const bcstring be_const_str_set_pad_bottom2; -extern const bcstring be_const_str_set_pad_left2; -extern const bcstring be_const_str_set_pad_right2; -extern const bcstring be_const_str_set_pad_top2; -extern const bcstring be_const_str_set_percentage; -extern const bcstring be_const_str_set_qr_dark_color; -extern const bcstring be_const_str_set_qr_light_color; -extern const bcstring be_const_str_set_qr_size; -extern const bcstring be_const_str_set_qr_text; -extern const bcstring be_const_str_set_radius2; -extern const bcstring be_const_str_set_range; -extern const bcstring be_const_str_set_rate; -extern const bcstring be_const_str_set_selected; -extern const bcstring be_const_str_set_show_selected; -extern const bcstring be_const_str_set_size; -extern const bcstring be_const_str_set_speed; -extern const bcstring be_const_str_set_style_arc_width; -extern const bcstring be_const_str_set_style_bg_color; -extern const bcstring be_const_str_set_style_bg_opa; -extern const bcstring be_const_str_set_style_border_width; -extern const bcstring be_const_str_set_style_img_recolor; -extern const bcstring be_const_str_set_style_img_recolor_opa; -extern const bcstring be_const_str_set_style_line_color; -extern const bcstring be_const_str_set_style_line_width; -extern const bcstring be_const_str_set_style_pad_all; -extern const bcstring be_const_str_set_style_pad_bottom; -extern const bcstring be_const_str_set_style_pad_left; -extern const bcstring be_const_str_set_style_pad_right; -extern const bcstring be_const_str_set_style_pad_top; -extern const bcstring be_const_str_set_style_radius; -extern const bcstring be_const_str_set_style_text_align; -extern const bcstring be_const_str_set_style_text_color; -extern const bcstring be_const_str_set_style_text_font; -extern const bcstring be_const_str_set_svc; -extern const bcstring be_const_str_set_tasmota_logo; -extern const bcstring be_const_str_set_text; -extern const bcstring be_const_str_set_text_X20unsupported_X20on_X20roller; -extern const bcstring be_const_str_set_text_color; -extern const bcstring be_const_str_set_text_font; -extern const bcstring be_const_str_set_text_rule; -extern const bcstring be_const_str_set_text_rule_format; -extern const bcstring be_const_str_set_text_rule_formula; -extern const bcstring be_const_str_set_theme; -extern const bcstring be_const_str_set_time; -extern const bcstring be_const_str_set_toggle; -extern const bcstring be_const_str_set_type; -extern const bcstring be_const_str_set_user_data; -extern const bcstring be_const_str_set_val; -extern const bcstring be_const_str_set_val_rule; -extern const bcstring be_const_str_set_val_rule_formula; -extern const bcstring be_const_str_set_value; -extern const bcstring be_const_str_set_value_color; -extern const bcstring be_const_str_set_value_font; -extern const bcstring be_const_str_set_value_ofs_x; -extern const bcstring be_const_str_set_value_ofs_y; -extern const bcstring be_const_str_set_value_str; -extern const bcstring be_const_str_set_width; -extern const bcstring be_const_str_set_x; -extern const bcstring be_const_str_set_y; -extern const bcstring be_const_str_set_zoom; -extern const bcstring be_const_str_shared_key; -extern const bcstring be_const_str_shortaddr; -extern const bcstring be_const_str_shortaddr_hex; -extern const bcstring be_const_str_show_anim; -extern const bcstring be_const_str_signal_arcs; -extern const bcstring be_const_str_signal_bars; -extern const bcstring be_const_str_skip; -extern const bcstring be_const_str_sort; -extern const bcstring be_const_str_speed; -extern const bcstring be_const_str_spinner; -extern const bcstring be_const_str_splash; -extern const bcstring be_const_str_splash_init; -extern const bcstring be_const_str_splash_remove; -extern const bcstring be_const_str_splash_runner; -extern const bcstring be_const_str_src; -extern const bcstring be_const_str_src_ep; -extern const bcstring be_const_str_start_angle; -extern const bcstring be_const_str_start_angle1; -extern const bcstring be_const_str_start_value; -extern const bcstring be_const_str_started; -extern const bcstring be_const_str_style_; -extern const bcstring be_const_str_style_bg_color; -extern const bcstring be_const_str_style_bg_grad_color; -extern const bcstring be_const_str_style_bg_grad_dir; -extern const bcstring be_const_str_style_bg_opa; -extern const bcstring be_const_str_style_border_color; -extern const bcstring be_const_str_style_border_side; -extern const bcstring be_const_str_style_border_width; -extern const bcstring be_const_str_style_img_recolor; -extern const bcstring be_const_str_style_img_recolor_opa; -extern const bcstring be_const_str_style_line_color; -extern const bcstring be_const_str_style_pad_all; -extern const bcstring be_const_str_style_pad_bottom; -extern const bcstring be_const_str_style_pad_left; -extern const bcstring be_const_str_style_pad_right; -extern const bcstring be_const_str_style_pad_top; -extern const bcstring be_const_str_style_radius; -extern const bcstring be_const_str_tag; -extern const bcstring be_const_str_target_search; -extern const bcstring be_const_str_test_attr; -extern const bcstring be_const_str_test_msg; -extern const bcstring be_const_str_text; -extern const bcstring be_const_str_text_rule_matched; -extern const bcstring be_const_str_theme_apply; -extern const bcstring be_const_str_theme_haspmota_init; -extern const bcstring be_const_str_time; -extern const bcstring be_const_str_tojson; -extern const bcstring be_const_str_touch_update; -extern const bcstring be_const_str_unable_X20to_X20parse_X20JSON_X20line; -extern const bcstring be_const_str_unknown_X20attribute_X20; -extern const bcstring be_const_str_up; -extern const bcstring be_const_str_user_data; -extern const bcstring be_const_str_val; -extern const bcstring be_const_str_val_rule_matched; -extern const bcstring be_const_str_vres; -extern const bcstring be_const_str_width; -extern const bcstring be_const_str_wifi_arcs; -extern const bcstring be_const_str_wifi_arcs_icon; -extern const bcstring be_const_str_wifi_bars; -extern const bcstring be_const_str_wifi_bars_icon; -extern const bcstring be_const_str_x1; -extern const bcstring be_const_str_y1; -extern const bcstring be_const_str_zb_coord; -extern const bcstring be_const_str_zb_coord_ntv; -extern const bcstring be_const_str_zb_device; -extern const bcstring be_const_str_zcl_attribute; -extern const bcstring be_const_str_zcl_attribute_list; -extern const bcstring be_const_str_zcl_attribute_list_ntv; -extern const bcstring be_const_str_zcl_attribute_ntv; -extern const bcstring be_const_str_zcl_frame; -extern const bcstring be_const_str_zcl_frame_ntv; -extern const bcstring be_const_str__X7B_X22hasp_X22_X3A_X7B_X22p_X25i_X22_X3A_X22in_X22_X7D_X7D; -extern const bcstring be_const_str__X7B_X22hasp_X22_X3A_X7B_X22p_X25i_X22_X3A_X22out_X22_X7D_X7D; -extern const bcstring be_const_str__X7B_X22hasp_X22_X3A_X7B_X22p_X25ib_X25i_X22_X3A_X7B_X22event_X22_X3A_X22_X25s_X22_X25s_X7D_X7D_X7D; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h deleted file mode 100644 index a6b6fde6b..000000000 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ /dev/null @@ -1,1952 +0,0 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_True); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_alternate); -be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, NULL); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_add_cmd); -be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27); -be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_i2c_enabled); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_tr); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_coord_arr); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_month); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_call_native); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_sec); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_get_string); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_md5); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str__archive); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_update); -be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str__X2Eautoconf); -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_X20removed_X20file_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, &be_const_str_stop); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str__X29); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str__X2Fac); -be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_get_bri); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_Partition_info); -be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_count); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_groups); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_create_custom_widget); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_cmd); -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_SERIAL_8E1); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str__error); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_escape); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_content_send); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_toint); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_HTTP_POST); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_SERIAL_5O2); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str__change_buffer); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_get_aps_voltage); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_SERIAL_5N1); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, NULL); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_web_add_handler); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_get_temp); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str__global_def); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_SERIAL_8O2); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, NULL); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_add); -be_define_const_str(00, "00", 569209421u, 0, 2, NULL); -be_define_const_str(0x_X2502X, "0x%02X", 2626549866u, 0, 6, &be_const_str_CFG_X3A_X20removing_X20autoconf_X20files); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, NULL); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_SERIAL_6E2); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

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

", 1863865923u, 0, 16, &be_const_str_SERIAL_7O1); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_ct); -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_CFG_X3A_X20ran_X20_X20); -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_is_running); -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__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_get_bat_current); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_fromb64); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_get_current_module_path); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_SERIAL_7N1); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, NULL); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, NULL); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str__anonymous_); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29); -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_resp_cmnd); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

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

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

 (This feature requires an internet connection)

", 2719266486u, 0, 74, 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_exec_tele); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "