diff --git a/README.md b/README.md index 336e2e5ad..88755b9e3 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.0c** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. +Current version is **5.8.0d** - 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 c832719ed..fa0ce80fd 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,20 @@ -/* 5.8.0c +/* 5.8.0d + * Remove previous GPIO configuration when another module is selected + * Fix inverted relay power on state (#909) + * Change default PWM assignments for H801 RGB(CW) led controller to support optional Color/Dimmer control + * GPIO04 (W2) from GPIO_PWM2 to GPIO_USER to be user configurable for GPIO_PWM5 (second White - Warm if W1 is Cold) + * GPIO12 (Blue) GPIO_PWM3 no change + * GPIO13 (Green) from GPIO_PWM4 to GPIO_PWM2 + * GPIO14 (W1) from GPIO_PWM1 to GPIO_USER to be user configurable for GPIO_PWM4 (first White - Cold or Warm) + * GPIO15 (Red) from GPIO_PWM5 to GPIO_PWM1 + * Change default PWM assignments for MagicHome RGB(W) led controller to support optional Color/Dimmer control + * GPIO05 (Green) from GPIO_PWM4 to GPIO_PWM2 + * GPIO12 (Blue) from GPIO_PWM5 to GPIO_PWM3 + * GPIO13 (White) GPIO_USER to be user configurable for GPIO_PWM4 (White - Cold or Warm) + * GPIO14 (Red) from GPIO_PWM3 to GPIO_PWM1 + * Add command SetOption15 0 (default) for command PWM control or SetOption15 1 for commands Color/Dimmer control to PWM RGB(CW) leds (#941) + * + * 5.8.0c * Add warning to webpage when USE_MINIMAL is selected (#929) * Fix compile error when DOMOTICZ_UPDATE_TIMER is not defined (#930) * Fix alignment of web page items in some browsers (#935) diff --git a/sonoff/settings.h b/sonoff/settings.h index cd0df85e7..e9809eea3 100644 --- a/sonoff/settings.h +++ b/sonoff/settings.h @@ -37,7 +37,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0) uint32_t button_single : 1; // bit 13 (v5.4.0) uint32_t interlock : 1; // bit 14 (v5.6.0) - uint32_t spare15 : 1; + uint32_t pwm_control : 1; // bit 15 (v5.8.1) uint32_t spare16 : 1; uint32_t spare17 : 1; uint32_t spare18 : 1; diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index a57528cc2..c67c00db4 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,7 +25,7 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x05080003 // 5.8.0c +#define VERSION 0x05080004 // 5.8.0d enum week_t {Last, First, Second, Third, Fourth}; enum dow_t {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat}; @@ -290,7 +290,7 @@ uint8_t hlw_flg = 0; // Power monitor configured uint8_t i2c_flg = 0; // I2C configured uint8_t spi_flg = 0; // SPI configured uint8_t pwm_flg = 0; // PWM configured -uint8_t sfl_flg = 0; // Sonoff Led flag (0 = No led, 1 = BN-SZ01, 2 = Sonoff Led, 5 = Sonoff B1) +uint8_t sfl_flg = 0; // Sonoff Led flag (0 = No led, 1 = BN-SZ01, 2 = Sonoff Led, 3 = H801/MagicHome, 4 = H801/MagicHome, 5 = H801, 11 = WS2812, 12 = AiLight, 13 = Sonoff B1) uint8_t pwm_idxoffset = 0; // Allowed PWM command offset (change for Sonoff Led) boolean mDNSbegun = false; @@ -1079,7 +1079,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SAVEDATA "\":\"%s\"}"), (sysCfg.savedata > 1) ? stemp1 : getStateText(sysCfg.savedata)); } - else if (!strcasecmp_P(type, PSTR(D_CMND_SETOPTION)) && ((index >= 0) && (index <= 14)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SETOPTION)) && ((index >= 0) && (index <= 15)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) { if (index <= 31) { ptype = 0; // SetOption0 .. 31 } else { @@ -1091,6 +1091,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) if (payload <= 1) { switch (index) { case 3: // mqtt + case 15: // pwm_control restartflag = 2; case 0: // savestate case 1: // button_restrict @@ -2324,7 +2325,7 @@ void stateloop() button_handler(); switch_handler(); - if (sfl_flg) { // Sonoff B1, AiLight, Sonoff led or BN-SZ01 + if (sfl_flg) { sl_animate(); } @@ -2619,6 +2620,15 @@ void GPIO_init() analogWriteRange(PWM_RANGE); // Default is 1023 (Arduino.h) analogWriteFreq(PWM_FREQ); // Default is 1000 (core_esp8266_wiring_pwm.c) + if (sysCfg.flag.pwm_control) { + sfl_flg = 0; + for (byte i = 0; i < 5; i++) { + if (pin[GPIO_PWM1 +i] < 99) { + sfl_flg++; + } + } + } + Maxdevice = 1; if (SONOFF_BRIDGE == sysCfg.module) { Baudrate = 19200; @@ -2635,17 +2645,22 @@ void GPIO_init() Maxdevice = 0; Baudrate = 19200; } - else if (SONOFF_BN == sysCfg.module) { // Single color led (White) + else if ((H801 == sysCfg.module) || (MAGICHOME == sysCfg.module)) { // PWM RGBCW led + if (!sysCfg.flag.pwm_control) { + sfl_flg = 0; + } + } + else if (SONOFF_BN == sysCfg.module) { // PWM Single color led (White) sfl_flg = 1; } - else if (SONOFF_LED == sysCfg.module) { // Dual color led (White warm and cold) + else if (SONOFF_LED == sysCfg.module) { // PWM Dual color led (White warm and cold) sfl_flg = 2; } else if (AILIGHT == sysCfg.module) { // RGBW led - sfl_flg = 4; + sfl_flg = 12; } else if (SONOFF_B1 == sysCfg.module) { // RGBWC led - sfl_flg = 5; + sfl_flg = 13; } else { Maxdevice = 0; @@ -2674,14 +2689,14 @@ void GPIO_init() } #ifdef USE_WS2812 - if (!sfl_flg && (pin[GPIO_WS2812] < 99)) { + if (!sfl_flg && (pin[GPIO_WS2812] < 99)) { // RGB led Maxdevice++; - sfl_flg = 3; + sfl_flg = 11; } #endif // USE_WS2812 if (sfl_flg) { // Sonoff B1, AiLight, Sonoff Led or BN-SZ01, WS2812 - if (sfl_flg < 3) { - pwm_idxoffset = sfl_flg; // 1 for BN-SZ01, 2 for Sonoff Led + if (sfl_flg < 6) { + pwm_idxoffset = sfl_flg; // 1 for BN-SZ01, 2 for Sonoff Led, 3,4,5 for H801 and MagicHome } sl_init(); } @@ -2833,7 +2848,7 @@ void setup() // Issue #526 for (byte i = 0; i < Maxdevice; i++) { - if ((pin[GPIO_REL1 +i] < 99) && (digitalRead(pin[GPIO_REL1 +i]))) { + if ((pin[GPIO_REL1 +i] < 99) && (digitalRead(pin[GPIO_REL1 +i]) ^ rel_inverted[i])) { bitSet(power, i); pulse_timer[i] = sysCfg.pulsetime[i]; } diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h index 4cc9afe75..940b45071 100644 --- a/sonoff/sonoff_template.h +++ b/sonoff/sonoff_template.h @@ -52,11 +52,11 @@ enum upins_t { GPIO_LED2_INV, GPIO_LED3_INV, GPIO_LED4_INV, - GPIO_PWM1, // Sonoff Led Cold - GPIO_PWM2, // Sonoff Led Warm - GPIO_PWM3, // Red (swapped with Blue from original) - GPIO_PWM4, // Green - GPIO_PWM5, // Blue (swapped with Red from original) + GPIO_PWM1, // RGB Red or C Cold White + GPIO_PWM2, // RGB Green or CW Warm White + GPIO_PWM3, // RGB Blue + GPIO_PWM4, // RGBW (Cold) White + GPIO_PWM5, // RGBCW Warm White GPIO_CNTR1, GPIO_CNTR2, GPIO_CNTR3, @@ -467,13 +467,13 @@ const mytmplt modules[MAXMODULE] PROGMEM = { GPIO_LED1, // GPIO01 Green LED GPIO_TXD, // GPIO02 RX - Pin next to TX on the PCB GPIO_RXD, // GPIO03 TX - Pin next to GND on the PCB - GPIO_PWM2, // GPIO04 W2 + GPIO_USER, // GPIO04 W2 - PWM5 GPIO_LED2_INV, // GPIO05 Red LED 0, 0, 0, 0, 0, 0, // Flash connection GPIO_PWM3, // GPIO12 Blue - GPIO_PWM4, // GPIO13 Green - GPIO_PWM1, // GPIO14 W1 - GPIO_PWM5, // GPIO15 Red + GPIO_PWM2, // GPIO13 Green + GPIO_USER, // GPIO14 W1 - PWM4 + GPIO_PWM1, // GPIO15 Red 0, 0 }, { "Sonoff SC", // Sonoff SC (ESP8266) @@ -658,11 +658,11 @@ const mytmplt modules[MAXMODULE] PROGMEM = { GPIO_LED1_INV, // GPIO02 Blue onboard LED 0, GPIO_USER, // GPIO04 IR receiver (optional) - GPIO_PWM4, // GPIO05 RGB LED Green + GPIO_PWM2, // GPIO05 RGB LED Green 0, 0, 0, 0, 0, 0, // Flash connection - GPIO_PWM5, // GPIO12 RGB LED Blue - GPIO_USER, // GPIO13 RGBW LED White (optional - set to PWM1 for Cold White or PWM2 for Warm White) - GPIO_PWM3, // GPIO14 RGB LED Red + GPIO_PWM3, // GPIO12 RGB LED Blue + GPIO_USER, // GPIO13 RGBW LED White (optional - set to PWM4 for Cold White or Warm White) + GPIO_PWM1, // GPIO14 RGB LED Red 0, 0, 0 } }; diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index ff40dcd31..eab7b3f35 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -443,7 +443,7 @@ void handleRoot() page += F("
"); if (Maxdevice) { if (sfl_flg) { - if ((2 == sfl_flg) || (5 == sfl_flg)) { + if ((2 == (sfl_flg &7)) || (5 == (sfl_flg &7))) { snprintf_P(line, sizeof(line), HTTP_MSG_SLIDER1, sl_getColorTemp()); page += line; } @@ -1051,11 +1051,12 @@ void handleSave() for (byte i = 0; i < MAX_GPIO_PIN; i++) { if (new_modflg) { sysCfg.my_module.gp.io[i] = 0; - } - if (GPIO_USER == cmodule.gp.io[i]) { - snprintf_P(stemp, sizeof(stemp), PSTR("g%d"), i); - sysCfg.my_module.gp.io[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str()); - gpios += F(", " D_GPIO ); gpios += String(i); gpios += F(" "); gpios += String(sysCfg.my_module.gp.io[i]); + } else { + if (GPIO_USER == cmodule.gp.io[i]) { + snprintf_P(stemp, sizeof(stemp), PSTR("g%d"), i); + sysCfg.my_module.gp.io[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str()); + gpios += F(", " D_GPIO ); gpios += String(i); gpios += F(" "); gpios += String(sysCfg.my_module.gp.io[i]); + } } } snprintf_P(stemp, sizeof(stemp), modules[sysCfg.module].name); diff --git a/sonoff/xdrv_snfled.ino b/sonoff/xdrv_snfled.ino index 7424026ce..adba344df 100644 --- a/sonoff/xdrv_snfled.ino +++ b/sonoff/xdrv_snfled.ino @@ -1,5 +1,5 @@ /* - xdrv_snfled.ino - WS2812 and sonoff led support for Sonoff-Tasmota + xdrv_snfled.ino - PWM, WS2812 and sonoff led support for Sonoff-Tasmota Copyright (C) 2017 Theo Arends @@ -18,14 +18,19 @@ */ /*********************************************************************************************\ - * WS2812, Sonoff B1, AiLight, Sonoff Led and BN-SZ01 + * PWM, WS2812, Sonoff B1, AiLight, Sonoff Led and BN-SZ01 * - * sfl_flg Module Color ColorTemp - * 1 Sonoff BN-SZ W no - * 2 Sonoff Led CW yes - * 3 +WS2812 RGB no - * 4 AiLight RGBW no - * 5 Sonoff B1 RGBCW yes + * sfl_flg Module Color ColorTemp + * 1 PWM1 W no (Sonoff BN-SZ) + * 2 PWM2 CW yes (Sonoff Led) + * 3 PWM3 RGB no (H801 and MagicHome) + * 4 PWM4 RGBW no (H801 and MagicHome) + * 5 PWM5 RGBCW yes (H801) + * 9 reserved no + * 10 reserved yes + * 11 +WS2812 RGB no + * 12 AiLight RGBW no + * 13 Sonoff B1 RGBCW yes * * led_scheme WS2812 Others Effect * 0 yes yes Color On/Off @@ -114,7 +119,7 @@ void sl_my92x1_write(uint8_t data) void sl_my92x1_init() { - uint8_t chips = sfl_flg -3; // 1 (AiLight) or 2 (Sonoff B1) + uint8_t chips = sfl_flg -11; // 1 (AiLight) or 2 (Sonoff B1) sl_dcki_pulse(chips * 32); // Clear all duty register os_delay_us(12); // TStop > 12us. @@ -136,7 +141,7 @@ void sl_my92x1_duty(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b, uint8_t duty { uint8_t channels[2] = { 4, 6 }; - uint8_t didx = sfl_flg -4; // 0 or 1 + uint8_t didx = sfl_flg -12; // 0 or 1 uint8_t duty[2][6] = {{ duty_r, duty_g, duty_b, duty_w, 0, 0 }, // Definition for RGBW channels { duty_w, duty_c, 0, duty_g, duty_r, duty_b }}; // Definition for RGBWC channels @@ -154,27 +159,28 @@ void sl_my92x1_duty(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b, uint8_t duty void sl_init(void) { - if (sfl_flg < 3) { - if (!my_module.gp.io[4]) { - pinMode(4, OUTPUT); // Stop floating outputs - digitalWrite(4, LOW); + if (sfl_flg < 6) { // PWM + for (byte i = 0; i < sfl_flg; i++) { + sysCfg.pwmvalue[i] = 0; // Disable direct PWM control } - if (!my_module.gp.io[5]) { - pinMode(5, OUTPUT); // Stop floating outputs - digitalWrite(5, LOW); - } - if (!my_module.gp.io[14]) { - pinMode(14, OUTPUT); // Stop floating outputs - digitalWrite(14, LOW); - } - sysCfg.pwmvalue[0] = 0; // We use dimmer / led_color - if (2 == sfl_flg) { - sysCfg.pwmvalue[1] = 0; // We use led_color + if (SONOFF_LED == sysCfg.module) { // Fix Sonoff Led instabilities + if (!my_module.gp.io[4]) { + pinMode(4, OUTPUT); // Stop floating outputs + digitalWrite(4, LOW); + } + if (!my_module.gp.io[5]) { + pinMode(5, OUTPUT); // Stop floating outputs + digitalWrite(5, LOW); + } + if (!my_module.gp.io[14]) { + pinMode(14, OUTPUT); // Stop floating outputs + digitalWrite(14, LOW); + } } sysCfg.led_scheme = 0; } #ifdef USE_WS2812 // ************************************************************************ - else if (3 == sfl_flg) { + else if (11 == sfl_flg) { ws2812_init(); if (1 == sysCfg.led_scheme) { sysCfg.led_scheme = 0; @@ -212,7 +218,7 @@ void sl_setColorTemp(uint16_t ct) } uint16_t icold = (100 * (347 - my_ct)) / 136; uint16_t iwarm = (100 * my_ct) / 136; - if (5 == sfl_flg) { + if (5 == (sfl_flg &7)) { sysCfg.led_color[0] = 0; sysCfg.led_color[1] = 0; sysCfg.led_color[2] = 0; @@ -227,7 +233,7 @@ void sl_setColorTemp(uint16_t ct) uint16_t sl_getColorTemp() { uint8_t ct_idx = 0; - if (5 == sfl_flg) { + if (5 == (sfl_flg &7)) { ct_idx = 3; } uint16_t my_ct = sysCfg.led_color[ct_idx +1]; @@ -243,11 +249,11 @@ void sl_setDim(uint8_t myDimmer) { float temp; - if ((1 == sfl_flg) && (100 == myDimmer)) { + if ((SONOFF_BN == sysCfg.module) && (100 == myDimmer)) { myDimmer = 99; // BN-SZ01 starts flickering at dimmer = 100 } float newDim = 100 / (float)myDimmer; - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { temp = (float)sysCfg.led_color[i] / newDim; sl_dcolor[i] = (uint8_t)temp; } @@ -258,7 +264,7 @@ void sl_setColor() uint8_t highest = 0; float temp; - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { if (highest < sl_dcolor[i]) { highest = sl_dcolor[i]; } @@ -266,7 +272,7 @@ void sl_setColor() float mDim = (float)highest / 2.55; sysCfg.led_dimmer[0] = (uint8_t)mDim; float newDim = 100 / mDim; - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { temp = (float)sl_dcolor[i] * newDim; sysCfg.led_color[i] = (uint8_t)temp; } @@ -276,7 +282,7 @@ char* sl_getColor(char* scolor) { sl_setDim(sysCfg.led_dimmer[0]); scolor[0] = '\0'; - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { snprintf_P(scolor, 11, PSTR("%s%02X"), scolor, sl_dcolor[i]); } return scolor; @@ -297,7 +303,7 @@ void sl_prepPower() // mqtt_publishDomoticzPowerState(1); domoticz_updatePowerState(Maxdevice); #endif // USE_DOMOTICZ - if (sfl_flg > 1) { + if ((sfl_flg &7) > 1) { snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_RSLT_POWER "\":\"%s\", \"" D_CMND_DIMMER "\":%d, \"" D_CMND_COLOR "\":\"%s\"}"), getStateText(sl_power), sysCfg.led_dimmer[0], sl_getColor(scolor)); } else { @@ -328,7 +334,7 @@ void sl_animate() if (!sl_power) { // Power Off sleep = sysCfg.sleep; stripTimerCntr = 0; - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { sl_tcolor[i] = 0; } } @@ -338,11 +344,11 @@ void sl_animate() case 0: // Power On sl_setDim(sysCfg.led_dimmer[0]); // Power On if (0 == sysCfg.led_fade) { - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { sl_tcolor[i] = sl_dcolor[i]; } } else { - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { if (sl_tcolor[i] != sl_dcolor[i]) { if (sl_tcolor[i] < sl_dcolor[i]) { sl_tcolor[i] += ((sl_dcolor[i] - sl_tcolor[i]) >> sysCfg.led_speed) +1; @@ -357,7 +363,7 @@ void sl_animate() case 1: // Power On using wake up duration if (2 == sl_wakeupActive) { sl_wakeupActive = 1; - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { sl_tcolor[i] = 0; } sl_wakeupCntr = 0; @@ -369,7 +375,7 @@ void sl_animate() sl_wakeupDimmer++; if (sl_wakeupDimmer <= sysCfg.led_dimmer[0]) { sl_setDim(sl_wakeupDimmer); - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { sl_tcolor[i] = sl_dcolor[i]; } } else { @@ -382,7 +388,7 @@ void sl_animate() break; #ifdef USE_WS2812 // ************************************************************************ default: - if (3 == sfl_flg) { + if (11 == sfl_flg) { ws2812_showScheme(sysCfg.led_scheme -2); } #endif // USE_WS2812 ************************************************************************ @@ -390,28 +396,28 @@ void sl_animate() } if ((sysCfg.led_scheme < 2) || !sl_power) { - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { if (sl_lcolor[i] != sl_tcolor[i]) { sl_any = 1; } } if (sl_any) { sl_any = 0; - for (byte i = 0; i < sfl_flg; i++) { + for (byte i = 0; i < (sfl_flg &7); i++) { sl_lcolor[i] = sl_tcolor[i]; cur_col[i] = (sysCfg.led_table) ? ledTable[sl_lcolor[i]] : sl_lcolor[i]; - if (sfl_flg < 3) { + if (sfl_flg < 6) { if (pin[GPIO_PWM1 +i] < 99) { analogWrite(pin[GPIO_PWM1 +i], cur_col[i] * (PWM_RANGE / 255)); } } } #ifdef USE_WS2812 // ************************************************************************ - if (3 == sfl_flg) { + if (11 == sfl_flg) { ws2812_setColor(0, cur_col[0], cur_col[1], cur_col[2]); } #endif // USE_ES2812 ************************************************************************ - if (sfl_flg > 3) { + if (sfl_flg > 11) { sl_my92x1_duty(cur_col[0], cur_col[1], cur_col[2], cur_col[3], cur_col[4]); } } @@ -525,7 +531,7 @@ void sl_hsb2rgb() void sl_replaceHSB(String *response) { - if (sfl_flg > 2) { + if ((sfl_flg &7) > 2) { sl_rgb2hsb(); response->replace("{h}", String((uint16_t)(65535.0f * sl_Hue))); response->replace("{s}", String((uint8_t)(254.0f * sl_Sat))); @@ -540,7 +546,7 @@ void sl_replaceHSB(String *response) void sl_getHSB(float *hue, float *sat, float *bri) { - if (sfl_flg > 2) { + if ((sfl_flg &7) > 2) { sl_rgb2hsb(); *hue = sl_Hue; *sat = sl_Sat; @@ -567,7 +573,7 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct) */ if (sfl_flg > 2) { - if ((5 == sfl_flg) && (ct > 0)) { + if ((5 == (sfl_flg &7)) && (ct > 0)) { sl_setColorTemp(ct); } else { sl_Hue = hue; @@ -581,7 +587,7 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct) } else { uint8_t tmp = (uint8_t)(bri * 100); sysCfg.led_dimmer[0] = tmp; - if (2 == sfl_flg) { + if (2 == (sfl_flg &7)) { if (ct > 0) { sl_setColorTemp(ct); } @@ -605,13 +611,13 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, char scolor[11]; char *p; - if ((sfl_flg > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR))) { + if (((sfl_flg &7) > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR))) { if (dataBuf[0] == '#') { dataBuf++; data_len--; } - if ((2 * sfl_flg) == data_len) { - for (byte i = 0; i < sfl_flg; i++) { + if ((2 * (sfl_flg &7)) == data_len) { + for (byte i = 0; i < (sfl_flg &7); i++) { strlcpy(scolor, dataBuf + (i *2), 3); sl_dcolor[i] = (uint8_t)strtol(scolor, &p, 16); } @@ -622,14 +628,14 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, } } #ifdef USE_WS2812 // *********************************************************************** - else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= sysCfg.led_pixels)) { + else if ((11 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= sysCfg.led_pixels)) { if (dataBuf[0] == '#') { dataBuf++; data_len--; } uint8_t sl_ledcolor[3]; - if ((2 * sfl_flg) == data_len) { - for (byte i = 0; i < sfl_flg; i++) { + if ((2 * (sfl_flg &7)) == data_len) { + for (byte i = 0; i < (sfl_flg &7); i++) { strlcpy(scolor, dataBuf + (i *2), 3); sl_ledcolor[i] = (uint8_t)strtol(scolor, &p, 16); } @@ -637,7 +643,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, } snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_LED "%d\":\"%s\"}"), index, ws2812_getColor(index, scolor)); } - else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_PIXELS))) { + else if ((11 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_PIXELS))) { if ((payload > 0) && (payload <= WS2812_MAX_LEDS)) { sysCfg.led_pixels = payload; ws2812_clear(); @@ -645,13 +651,13 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, } snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_PIXELS "\":%d}"), sysCfg.led_pixels); } - else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_WIDTH))) { + else if ((11 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_WIDTH))) { if ((payload >= 0) && (payload <= 4)) { sysCfg.led_width = payload; } snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WIDTH "\":%d}"), sysCfg.led_width); } - else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_SCHEME))) { + else if ((11 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_SCHEME))) { if ((payload >= 0) && (payload <= 9)) { sysCfg.led_scheme = payload; if (1 == sysCfg.led_scheme) { @@ -672,7 +678,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, do_cmnd_power(Maxdevice, 1); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_STARTED "\"}")); } - else if (!strcasecmp_P(type, PSTR(D_CMND_COLORTEMPERATURE)) && ((2 == sfl_flg) || (5 == sfl_flg))) { // ColorTemp + else if (!strcasecmp_P(type, PSTR(D_CMND_COLORTEMPERATURE)) && ((2 == (sfl_flg &7)) || (5 == (sfl_flg &7)))) { // ColorTemp if ((payload >= 153) && (payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts sl_setColorTemp(payload); coldim = true;