From b4ceb9e5e92aa6b91135a8551f2c62e454a700cd Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Tue, 26 Jan 2021 14:56:58 +0100
Subject: [PATCH] Add light synonyms
Add commands ``ChannelRemap``, ``MultiPWM``, ``AlexaCTRange``, ``PowerOnFade``, ``PWMCT``, ``WhiteBlend``, ``VirtualCT`` as synonyms for ``SetOption37, 68, 82, 91, 92, 105 and 106`` respectively
---
CHANGELOG.md | 1 +
RELEASENOTES.md | 1 +
tasmota/i18n.h | 9 +++++++++
tasmota/support.ino | 16 ++++++++++++----
tasmota/xdrv_04_light.ino | 12 +++++++++++-
5 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e627937f0..54144e094 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
## [9.2.0.4]
### Added
- Function ``AddLog`` to provide logging for up to 128 (LOGSZ) characters to save stack space
+- Commands ``ChannelRemap``, ``MultiPWM``, ``AlexaCTRange``, ``PowerOnFade``, ``PWMCT``, ``WhiteBlend``, ``VirtualCT`` as synonyms for ``SetOption37, 68, 82, 91, 92, 105 and 106`` respectively
### Changed
- Maximum chars in ``AddLog_P`` logging restored from 128 to 700 (MAX_LOGSZ) to solve broken error messages
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index baf6f75b9..121264b82 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -65,6 +65,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
- Command ``SetOption43 1..255`` to control Rotary step (#10407)
- Command ``SetOption118 1`` to move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default [#10353](https://github.com/arendst/Tasmota/issues/10353)
- Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic [#10355](https://github.com/arendst/Tasmota/issues/10355)
+- Commands ``ChannelRemap``, ``MultiPWM``, ``AlexaCTRange``, ``PowerOnFade``, ``PWMCT``, ``WhiteBlend``, ``VirtualCT`` as synonyms for ``SetOption37, 68, 82, 91, 92, 105 and 106`` respectively
- Milliseconds to console output [#10152](https://github.com/arendst/Tasmota/issues/10152)
- Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196)
- Rotary No Pullup GPIO selection ``Rotary A/B_n`` [#10407](https://github.com/arendst/Tasmota/issues/10407)
diff --git a/tasmota/i18n.h b/tasmota/i18n.h
index 0c7438907..ff2a2fcbc 100644
--- a/tasmota/i18n.h
+++ b/tasmota/i18n.h
@@ -420,6 +420,13 @@
#define D_JSON_MAXENERGYREACHED "MaxEnergyReached"
// Commands xdrv_04_light.ino
+#define D_SO_CHANNELREMAP "ChannelRemap" // SO37
+#define D_SO_MULTIPWM "MultiPWM" // SO68
+#define D_SO_ALEXACTRANGE "AlexaCTRange" // SO82
+#define D_SO_POWERONFADE "PowerOnFade" // SO91
+#define D_SO_PWMCT "PWMCT" // SO92
+#define D_SO_WHITEBLEND "WhiteBlend" // SO105
+#define D_SO_VIRTUALCT "VirtualCT" // SO106
#define D_CMND_CHANNEL "Channel"
#define D_CMND_COLOR "Color"
#define D_CMND_COLORTEMPERATURE "CT"
@@ -771,6 +778,8 @@ const float kSpeedConversionFactor[] = {1, // none
// xdrv_02_webserver.ino
#ifdef USE_WEBSERVER
// {s} =
, {m} = | , {e} = |
+const char HTTP_SNS_F_TEMP[] PROGMEM = "{s}%s " D_TEMPERATURE "{m}%*_f " D_UNIT_DEGREE "%c{e}";
+
const char HTTP_SNS_TEMP[] PROGMEM = "{s}%s " D_TEMPERATURE "{m}%s " D_UNIT_DEGREE "%c{e}";
const char HTTP_SNS_HUM[] PROGMEM = "{s}%s " D_HUMIDITY "{m}%s " D_UNIT_PERCENT "{e}";
const char HTTP_SNS_DEW[] PROGMEM = "{s}%s " D_DEWPOINT "{m}%s " D_UNIT_DEGREE "%c{e}";
diff --git a/tasmota/support.ino b/tasmota/support.ino
index 67113d2e8..38e0266b2 100644
--- a/tasmota/support.ino
+++ b/tasmota/support.ino
@@ -916,8 +916,8 @@ int GetCommandCode(char* destination, size_t destination_size, const char* needl
return result;
}
-bool DecodeCommand(const char* haystack, void (* const MyCommand[])(void))
-{
+bool DecodeCommand(const char* haystack, void (* const MyCommand[])(void), const uint8_t *synonyms = nullptr);
+bool DecodeCommand(const char* haystack, void (* const MyCommand[])(void), const uint8_t *synonyms) {
GetTextIndexed(XdrvMailbox.command, CMDSZ, 0, haystack); // Get prefix if available
int prefix_length = strlen(XdrvMailbox.command);
if (prefix_length) {
@@ -927,10 +927,18 @@ bool DecodeCommand(const char* haystack, void (* const MyCommand[])(void))
return false; // Prefix not in command
}
}
+ size_t syn_count = synonyms ? pgm_read_byte(synonyms) : 0;
int command_code = GetCommandCode(XdrvMailbox.command + prefix_length, CMDSZ, XdrvMailbox.topic + prefix_length, haystack);
if (command_code > 0) { // Skip prefix
- XdrvMailbox.command_code = command_code -1;
- MyCommand[XdrvMailbox.command_code]();
+ if (command_code > syn_count) {
+ // We passed the synonyms zone, it's a regular command
+ XdrvMailbox.command_code = command_code - 1 - syn_count;
+ MyCommand[XdrvMailbox.command_code]();
+ } else {
+ // We have a SetOption synonym
+ XdrvMailbox.index = pgm_read_byte(synonyms + command_code);
+ CmndSetoptionBase(0);
+ }
return true;
}
return false;
diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino
index 5effa7f8d..b3d014b21 100644
--- a/tasmota/xdrv_04_light.ino
+++ b/tasmota/xdrv_04_light.ino
@@ -129,6 +129,10 @@ enum LightSchemes { LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_M
const uint8_t LIGHT_COLOR_SIZE = 25; // Char array scolor size
const char kLightCommands[] PROGMEM = "|" // No prefix
+ // SetOptions synonyms
+ D_SO_CHANNELREMAP "|" D_SO_MULTIPWM "|" D_SO_ALEXACTRANGE "|" D_SO_POWERONFADE "|" D_SO_PWMCT "|"
+ D_SO_WHITEBLEND "|" D_SO_VIRTUALCT "|"
+ // Other commands
D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_DIMMER_RANGE "|" D_CMND_DIMMER_STEP "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|"
D_CMND_RGBWWTABLE "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|"
D_CMND_WHITE "|" D_CMND_CHANNEL "|" D_CMND_HSBCOLOR
@@ -144,6 +148,12 @@ const char kLightCommands[] PROGMEM = "|" // No prefix
#endif // USE_DGR_LIGHT_SEQUENCE
"|UNDOCA" ;
+const uint8_t kLightSynonyms[] PROGMEM = {
+ 7, // number of entries
+ 37, 68, 82, 91, 92,
+ 105, 106,
+};
+
void (* const LightCommand[])(void) PROGMEM = {
&CmndColor, &CmndColorTemperature, &CmndDimmer, &CmndDimmerRange, &CmndDimmerStep, &CmndLedTable, &CmndFade,
&CmndRgbwwTable, &CmndScheme, &CmndSpeed, &CmndWakeup, &CmndWakeupDuration,
@@ -3078,7 +3088,7 @@ bool Xdrv04(uint8_t function)
LightSetPower();
break;
case FUNC_COMMAND:
- result = DecodeCommand(kLightCommands, LightCommand);
+ result = DecodeCommand(kLightCommands, LightCommand, kLightSynonyms);
if (!result) {
result = XlgtCall(FUNC_COMMAND);
}