diff --git a/README.md b/README.md index 264e899a0..c7881caa7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Sonoff-Tasmota Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. -Current version is **5.8.0j** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. +Current version is **5.8.0k** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. ### ATTENTION All versions diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index ed75ef40d..4b38ee28b 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,8 @@ -/* 5.8.0j +/* 5.8.0k + * Add support for up to 8 relays (#995) + * Fix Blocked Loop when erasing large flash using command reset 2 (#1002) + * + * 5.8.0j * Set default altitude to 0 to be used with pressure sensors * Document flash settings area for future use * Prepare for 32-bit power control (#995) diff --git a/sonoff/settings.h b/sonoff/settings.h index 2bfbda85f..bccd36bdf 100644 --- a/sonoff/settings.h +++ b/sonoff/settings.h @@ -92,8 +92,8 @@ struct SYSCFG { byte free_2E6[2]; // 2E6 power_t power; // 2E8 - - byte free_2EC[10]; // 2EC + uint16_t pwmvalue[MAX_PWMS]; // 2EC +// byte free_2EC[10]; // 2EC int16_t altitude; // 2F6 Add since 5.8.0i uint16_t tele_period; // 2F8 @@ -108,8 +108,8 @@ struct SYSCFG { byte free_342[2]; // 342 - unsigned long domoticz_relay_idx[4]; // 344 - unsigned long domoticz_key_idx[4]; // 354 + unsigned long domoticz_relay_idx[MAX_DOMOTICZ_IDX]; // 344 + unsigned long domoticz_key_idx[MAX_DOMOTICZ_IDX]; // 354 unsigned long hlw_pcal; // 364 unsigned long hlw_ucal; // 368 @@ -152,13 +152,13 @@ struct SYSCFG { byte free_3A9[1]; // 3A9 uint16_t ws_wakeup; // 3AA Not used since 5.8.0 - char friendlyname[4][33]; // 3AC + char friendlyname[MAX_FRIENDLYNAMES][33]; // 3AC char switch_topic[33]; // 430 byte free_451[2]; // 451 uint8_t sleep; // 453 - uint16_t domoticz_switch_idx[4]; // 454 + uint16_t domoticz_switch_idx[MAX_DOMOTICZ_IDX]; // 454 uint16_t domoticz_sensor_idx[12]; // 45C uint8_t module; // 474 @@ -184,13 +184,16 @@ struct SYSCFG { byte free_4A8[1]; // 4A8 char web_password[33]; // 4A9 - uint8_t switchmode[4]; // 4CA + uint8_t switchmode[MAX_SWITCHES]; // 4CA char ntp_server[3][33]; // 4CE byte free_531[1]; // 531 uint16_t pulsetime[MAX_PULSETIMERS]; // 532 - uint16_t pwmvalue[5]; // 53A + //uint16_t ex_pwmvalue[MAX_PWMS]; // 53A + + byte free_542[2]; // 542 + uint32_t ip_address[4]; // 544 unsigned long hlw_kWhtotal; // 554 char mqtt_fulltopic[101]; // 558 diff --git a/sonoff/settings.ino b/sonoff/settings.ino index eb8ab58a6..ba42002ea 100644 --- a/sonoff/settings.ino +++ b/sonoff/settings.ino @@ -305,6 +305,7 @@ void CFG_Erase() } delay(10); } + osw_loop(); } } @@ -731,6 +732,17 @@ void CFG_Delta() sysCfg.power = sysCfg.ex_power; sysCfg.altitude = 0; } + if (sysCfg.version < 0x0508000B) { + for (byte i = 0; i < MAX_GPIO_PIN; i++) { // Move GPIO_LEDs + if ((sysCfg.my_gp.io[i] >= 25) && (sysCfg.my_gp.io[i] <= 32)) { // Was GPIO_LED1 + sysCfg.my_gp.io[i] += 23; // Move GPIO_LED1 + } + } + for (byte i = 0; i < MAX_PWMS; i++) { // Move pwmvalue and reset additional pulsetimers + sysCfg.pwmvalue[i] = sysCfg.pulsetime[4 +i]; + sysCfg.pulsetime[4 +i] = 0; + } + } sysCfg.version = VERSION; CFG_Save(1); diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h index 05f556495..c70b8b78e 100644 --- a/sonoff/sonoff.h +++ b/sonoff/sonoff.h @@ -28,13 +28,16 @@ typedef unsigned long power_t; // Power (Relay) type * Defines \*********************************************************************************************/ -#define MAX_RELAYS 4 // Max number of relays -#define MAX_BUTTONS 4 // Max number of buttons or keys -#define MAX_SWITCHES 4 // Max number of switches +// Changes to the following MAX_ defines will impact settings layout +#define MAX_RELAYS 8 // Max number of relays #define MAX_LEDS 4 // Max number of leds +#define MAX_KEYS 4 // Max number of keys or buttons +#define MAX_SWITCHES 4 // Max number of switches #define MAX_PWMS 5 // Max number of PWM channels #define MAX_COUNTERS 4 // Max number of counter sensors -#define MAX_PULSETIMERS 4 // Max number of supported pulse timers +#define MAX_PULSETIMERS 8 // Max number of supported pulse timers +#define MAX_FRIENDLYNAMES 4 // Max number of Friendly names +#define MAX_DOMOTICZ_IDX 4 // Max number of Domoticz device, key and switch indices #define MODULE SONOFF_BASIC // [Module] Select default model diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index c88d48f4b..5cacf90ea 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,7 +25,7 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x0508000A // 5.8.0j +#define VERSION 0x0508000B // 5.8.0k #include "sonoff.h" #include "user_config.h" @@ -215,10 +215,10 @@ int blinks = 201; // Number of LED blinks uint8_t blinkstate = 0; // LED state uint8_t blockgpio0 = 4; // Block GPIO0 for 4 seconds after poweron to workaround Wemos D1 RTS circuit -uint8_t lastbutton[MAX_BUTTONS] = { NOT_PRESSED, NOT_PRESSED, NOT_PRESSED, NOT_PRESSED }; // Last button states -uint8_t holdbutton[MAX_BUTTONS] = { 0 }; // Timer for button hold -uint8_t multiwindow[MAX_BUTTONS] = { 0 }; // Max time between button presses to record press count -uint8_t multipress[MAX_BUTTONS] = { 0 }; // Number of button presses within multiwindow +uint8_t lastbutton[MAX_KEYS] = { NOT_PRESSED, NOT_PRESSED, NOT_PRESSED, NOT_PRESSED }; // Last button states +uint8_t holdbutton[MAX_KEYS] = { 0 }; // Timer for button hold +uint8_t multiwindow[MAX_KEYS] = { 0 }; // Max time between button presses to record press count +uint8_t multipress[MAX_KEYS] = { 0 }; // Number of button presses within multiwindow uint8_t lastwallswitch[MAX_SWITCHES]; // Last wall switch states uint8_t holdwallswitch[MAX_SWITCHES] = { 0 }; // Timer for wallswitch push button hold @@ -367,7 +367,8 @@ void setRelay(power_t rpower) setLatchingRelay(rpower, 1); } else { - for (byte i = 0; i < Maxdevice; i++) { + uint8_t maxdev = (Maxdevice > MAX_RELAYS) ? MAX_RELAYS : Maxdevice; + for (byte i = 0; i < maxdev; i++) { state = rpower &1; if (pin[GPIO_REL1 +i] < 99) { digitalWrite(pin[GPIO_REL1 +i], bitRead(rel_inverted, i) ? !state : state); @@ -1554,13 +1555,7 @@ boolean send_button_power(byte key, byte device, byte state) if (!key && (device > Maxdevice)) { device = 1; } - -// snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), device); -// snprintf_P(scommand, sizeof(scommand), PSTR("POWER%s"), (key || (Maxdevice > 1)) ? stemp1 : ""); -// getTopic_P(stopic, 0, key_topic, scommand); - getTopic_P(stopic, 0, key_topic, getPowerDevice(scommand, device, sizeof(scommand), key)); - if (9 == state) { mqtt_data[0] = '\0'; } else { @@ -1991,7 +1986,8 @@ void button_handler() uint8_t flag = 0; char scmnd[20]; - for (byte i = 0; i < Maxdevice; i++) { + uint8_t maxdev = (Maxdevice > MAX_KEYS) ? MAX_KEYS : Maxdevice; + for (byte i = 0; i < maxdev; i++) { button = NOT_PRESSED; butt_present = 0; @@ -2649,7 +2645,7 @@ void GPIO_init() // } } } - for (byte i = 0; i < MAX_BUTTONS; i++) { + for (byte i = 0; i < MAX_KEYS; i++) { if (pin[GPIO_KEY1 +i] < 99) { pinMode(pin[GPIO_KEY1 +i], (16 == pin[GPIO_KEY1 +i]) ? INPUT_PULLDOWN_16 : INPUT_PULLUP); } @@ -2821,10 +2817,13 @@ void setup() } // Issue #526 - for (byte i = 0; i < Maxdevice; i++) { - if ((pin[GPIO_REL1 +i] < 99) && (digitalRead(pin[GPIO_REL1 +i]) ^ bitRead(rel_inverted, i))) { - bitSet(power, i); - pulse_timer[i] = sysCfg.pulsetime[i]; + uint8_t maxdev = (Maxdevice > MAX_RELAYS) ? MAX_RELAYS : Maxdevice; + for (byte i = 0; i < maxdev; i++) { + if (pin[GPIO_REL1 +i] < 99) { + if (digitalRead(pin[GPIO_REL1 +i]) ^ bitRead(rel_inverted, i)) { + bitSet(power, i); + pulse_timer[i] = sysCfg.pulsetime[i]; // MAX_PULSETIMERS must be equal to MAX_RELAYS for this to work here + } } } diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h index 1f190c8b6..2b18becd2 100644 --- a/sonoff/sonoff_template.h +++ b/sonoff/sonoff_template.h @@ -40,18 +40,18 @@ enum upins_t { GPIO_REL2, GPIO_REL3, GPIO_REL4, + GPIO_REL5, + GPIO_REL6, + GPIO_REL7, + GPIO_REL8, GPIO_REL1_INV, GPIO_REL2_INV, GPIO_REL3_INV, GPIO_REL4_INV, - GPIO_LED1, // Leds - GPIO_LED2, - GPIO_LED3, - GPIO_LED4, - GPIO_LED1_INV, - GPIO_LED2_INV, - GPIO_LED3_INV, - GPIO_LED4_INV, + GPIO_REL5_INV, + GPIO_REL6_INV, + GPIO_REL7_INV, + GPIO_REL8_INV, GPIO_PWM1, // RGB Red or C Cold White GPIO_PWM2, // RGB Green or CW Warm White GPIO_PWM3, // RGB Blue @@ -67,6 +67,14 @@ enum upins_t { GPIO_PWM4_INV, // RGBW (Cold) White GPIO_PWM5_INV, // RGBCW Warm White GPIO_IRRECV, // IR receiver + GPIO_LED1, // Leds + GPIO_LED2, + GPIO_LED3, + GPIO_LED4, + GPIO_LED1_INV, + GPIO_LED2_INV, + GPIO_LED3_INV, + GPIO_LED4_INV, GPIO_SENSOR_END }; // Text in webpage Module Parameters and commands GPIOS and GPIO @@ -92,18 +100,18 @@ const char sensors[GPIO_SENSOR_END][9] PROGMEM = { D_SENSOR_RELAY "2", D_SENSOR_RELAY "3", D_SENSOR_RELAY "4", - D_SENSOR_RELAY "1I", - D_SENSOR_RELAY "2I", - D_SENSOR_RELAY "3I", - D_SENSOR_RELAY "4I", - D_SENSOR_LED "1", - D_SENSOR_LED "2", - D_SENSOR_LED "3", - D_SENSOR_LED "4", - D_SENSOR_LED "1I", - D_SENSOR_LED "2I", - D_SENSOR_LED "3I", - D_SENSOR_LED "4I", + D_SENSOR_RELAY "5", + D_SENSOR_RELAY "6", + D_SENSOR_RELAY "7", + D_SENSOR_RELAY "8", + D_SENSOR_RELAY "1i", + D_SENSOR_RELAY "2i", + D_SENSOR_RELAY "3i", + D_SENSOR_RELAY "4i", + D_SENSOR_RELAY "5i", + D_SENSOR_RELAY "6i", + D_SENSOR_RELAY "7i", + D_SENSOR_RELAY "8i", D_SENSOR_PWM "1", D_SENSOR_PWM "2", D_SENSOR_PWM "3", @@ -113,13 +121,21 @@ const char sensors[GPIO_SENSOR_END][9] PROGMEM = { D_SENSOR_COUNTER "2", D_SENSOR_COUNTER "3", D_SENSOR_COUNTER "4", - D_SENSOR_PWM "1I", - D_SENSOR_PWM "2I", - D_SENSOR_PWM "3I", - D_SENSOR_PWM "4I", - D_SENSOR_PWM "5I", - D_SENSOR_IRRECV - }; + D_SENSOR_PWM "1i", + D_SENSOR_PWM "2i", + D_SENSOR_PWM "3i", + D_SENSOR_PWM "4i", + D_SENSOR_PWM "5i", + D_SENSOR_IRRECV, + D_SENSOR_LED "1", + D_SENSOR_LED "2", + D_SENSOR_LED "3", + D_SENSOR_LED "4", + D_SENSOR_LED "1i", + D_SENSOR_LED "2i", + D_SENSOR_LED "3i", + D_SENSOR_LED "4i" +}; // Programmer selectable GPIO functionality offset by user selectable GPIOs enum fpins_t { diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index 9d4304cf1..5e0728ea3 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -456,8 +456,8 @@ void handleRoot() page += F("