From 14c0a42203d9664bd4aa4054ace500755d240e99 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 16 Nov 2024 17:47:18 +0100 Subject: [PATCH] Bump version v14.3.0.7 - ESP32 max number of supported switches/buttons/relays from 28 to 32 - ESP32 max number of interlocks from 14 to 16 --- CHANGELOG.md | 15 +- RELEASENOTES.md | 4 +- .../HTTP_SCRIPT_MODULE_TEMPLATE.h | 24 +-- .../HTTP_SCRIPT_MODULE_TEMPLATE.h | 2 +- tasmota/include/tasmota.h | 13 +- tasmota/include/tasmota_template.h | 174 +++++++++--------- tasmota/include/tasmota_types.h | 34 ++-- tasmota/include/tasmota_version.h | 2 +- tasmota/tasmota_support/settings.ino | 10 + tasmota/tasmota_support/support.ino | 1 + tasmota/tasmota_support/support_command.ino | 4 +- 11 files changed, 151 insertions(+), 132 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d776ec2b4..dcef330d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,20 +3,27 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [14.3.0.6] +## [14.3.0.7] ### Added -- Add command ``WebColor20`` to control color of Button when Off ### Breaking Changed +### Fixed + +### Removed + ### Changed +- ESP32 max number of supported switches/buttons/relays from 28 to 32 +- ESP32 max number of interlocks from 14 to 16 + +## [14.3.0.6] 20241116 +### Added +- Add command ``WebColor20`` to control color of Button when Off ### Fixed - Matter provisioning with matter.js controller (#22470) - Prevent crashing when `display.ini` is missing end `#` (#22471) -### Removed - ## [14.3.0.5] 20241111 ### Added - ESP32 MI32 legacy add config operations (#22458) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index eac5e949c..ed100cf8d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -114,7 +114,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v14.3.0.6 +## Changelog v14.3.0.7 ### Added - Add command ``WebColor20`` to control color of Button when Off - DALI support for short addresses (gear) and groups @@ -157,6 +157,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - DALI renamed commands `DaliCommission` to `DaliScan` and `DaliWeb` to `DaliLight` - DALI set Tasmota light control as default - Shutter optimized behavior to publish shutter data with sensor request [#22353](https://github.com/arendst/Tasmota/issues/22353) +- ESP32 max number of supported switches/buttons/relays from 28 to 32 +- ESP32 max number of interlocks from 14 to 16 - HASPmota support for page delete and object updates [#22311](https://github.com/arendst/Tasmota/issues/22311) ### Fixed diff --git a/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h b/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h index e7f059b0b..99c40b1ac 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h @@ -2,7 +2,7 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_MODULE_TEMPLATE_SIZE = 602; +const size_t HTTP_SCRIPT_MODULE_TEMPLATE_SIZE = 589; const char HTTP_SCRIPT_MODULE_TEMPLATE_COMPRESSED[] PROGMEM = "\x33\xBF\xAC\xF1\xD4\x2B\xC7\x83\x02\xF8\x3A\xDC\xE4\x1B\x3B\xBA\x75\x1A\x8E\xF1" "\xED\x33\xBF\xAC\x3E\x09\x81\x8B\x1A\xFA\x8E\x81\xFD\xDD\x32\x61\x31\xAF\xA8\xEE" "\x9F\x78\x32\xB7\x38\xFB\x3B\xC7\x8C\x3A\x53\x36\x51\x07\x9D\x4F\xA8\xF9\xA7\x83" @@ -15,16 +15,16 @@ const char HTTP_SCRIPT_MODULE_TEMPLATE_COMPRESSED[] PROGMEM = "\x33\xBF\xAC\xF1\ "\x0C\x3A\x7D\x8D\xC3\x36\x08\x3B\x70\x24\xE0\x87\x78\xF0\x7B\x82\x3E\x0A\x04\xAC" "\xC8\xE3\x3C\x16\x9E\x81\x1E\x34\xED\x9D\xB3\xBC\x7B\x43\x3E\x0A\xF1\xEF\x69\xEF" "\x82\x17\x2A\x01\xE7\x8D\x30\x77\x6C\xF8\x7C\x0C\xEF\x1E\xD1\xC0\x89\x50\xE3\x70" - "\x8C\x1E\x07\x7D\xD9\xA1\xE0\xF7\x1E\xEF\x1F\x87\xE1\xF0\xE6\x90\x21\x64\x47\x21" - "\xE0\xB4\xF4\x3E\x0E\x04\x2C\x8D\x9D\xD3\xBB\xA7\xA1\xC8\xCE\xF1\xDA\x3B\xA7\xD9" - "\xDC\x3E\xCE\xD9\x69\xDE\x3C\xF4\xEA\xA3\xBC\x78\x3D\xCC\x71\xDD\x3E\xC5\x1F\x67" - "\x6C\x78\xEF\x1D\x0C\xEC\x21\x6C\xF8\x2C\xED\x9C\x87\x82\xA3\xA7\xA8\xC8\x26\x74" - "\x33\xDF\x68\xED\x0B\x68\xC8\xF8\x77\x47\x1F\x87\x19\xDE\x3B\x47\xD9\xF6\x79\x9F" - "\x64\x2B\x44\x11\xF1\xF6\x08\xDC\x58\xF8\xD0\xEE\xF8\xEA\x1E\x04\x3E\x42\xF3\xC7" - "\x4F\xB1\x81\x58\x6C\xEE\x9D\x87\xB8\xE5\x1D\x84\x3C\x75\x1E\xC3\xD0\x10\x78\x4B" - "\x40\x83\x9E\x9F\x67\xB0\xEF\x02\x35\xD3\x96\x76\x10\xF1\xD4\x7B\x0F\x43\xB0\x10" - "\x6F\x1F\x87\xB0\xEF\x1E\x18\xE3\xBA\x7D\x8F\x1F\x67\x6C\x78\xEF\x1D\x37\xB9\xFC" - "\x85\x15\x10\xD2\x08\xF9\x80\x8D\x48\x10\x72\x13\xBA\x3C\x7A\x1C\x48\xEF\x1D\xA2" - "\x04\x3E\x47\x4F\x3F\x1E\x34\xC0\x20\xD0\x3D\xA0\x85\xC9\xF9\xE0\xF7\x1E\xE3"; + "\x8C\x1E\x07\x7D\xD9\xA1\xE0\xF7\x1E\xEF\x1F\x87\xE1\xF0\xE6\x90\x23\x64\x47\xC1" + "\xC0\x85\x91\xB3\xBB\xA7\x6C\xE4\x3A\x8A\x8E\xF1\xE0\xF7\x31\xC7\x74\xFB\x14\x7D" + "\x9D\xB1\xE3\xBC\x74\x33\xB0\x85\xB3\xE0\xB3\xB6\x72\x1E\x0A\x8E\x9E\xA3\x20\x99" + "\xD0\xCF\x7D\xA3\xB4\x2D\xA3\x23\xE1\xDD\x1C\x7E\x1C\x67\x78\xED\x1F\x67\xD9\xE6" + "\x7D\x90\xAD\x10\x47\xC7\xD8\x23\x71\x49\xE3\x43\xBB\xE3\xA8\x78\x10\xF8\xFE\xCF" + "\x1D\x3E\xC6\x05\x61\xB3\xBA\x76\x1E\xE3\x94\x76\x10\xF1\xD4\x7B\x0F\x40\x41\xE0" + "\xF9\x02\x0E\x7A\x7D\x9E\xC3\xBC\x08\xD7\x4E\x59\xD8\x43\xC7\x51\xEC\x3D\x0E\xC0" + "\x41\xBC\x7E\x1E\xC3\xBC\x78\x63\x8E\xE9\xF6\x3C\x7D\x9D\xB1\xE3\xBC\x74\xDE\xE7" + "\xF2\x14\x54\x43\x48\x23\xE6\x02\x35\x20\x41\xC8\x4E\xE8\xF1\xE8\x71\x23\xBC\x76" + "\x88\x10\xF9\x10\x3C\xFC\x78\xD3\x2A\x01\x83\x40\xF6\x82\x17\x26\x47\x83\xDC\x7B" + "\x8D"; #define HTTP_SCRIPT_MODULE_TEMPLATE Decompress(HTTP_SCRIPT_MODULE_TEMPLATE_COMPRESSED,HTTP_SCRIPT_MODULE_TEMPLATE_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_MODULE_TEMPLATE.h b/tasmota/html_uncompressed/HTTP_SCRIPT_MODULE_TEMPLATE.h index fd52afcc0..0fcd77c51 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_MODULE_TEMPLATE.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_MODULE_TEMPLATE.h @@ -12,7 +12,7 @@ const char HTTP_SCRIPT_MODULE_TEMPLATE[] PROGMEM = "l=hs.length;" // Find max indexes for s "for(i=0;i>=5;" // Add options - "for(i=1;i<=b;i++){ce((i<10)?(' '+i):i,t);}" + "for(i=0;i<=b;i++){ce(i+1,t);}" // Add index 1 to 32 "eb('h'+g).value=u+1;" // Set selected value "t.style.visibility=(b>0)?'':'hidden';" "}" diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index ca775b88e..81ce401f6 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -38,7 +38,6 @@ const uint32_t POWER_SIZE = 32; // Power (relay) bit count * Constants \*********************************************************************************************/ -// Why 28? Because in addition to relays there may be lights and uint32_t bitmap can hold up to 32 devices #ifdef ESP8266 const uint8_t MAX_RELAYS = 8; // Max number of relays selectable on GPIO const uint8_t MAX_INTERLOCKS = 4; // Max number of interlock groups (up to MAX_INTERLOCKS_SET) @@ -46,17 +45,17 @@ const uint8_t MAX_SWITCHES = 8; // Max number of switches selectable const uint8_t MAX_KEYS = 8; // Max number of keys or buttons selectable on GPIO #endif // ESP8266 #ifdef ESP32 -const uint8_t MAX_RELAYS = 28; // Max number of relays selectable on GPIO -const uint8_t MAX_INTERLOCKS = 14; // Max number of interlock groups (up to MAX_INTERLOCKS_SET) -const uint8_t MAX_SWITCHES = 28; // Max number of switches selectable on GPIO -const uint8_t MAX_KEYS = 28; // Max number of keys or buttons selectable on GPIO +const uint8_t MAX_RELAYS = 32; // Max number of relays selectable on GPIO +const uint8_t MAX_INTERLOCKS = 16; // Max number of interlock groups (up to MAX_INTERLOCKS_SET) +const uint8_t MAX_SWITCHES = 32; // Max number of switches selectable on GPIO +const uint8_t MAX_KEYS = 32; // Max number of keys or buttons selectable on GPIO #endif // ESP32 const uint8_t MAX_RELAYS_SET = 32; // Max number of relays const uint8_t MAX_KEYS_SET = 32; // Max number of keys // Changes to the following MAX_ defines will impact settings layout -const uint8_t MAX_INTERLOCKS_SET = 14; // Max number of interlock groups (MAX_RELAYS_SET / 2) -const uint8_t MAX_SWITCHES_SET = 28; // Max number of switches +const uint8_t MAX_INTERLOCKS_SET = 16; // Max number of interlock groups (MAX_RELAYS_SET / 2) +const uint8_t MAX_SWITCHES_SET = 32; // Max number of switches const uint8_t MAX_LEDS = 4; // Max number of leds const uint8_t MAX_PWMS_LEGACY = 5; // Max number of PWM channels in first settings block - Legacy limit for ESP8266, but extended for ESP32 (see below) #ifdef ESP32 // Max number of PWM channels (total including extended) - ESP32 only diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h index d4c324cfb..f570f8894 100644 --- a/tasmota/include/tasmota_template.h +++ b/tasmota/include/tasmota_template.h @@ -509,7 +509,7 @@ const char kSensorNamesFixed[] PROGMEM = D_SENSOR_USER; // Max number of GPIOs -#define MAX_I2C 0 // Display no index if one bus +#define MAX_I2C 1 // Display no index if one bus #ifdef USE_I2C_BUS2 #undef MAX_I2C #define MAX_I2C 2 @@ -533,46 +533,46 @@ const char kSensorNamesFixed[] PROGMEM = const uint16_t kGpioNiceList[] PROGMEM = { GPIO_NONE, // Not used - AGPIO(GPIO_OPTION_A) + MAX_OPTIONS_A, // Device specific options + AGPIO(GPIO_OPTION_A) + MAX_OPTIONS_A -1, // Device specific options #ifdef ESP32 - AGPIO(GPIO_OPTION_E) + MAX_OPTIONS_E, // Device module emulation + AGPIO(GPIO_OPTION_E) + MAX_OPTIONS_E -1, // Device module emulation #endif - AGPIO(GPIO_KEY1) + MAX_KEYS, // Buttons - AGPIO(GPIO_KEY1_NP) + MAX_KEYS, + AGPIO(GPIO_KEY1) + MAX_KEYS -1, // Buttons + AGPIO(GPIO_KEY1_NP) + MAX_KEYS -1, #ifdef ESP32 - AGPIO(GPIO_KEY1_PD) + MAX_KEYS, + AGPIO(GPIO_KEY1_PD) + MAX_KEYS -1, #endif - AGPIO(GPIO_KEY1_INV) + MAX_KEYS, - AGPIO(GPIO_KEY1_INV_NP) + MAX_KEYS, + AGPIO(GPIO_KEY1_INV) + MAX_KEYS -1, + AGPIO(GPIO_KEY1_INV_NP) + MAX_KEYS -1, #ifdef ESP32 - AGPIO(GPIO_KEY1_INV_PD) + MAX_KEYS, + AGPIO(GPIO_KEY1_INV_PD) + MAX_KEYS -1, #if defined(SOC_TOUCH_VERSION_1) || defined(SOC_TOUCH_VERSION_2) - AGPIO(GPIO_KEY1_TC) + MAX_KEYS, // Touch button + AGPIO(GPIO_KEY1_TC) + MAX_KEYS -1, // Touch button #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2 #endif - AGPIO(GPIO_SWT1) + MAX_SWITCHES, // User connected external switches - AGPIO(GPIO_SWT1_NP) + MAX_SWITCHES, + AGPIO(GPIO_SWT1) + MAX_SWITCHES -1, // User connected external switches + AGPIO(GPIO_SWT1_NP) + MAX_SWITCHES -1, #ifdef ESP32 - AGPIO(GPIO_SWT1_PD) + MAX_SWITCHES, + AGPIO(GPIO_SWT1_PD) + MAX_SWITCHES -1, #endif #ifdef ROTARY_V1 - AGPIO(GPIO_ROT1A) + MAX_ROTARIES, // Rotary A Pin - AGPIO(GPIO_ROT1B) + MAX_ROTARIES, // Rotary B Pin - AGPIO(GPIO_ROT1A_NP) + MAX_ROTARIES, // Rotary A Pin No Pullup - AGPIO(GPIO_ROT1B_NP) + MAX_ROTARIES, // Rotary B Pin No Pullup + AGPIO(GPIO_ROT1A) + MAX_ROTARIES -1, // Rotary A Pin + AGPIO(GPIO_ROT1B) + MAX_ROTARIES -1, // Rotary B Pin + AGPIO(GPIO_ROT1A_NP) + MAX_ROTARIES -1, // Rotary A Pin No Pullup + AGPIO(GPIO_ROT1B_NP) + MAX_ROTARIES -1, // Rotary B Pin No Pullup #endif - AGPIO(GPIO_REL1) + MAX_RELAYS, // Relays - AGPIO(GPIO_REL1_INV) + MAX_RELAYS, - AGPIO(GPIO_REL1_BI) + MAX_RELAYS, // Bistable (Latching) two coil relays - AGPIO(GPIO_REL1_BI_INV) + MAX_RELAYS, - AGPIO(GPIO_LED1) + MAX_LEDS, // Leds - AGPIO(GPIO_LED1_INV) + MAX_LEDS, + AGPIO(GPIO_REL1) + MAX_RELAYS -1, // Relays + AGPIO(GPIO_REL1_INV) + MAX_RELAYS -1, + AGPIO(GPIO_REL1_BI) + MAX_RELAYS -1, // Bistable (Latching) two coil relays + AGPIO(GPIO_REL1_BI_INV) + MAX_RELAYS -1, + AGPIO(GPIO_LED1) + MAX_LEDS -1, // Leds + AGPIO(GPIO_LED1_INV) + MAX_LEDS -1, #ifdef USE_COUNTER - AGPIO(GPIO_CNTR1) + MAX_COUNTERS, // Counters - AGPIO(GPIO_CNTR1_NP) + MAX_COUNTERS, + AGPIO(GPIO_CNTR1) + MAX_COUNTERS -1, // Counters + AGPIO(GPIO_CNTR1_NP) + MAX_COUNTERS -1, #endif - AGPIO(GPIO_PWM1) + MAX_PWMS, // RGB Red or C Cold White - AGPIO(GPIO_PWM1_INV) + MAX_PWMS, // or extended PWM for ESP32 + AGPIO(GPIO_PWM1) + MAX_PWMS -1, // RGB Red or C Cold White + AGPIO(GPIO_PWM1_INV) + MAX_PWMS -1, // or extended PWM for ESP32 #ifdef USE_BUZZER AGPIO(GPIO_BUZZER), // Buzzer AGPIO(GPIO_BUZZER_INV), // Inverted buzzer @@ -580,8 +580,8 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_LEDLNK), // Link led AGPIO(GPIO_LEDLNK_INV), // Inverted link led #ifdef USE_BERRY - AGPIO(GPIO_INPUT) + MAX_SWITCHES, // Pure digital input to be read via Berry - AGPIO(GPIO_INTERRUPT) + MAX_SWITCHES, // Interrupt pins to be catched by Berry + AGPIO(GPIO_INPUT) + MAX_SWITCHES -1, // Pure digital input to be read via Berry + AGPIO(GPIO_INTERRUPT) + MAX_SWITCHES -1, // Interrupt pins to be catched by Berry #endif AGPIO(GPIO_OUTPUT_HI), // Fixed output high AGPIO(GPIO_OUTPUT_LO), // Fixed output low @@ -601,32 +601,32 @@ const uint16_t kGpioNiceList[] PROGMEM = { \*-------------------------------------------------------------------------------------------*/ #ifdef USE_I2C - AGPIO(GPIO_I2C_SCL) + MAX_I2C, // I2C SCL - AGPIO(GPIO_I2C_SDA) + MAX_I2C, // I2C SDA + AGPIO(GPIO_I2C_SCL) + MAX_I2C -1, // I2C SCL + AGPIO(GPIO_I2C_SDA) + MAX_I2C -1, // I2C SDA #ifdef USE_PCF8574 AGPIO(GPIO_PCF8574_INT), // PCF8574 Interrupt #endif // USE_PCF8574 #ifdef USE_I2C_SERIAL - AGPIO(GPIO_I2C_SER_TX) + MAX_I2C, // I2C via Serial TX - AGPIO(GPIO_I2C_SER_RX) + MAX_I2C, // I2C via Serial RX + AGPIO(GPIO_I2C_SER_TX) + MAX_I2C -1, // I2C via Serial TX + AGPIO(GPIO_I2C_SER_RX) + MAX_I2C -1, // I2C via Serial RX #endif // USE_I2C_SERIAL #endif #if defined(USE_I2S_AUDIO) || defined (USE_I2S) - AGPIO(GPIO_I2S_MCLK) + MAX_I2S, // I2S master clock - AGPIO(GPIO_I2S_BCLK) + MAX_I2S, // I2S bit clock - AGPIO(GPIO_I2S_DOUT) + MAX_I2S, // I2S Out Data - AGPIO(GPIO_I2S_DAC) + 2, // I2S DAC Output - AGPIO(GPIO_I2S_WS) + MAX_I2S, // I2S word select - AGPIO(GPIO_I2S_DIN) + MAX_I2S, // I2S IN Data + AGPIO(GPIO_I2S_MCLK) + MAX_I2S -1, // I2S master clock + AGPIO(GPIO_I2S_BCLK) + MAX_I2S -1, // I2S bit clock + AGPIO(GPIO_I2S_DOUT) + MAX_I2S -1, // I2S Out Data + AGPIO(GPIO_I2S_DAC) + 2 -1, // I2S DAC Output + AGPIO(GPIO_I2S_WS) + MAX_I2S -1, // I2S word select + AGPIO(GPIO_I2S_DIN) + MAX_I2S -1, // I2S IN Data #endif #ifdef USE_SPI - AGPIO(GPIO_SPI_MISO) + MAX_SPI, // SPI MISO - AGPIO(GPIO_SPI_MOSI) + MAX_SPI, // SPI MOSI - AGPIO(GPIO_SPI_CLK) + MAX_SPI, // SPI Clk - AGPIO(GPIO_SPI_CS) + MAX_SPI, // SPI Chip Select - AGPIO(GPIO_SPI_DC) + MAX_SPI, // SPI Data Direction + AGPIO(GPIO_SPI_MISO) + MAX_SPI -1, // SPI MISO + AGPIO(GPIO_SPI_MOSI) + MAX_SPI -1, // SPI MOSI + AGPIO(GPIO_SPI_CLK) + MAX_SPI -1, // SPI Clk + AGPIO(GPIO_SPI_CS) + MAX_SPI -1, // SPI Chip Select + AGPIO(GPIO_SPI_DC) + MAX_SPI -1, // SPI Data Direction #ifdef USE_NRF24 AGPIO(GPIO_NRF24_CS), AGPIO(GPIO_NRF24_DC), @@ -642,7 +642,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_MCP2515_CS), #endif // USE_MCP2515 #ifdef USE_MCP23XXX_DRV - AGPIO(GPIO_MCP23SXX_CS) + MAX_MCP23XXX, + AGPIO(GPIO_MCP23SXX_CS) + MAX_MCP23XXX -1, #endif // USE_MCP23XXX_DRV #ifdef USE_SPI_LORA AGPIO(GPIO_LORA_CS), @@ -754,11 +754,11 @@ const uint16_t kGpioNiceList[] PROGMEM = { #endif // USE_DISPLAY_TM1621_SONOFF #ifdef USE_MAX31865 - AGPIO(GPIO_SSPI_MAX31865_CS1) + MAX_MAX31865S, + AGPIO(GPIO_SSPI_MAX31865_CS1) + MAX_MAX31865S -1, #endif #ifdef USE_MCP23XXX_DRV - AGPIO(GPIO_MCP23XXX_INT) + MAX_MCP23XXX, + AGPIO(GPIO_MCP23XXX_INT) + MAX_MCP23XXX -1, #endif #ifdef USE_HDMI_CEC @@ -780,8 +780,8 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_DHT11_OUT), // Pseudo Single wire DHT11, DHT21, DHT22, AM2301, AM2302, AM2321 #endif #ifdef USE_DS18x20 - AGPIO(GPIO_DSB) + MAX_DSB, // Single wire DS18B20 or DS18S20 - AGPIO(GPIO_DSB_OUT) + MAX_DSB, // Pseudo Single wire DS18B20 or DS18S20 + AGPIO(GPIO_DSB) + MAX_DSB -1, // Single wire DS18B20 or DS18S20 + AGPIO(GPIO_DSB_OUT) + MAX_DSB -1, // Pseudo Single wire DS18B20 or DS18S20 #endif // USE_DS18x20 #ifdef USE_LMT01 AGPIO(GPIO_LMT01), // LMT01, count pulses on GPIO @@ -797,7 +797,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_P9813_CLK), // P9813 CLOCK AGPIO(GPIO_P9813_DAT), // P9813 DATA #else - AGPIO(GPIO_WS2812) + (MAX_RMT ? MAX_RMT + 1 : 0), // WS2812 Led string, using RMT on ESP32 + AGPIO(GPIO_WS2812) + (MAX_RMT ? MAX_RMT + 1 : 1) -1, // WS2812 Led string, using RMT on ESP32 #endif // NEO_HW_P9813 #endif #ifdef USE_ARILUX_RF @@ -815,15 +815,15 @@ const uint16_t kGpioNiceList[] PROGMEM = { #endif // USE_SM16716 #ifdef USE_SM2135 AGPIO(GPIO_SM2135_CLK), // SM2135 CLOCK - AGPIO(GPIO_SM2135_DAT) + MAX_SM2135_DAT, // SM2135 DATA + AGPIO(GPIO_SM2135_DAT) + MAX_SM2135_DAT -1, // SM2135 DATA #endif // USE_SM2135 #ifdef USE_SM2335 AGPIO(GPIO_SM2335_CLK), // SM2335 CLOCK - AGPIO(GPIO_SM2335_DAT) + MAX_SM2335_DAT, // SM2335 DATA + AGPIO(GPIO_SM2335_DAT) + MAX_SM2335_DAT -1, // SM2335 DATA #endif // USE_SM2335 #ifdef USE_BP1658CJ AGPIO(GPIO_BP1658CJ_CLK), // BP1658CJ CLOCK - AGPIO(GPIO_BP1658CJ_DAT) + MAX_BP1658CJ_DAT, // BP1658CJ DATA + AGPIO(GPIO_BP1658CJ_DAT) + MAX_BP1658CJ_DAT -1, // BP1658CJ DATA #endif // USE_BP1658CJ #ifdef USE_BP5758D AGPIO(GPIO_BP5758D_CLK), // BP5758D CLOCK @@ -857,7 +857,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { \*-------------------------------------------------------------------------------------------*/ #if defined(USE_IR_REMOTE) || defined(USE_IR_REMOTE_FULL) - AGPIO(GPIO_IRSEND) + MAX_IRSEND, // IR remote + AGPIO(GPIO_IRSEND) + MAX_IRSEND -1, // IR remote #if defined(USE_IR_RECEIVE) || defined(USE_IR_REMOTE_FULL) AGPIO(GPIO_IRRECV), // IR receiver #endif @@ -870,8 +870,8 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_RF_SENSOR), // Rf receiver with sensor decoding #endif #ifdef USE_SR04 - AGPIO(GPIO_SR04_TRIG) + MAX_SR04, // SR04 Tri/TXgger pin - AGPIO(GPIO_SR04_ECHO) + MAX_SR04, // SR04 Ech/RXo pin + AGPIO(GPIO_SR04_TRIG) + MAX_SR04 -1, // SR04 Tri/TXgger pin + AGPIO(GPIO_SR04_ECHO) + MAX_SR04 -1, // SR04 Ech/RXo pin #endif #ifdef USE_ME007 AGPIO(GPIO_ME007_TRIG), // ME007 Trigger pin (xsns_23_me007.ino) @@ -904,20 +904,20 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_HJL_CF), // HJL-01/BL0937 CF power #endif #if defined(USE_I2C) && defined(USE_ADE7880) - AGPIO(GPIO_ADE7880_IRQ) + 2, // ADE7880 IRQ - (1 = IRQ1, 2 = IRQ2) + AGPIO(GPIO_ADE7880_IRQ) + 2 -1, // ADE7880 IRQ - (1 = IRQ1, 2 = IRQ2) #endif #ifdef USE_ADE7953 #if defined(USE_I2C) || defined(USE_SPI) - AGPIO(GPIO_ADE7953_IRQ) + 6, // ADE7953 IRQ - (1 = Shelly 2.5, 2 = Shelly EM, 3 = Shelly Plus 2PM, 4 = Shelly Pro 1PM, 5 = Shelly Pro 2PM, 6 = Shelly Pro 4PM) + AGPIO(GPIO_ADE7953_IRQ) + 6 -1, // ADE7953 IRQ - (1 = Shelly 2.5, 2 = Shelly EM, 3 = Shelly Plus 2PM, 4 = Shelly Pro 1PM, 5 = Shelly Pro 2PM, 6 = Shelly Pro 4PM) AGPIO(GPIO_ADE7953_RST), // ADE7953 Reset #ifdef USE_SPI - AGPIO(GPIO_ADE7953_CS) + 2, // ADE7953 SPI Chip Select (1 = CS1 (1PM, 2PM), 2 = CS2 (2PM)) + AGPIO(GPIO_ADE7953_CS) + 2 -1, // ADE7953 SPI Chip Select (1 = CS1 (1PM, 2PM), 2 = CS2 (2PM)) #endif // USE_SPI #endif // USE_I2C or USE_SPI #endif // USE_ADE7953 #ifdef USE_CSE7761 AGPIO(GPIO_CSE7761_TX), // CSE7761 Serial interface (Dual R3) - AGPIO(GPIO_CSE7761_RX) + MAX_CSE7761, // CSE7761 Serial interface (1 = Dual R3, 2 = POWCT) + AGPIO(GPIO_CSE7761_RX) + MAX_CSE7761 -1, // CSE7761 Serial interface (1 = Dual R3, 2 = POWCT) #endif #ifdef USE_CSE7766 AGPIO(GPIO_CSE7766_TX), // CSE7766 Serial interface (S31 and Pow R2) @@ -972,13 +972,13 @@ const uint16_t kGpioNiceList[] PROGMEM = { #endif // USE_LE01MR #ifdef ESP32 #ifdef USE_BL0906 - AGPIO(GPIO_BL0906_RX) + MAX_BL0906_RX, // BL0906 Serial interface (Athom EM6) + AGPIO(GPIO_BL0906_RX) + MAX_BL0906_RX -1, // BL0906 Serial interface (Athom EM6) #endif // USE_BL0906 #endif // ESP32 #if defined(USE_BL0940) || defined(USE_BL09XX) AGPIO(GPIO_BL0939_RX), // BL0939 Serial interface (Dual R3 v2) AGPIO(GPIO_BL0940_RX), // BL0940 Serial interface - AGPIO(GPIO_BL0942_RX) + MAX_BL0942_RX, // BL0942 Serial interface + AGPIO(GPIO_BL0942_RX) + MAX_BL0942_RX -1, // BL0942 Serial interface #endif #ifdef USE_IEM3000 AGPIO(GPIO_IEM3000_TX), // IEM3000 Serial interface @@ -1024,7 +1024,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { #ifdef USE_ZIGBEE AGPIO(GPIO_ZIGBEE_TX), // Zigbee Serial interface AGPIO(GPIO_ZIGBEE_RX), // Zigbee Serial interface - AGPIO(GPIO_ZIGBEE_RST) + 2, // Zigbee reset, pin 1 is reset, pin 2 is bootloader mode + AGPIO(GPIO_ZIGBEE_RST) + 2 -1, // Zigbee reset, pin 1 is reset, pin 2 is bootloader mode #endif #ifdef USE_MHZ19 AGPIO(GPIO_MHZ_TXD), // MH-Z19 Serial interface @@ -1147,7 +1147,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_MGC3130_RESET), #endif #ifdef USE_MAX31855 - AGPIO(GPIO_MAX31855CS) + MAX_MAX31855S, //MAX31855 Serial interface + AGPIO(GPIO_MAX31855CS) + MAX_MAX31855S -1, //MAX31855 Serial interface AGPIO(GPIO_MAX31855CLK), // MAX31855 Serial interface AGPIO(GPIO_MAX31855DO), // MAX31855 Serial interface #endif @@ -1160,7 +1160,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_A4988_STP), // A4988 step pin // folowing are not mandatory AGPIO(GPIO_A4988_ENA), // A4988 enabled pin - AGPIO(GPIO_A4988_MS1) + MAX_A4988_MSS, // A4988 microstep pin1 to pin3 + AGPIO(GPIO_A4988_MS1) + MAX_A4988_MSS -1, // A4988 microstep pin1 to pin3 #endif #ifdef USE_DEEPSLEEP AGPIO(GPIO_DEEPSLEEP), @@ -1203,10 +1203,10 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_PROJECTOR_CTRL_RX), // LCD/DLP Projector Serial Control #endif #if defined(USE_VL53L0X) or defined (USE_VL53L1X) - AGPIO(GPIO_VL53LXX_XSHUT1) + VL53LXX_MAX_SENSORS, // When using multiple VL53LXX. + AGPIO(GPIO_VL53LXX_XSHUT1) + VL53LXX_MAX_SENSORS -1, // When using multiple VL53LXX. #endif #ifdef USE_FLOWRATEMETER - AGPIO(GPIO_FLOWRATEMETER_IN) + MAX_FLOWRATEMETER, // Flow meter Pin + AGPIO(GPIO_FLOWRATEMETER_IN) + MAX_FLOWRATEMETER -1, // Flow meter Pin #endif #ifdef USE_SHIFT595 @@ -1217,7 +1217,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { #endif #if defined (ESP32) && defined(USE_DINGTIAN_RELAY) - AGPIO(GPIO_DINGTIAN_CLK) + MAX_DINGTIAN_SHIFT, // Dingtian Relay board - 8,16,24 or 32 relays & inputs + AGPIO(GPIO_DINGTIAN_CLK) + MAX_DINGTIAN_SHIFT -1, // Dingtian Relay board - 8,16,24 or 32 relays & inputs AGPIO(GPIO_DINGTIAN_SDI), AGPIO(GPIO_DINGTIAN_Q7), AGPIO(GPIO_DINGTIAN_PL), @@ -1226,7 +1226,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { #endif #ifdef USE_MAGIC_SWITCH - AGPIO(GPIO_MAGIC_SWITCH) + MAX_MAGIC_SWITCH_MODES, + AGPIO(GPIO_MAGIC_SWITCH) + MAX_MAGIC_SWITCH_MODES -1, #endif #ifdef USE_PIPSOLAR // xdrv_92_pipsolar.ino @@ -1240,7 +1240,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { #ifdef ESP32 #if CONFIG_IDF_TARGET_ESP32 - AGPIO(GPIO_HALLEFFECT) + 2, // Hall effect sensor connected to GPIO36 and 39 + AGPIO(GPIO_HALLEFFECT) + 2 -1, // Hall effect sensor connected to GPIO36 and 39 #endif // CONFIG_IDF_TARGET_ESP32 #ifdef USE_WEBCAM AGPIO(GPIO_WEBCAM_PWDN), @@ -1248,12 +1248,12 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_WEBCAM_XCLK), AGPIO(GPIO_WEBCAM_SIOD), AGPIO(GPIO_WEBCAM_SIOC), - AGPIO(GPIO_WEBCAM_DATA) + MAX_WEBCAM_DATA, + AGPIO(GPIO_WEBCAM_DATA) + MAX_WEBCAM_DATA -1, AGPIO(GPIO_WEBCAM_VSYNC), AGPIO(GPIO_WEBCAM_HREF), AGPIO(GPIO_WEBCAM_PCLK), AGPIO(GPIO_WEBCAM_PSCLK), - AGPIO(GPIO_WEBCAM_HSD) + MAX_WEBCAM_HSD, + AGPIO(GPIO_WEBCAM_HSD) + MAX_WEBCAM_HSD -1, AGPIO(GPIO_WEBCAM_PSRCS), #endif // USE_WEBCAM #ifdef USE_ETHERNET @@ -1264,25 +1264,25 @@ const uint16_t kGpioNiceList[] PROGMEM = { #ifdef USE_BIOPDU AGPIO(GPIO_BIOPDU_PZEM0XX_TX), // Biomine BioPDU pins AGPIO(GPIO_BIOPDU_PZEM016_RX), - AGPIO(GPIO_BIOPDU_BIT) + 3, + AGPIO(GPIO_BIOPDU_BIT) + 3 -1, #endif /*-------------------------------------------------------------------------------------------*\ * ESP32 multiple Analog / Digital converter inputs \*-------------------------------------------------------------------------------------------*/ - AGPIO(GPIO_ADC_INPUT) + MAX_ADCS, // Analog inputs - AGPIO(GPIO_ADC_TEMP) + MAX_ADCS, // Thermistor - AGPIO(GPIO_ADC_LIGHT) + MAX_ADCS, // Light sensor - AGPIO(GPIO_ADC_BUTTON) + MAX_KEYS, // Button - AGPIO(GPIO_ADC_BUTTON_INV) + MAX_KEYS, - AGPIO(GPIO_ADC_RANGE) + MAX_ADCS, // Range - AGPIO(GPIO_ADC_CT_POWER) + MAX_ADCS, // Current - AGPIO(GPIO_ADC_JOY) + MAX_ADCS, // Joystick - AGPIO(GPIO_ADC_PH) + MAX_ADCS, // Analog PH Sensor - AGPIO(GPIO_ADC_MQ) + MAX_ADCS, // Analog MQ Sensor - AGPIO(GPIO_ADC_VOLTAGE) + MAX_ADCS, // Voltage - AGPIO(GPIO_ADC_CURRENT) + MAX_ADCS, // Current + AGPIO(GPIO_ADC_INPUT) + MAX_ADCS -1, // Analog inputs + AGPIO(GPIO_ADC_TEMP) + MAX_ADCS -1, // Thermistor + AGPIO(GPIO_ADC_LIGHT) + MAX_ADCS -1, // Light sensor + AGPIO(GPIO_ADC_BUTTON) + MAX_KEYS -1, // Button + AGPIO(GPIO_ADC_BUTTON_INV) + MAX_KEYS -1, + AGPIO(GPIO_ADC_RANGE) + MAX_ADCS -1, // Range + AGPIO(GPIO_ADC_CT_POWER) + MAX_ADCS -1, // Current + AGPIO(GPIO_ADC_JOY) + MAX_ADCS -1, // Joystick + AGPIO(GPIO_ADC_PH) + MAX_ADCS -1, // Analog PH Sensor + AGPIO(GPIO_ADC_MQ) + MAX_ADCS -1, // Analog MQ Sensor + AGPIO(GPIO_ADC_VOLTAGE) + MAX_ADCS -1, // Voltage + AGPIO(GPIO_ADC_CURRENT) + MAX_ADCS -1, // Current #endif // ESP32 }; @@ -1296,8 +1296,8 @@ const uint16_t kAdcNiceList[] PROGMEM = { AGPIO(GPIO_ADC_INPUT), // Analog inputs AGPIO(GPIO_ADC_TEMP), // Thermistor AGPIO(GPIO_ADC_LIGHT), // Light sensor - AGPIO(GPIO_ADC_BUTTON) + MAX_KEYS, // Button - AGPIO(GPIO_ADC_BUTTON_INV) + MAX_KEYS, + AGPIO(GPIO_ADC_BUTTON) + MAX_KEYS -1, // Button + AGPIO(GPIO_ADC_BUTTON_INV) + MAX_KEYS -1, AGPIO(GPIO_ADC_RANGE), // Range AGPIO(GPIO_ADC_CT_POWER), // Current AGPIO(GPIO_ADC_JOY), // Joystick diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index facaa1471..dbcab5b1d 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -679,24 +679,24 @@ typedef struct { uint16_t light_wakeup; // 4A6 uint8_t knx_CB_registered; // 4A8 Number of Group Address to write uint8_t switchmode[MAX_SWITCHES_SET]; // 4A9 - uint8_t global_sensor_index[3]; // 4C5 - uint16_t dns_timeout; // 4C8 - uint8_t ds3502_state[MAX_DS3502]; // 4CA - uint16_t influxdb_port; // 4CE - power_t interlock[MAX_INTERLOCKS_SET]; // 4D0 MAX_INTERLOCKS = MAX_RELAYS / 2 - int8_t shutter_tilt_config[5][MAX_SHUTTERS]; //508 - int8_t shutter_tilt_pos[MAX_SHUTTERS]; //51C - uint16_t influxdb_period; // 520 - uint16_t rf_duplicate_time; // 522 - int32_t weight_absconv_a; // 524 - int32_t weight_absconv_b; // 528 - uint16_t mqtt_keepalive; // 52C - uint16_t mqtt_socket_timeout; // 52E - uint8_t mqtt_wifi_timeout; // 530 - uint8_t ina219_mode; // 531 - uint8_t weight_precision; // 532 ex_pulse_timer free since 11.0.0.3 + uint8_t global_sensor_index[3]; // 4C9 4C5 - Moved up by 4 bytes in v14.3.0.7 + uint16_t dns_timeout; // 4CC 4C8 + uint8_t ds3502_state[MAX_DS3502]; // 4CE 4CA + uint16_t influxdb_port; // 4D2 4CE + power_t interlock[MAX_INTERLOCKS_SET]; // 4D4 4D0 MAX_INTERLOCKS = MAX_RELAYS / 2 + int8_t shutter_tilt_config[5][MAX_SHUTTERS]; // 514 508 - Moved up 12 bytes in v14.3.0.7 + int8_t shutter_tilt_pos[MAX_SHUTTERS]; // 528 51C + uint16_t influxdb_period; // 52C 520 + uint16_t rf_duplicate_time; // 52E 522 + int32_t weight_absconv_a; // 530 524 + int32_t weight_absconv_b; // 534 528 + uint16_t mqtt_keepalive; // 538 52C + uint16_t mqtt_socket_timeout; // 53A 52E + uint8_t mqtt_wifi_timeout; // 53C 530 + uint8_t ina219_mode; // 53D 531 + uint8_t weight_precision; // 53E 532 - uint8_t free_533[13]; // 533 + uint8_t free_53F; // 53F uint16_t tcp_baudrate; // 540 uint16_t button_debounce; // 542 diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index c7f0d2d3f..8e6cd8138 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -22,6 +22,6 @@ #define TASMOTA_SHA_SHORT // Filled by Github sed -const uint32_t TASMOTA_VERSION = 0x0E030006; // 14.3.0.6 +const uint32_t TASMOTA_VERSION = 0x0E030007; // 14.3.0.7 #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index abfb85484..941f27968 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -1855,6 +1855,16 @@ void SettingsDelta(void) { char scolor[10]; WebHexCode(COL_BUTTON_OFF, GetTextIndexed(scolor, sizeof(scolor), COL_BUTTON_OFF, kWebColors)); } + if (Settings->version < 0x0E030007) { // 14.3.0.7 + memmove_P((uint8_t*)&Settings->shutter_tilt_config, (uint8_t*)&Settings->shutter_tilt_config - 12, 0x2B); + for (uint32_t i = 14; i < MAX_INTERLOCKS_SET; i++) { + Settings->interlock[i] = 0; + } + memmove_P((uint8_t*)&Settings->global_sensor_index, (uint8_t*)&Settings->global_sensor_index - 4, 0x43); + for (uint32_t i = 28; i < MAX_SWITCHES_SET; i++) { + Settings->switchmode[i] = SWITCH_MODE; + } + } Settings->version = TASMOTA_VERSION; SettingsSave(1); diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index d385ec0ac..4c96ad7aa 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -832,6 +832,7 @@ int32_t UpdateDevicesPresent(int32_t change) { else if (devices_present >= POWER_SIZE) { // Support up to uint32_t as bitmask difference = devices_present - POWER_SIZE; devices_present = POWER_SIZE; + AddLog(LOG_LEVEL_DEBUG, PSTR("APP: Max number of devices reached")); } TasmotaGlobal.devices_present = devices_present; return difference; diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 559e796c6..e1ed6a7da 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -2882,11 +2882,11 @@ void CmndTouchCal(void) { if (XdrvMailbox.payload == 0) { TouchButton.calibration = 0; } - else if (XdrvMailbox.payload < MAX_KEYS + 1) { + else if (XdrvMailbox.payload < MAX_KEYS) { TouchButton.calibration = bitSet(TouchButton.calibration, XdrvMailbox.payload); } else if (XdrvMailbox.payload == 255) { - TouchButton.calibration = 0x0FFFFFFF; // All MAX_KEYS pins + TouchButton.calibration = 0xFFFFFFFF; // All MAX_KEYS pins } } ResponseCmndNumber(TouchButton.calibration);