diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml
index 438d657cd..d349b30f0 100644
--- a/.github/workflows/Tasmota_build_devel.yml
+++ b/.github/workflows/Tasmota_build_devel.yml
@@ -32,19 +32,34 @@ jobs:
- tasmota-zbbridge
- tasmota-zigbee
- tasmota32
+ - tasmota32-zbbrdgpro
- tasmota32-webcam
- tasmota32-bluetooth
+ - tasmota32-nspanel
- tasmota32-display
- tasmota32-ir
- tasmota32-lvgl
- tasmota32c3
+ - tasmota32c3cdc
+ - tasmota32s2
+ - tasmota32s2cdc
+ - tasmota32s3
+ - tasmota32s3cdc
- tasmota32solo1
+ - tasmota32solo1-safeboot
+ - tasmota32-safeboot
+ - tasmota32c3-safeboot
+ - tasmota32c3cdc-safeboot
+ - tasmota32s2-safeboot
+ - tasmota32s2cdc-safeboot
+ - tasmota32s3-safeboot
+ - tasmota32s3cdc-safeboot
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
ref: development
- name: Set up Python
- uses: actions/setup-python@v1
+ uses: actions/setup-python@v2
- name: Install dependencies
run: |
pip install -U platformio
@@ -64,11 +79,11 @@ jobs:
variant: [ tasmota, tasmota32 ]
language: [ AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
ref: development
- name: Set up Python
- uses: actions/setup-python@v1
+ uses: actions/setup-python@v2
- name: Install dependencies
run: |
pip install -U platformio
@@ -114,10 +129,17 @@ jobs:
[ ! -f ./mv_firmware/firmware/tasmota32-lvgl.* ] || mv ./mv_firmware/firmware/tasmota32-lvgl.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ] || mv ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ./firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32-nspanel.* ] || mv ./mv_firmware/firmware/tasmota32-nspanel.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./firmware/tasmota32/
- [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/
+ [ ! -f ./mv_firmware/firmware/tasmota32s2*.* ] || mv ./mv_firmware/firmware/tasmota32s2*.* ./firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32s3*.* ] || mv ./mv_firmware/firmware/tasmota32s3*.* ./firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32-safeboot* ] || mv ./mv_firmware/firmware/tasmota32-safeboot* ./firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./firmware/tasmota32/languages/
+ [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota-minimal.bin ] || rm -rf ./mv_firmware/firmware/tasmota-minimal.bin
[ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/
- name: Display files to transfer
run: ls -R ./*
@@ -136,7 +158,7 @@ jobs:
needs: Upload
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Creat trigger.txt
run: |
echo ${GITHUB_SHA} &> trigger.txt
diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml
index 78cc591ef..e65a87b3a 100644
--- a/.github/workflows/Tasmota_build_master.yml
+++ b/.github/workflows/Tasmota_build_master.yml
@@ -31,19 +31,34 @@ jobs:
- tasmota-zbbridge
- tasmota-zigbee
- tasmota32
+ - tasmota32-zbbrdgpro
- tasmota32-webcam
- tasmota32-bluetooth
+ - tasmota32-nspanel
- tasmota32-display
- tasmota32-ir
- tasmota32-lvgl
- tasmota32c3
+ - tasmota32c3cdc
+ - tasmota32s2
+ - tasmota32s2cdc
+ - tasmota32s3
+ - tasmota32s3cdc
- tasmota32solo1
+ - tasmota32solo1-safeboot
+ - tasmota32-safeboot
+ - tasmota32c3-safeboot
+ - tasmota32c3cdc-safeboot
+ - tasmota32s2-safeboot
+ - tasmota32s2cdc-safeboot
+ - tasmota32s3-safeboot
+ - tasmota32s3cdc-safeboot
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
ref: master
- name: Set up Python
- uses: actions/setup-python@v1
+ uses: actions/setup-python@v2
- name: Install dependencies
run: |
pip install -U platformio
@@ -63,11 +78,11 @@ jobs:
variant: [ tasmota, tasmota32 ]
language: [ AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
ref: master
- name: Set up Python
- uses: actions/setup-python@v1
+ uses: actions/setup-python@v2
- name: Install dependencies
run: |
pip install -U platformio
@@ -83,7 +98,7 @@ jobs:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- uses: actions/download-artifact@v2
with:
name: firmware
@@ -121,11 +136,18 @@ jobs:
[ ! -f ./mv_firmware/firmware/tasmota32-display.* ] || mv ./mv_firmware/firmware/tasmota32-display.* ./release-firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-lvgl.* ] || mv ./mv_firmware/firmware/tasmota32-lvgl.* ./release-firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./release-firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ] || mv ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ./release-firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32-nspanel.* ] || mv ./mv_firmware/firmware/tasmota32-nspanel.* ./release-firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./release-firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./release-firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./release-firmware/tasmota32/
[ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./release-firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32s2*.* ] || mv ./mv_firmware/firmware/tasmota32s2*.* ./release-firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32s3*.* ] || mv ./mv_firmware/firmware/tasmota32s3*.* ./release-firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32-safeboot* ] || mv ./mv_firmware/firmware/tasmota32-safeboot* ./release-firmware/tasmota32/
+ [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./release-firmware/tasmota32/languages/
[ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./release-firmware/tasmota32/languages/
+ [ ! -f ./mv_firmware/firmware/tasmota-minimal.bin ] || rm -rf ./mv_firmware/firmware/tasmota-minimal.bin
[ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./release-firmware/tasmota/languages/
- name: Display files to transfer
run: ls -R ./*
@@ -144,7 +166,7 @@ jobs:
needs: Upload
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Creat trigger.txt
run: |
echo ${GITHUB_SHA} &> trigger.txt
diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml
index 9259cdf50..1d52a1375 100644
--- a/.github/workflows/build_all_the_things.yml
+++ b/.github/workflows/build_all_the_things.yml
@@ -32,17 +32,31 @@ jobs:
- tasmota-minimal
- tasmota-sensors
- tasmota-zbbridge
+ - tasmota32-zbbrdgpro
- tasmota-zigbee
- tasmota32
- tasmota32-webcam
- tasmota32-bluetooth
- tasmota32-core2
+ - tasmota32-nspanel
- tasmota32-display
- tasmota32-ir
- tasmota32-lvgl
- - tasmota32s2
- tasmota32c3
+ - tasmota32c3cdc
+ - tasmota32s2
+ - tasmota32s2cdc
+ - tasmota32s3
+ - tasmota32s3cdc
- tasmota32solo1
+ - tasmota32solo1-safeboot
+ - tasmota32-safeboot
+ - tasmota32c3-safeboot
+ - tasmota32c3cdc-safeboot
+ - tasmota32s2-safeboot
+ - tasmota32s2cdc-safeboot
+ - tasmota32s3-safeboot
+ - tasmota32s3cdc-safeboot
steps:
- uses: actions/checkout@v2
- name: Set up Python
diff --git a/.github/workflows/copy_change.yml b/.github/workflows/copy_change.yml
index 4840853cb..1306ccd50 100644
--- a/.github/workflows/copy_change.yml
+++ b/.github/workflows/copy_change.yml
@@ -12,6 +12,7 @@ jobs:
copy_change:
runs-on: ubuntu-latest
+ if: github.repository == 'arendst/Tasmota'
steps:
- uses: actions/checkout@v2
- name: Push I2CDevices.md to https://github.com/Tasmota/docs
diff --git a/.gitignore b/.gitignore
index 2dbf50516..1dd51a787 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,14 +19,10 @@ data
unpacked_fs
tasmota/user_config_override.h
build
-build_output
+build_output/*
firmware.map
firmware.asm
tasmota/tasmota.ino.cpp
-tasmota*.bin
-tasmota*.bin.gz
-tasmota*.map
-tasmota*.map.gz
platformio_override.ini
platformio_tasmota_cenv.ini
diff --git a/.travis.yml.off b/.travis.yml.off
deleted file mode 100644
index 02f97e5b5..000000000
--- a/.travis.yml.off
+++ /dev/null
@@ -1,47 +0,0 @@
-language: python
-python:
- - '3.7'
-sudo: false
-install:
- - pip install -U platformio
- - platformio upgrade --dev
- - platformio update
-
-cache: false
-
-env:
- - ENV=tasmota
- - ENV=tasmota-minimal
- - ENV=tasmota-lite
- - ENV=tasmota-knx
- - ENV=tasmota-sensors
- - ENV=tasmota-display
- - ENV=tasmota-ir
- - ENV=tasmota-BG
- - ENV=tasmota-BR
- - ENV=tasmota-CN
- - ENV=tasmota-CZ
- - ENV=tasmota-DE
- - ENV=tasmota-ES
- - ENV=tasmota-FR
- - ENV=tasmota-GR
- - ENV=tasmota-HE
- - ENV=tasmota-HU
- - ENV=tasmota-IT
- - ENV=tasmota-KO
- - ENV=tasmota-NL
- - ENV=tasmota-PL
- - ENV=tasmota-PT
- - ENV=tasmota-RO
- - ENV=tasmota-RU
- - ENV=tasmota-SE
- - ENV=tasmota-SK
- - ENV=tasmota-TR
- - ENV=tasmota-TW
- - ENV=tasmota-UK
- - ENV=tasmota-VN
-
-script:
- - platformio run -e $ENV
-before_deploy:
- - for file in .pioenvs/*/firmware.bin; do cp $file ${file%/*}.bin; done
diff --git a/BUILDS.md b/BUILDS.md
index 44b82d93a..89f522bce 100644
--- a/BUILDS.md
+++ b/BUILDS.md
@@ -65,6 +65,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up
| USE_MY92X1 | - | x / - | x | x | - | x |
| USE_SM16716 | - | x / - | x | x | - | x |
| USE_SM2135 | - | x / - | x | x | - | x |
+| USE_BP5758D | - | x / - | x | x | - | x |
| USE_SONOFF_L1 | - | x / - | x | x | - | x |
| USE_ELECTRIQ_MOODL | - | x / - | x | x | - | x |
| | | | | | | |
@@ -170,6 +171,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up
| USE_HDC2010 | - | - / - | - | - | - | - |
| USE_PCF85363 | - | - / - | - | - | - | - |
| USE_DS3502 | - | - / - | - | - | - | - |
+| USE_HYT | - | - / - | - | - | - | - |
| | | | | | | |
| Feature or Sensor | l | t | k | s | i | d | Remarks
| USE_SPI | - | - / - | - | - | - | x |
@@ -216,6 +218,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up
| USE_HRE | - | - / x | - | x | - | - |
| USE_A4988_STEPPER | - | - / - | - | - | - | - |
| USE_NEOPOOL | - | - / - | - | - | - | - |
+| USE_FLOWRATEMETER | - | - / - | - | - | - | - |
| | | | | | | |
| Feature or Sensor | l | t | k | s | i | d | Remarks
| USE_DISPLAY | - | - / - | - | - | - | x |
@@ -240,6 +243,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up
| USE_MI_ESP32 | | / x | | | | | See SetOption115
| USE_IBEACON_ESP32 | | / - | | | | |
| USE_WEBCAM | | / - | | | | |
-| USE_ETHERNET | | / - | | | | |
+| USE_ETHERNET | | / x | | | | |
| USE_I2S_AUDIO | | / - | | | | |
| USE_TTGO_WATCH | | / - | | | | |
+| USE_SONOFF_SPM | | / x | | | | |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index db69cc688..84e39168f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,64 @@ All notable changes to this project will be documented in this file.
## [Released]
+## [12.0.0] 20220615
+- Release Paul
+
+## [11.1.0.4] 20220615
+### Added
+- Support for HYTxxx temperature and humidity sensor (#15715)
+- Support for Sensirion SHT4X using define USE_SHT3X (#15349)
+- Command ``SSerialSend9 1`` to enable Serial Bridge console Tee for debugging purposes
+- Command ``SetOption142 1`` to wait 1 second for wifi connection solving some FRITZ!Box modem issues (#14985)
+
+### Changed
+- Restructured tasmota source directories taking benefit from PlatformIO Core v6.0.2
+- ESP32 increase Serial Bridge input buffer from 130 to 520 characters
+
+### Fixed
+- ESP32 Arduino Core WiFi timeout is changed from msec to seconds
+- Reduce blocking by adding WifiPollDns before resolving NTP and/or MQTT server names (#14394)
+- SHT1X driver hangs and wrong values on ESP32 (#15790)
+
+## [11.1.0.3] 20220602
+### Added
+- Support for Sonoff SPM v1.2.0
+- Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger (#15701)
+- Command ``SspmDisplay 2`` to display Sonoff SPM energy data in GUI for user tab-selected relay modules (#13447)
+- Command ``SetOption141 1`` to disable display of module name in GUI header
+- Support for 5-channel light dimmer driver BP5758D used in Tuya bulbs (#15713)
+
+### Fixed
+- Possible pin output toggle after power on (#15630)
+
+## [11.1.0.2] 20220514
+### Added
+- ESP32 Command ``Restart 3`` to switch between SafeBoot and Production
+
+### Changed
+- Prepare to remove dedicated Home Assistant discovery in favour of Tasmota Discovery and hatasmota
+- ESP32 Tasmota SafeBoot with changed partition scheme allowing larger binaries
+
+## [11.1.0.1] 20220504
+### Added
+- Support for Sonoff MS01 soil moisture sensor (#15335)
+- Support for daisy chaining MAX7219 displays (#15345)
+- Support for light schemes via DDP as default for ESP32x (#15436)
+- Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515)
+- Sonoff SPM delayed SetPowerOnState (#13447)
+- Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350)
+- Support for flowrate meters like YF-DN50 and similary (#15474)
+- Command ``IfxRp ""|`` adds optional InfluxDb Retention Policy (#15513)
+- Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) (#15530)
+
+### Fixed
+- SCD40 start low power command (#15361)
+- Improv initial or erase device installation failing to provide Configure WiFi option
+- BL09xx negative power presentation (#15374)
+
+### Removed
+- Arduino IDE support
+
## [11.1.0] 20220413
- Release Ostara
diff --git a/CODE_OWNERS.md b/CODE_OWNERS.md
new file mode 100644
index 000000000..bff3b2d2a
--- /dev/null
+++ b/CODE_OWNERS.md
@@ -0,0 +1,97 @@
+
+
+# Code Owners
+
+In addition to @arendst the following code is mainly owned by:
+
+| Code | Owner
+|----------------------------|---------------------------
+| Tasmota Drivers |
+| |
+| xdrv_01_webserver | @arendst
+| xdrv_02_mqtt | @arendst
+| xdrv_03_energy | @arendst
+| xdrv_04_light | @s-hadinger
+| xdrv_05_irremote | @s-hadinger
+| xdrv_06_snfbridge | @arendst
+| xdrv_07_domoticz | @arendst
+| xdrv_08_serial_bridge | Dániel Zoltán Tolnai
+| xdrv_09_timers | @arendst
+| xdrv_10_rules | @arendst, @barbudor
+| xdrv_10_scripter | @gemu
+| xdrv_11_knx | @adrian
+| xdrv_12_discovery | @arendst, @effelle, @emontnemery
+| xdrv_13_display | @gemu, @s-hadinger
+| xdrv_14_mp3 | @gemu, @mike2nl
+| xdrv_15_pca9685 | Andre Thomas
+| xdrv_16_tuyamcu | @btsimonh
+| xdrv_17_rcswitch |
+| xdrv_18_armtronix_dimmers | @wvdv2002
+| xdrv_19_pz16dz_dimmer | Joel Stein
+| xdrv_20_hue | @s-hadinger
+| xdrv_21_wemo | @s-hadinger
+| xdrv_22_sonoff_ifan | @arendst
+| xdrv_23_zigbee | @s-hadinger
+| xdrv_24_buzzer | @arendst
+| xdrv_25_stepper | Tim Leuscher
+| xdrv_26_ariluxrf | @arendst
+| xdrv_27_shutter | @stefanbode
+| xdrv_28_pcf8574 | @stefanbode
+| xdrv_29_deepsleep | @stefanbode
+| xdrv_30_exs_dimmer | Andreas Schultz
+| xdrv_31_tasmota_client | Andre Thomas
+| xdrv_32_hotplug | @BASM
+| xdrv_33_nrf24l01 | @staars
+| xdrv_34_wemos_motor | Peter Franck
+| xdrv_35_pwm_dimmer | Paul C Diem
+| xdrv_36_keeloq | he-so
+| xdrv_37_sonoff_d1 | @arendst
+| xdrv_38_ping | @s-hadinger
+| xdrv_39_thermostat | Javier Argita
+| xdrv_40_telegram | @arendst
+| xdrv_41_tcp_bridge | @s-hadinger
+| xdrv_42_i2s_audio | @gemu
+| xdrv_43_mlx90640 | @staars
+| xdrv_44_miel_hvac | David GWynne
+| xdrv_45_shelly_dimmer | James Turton
+| xdrv_46_ccloader | @staars
+| xdrv_47_ftc532 | Peter Franck
+| xdrv_48_timeprop | Colin Law, Thomas Herrmann
+| xdrv_49_pid | Colin Law, Thomas Herrmann
+| xdrv_50_filesystem | @gemu, @barbudor
+| xdrv_51_bs814a2 | Peter Franck
+| xdrv_52_berry | @s-hadinger
+| xdrv_53_projector_ctrl | Jan Bubík
+| xdrv_54_lvgl | @s-hadinger
+| xdrv_55_touch | @gemu, @s-hadinger
+| xdrv_56_rtc_chips | @arendst, @s-hadinger
+| xdrv_57_tasmesh | @staars
+| xdrv_58_range_extender | @sillyfrog
+| xdrv_59_influxdb | @arendst
+| xdrv_60_shift595 | Jacek Ziółkowski
+| xdrv_61_ds3502 | f-reiling
+| xdrv_62_improv | @arendst
+| xdrv_79_esp32_ble | @staars, @btsimonh
+| xdrv_81_esp32_webcam | @gemu, @philrich
+| xdrv_82_esp32_ethernet | @arendst
+| xdrv_83_esp32_watch | @gemu
+| xdrv_85_esp32_ble_eq3_trv | @btsimonh
+| xdrv_86_esp32_sonoff_spm | @arendst
+| |
+| Tasmota Sensors |
+| |
+| xsns_01_counter | @arendst, @stefanbode
+| xsns_78_ezo | Christopher Tremblay
+| |
+| Libraries |
+| |
+| berry | @s-hadinger
+| ext-printf | @s-hadinger
+| jsmn | @s-hadinger
+| unishox | @s-hadinger
+| |
+| PlatformIO |
+| |
+| all | @Jason2866
+| |
+
diff --git a/I2CDEVICES.md b/I2CDEVICES.md
index cb3d0ab83..59bc03065 100644
--- a/I2CDEVICES.md
+++ b/I2CDEVICES.md
@@ -31,7 +31,8 @@ Index | Define | Driver | Device | Address(es) | Description
13 | USE_ADS1115 | xsns_12 | ADS1115 | 0x48 - 0x4B | 4-channel 16-bit A/D converter
14 | USE_INA219 | xsns_13 | INA219 | 0x40 - 0x41, 0x44 - 0x45 | Low voltage current sensor
15 | USE_SHT3X | xsns_14 | SHT3X | 0x44 - 0x45 | Temperature and Humidity sensor
- 15 | USE_SHT3X | xsns_14 | SHTC3 | 0x70 | Temperature and Humidity sensor
+ 15 | USE_SHT3X | xsns_14 | SHT4X | 0x44 - 0x45 | Temperature and Humidity sensor
+ 15 | USE_SHT3X | xsns_14 | SHTCX | 0x70 | Temperature and Humidity sensor
16 | USE_TSL2561 | xsns_16 | TSL2561 | 0x29, 0x39, 0x49 | Light intensity sensor
17 | USE_MGS | xsns_19 | Grove | 0x04 | Multichannel gas sensor
18 | USE_SGP30 | xsns_21 | SGP30 | 0x58 | Gas (TVOC) and air quality sensor
@@ -101,3 +102,4 @@ Index | Define | Driver | Device | Address(es) | Description
65 | USE_ADE7880 | xnrg_23 | ADE7880 | 0x38 | Energy monitor
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
diff --git a/MODULES.md b/MODULES.md
index b66d3dead..8a30d0ad3 100644
--- a/MODULES.md
+++ b/MODULES.md
@@ -94,4 +94,4 @@ Module | LCode | Description
06 TTGO Watch | x | TTGO Watch
07 M5Stack Core2 | x | M5Stack Core2
-Over 2300 additional devices are supported using [templates](TEMPLATES.md).
+Over 2370 additional devices are supported using [templates](TEMPLATES.md).
diff --git a/README.md b/README.md
index aad266191..6d315a80d 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@

Alternative firmware for [ESP8266](https://en.wikipedia.org/wiki/ESP8266) and [ESP32](https://en.wikipedia.org/wiki/ESP32) based devices with **easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX**.
-_Written for PlatformIO with limited support for Arduino IDE._
+_Written for PlatformIO._
[](http://ota.tasmota.com/tasmota/release)
[](https://github.com/arendst/Tasmota/releases/latest)
@@ -17,7 +17,7 @@ _Written for PlatformIO with limited support for Arduino IDE._
## Easy install
-Easy initial installation of Tasmota can be performed using the [Tasmota WebInstaller](https://arendst.github.io/Tasmota-firmware/).
+Easy initial installation of Tasmota can be performed using the [Tasmota WebInstaller](https://tasmota.github.io/install/).
If you like **Tasmota**, give it a star, or fork it and contribute!
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index ec69b7c19..aa09ba62f 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -33,9 +33,9 @@ While fallback or downgrading is common practice it was never supported due to S
This release will be supported from ESP8266/Arduino library Core version **2.7.4.9** due to reported security and stability issues on previous Core version. This will also support gzipped binaries.
-This release will be supported from ESP32/Arduino library Core version **2.0.2.1**.
+This release will be supported from ESP32/Arduino library Core version **2.0.3**.
-Support of ESP8266 Core versions before 2.7.4.9 and ESP32 Core versions before 2.0.2 have been removed.
+Support of ESP8266 Core versions before 2.7.4.9 and ESP32 Core versions before 2.0.3 have been removed.
## Support of TLS
@@ -72,29 +72,32 @@ Latest released binaries can be downloaded from
- http://ota.tasmota.com/tasmota/release
Historical binaries can be downloaded from
-- http://ota.tasmota.com/tasmota/release-11.1.0
+- http://ota.tasmota.com/tasmota/release-12.0.0
The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz``
-### ESP32 based
+### ESP32, ESP32-C3, ESP32-S2 and ESP32-S3 based
The following binary downloads have been compiled with ESP32/Arduino library core version **2.0.3**.
- **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY**
-- **tasmota32c3.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3 and 4M+ flash.
+- **tasmota32xy.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3/S2/S3 and 4M+ flash.
+- **tasmota32xycdc.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3/S2/S3 with serial over embedded USB CDC only and 4M+ flash.
- **tasmota32solo1.bin** = The Tasmota version with most drivers including additional sensors and KNX for single core ESP32 and 4M+ flash.
- **tasmota32-AF.bin** to **tasmota32-VN.bin** = The Tasmota version in different languages for 4M+ flash.
-- **tasmota32-ir.bin** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features for 4M+ flash.
-- **tasmota32-display.bin** = The Display version without Energy Monitoring but adds display support for 4M+ flash.
-- **tasmota32-lvgl.bin** = The LVGL version adds Light and Versatile Graphics Library (LVGL) display support for 4M+ flash.
-- **tasmota32-webcam.bin** = The Webcam version adds webcam support for 4M+ flash.
- **tasmota32-bluetooth.bin** = The Bluetooth version adds BLE support for 4M+ flash.
+- **tasmota32-display.bin** = The Display version without Energy Monitoring but adds display support for 4M+ flash.
+- **tasmota32-ir.bin** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features for 4M+ flash.
+- **tasmota32-lvgl.bin** = The LVGL version adds Light and Versatile Graphics Library (LVGL) display support for 4M+ flash.
+- **tasmota32-nspanel.bin** = The Sonoff NSPanel Smart Scene Wall Switch version with HASPmota display support.
+- **tasmota32-webcam.bin** = The Webcam version adds webcam support for 4M+ flash.
+- **tasmota32-zbbridgepro.bin** - The Sonoff Zigbee Bridge Pro version with CC2652P firmware load support.
Latest released binaries can be downloaded from
- https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware
- http://ota.tasmota.com/tasmota32/release
Historical binaries can be downloaded from
-- http://ota.tasmota.com/tasmota32/release-11.1.0
+- http://ota.tasmota.com/tasmota32/release-12.0.0
The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota32/release/tasmota32.bin``
@@ -104,65 +107,44 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
[Complete list](BUILDS.md) of available feature and sensors.
-## Changelog v11.1.0 Ostara
+## Changelog v12.0.0 Paul
### Added
-- Command ``SetOption135 1`` to disable LVGL splash screen
-- Command ``SetOption136 1`` to disable single sensor reports from Tuya devices while keeping teleperiod reports [#15216](https://github.com/arendst/Tasmota/issues/15216)
-- Command ``SetOption137 1`` to avoid MQTT publish of defined Tuya CMDs if SO66 is active [#15267](https://github.com/arendst/Tasmota/issues/15267)
-- Command ``SetOption138 1`` to switch GUI energy multi-column layout from left/center (0) to right (1) align [#15342](https://github.com/arendst/Tasmota/issues/15342)
-- Command ``SspmMap 0`` to reset Sonoff SPM default mapping
-- Command ``TcpConnect `` to add client connection mode [#14874](https://github.com/arendst/Tasmota/issues/14874)
-- Command ``RfTimeout 100..60000`` to disable duplicate RfReceive. Default 1000 [#15061](https://github.com/arendst/Tasmota/issues/15061)
-- Command ``IfxSensor 1`` to send non-teleperiod data to influxdb
-- Commands ``Sensor12 D0 .. D5, S0 .. S5`` allowing differential or single-ended modes [#15001](https://github.com/arendst/Tasmota/issues/15001)
-- Command ``Sensor34 10 0|1|`` to set HX711 fixed tare (0 = use auto tare, 1 = use calibrated tare, Any other value is user selected tare)
-- Commands ``Sensor34 11 `` and ``Sensor34 12 `` to use HX711 absolute weight conversion [#15292](https://github.com/arendst/Tasmota/issues/15292)
-- NeoPool commands ``NPpHMin``, ``NPpHMax``, ``NPpH``, ``NPRedox``, ``NPHydrolysis``, ``NPIonization``, ``NPChlorine`` and ``NPControl`` [#15015](https://github.com/arendst/Tasmota/issues/15015)
-- NeoPool system voltages display
-- TasmotaSerial implement ``end()``
-- Support for improv as used by esp-web-tools
-- Support for up to four DS3502 digital potentiometers with command ``Wiper 0..127``
-- Support for ADE7880 3 phase energy monitor as used in Shelly 3EM [#13515](https://github.com/arendst/Tasmota/issues/13515)
-- Support for PCF85363 RTC as used in Shelly 3EM [#13515](https://github.com/arendst/Tasmota/issues/13515)
-- Full RTC chip integration and synchronisation when using UBX (=GPS), NTP or manual time
-- NeoPool JSON modules, power module, cell info, chlorine, conductivity and ionization
-- ESP32 Berry always enable rules
-- ESP32 Berry bootloop protection
-- ESP32 Support for OpenHASP v1.0 by Stephan Hadinger [#15307](https://github.com/arendst/Tasmota/issues/15307)
-- ESP32 support for BLE Mi scale V1 [#13517](https://github.com/arendst/Tasmota/issues/13517)
-- ESP32 integrate Homekit in Bluetooth binary [#14818](https://github.com/arendst/Tasmota/issues/14818)
-- ESP32 Berry virtual Alexa hue device [#14833](https://github.com/arendst/Tasmota/issues/14833)
-- ESP32 TasmotaSerial uart mapping to support multiple ``begin()`` and implement ``getUart()`` [#14981](https://github.com/arendst/Tasmota/issues/14981)
+- Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350)
+- Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530)
+- Command ``SetOption141 1`` to disable display of module name in GUI header
+- Command ``SetOption142 1`` to wait 1 second for wifi connection solving some FRITZ!Box modem issues [#14985](https://github.com/arendst/Tasmota/issues/14985)
+- Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only [#13515](https://github.com/arendst/Tasmota/issues/13515)
+- Command ``IfxRp ""|`` adds optional InfluxDb Retention Policy [#15513](https://github.com/arendst/Tasmota/issues/15513)
+- Command ``SspmDisplay 2`` to display Sonoff SPM energy data in GUI for user tab-selected relay modules [#13447](https://github.com/arendst/Tasmota/issues/13447)
+- Command ``SSerialSend9 0/1`` to enable Serial Bridge console Tee for debugging purposes
+- Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335)
+- Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345)
+- Support for Sensirion SHT4X using define USE_SHT3X [#15349](https://github.com/arendst/Tasmota/issues/15349)
+- Support for Sonoff SPM v1.2.0
+- Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger [#15701](https://github.com/arendst/Tasmota/issues/15701)
+- Support for Sonoff NSPanel Smart Scene Wall Switch
+- Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474)
+- Support for 5-channel light dimmer driver BP5758D used in Tuya bulbs [#15713](https://github.com/arendst/Tasmota/issues/15713)
+- Support for HYTxxx temperature and humidity sensor [#15715](https://github.com/arendst/Tasmota/issues/15715)
+- Sonoff SPM delayed SetPowerOnState [#13447](https://github.com/arendst/Tasmota/issues/13447)
+- ESP32 Command ``Restart 3`` to switch between SafeBoot and Production
### Breaking Changed
-- Remove support for Internet Explorer by allowing ECMAScript6 syntax using less JavaScript code bytes [#15280](https://github.com/arendst/Tasmota/issues/15280)
### Changed
-- Adafruit BusIO library from v1.0.10 to v1.11.0
-- TasmotaSerial library from v3.4.0 to v3.5.0 [#14981](https://github.com/arendst/Tasmota/issues/14981)
-- Sonoff SPM increase max number of relays supported to 32 (8 SPM-4Relay modules)
-- Extent number of pulsetimers from 8 to 32 [#8266](https://github.com/arendst/Tasmota/issues/8266)
-- Consolidate three RTC chip drivers (DS3231, BM8563, PCF85363) into one driver updating RTC as soon as possible after restart
-- DS3231 I2C address define ``USE_RTC_ADDR`` into ``DS3231_ADDRESS``
-- Display of energy values in GUI use columns when define ``USE_ENERGY_COLUMN_GUI`` is enabled (default)
-- ESP8266 Shrinked tasmota-minimal.bin by removing all commands except ``Upgrade``, ``Upload``, ``OtaUrl``, ``Seriallog``, ``Weblog`` and ``Restart``
-- ESP32 Arduino core from v2.0.2.2 to v2.0.3
-- ESP32 LVGL library from v8.1.0 to v8.2.0
-- ESP32 NimBLE library from v1.3.3 to v1.3.6
-- ESP32 update the internal Berry type system to sync with Skiars Berry repository. No expected impact on code, but .bec files need to be generated again [#14811](https://github.com/arendst/Tasmota/issues/14811)
+- Restructured tasmota source directories taking benefit from PlatformIO Core v6.0.2
+- Prepare to remove dedicated Home Assistant discovery in favour of Tasmota Discovery and hatasmota
+- ESP32 Tasmota SafeBoot with changed partition scheme allowing larger binaries
+- ESP32 increase Serial Bridge input buffer from 130 to 520 characters
### Fixed
-- SSPM energy yesterday when zero
-- NeoPool NPBit and NPRead/NPReadL output
-- HX711 false readings by removing large deviations
-- GPIO OptionE1 selection regression [#14821](https://github.com/arendst/Tasmota/issues/14821)
-- BL0939, BL0940 and BL0942 energy monitoring buffer miscompares resulting in wrong daily energy values regression from v9.5.0.8 [#14829](https://github.com/arendst/Tasmota/issues/14829)
-- Wiegand 34-bit rfid reading and presentation [#14834](https://github.com/arendst/Tasmota/issues/14834)
-- Orno WE517 power meter phase 2 current reactive [#14841](https://github.com/arendst/Tasmota/issues/14841)
-- TasMesh relaunch wifi on esp_now_init failure [#15334](https://github.com/arendst/Tasmota/issues/15334)
-- ESP32 save settings after OTA upload regression from v10.0.0.3
-- ESP32 PowerOnState [#15084](https://github.com/arendst/Tasmota/issues/15084)
+- Improv initial or erase device installation failing to provide Configure WiFi option
+- SCD40 start low power command [#15361](https://github.com/arendst/Tasmota/issues/15361)
+- BL09xx negative power presentation [#15374](https://github.com/arendst/Tasmota/issues/15374)
+- Possible pin output toggle after power on [#15630](https://github.com/arendst/Tasmota/issues/15630)
+- Reduce blocking by adding WifiPollDns before resolving NTP and/or MQTT server names [#14394](https://github.com/arendst/Tasmota/issues/14394)
+- SHT1X driver hangs and wrong values on ESP32 [#15790](https://github.com/arendst/Tasmota/issues/15790)
+- ESP32 Arduino Core WiFi timeout is changed from msec to seconds
### Removed
-- Command ``Sensor33`` and replaced by ``RtcNtpserver``
-- Command ``Sensor34 7`` as now active tare is persistent resulting in calculated current weight
+- Arduino IDE support
diff --git a/TEMPLATES.md b/TEMPLATES.md
index 55f6c0b09..f2791417d 100644
--- a/TEMPLATES.md
+++ b/TEMPLATES.md
@@ -2,7 +2,7 @@
# Templates
-Find below the available templates as of April 2022. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)
+Find below the available templates as of June 2022. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)
## Addressable LED
```
@@ -140,6 +140,11 @@ Wipro Garnet NS9100 810lm {"NAME":"Wipro 9W CCT","GPIO":[0,0,0,0,0,416,0,0,0,
Wyze A19 800lm {"NAME":"Wyze Bulb","GPIO":[5728,0,0,0,0,0,0,0,0,416,417,0,0,0],"FLAG":0,"BASE":48}
```
+## Camera
+```
+M5Stack PSRAM Timer Camera (OV3660) {"NAME":"M5STACK CAM","GPIO":[0,0,0,0,0,5091,1,0,0,0,0,4960,1,0,5093,5095,0,5184,5120,5056,0,5024,5152,4992,0,0,0,0,5088,0,5090,5089,5094,0,0,5092],"FLAG":0,"BASE":2}
+```
+
## Ceiling Light
```
BAZZ 14" RGBCCT {"NAME":"WF19129W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
@@ -187,6 +192,7 @@ Zemismart Door Window {"NAME":"Zemismart","GPIO":[1,2272,1,2304,1,1,0,0,1
## Curtain Module
```
+BlitzWolf {"NAME":"BlitzWolf SS6 2 Gang","GPIO":[0,0,32,0,480,0,0,0,161,160,224,225,0,0],"FLAG":0,"BASE":18}
LoraTap In-Wall {"NAME":"SC500W","GPIO":[0,0,0,576,160,161,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18}
LoraTap In-Wall {"NAME":"SC511WSC","GPIO":[0,1,0,320,32,34,0,0,224,33,226,225,0,0],"FLAG":0,"BASE":18}
MS-108 In-Wall {"NAME":"MS-108","GPIO":[0,0,0,0,161,160,0,0,224,0,225,0,0,0],"FLAG":0,"BASE":18}
@@ -194,11 +200,6 @@ MS-108WR RF Curtain Module {"NAME":"MS-108WR","GPIO":[1,1,1,544,32,33,1,1,225,
QS-WIFI-C01-RF {"NAME":"Shutter-QS-WIFI-C01","GPIO":[0,0,1,0,288,0,0,0,32,33,224,225,0,0],"FLAG":0,"BASE":18}
```
-## Curtain Motor
-```
-Steren {"NAME":"Steren_SHOME-155","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54,"CMND":"SO54 1|SO20 1|TuyaMCU 61,1|TuyaMCU 21,2|TuyaMCU 27,3|TuyaMCU 97,5|TuyaMCU 11,6|TuyaMCU 62,7|TuyaMCU 63,8|TuyaMCU 81,9|TuyaMCU 98,10|TuyaMCU 82,11"}
-```
-
## Curtain Switch
```
Anccy {"NAME":"Anccy Shutter","GPIO":[544,0,289,34,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18}
@@ -215,6 +216,7 @@ LoraTap SC411WSC-EU RF Remote {"NAME":"Loratap","GPIO":[0,0,0,34,226,32,0,0,33,
Maxcio WF-CS01 {"NAME":"Maxcio","GPIO":[544,0,289,162,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18}
Moes RF {"NAME":"Moes WS-EUR-CW","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
SCS86-03AJAI {"NAME":"ESE86-03AJAI","GPIO":[544,227,289,34,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18}
+Teekar 3rd Generation {"NAME":"Teekar-Tag","GPIO":[0,0,0,32,33,34,0,0,225,0,226,0,224,0],"FLAG":0,"BASE":18}
Teekar SYS-CS 01 {"NAME":"Teekar-Tag","GPIO":[320,0,544,33,225,162,0,0,0,224,321,258,32,0],"FLAG":0,"BASE":18}
Teepao {"NAME":"Teepao","GPIO":[576,322,226,33,225,34,0,0,320,224,321,0,32,0],"FLAG":0,"BASE":18}
WF-CS01 {"NAME":"ShutterSwitch","GPIO":[544,227,289,34,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18,"CMND":"Rule1 1"}
@@ -246,13 +248,16 @@ Vacplus 50 Pint {"NAME":"VacPlus Dehumidifier","GPIO":[0,0,0,0,0,0,
## Development Board
```
-Adafruit ESP32 Feather {"NAME":"HUZZAH32","GPIO":[0,0,0,0,4709,0,1,1,1,288,1,1,1,1,0,1,0,0,608,640,0,4705,4704,1,0,0,0,0,1,1,4706,4710,4708,0,0,4707],"FLAG":0,"BASE":1}
-Adafruit HUZZAH {"NAME":"Huzzah","GPIO":[32,0,320,0,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":18}
+Adafruit ESP32 Feather V2 {"NAME":"HUZZAH32v2","GPIO":[1376,0,3840,0,1,1,0,0,1,1,1,1,0,0,0,1,608,1,640,0,0,1,1,1,0,1,1,0,1,1,1,4704,1,1,0,1],"FLAG":0,"BASE":1}
+Adafruit HUZZAH ESP8266 {"NAME":"Huzzah","GPIO":[32,0,320,0,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":18}
+Adafruit HUZZAH32 ESP32 Feather {"NAME":"HUZZAH32","GPIO":[0,0,0,0,4709,0,1,1,1,288,1,1,1,1,0,1,0,0,608,640,0,4705,4704,1,0,0,0,0,1,1,4706,4710,4708,0,0,4707],"FLAG":0,"BASE":1}
+Adafruit QT Py ESP32 Pico {"NAME":"QTPy ESP32 Pico","GPIO":[32,3200,0,3232,1,1376,0,0,1,1,1,1,0,0,0,608,0,0,640,0,0,1,1,1,0,1,3840,0,1,1,0,0,0,0,0,0],"FLAG":0,"BASE":1}
Ai-Thinker Camera {"NAME":"AITHINKER CAM","GPIO":[4992,1,672,1,416,5088,1,1,1,6720,736,704,1,1,5089,5090,0,5091,5184,5152,0,5120,5024,5056,0,0,0,0,4928,576,5094,5095,5092,0,0,5093],"FLAG":0,"BASE":2}
AZ-Envy Environmental Sensor {"NAME":"AZ Envy","GPIO":[32,0,320,0,640,608,0,0,0,0,0,0,0,4704],"FLAG":0,"BASE":18}
ESP32 Lite V1.0.0 {"NAME":"ESP32 Lite V1.0.0","GPIO":[1,0,1,0,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0],"FLAG":0,"BASE":1}
Freenove ESP32-WROVER.DEV Camera {"NAME":"Freenove-WROVER-Cam","GPIO":[1,1,1,1,5088,5089,0,0,1,1,1,1,1,1,5090,5091,1,4992,5184,5152,1,5120,5024,5056,0,0,0,0,1,1,5094,5095,5092,1,1,5093],"FLAG":0,"BASE":1}
LC Technology MicroPython Maker {"NAME":"LC-ESP-Python","GPIO":[1,1,544,1,1,1,1,1,1,1,1,1,1,1],"FLAG":0,"BASE":18}
+LilyGO RGB LED Ring Encoder {"NAME":"T-Encoder","GPIO":[0,0,1,0,1,0,0,0,1,1,1,1,0,0,0,480,6212,0,0,0,0,449,450,448,0,0,0,0,0,0,0,0,3296,3264,32,0],"FLAG":0,"BASE":1,"CMND":"BuzzerPwm 1"}
LilyGO T7 v1.5 {"NAME":"LilyGO T7 V1.5","GPIO":[1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,544,0,0,0,1,0,1,1,1,0,0,0,0,0,1,1,4704,1,0,0,1],"FLAG":0,"BASE":1}
LilyGO TTGO ESP32 Ethernet {"NAME":"T-Internet-POE v1.2","GPIO":[0,1,1,1,1,1,1,1,1,1,1,1,1,1,5600,1,0,1,1,5568,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1,"CMND":"EthType 0|EthClockMode 1|EthAddress 0"}
M5Stack Atom Lite ESP32 {"NAME":"M5Stack Atom Lite","GPIO":[1,1,1,1,1,1,1,1,1056,1,1,1,1,1,1,1,0,1,1,1,0,1,640,1376,0,0,0,0,608,1,1,1,1,0,0,32],"FLAG":0,"BASE":1}
@@ -374,7 +379,9 @@ Maxcio Rotary {"NAME":"EDM-1WAA-EU","GPIO":[1,1,1,1,1,1,0,0,1,1,1
Minoston 3-Way {"NAME":"MS10W","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54}
Moes {"NAME":"MOES DS01","GPIO":[1,1,1,1,1,1,0,0,1,2304,1,2272,1,0],"FLAG":0,"BASE":54}
PS-16-DZ {"NAME":"PS-16-DZ","GPIO":[1,3200,1,3232,1,1,0,0,1,288,1,1,1,0],"FLAG":0,"BASE":58}
+Stitch {"NAME":"Stitch 35558","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 21,3|DimmerRange 21,255"}
Teekar UIW001-1 {"NAME":"Teekar UIW001-","GPIO":[0,3232,416,3200,640,608,0,0,160,0,0,0,0,0],"FLAG":0,"BASE":18}
+Tessan 3 Way {"NAME":"Tessan-STD02","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"SO97 | TuyaMCU 11,1 | TuyaMCU 21,2 | DimmerRange 20,255"}
Tessan MJ-SD02 {"NAME":"MJ-SD02","GPIO":[34,33,0,323,576,322,0,0,321,416,320,96,256,0],"FLAG":0,"BASE":73}
TopGreener TGWF500D {"NAME":"TopGreener-Dimmer","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
TreatLife 400W {"NAME":"DS02S Dimmer","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
@@ -414,9 +421,10 @@ LilyGO TTGO T-Camera {"NAME":"T-Camera","GPIO":[1,1,1,1,4992,5120,1,1,1,
LilyGO TTGO T-Display 1.14in {"NAME":"ESP32-ttgo-display","GPIO":[0,1,1,1,992,6592,1,1,1,1,1,1,6624,1,896,864,0,1,1,1024,0,1,1,1,0,0,0,0,1,1,1,33,1,0,0,1],"FLAG":0,"BASE":1}
LilyGO TTGO T-Watcher {"NAME":"TTGO T4 v1.3","GPIO":[35,1,672,1,992,1024,1,1,832,768,736,704,1,1,896,0,0,640,608,864,0,0,1,6368,0,0,0,0,6400,1,1,4704,1,32,33,34],"FLAG":0,"BASE":1}
LilyGO TTGO TO ESP8266 OLED SH1106 Weather Station {"NAME":"TTGO T12","GPIO":[1,1,1,1,608,640,0,0,32,34,33,1,1,1],"FLAG":0,"BASE":18}
-Lolin TFT 2.4 Touch Shield Template {"NAME":"Lolin TFT 2.4 Touch Shield","GPIO":[224,225,226,1,1,6400,1,1,1,1,1,1,1,7264,736,672,0,1,992,704,0,1,6368,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
+Lolin TFT 2.4 Touch Shield {"NAME":"Lolin TFT 2.4 Touch Shield","GPIO":[224,225,226,1,1,6400,1,1,1,1,1,1,1,7264,736,672,0,1,992,704,0,1,6368,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
M5Stack Core2 {"NAME":"M5Stack Core 2","GPIO":[6210,1,1,1,6720,768,0,0,0,1,1,800,0,0,736,1,0,641,609,704,0,0,0,1,0,0,0,0,640,608,1,1,1,0,672,0],"FLAG":0,"BASE":1}
M5Stack M5StickC {"NAME":"M5StickC","GPIO":[1,0,0,0,0,768,1056,576,0,736,0,704,0,0,1024,0,0,641,609,800,0,0,1,0,0,0,0,0,640,608,1,0,1,32,6210,33],"FLAG":0,"BASE":1}
+M5Stack Tough {"NAME":"M5Stack Tough","GPIO":[6210,1,1,1,6720,768,0,0,0,1,1,800,0,0,736,1,0,641,609,704,0,0,0,1,0,0,0,0,640,608,1,1,1,0,672,7968],"FLAG":0,"BASE":1}
ODROID-GO Game Kit {"NAME":"ODROID-GO","GPIO":[32,3200,544,3232,608,768,0,0,6210,33,416,640,1,1,736,672,0,800,6720,704,0,0,0,34,0,0,0,0,164,165,3328,3329,4866,0,0,35],"FLAG":0,"BASE":3}
OLED Display Module 0.66" for Wemos D1 Mini {"NAME":"OLED 64x48","GPIO":[1,1,1,1,640,608,0,0,1,1,1,1,1024,1],"FLAG":0,"BASE":18}
Wireless Tag 3.5" Touch {"NAME":"WT32-SC01","GPIO":[6210,1,1,1,1,1,0,0,1,704,736,768,1,1,640,608,1,800,1024,992,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
@@ -477,6 +485,7 @@ Anko HEGSM40 {"NAME":"Anko HEGSM40","GPIO":[0,0,0,0,0,0,0,0,0,23
Arlec 117cm Aurora Digital Tower {"NAME":"ATF4601HA","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54}
Arlec 45cm DC Pedestal {"NAME":"Arlec 45cm Fan","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 11,1 | TuyaMCU 61,2 | TuyaMCU 64,3 | TuyaMCU 99,6 | TuyaMCU 12,101"}
Arlec Smart 45cm Smart DC Wall {"NAME":"Arlec 45cm Fan","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 11,1 | TuyaMCU 61,2 | TuyaMCU 64,3 | TuyaMCU 99,6 | TuyaMCU 12,101"}
+Duux Whisper Flex Battery Pack {"NAME":"Duux DXCF12","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 61,2 | TuyaMCU 62,3 | TuyaMCU 12,4 | TuyaMCU 13,5 | TuyaMCU 64,6"}
Duux Whisper Flex Smart {"NAME":"Duux Fan","GPIO":[0,0,0,0,0,0,0,0,0,0,2304,0,2272,0],"FLAG":0,"BASE":54}
Geek Aire 3D Oscillating Desktop {"NAME":"Geek Aire Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 12,4 | TuyaMCU 13,5"}
Goldair SleepSmart GCPF315 {"NAME":"Goldair Fan","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
@@ -535,6 +544,7 @@ A1 Universal Remote Control {"NAME":"A1 IR Controller","GPIO":[1,1,1,1,320,1088
AI Universal Remote {"NAME":"YTF IR Controller","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
Alfawise KS1 {"NAME":"KS1","GPIO":[1,1792,32,1824,32,1088,0,0,320,0,1056,0,0,4704],"FLAG":0,"BASE":62}
Antsig Universal Remote Controller {"NAME":"Antsig Smart Wi-Fi IR","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
+Automate Things IR Bridge {"NAME":"AT-IRBR-1.4","GPIO":[1088,0,0,0,1056,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
auvisio S06 {"NAME":"NX-4519-675","GPIO":[0,0,0,0,288,1088,0,0,0,0,1056,0,0,0],"FLAG":0,"BASE":18}
Avatto Temperature and Humidity Sensor and {"NAME":"S08Pro","GPIO":[0,640,0,608,288,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":18}
BlitzWolf BW-RC1 {"NAME":"BW-RC1","GPIO":[0,0,0,0,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
@@ -548,6 +558,7 @@ Jinvoo AC/TV Box {"NAME":"Jinvoo IR Controller","GPIO":[1,1,1,1,320,
JS-IR1 Universal Remote {"NAME":"JS-IR1","GPIO":[1,1,1,1,288,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":18}
Lenovo SE-741C {"NAME":"Lenovo IR","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
Mirabella Genio I002577 {"NAME":"Genio IR TxRx","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
+Moes Tuya Remote Control {"NAME":"Moes IR Controller","GPIO":[1,1,1,1,1,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
Nedis Universal Remote Control {"NAME":"Nedis IR Controller","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
NEO Coolcam Remote Controller {"NAME":"Neo Coolcam IR","GPIO":[1,3200,1,3232,576,1088,0,0,320,32,1056,0,0,0],"FLAG":0,"BASE":62}
Nivian Smart Infrared Controller {"NAME":"Nivian NVS-SMARTIR-W2","GPIO":[0,3200,0,3232,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
@@ -557,6 +568,7 @@ RM mini {"NAME":"RM mini","GPIO":[1,1,1,1,320,1088,0,0,0,32
Smartpoint Smart Remote {"NAME":"Smartpoint SPCNTRL-WM","GPIO":[0,0,0,0,288,1088,0,0,0,0,1056,0,0,0],"FLAG":0,"BASE":18}
STITCH {"NAME":"Stitch 35753","GPIO":[0,0,0,0,288,1088,0,0,0,64,1056,0,0,0],"FLAG":0,"BASE":62}
SZMDLX IR Remote Controller {"NAME":"SZMDLX WiFi IR","GPIO":[0,0,0,0,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
+Tellur Remote Control {"NAME":"Tellur TLL331241","GPIO":[0,0,0,0,1056,1088,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
Tuya Smart Remote {"NAME":"IR Controller","GPIO":[1,1,1,1,1,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
UFO R1 Universal Remote {"NAME":"UFO-R1","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
Uniplay Universal Remote {"NAME":"Uniplay IR","GPIO":[1,3200,1,3232,576,1088,0,0,320,32,1056,0,0,0],"FLAG":0,"BASE":62}
@@ -565,7 +577,7 @@ YTF Universal Remote {"NAME":"YTF IR Controller","GPIO":[1,1,1,1,320,108
## IR Gateway
```
-Automate Things IR Bridge {"NAME":"AT-IRBR-1","GPIO":[0,0,0,0,1056,1088,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Automate Things IR Bridge {"NAME":"AT-IRBR-1.0","GPIO":[0,0,0,0,1056,1088,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
```
## Illuminance Sensor
@@ -626,6 +638,7 @@ RGB+CCT 12-24V {"NAME":"WS05","GPIO":[0,0,0,0,0,420,0,0,418,417,41
RGBW 12-24V {"NAME":"*WS04","GPIO":[0,0,0,0,0,0,0,0,417,418,416,419,0,0],"FLAG":0,"BASE":18}
Shelly RGBW2 {"NAME":"Shelly RGBW2","GPIO":[0,0,288,0,419,1,0,0,416,32,418,417,0,0],"FLAG":0,"BASE":18}
Spectrum Smart RGBCCT {"NAME":"Spectrum Smart WOJ+05641","GPIO":[32,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
+Xunata Led Controller High Voltage 110/220V {"NAME":"KL-LED-WIFI-AC","GPIO":[0,0,0,0,0,0,0,0,0,416,0,0,0,0],"FLAG":0,"BASE":18}
ZJ-WF-ESP-A v1.1 {"NAME":"RGB2","GPIO":[0,0,0,0,0,0,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18}
```
@@ -665,6 +678,7 @@ LSC RGBW {"NAME":"LSC RGBW Strip","GPIO":[1088,0,0,0,416,0,0
Lumary RGBCCT {"NAME":"Lumary LED","GPIO":[32,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
Lumary RGBCCT {"NAME":"Lumary LED","GPIO":[32,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
Maxonar Lightstrip Pro XS-SLD001 {"NAME":"Maxonar LED","GPIO":[0,0,0,0,0,416,0,0,418,32,417,0,0,0],"FLAG":0,"BASE":18}
+MegaLight Smart RGB {"NAME":"MegaLight Smart LED-Stripe","GPIO":[0,0,0,0,417,1088,0,0,418,416,0,0,32,0],"FLAG":0,"BASE":18}
Merkury Innovations MI-EW003-999W {"NAME":"MI-EW003-999W ","GPIO":[32,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
Mirabella Genio RGB+CW {"NAME":"MirabellaStrip","GPIO":[32,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18}
Monster Smart IlluminEssence {"NAME":"MI-EW003-999W ","GPIO":[32,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
@@ -728,12 +742,13 @@ Novostella UT88835 20W Flood {"NAME":"Novo 20W Flood","GPIO":[0,0,0,0,416,419,0
Novostella UT88836 20W Flood {"NAME":"Novo 20W Flood","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
Nue Vision Care Desk Lamp {"NAME":"Nue Vision Desk Lamp VC18","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 11,1 | TuyaMCU 21,3 | TuyaMCU 23,4"}
Philips Wiz 24W LED White Batten {"NAME":"PHILIPS-wiz-24w","GPIO":[0,0,0,0,417,0,0,0,0,416,0,0,0,0],"FLAG":0,"BASE":18}
+Polycab Hohm Avenir 20W Batten {"NAME":"PolycabBatten","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,0],"FLAG":0,"BASE":18}
Sonoff {"NAME":"Sonoff BN-SZ","GPIO":[0,0,0,0,0,0,0,0,416,320,0,0,0,0],"FLAG":0,"BASE":22}
Spotlight 9cm RGB+W 7W {"NAME":"Spotlight RGBW","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27}
TCP WPAN Square 600X600mm 36W CCT Panel {"NAME":"TCPsmart LED Panel","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO92 1|DimmerRange 30,100"}
Teckin FL41 {"NAME":"Teckin FL41","GPIO":[0,0,0,0,0,32,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
Wipro 20W LED RGB Batten {"NAME":"Wipro RGBW Tubelight","GPIO":[0,0,0,0,416,420,0,0,417,419,418,0,0,1],"FLAG":0,"BASE":18}
-Wipro Next Smart Batten 20W CCT {"NAME":"WIPROBatten","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,4704],"FLAG":0,"BASE":18}
+Wipro Next Smart Batten 20W CCT {"NAME":"WIPROBatten","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,0],"FLAG":0,"BASE":18}
Xiaomi Mi Computer Monitor Light Bar 1S {"NAME":"Mijia Desk Lamp 1S (MJGJD02YL)","GPIO":[0,0,0,0,3840,0,1,1,0,0,0,0,0,0,0,416,0,417,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"DimmerRange 45,255"}
Xiaomi Mi Desk Lamp Pro {"NAME":"Mi Desk Lamp Pro","GPIO":[6212,0,416,0,417,0,0,0,3840,0,0,0,160,640,608,0,0,0,0,0,0,0,3296,3264,0,0,0,0,0,32,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"DimmerRange 30,100"}
Xiaomi Mi LED Desk Lamp 1S {"NAME":"Mi LED Desk Lamp 1S","GPIO":[6212,0,416,0,417,0,0,0,3840,0,0,0,160,640,608,0,0,0,0,0,0,0,3264,3296,0,0,0,0,0,32,0,0,0,0,0,0],"FLAG":3,"BASE":66,"CMND":"DimmerRange 30,100|Fade 1|PowerOnFade 1|Speed 2"}
@@ -751,7 +766,7 @@ Digital Body Fat Scale {"NAME":"TuyaScale","GPIO":[0,2272,0,2304,0,0,0,0,0
Dual-Pump Automatic Watering System {"NAME":"WD-01ADE","GPIO":[32,0,0,0,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":18}
EaryKong Doorbell {"NAME":"Doorbell","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
electriQ 10000 BTU Wall Mounted Heat Pump Air Conditioner {"NAME":"electriQ IQOOL-SMART12HP","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
-Eufy RoboVac C30 Robot Vacuum {"NAME":"Eufy Robovac","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 11,2 | TuyaMCU 12,101 | TuyaMCU 13,103"}
+Eufy RoboVac C30 Robot Vacuum {"NAME":"Eufy Robovac","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 11,2 | TuyaMCU 12,101 | TuyaMCU 13,103 | SetOption97 1"}
Fujin Irrigation Timer {"NAME":"Fujin FJKB022-B4","GPIO":[0,0,0,0,32,0,0,0,288,0,224,0,0,0],"FLAG":0,"BASE":18}
iLONDA Fish Feeder {"NAME":"Feeder","GPIO":[0,0,0,0,32,320,0,0,352,0,224,0,0,0],"FLAG":0,"BASE":18}
Kogan 4.1kW Portable Air Conditioner (Reverse Cycle) {"NAME":"Kogan Panel Heater","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
@@ -796,6 +811,7 @@ Tuya Alarm PIR {"NAME":"CT61W","GPIO":[0,0,0,0,0,0,0,0,0,160,480,2
## Motor
```
+Steren Curtain {"NAME":"Steren_SHOME-155","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54,"CMND":"SO54 1|SO20 1|TuyaMCU 61,1|TuyaMCU 21,2|TuyaMCU 27,3|TuyaMCU 97,5|TuyaMCU 11,6|TuyaMCU 62,7|TuyaMCU 63,8|TuyaMCU 81,9|TuyaMCU 98,10|TuyaMCU 82,11"}
Zemismart BCM300D-TY {"NAME":"Zemistart_Curt","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
Zemismart Blinds Controller {"NAME":"Zemismart Blind","GPIO":[1,1,1,1,1,1,0,0,1,2304,1,2272,1],"FLAG":0,"BASE":54}
Zemismart Curtain {"NAME":"Zemismart_Curt","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
@@ -859,6 +875,7 @@ Merkury {"NAME":"Merkury Switch","GPIO":[0,0,0,0,32,0,0,0,0
Minoston MP22W {"NAME":"Minoston MP22W","GPIO":[0,0,0,0,320,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
Nedis PO120 IP44 {"NAME":"WIFIPO120FWT","GPIO":[32,0,0,0,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49}
Obi Stecker IP44 {"NAME":"OBI-Outdoor-Socket2","GPIO":[0,0,0,0,224,32,0,0,576,288,1,1,1,1],"FLAG":0,"BASE":18}
+Oittm IP44 15A {"NAME":"Oittm Outdoor","GPIO":[576,0,320,0,2688,2656,0,0,224,2592,0,0,0,0],"FLAG":0,"BASE":57}
Oittm Outdoor {"NAME":"Oittm Outdoor","GPIO":[32,0,0,0,0,0,0,0,0,0,320,224,1,0],"FLAG":0,"BASE":18}
Peteme PS-1602 {"NAME":"Peteme Outdoor","GPIO":[32,0,0,0,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":18}
Poweradd {"NAME":"POWERADD","GPIO":[0,0,0,0,320,321,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18}
@@ -908,10 +925,9 @@ Alfawise PF1006 {"NAME":"PF1006","GPIO":[0,0,32,0,0,0,0,0,0,320,224
Alfawise PME1606 {"NAME":"PME1606","GPIO":[0,0,0,32,2688,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18}
Amped Wireless {"NAME":"AWP48W","GPIO":[0,0,0,0,320,32,0,0,0,289,224,0,0,0],"FLAG":0,"BASE":18}
Amysen JSM-WF02 {"NAME":"Amysen JSMWF02","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
-Amysen YX-WS01 {"NAME":"Amysen YX-WS01","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
ANBES ABS-CZ004 {"NAME":"ANBES ABS-CZ00","GPIO":[0,0,0,0,224,2688,0,0,2624,32,2656,225,33,0],"FLAG":0,"BASE":18}
Anncoe C318 {"NAME":"Anncoe C318","GPIO":[64,3072,1,3104,0,0,0,0,224,289,0,0,0,0],"FLAG":0,"BASE":18}
-Anoopsyche AWP08L {"NAME":"AWP08L-Annopsy","GPIO":[0,0,0,0,32,320,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":18}
+Anoopsyche AWP08L {"NAME":"ANOOPSYCHE AWP08L","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18}
Anoopsyche SP-G01 {"NAME":"SP-G01","GPIO":[0,3072,0,3104,0,0,0,0,32,320,224,0,0,0],"FLAG":0,"BASE":41}
Anoopsyche SP15 {"NAME":"Anoop SP15","GPIO":[0,0,0,0,320,224,0,0,0,32,0,0,0,0],"FLAG":0,"BASE":18}
Anoopsyche UK1D {"NAME":"UK1D","GPIO":[0,32,0,0,2688,2656,0,0,2592,288,224,0,0,0],"FLAG":0,"BASE":6}
@@ -936,12 +952,16 @@ Arlec Twin PC288HA {"NAME":"Arlec Twin","GPIO":[0,32,0,225,0,0,0,0,0,3
Athom 16A {"NAME":"Athom Power Monitoring Plug","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,1],"FLAG":0,"BASE":18}
Athom 16A AU {"NAME":"Athom PG05-AU16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1}
Athom 16A AU {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
+Athom 16A BR V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
Athom 16A Brazil {"NAME":"Athom PG05-BR16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1}
+Athom 16A EU V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
Athom 16A Israel {"NAME":"Athom Power Monitoring Plug","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,1],"FLAG":0,"BASE":18}
Athom 16A Israel v2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
Athom 16A Italy {"NAME":"Athom PG05-IT16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1}
Athom 16A UK {"NAME":"Athom PG04-UK16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
+Athom 16A UK V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
Athom 16A US {"NAME":"Athom PG03-US16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18}
+Athom 16A US V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
Atlantis {"NAME":"Atlantis Smart Plug","GPIO":[32,0,0,0,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18}
Atomi AT1217 {"NAME":"AT1217","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
Aukey {"NAME":"Aukey SH-PA2","GPIO":[0,0,0,0,576,320,0,0,32,0,224,0,0,0],"FLAG":0,"BASE":18}
@@ -1037,8 +1057,8 @@ Deltaco SH-P01E {"NAME":"DELTACO SH-P01E","GPIO":[0,320,0,32,2720,2
Deltaco SH-P02 {"NAME":"Deltaco SH-P02","GPIO":[33,0,0,0,2720,2656,0,0,2624,320,224,225,32,0],"FLAG":0,"BASE":18}
Denver 16A {"NAME":"Denver SHP-100","GPIO":[0,0,0,32,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":65}
Denver Dual {"NAME":"Denver SHP-200","GPIO":[576,0,0,2624,32,2720,0,0,224,33,2656,225,0,0],"FLAG":0,"BASE":18}
-DETA 62120HA Smart Plug Base {"NAME":"DetaPlugBase","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
Deta 6930HA {"NAME":"DetaSmartPlug","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
+DETA Base {"NAME":"DetaPlugBase","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
Digital LCD BL6523 {"NAME":"BL6523 Smart Meter","GPIO":[0,0,0,0,8000,8032,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
Digma DiPlug 100S {"NAME":"Digma DiPlug 100s","GPIO":[320,0,544,1,0,2720,1,1,1,32,2656,224,0,1],"FLAG":0,"BASE":18}
Digma DiPlug 160M {"NAME":"DiPlug 160M","GPIO":[0,320,0,32,2720,2656,0,0,2624,321,224,0,0,0],"FLAG":0,"BASE":55}
@@ -1231,7 +1251,8 @@ Luminea NX-4491 {"NAME":"Luminea NX-449","GPIO":[320,0,576,0,0,0,0,
Luminea NX-4541 {"NAME":"NX-4451","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":55}
Luminea ZX-2820 {"NAME":"ZX2820-675","GPIO":[0,0,0,32,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":65}
Luminea ZX-2858 {"NAME":"ZX2858-675","GPIO":[32,0,0,0,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":65}
-Lunvon {"NAME":"Lunvon Smart Plug","GPIO":[32,0,0,0,0,0,288,224,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Lunvon 2000W {"NAME":"Lunvon Smart Plug","GPIO":[32,0,0,0,0,0,288,224,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Lunvon 3000W {"NAME":"Lunvon Smart Plug","GPIO":[32,0,0,0,0,0,288,224,0,0,0,0,0,0],"FLAG":0,"BASE":18}
Martin Jerry V01 {"NAME":"MJ V01","GPIO":[0,0,0,0,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
Martin Jerry XS-SSA01 {"NAME":"MJ_XS-SSA01","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
Maxcio W-UK007S {"NAME":"Maxcio","GPIO":[320,0,1,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45}
@@ -1252,7 +1273,7 @@ Minleaf W-DEXI {"NAME":"W-DEXI","GPIO":[0,32,0,0,2720,2656,0,0,262
Mirabella Genio {"NAME":"GenioGpo","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
Mirabella Genio 1002341 {"NAME":"Genio 1","GPIO":[0,0,320,0,0,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":1}
Mirabella Genio Double Plug with USB Ports {"NAME":"Genio I002932","GPIO":[0,320,1,32,0,0,0,0,224,0,225,0,0,0],"FLAG":0,"BASE":18}
-Mirabella Genio Dual USB {"NAME":"Mirabella Genio Wi-Fi Power Plug with Dual USB Port","GPIO":[0,0,0,32,0,0,0,0,0,320,0,224,0,0],"FLAG":0,"BASE":18}
+Mirabella Genio Dual USB {"NAME":"Mirabella Genio Wi-Fi Power Plug with Dual USB Port","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
Mirabella Genio USB {"NAME":"Mirabella Genio 1002826","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":1}
Mirabella Genio USB Port {"NAME":"Genio I002341","GPIO":[0,0,0,0,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":1}
Mistral {"NAME":"Mistral Smart ","GPIO":[320,0,0,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18}
@@ -1333,6 +1354,7 @@ See Switches {"NAME":"SEESWITCHES SSPG01WH","GPIO":[321,1,320,1,
Shelly Plug {"NAME":"Shelly Plug EU","GPIO":[0,0,0,0,224,2688,0,0,96,288,289,0,290,0],"FLAG":0,"BASE":18}
Shelly Plug S {"NAME":"Shelly Plug S","GPIO":[320,1,576,1,1,2720,0,0,2624,32,2656,224,1,4736],"FLAG":0,"BASE":45}
Shelly Plug US {"NAME":"Shelly Plug US","GPIO":[288,0,321,0,224,2720,0,0,2624,32,2656,544,0,0],"FLAG":0,"BASE":45}
+Sieges {"NAME":"Sieges FLHS-ZN01","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18}
SilentNight {"NAME":"SilentNightPlug","GPIO":[0,0,0,0,288,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
Silvergear Slimme Stekker {"NAME":"Silvergear SmartHomePlug","GPIO":[0,0,0,96,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
SimpleHome {"NAME":"SimpleHome","GPIO":[289,0,0,0,0,0,0,0,224,320,32,0,0,0],"FLAG":0,"BASE":1}
@@ -1425,6 +1447,7 @@ Vivanco 39625 Smart Home Power Adapter {"NAME":"Vivianco","GPIO":[0,0,0,32,2688
Vivitar {"NAME":"Vivitar HA1003","GPIO":[576,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18}
Vivitar HA-1006 {"NAME":"HA-1006","GPIO":[0,0,0,0,320,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
Vivitar HA-1006-AU {"NAME":"HA-1006-AU","GPIO":[0,0,0,0,320,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
+Vivitar Plug {"NAME":"HA-1005N-AU","GPIO":[0,0,0,0,544,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
Vizia 16A {"NAME":"Vizia 16A","GPIO":[32,0,0,0,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
W-DE004 {"NAME":"W-DE004","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,4704],"FLAG":0,"BASE":18}
WAGA life CHCZ02MB {"NAME":"WAGA CHCZ02MB","GPIO":[321,0,0,2624,0,2720,0,0,224,32,2656,320,0,0],"FLAG":0,"BASE":68}
@@ -1470,6 +1493,7 @@ YT-E002 {"NAME":"YT-E002","GPIO":[576,0,0,0,33,0,0,0,225,32
YT-E003 {"NAME":"YT-E003-SP202","GPIO":[32,0,0,0,2720,2656,0,0,2624,288,225,224,65,0],"FLAG":0,"BASE":64}
Yuanguo KS-501 {"NAME":"Yuanguo_KS-501","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18}
YX-DE01 {"NAME":"YX-DE01","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
+YX-WS01 {"NAME":"Generic","GPIO":[1,32,1,1,1,1,1,1,1,320,224,1,1,1],"FLAG":0,"BASE":18}
YX-WS02 {"NAME":"Amysen YX-WS02","GPIO":[1,32,1,1,1,1,0,0,1,320,224,1,1,4704],"FLAG":0,"BASE":18}
ZBR-001 {"NAME":"ZBR-001","GPIO":[32,1,1,1,2688,2656,0,0,2592,320,224,1,321,4704],"FLAG":0,"BASE":18}
ZettaGuard {"NAME":"ZettaGuard S25","GPIO":[0,0,0,0,289,224,0,0,288,0,32,0,0,0],"FLAG":0,"BASE":18}
@@ -1555,6 +1579,7 @@ Meross MSS425 {"NAME":"Meross MSS425","GPIO":[260,0,0,0,320,0,0,0
Mirabella Genio 4 Outlet Power Board with 2 USB {"NAME":"Genio i002340","GPIO":[320,0,0,0,224,225,0,0,226,32,227,228,0,0],"FLAG":0,"BASE":18}
Mirabella Genio Powerboard {"NAME":"Genio Powerboa","GPIO":[224,288,0,0,226,225,0,0,228,32,229,227,0,0],"FLAG":0,"BASE":18}
Nedis P310 {"NAME":"Nedis WIFIP310","GPIO":[0,320,0,32,225,224,0,0,0,226,227,0,0,4704],"FLAG":0,"BASE":18}
+Nous 15A 3AC 3USB {"NAME":"NOUS A5T","GPIO":[0,3072,544,3104,0,259,0,0,225,226,224,0,32,4704],"FLAG":0,"BASE":18}
Nozdom 3AC+2USB {"NAME":"NOZDOM SWB3","GPIO":[544,0,289,0,0,226,0,0,224,32,225,227,0,0],"FLAG":0,"BASE":18}
Pearl CHA1555 3AC 4USB {"NAME":"Pearl CHA1555","GPIO":[32,0,0,225,2720,2656,0,0,2624,227,226,224,320,0],"FLAG":0,"BASE":18}
Powertech 4AC 2USB {"NAME":"Ptech MS6107","GPIO":[0,288,0,32,224,225,0,0,227,228,226,0,0,0],"FLAG":0,"BASE":18}
@@ -1574,9 +1599,9 @@ SWB2 3AC + 2USB {"NAME":"SWB2","GPIO":[576,1,0,1,0,226,0,0,224,32,2
TCP Smart 4AC+USB {"NAME":"TCP WPS4WUK","GPIO":[1,320,0,32,226,227,0,0,225,224,228,0,0,1],"FLAG":0,"BASE":18}
Teckin SS30 {"NAME":"Teckin SS30","GPIO":[288,1,1,321,256,32,0,0,258,257,259,1,228,0],"FLAG":0,"BASE":18}
Tellur 3AC 4USB {"NAME":"Tellur","GPIO":[0,320,0,32,225,224,0,0,0,226,227,0,0,4704],"FLAG":0,"BASE":18}
-Tessan A4L-BK {"NAME":"TESSAN A4L-BK","GPIO":[0,0,0,227,226,0,0,0,224,0,225,0,0,0],"FLAG":0,"BASE":18}
+Tessan {"NAME":"TESSAN A4L-BK","GPIO":[0,0,0,227,226,0,0,0,224,0,225,0,0,0],"FLAG":0,"BASE":18}
Tonbux SM-SO301-U {"NAME":"Tonbux SM-SO30","GPIO":[320,0,0,0,256,0,0,0,258,257,259,0,228,0],"FLAG":0,"BASE":18}
-Useelink {"NAME":"Useelink","GPIO":[320,0,0,0,256,0,0,0,258,257,259,0,228,0],"FLAG":0,"BASE":18}
+Useelink {"NAME":"Useelink","GPIO":[288,0,0,321,256,32,0,0,258,257,259,0,228,0],"FLAG":0,"BASE":18}
Vivitar HA-1007 {"NAME":"Vivitar HA-1007 Power Strip","GPIO":[544,0,0,0,227,228,0,0,225,224,226,0,35,1],"FLAG":0,"BASE":18}
Vivitar HA-1007-AU {"NAME":"HA-1007-AU","GPIO":[320,32,0,322,256,321,0,0,258,257,259,0,228,0],"FLAG":0,"BASE":18}
wesmartify essentials 4AC+4USB {"NAME":"essential_4_po","GPIO":[320,0,0,0,227,228,0,0,225,224,226,0,32,0],"FLAG":0,"BASE":18}
@@ -1607,7 +1632,7 @@ ZLD64-EU-W {"NAME":"ZLD64-EU-W","GPIO":[0,320,0,32,225,224,0,0
## RF Gateway
```
Sonoff RF Bridge 433 {"NAME":"Sonoff Bridge","GPIO":[32,3200,1,3232,1,1,0,0,1,320,1,0,0,0],"FLAG":0,"BASE":25}
-Virage Labs VirageBridge 433MHz {"NAME":"VirageBridge","GPIO":[32,3200,255,3232,255,255,0,0,255,320,255,0,0],"FLAG":0,"BASE":25}
+Virage Labs VirageBridge 433MHz {"NAME":"VirageBridge","GPIO":[32,3200,1,3232,1,1,0,0,1,320,1,0,0],"FLAG":0,"BASE":25}
```
## RGB
@@ -1638,7 +1663,6 @@ Arlec Smart 9.5W 806lm {"NAME":"Arlec RGBWW","GPIO":[0,0,0,0,416,419,0,0,4
Athom 12W 1000lm {"NAME":"LB03-12W-E27-TAS","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO92 1 | DimmerRange 24,100"}
Athom 15W 1400lm {"NAME":"LB01-15W-E27-TAS","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO92 1 | DimmerRange 24 100"}
Athom 4.5W 300lm {"NAME":"Athom LB10-5W-TAS","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
-ATHOM 7W 600lm {"NAME":"LB01-7W-B22-TAS","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
Athom 7W 600lm {"NAME":"LB01-7W-E27-TAS","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
Aunics 7W 600lm {"NAME":"Aunics RGBW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
Avatar 8W 800lm {"NAME":"Avatar 8W RGBCW","GPIO":[1,1,1,1,416,419,1,1,417,420,418,1,1,1],"FLAG":0,"BASE":18}
@@ -1855,6 +1879,7 @@ Fcmila 7W {"NAME":"FCMILA E27 0.1","GPIO":[0,0,0,0,416,419,0,
Fcmila Spotlight 460lm {"NAME":"Fcmila LED 6W","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18}
Feit Electric BR30 650lm {"NAME":"BR30/RGBW","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18}
FFHL 12W 900lm {"NAME":"FFHL RGBW Bulb","GPIO":[0,0,0,0,0,416,0,0,418,419,417,0,0,0],"FLAG":0,"BASE":18}
+Frankever A21 {"NAME":"FrankEver RGBW Bulb","GPIO":[0,1,5729,2272,1,2304,0,0,832,3008,896,3040,256,0],"FLAG":0,"BASE":27}
Fulighture A60 810lm {"NAME":"Fulighture A60","GPIO":[0,0,0,0,417,416,0,0,0,418,419,0,0,0],"FLAG":0,"BASE":18}
Fulighture RGBW 15W {"NAME":"Fulighture RGBW 15W","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":18}
Garsent 10W {"NAME":"Garsent 10W RGBW-Bulb","GPIO":[0,0,0,0,0,418,0,0,417,0,416,419,0,4704],"FLAG":0,"BASE":18}
@@ -1967,6 +1992,7 @@ V-Tac A60 11W 1055lm {"NAME":"V-TAC LED A60 ","GPIO":[0,0,0,0,4032,0,0,0
V-Tac A66 15W 1300lm {"NAME":"V-TAC VT-5117","GPIO":[0,0,0,0,4032,0,0,0,0,0,4064,0,0,0],"FLAG":0,"BASE":18}
V-TAC A95 18W 1350lm {"NAME":"V-TAC VT-5021","GPIO":[0,0,0,0,416,420,0,0,417,419,418,0,0,0],"FLAG":0,"BASE":18}
V-TAC G45 4.5W 300lm {"NAME":"V-TAC VT-5124","GPIO":[0,0,0,0,0,0,0,0,4065,0,4032,0,0,0],"FLAG":0,"BASE":18}
+Vivitar 1100lm {"NAME":"Vivitar (Tuya) RGBW Lamp","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18}
Wallfire WF-05 {"NAME":"Wallfire E27","GPIO":[32,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27}
Wixann C37 5W 450lm {"NAME":"WIXANNE12","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
Woopower 460lm {"NAME":"Woopower E14","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27}
@@ -1982,7 +2008,7 @@ Zilotek A19 800lm {"NAME":"Zilotek RGBW","GPIO":[0,0,0,0,2912,416,0,0
## Relay
```
-Shelly Plus 2PM {"NAME":"Shelly Plus 2PM","GPIO":[0,0,192,0,0,0,1,1,224,225,0,0,0,0,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
+Shelly Plus 2PM {"NAME":"Shelly Plus 2PM","GPIO":[320,0,192,0,0,0,1,1,225,224,0,0,0,0,193,0,0,0,0,0,0,608,3840,32,0,0,0,0,0,640,0,0,3456,4736,0,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,32000,40000,3350"}
```
## Relay Board
@@ -2015,6 +2041,7 @@ eWeLink PSF-B04 5V 7-32V 4 Channel {"NAME":"eWeLink 4CH","GPIO":[160,0,0,0,226,
Geekcreit 5V DIY 4 Channel Jog Inching Self-Locking {"NAME":"Geekcreit-4ch","GPIO":[160,0,0,0,226,225,161,162,224,288,163,227,0,0],"FLAG":0,"BASE":18}
Geekcreit Module 220V 10A {"NAME":"DIY ESP8266 Re","GPIO":[0,0,544,0,224,32,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
HW-622 ESP8266 {"NAME":"HW-622","GPIO":[0,0,544,0,224,32,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
+Kincony 16 Channel {"NAME":"KC868-A16 rev 1.4","GPIO":[32,1,1,1,640,608,1,1,1,1,1,1,1,1,5600,1,0,1,1,5568,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
Kincony 8 Channel {"NAME":"KC868-A8","GPIO":[32,0,1120,0,640,608,0,0,0,1,1,1152,0,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,1],"FLAG":0,"BASE":1,"CMND":"EthClockMode 3 | EthAddress 0 | EthType 0 | I2CDriver2 1"}
Kincony IR+RF 4 Channel {"NAME":"KC868-A4","GPIO":[32,0,227,0,224,225,0,0,0,1312,1,226,0,0,480,1152,0,1120,1056,1088,0,1,1,1,0,0,0,0,4706,4707,4704,4705,1,0,0,1],"FLAG":0,"BASE":1}
LC Technology 12V 4 Channel {"NAME":"LC Technology 4CH Relay","GPIO":[224,0,225,0,226,227,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
@@ -2042,6 +2069,8 @@ Yunshan 7-30V 10A {"NAME":"Yunshan 10A","GPIO":[32,1,288,1,224,161,0,
## Sensor
```
+Genesense IoT Controller {"NAME":"GNS24","GPIO":[32,1,1312,1,256,320,1,1,256,1216,160,3840,1,4704],"FLAG":0,"BASE":18}
+IOT4 Environmental {"NAME":"IOT4SH01BME680","GPIO":[0,0,0,0,0,0,0,0,640,0,608,0,0,0],"FLAG":0,"BASE":18}
Shelly 3EM Power Monitoring Module {"NAME":"Shelly 3EM","GPIO":[1,1,288,1,32,8065,0,0,640,8064,608,224,8096,0],"FLAG":0,"BASE":18}
```
@@ -2073,6 +2102,7 @@ SmartBase E0260 {"NAME":"SmartBaseE0260","GPIO":[0,0,0,0,320,0,0,0,
AGL 2 Gang {"NAME":"AGL WiFi 02","GPIO":[0,0,544,0,0,33,0,0,225,224,0,0,32,0],"FLAG":0,"BASE":18}
AGL 3 Gang {"NAME":"AGL WiFi 03","GPIO":[0,0,544,0,34,33,0,0,225,224,226,0,32,0],"FLAG":0,"BASE":18}
Aoycocr SW1 {"NAME":"Aoycocr SW1","GPIO":[576,1,321,1,1,1,1,1,320,32,1,224,1,1],"FLAG":0,"BASE":18}
+APPIO 1 Gang Switch {"NAME":"Appio-9608","GPIO":[0,0,0,0,0,32,0,0,0,0,0,224,288,0],"FLAG":0,"BASE":18}
Athom 1 Gang {"NAME":"Athom SW011EU","GPIO":[576,0,0,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1}
Athom 1 Gang {"NAME":"Athom SW031US","GPIO":[576,0,0,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1}
Athom 1 Gang No Neutral {"NAME":"Athom SW111EU","GPIO":[576,0,0,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1}
@@ -2107,10 +2137,12 @@ Cinlinele 4 Gang {"NAME":"Cinlinele","GPIO":[0,2272,0,2304,0,0,0,0,0
CloudFree Light {"NAME":"CloudFree SW1","GPIO":[32,1,0,1,0,0,0,0,224,320,1,0,0,0],"FLAG":0,"BASE":1}
CloudFree Motion Light {"NAME":"CloudFree SWM1","GPIO":[32,0,0,0,0,160,0,0,224,576,161,0,0,0],"FLAG":0,"BASE":18}
Connect SmartHome 2 Gang Wall {"NAME":"CSH-SWTCH2","GPIO":[0,0,288,0,0,33,0,0,225,224,0,0,32,0],"FLAG":0,"BASE":18}
+Connect SmartHome 3 Gang Wall Switch () {"NAME":"CSH-SWTCH3","GPIO":[0,0,288,0,34,33,0,0,225,224,226,0,32,0],"FLAG":0,"BASE":18}
Deta 1 Gang {"NAME":"Deta 1G Switch","GPIO":[0,0,0,0,544,0,0,0,0,224,0,0,64,0],"FLAG":0,"BASE":18}
Deta 2 Gang {"NAME":"DETA 2G Switch","GPIO":[0,0,0,0,544,0,0,0,65,224,225,0,64,0],"FLAG":0,"BASE":18}
Deta 3 Gang {"NAME":"DETA 3G Switch","GPIO":[544,0,0,66,65,224,0,0,226,0,225,0,64,0],"FLAG":0,"BASE":18}
Deta 4 Gang {"NAME":"Deta 4G Switch","GPIO":[576,0,0,34,33,224,0,0,226,35,225,227,32,0],"FLAG":0,"BASE":18}
+DETA Mechanism {"NAME":"Deta 6014HA","GPIO":[0,0,0,0,0,0,0,0,320,0,32,0,224,0],"FLAG":0,"BASE":18}
Dierya Touch Panel 2 Gang {"NAME":"CD301","GPIO":[0,0,0,0,544,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
Dierya Touch Panel 2 Gang {"NAME":"CD302","GPIO":[544,0,0,33,225,0,0,0,32,224,321,0,320,0],"FLAG":0,"BASE":18}
Dierya Touch Panel 3 Gang {"NAME":"CD303","GPIO":[576,289,0,34,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18}
@@ -2124,6 +2156,7 @@ DS-102 2 Gang {"NAME":"DS-102 2 Gang","GPIO":[576,321,0,32,225,33
DS-102 3 Gang {"NAME":"DS-102 3 Gang","GPIO":[576,322,0,33,225,34,0,0,32,224,321,226,320,0],"FLAG":0,"BASE":18}
DS-121 2 Gang No Neutral {"NAME":"2 Gang Switch","GPIO":[576,321,0,32,225,33,0,0,0,224,320,0,0,0],"FLAG":0,"BASE":18}
DS-121 4 Gang No Neutral {"NAME":"2 Gang Switch","GPIO":[576,321,0,32,225,33,0,0,0,224,320,0,0,0],"FLAG":0,"BASE":18}
+Eachen 3CH {"NAME":"Eachen Smart Switch 3CH","GPIO":[34,0,0,0,224,225,33,32,226,320,0,0,0,0],"FLAG":0,"BASE":18}
Eachen CD303 3 Gang {"NAME":"ID Components","GPIO":[544,289,0,162,224,161,0,0,160,225,290,226,288,1],"FLAG":0,"BASE":18}
Eachen SWT-2Gang {"NAME":"ID Components","GPIO":[544,1,1,1,1,161,1,1,160,224,289,225,288,1],"FLAG":0,"BASE":18}
Earda 3-Way {"NAME":"ESW-1WAA-US","GPIO":[160,0,0,0,320,0,0,0,0,224,0,0,0,0],"FLAG":0,"BASE":18}
@@ -2160,6 +2193,7 @@ Innens RF433 2 Gang 1 Way {"NAME":"Innens Light Switch 2G","GPIO":[0,0,289,0,
Jinvoo SM-SW101-1 {"NAME":"SM-SW101-1","GPIO":[288,0,0,33,0,0,0,0,32,224,0,0,0,4704],"FLAG":0,"BASE":18}
Jinvoo SM-SW101-2 {"NAME":"SM-SW101-2","GPIO":[288,0,0,33,225,0,0,0,32,224,0,0,0,4704],"FLAG":0,"BASE":18}
Jinvoo SM-SW101-3 {"NAME":"Jinvoo Wall Sw","GPIO":[288,0,0,33,225,34,0,0,32,224,0,226,0,4704],"FLAG":0,"BASE":18}
+Kauf RGB Wall {"NAME":"Kauf SRF10","GPIO":[448,1,450,1,450,449,1,1,449,32,448,224,1,1],"FLAG":0,"BASE":18}
KingArt 1 Gang {"NAME":"KING-L1","GPIO":[0,0,0,0,0,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
KingArt 3 Gang {"NAME":"KING-L3","GPIO":[0,0,0,0,226,225,0,0,224,164,165,0,167,0],"FLAG":0,"BASE":18}
KMC 70008 {"NAME":"KMC 70008","GPIO":[32,1,1,0,0,1,0,0,0,320,224,1,1,0],"FLAG":0,"BASE":18}
@@ -2184,6 +2218,7 @@ Lerlink 3 Gang {"NAME":"X803A","GPIO":[0,0,0,33,32,34,0,0,224,288,
Lerlink 3 Gang No Neutral {"NAME":"X803K-L 3 Gang","GPIO":[0,0,320,0,32,34,33,0,224,0,225,226,0,0],"FLAG":0,"BASE":18}
Lightstory WT02S {"NAME":"WT02S","GPIO":[0,0,0,0,321,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":50}
Linkind 2-Way {"NAME":"Linkind WS240010008","GPIO":[0,0,0,0,0,224,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,576,321,0,0,0,0,0,33,32,0,0,0,0,0,0],"FLAG":0,"BASE":1}
+Linkind Dimmer {"NAME":"Linkind Dimmer","GPIO":[6213,8448,0,0,640,0,0,0,0,0,288,0,0,0,0,0,0,608,0,0,0,0,544,0,0,0,0,0,33,32,0,0,0,0,0,0],"FLAG":0,"BASE":1}
LoGiX Multi Button RGB Scene Controller {"NAME":"Logix3","GPIO":[1,1,1,1,34,33,1,1,1376,32,1312,1,1,1],"FLAG":0,"BASE":18}
Lonsonho SK3-01 {"NAME":"Tuya 1 Channel","GPIO":[0,0,0,0,0,32,0,0,0,0,0,224,288,0],"FLAG":0,"BASE":18}
Lonsonho SK3-02 {"NAME":"Tuya 2 Channel","GPIO":[0,0,0,0,225,0,0,0,32,224,33,0,288,0],"FLAG":0,"BASE":18}
@@ -2243,6 +2278,7 @@ Nedis Dual {"NAME":"SM-SW102U-2","GPIO":[576,0,0,33,225,0,0,0,
Nexete DS-123 {"NAME":"DS-123","GPIO":[544,321,1,32,224,33,0,0,1,225,320,1,1,0],"FLAG":0,"BASE":18}
Nexete DS-123 Single {"NAME":"DS-123","GPIO":[544,0,1,33,0,32,0,0,1,224,320,1,1,0],"FLAG":0,"BASE":18}
Novadigital Interruptor Touch Led 1 Boto {"NAME":"Nova Digital Switch 1 Gang","GPIO":[544,0,0,32,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18}
+Prosto {"NAME":"Prosto WFS-T10","GPIO":[0,0,0,0,0,224,0,0,320,0,64,0,0,0],"FLAG":0,"BASE":18}
Push Button 1/2/3/4 Gang {"NAME":"DS-122","GPIO":[321,0,0,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":18}
Q-touch 1 Gang {"NAME":"Qtouch","GPIO":[289,0,0,32,0,0,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":1}
Qualitel 1 Gang {"NAME":"Qualitel 1 Gang","GPIO":[544,0,0,160,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18}
@@ -2265,7 +2301,7 @@ Shawader 3Ch Touch Light {"NAME":"ShawaderTuya3C","GPIO":[0,3872,0,66,64,65,
SK-A801-01-US 1 Gang {"NAME":"jsankou US Switch 1 Gang","GPIO":[544,0,0,0,0,0,0,0,32,256,0,0,0,0],"FLAG":0,"BASE":18}
SK-W803-01-US 3 Gang {"NAME":"jsankou US Switch 3 Gang","GPIO":[544,0,0,33,257,34,0,0,32,256,0,258,0,0],"FLAG":0,"BASE":18}
Smart 3 Gang Touch {"NAME":"ETERSKY KS601 3 Gang","GPIO":[0,0,544,0,34,33,0,0,225,224,226,0,32,0],"FLAG":0,"BASE":18}
-SmartGrade {"NAME":"SmartGrade AC 5005","GPIO":[0,0,0,32,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
+SmartGrade {"NAME":"SmartGrade AC 5005","GPIO":[0,0,0,32,2688,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18}
Smartlife Opard CD302 {"NAME":"CD302","GPIO":[0,0,0,0,288,321,0,0,256,32,0,0,0,0],"FLAG":0,"BASE":18}
SmartPlex 3 Gang {"NAME":"Tuya 3 Channel","GPIO":[1,1,1,1,224,33,0,0,34,226,32,225,1,0],"FLAG":0,"BASE":18}
SmartVU Home Double Touch Light {"NAME":"SHWSW2","GPIO":[544,0,288,0,0,32,0,0,33,225,0,224,289,0],"FLAG":0,"BASE":18}
@@ -2414,7 +2450,7 @@ Shelly 1 {"NAME":"Shelly 1","GPIO":[1,1,0,1,224,192,0,0,0,0,
Shelly 1L No Neutral {"NAME":"Shelly 1L","GPIO":[320,0,0,0,192,224,0,0,0,0,193,0,0,4736],"FLAG":0,"BASE":18}
Shelly 1PM {"NAME":"Shelly 1PM","GPIO":[320,0,0,0,192,2720,0,0,0,0,0,224,0,4736],"FLAG":0,"BASE":18}
Shelly 2 {"NAME":"Shelly 2","GPIO":[0,2752,0,2784,224,225,0,0,160,0,161,2816,0,0],"FLAG":0,"BASE":47}
-Shelly 2.5 {"NAME":"Shelly 2.5","GPIO":[320,0,32,0,224,193,0,0,640,192,608,225,3456,4736],"FLAG":0,"BASE":18}
+Shelly 2.5 {"NAME":"Shelly 2.5","GPIO":[320,0,0,0,224,193,0,0,640,192,608,225,3456,4736],"FLAG":0,"BASE":18}
Shelly EM {"NAME":"Shelly EM","GPIO":[0,0,0,0,0,0,0,0,640,3456,608,224,0,1],"FLAG":0,"BASE":18}
Shelly i3 Action and Scenes Activation Device {"NAME":"Shelly i3","GPIO":[0,0,0,0,0,320,0,0,193,194,192,0,0,4736],"FLAG":0,"BASE":18}
Shelly Plus 1 {"NAME":"Shelly Plus 1 ","GPIO":[0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
@@ -2538,6 +2574,7 @@ Y09 {"NAME":"Y09","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0
```
Eachen eWeLink ZbBridge Pro Ethernet {"NAME":"ZB-GW03-V1.2","GPIO":[0,0,3552,0,3584,0,0,0,5793,5792,320,544,5536,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,608,640,32,0,0,0,0,0],"FLAG":0,"BASE":1}
Sonoff ZBBridge {"NAME":"Sonoff ZbBridge","GPIO":[320,3552,0,3584,5312,0,0,0,640,576,608,0,32,0],"FLAG":0,"BASE":75}
+Sonoff ZBBridge Pro {"NAME":"Sonoff Zigbee Pro","GPIO":[0,0,576,0,480,0,0,0,0,1,1,5792,0,0,0,3552,0,320,5793,3584,0,640,608,32,0,0,0,0,0,1,0,0,0,0,0,0],"FLAG":0,"BASE":1}
Tube's CC2652P2 Ethernet {"NAME":"Tube ZB CC2652","GPIO":[0,0,0,3840,0,3584,0,0,0,0,0,0,5536,3552,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,3840,5792,0,0,0,0,0,0],"FLAG":0,"BASE":1}
Tube's EFR32 Ethernet {"NAME":"Tube ZB EFR32","GPIO":[0,0,0,3840,0,3552,1,0,0,0,0,0,5536,3584,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,5793,5792,0,0,0,0,0,0],"FLAG":0,"BASE":1}
```
diff --git a/boards/esp32-cam.json b/boards/esp32-cam.json
index 4691051e4..20113163e 100644
--- a/boards/esp32-cam.json
+++ b/boards/esp32-cam.json
@@ -10,7 +10,7 @@
"flash_mode": "dout",
"mcu": "esp32",
"variant": "esp32",
- "partitions": "esp32_partition_app1856k_spiffs320k.csv"
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
},
"connectivity": [
"wifi",
@@ -25,8 +25,16 @@
"arduino",
"espidf"
],
- "name": "AI Thinker ESP32-CAM, 4M Flash 4MB PSRAM, Tasmota 1856k Code/OTA, 320k FS",
+ "name": "AI Thinker ESP32-CAM, 4M Flash 4MB PSRAM, Tasmota 2880k Code/OTA, 320k FS",
"upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32-safeboot.bin"
+ ]
+ ]
+ },
"flash_size": "4MB",
"maximum_ram_size": 327680,
"maximum_size": 4194304,
diff --git a/boards/esp32-m5core2.json b/boards/esp32-m5core2.json
index 137f023a9..5168ea57d 100644
--- a/boards/esp32-m5core2.json
+++ b/boards/esp32-m5core2.json
@@ -10,7 +10,7 @@
"flash_mode": "dout",
"mcu": "esp32",
"variant": "m5stack_core2",
- "partitions": "esp32_partition_app2944k_spiffs10M.csv"
+ "partitions": "partitions/esp32_partition_app2944k_fs10M.csv"
},
"connectivity": [
"wifi",
diff --git a/boards/esp32-odroid.json b/boards/esp32-odroid.json
index 119af3d9e..6d155670e 100644
--- a/boards/esp32-odroid.json
+++ b/boards/esp32-odroid.json
@@ -10,7 +10,7 @@
"flash_mode": "dout",
"mcu": "esp32",
"variant": "odroid_esp32",
- "partitions": "esp32_partition_app2944k_spiffs10M.csv"
+ "partitions": "partitions/esp32_partition_app2944k_fs10M.csv"
},
"connectivity": [
"wifi",
diff --git a/boards/esp32_16M.json b/boards/esp32_16M.json
index 9667b46ff..df52ebac4 100644
--- a/boards/esp32_16M.json
+++ b/boards/esp32_16M.json
@@ -10,7 +10,7 @@
"flash_mode": "dout",
"mcu": "esp32",
"variant": "esp32",
- "partitions": "esp32_partition_app2944k_spiffs10M.csv"
+ "partitions": "partitions/esp32_partition_app2944k_fs10M.csv"
},
"connectivity": [
"wifi",
diff --git a/boards/esp32_4M.json b/boards/esp32_4M.json
index ee7effe39..c4875e1bd 100644
--- a/boards/esp32_4M.json
+++ b/boards/esp32_4M.json
@@ -1,38 +1,46 @@
{
- "build": {
- "arduino":{
- "ldscript": "esp32_out.ld"
+ "build": {
+ "arduino":{
+ "ldscript": "esp32_out.ld"
+ },
+ "core": "esp32",
+ "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M",
+ "f_cpu": "80000000L",
+ "f_flash": "40000000L",
+ "flash_mode": "dout",
+ "mcu": "esp32",
+ "variant": "esp32",
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
},
- "core": "esp32",
- "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M",
- "f_cpu": "80000000L",
- "f_flash": "40000000L",
- "flash_mode": "dout",
- "mcu": "esp32",
- "variant": "esp32",
- "partitions": "esp32_partition_app1856k_spiffs320k.csv"
- },
- "connectivity": [
- "wifi",
- "bluetooth",
- "ethernet",
- "can"
- ],
- "debug": {
- "openocd_target": "esp32.cfg"
- },
- "frameworks": [
- "arduino",
- "espidf"
- ],
- "name": "Espressif Generic ESP32 4M Flash, Tasmota 1856k Code/OTA, 320k FS",
- "upload": {
- "flash_size": "4MB",
- "maximum_ram_size": 327680,
- "maximum_size": 4194304,
- "require_upload_port": true,
- "speed": 460800
- },
- "url": "https://en.wikipedia.org/wiki/ESP32",
- "vendor": "Espressif"
-}
+ "connectivity": [
+ "wifi",
+ "bluetooth",
+ "ethernet",
+ "can"
+ ],
+ "debug": {
+ "openocd_target": "esp32.cfg"
+ },
+ "frameworks": [
+ "arduino",
+ "espidf"
+ ],
+ "name": "Espressif Generic ESP32 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
+ "upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32-safeboot.bin"
+ ]
+ ]
+ },
+ "flash_size": "4MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 4194304,
+ "require_upload_port": true,
+ "speed": 460800
+ },
+ "url": "https://en.wikipedia.org/wiki/ESP32",
+ "vendor": "Espressif"
+ }
diff --git a/boards/esp32_4M_FS.json b/boards/esp32_4M_FS.json
new file mode 100644
index 000000000..bc5447ad1
--- /dev/null
+++ b/boards/esp32_4M_FS.json
@@ -0,0 +1,46 @@
+{
+ "build": {
+ "arduino":{
+ "ldscript": "esp32_out.ld"
+ },
+ "core": "esp32",
+ "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M",
+ "f_cpu": "80000000L",
+ "f_flash": "40000000L",
+ "flash_mode": "dout",
+ "mcu": "esp32",
+ "variant": "esp32",
+ "partitions": "partitions/esp32_partition_app1856k_fs1344k.csv"
+ },
+ "connectivity": [
+ "wifi",
+ "bluetooth",
+ "ethernet",
+ "can"
+ ],
+ "debug": {
+ "openocd_target": "esp32.cfg"
+ },
+ "frameworks": [
+ "arduino",
+ "espidf"
+ ],
+ "name": "Espressif Generic ESP32 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
+ "upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32-safeboot.bin"
+ ]
+ ]
+ },
+ "flash_size": "4MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 4194304,
+ "require_upload_port": true,
+ "speed": 460800
+ },
+ "url": "https://en.wikipedia.org/wiki/ESP32",
+ "vendor": "Espressif"
+ }
diff --git a/boards/esp32_8M.json b/boards/esp32_8M.json
index b5dcfd676..5a7842f75 100644
--- a/boards/esp32_8M.json
+++ b/boards/esp32_8M.json
@@ -10,7 +10,7 @@
"flash_mode": "dout",
"mcu": "esp32",
"variant": "esp32",
- "partitions": "esp32_partition_app2944k_spiffs2M.csv"
+ "partitions": "partitions/esp32_partition_app2944k_fs2M.csv"
},
"connectivity": [
"wifi",
diff --git a/boards/esp32_solo1_4M.json b/boards/esp32_solo1_4M.json
index e5b86ade8..6a7d9ed44 100644
--- a/boards/esp32_solo1_4M.json
+++ b/boards/esp32_solo1_4M.json
@@ -10,7 +10,7 @@
"flash_mode": "dout",
"mcu": "esp32",
"variant": "esp32",
- "partitions": "esp32_partition_app1856k_spiffs320k.csv"
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
},
"connectivity": [
"wifi",
@@ -25,8 +25,16 @@
"arduino",
"espidf"
],
- "name": "Espressif Generic ESP32 4M Flash, Tasmota 1856k Code/OTA, 320k FS",
+ "name": "Espressif Generic ESP32 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
"upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32solo1-safeboot.bin"
+ ]
+ ]
+ },
"flash_size": "4MB",
"maximum_ram_size": 327680,
"maximum_size": 4194304,
diff --git a/boards/esp32c3.json b/boards/esp32c3.json
index 8e1dae3d5..c1fceed9a 100644
--- a/boards/esp32c3.json
+++ b/boards/esp32c3.json
@@ -1,35 +1,43 @@
{
- "build": {
- "arduino":{
- "ldscript": "esp32c3_out.ld"
+ "build": {
+ "arduino":{
+ "ldscript": "esp32c3_out.ld"
+ },
+ "core": "esp32",
+ "extra_flags": "-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M -DESP32C3",
+ "f_cpu": "160000000L",
+ "f_flash": "80000000L",
+ "flash_mode": "dout",
+ "mcu": "esp32c3",
+ "variant": "esp32c3",
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
},
- "core": "esp32",
- "extra_flags": "-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M -DESP32C3",
- "f_cpu": "160000000L",
- "f_flash": "80000000L",
- "flash_mode": "dout",
- "mcu": "esp32c3",
- "variant": "esp32c3",
- "partitions": "esp32_partition_app1856k_spiffs320k.csv"
- },
- "connectivity": [
- "wifi"
- ],
- "debug": {
- "openocd_target": "esp32c3.cfg"
- },
- "frameworks": [
- "arduino",
- "espidf"
- ],
- "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 1856k Code/OTA, 320k FS",
- "upload": {
- "flash_size": "4MB",
- "maximum_ram_size": 327680,
- "maximum_size": 4194304,
- "require_upload_port": true,
- "speed": 460800
- },
- "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html",
- "vendor": "Espressif"
-}
+ "connectivity": [
+ "wifi"
+ ],
+ "debug": {
+ "openocd_target": "esp32c3.cfg"
+ },
+ "frameworks": [
+ "arduino",
+ "espidf"
+ ],
+ "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
+ "upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32c3-safeboot.bin"
+ ]
+ ]
+ },
+ "flash_size": "4MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 4194304,
+ "require_upload_port": true,
+ "speed": 460800
+ },
+ "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html",
+ "vendor": "Espressif"
+ }
diff --git a/boards/esp32c3cdc.json b/boards/esp32c3cdc.json
new file mode 100644
index 000000000..5371a407e
--- /dev/null
+++ b/boards/esp32c3cdc.json
@@ -0,0 +1,43 @@
+{
+ "build": {
+ "arduino":{
+ "ldscript": "esp32c3_out.ld"
+ },
+ "core": "esp32",
+ "extra_flags": "-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M -DESP32C3 -DUSE_USB_CDC_CONSOLE",
+ "f_cpu": "160000000L",
+ "f_flash": "80000000L",
+ "flash_mode": "dout",
+ "mcu": "esp32c3",
+ "variant": "esp32c3",
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
+ },
+ "connectivity": [
+ "wifi"
+ ],
+ "debug": {
+ "openocd_target": "esp32c3.cfg"
+ },
+ "frameworks": [
+ "arduino",
+ "espidf"
+ ],
+ "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
+ "upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32c3cdc-safeboot.bin"
+ ]
+ ]
+ },
+ "flash_size": "4MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 4194304,
+ "require_upload_port": true,
+ "speed": 460800
+ },
+ "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html",
+ "vendor": "Espressif"
+ }
diff --git a/boards/esp32s2.json b/boards/esp32s2.json
index 07c043b2f..4077ee33d 100644
--- a/boards/esp32s2.json
+++ b/boards/esp32s2.json
@@ -10,7 +10,7 @@
"flash_mode": "dout",
"mcu": "esp32s2",
"variant": "esp32s2",
- "partitions": "esp32_partition_app1856k_spiffs320k.csv"
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
},
"connectivity": [
"wifi"
@@ -22,8 +22,16 @@
"espidf",
"arduino"
],
- "name": "Espressif Generic ESP32-S2 4M Flash, Tasmota 1856k Code/OTA, 320k FS",
+ "name": "Espressif Generic ESP32-S2 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
"upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32s2-safeboot.bin"
+ ]
+ ]
+ },
"flash_size": "4MB",
"maximum_ram_size": 327680,
"maximum_size": 4194304,
diff --git a/boards/esp32s2cdc.json b/boards/esp32s2cdc.json
new file mode 100644
index 000000000..c78313418
--- /dev/null
+++ b/boards/esp32s2cdc.json
@@ -0,0 +1,43 @@
+{
+ "build": {
+ "arduino":{
+ "ldscript": "esp32s2_out.ld"
+ },
+ "core": "esp32",
+ "extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=0 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S2",
+ "f_cpu": "240000000L",
+ "f_flash": "80000000L",
+ "flash_mode": "dout",
+ "mcu": "esp32s2",
+ "variant": "esp32s2",
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
+ },
+ "connectivity": [
+ "wifi"
+ ],
+ "debug": {
+ "openocd_target": "esp32s2.cfg"
+ },
+ "frameworks": [
+ "espidf",
+ "arduino"
+ ],
+ "name": "Espressif Generic ESP32-S2 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
+ "upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32s2cdc-safeboot.bin"
+ ]
+ ]
+ },
+ "flash_size": "4MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 4194304,
+ "require_upload_port": true,
+ "speed": 460800
+ },
+ "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/hw-reference/esp32s2/user-guide-saola-1-v1.2.html",
+ "vendor": "Espressif"
+}
diff --git a/boards/esp32s3.json b/boards/esp32s3.json
index 78f03cced..e2d61eada 100644
--- a/boards/esp32s3.json
+++ b/boards/esp32s3.json
@@ -11,7 +11,7 @@
"flash_mode": "dio",
"mcu": "esp32s3",
"variant": "esp32s3",
- "partitions": "esp32_partition_app1856k_spiffs320k.csv"
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
},
"connectivity": [
"wifi",
@@ -25,8 +25,16 @@
"espidf",
"arduino"
],
- "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 1856k Code/OTA, 320k FS",
+ "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
"upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32s3-safeboot.bin"
+ ]
+ ]
+ },
"flash_size": "4MB",
"maximum_ram_size": 327680,
"maximum_size": 4194304,
diff --git a/boards/esp32s3_8M.json b/boards/esp32s3_8M.json
index 1996236c7..d0c15a19f 100644
--- a/boards/esp32s3_8M.json
+++ b/boards/esp32s3_8M.json
@@ -11,7 +11,7 @@
"flash_mode": "dio",
"mcu": "esp32s3",
"variant": "esp32s3",
- "partitions": "esp32_partition_app2944k_spiffs2M.csv"
+ "partitions": "partitions/esp32_partition_app2944k_fs2M.csv"
},
"connectivity": [
"wifi",
diff --git a/boards/esp32s3cdc.json b/boards/esp32s3cdc.json
new file mode 100644
index 000000000..01ba39e19
--- /dev/null
+++ b/boards/esp32s3cdc.json
@@ -0,0 +1,46 @@
+{
+ "build": {
+ "arduino":{
+ "ldscript": "esp32s3_out.ld",
+ "memory_type": "qspi_qspi"
+ },
+ "core": "esp32",
+ "extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DUSE_USB_CDC_CONSOLE -DESP32_4M -DESP32S3",
+ "f_cpu": "240000000L",
+ "f_flash": "80000000L",
+ "flash_mode": "dio",
+ "mcu": "esp32s3",
+ "variant": "esp32s3",
+ "partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
+ },
+ "connectivity": [
+ "wifi",
+ "bluetooth",
+ "ethernet"
+ ],
+ "debug": {
+ "openocd_target": "esp32s3.cfg"
+ },
+ "frameworks": [
+ "espidf",
+ "arduino"
+ ],
+ "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
+ "upload": {
+ "arduino": {
+ "flash_extra_images": [
+ [
+ "0x10000",
+ "variants/tasmota/tasmota32s3cdc-safeboot.bin"
+ ]
+ ]
+ },
+ "flash_size": "4MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 4194304,
+ "require_upload_port": true,
+ "speed": 460800
+ },
+ "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
+ "vendor": "Espressif"
+}
diff --git a/include/tasmota_options.h b/include/tasmota_options.h
index 840daf379..ebfc69019 100644
--- a/include/tasmota_options.h
+++ b/include/tasmota_options.h
@@ -21,6 +21,6 @@
#define __TASMOTA_INCLUDE__
#include "../tasmota/my_user_config.h"
-#include "../tasmota/tasmota_configurations.h"
+#include "../tasmota/include/tasmota_configurations.h"
#endif // __TASMOTA_INCLUDE__
\ No newline at end of file
diff --git a/lib/default/Ext-printf/src/SBuffer.hpp b/lib/default/Ext-printf/src/SBuffer.hpp
index 67bbbcd48..9c545add0 100644
--- a/lib/default/Ext-printf/src/SBuffer.hpp
+++ b/lib/default/Ext-printf/src/SBuffer.hpp
@@ -48,7 +48,7 @@ public:
inline uint8_t *buf(size_t i = 0) const { return &_buf->buf[i]; }
inline char *charptr(size_t i = 0) const { return (char*) &_buf->buf[i]; }
- virtual ~SBuffer(void) {
+ ~SBuffer(void) {
delete[] _buf;
}
@@ -258,6 +258,12 @@ public:
return buf2;
}
+ static SBuffer SBufferFromBytes(const uint8_t *bytes, size_t len2) {
+ SBuffer buf2(len2);
+ buf2.addBuffer(bytes, len2);
+ return buf2;
+ }
+
// nullptr accepted
static bool equalsSBuffer(const class SBuffer * buf1, const class SBuffer * buf2) {
if (buf1 == buf2) { return true; }
@@ -290,18 +296,3 @@ protected:
SBuffer_impl * _buf;
} SBuffer;
-
-typedef class PreAllocatedSBuffer : public SBuffer {
-
-public:
- PreAllocatedSBuffer(const size_t size, void * buffer) {
- _buf = (SBuffer_impl*) buffer;
- _buf->size = size - 4;
- _buf->len = 0;
- }
-
- ~PreAllocatedSBuffer(void) {
- // don't deallocate
- _buf = nullptr;
- }
-} PreAllocatedSBuffer;
diff --git a/lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp b/lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp
index 278acaabd..99dc6caeb 100644
--- a/lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp
+++ b/lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp
@@ -153,6 +153,9 @@ bool TasmotaSerial::begin(uint32_t speed, uint32_t config) {
#ifdef ESP32
if (TSerial == nullptr) { // Allow for dynamic change in baudrate or config
if (freeUart()) { // We prefer UART1 and UART2 and keep UART0 for debugging
+#ifdef ARDUINO_USB_CDC_ON_BOOT
+ TSerial = new HardwareSerial(m_uart);
+#else
if (0 == m_uart) {
Serial.flush();
Serial.end();
@@ -161,6 +164,7 @@ bool TasmotaSerial::begin(uint32_t speed, uint32_t config) {
} else {
TSerial = new HardwareSerial(m_uart);
}
+#endif // ARDUINO_USB_CDC_ON_BOOT
if (serial_buffer_size > 256) { // RX Buffer can't be resized when Serial is already running (HardwareSerial.cpp)
TSerial->setRxBufferSize(serial_buffer_size);
}
diff --git a/lib/default/Unishox-1.0-shadinger/src/unishox.cpp b/lib/default/Unishox-1.0-shadinger/src/unishox.cpp
index 1c0fd7142..64b18f3c2 100644
--- a/lib/default/Unishox-1.0-shadinger/src/unishox.cpp
+++ b/lib/default/Unishox-1.0-shadinger/src/unishox.cpp
@@ -252,7 +252,6 @@ int32_t Unishox::unishox_compress(const char *p_in, size_t p_len, char *p_out, s
out = p_out;
len_out = p_len_out;
- char *ptr;
byte bits;
int ll;
diff --git a/lib/default/jsmn-shadinger-1.0/src/jsmn.cpp b/lib/default/jsmn-shadinger-1.0/src/jsmn.cpp
index bfd0e11bb..80da28f07 100644
--- a/lib/default/jsmn-shadinger-1.0/src/jsmn.cpp
+++ b/lib/default/jsmn-shadinger-1.0/src/jsmn.cpp
@@ -391,7 +391,7 @@ static uint32_t json_encode_utf8(char* str, uint32_t val) {
void json_unescape(char* string) {
size_t outlength = 0;
- uint32_t hexval, numbytes;
+ uint32_t numbytes;
char c;
for (uint32_t i = 0; (c = string[i]) != 0; i++) {
diff --git a/lib/lib_audio/ESP8266Audio/src/spiram-fast.h b/lib/lib_audio/ESP8266Audio/src/spiram-fast.h
index ce568873e..afaae75a8 100644
--- a/lib/lib_audio/ESP8266Audio/src/spiram-fast.h
+++ b/lib/lib_audio/ESP8266Audio/src/spiram-fast.h
@@ -27,6 +27,10 @@
#include
+#ifndef SPECIAL
+#define SPECIAL 0xF0
+#endif
+
#ifndef ESP32
class ESP8266SPIRAM {
@@ -364,4 +368,4 @@ class ESP8266SPIRAM {
#endif // ESP32
-#endif
\ No newline at end of file
+#endif
diff --git a/lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md b/lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md
index bea02c652..6177f9d7d 100644
--- a/lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md
+++ b/lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md
@@ -13,6 +13,13 @@ remove in file `lib/lib_audio/ESP8266Audio/src/AudioFileSourceFS.cpp`
#endif
```
+add in file `lib/lib_audio/ESP8266Audio/src/spiram-fast.h`
+```
+#ifndef SPECIAL
+#define SPECIAL 0xF0
+#endif
+```
+
Files to delete:
```
lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIFFS.h
diff --git a/lib/lib_basic/OneWire-Stickbreaker/OneWire.h b/lib/lib_basic/OneWire-Stickbreaker/OneWire.h
index 5f4b613c2..c92dda8d0 100644
--- a/lib/lib_basic/OneWire-Stickbreaker/OneWire.h
+++ b/lib/lib_basic/OneWire-Stickbreaker/OneWire.h
@@ -210,28 +210,12 @@ void directModeInput(IO_REG_TYPE pin)
ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux);
ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown);
}
-//#elif ESP_IDF_VERSION_MAJOR > 3 // ESP32-S2 needs IDF 4.2 or later
-// int8_t rtc_io = esp32_gpioMux[pin].rtc;
-// uint32_t rtc_reg = (rtc_io != -1)?rtc_io_desc[rtc_io].reg:0;
-// if ( rtc_reg ) // RTC pins PULL settings
-// {
-// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].mux);
-// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].pullup | rtc_io_desc[rtc_io].pulldown);
-// }
#endif
// Input
if ( pin < 32 )
GPIO.enable_w1tc = ((uint32_t)1 << pin);
else
GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32));
-
-// uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers?
-// pinFunction |= FUN_IE; // input enable but required for output as well?
-// pinFunction |= ((uint32_t)PIN_FUNC_GPIO << MCU_SEL_S);
-
-// ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction;
-
-// GPIO.pin[pin].val = 0;
}
#endif
}
@@ -252,28 +236,12 @@ void directModeOutput(IO_REG_TYPE pin)
ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux);
ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown);
}
-//#elif ESP_IDF_VERSION_MAJOR > 3 // ESP32-S2 needs IDF 4.2 or later
-// int8_t rtc_io = esp32_gpioMux[pin].rtc;
-// uint32_t rtc_reg = (rtc_io != -1)?rtc_io_desc[rtc_io].reg:0;
-// if ( rtc_reg ) // RTC pins PULL settings
-// {
-// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].mux);
-// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].pullup | rtc_io_desc[rtc_io].pulldown);
-// }
#endif
// Output
if ( pin < 32 )
GPIO.enable_w1ts = ((uint32_t)1 << pin);
else // already validated to pins <= 33
GPIO.enable1_w1ts.val = ((uint32_t)1 << (pin - 32));
-
-// uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers?
-// pinFunction |= FUN_IE; // input enable but required for output as well?
-// pinFunction |= ((uint32_t)PIN_FUNC_GPIO << MCU_SEL_S);
-
-// ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction;
-
-// GPIO.pin[pin].val = 0;
}
#endif
}
diff --git a/lib/lib_basic/OneWire-Stickbreaker/README.md b/lib/lib_basic/OneWire-Stickbreaker/README.md
index fcc566fbf..39dbbbad7 100644
--- a/lib/lib_basic/OneWire-Stickbreaker/README.md
+++ b/lib/lib_basic/OneWire-Stickbreaker/README.md
@@ -1,11 +1,6 @@
# OneWire library
- A modification of the Arduino OneWire library maintained by @PaulStoffregen. This modifications supports the ESP32 under the Arduino-esp32 Environment.
-
- No changes are required for compatibility with Arduino coding.
+ A @stickbreaker @arendst modified version of the Arduino OneWire library maintained by @PaulStoffregen.
+ This modifications supports the ESP8266, ESP32, ESP32c3, ESP32s2 and ESP32s3 under the Arduino-esp32 Environment.
+
-Original Source is Paul's 2.3 version. Forked 28DEC2017
-
-@stickbreaker
-V2.3.1 30APR2018 add IRAM_ATTR to read_bit() write_bit() to solve ICache miss timing failure.
- thanks @everslick re: https://github.com/espressif/arduino-esp32/issues/1335
-V2.3 28DEC2017 original mods to support ESP32
+Original Source is Paul's 2.3 version.
diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
index 925b0ad7d..74d812529 100644
--- a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
+++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
@@ -34,7 +34,7 @@ typedef struct LVGL_PARAMS {
struct {
uint8_t use_dma : 1;
uint8_t swap_color : 1;
- uint8_t resvd_0 : 1;
+ uint8_t async_dma : 1; // force DMA completion before returning, avoid conflict with other devices on same bus. If set you should make sure the display is the only device on the bus
uint8_t resvd_1 : 1;
uint8_t resvd_2 : 1;
uint8_t resvd_3 : 1;
diff --git a/lib/lib_display/UDisplay/uDisplay.cpp b/lib/lib_display/UDisplay/uDisplay.cpp
index 3b974eab9..71025069b 100755
--- a/lib/lib_display/UDisplay/uDisplay.cpp
+++ b/lib/lib_display/UDisplay/uDisplay.cpp
@@ -465,7 +465,7 @@ Renderer *uDisplay::Init(void) {
uspi->begin(spi_clk, spi_miso, spi_mosi, -1);
if (lvgl_param.use_dma) {
spi_host = VSPI_HOST;
- initDMA(spi_cs);
+ initDMA(lvgl_param.async_dma ? spi_cs : -1); // disable DMA CS if sync, we control it directly
}
} else if (spi_nr == 2) {
@@ -473,7 +473,7 @@ Renderer *uDisplay::Init(void) {
uspi->begin(spi_clk, spi_miso, spi_mosi, -1);
if (lvgl_param.use_dma) {
spi_host = HSPI_HOST;
- initDMA(spi_cs);
+ initDMA(lvgl_param.async_dma ? spi_cs : -1); // disable DMA CS if sync, we control it directly
}
} else {
pinMode(spi_clk, OUTPUT);
@@ -1282,7 +1282,7 @@ void uDisplay::drawPixel(int16_t x, int16_t y, uint16_t color) {
void uDisplay::setRotation(uint8_t rotation) {
cur_rot = rotation;
- if (interface != _UDSP_SPI) {
+ if (interface != _UDSP_SPI || bpp < 16) {
Renderer::setRotation(cur_rot);
return;
}
@@ -1974,24 +1974,13 @@ void uDisplay::beginTransaction(SPISettings s) {
#ifdef ESP32
if (lvgl_param.use_dma) {
dmaWait();
- } else {
- uspi->beginTransaction(s);
}
-#else
- uspi->beginTransaction(s);
#endif
+ uspi->beginTransaction(s);
}
void uDisplay::endTransaction(void) {
-#ifdef ESP32
- if (lvgl_param.use_dma) {
- dmaBusy();
- } else {
- uspi->endTransaction();
- }
-#else
uspi->endTransaction();
-#endif
}
@@ -2002,7 +1991,7 @@ void uDisplay::endTransaction(void) {
** Function name: initDMA
** Description: Initialise the DMA engine - returns true if init OK
***************************************************************************************/
-bool uDisplay::initDMA(bool ctrl_cs)
+bool uDisplay::initDMA(int32_t ctrl_cs)
{
if (DMA_Enabled) return false;
@@ -2018,9 +2007,6 @@ bool uDisplay::initDMA(bool ctrl_cs)
.intr_flags = 0
};
- int8_t pin = -1;
- if (ctrl_cs) pin = spi_cs;
-
spi_device_interface_config_t devcfg = {
.command_bits = 0,
.address_bits = 0,
@@ -2031,7 +2017,7 @@ bool uDisplay::initDMA(bool ctrl_cs)
.cs_ena_posttrans = 0,
.clock_speed_hz = spi_speed*1000000,
.input_delay_ns = 0,
- .spics_io_num = pin,
+ .spics_io_num = ctrl_cs,
.flags = SPI_DEVICE_NO_DUMMY, //0,
.queue_size = 1,
.pre_cb = 0, //dc_callback, //Callback to handle D/C line
@@ -2119,6 +2105,9 @@ void uDisplay::pushPixelsDMA(uint16_t* image, uint32_t len) {
assert(ret == ESP_OK);
spiBusyCheck++;
+ if (!lvgl_param.async_dma) {
+ dmaWait();
+ }
}
/***************************************************************************************
@@ -2145,6 +2134,9 @@ void uDisplay::pushPixels3DMA(uint8_t* image, uint32_t len) {
assert(ret == ESP_OK);
spiBusyCheck++;
+ if (!lvgl_param.async_dma) {
+ dmaWait();
+ }
}
diff --git a/lib/lib_display/UDisplay/uDisplay.h b/lib/lib_display/UDisplay/uDisplay.h
index b5eae65c5..9a233fcff 100755
--- a/lib/lib_display/UDisplay/uDisplay.h
+++ b/lib/lib_display/UDisplay/uDisplay.h
@@ -233,7 +233,7 @@ class uDisplay : public Renderer {
spi_device_handle_t dmaHAL;
spi_host_device_t spi_host = VSPI_HOST;
// spi_host_device_t spi_host = VSPI_HOST;
- bool initDMA(bool ctrl_cs);
+ bool initDMA(int32_t ctrl_cs);
void deInitDMA(void);
bool dmaBusy(void);
void dmaWait(void);
diff --git a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp
index ee7e3c232..6b455bfc0 100644
--- a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp
+++ b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp
@@ -317,7 +317,7 @@ int FrogmoreScd40::readRegister(uint16_t registerAddress, uint16_t* pData)
void FrogmoreScd40::begin(TwoWire *pWire, uint8_t i2cAddress)
{
- this->duringMeasurement = 0;
+ this->duringMeasurement = false;
this->i2cAddress = i2cAddress;
this->co2EAverage = 0;
if (pWire == NULL)
@@ -373,10 +373,10 @@ int FrogmoreScd40::startPeriodicMeasurement(void)
snprintf_P(scd40log_data, sizeof(scd40log_data), "Start periodic measurement");
AddLog(LOG_LEVEL_DEBUG_MORE);
#endif
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
- DuringMeasurement = 1;
+ duringMeasurement = true;
return(sendCommand(COMMAND_SCD40_START_PERIODIC_MEASUREMENT));
}
@@ -387,7 +387,7 @@ int FrogmoreScd40::readMeasurement(
float *pHumidity
)
{
-// Should only be called in DuringMeasurement mode or
+// Should only be called in duringMeasurement mode or
// after calling measure_single_hot{,_rht_only}
// but this is currently not verified
bool isAvailable = false;
@@ -522,16 +522,16 @@ int FrogmoreScd40::readMeasurement(
int FrogmoreScd40::forceStopPeriodicMeasurement(void)
{
- DuringMeasurement = 0;
+ duringMeasurement = false;
return (sendCommand(COMMAND_SCD40_STOP_PERIODIC_MEASUREMENT));
}
int FrogmoreScd40::stopPeriodicMeasurement(void)
{
- if (!DuringMeasurement) {
+ if (!duringMeasurement) {
return (ERROR_SCD40_NOT_IN_MEASUREMENT_MODE);
}
- DuringMeasurement = 0;
+ duringMeasurement = false;
return (sendCommand(COMMAND_SCD40_STOP_PERIODIC_MEASUREMENT));
}
@@ -541,7 +541,7 @@ int FrogmoreScd40::setTemperatureOffset(float offset_degC)
// influences RH and T readings. Does not influence CO2 measurement. Default is 4 degrees Celcius.
// to save setting to the EEPROM, call persistSetting()
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
if (offset_degC >= 0)
@@ -557,7 +557,7 @@ int FrogmoreScd40::setTemperatureOffset(float offset_degC)
int FrogmoreScd40::setTemperatureOffset(uint16_t offset_centiDegC)
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
uint16_t offset_xDegC = (uint16_t) (offset_centiDegC * 3.74491);
@@ -566,7 +566,7 @@ int FrogmoreScd40::setTemperatureOffset(uint16_t offset_centiDegC)
int FrogmoreScd40::getTemperatureOffset(float *pOffset_degC)
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
uint16_t value;
@@ -581,7 +581,7 @@ int FrogmoreScd40::getTemperatureOffset(float *pOffset_degC)
int FrogmoreScd40::getTemperatureOffset(uint16_t *pOffset_centiDegC)
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
uint16_t value;
@@ -598,7 +598,7 @@ int FrogmoreScd40::setSensorAltitude(uint16_t height_meter)
// Default is 0 meter above sea-level;
// to save setting to the EEPROM, call persistSetting()
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
return (sendCommandArguments(COMMAND_SCD40_SET_SENSOR_ALTITUDE, height_meter));
@@ -606,7 +606,7 @@ int FrogmoreScd40::setSensorAltitude(uint16_t height_meter)
int FrogmoreScd40::getSensorAltitude(uint16_t *pHeight_meter)
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
return (readRegister(COMMAND_SCD40_GET_SENSOR_ALTITUDE, pHeight_meter));
@@ -615,7 +615,7 @@ int FrogmoreScd40::getSensorAltitude(uint16_t *pHeight_meter)
int FrogmoreScd40::setAmbientPressure(uint16_t airPressure_mbar)
// Overrides any pressure compensation based on a previously set sensor altitude
{
- // allowed DuringMeasurement
+ // allowed duringMeasurement
return (sendCommandArguments(COMMAND_SCD40_SET_AMBIENT_PRESSURE, airPressure_mbar));
}
@@ -627,7 +627,7 @@ int FrogmoreScd40::performForcedRecalibration(uint16_t co2_ppm)
// issue stop_periodic_measurement, and then wait 500ms, before calling this function
// it takes 400ms for this command to complete
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
uint16_t FRC_result;
@@ -642,7 +642,7 @@ int FrogmoreScd40::performForcedRecalibration(uint16_t co2_ppm)
int FrogmoreScd40::setAutomaticSelfCalibrationDisabled(void)
// to save setting to the EEPROM, call persistSetting()
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
bool isAuto = false;
@@ -652,7 +652,7 @@ int FrogmoreScd40::setAutomaticSelfCalibrationDisabled(void)
int FrogmoreScd40::setAutomaticSelfCalibrationEnabled(void)
// to save setting to the EEPROM, call persistSetting()
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
bool isAuto = true;
@@ -662,7 +662,7 @@ int FrogmoreScd40::setAutomaticSelfCalibrationEnabled(void)
int FrogmoreScd40::setAutomaticSelfCalibrationEnabled(bool isAuto)
// to save setting to the EEPROM, call persistSetting()
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
bool value = !!isAuto; // using NOT operator twice makes sure value is 0 or 1
@@ -671,7 +671,7 @@ int FrogmoreScd40::setAutomaticSelfCalibrationEnabled(bool isAuto)
int FrogmoreScd40::getAutomaticSelfCalibrationEnabled(uint16_t *pIsAuto)
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
uint16_t value = 0;
@@ -688,16 +688,16 @@ int FrogmoreScd40::getAutomaticSelfCalibrationEnabled(uint16_t *pIsAuto)
int FrogmoreScd40::startLowPowerPeriodicMeasurement(void)
// Comment: unclear how to stop this operation mode?
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
+ duringMeasurement = true;
return (sendCommand(COMMAND_SCD40_START_LOW_POWER_PERIODIC_MEASUREMENT));
- DuringMeasurement = 1;
}
int FrogmoreScd40::getDataReadyStatus(bool *pIsAvailable)
{
- // allowed DuringMeasurement
+ // allowed duringMeasurement
uint16_t isDataAvailable = false;
int error = readRegister(COMMAND_SCD40_GET_DATA_READY_STATUS, &isDataAvailable);
if (!error)
@@ -715,7 +715,7 @@ int FrogmoreScd40::persistSettings(void)
// EEPROM is guaranteed to endure at least 2000 write cycles before failure.
// The field calibration history (FRC and ASC) is stored in a separate EEPROM.
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
return (sendCommand(COMMAND_SCD40_PERSIST_SETTINGS));
@@ -724,7 +724,7 @@ int FrogmoreScd40::persistSettings(void)
int FrogmoreScd40::getSerialNumber(uint16_t *pSerialNumberArray)
// Serialnr is 48 bits = 3 16-bit words
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
uint16_t value;
@@ -734,7 +734,7 @@ int FrogmoreScd40::getSerialNumber(uint16_t *pSerialNumberArray)
int FrogmoreScd40::performSelfTest(uint16_t *pMalfunction)
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
return (readRegister(COMMAND_SCD40_PERFORM_SELF_TEST, pMalfunction));
@@ -744,7 +744,7 @@ int FrogmoreScd40::performFactoryReset(void)
// resets all configuration settings in EEPROM and
// erases FRC and ASC algorithm history
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
return (sendCommand(COMMAND_SCD40_PERFORM_FACTORY_RESET));
@@ -753,7 +753,7 @@ int FrogmoreScd40::performFactoryReset(void)
int FrogmoreScd40::reinit(void)
// reinitailizes sensor from EEPROM user settings
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
return (sendCommand(COMMAND_SCD40_REINIT));
@@ -764,7 +764,7 @@ int FrogmoreScd40::reinit(void)
int FrogmoreScd40::measureSingleShot(void)
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
return (sendCommand(COMMAND_SCD40_MEASURE_SINGLE_SHOT));
@@ -772,7 +772,7 @@ int FrogmoreScd40::measureSingleShot(void)
int FrogmoreScd40::measureSingleShotRhtOnly(void)
{
- if (DuringMeasurement) {
+ if (duringMeasurement) {
return (ERROR_SCD40_BUSY_MEASURING);
}
return (sendCommand(COMMAND_SCD40_MEASURE_SINGLE_SHOT_RHT_ONLY));
diff --git a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h
index 454c8ab5d..e483ac346 100644
--- a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h
+++ b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h
@@ -93,14 +93,12 @@ class FrogmoreScd40
int measureSingleShotRhtOnly(void);
private:
- uint8_t duringMeasurement;
+ bool duringMeasurement;
uint8_t i2cAddress;
TwoWire *pWire;
- uint16_t co2AvgExtra;
uint16_t co2History[SCD40_MEDIAN_FILTER_SIZE];
uint16_t co2EAverage;
int8_t co2NewDataLocation; // location to put new CO2 data for median filter
- bool DuringMeasurement;
uint8_t computeCRC8(uint8_t data[], uint8_t len);
uint16_t medianfilter(uint16_t * p);
diff --git a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp b/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp
index 694502ea5..a3c798f1c 100644
--- a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp
+++ b/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp
@@ -117,7 +117,7 @@ String HTTPUpdateLight::getLastErrorString(void)
// error from Update class
if(_lastError > 0) {
StreamString error;
- Update.printError(error);
+ TasUpdate.printError(error);
error.trim(); // remove line ending
return String("Update error: ") + error;
}
@@ -418,14 +418,17 @@ bool HTTPUpdateLight::runUpdate(Stream& in, uint32_t size, String md5, int comma
StreamString error;
if (_cbProgress) {
- Update.onProgress(_cbProgress);
+ TasUpdate.onProgress(_cbProgress);
}
- if(!Update.begin(size, command, _ledPin, _ledOn)) {
- _lastError = Update.getError();
- Update.printError(error);
+// Start Tasmota Factory patch
+// if(!Update.begin(size, command, _ledPin, _ledOn)) {
+ if(!TasUpdate.begin(size, command, _ledPin, _ledOn, NULL, _factory)) {
+// End Tasmota Factory patch
+ _lastError = TasUpdate.getError();
+ TasUpdate.printError(error);
error.trim(); // remove line ending
- log_e("Update.begin failed! (%s)\n", error.c_str());
+ log_e("TasUpdate.begin failed! (%s)\n", error.c_str());
return false;
}
@@ -434,20 +437,20 @@ bool HTTPUpdateLight::runUpdate(Stream& in, uint32_t size, String md5, int comma
}
if(md5.length()) {
- if(!Update.setMD5(md5.c_str())) {
+ if(!TasUpdate.setMD5(md5.c_str())) {
_lastError = HTTP_UE_SERVER_FAULTY_MD5;
- log_e("Update.setMD5 failed! (%s)\n", md5.c_str());
+ log_e("TasUpdate.setMD5 failed! (%s)\n", md5.c_str());
return false;
}
}
// To do: the SHA256 could be checked if the server sends it
- if(Update.writeStream(in) != size) {
- _lastError = Update.getError();
- Update.printError(error);
+ if(TasUpdate.writeStream(in) != size) {
+ _lastError = TasUpdate.getError();
+ TasUpdate.printError(error);
error.trim(); // remove line ending
- log_e("Update.writeStream failed! (%s)\n", error.c_str());
+ log_e("TasUpdate.writeStream failed! (%s)\n", error.c_str());
return false;
}
@@ -455,11 +458,11 @@ bool HTTPUpdateLight::runUpdate(Stream& in, uint32_t size, String md5, int comma
_cbProgress(size, size);
}
- if(!Update.end()) {
- _lastError = Update.getError();
- Update.printError(error);
+ if(!TasUpdate.end()) {
+ _lastError = TasUpdate.getError();
+ TasUpdate.printError(error);
error.trim(); // remove line ending
- log_e("Update.end failed! (%s)\n", error.c_str());
+ log_e("TasUpdate.end failed! (%s)\n", error.c_str());
return false;
}
diff --git a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h b/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h
index cbed38bd6..372f9f1b0 100644
--- a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h
+++ b/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h
@@ -31,7 +31,7 @@
#include
#include
#include
-#include
+#include
#include
/// note we use HTTP client errors too so we start at 100
@@ -69,7 +69,7 @@ public:
{
_rebootOnUpdate = reboot;
}
-
+
/**
* set redirect follow mode. See `followRedirects_t` enum for avaliable modes.
* @param follow
@@ -85,6 +85,13 @@ public:
_ledOn = ledOn;
}
+// Start Tasmota Factory patch
+ void setFactory(bool factory = false)
+ {
+ _factory = factory;
+ }
+// End Tasmota Factory patch
+
// t_httpUpdate_return update(WiFiClient& client, const String& url, const String& currentVersion = "");
// t_httpUpdate_return update(WiFiClient& client, const String& host, uint16_t port, const String& uri = "/",
@@ -131,6 +138,9 @@ private:
int _ledPin;
uint8_t _ledOn;
+// Start Tasmota Factory patch
+ bool _factory;
+// End Tasmota Factory patch
};
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_HTTPUPDATE)
diff --git a/lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h b/lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h
new file mode 100644
index 000000000..0aaac13b3
--- /dev/null
+++ b/lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h
@@ -0,0 +1,194 @@
+#ifndef TASUPDATER_H
+#define TASUPDATER_H
+
+#include
+#include
+#include
+#include "esp_partition.h"
+
+#define UPDATE_ERROR_OK (0)
+#define UPDATE_ERROR_WRITE (1)
+#define UPDATE_ERROR_ERASE (2)
+#define UPDATE_ERROR_READ (3)
+#define UPDATE_ERROR_SPACE (4)
+#define UPDATE_ERROR_SIZE (5)
+#define UPDATE_ERROR_STREAM (6)
+#define UPDATE_ERROR_MD5 (7)
+#define UPDATE_ERROR_MAGIC_BYTE (8)
+#define UPDATE_ERROR_ACTIVATE (9)
+#define UPDATE_ERROR_NO_PARTITION (10)
+#define UPDATE_ERROR_BAD_ARGUMENT (11)
+#define UPDATE_ERROR_ABORT (12)
+
+#define UPDATE_SIZE_UNKNOWN 0xFFFFFFFF
+
+#define U_FLASH 0
+#define U_SPIFFS 100
+#define U_AUTH 200
+
+#define ENCRYPTED_BLOCK_SIZE 16
+
+class TasUpdateClass {
+ public:
+ typedef std::function THandlerFunction_Progress;
+
+ TasUpdateClass();
+
+ /*
+ This callback will be called when Update is receiving data
+ */
+ TasUpdateClass& onProgress(THandlerFunction_Progress fn);
+
+ /*
+ Call this to check the space needed for the update
+ Will return false if there is not enough space
+ */
+// Start Tasmota Factory patch
+// bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW, const char *label = NULL);
+ bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW, const char *label = NULL, bool factory = false);
+// End Tasmota Factory patch
+
+ /*
+ Writes a buffer to the flash and increments the address
+ Returns the amount written
+ */
+ size_t write(uint8_t *data, size_t len);
+
+ /*
+ Writes the remaining bytes from the Stream to the flash
+ Uses readBytes() and sets UPDATE_ERROR_STREAM on timeout
+ Returns the bytes written
+ Should be equal to the remaining bytes when called
+ Usable for slow streams like Serial
+ */
+ size_t writeStream(Stream &data);
+
+ /*
+ If all bytes are written
+ this call will write the config to eboot
+ and return true
+ If there is already an update running but is not finished and !evenIfRemaining
+ or there is an error
+ this will clear everything and return false
+ the last error is available through getError()
+ evenIfRemaining is helpfull when you update without knowing the final size first
+ */
+ bool end(bool evenIfRemaining = false);
+
+ /*
+ Aborts the running update
+ */
+ void abort();
+
+ /*
+ Prints the last error to an output stream
+ */
+ void printError(Print &out);
+
+ const char * errorString();
+
+ /*
+ sets the expected MD5 for the firmware (hexString)
+ */
+ bool setMD5(const char * expected_md5);
+
+ /*
+ returns the MD5 String of the successfully ended firmware
+ */
+ String md5String(void){ return _md5.toString(); }
+
+ /*
+ populated the result with the md5 bytes of the successfully ended firmware
+ */
+ void md5(uint8_t * result){ return _md5.getBytes(result); }
+
+ //Helpers
+ uint8_t getError(){ return _error; }
+ void clearError(){ _error = UPDATE_ERROR_OK; }
+ bool hasError(){ return _error != UPDATE_ERROR_OK; }
+ bool isRunning(){ return _size > 0; }
+ bool isFinished(){ return _progress == _size; }
+ size_t size(){ return _size; }
+ size_t progress(){ return _progress; }
+ size_t remaining(){ return _size - _progress; }
+
+ /*
+ Template to write from objects that expose
+ available() and read(uint8_t*, size_t) methods
+ faster than the writeStream method
+ writes only what is available
+ */
+ template
+ size_t write(T &data){
+ size_t written = 0;
+ if (hasError() || !isRunning())
+ return 0;
+
+ size_t available = data.available();
+ while(available) {
+ if(_bufferLen + available > remaining()){
+ available = remaining() - _bufferLen;
+ }
+ if(_bufferLen + available > 4096) {
+ size_t toBuff = 4096 - _bufferLen;
+ data.read(_buffer + _bufferLen, toBuff);
+ _bufferLen += toBuff;
+ if(!_writeBuffer())
+ return written;
+ written += toBuff;
+ } else {
+ data.read(_buffer + _bufferLen, available);
+ _bufferLen += available;
+ written += available;
+ if(_bufferLen == remaining()) {
+ if(!_writeBuffer()) {
+ return written;
+ }
+ }
+ }
+ if(remaining() == 0)
+ return written;
+ available = data.available();
+ }
+ return written;
+ }
+
+ /*
+ check if there is a firmware on the other OTA partition that you can bootinto
+ */
+ bool canRollBack();
+ /*
+ set the other OTA partition as bootable (reboot to enable)
+ */
+ bool rollBack();
+
+ private:
+ void _reset();
+ void _abort(uint8_t err);
+ bool _writeBuffer();
+ bool _verifyHeader(uint8_t data);
+ bool _verifyEnd();
+ bool _enablePartition(const esp_partition_t* partition);
+
+
+ uint8_t _error;
+ uint8_t *_buffer;
+ uint8_t *_skipBuffer;
+ size_t _bufferLen;
+ size_t _size;
+ THandlerFunction_Progress _progress_callback;
+ uint32_t _progress;
+ uint32_t _paroffset;
+ uint32_t _command;
+ const esp_partition_t* _partition;
+
+ String _target_md5;
+ MD5Builder _md5;
+
+ int _ledPin;
+ uint8_t _ledOn;
+};
+
+extern TasUpdateClass TasUpdate;
+
+#endif // TASUPDATER_H
diff --git a/lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp b/lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp
new file mode 100644
index 000000000..e359ff96f
--- /dev/null
+++ b/lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp
@@ -0,0 +1,404 @@
+#include "TasUpdate.h"
+#include "Arduino.h"
+#include "esp_spi_flash.h"
+#include "esp_ota_ops.h"
+#include "esp_image_format.h"
+
+static const char * _err2str(uint8_t _error){
+ if(_error == UPDATE_ERROR_OK){
+ return ("No Error");
+ } else if(_error == UPDATE_ERROR_WRITE){
+ return ("Flash Write Failed");
+ } else if(_error == UPDATE_ERROR_ERASE){
+ return ("Flash Erase Failed");
+ } else if(_error == UPDATE_ERROR_READ){
+ return ("Flash Read Failed");
+ } else if(_error == UPDATE_ERROR_SPACE){
+ return ("Not Enough Space");
+ } else if(_error == UPDATE_ERROR_SIZE){
+ return ("Bad Size Given");
+ } else if(_error == UPDATE_ERROR_STREAM){
+ return ("Stream Read Timeout");
+ } else if(_error == UPDATE_ERROR_MD5){
+ return ("MD5 Check Failed");
+ } else if(_error == UPDATE_ERROR_MAGIC_BYTE){
+ return ("Wrong Magic Byte");
+ } else if(_error == UPDATE_ERROR_ACTIVATE){
+ return ("Could Not Activate The Firmware");
+ } else if(_error == UPDATE_ERROR_NO_PARTITION){
+ return ("Partition Could Not be Found");
+ } else if(_error == UPDATE_ERROR_BAD_ARGUMENT){
+ return ("Bad Argument");
+ } else if(_error == UPDATE_ERROR_ABORT){
+ return ("Aborted");
+ }
+ return ("UNKNOWN");
+}
+
+static bool _partitionIsBootable(const esp_partition_t* partition){
+ uint8_t buf[ENCRYPTED_BLOCK_SIZE];
+ if(!partition){
+ return false;
+ }
+ if(!ESP.partitionRead(partition, 0, (uint32_t*)buf, ENCRYPTED_BLOCK_SIZE)) {
+ return false;
+ }
+
+ if(buf[0] != ESP_IMAGE_HEADER_MAGIC) {
+ return false;
+ }
+ return true;
+}
+
+bool TasUpdateClass::_enablePartition(const esp_partition_t* partition){
+ if(!partition){
+ return false;
+ }
+ return ESP.partitionWrite(partition, 0, (uint32_t*) _skipBuffer, ENCRYPTED_BLOCK_SIZE);
+}
+
+TasUpdateClass::TasUpdateClass()
+: _error(0)
+, _buffer(0)
+, _bufferLen(0)
+, _size(0)
+, _progress_callback(NULL)
+, _progress(0)
+, _paroffset(0)
+, _command(U_FLASH)
+, _partition(NULL)
+{
+}
+
+TasUpdateClass& TasUpdateClass::onProgress(THandlerFunction_Progress fn) {
+ _progress_callback = fn;
+ return *this;
+}
+
+void TasUpdateClass::_reset() {
+ if (_buffer)
+ delete[] _buffer;
+ _buffer = 0;
+ _bufferLen = 0;
+ _progress = 0;
+ _size = 0;
+ _command = U_FLASH;
+
+ if(_ledPin != -1) {
+ digitalWrite(_ledPin, !_ledOn); // off
+ }
+}
+
+bool TasUpdateClass::canRollBack(){
+ if(_buffer){ //Update is running
+ return false;
+ }
+ const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL);
+ return _partitionIsBootable(partition);
+}
+
+bool TasUpdateClass::rollBack(){
+ if(_buffer){ //Update is running
+ return false;
+ }
+ const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL);
+ return _partitionIsBootable(partition) && !esp_ota_set_boot_partition(partition);
+}
+
+// Start Tasmota Factory patch
+//bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn, const char *label) {
+bool TasUpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn, const char *label, bool factory) {
+// End Tasmota Factory patch
+ if(_size > 0){
+ log_w("already running");
+ return false;
+ }
+
+ _ledPin = ledPin;
+ _ledOn = !!ledOn; // 0(LOW) or 1(HIGH)
+
+ _reset();
+ _error = 0;
+ _target_md5 = emptyString;
+ _md5 = MD5Builder();
+
+ if(size == 0) {
+ _error = UPDATE_ERROR_SIZE;
+ return false;
+ }
+
+ if (command == U_FLASH) {
+// Start Tasmota Factory patch
+// _partition = esp_ota_get_next_update_partition(NULL);
+ if (factory) {
+ _partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL);
+ } else {
+ _partition = esp_ota_get_next_update_partition(NULL);
+ }
+// End Tasmota Factory patch
+ if(!_partition){
+ _error = UPDATE_ERROR_NO_PARTITION;
+ return false;
+ }
+ log_d("OTA Partition: %s", _partition->label);
+ }
+ else if (command == U_SPIFFS) {
+ _partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, label);
+ _paroffset = 0;
+ if(!_partition){
+ _partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, NULL);
+ _paroffset = 0x1000; //Offset for ffat, assuming size is already corrected
+ if(!_partition){
+ _error = UPDATE_ERROR_NO_PARTITION;
+ return false;
+ }
+ }
+ }
+ else {
+ _error = UPDATE_ERROR_BAD_ARGUMENT;
+ log_e("bad command %u", command);
+ return false;
+ }
+
+ if(size == UPDATE_SIZE_UNKNOWN){
+ size = _partition->size;
+ } else if(size > _partition->size){
+ _error = UPDATE_ERROR_SIZE;
+ log_e("too large %u > %u", size, _partition->size);
+ return false;
+ }
+
+ //initialize
+ _buffer = (uint8_t*)malloc(SPI_FLASH_SEC_SIZE);
+ if(!_buffer){
+ log_e("malloc failed");
+ return false;
+ }
+ _size = size;
+ _command = command;
+ _md5.begin();
+ return true;
+}
+
+void TasUpdateClass::_abort(uint8_t err){
+ _reset();
+ _error = err;
+}
+
+void TasUpdateClass::abort(){
+ _abort(UPDATE_ERROR_ABORT);
+}
+
+bool TasUpdateClass::_writeBuffer(){
+ //first bytes of new firmware
+ uint8_t skip = 0;
+ if(!_progress && _command == U_FLASH){
+ //check magic
+ if(_buffer[0] != ESP_IMAGE_HEADER_MAGIC){
+ _abort(UPDATE_ERROR_MAGIC_BYTE);
+ return false;
+ }
+
+ //Stash the first 16 bytes of data and set the offset so they are
+ //not written at this point so that partially written firmware
+ //will not be bootable
+ skip = ENCRYPTED_BLOCK_SIZE;
+ _skipBuffer = (uint8_t*)malloc(skip);
+ if(!_skipBuffer){
+ log_e("malloc failed");
+ return false;
+ }
+ memcpy(_skipBuffer, _buffer, skip);
+ }
+ if (!_progress && _progress_callback) {
+ _progress_callback(0, _size);
+ }
+ if(!ESP.partitionEraseRange(_partition, _progress, SPI_FLASH_SEC_SIZE)){
+ _abort(UPDATE_ERROR_ERASE);
+ return false;
+ }
+ if (!ESP.partitionWrite(_partition, _progress + skip, (uint32_t*)_buffer + skip/sizeof(uint32_t), _bufferLen - skip)) {
+ _abort(UPDATE_ERROR_WRITE);
+ return false;
+ }
+ //restore magic or md5 will fail
+ if(!_progress && _command == U_FLASH){
+ _buffer[0] = ESP_IMAGE_HEADER_MAGIC;
+ }
+ _md5.add(_buffer, _bufferLen);
+ _progress += _bufferLen;
+ _bufferLen = 0;
+ if (_progress_callback) {
+ _progress_callback(_progress, _size);
+ }
+ return true;
+}
+
+bool TasUpdateClass::_verifyHeader(uint8_t data) {
+ if(_command == U_FLASH) {
+ if(data != ESP_IMAGE_HEADER_MAGIC) {
+ _abort(UPDATE_ERROR_MAGIC_BYTE);
+ return false;
+ }
+ return true;
+ } else if(_command == U_SPIFFS) {
+ return true;
+ }
+ return false;
+}
+
+bool TasUpdateClass::_verifyEnd() {
+ if(_command == U_FLASH) {
+ if(!_enablePartition(_partition) || !_partitionIsBootable(_partition)) {
+ _abort(UPDATE_ERROR_READ);
+ return false;
+ }
+
+ if(esp_ota_set_boot_partition(_partition)){
+ _abort(UPDATE_ERROR_ACTIVATE);
+ return false;
+ }
+ _reset();
+ return true;
+ } else if(_command == U_SPIFFS) {
+ _reset();
+ return true;
+ }
+ return false;
+}
+
+bool TasUpdateClass::setMD5(const char * expected_md5){
+ if(strlen(expected_md5) != 32)
+ {
+ return false;
+ }
+ _target_md5 = expected_md5;
+ return true;
+}
+
+bool TasUpdateClass::end(bool evenIfRemaining){
+ if(hasError() || _size == 0){
+ return false;
+ }
+
+ if(!isFinished() && !evenIfRemaining){
+ log_e("premature end: res:%u, pos:%u/%u\n", getError(), progress(), _size);
+ _abort(UPDATE_ERROR_ABORT);
+ return false;
+ }
+
+ if(evenIfRemaining) {
+ if(_bufferLen > 0) {
+ _writeBuffer();
+ }
+ _size = progress();
+ }
+
+ _md5.calculate();
+ if(_target_md5.length()) {
+ if(_target_md5 != _md5.toString()){
+ _abort(UPDATE_ERROR_MD5);
+ return false;
+ }
+ }
+
+ return _verifyEnd();
+}
+
+size_t TasUpdateClass::write(uint8_t *data, size_t len) {
+ if(hasError() || !isRunning()){
+ return 0;
+ }
+
+ if(len > remaining()){
+ _abort(UPDATE_ERROR_SPACE);
+ return 0;
+ }
+
+ size_t left = len;
+
+ while((_bufferLen + left) > SPI_FLASH_SEC_SIZE) {
+ size_t toBuff = SPI_FLASH_SEC_SIZE - _bufferLen;
+ memcpy(_buffer + _bufferLen, data + (len - left), toBuff);
+ _bufferLen += toBuff;
+ if(!_writeBuffer()){
+ return len - left;
+ }
+ left -= toBuff;
+ }
+ memcpy(_buffer + _bufferLen, data + (len - left), left);
+ _bufferLen += left;
+ if(_bufferLen == remaining()){
+ if(!_writeBuffer()){
+ return len - left;
+ }
+ }
+ return len;
+}
+
+size_t TasUpdateClass::writeStream(Stream &data) {
+ size_t written = 0;
+ size_t toRead = 0;
+ int timeout_failures = 0;
+
+ if(hasError() || !isRunning())
+ return 0;
+
+ if(!_verifyHeader(data.peek())) {
+ _reset();
+ return 0;
+ }
+
+ if(_ledPin != -1) {
+ pinMode(_ledPin, OUTPUT);
+ }
+
+ while(remaining()) {
+ if(_ledPin != -1) {
+ digitalWrite(_ledPin, _ledOn); // Switch LED on
+ }
+ size_t bytesToRead = SPI_FLASH_SEC_SIZE - _bufferLen;
+ if(bytesToRead > remaining()) {
+ bytesToRead = remaining();
+ }
+
+ /*
+ Init read&timeout counters and try to read, if read failed, increase counter,
+ wait 100ms and try to read again. If counter > 300 (30 sec), give up/abort
+ */
+ toRead = 0;
+ timeout_failures = 0;
+ while(!toRead) {
+ toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
+ if(toRead == 0) {
+ timeout_failures++;
+ if (timeout_failures >= 300) {
+ _abort(UPDATE_ERROR_STREAM);
+ return written;
+ }
+ delay(100);
+ }
+ }
+
+ if(_ledPin != -1) {
+ digitalWrite(_ledPin, !_ledOn); // Switch LED off
+ }
+ _bufferLen += toRead;
+ if((_bufferLen == remaining() || _bufferLen == SPI_FLASH_SEC_SIZE) && !_writeBuffer())
+ return written;
+ written += toRead;
+
+ delay(1); // Fix solo WDT
+ }
+ return written;
+}
+
+void TasUpdateClass::printError(Print &out){
+ out.println(_err2str(_error));
+}
+
+const char * TasUpdateClass::errorString(){
+ return _err2str(_error);
+}
+
+TasUpdateClass TasUpdate;
diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h
index 59c63801a..a4c6a602e 100644
--- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h
+++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h
@@ -45,7 +45,6 @@ extern void analogWritePhase(uint8_t pin, uint32_t duty, uint32_t phase = 0);
#define ETS_UART_INTR_ENABLE()
#define ESPhttpUpdate httpUpdate
-#define getFlashChipRealSize() getFlashChipSize()
#define os_delay_us ets_delay_us
// Serial minimal type to hold the config
diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp
index da9b42645..4cfc6dbd2 100644
--- a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp
+++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp
@@ -171,6 +171,9 @@ public:
operator bool() {
return (bool) _f;
}
+ bool setBufferSize(size_t size) {
+ return true;
+ }
protected:
File _f;
@@ -226,6 +229,10 @@ public:
// do nothing
}
+ bool setBufferSize(size_t size) {
+ return true;
+ }
+
bool seek(uint32_t pos, SeekMode mode) {
// AddLog(LOG_LEVEL_DEBUG, "ZIP: seek pos=%i mode=%i", pos, mode);
if (SeekSet == mode) {
@@ -386,8 +393,26 @@ bool ZipArchive::parse(void) {
**
********************************************************************/
+/* get the FS corresponding to the prefix, typically /sd/ for sdcard */
+FS * ZipReadFSImpl::getFS(const char *path) const {
+ if (_fs == nullptr) { return nullptr; }
+ if (_alt_fs == nullptr || _alt_fs_prefix == nullptr) { return *_fs; }
+
+ /* from now neither _fs not _alt_fs are null
+ /* if however they point to the same value, then we don't have an alternative FS */
+ if (*_fs == *_alt_fs) { return *_fs; }
+
+ /* check prefix */
+ if (strncmp(_alt_fs_prefix, path, strlen(_alt_fs_prefix))) {
+ return *_alt_fs;
+ } else {
+ return *_fs;
+ }
+}
+
FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool create) {
- if (*_fs == nullptr) { return nullptr; }
+ FS * fs = getFS(path);
+ if (fs == nullptr) { return nullptr; }
if (strchr(path, '#')) {
// we don't support any other mode than "r" and no-create
@@ -407,7 +432,7 @@ FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool c
if (*suffix == '/') { suffix++; }
// AddLog(LOG_LEVEL_DEBUG, "ZIP: prefix=%s suffix=%s", prefix, suffix);
// parse ZIP archive
- File zipfile = (*_fs)->open(prefix, "r", false);
+ File zipfile = fs->open(prefix, "r", false);
if ((bool)zipfile) {
// we could read the file
ZipArchive zip_archive = ZipArchive(&zipfile);
@@ -417,7 +442,7 @@ FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool c
if (entry.file_name.equals(suffix)) {
// found
// AddLog(LOG_LEVEL_DEBUG, "ZIP: file '%s' in archive (start=%i - len=%i - last_mod=%i)", suffix, entry.file_start, entry.file_len, entry.last_mod);
- return ZipItemImplPtr(new ZipItemImpl((*_fs)->open(prefix, "r", false), entry.file_start, entry.file_len, entry.last_mod));
+ return ZipItemImplPtr(new ZipItemImpl(fs->open(prefix, "r", false), entry.file_start, entry.file_len, entry.last_mod));
}
}
return ZipReadFileImplPtr(); // return an error
@@ -427,12 +452,13 @@ FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool c
}
} else {
// simple file, do nothing
- return ZipReadFileImplPtr(new ZipReadFileImpl((*_fs)->open(path, mode, create)));
+ return ZipReadFileImplPtr(new ZipReadFileImpl(fs->open(path, mode, create)));
}
}
bool ZipReadFSImpl::exists(const char* path) {
- if (*_fs == nullptr) { return false; }
+ FS * fs = getFS(path);
+ if (fs == nullptr) { return false; }
if (strchr(path, '#')) {
// treat as a ZIP archive
@@ -444,7 +470,7 @@ bool ZipReadFSImpl::exists(const char* path) {
char *prefix = strtok_r(sub_path, "#", &tok);
char *suffix = strtok_r(NULL, "", &tok);
// parse ZIP archive
- File zipfile = (*_fs)->open(prefix, "r", false);
+ File zipfile = fs->open(prefix, "r", false);
if ((bool)zipfile) {
// we could read the file
ZipArchive zip_archive = ZipArchive(&zipfile);
@@ -459,7 +485,7 @@ bool ZipReadFSImpl::exists(const char* path) {
return false;
} else {
// simple file, do nothing
- return (*_fs)->exists(path);
+ return fs->exists(path);
}
}
diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h
index ff0e2f997..7c41f7623 100644
--- a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h
+++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h
@@ -17,40 +17,32 @@ typedef std::shared_ptr ZipReadFSImplPtr;
class ZipReadFSImpl : public FSImpl {
public:
- ZipReadFSImpl(FS **fs) : _fs(fs) {};
+ ZipReadFSImpl(FS **fs) : _fs(fs), _alt_fs(nullptr), _alt_fs_prefix(nullptr) {};
+ ZipReadFSImpl(FS **fs, const char *alt_fs_prefix, FS **alt_fs) : _fs(fs), _alt_fs(alt_fs), _alt_fs_prefix(alt_fs_prefix) {};
virtual ~ZipReadFSImpl();
+ /* get the FS corresponding to the prefix, typically /sd/ for sdcard */
+ FS * getFS(const char *path) const;
+
FileImplPtr open(const char* path, const char* mode, const bool create);
bool exists(const char* path);
bool rename(const char* pathFrom, const char* pathTo) {
- if (*_fs) {
- return (*_fs)->rename(pathFrom, pathTo);
- } else {
- return false;
- }
+ FS * fs = getFS(pathFrom);
+ return fs ? fs->rename(pathFrom, pathTo) : false;
}
bool remove(const char* path) {
- if (*_fs) {
- return (*_fs)->remove(path);
- } else {
- return false;
- }
+ FS * fs = getFS(path);
+ return fs ? fs->remove(path) : false;
}
bool mkdir(const char *path) {
- if (*_fs) {
- return (*_fs)->mkdir(path);
- } else {
- return false;
- }
+ FS * fs = getFS(path);
+ return fs ? fs->mkdir(path) : false;
}
bool rmdir(const char *path) {
- if (*_fs) {
- return (*_fs)->rmdir(path);
- } else {
- return false;
- }
+ FS * fs = getFS(path);
+ return fs ? fs->rmdir(path) : false;
}
void mountpoint(const char *) {
};
@@ -60,6 +52,8 @@ public:
private:
FS **_fs;
+ FS **_alt_fs;
+ const char *_alt_fs_prefix;
};
#endif // ESP32
diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c
index 000e36881..73f8c29df 100644
--- a/lib/libesp32/berry/default/be_modtab.c
+++ b/lib/libesp32/berry/default/be_modtab.c
@@ -46,13 +46,19 @@ be_extern_native_module(hue_ntv);
be_extern_native_module(hue_bridge);
be_extern_native_module(uuid);
be_extern_native_module(animate);
+be_extern_native_module(partition_core);
+be_extern_native_module(crc);
+be_extern_native_module(crypto);
+#ifdef USE_ZIGBEE
+be_extern_native_module(zigbee);
+#endif // USE_ZIGBEE
#ifdef USE_LVGL
be_extern_native_module(lv);
be_extern_native_module(lv_extra);
be_extern_native_module(lv_tasmota);
-#ifdef USE_LVGL_OPENHASP
-be_extern_native_module(openhasp);
-#endif // USE_LVGL_OPENHASP
+#ifdef USE_LVGL_HASPMOTA
+be_extern_native_module(haspmota);
+#endif // USE_LVGL_HASPMOTA
#endif // USE_LVGL
/* user-defined modules declare start */
@@ -135,9 +141,9 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = {
&be_native_module(lv),
&be_native_module(lv_extra),
&be_native_module(lv_tasmota),
-#ifdef USE_LVGL_OPENHASP
- &be_native_module(openhasp),
-#endif // USE_LVGL_OPENHASP
+#ifdef USE_LVGL_HASPMOTA
+ &be_native_module(haspmota),
+#endif // USE_LVGL_HASPMOTA
#endif // USE_LVGL
#ifdef USE_ENERGY_SENSOR
&be_native_module(energy),
@@ -145,7 +151,15 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = {
#ifdef USE_WEBSERVER
&be_native_module(webserver),
#endif // USE_WEBSERVER
+#ifdef USE_ZIGBEE
+ &be_native_module(zigbee),
+#endif // USE_ZIGBEE
&be_native_module(flash),
+ &be_native_module(partition_core),
+ &be_native_module(crc),
+#ifdef USE_ALEXA_AVS
+ &be_native_module(crypto),
+#endif
/* user-defined modules register end */
NULL /* do not remove */
@@ -179,6 +193,7 @@ be_extern_native_class(md5);
be_extern_native_class(udp);
be_extern_native_class(webclient);
be_extern_native_class(tcpclient);
+be_extern_native_class(energy_struct);
// BLE
be_extern_native_class(MI32);
be_extern_native_class(BLE);
@@ -230,6 +245,9 @@ BERRY_LOCAL bclass_array be_class_table = {
&be_native_class(Leds),
&be_native_class(Leds_animator),
#endif // USE_WS2812
+#ifdef USE_ENERGY_SENSOR
+ &be_native_class(energy_struct),
+#endif // USE_ENERGY_SENSOR
#ifdef USE_LVGL
&be_native_class(LVGL_glob),
@@ -266,7 +284,6 @@ BERRY_LOCAL bclass_array be_class_table = {
NULL, /* do not remove */
};
-extern void be_load_crypto_lib(bvm *vm);
extern void be_load_ctypes_energy_definitions_lib(bvm *vm);
/* this code loads the native class definitions */
@@ -278,10 +295,4 @@ BERRY_API void be_load_custom_libs(bvm *vm)
#if !BE_USE_PRECOMPILED_OBJECT
/* be_load_xxxlib(vm); */
#endif
-#ifdef USE_ALEXA_AVS
- be_load_crypto_lib(vm); // sub-module
-#endif
-#ifdef USE_ENERGY_SENSOR
- be_load_ctypes_energy_definitions_lib(vm); // ctype class
-#endif // USE_ENERGY_SENSOR
}
diff --git a/lib/libesp32/berry/default/berry_conf.h b/lib/libesp32/berry/default/berry_conf.h
index 43994b22d..c70af7945 100644
--- a/lib/libesp32/berry/default/berry_conf.h
+++ b/lib/libesp32/berry/default/berry_conf.h
@@ -12,7 +12,7 @@
#ifdef COMPILE_BERRY_LIB
#include "my_user_config.h"
- #include "tasmota_configurations.h"
+ #include "include/tasmota_configurations.h"
#endif
/* Macro: BE_DEBUG
@@ -175,6 +175,14 @@
**/
#define BE_USE_DEBUG_GC 0
+/* Macro: BE_USE_DEBUG_STACK
+ * Enable Stack Resize debug mode. At each function call
+ * the stack is reallocated at a different memory location
+ * and the previous location is cleared with toxic data.
+ * Default: 0
+ **/
+#define BE_USE_DEBUG_STACK 0
+
/* Macro: BE_USE_MEM_ALIGNED
* Some embedded processors have special memory areas
* with read/write constraints of being aligned to 32 bits boundaries.
diff --git a/lib/libesp32/berry/gen.sh b/lib/libesp32/berry/gen.sh
index 7156e8719..ee97feeef 100755
--- a/lib/libesp32/berry/gen.sh
+++ b/lib/libesp32/berry/gen.sh
@@ -1,2 +1,8 @@
#!/bin/bash
+#
+# generate all precompiled Berry structures from multiple modules
+#
+# Should be eventually included in the build process
+#
+rm generate/be_*.h
python3 tools/pycoc/main.py -o generate src default ../berry_tasmota/src ../berry_mapping/src ../berry_int64/src ../../libesp32_lvgl/lv_binding_berry/src ../../libesp32_lvgl/lv_binding_berry/generate -c default/berry_conf.h
diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h
index 26d4948b0..8c3adf264 100644
--- a/lib/libesp32/berry/generate/be_const_strtab.h
+++ b/lib/libesp32/berry/generate/be_const_strtab.h
@@ -1,27 +1,19 @@
extern const bcstring be_const_str_;
-extern const bcstring be_const_str_AES_GCM;
-extern const bcstring be_const_str_ALIGN_BOTTOM_MID;
-extern const bcstring be_const_str_ALIGN_LEFT_MID;
+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_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_Auto_X2Dconfiguration;
extern const bcstring be_const_str_BECDFE;
-extern const bcstring be_const_str_BLE;
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_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;
@@ -46,37 +38,32 @@ extern const bcstring be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marke
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_COLOR_BLACK;
-extern const bcstring be_const_str_COLOR_WHITE;
extern const bcstring be_const_str_CT;
extern const bcstring be_const_str_DIMMER;
-extern const bcstring be_const_str_EC_C25519;
+extern const bcstring be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
extern const bcstring be_const_str_EVENT_DELETE;
-extern const bcstring be_const_str_EVENT_DRAW_MAIN;
-extern const bcstring be_const_str_EVENT_DRAW_PART_BEGIN;
-extern const bcstring be_const_str_EVENT_DRAW_PART_END;
-extern const bcstring be_const_str_EXTERNAL_I2S;
+extern const bcstring be_const_str_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_INTERNAL_DAC;
-extern const bcstring be_const_str_INTERNAL_PDM;
+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_OneWire;
-extern const bcstring be_const_str_PART_MAIN;
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_RES_OK;
extern const bcstring be_const_str_RGB;
extern const bcstring be_const_str_RGBCT;
extern const bcstring be_const_str_RGBW;
@@ -106,11 +93,10 @@ 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_STATE_DEFAULT;
extern const bcstring be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27;
-extern const bcstring be_const_str_TASMOTA;
extern const bcstring be_const_str_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;
@@ -120,7 +106,10 @@ 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;
@@ -132,20 +121,20 @@ 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__X2502d_X25s_X2502d;
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__X2D_X2D_X3A_X2D_X2D;
extern const bcstring be_const_str__X2E;
extern const bcstring be_const_str__X2E_X2E;
extern const bcstring be_const_str__X2Eautoconf;
@@ -153,8 +142,6 @@ 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__X2Ep1;
-extern const bcstring be_const_str__X2Ep2;
extern const bcstring be_const_str__X2Esize;
extern const bcstring be_const_str__X2Etapp;
extern const bcstring be_const_str__X2Ew;
@@ -172,6 +159,9 @@ 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;
@@ -195,6 +185,7 @@ 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;
@@ -227,7 +218,6 @@ 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__lvgl;
extern const bcstring be_const_str__p;
extern const bcstring be_const_str__persist_X2Ejson;
extern const bcstring be_const_str__ptr;
@@ -237,36 +227,33 @@ 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__splash;
+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__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_acos;
+extern const bcstring be_const_str_active_otadata;
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_event_cb;
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_adv_block;
-extern const bcstring be_const_str_adv_cb;
-extern const bcstring be_const_str_adv_watch;
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_arc_dsc;
+extern const bcstring be_const_str_app;
extern const bcstring be_const_str_arch;
-extern const bcstring be_const_str_area;
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;
@@ -281,7 +268,6 @@ 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_atleast1;
extern const bcstring be_const_str_attrdump;
extern const bcstring be_const_str_autoexec;
extern const bcstring be_const_str_autorun;
@@ -322,8 +308,6 @@ 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_clock;
-extern const bcstring be_const_str_clock_icon;
extern const bcstring be_const_str_close;
extern const bcstring be_const_str_closure;
extern const bcstring be_const_str_cmd;
@@ -331,21 +315,17 @@ 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_color;
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_conn_cb;
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_consume_mono;
-extern const bcstring be_const_str_consume_silence;
-extern const bcstring be_const_str_consume_stereo;
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;
@@ -353,11 +333,17 @@ 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;
@@ -366,18 +352,15 @@ 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_decode;
extern const bcstring be_const_str_decompress;
-extern const bcstring be_const_str_decrypt;
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_del;
extern const bcstring be_const_str_delay;
extern const bcstring be_const_str_delete_all_configs;
-extern const bcstring be_const_str_depower;
extern const bcstring be_const_str_deregister_obj;
extern const bcstring be_const_str_destructor_cb;
extern const bcstring be_const_str_detect;
@@ -385,38 +368,28 @@ 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_dim;
-extern const bcstring be_const_str_dimmer;
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_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_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_encrypt;
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_event_send;
extern const bcstring be_const_str_every_100ms;
extern const bcstring be_const_str_every_250ms;
extern const bcstring be_const_str_every_50ms;
@@ -428,9 +401,11 @@ 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;
@@ -438,16 +413,16 @@ 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_font_embedded;
-extern const bcstring be_const_str_font_montserrat;
-extern const bcstring be_const_str_font_seg7;
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;
@@ -460,6 +435,7 @@ 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;
@@ -469,34 +445,29 @@ 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_coords;
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_height;
-extern const bcstring be_const_str_get_hor_res;
+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_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_percentage;
+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_style_bg_color;
-extern const bcstring be_const_str_get_style_line_color;
-extern const bcstring be_const_str_get_style_pad_right;
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_get_width;
extern const bcstring be_const_str_getbits;
extern const bcstring be_const_str_getfloat;
extern const bcstring be_const_str_geti;
@@ -507,6 +478,7 @@ 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_height_def;
extern const bcstring be_const_str_hex;
extern const bcstring be_const_str_hour;
@@ -521,12 +493,9 @@ 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_img;
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_init_draw_arc_dsc;
-extern const bcstring be_const_str_init_draw_line_dsc;
extern const bcstring be_const_str_input;
extern const bcstring be_const_str_ins_goto;
extern const bcstring be_const_str_ins_ramp;
@@ -540,16 +509,18 @@ 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_invalidate;
+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_ip;
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_ismethod;
extern const bcstring be_const_str_isnan;
-extern const bcstring be_const_str_isrunning;
extern const bcstring be_const_str_issubclass;
extern const bcstring be_const_str_item;
extern const bcstring be_const_str_iter;
@@ -569,22 +540,17 @@ extern const bcstring be_const_str_light_X20must_X20be_X20of_X20class_X20_X27lig
extern const bcstring be_const_str_light_state;
extern const bcstring be_const_str_light_to_id;
extern const bcstring be_const_str_lights;
-extern const bcstring be_const_str_line_dsc;
extern const bcstring be_const_str_list;
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_freetype_font;
+extern const bcstring be_const_str_load_otadata;
extern const bcstring be_const_str_load_templates;
-extern const bcstring be_const_str_local;
extern const bcstring be_const_str_log;
extern const bcstring be_const_str_log10;
-extern const bcstring be_const_str_loop;
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_clock;
-extern const bcstring be_const_str_lv_clock_icon;
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;
@@ -594,15 +560,9 @@ 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_signal_arcs;
-extern const bcstring be_const_str_lv_signal_bars;
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_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_lvgl_event_dispatch;
extern const bcstring be_const_str_lvgl_timer_dispatch;
extern const bcstring be_const_str_make_cb;
@@ -610,17 +570,20 @@ 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_minute;
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_montserrat_font;
+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;
@@ -631,30 +594,31 @@ 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;
extern const bcstring be_const_str_obj_class_create_obj;
-extern const bcstring be_const_str_obj_event_base;
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_p1;
-extern const bcstring be_const_str_p2;
extern const bcstring be_const_str_page_autoconf_ctl;
extern const bcstring be_const_str_page_autoconf_mgr;
-extern const bcstring be_const_str_param;
+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_pct;
-extern const bcstring be_const_str_percentage;
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;
@@ -662,7 +626,6 @@ 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;
extern const bcstring be_const_str_point_arr;
extern const bcstring be_const_str_pop;
extern const bcstring be_const_str_pop_path;
@@ -671,18 +634,17 @@ 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_public_key;
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_quality;
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;
@@ -696,10 +658,6 @@ 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_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_obj;
extern const bcstring be_const_str_remote_ip;
extern const bcstring be_const_str_remote_port;
@@ -710,8 +668,8 @@ extern const bcstring be_const_str_remove_driver;
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_reset;
-extern const bcstring be_const_str_reset_search;
extern const bcstring be_const_str_resize;
extern const bcstring be_const_str_resolvecmnd;
extern const bcstring be_const_str_resp_cmnd;
@@ -725,9 +683,6 @@ 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_round_end;
-extern const bcstring be_const_str_round_start;
-extern const bcstring be_const_str_rounded;
extern const bcstring be_const_str_rtc;
extern const bcstring be_const_str_rule;
extern const bcstring be_const_str_run;
@@ -740,33 +695,24 @@ 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_scr_act;
-extern const bcstring be_const_str_screenshot;
-extern const bcstring be_const_str_search;
extern const bcstring be_const_str_sec;
-extern const bcstring be_const_str_seg7_font;
-extern const bcstring be_const_str_select;
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_MAC;
-extern const bcstring be_const_str_set_align;
+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_bits_per_sample;
extern const bcstring be_const_str_set_bri;
-extern const bcstring be_const_str_set_channels;
extern const bcstring be_const_str_set_chg_current;
-extern const bcstring be_const_str_set_chr;
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_gain;
-extern const bcstring be_const_str_set_height;
extern const bcstring be_const_str_set_hue16sat;
extern const bcstring be_const_str_set_huesat;
extern const bcstring be_const_str_set_hum;
@@ -776,38 +722,17 @@ 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_mode_ct;
extern const bcstring be_const_str_set_mode_rgb;
-extern const bcstring be_const_str_set_percentage;
+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_rate;
extern const bcstring be_const_str_set_reachable;
extern const bcstring be_const_str_set_rgb;
-extern const bcstring be_const_str_set_size;
-extern const bcstring be_const_str_set_style_bg_color;
-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_pad_all;
-extern const bcstring be_const_str_set_style_pad_right;
-extern const bcstring be_const_str_set_style_radius;
-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_temp;
-extern const bcstring be_const_str_set_text;
-extern const bcstring be_const_str_set_time;
extern const bcstring be_const_str_set_timeouts;
extern const bcstring be_const_str_set_timer;
-extern const bcstring be_const_str_set_user_data;
extern const bcstring be_const_str_set_useragent;
-extern const bcstring be_const_str_set_width;
-extern const bcstring be_const_str_set_x;
extern const bcstring be_const_str_set_xy;
-extern const bcstring be_const_str_set_y;
-extern const bcstring be_const_str_set_zoom;
extern const bcstring be_const_str_setbits;
extern const bcstring be_const_str_setfloat;
extern const bcstring be_const_str_seti;
@@ -815,24 +740,18 @@ 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_shared_key;
extern const bcstring be_const_str_show;
-extern const bcstring be_const_str_signal_arcs;
-extern const bcstring be_const_str_signal_bars;
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_skip;
+extern const bcstring be_const_str_slots;
extern const bcstring be_const_str_solidified;
-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_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_started;
extern const bcstring be_const_str_state;
extern const bcstring be_const_str_static;
extern const bcstring be_const_str_stop;
@@ -844,20 +763,23 @@ 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_tag;
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_target_search;
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_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;
@@ -866,13 +788,14 @@ 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_touch_update;
extern const bcstring be_const_str_toupper;
extern const bcstring be_const_str_tr;
extern const bcstring be_const_str_traceback;
@@ -886,6 +809,7 @@ 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;
@@ -928,13 +852,8 @@ 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;
extern const bcstring be_const_str_width_def;
extern const bcstring be_const_str_wifi;
-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_wire;
extern const bcstring be_const_str_wire1;
extern const bcstring be_const_str_wire2;
@@ -944,13 +863,584 @@ 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_x1;
extern const bcstring be_const_str_xy;
extern const bcstring be_const_str_y;
-extern const bcstring be_const_str_y1;
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__X23000000;
+extern const bcstring be_const_str__X23FFFFFF;
+extern const bcstring be_const_str__X2502d_X25s_X2502d;
+extern const bcstring be_const_str__X27_X20not_X20found;
+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__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_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__attr_ignore;
+extern const bcstring be_const_str__attr_map;
+extern const bcstring be_const_str__dir;
+extern const bcstring be_const_str__event_map;
+extern const bcstring be_const_str__get_bytes;
+extern const bcstring be_const_str__handlers;
+extern const bcstring be_const_str__load;
+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__splash;
+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_arc_dsc;
+extern const bcstring be_const_str_area;
+extern const bcstring be_const_str_atleast1;
+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_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_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_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_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_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_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_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_start_angle;
+extern const bcstring be_const_str_start_angle1;
+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_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_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_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
index d2c51ccaf..697fa3b5c 100644
--- a/lib/libesp32/berry/generate/be_const_strtab_def.h
+++ b/lib/libesp32/berry/generate/be_const_strtab_def.h
@@ -1,872 +1,795 @@
-be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_driver_name);
-be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_autoexec);
-be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_stop);
-be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_editable);
-be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_cb_obj);
-be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_RGBW);
-be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str__X2F_X2Eautoconf);
-be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_write);
-be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_SERIAL_5O1);
-be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_font_embedded);
-be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_INTERNAL_PDM);
-be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_MD5);
-be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_False);
-be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_classname);
-be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_EXTERNAL_I2S);
-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__X2A);
-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_Auto_X2Dconfiguration);
-be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_pc);
-be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_h);
-be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_send_multicast);
-be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_available);
-be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str__settings_def);
-be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27);
-be_define_const_str(_X2C, ",", 688690635u, 0, 1, NULL);
-be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_isnan);
-be_define_const_str(_X2D, "-", 671913016u, 0, 1, NULL);
-be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_BECDFE);
-be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_add_driver);
-be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_load_templates);
-be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, NULL);
-be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_animate);
-be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_RGB);
-be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_get_input_power_status);
-be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_begin);
-be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27);
-be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_AES_GCM);
-be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_get_bri);
-be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E);
-be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_assign_rmt);
-be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_load_freetype_font);
-be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_class_init_obj);
+be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_before_del);
+be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E);
+be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, NULL);
+be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_delay);
+be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_exists);
+be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str__def);
+be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E);
+be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_mqtt_data);
+be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_name);
+be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_destructor_cb);
+be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_get_switches);
+be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_constructor_cb);
+be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_h);
+be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, NULL);
+be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, NULL);
+be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_setmember);
+be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_Unknown);
+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_call);
+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_0x_X2502X);
+be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_clear);
+be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, NULL);
+be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_addr);
+be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_hue_status);
+be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_RGBCT);
+be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_SERIAL_8O1);
+be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_exec_cmd);
+be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str__X2E_X2E);
+be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_connection_error);
+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_assert);
+be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E);
+be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_type_error);
+be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_SERIAL_8O2);
+be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E);
+be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_CFG_X3A_X20loaded_X20_X20);
+be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, NULL);
+be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_add_cb_event_closure);
+be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, NULL);
+be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_ccronexpr);
+be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, NULL);
+be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27);
+be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_remove);
+be_define_const_str(_X2F, "/", 705468254u, 0, 1, NULL);
be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, NULL);
-be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_every_second);
-be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_get_alternate);
-be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_arc_dsc);
-be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str___lower__);
+be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_SK6812_GRBW);
+be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_create_custom_widget);
+be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str___upper__);
+be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
+be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29);
+be_define_const_str(0x_X2502X, "0x%02X", 2626549866u, 0, 6, &be_const_str_ota_);
be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_EVENT_DELETE);
-be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_POST);
-be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "
", 3546571739u, 0, 11, &be_const_str_json_fdump_any);
-be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "", 1863865923u, 0, 16, &be_const_str_loop);
-be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_import);
-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_chars_in_string);
-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_content_send_style);
-be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "", 2052843416u, 0, 25, &be_const_str_CFG_X3A_X20loaded_X20_X20);
-be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "", 2058443583u, 0, 110, &be_const_str_arch);
-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, "", 3546571739u, 0, 11, &be_const_str_MI32);
+be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "", 1863865923u, 0, 16, &be_const_str_lv_extra);
+be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_active_otadata);
+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_True);
+be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str__archive);
+be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "", 2052843416u, 0, 25, &be_const_str_pc);
+be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "", 2058443583u, 0, 110, &be_const_str_c);
+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, "")
end
webserver.content_send("")
@@ -562,8 +564,8 @@ class Partition_manager_UI
def page_show_spiffs(slot, free_mem)
import webserver
import string
- webserver.content_send(string.format("