diff --git a/BUILDS.md b/BUILDS.md index 18f25042b83e..d1ac73db9490 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -53,6 +53,7 @@ | USE_SM16716 | - | - | x | x | x | - | x | | USE_SM2135 | - | - | x | x | x | - | x | | USE_SONOFF_L1 | - | - | x | x | x | - | x | +| USE_ELECTRIQ_MOODL | - | - | - | - | - | - | - | | | | | | | | | | | USE_ENERGY_SENSOR | - | x | x | x | x | - | - | | USE_PZEM004T | - | - | x | x | x | - | - | diff --git a/tasmota/language/bg-BG.h b/tasmota/language/bg-BG.h index 37e1468ab96e..f7760f302f06 100644 --- a/tasmota/language/bg-BG.h +++ b/tasmota/language/bg-BG.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/cs-CZ.h b/tasmota/language/cs-CZ.h index 6ea1707a75ac..72bb6c275c0b 100644 --- a/tasmota/language/cs-CZ.h +++ b/tasmota/language/cs-CZ.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/de-DE.h b/tasmota/language/de-DE.h index 6bcd615f0046..12cb30769458 100644 --- a/tasmota/language/de-DE.h +++ b/tasmota/language/de-DE.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/el-GR.h b/tasmota/language/el-GR.h index 5b13e6342388..8a8160956c7c 100644 --- a/tasmota/language/el-GR.h +++ b/tasmota/language/el-GR.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/en-GB.h b/tasmota/language/en-GB.h index c394c706d135..09b43c1bec67 100644 --- a/tasmota/language/en-GB.h +++ b/tasmota/language/en-GB.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/es-ES.h b/tasmota/language/es-ES.h index 1f7e339149ca..f70940a3864e 100644 --- a/tasmota/language/es-ES.h +++ b/tasmota/language/es-ES.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fr-FR.h b/tasmota/language/fr-FR.h index 9aa4efba8b57..488386aeabeb 100644 --- a/tasmota/language/fr-FR.h +++ b/tasmota/language/fr-FR.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/he-HE.h b/tasmota/language/he-HE.h index 64d1b38b23c5..70d474e8f69f 100644 --- a/tasmota/language/he-HE.h +++ b/tasmota/language/he-HE.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/hu-HU.h b/tasmota/language/hu-HU.h index d4797a90a7fa..cc47f6a5d5bf 100644 --- a/tasmota/language/hu-HU.h +++ b/tasmota/language/hu-HU.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it-IT.h b/tasmota/language/it-IT.h index 7f41ad7fa9a2..d9a4b9a6bd87 100644 --- a/tasmota/language/it-IT.h +++ b/tasmota/language/it-IT.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ko-KO.h b/tasmota/language/ko-KO.h index fe1ca5b3ba13..1767366db8b8 100644 --- a/tasmota/language/ko-KO.h +++ b/tasmota/language/ko-KO.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/nl-NL.h b/tasmota/language/nl-NL.h index 474cc7150487..2460660352b0 100644 --- a/tasmota/language/nl-NL.h +++ b/tasmota/language/nl-NL.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pl-PL.h b/tasmota/language/pl-PL.h index 5652de045d1b..6f945183a74e 100644 --- a/tasmota/language/pl-PL.h +++ b/tasmota/language/pl-PL.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt-BR.h b/tasmota/language/pt-BR.h index 858be76f0d1e..236652de2cc4 100644 --- a/tasmota/language/pt-BR.h +++ b/tasmota/language/pt-BR.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt-PT.h b/tasmota/language/pt-PT.h index 6bbfc0fa6553..507e7fe8b901 100644 --- a/tasmota/language/pt-PT.h +++ b/tasmota/language/pt-PT.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ro-RO.h b/tasmota/language/ro-RO.h index 53c08426a1f4..c3efc57584d4 100644 --- a/tasmota/language/ro-RO.h +++ b/tasmota/language/ro-RO.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ru-RU.h b/tasmota/language/ru-RU.h index 990c3d9d1981..a104dca5593f 100644 --- a/tasmota/language/ru-RU.h +++ b/tasmota/language/ru-RU.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/sk-SK.h b/tasmota/language/sk-SK.h index d9eae653d0bc..706432e5b9a1 100644 --- a/tasmota/language/sk-SK.h +++ b/tasmota/language/sk-SK.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/sv-SE.h b/tasmota/language/sv-SE.h index 302dac80cdc6..df64cf2e3a73 100644 --- a/tasmota/language/sv-SE.h +++ b/tasmota/language/sv-SE.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/tr-TR.h b/tasmota/language/tr-TR.h index bb48f6d0ec8d..1366b9996b2b 100644 --- a/tasmota/language/tr-TR.h +++ b/tasmota/language/tr-TR.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/uk-UA.h b/tasmota/language/uk-UA.h index 895269639df5..2e3c4c0777e9 100644 --- a/tasmota/language/uk-UA.h +++ b/tasmota/language/uk-UA.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/zh-CN.h b/tasmota/language/zh-CN.h index e1517e21edef..c59cb7a57851 100644 --- a/tasmota/language/zh-CN.h +++ b/tasmota/language/zh-CN.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "安" diff --git a/tasmota/language/zh-TW.h b/tasmota/language/zh-TW.h index f3c31c0b6dd5..6ef104bec871 100644 --- a/tasmota/language/zh-TW.h +++ b/tasmota/language/zh-TW.h @@ -663,6 +663,7 @@ #define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" #define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" #define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" // Units #define D_UNIT_AMPERE "安" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index dbc60bac3edd..568ece0364c9 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -431,6 +431,7 @@ #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) #define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) #define USE_SONOFF_L1 // Add support for Sonoff L1 led control +#define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller // -- Counter input ------------------------------- #define USE_COUNTER // Enable inputs as counter (+0k8 code) diff --git a/tasmota/tasmota_post.h b/tasmota/tasmota_post.h index 1abd371ff691..dfdf6f3f816b 100644 --- a/tasmota/tasmota_post.h +++ b/tasmota/tasmota_post.h @@ -134,6 +134,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) #define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) #define USE_SONOFF_L1 // Add support for Sonoff L1 led control +//#define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller #define USE_COUNTER // Enable counters #undef USE_ADC_VCC // Add Analog input on selected devices @@ -399,6 +400,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control +#undef USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_ENERGY_SENSOR // Disable energy sensors (-14k code) #undef USE_PZEM004T // Disable PZEM004T energy sensor @@ -512,6 +514,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control +#undef USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_COUNTER // Disable counters #define USE_ADC_VCC // Display Vcc in Power status. Disable for use as Analog input on selected devices @@ -632,6 +635,7 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control +#undef USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_COUNTER // Disable counters #define USE_ADC_VCC // Display Vcc in Power status. Disable for use as Analog input on selected devices diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index a45c456f8424..4715f682f177 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -225,6 +225,7 @@ enum UserSelectablePins { GPIO_CC1101_GDO0, // CC1101 pin for RX GPIO_CC1101_GDO2, // CC1101 pin for RX GPIO_HRXL_RX, // Data from MaxBotix HRXL sonar range sensor + GPIO_ELECTRIQ_MOODL_TX, // ElectriQ iQ-wifiMOODL Serial TX GPIO_SENSOR_END }; // Programmer selectable GPIO functionality @@ -310,7 +311,8 @@ const char kSensorNames[] PROGMEM = D_SENSOR_HM10_RX "|" D_SENSOR_HM10_TX "|" D_SENSOR_LE01MR_RX "|" D_SENSOR_LE01MR_TX "|" D_SENSOR_CC1101_GDO0 "|" D_SENSOR_CC1101_GDO2 "|" - D_SENSOR_HRXL_RX + D_SENSOR_HRXL_RX "|" + D_SENSOR_ELECTRIQ_MOODL ; const char kSensorNamesFixed[] PROGMEM = @@ -611,6 +613,9 @@ const uint8_t kGpioNiceList[] PROGMEM = { #ifdef USE_EXS_DIMMER GPIO_EXS_ENABLE, // EXS MCU Enable #endif +#ifdef USE_ELECTRIQ_MOODL + GPIO_ELECTRIQ_MOODL_TX, +#endif #endif // USE_LIGHT #if defined(USE_IR_REMOTE) || defined(USE_IR_REMOTE_FULL) diff --git a/tasmota/xlgt_06_electriq_moodl.ino b/tasmota/xlgt_06_electriq_moodl.ino new file mode 100644 index 000000000000..0ece53dd69a4 --- /dev/null +++ b/tasmota/xlgt_06_electriq_moodl.ino @@ -0,0 +1,102 @@ +/* + xlgt_06_moodlamp.ino - ElectriQ iQ-wifiMOODL LED support for Tasmota + + Copyright (C) 2020 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_LIGHT +#ifdef USE_ELECTRIQ_MOODL + +/*********************************************************************************************\ + * ElectriQ iQ-wifiMOODL + * This RGBW mood lamp uses the TYWE3S module to transmit via UART to an unmarked MCU which + * drives 8 MOSFETs. The MCU does not transmit; it only receives commands from the TYWE3S. + * The MCU appears to use a modified/undocumented version of the TuyaMCU protocol. + * The main PCB has 2 daughter boards which hold the RGBW LEDs - an upper deck and a lower deck. + * The same RGBW data is transmitted to the upper and lower decks. + * *********************************************************************************************/ + +#define XLGT_06 6 + +/********************************************************************************************/ + +bool ElectriqMoodLSetChannels(void) +{ + uint8_t *col = (uint8_t*)XdrvMailbox.data; + uint8_t checksum = (uint8_t)(0x65 + 0xAA + 0x01 + 0x0A); + + Serial.write(0x65); // Fixed header + Serial.write(0xAA); + Serial.write(0x00); // Version + Serial.write(0x01); // Command + Serial.write(0x0A); // Payload length + + uint8_t payload[5]; + payload[0] = col[0]; + payload[1] = col[1]; + payload[2] = col[2]; + payload[3] = col[3]; + payload[4] = 0x0; // Unused + + // Send payload for the upper LED deck + for (uint32_t i = 0; i < 5; i++) { + Serial.write(payload[i]); + checksum += payload[i]; + } + + // Send payload for the lower LED deck + for (uint32_t i = 0; i < 5; i++) { + Serial.write(payload[i]); + checksum += payload[i]; + } + + Serial.write(checksum); + Serial.flush(); + + return true; +} + +void ElectriqMoodLModuleSelected(void) +{ + if (pin[GPIO_ELECTRIQ_MOODL_TX] < 99) { + SetSerial(9600, TS_SERIAL_8N1); + light_type = LT_RGBW; + light_flg = XLGT_06; + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("DBG: ElectriQ Mood Lamp Found")); + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xlgt06(uint8_t function) +{ + bool result = false; + + switch (function) { + case FUNC_SET_CHANNELS: + result = ElectriqMoodLSetChannels(); + break; + case FUNC_MODULE_INIT: + ElectriqMoodLModuleSelected(); + break; + } + return result; +} + +#endif // USE_ELECTRIQ_MOODL +#endif // USE_LIGHT \ No newline at end of file