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
This commit is contained in:
arendst 2017-11-15 23:07:45 +01:00
parent 39d30328e4
commit db4a3a4a1e
13 changed files with 344 additions and 105 deletions

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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

View File

@ -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();
}

View File

@ -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
}
};

View File

@ -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.

View File

@ -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]) {

View File

@ -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

View File

@ -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;
}