From db4a3a4a1ee8964accd60e2b9acf182ab5514f62 Mon Sep 17 00:00:00 2001 From: arendst Date: Wed, 15 Nov 2017 23:07:45 +0100 Subject: [PATCH] v5.9.1d - Add Arilux LC11 support 5.9.1d * Add support for Arilux LC11 (CLearing RF home code when selecting no Arilux module) * Add fixed color options 1..12 to command Color * Add + (plus) and - (minus) to commands Dimmer (+10/-10), Speed and Scheme --- README.md | 2 +- sonoff/_releasenotes.ino | 7 +- sonoff/language/de-DE.h | 44 ++-- sonoff/language/en-GB.h | 44 ++-- sonoff/language/nl-NL.h | 44 ++-- sonoff/language/pl-PL.h | 44 ++-- sonoff/settings.h | 3 +- sonoff/sonoff.ino | 15 +- sonoff/sonoff_template.h | 30 ++- sonoff/user_config.h | 2 + sonoff/webserver.ino | 4 +- .../{xdrv_ir_send.ino => xdrv_irremote.ino} | 2 +- sonoff/{xdrv_snfled.ino => xdrv_light.ino} | 208 +++++++++++++++++- 13 files changed, 344 insertions(+), 105 deletions(-) rename sonoff/{xdrv_ir_send.ino => xdrv_irremote.ino} (99%) rename sonoff/{xdrv_snfled.ino => xdrv_light.ino} (80%) diff --git a/README.md b/README.md index cbf0eb4e7..90b7254a4 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.9.1c** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. +Current version is **5.9.1d** - 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 c8ecde0f0..a442071e6 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,9 @@ -/* 5.9.1c +/* 5.9.1d + * Add support for Arilux LC11 (CLearing RF home code when selecting no Arilux module) + * Add fixed color options 1..12 to command Color + * Add + (plus) and - (minus) to commands Dimmer (+10/-10), Speed and Scheme + * + * 5.9.1c * Add support for WS2812 RGBW ledstrips to be enabled in user_config.h with define USE_WS2812_CTYPE (#1156) * * 5.9.1b diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h index b249bf1f7..d5b3ebc5b 100644 --- a/sonoff/language/de-DE.h +++ b/sonoff/language/de-DE.h @@ -491,27 +491,29 @@ #define D_UNIT_WATTHOUR "Wh" // Log message prefix -#define D_LOG_APPLICATION "APP: " -#define D_LOG_BRIDGE "BRG: " -#define D_LOG_CONFIG "CFG: " -#define D_LOG_COMMAND "CMD: " -#define D_LOG_DHT "DHT: " -#define D_LOG_DOMOTICZ "DOM: " -#define D_LOG_DSB "DSB: " -#define D_LOG_HTTP "HTP: " -#define D_LOG_I2C "I2C: " -#define D_LOG_IRR "IRR: " -#define D_LOG_LOG "LOG: " -#define D_LOG_MODULE "MOD: " -#define D_LOG_MDNS "DNS: " -#define D_LOG_MQTT "MQT: " -#define D_LOG_OTHER "OTH: " -#define D_LOG_RESULT "RSL: " -#define D_LOG_SERIAL "SER: " -#define D_LOG_SHT1 "SHT: " -#define D_LOG_UPLOAD "UPL: " -#define D_LOG_UPNP "UPP: " -#define D_LOG_WIFI "WIF: " +#define D_LOG_APPLICATION "APP: " // Application +#define D_LOG_BRIDGE "BRG: " // Bridge +#define D_LOG_CONFIG "CFG: " // Settings +#define D_LOG_COMMAND "CMD: " // Command +#define D_LOG_DEBUG "DBG: " // Debug +#define D_LOG_DHT "DHT: " // DHT sensor +#define D_LOG_DOMOTICZ "DOM: " // Domoticz +#define D_LOG_DSB "DSB: " // DS18xB20 sensor +#define D_LOG_HTTP "HTP: " // HTTP webserver +#define D_LOG_I2C "I2C: " // I2C +#define D_LOG_IRR "IRR: " // Infra Red Received +#define D_LOG_LOG "LOG: " // Logging +#define D_LOG_MODULE "MOD: " // Module +#define D_LOG_MDNS "DNS: " // mDNS +#define D_LOG_MQTT "MQT: " // MQTT +#define D_LOG_OTHER "OTH: " // Other +#define D_LOG_RESULT "RSL: " // Result +#define D_LOG_RFR "RFR: " // RF Received +#define D_LOG_SERIAL "SER: " // Serial +#define D_LOG_SHT1 "SHT: " // SHT1x sensor +#define D_LOG_UPLOAD "UPL: " // Upload +#define D_LOG_UPNP "UPP: " // UPnP +#define D_LOG_WIFI "WIF: " // Wifi // Result #define D_RSLT_RESULT "ERGEBNIS" diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h index 35116fd04..0cc97c552 100644 --- a/sonoff/language/en-GB.h +++ b/sonoff/language/en-GB.h @@ -491,27 +491,29 @@ #define D_UNIT_WATTHOUR "Wh" // Log message prefix -#define D_LOG_APPLICATION "APP: " -#define D_LOG_BRIDGE "BRG: " -#define D_LOG_CONFIG "CFG: " -#define D_LOG_COMMAND "CMD: " -#define D_LOG_DHT "DHT: " -#define D_LOG_DOMOTICZ "DOM: " -#define D_LOG_DSB "DSB: " -#define D_LOG_HTTP "HTP: " -#define D_LOG_I2C "I2C: " -#define D_LOG_IRR "IRR: " -#define D_LOG_LOG "LOG: " -#define D_LOG_MODULE "MOD: " -#define D_LOG_MDNS "DNS: " -#define D_LOG_MQTT "MQT: " -#define D_LOG_OTHER "OTH: " -#define D_LOG_RESULT "RSL: " -#define D_LOG_SERIAL "SER: " -#define D_LOG_SHT1 "SHT: " -#define D_LOG_UPLOAD "UPL: " -#define D_LOG_UPNP "UPP: " -#define D_LOG_WIFI "WIF: " +#define D_LOG_APPLICATION "APP: " // Application +#define D_LOG_BRIDGE "BRG: " // Bridge +#define D_LOG_CONFIG "CFG: " // Settings +#define D_LOG_COMMAND "CMD: " // Command +#define D_LOG_DEBUG "DBG: " // Debug +#define D_LOG_DHT "DHT: " // DHT sensor +#define D_LOG_DOMOTICZ "DOM: " // Domoticz +#define D_LOG_DSB "DSB: " // DS18xB20 sensor +#define D_LOG_HTTP "HTP: " // HTTP webserver +#define D_LOG_I2C "I2C: " // I2C +#define D_LOG_IRR "IRR: " // Infra Red Received +#define D_LOG_LOG "LOG: " // Logging +#define D_LOG_MODULE "MOD: " // Module +#define D_LOG_MDNS "DNS: " // mDNS +#define D_LOG_MQTT "MQT: " // MQTT +#define D_LOG_OTHER "OTH: " // Other +#define D_LOG_RESULT "RSL: " // Result +#define D_LOG_RFR "RFR: " // RF Received +#define D_LOG_SERIAL "SER: " // Serial +#define D_LOG_SHT1 "SHT: " // SHT1x sensor +#define D_LOG_UPLOAD "UPL: " // Upload +#define D_LOG_UPNP "UPP: " // UPnP +#define D_LOG_WIFI "WIF: " // Wifi // Result #define D_RSLT_RESULT "RESULT" diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h index 09679d660..15fb4aea2 100644 --- a/sonoff/language/nl-NL.h +++ b/sonoff/language/nl-NL.h @@ -491,27 +491,29 @@ #define D_UNIT_WATTHOUR "Wh" // Log message prefix -#define D_LOG_APPLICATION "APP: " -#define D_LOG_BRIDGE "BRG: " -#define D_LOG_CONFIG "CFG: " -#define D_LOG_COMMAND "CMD: " -#define D_LOG_DHT "DHT: " -#define D_LOG_DOMOTICZ "DOM: " -#define D_LOG_DSB "DSB: " -#define D_LOG_HTTP "HTP: " -#define D_LOG_I2C "I2C: " -#define D_LOG_IRR "IRR: " -#define D_LOG_LOG "LOG: " -#define D_LOG_MODULE "MOD: " -#define D_LOG_MDNS "DNS: " -#define D_LOG_MQTT "MQT: " -#define D_LOG_OTHER "OTH: " -#define D_LOG_RESULT "RSL: " -#define D_LOG_SERIAL "SER: " -#define D_LOG_SHT1 "SHT: " -#define D_LOG_UPLOAD "UPL: " -#define D_LOG_UPNP "UPP: " -#define D_LOG_WIFI "WIF: " +#define D_LOG_APPLICATION "APP: " // Application +#define D_LOG_BRIDGE "BRG: " // Bridge +#define D_LOG_CONFIG "CFG: " // Settings +#define D_LOG_COMMAND "CMD: " // Command +#define D_LOG_DEBUG "DBG: " // Debug +#define D_LOG_DHT "DHT: " // DHT sensor +#define D_LOG_DOMOTICZ "DOM: " // Domoticz +#define D_LOG_DSB "DSB: " // DS18xB20 sensor +#define D_LOG_HTTP "HTP: " // HTTP webserver +#define D_LOG_I2C "I2C: " // I2C +#define D_LOG_IRR "IRR: " // Infra Red Received +#define D_LOG_LOG "LOG: " // Logging +#define D_LOG_MODULE "MOD: " // Module +#define D_LOG_MDNS "DNS: " // mDNS +#define D_LOG_MQTT "MQT: " // MQTT +#define D_LOG_OTHER "OTH: " // Other +#define D_LOG_RESULT "RSL: " // Result +#define D_LOG_RFR "RFR: " // RF Received +#define D_LOG_SERIAL "SER: " // Serial +#define D_LOG_SHT1 "SHT: " // SHT1x sensor +#define D_LOG_UPLOAD "UPL: " // Upload +#define D_LOG_UPNP "UPP: " // UPnP +#define D_LOG_WIFI "WIF: " // Wifi // Result #define D_RSLT_RESULT "RESULTAAT" diff --git a/sonoff/language/pl-PL.h b/sonoff/language/pl-PL.h index 542f49a6d..24713dc60 100644 --- a/sonoff/language/pl-PL.h +++ b/sonoff/language/pl-PL.h @@ -491,27 +491,29 @@ #define D_UNIT_WATTHOUR "Wh" // Log message prefix -#define D_LOG_APPLICATION "APP: " -#define D_LOG_BRIDGE "BRG: " -#define D_LOG_CONFIG "CFG: " -#define D_LOG_COMMAND "CMD: " -#define D_LOG_DHT "DHT: " -#define D_LOG_DOMOTICZ "DOM: " -#define D_LOG_DSB "DSB: " -#define D_LOG_HTTP "HTP: " -#define D_LOG_I2C "I2C: " -#define D_LOG_IRR "IRR: " -#define D_LOG_LOG "LOG: " -#define D_LOG_MODULE "MOD: " -#define D_LOG_MDNS "DNS: " -#define D_LOG_MQTT "MQT: " -#define D_LOG_OTHER "OTH: " -#define D_LOG_RESULT "RSL: " -#define D_LOG_SERIAL "SER: " -#define D_LOG_SHT1 "SHT: " -#define D_LOG_UPLOAD "UPL: " -#define D_LOG_UPNP "UPP: " -#define D_LOG_WIFI "WIF: " +#define D_LOG_APPLICATION "APP: " // Application +#define D_LOG_BRIDGE "BRG: " // Bridge +#define D_LOG_CONFIG "CFG: " // Settings +#define D_LOG_COMMAND "CMD: " // Command +#define D_LOG_DEBUG "DBG: " // Debug +#define D_LOG_DHT "DHT: " // DHT sensor +#define D_LOG_DOMOTICZ "DOM: " // Domoticz +#define D_LOG_DSB "DSB: " // DS18xB20 sensor +#define D_LOG_HTTP "HTP: " // HTTP webserver +#define D_LOG_I2C "I2C: " // I2C +#define D_LOG_IRR "IRR: " // Infra Red Received +#define D_LOG_LOG "LOG: " // Logging +#define D_LOG_MODULE "MOD: " // Module +#define D_LOG_MDNS "DNS: " // mDNS +#define D_LOG_MQTT "MQT: " // MQTT +#define D_LOG_OTHER "OTH: " // Other +#define D_LOG_RESULT "RSL: " // Result +#define D_LOG_RFR "RFR: " // RF Received +#define D_LOG_SERIAL "SER: " // Serial +#define D_LOG_SHT1 "SHT: " // SHT1x sensor +#define D_LOG_UPLOAD "UPL: " // Upload +#define D_LOG_UPNP "UPP: " // UPnP +#define D_LOG_WIFI "WIF: " // Wifi // Result #define D_RSLT_RESULT "REZULTAT" diff --git a/sonoff/settings.h b/sonoff/settings.h index 3f4cfe525..afd6d3f5e 100644 --- a/sonoff/settings.h +++ b/sonoff/settings.h @@ -177,8 +177,7 @@ struct SYSCFG { uint16_t hlw_mkwhs; // 394 MaxEnergyStart uint16_t mqtt_retry; // 396 uint8_t poweronstate; // 398 - - byte free_399[1]; // 399 + uint8_t last_module; // 399 uint16_t blinktime; // 39A uint16_t blinkcount; // 39C diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 281beef8d..93101e257 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,7 +25,7 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x05090103 // 5.9.1c +#define VERSION 0x05090104 // 5.9.1d // Location specific includes #include "sonoff.h" // Enumaration used in user_config.h @@ -1087,9 +1087,9 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len) else if (CMND_MODULE == command_code) { if ((payload > 0) && (payload <= MAXMODULE)) { payload--; - byte new_modflg = (Settings.module != payload); + Settings.last_module = Settings.module; Settings.module = payload; - if (new_modflg) { + if (Settings.last_module != payload) { for (byte i = 0; i < MAX_GPIO_PIN; i++) { Settings.my_gp.io[i] = 0; } @@ -2456,6 +2456,7 @@ void GpioInit() if (!Settings.module || (Settings.module >= MAXMODULE)) { Settings.module = MODULE; + Settings.last_module = MODULE; } memcpy_P(&def_module, &kModules[Settings.module], sizeof(def_module)); @@ -2545,7 +2546,7 @@ void GpioInit() devices_present = 0; baudrate = 19200; } - else if ((H801 == Settings.module) || (MAGICHOME == Settings.module) || (ARILUX == Settings.module)) { // PWM RGBCW led + else if ((H801 == Settings.module) || (MAGICHOME == Settings.module) || (ARILUX_LC01 == Settings.module) || (ARILUX_LC11 == Settings.module)) { // PWM RGBCW led if (!Settings.flag.pwm_control) { light_type = LT_BASIC; // Use basic PWM control if SetOption15 = 0 } @@ -2761,6 +2762,12 @@ void loop() } #endif // USE_EMULATION +#ifdef USE_ARILUX_RF + if (pin[GPIO_ALIRFRCV] < 99) { + AriluxRfHandler(); + } +#endif // USE_ARILUX_RF + if (millis() >= state_loop_timer) { StateLoop(); } diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h index cb47420cf..ea9344d65 100644 --- a/sonoff/sonoff_template.h +++ b/sonoff/sonoff_template.h @@ -150,6 +150,7 @@ enum ProgramSelectablePins { GPIO_ADC0, // ADC GPIO_DI, // my92x1 PWM input GPIO_DCKI, // my92x1 CLK input + GPIO_ALIRFRCV, // AliLux RF Receive input GPIO_USER, // User configurable GPIO_MAX }; @@ -193,7 +194,8 @@ enum SupportedModules { MAGICHOME, LUANIHVIO, KMC_70011, - ARILUX, + ARILUX_LC01, + ARILUX_LC11, MAXMODULE }; /********************************************************************************************/ @@ -243,7 +245,8 @@ const uint8_t kNiceList[MAXMODULE] PROGMEM = { WION, H801, MAGICHOME, - ARILUX, + ARILUX_LC01, + ARILUX_LC11, HUAFAN_SS, KMC_70011, AILIGHT, @@ -731,14 +734,33 @@ const mytmplt kModules[MAXMODULE] PROGMEM = { 0, 0, 0 }, { "Arilux", // Arilux AL-LC01 (ESP8285) - https://www.banggood.com/nl/ARILUX-AL-LC01-Super-Mini-LED-WIFI-Smart-RGB-Controller-For-RGB-LED-Strip-Light-DC-9-12V-p-1058603.html - 0, 0, 0, 0, // (PwmFrequency 1111Hz) - GPIO_USER, // GPIO04 IR or RF receiver (optional) + // (PwmFrequency 1111Hz) + GPIO_KEY1, // GPIO00 Optional Button + 0, + GPIO_LED2_INV, // GPIO02 RF receiver control + 0, + GPIO_ALIRFRCV, // GPIO04 IR or RF receiver (optional) GPIO_PWM1, // GPIO05 RGB LED Red 0, 0, 0, 0, 0, 0, // Flash connection GPIO_PWM2, // GPIO12 RGB LED Green GPIO_PWM3, // GPIO13 RGB LED Blue GPIO_USER, // GPIO14 RGBW LED White (optional - set to PWM4 for Cold White or Warm White) 0, 0, 0 + }, + { "Arilux LC11", // Arilux AL-LC11 (ESP8266) - https://www.banggood.com/nl/ARILUX-AL-LC11-Super-Mini-LED-WIFI-APP-Controller-RF-Remote-Control-For-RGBWW-LED-Strip-DC9-28V-p-1085112.html + // (PwmFrequency 540Hz) + GPIO_KEY1, // GPIO00 Optional Button + 0, + GPIO_LED2_INV, // GPIO02 RF receiver control + 0, + GPIO_PWM2, // GPIO04 RGB LED Green + GPIO_PWM1, // GPIO05 RGB LED Red + 0, 0, 0, 0, 0, 0, // Flash connection + GPIO_PWM5, // GPIO12 RGBCW LED Warm + GPIO_PWM4, // GPIO13 RGBW LED Cold + GPIO_PWM3, // GPIO14 RGB LED Blue + GPIO_ALIRFRCV, // GPIO15 RF receiver input + 0, 0 } }; diff --git a/sonoff/user_config.h b/sonoff/user_config.h index 20bc22435..6044107fe 100644 --- a/sonoff/user_config.h +++ b/sonoff/user_config.h @@ -182,6 +182,8 @@ #define USE_WS2812_CTYPE 1 // WS2812 Color type (0 - RGB, 1 - GRB, 2 - RGBW, 3 - GRBW) // #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial RXD) (+1k mem). When USE_WS2812_DMA is enabled expect Exceptions on Pow +#define USE_ARILUX_RF // Add code for Arilux RF remote controller (+0.8k code) + /*********************************************************************************************\ * Compile a minimal version if upgrade memory gets tight ONLY TO BE USED FOR UPGRADE STEP 1! * To be used as step 1 during upgrade. diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index a079153ca..11cbae920 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -1027,13 +1027,13 @@ snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_LOG D_CMND_SERIALLOG " %d, " D break; case 6: byte new_module = (!strlen(WebServer->arg("g99").c_str())) ? MODULE : atoi(WebServer->arg("g99").c_str()); - byte new_modflg = (Settings.module != new_module); + Settings.last_module = Settings.module; Settings.module = new_module; mytmplt cmodule; memcpy_P(&cmodule, &kModules[Settings.module], sizeof(cmodule)); String gpios = ""; for (byte i = 0; i < MAX_GPIO_PIN; i++) { - if (new_modflg) { + if (Settings.last_module != new_module) { Settings.my_gp.io[i] = 0; } else { if (GPIO_USER == cmodule.gp.io[i]) { diff --git a/sonoff/xdrv_ir_send.ino b/sonoff/xdrv_irremote.ino similarity index 99% rename from sonoff/xdrv_ir_send.ino rename to sonoff/xdrv_irremote.ino index a171b440b..c1a824636 100644 --- a/sonoff/xdrv_ir_send.ino +++ b/sonoff/xdrv_irremote.ino @@ -1,5 +1,5 @@ /* - xdrv_ir_send.ino - infra red support for Sonoff-Tasmota + xdrv_irremote.ino - infra red support for Sonoff-Tasmota Copyright (C) 2017 Heiko Krupp, Lazar Obradovic and Theo Arends diff --git a/sonoff/xdrv_snfled.ino b/sonoff/xdrv_light.ino similarity index 80% rename from sonoff/xdrv_snfled.ino rename to sonoff/xdrv_light.ino index a57074dfd..231e5a415 100644 --- a/sonoff/xdrv_snfled.ino +++ b/sonoff/xdrv_light.ino @@ -1,5 +1,5 @@ /* - xdrv_snfled.ino - PWM, WS2812 and sonoff led support for Sonoff-Tasmota + xdrv_light.ino - PWM, WS2812 and sonoff led support for Sonoff-Tasmota Copyright (C) 2017 Theo Arends @@ -24,9 +24,9 @@ * ---------- --------- ----- --------- ---------------------------- * 1 PWM1 W no (Sonoff BN-SZ) * 2 PWM2 CW yes (Sonoff Led) - * 3 PWM3 RGB no (H801, MagicHome and Arilux) + * 3 PWM3 RGB no (H801, MagicHome and Arilux LC01) * 4 PWM4 RGBW no (H801, MagicHome and Arilux) - * 5 PWM5 RGBCW yes (H801, Arilux) + * 5 PWM5 RGBCW yes (H801, Arilux LC11) * 9 reserved no * 10 reserved yes * 11 +WS2812 RGB(W) no (One WS2812 RGB or RGBW ledstrip) @@ -58,6 +58,19 @@ const char kLightCommands[] PROGMEM = D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_LED "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|" D_CMND_PIXELS "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|" D_CMND_WIDTH "|UNDOCA" ; +struct LRgbColor { + uint8_t R, G, B; +}; +#define MAX_FIXED_COLOR 12 +const LRgbColor kFixedColor[MAX_FIXED_COLOR] PROGMEM = + { 255,0,0, 0,255,0, 0,0,255, 228,32,0, 0,228,32, 0,32,228, 188,64,0, 0,160,96, 160,32,240, 255,255,0, 255,0,170, 255,255,255 }; + +struct LCwColor { + uint8_t C, W; +}; +#define MAX_FIXED_COLD_WARM 4 +const LCwColor kFixedColdWarm[MAX_FIXED_COLD_WARM] PROGMEM = { 0,0, 255,0, 0,255, 128,128 }; + uint8_t ledTable[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -91,6 +104,154 @@ uint16_t light_wakeup_counter = 0; unsigned long strip_timer_counter = 0; // Bars and Gradient +#ifdef USE_ARILUX_RF +/*********************************************************************************************\ + * Arilux LC11 Rf support stripped from RCSwitch library +\*********************************************************************************************/ + +#define ARILUX_RF_TIME_AVOID_DUPLICATE 1000 // Milliseconds + +#define ARILUX_RF_MAX_CHANGES 51 // Pulses (sync + 2 x 24 bits) +#define ARILUX_RF_SEPARATION_LIMIT 4300 // Microseconds +#define ARILUX_RF_RECEIVE_TOLERANCE 60 // Percentage + +unsigned int arilux_rf_timings[ARILUX_RF_MAX_CHANGES]; +unsigned long arilux_rf_received_value = 0; + +unsigned long arilux_rf_lasttime = 0; +unsigned int arilux_rf_change_count = 0; +unsigned int arilux_rf_repeat_count = 0; + +unsigned long arilux_rf_last_received_value = 0; +unsigned long arilux_rf_last_time = 0; + +uint8_t arilux_rf_toggle = 0; + +#ifndef USE_WS2812_DMA // Collides with Neopixelbus but solves RF misses +void AriluxRfInterrupt() ICACHE_RAM_ATTR; +#endif // USE_WS2812_DMA + +void AriluxRfInterrupt() +{ + unsigned long time = micros(); + unsigned int duration = time - arilux_rf_lasttime; + + if (duration > ARILUX_RF_SEPARATION_LIMIT) { + if (abs(duration - arilux_rf_timings[0]) < 200) { + arilux_rf_repeat_count++; + if (arilux_rf_repeat_count == 2) { + unsigned long code = 0; + const unsigned int delay = arilux_rf_timings[0] / 31; + const unsigned int delayTolerance = delay * ARILUX_RF_RECEIVE_TOLERANCE / 100; + + for (unsigned int i = 1; i < arilux_rf_change_count -1; i += 2) { + code <<= 1; + if (abs(arilux_rf_timings[i] - delay) < delayTolerance && abs(arilux_rf_timings[i + 1] - (delay * 3)) < delayTolerance) { + // zero + } else if (abs(arilux_rf_timings[i] - (delay * 3)) < delayTolerance && abs(arilux_rf_timings[i + 1] - delay) < delayTolerance) { + // one + code |= 1; + } else { + // Failed + } + } + if (arilux_rf_change_count > 7) { // ignore very short transmissions: no device sends them, so this must be noise +// if (arilux_rf_change_count > 48) { // ignore very short transmissions: no device sends them, so this must be noise + arilux_rf_received_value = code; + } + arilux_rf_repeat_count = 0; + } + } + arilux_rf_change_count = 0; + } + + // detect overflow + if (arilux_rf_change_count >= ARILUX_RF_MAX_CHANGES) { + arilux_rf_change_count = 0; + arilux_rf_repeat_count = 0; + } + + arilux_rf_timings[arilux_rf_change_count++] = duration; + arilux_rf_lasttime = time; +} + +void AriluxRfHandler() +{ + char command[16]; + char value = '-'; + + unsigned long now = millis(); + if (arilux_rf_received_value && !((arilux_rf_received_value == arilux_rf_last_received_value) && (now - arilux_rf_last_time < ARILUX_RF_TIME_AVOID_DUPLICATE))) { + arilux_rf_last_received_value = arilux_rf_received_value; + arilux_rf_last_time = now; + + uint16_t hostcode = arilux_rf_received_value >> 8 & 0xFFFF; + if (Settings.rf_code[1][6] == Settings.rf_code[1][7]) { + Settings.rf_code[1][6] = hostcode >> 8 & 0xFF; + Settings.rf_code[1][7] = hostcode & 0xFF; + } + uint16_t stored_hostcode = Settings.rf_code[1][6] << 8 | Settings.rf_code[1][7]; + if (hostcode == stored_hostcode) { + + snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_RFR D_RECEIVED " 0x%06X"), arilux_rf_received_value); + AddLog(LOG_LEVEL_DEBUG); + + command[0] = '\0'; + uint8_t keycode = arilux_rf_received_value & 0xFF; + switch (keycode) { + case 1: // Power On + case 3: // Power Off + snprintf_P(command, sizeof(command), PSTR(D_CMND_POWER " %d"), (1 == keycode) ? 1 : 0); + break; + case 2: // Toggle + arilux_rf_toggle++; + arilux_rf_toggle &= 0x3; + snprintf_P(command, sizeof(command), PSTR(D_CMND_COLOR " %d"), 200 + arilux_rf_toggle); + break; + case 4: // Speed + + value = '+'; + case 7: // Speed - + snprintf_P(command, sizeof(command), PSTR(D_CMND_SPEED " %c"), value); + break; + case 5: // Scheme + + value = '+'; + case 8: // Scheme - + snprintf_P(command, sizeof(command), PSTR(D_CMND_SCHEME " %c"), value); + break; + case 6: // Dimmer + + value = '+'; + case 9: // Dimmer - + snprintf_P(command, sizeof(command), PSTR(D_CMND_DIMMER " %c"), value); + break; + default: { + if ((keycode >= 10) && (keycode <= 21)) { + snprintf_P(command, sizeof(command), PSTR(D_CMND_COLOR " %d"), keycode -9); + } + } + } + if (strlen(command)) { + ExecuteCommand(command); + } + } + } + arilux_rf_received_value = 0; +} + +void AriluxRfInit() +{ + if ((pin[GPIO_ALIRFRCV] < 99) && (pin[GPIO_LED2] < 99)) { + if (Settings.last_module != Settings.module) { + Settings.rf_code[1][6] = 0; + Settings.rf_code[1][7] = 0; + Settings.last_module = Settings.module; + } + arilux_rf_received_value = 0; + digitalWrite(pin[GPIO_LED2], !bitRead(led_inverted, 1)); // Turn on RF + attachInterrupt(pin[GPIO_ALIRFRCV], AriluxRfInterrupt, CHANGE); + } +} +#endif // USE_ARILUX_RF + /*********************************************************************************************\ * Sonoff B1 and AiLight inspired by OpenLight https://github.com/icamgo/noduino-sdk \*********************************************************************************************/ @@ -197,6 +358,15 @@ void LightInit(void) digitalWrite(14, LOW); } } + if (pin[GPIO_ALIRFRCV] < 99) { +#ifdef USE_ARILUX_RF + AriluxRfInit(); +#else + if (pin[GPIO_LED2] < 99) { + digitalWrite(pin[GPIO_LED2], bitRead(led_inverted, 1)); // Turn off RF + } +#endif // USE_ARILUX_RF + } } #ifdef USE_WS2812 // ************************************************************************ else if (LT_WS2812 == light_type) { @@ -733,6 +903,8 @@ boolean LightColorEntry(char *buffer, uint8_t buffer_length) buffer++; buffer_length--; } + uint8_t value = atoi(buffer); + memset(&light_entry_color, 0x00, sizeof(light_entry_color)); if (strstr(buffer, ",")) { // Decimal entry int8_t i = 0; for (str = strtok_r(buffer, ",", &p); str && i < 6; str = strtok_r(NULL, ",", &p)) { @@ -749,6 +921,14 @@ boolean LightColorEntry(char *buffer, uint8_t buffer_length) } entry_type = 1; // Hexadecimal } + else if ((value > 0) && (value <= MAX_FIXED_COLOR)) { + memcpy_P(&light_entry_color, &kFixedColor[value -1], 3); + entry_type = 1; // Hexadecimal + } + else if ((value > 199) && (value <= 199 + MAX_FIXED_COLD_WARM)) { + memcpy_P(&light_entry_color[3], &kFixedColdWarm[value -200], 2); + entry_type = 1; // Hexadecimal + } if (entry_type) { Settings.flag.decimal_text = entry_type -1; } @@ -764,6 +944,7 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le boolean coldim = false; boolean valid_entry = false; char scolor[25]; + char option = (1 == data_len) ? dataBuf[0] : '\0'; int command_code = GetCommandCode(command, sizeof(command), type, kLightCommands); if ((CMND_COLOR == command_code) && (light_subtype > LST_SINGLE) && (index > 0) && (index <= 4)) { @@ -771,9 +952,6 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le valid_entry = LightColorEntry(dataBuf, data_len); if (valid_entry) { if (1 == index) { // Color(1) -// for (byte i = 0; i < light_subtype; i++) { -// light_current_color[i] = light_entry_color[i]; -// } memcpy(light_current_color, light_entry_color, sizeof(light_current_color)); LightSetColor(); Settings.light_scheme = 0; @@ -833,6 +1011,12 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le #endif // USE_WS2812 ************************************************************************ else if ((CMND_SCHEME == command_code) && (light_subtype >= LST_RGB)) { uint8_t max_scheme = (LT_WS2812 == light_type) ? LS_MAX +7 : LS_MAX -1; + if (('+' == option) && (Settings.light_scheme < max_scheme)) { + payload = Settings.light_scheme + ((0 == Settings.light_scheme) ? 2 : 1); // Skip wakeup + } + else if (('-' == option) && (Settings.light_scheme > 0)) { + payload = Settings.light_scheme - ((2 == Settings.light_scheme) ? 2 : 1); // Skip wakeup + } if ((payload >= 0) && (payload <= max_scheme)) { Settings.light_scheme = payload; if (LS_WAKEUP == Settings.light_scheme) { @@ -861,6 +1045,12 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le } } else if (CMND_DIMMER == command_code) { + if ('+' == option) { + payload = (Settings.light_dimmer > 89) ? 100 : Settings.light_dimmer + 10; + } + else if ('-' == option) { + payload = (Settings.light_dimmer < 11) ? 1 : Settings.light_dimmer - 10; + } if ((payload >= 0) && (payload <= 100)) { Settings.light_dimmer = payload; light_update = 1; @@ -897,6 +1087,12 @@ boolean LightCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_le snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText(Settings.light_fade)); } else if (CMND_SPEED == command_code) { // 1 - fast, 20 - very slow + if (('+' == option) && (Settings.light_speed > 1)) { + payload = Settings.light_speed -1; + } + else if (('-' == option) && (Settings.light_speed < STATES)) { + payload = Settings.light_speed +1; + } if ((payload > 0) && (payload <= STATES)) { Settings.light_speed = payload; }