Add SetOption comments to code

This commit is contained in:
Theo Arends 2019-11-03 12:33:36 +01:00
parent 55cc695649
commit 5f4e38023d
37 changed files with 188 additions and 171 deletions

View File

@ -28,7 +28,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t save_state : 1; // bit 0 - SetOption0 - Save power state and use after restart uint32_t save_state : 1; // bit 0 - SetOption0 - Save power state and use after restart
uint32_t button_restrict : 1; // bit 1 - SetOption1 - Control button multipress uint32_t button_restrict : 1; // bit 1 - SetOption1 - Control button multipress
uint32_t ex_value_units : 1; // bit 2 - SetOption2 - Add units to JSON status messages - removed 6.6.0.21 uint32_t ex_value_units : 1; // bit 2 - SetOption2 - Add units to JSON status messages - removed 6.6.0.21
uint32_t mqtt_enabled : 1; // bit 3 - SetOption3 - Control MQTT uint32_t mqtt_enabled : 1; // bit 3 - SetOption3 - Enable MQTT
uint32_t mqtt_response : 1; // bit 4 - SetOption4 - Switch between MQTT RESULT or COMMAND uint32_t mqtt_response : 1; // bit 4 - SetOption4 - Switch between MQTT RESULT or COMMAND
uint32_t mqtt_power_retain : 1; // bit 5 - CMND_POWERRETAIN uint32_t mqtt_power_retain : 1; // bit 5 - CMND_POWERRETAIN
uint32_t mqtt_button_retain : 1; // bit 6 - CMND_BUTTONRETAIN uint32_t mqtt_button_retain : 1; // bit 6 - CMND_BUTTONRETAIN
@ -39,10 +39,10 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t button_swap : 1; // bit 11 (v5.1.6) - SetOption11 - Swap button single and double press functionality uint32_t button_swap : 1; // bit 11 (v5.1.6) - SetOption11 - Swap button single and double press functionality
uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0) - SetOption12 - Switch between dynamic or fixed slot flash save location uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0) - SetOption12 - Switch between dynamic or fixed slot flash save location
uint32_t button_single : 1; // bit 13 (v5.4.0) - SetOption13 - Support only single press to speed up button press recognition uint32_t button_single : 1; // bit 13 (v5.4.0) - SetOption13 - Support only single press to speed up button press recognition
uint32_t interlock : 1; // bit 14 (v5.6.0) - CMND_INTERLOCK uint32_t interlock : 1; // bit 14 (v5.6.0) - CMND_INTERLOCK - Enable/disable interlock
uint32_t pwm_control : 1; // bit 15 (v5.8.1) - SetOption15 - Switch between commands PWM or COLOR/DIMMER/CT/CHANNEL uint32_t pwm_control : 1; // bit 15 (v5.8.1) - SetOption15 - Switch between commands PWM or COLOR/DIMMER/CT/CHANNEL
uint32_t ws_clock_reverse : 1; // bit 16 (v5.8.1) - SetOption16 - Switch between clockwise or counter-clockwise uint32_t ws_clock_reverse : 1; // bit 16 (v5.8.1) - SetOption16 - Switch between clockwise or counter-clockwise
uint32_t decimal_text : 1; // bit 17 (v5.8.1) - SetOption17 - Switch between decimal or hexadecimal output uint32_t decimal_text : 1; // bit 17 (v5.8.1) - SetOption17 - Switch between decimal or hexadecimal output (0 = hexadecimal, 1 = decimal)
uint32_t light_signal : 1; // bit 18 (v5.10.0c) - SetOption18 - Pair light signal with CO2 sensor uint32_t light_signal : 1; // bit 18 (v5.10.0c) - SetOption18 - Pair light signal with CO2 sensor
uint32_t hass_discovery : 1; // bit 19 (v5.11.1a) - SetOption19 - Control Home Assistantautomatic discovery (See SetOption59) uint32_t hass_discovery : 1; // bit 19 (v5.11.1a) - SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
uint32_t not_power_linked : 1; // bit 20 (v5.11.1f) - SetOption20 - Control power in relation to Dimmer/Color/Ct changes uint32_t not_power_linked : 1; // bit 20 (v5.11.1f) - SetOption20 - Control power in relation to Dimmer/Color/Ct changes
@ -53,8 +53,8 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t knx_enabled : 1; // bit 25 (v5.12.0l) - CMND_KNX_ENABLED uint32_t knx_enabled : 1; // bit 25 (v5.12.0l) - CMND_KNX_ENABLED
uint32_t device_index_enable : 1; // bit 26 (v5.13.1a) - SetOption26 - Switch between POWER or POWER1 uint32_t device_index_enable : 1; // bit 26 (v5.13.1a) - SetOption26 - Switch between POWER or POWER1
uint32_t knx_enable_enhancement : 1; // bit 27 (v5.14.0a) - CMND_KNX_ENHANCED uint32_t knx_enable_enhancement : 1; // bit 27 (v5.14.0a) - CMND_KNX_ENHANCED
uint32_t rf_receive_decimal : 1; // bit 28 (v6.0.0a) - SetOption28 - RF receive data format uint32_t rf_receive_decimal : 1; // bit 28 (v6.0.0a) - SetOption28 - RF receive data format (0 = hexadecimal, 1 = decimal)
uint32_t ir_receive_decimal : 1; // bit 29 (v6.0.0a) - SetOption29 - IR receive data format uint32_t ir_receive_decimal : 1; // bit 29 (v6.0.0a) - SetOption29 - IR receive data format (0 = hexadecimal, 1 = decimal)
uint32_t hass_light : 1; // bit 30 (v6.0.0b) - SetOption30 - Enforce HAss autodiscovery as light uint32_t hass_light : 1; // bit 30 (v6.0.0b) - SetOption30 - Enforce HAss autodiscovery as light
uint32_t global_state : 1; // bit 31 (v6.1.0) - SetOption31 - Control link led blinking uint32_t global_state : 1; // bit 31 (v6.1.0) - SetOption31 - Control link led blinking
}; };

View File

@ -619,8 +619,8 @@ float ConvertTemp(float c)
global_update = uptime; global_update = uptime;
global_temperature = c; global_temperature = c;
if (!isnan(c) && Settings.flag.temperature_conversion) { if (!isnan(c) && Settings.flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit
result = c * 1.8 + 32; // Fahrenheit result = c * 1.8 + 32; // Fahrenheit
} }
return result; return result;
} }
@ -629,15 +629,15 @@ float ConvertTempToCelsius(float c)
{ {
float result = c; float result = c;
if (!isnan(c) && Settings.flag.temperature_conversion) { if (!isnan(c) && Settings.flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit
result = (c - 32) / 1.8; // Celsius result = (c - 32) / 1.8; // Celsius
} }
return result; return result;
} }
char TempUnit(void) char TempUnit(void)
{ {
return (Settings.flag.temperature_conversion) ? 'F' : 'C'; return (Settings.flag.temperature_conversion) ? 'F' : 'C'; // SetOption8 - Switch between Celsius or Fahrenheit
} }
float ConvertHumidity(float h) float ConvertHumidity(float h)
@ -655,8 +655,8 @@ float ConvertPressure(float p)
global_update = uptime; global_update = uptime;
global_pressure = p; global_pressure = p;
if (!isnan(p) && Settings.flag.pressure_conversion) { if (!isnan(p) && Settings.flag.pressure_conversion) { // SetOption24 - Switch between hPa or mmHg pressure unit
result = p * 0.75006375541921; // mmHg result = p * 0.75006375541921; // mmHg
} }
return result; return result;
} }

View File

@ -300,7 +300,7 @@ void CmndPower(void)
if ((XdrvMailbox.payload < POWER_OFF) || (XdrvMailbox.payload > POWER_BLINK_STOP)) { if ((XdrvMailbox.payload < POWER_OFF) || (XdrvMailbox.payload > POWER_BLINK_STOP)) {
XdrvMailbox.payload = POWER_SHOW_STATE; XdrvMailbox.payload = POWER_SHOW_STATE;
} }
// Settings.flag.device_index_enable = XdrvMailbox.usridx; // Settings.flag.device_index_enable = XdrvMailbox.usridx; // SetOption26 - Switch between POWER or POWER1
ExecuteCommandPower(XdrvMailbox.index, XdrvMailbox.payload, SRC_IGNORE); ExecuteCommandPower(XdrvMailbox.index, XdrvMailbox.payload, SRC_IGNORE);
mqtt_data[0] = '\0'; mqtt_data[0] = '\0';
} }
@ -324,7 +324,7 @@ void CmndStatus(void)
// Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX // Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX
if (!strcmp(Settings.mqtt_prefix[0],Settings.mqtt_prefix[1]) && (!payload)) { option++; } // TELE if (!strcmp(Settings.mqtt_prefix[0],Settings.mqtt_prefix[1]) && (!payload)) { option++; } // TELE
if ((!Settings.flag.mqtt_enabled) && (6 == payload)) { payload = 99; } if ((!Settings.flag.mqtt_enabled) && (6 == payload)) { payload = 99; } // SetOption3 - Enable MQTT
if (!energy_flg && (9 == payload)) { payload = 99; } if (!energy_flg && (9 == payload)) { payload = 99; }
if ((0 == payload) || (99 == payload)) { if ((0 == payload) || (99 == payload)) {
@ -346,8 +346,14 @@ void CmndStatus(void)
D_CMND_SWITCHMODE "\":[%s],\"" D_CMND_BUTTONRETAIN "\":%d,\"" D_CMND_SWITCHRETAIN "\":%d,\"" D_CMND_SENSORRETAIN "\":%d,\"" D_CMND_POWERRETAIN "\":%d}}"), D_CMND_SWITCHMODE "\":[%s],\"" D_CMND_BUTTONRETAIN "\":%d,\"" D_CMND_SWITCHRETAIN "\":%d,\"" D_CMND_SENSORRETAIN "\":%d,\"" D_CMND_POWERRETAIN "\":%d}}"),
ModuleNr(), stemp, mqtt_topic, ModuleNr(), stemp, mqtt_topic,
Settings.button_topic, power, Settings.poweronstate, Settings.ledstate, Settings.button_topic, power, Settings.poweronstate, Settings.ledstate,
Settings.ledmask, Settings.save_data, Settings.flag.save_state, Settings.switch_topic, Settings.ledmask, Settings.save_data,
stemp2, Settings.flag.mqtt_button_retain, Settings.flag.mqtt_switch_retain, Settings.flag.mqtt_sensor_retain, Settings.flag.mqtt_power_retain); Settings.flag.save_state, // SetOption0 - Save power state and use after restart
Settings.switch_topic,
stemp2,
Settings.flag.mqtt_button_retain, // CMND_BUTTONRETAIN
Settings.flag.mqtt_switch_retain, // CMND_SWITCHRETAIN
Settings.flag.mqtt_sensor_retain, // CMND_SENSORRETAIN
Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS)); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS));
} }
@ -404,7 +410,7 @@ void CmndStatus(void)
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "5")); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "5"));
} }
if (((0 == payload) || (6 == payload)) && Settings.flag.mqtt_enabled) { if (((0 == payload) || (6 == payload)) && Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
#ifdef USE_MQTT_AWS_IOT #ifdef USE_MQTT_AWS_IOT
Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS6_MQTT "\":{\"" D_CMND_MQTTHOST "\":\"%s%s\",\"" D_CMND_MQTTPORT "\":%d,\"" D_CMND_MQTTCLIENT D_JSON_MASK "\":\"%s\",\"" Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS6_MQTT "\":{\"" D_CMND_MQTTHOST "\":\"%s%s\",\"" D_CMND_MQTTPORT "\":%d,\"" D_CMND_MQTTCLIENT D_JSON_MASK "\":\"%s\",\""
D_CMND_MQTTCLIENT "\":\"%s\",\"" D_JSON_MQTT_COUNT "\":%d,\"MAX_PACKET_SIZE\":%d,\"KEEPALIVE\":%d}}"), D_CMND_MQTTCLIENT "\":\"%s\",\"" D_JSON_MQTT_COUNT "\":%d,\"MAX_PACKET_SIZE\":%d,\"KEEPALIVE\":%d}}"),
@ -483,7 +489,7 @@ void CmndState(void)
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_STATE), MQTT_TELE_RETAIN); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_STATE), MQTT_TELE_RETAIN);
} }
#ifdef USE_HOME_ASSISTANT #ifdef USE_HOME_ASSISTANT
if (Settings.flag.hass_discovery) { if (Settings.flag.hass_discovery) { // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
HAssPublishStatus(); HAssPublishStatus();
} }
#endif // USE_HOME_ASSISTANT #endif // USE_HOME_ASSISTANT
@ -526,7 +532,7 @@ void CmndOtaUrl(void)
void CmndSeriallog(void) void CmndSeriallog(void)
{ {
if ((XdrvMailbox.payload >= LOG_LEVEL_NONE) && (XdrvMailbox.payload <= LOG_LEVEL_DEBUG_MORE)) { if ((XdrvMailbox.payload >= LOG_LEVEL_NONE) && (XdrvMailbox.payload <= LOG_LEVEL_DEBUG_MORE)) {
Settings.flag.mqtt_serial = 0; Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
SetSeriallog(XdrvMailbox.payload); SetSeriallog(XdrvMailbox.payload);
} }
Response_P(S_JSON_COMMAND_NVALUE_ACTIVE_NVALUE, XdrvMailbox.command, Settings.seriallog_level, seriallog_level); Response_P(S_JSON_COMMAND_NVALUE_ACTIVE_NVALUE, XdrvMailbox.command, Settings.seriallog_level, seriallog_level);
@ -1061,8 +1067,8 @@ void CmndSerialSend(void)
{ {
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) {
SetSeriallog(LOG_LEVEL_NONE); SetSeriallog(LOG_LEVEL_NONE);
Settings.flag.mqtt_serial = 1; Settings.flag.mqtt_serial = 1; // CMND_SERIALSEND and CMND_SERIALLOG
Settings.flag.mqtt_serial_raw = (XdrvMailbox.index > 3) ? 1 : 0; Settings.flag.mqtt_serial_raw = (XdrvMailbox.index > 3) ? 1 : 0; // CMND_SERIALSEND3
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
if (1 == XdrvMailbox.index) { if (1 == XdrvMailbox.index) {
Serial.printf("%s\n", XdrvMailbox.data); // "Hello Tiger\n" Serial.printf("%s\n", XdrvMailbox.data); // "Hello Tiger\n"
@ -1290,7 +1296,7 @@ void CmndInterlock(void)
if (minimal_bits < 2) { Settings.interlock[i] = 0; } // Discard single relay as interlock if (minimal_bits < 2) { Settings.interlock[i] = 0; } // Discard single relay as interlock
} }
} else { } else {
Settings.flag.interlock = XdrvMailbox.payload &1; // Enable/disable interlock Settings.flag.interlock = XdrvMailbox.payload &1; // CMND_INTERLOCK - Enable/disable interlock
if (Settings.flag.interlock) { if (Settings.flag.interlock) {
SetDevicePower(power, SRC_IGNORE); // Remove multiple relays if set SetDevicePower(power, SRC_IGNORE); // Remove multiple relays if set
} }
@ -1320,7 +1326,7 @@ void CmndInterlock(void)
} }
ResponseAppend_P(PSTR("\"}")); ResponseAppend_P(PSTR("\"}"));
} else { } else {
Settings.flag.interlock = 0; Settings.flag.interlock = 0; // CMND_INTERLOCK - Enable/disable interlock
ResponseCmndStateText(Settings.flag.interlock); ResponseCmndStateText(Settings.flag.interlock);
} }
} }

View File

@ -520,7 +520,7 @@ void WifiCheck(uint8_t param)
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
#ifdef USE_KNX #ifdef USE_KNX
if (!knx_started && Settings.flag.knx_enabled) { if (!knx_started && Settings.flag.knx_enabled) { // CMND_KNX_ENABLED
KNXStart(); KNXStart();
knx_started = true; knx_started = true;
} }
@ -574,7 +574,9 @@ void WifiDisconnect(void)
void EspRestart(void) void EspRestart(void)
{ {
delay(100); // Allow time for message xfer - disabled v6.1.0b delay(100); // Allow time for message xfer - disabled v6.1.0b
if (Settings.flag.mqtt_enabled) MqttDisconnect(); if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
MqttDisconnect();
}
WifiDisconnect(); WifiDisconnect();
// ESP.restart(); // This results in exception 3 on restarts on core 2.3.0 // ESP.restart(); // This results in exception 3 on restarts on core 2.3.0
ESP.reset(); ESP.reset();

View File

@ -342,7 +342,7 @@ void SetDevicePower(power_t rpower, uint32_t source)
rpower = power; rpower = power;
} }
if (Settings.flag.interlock) { // Allow only one or no relay set if (Settings.flag.interlock) { // Allow only one or no relay set - CMND_INTERLOCK - Enable/disable interlock
for (uint32_t i = 0; i < MAX_INTERLOCKS; i++) { for (uint32_t i = 0; i < MAX_INTERLOCKS; i++) {
power_t mask = 1; power_t mask = 1;
uint32_t count = 0; uint32_t count = 0;
@ -526,12 +526,12 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
char *tmp = (key) ? Settings.switch_topic : Settings.button_topic; char *tmp = (key) ? Settings.switch_topic : Settings.button_topic;
Format(key_topic, tmp, sizeof(key_topic)); Format(key_topic, tmp, sizeof(key_topic));
if (Settings.flag.mqtt_enabled && MqttIsConnected() && (strlen(key_topic) != 0) && strcmp(key_topic, "0")) { if (Settings.flag.mqtt_enabled && MqttIsConnected() && (strlen(key_topic) != 0) && strcmp(key_topic, "0")) { // SetOption3 - Enable MQTT
if (!key && (device > devices_present)) { if (!key && (device > devices_present)) {
device = 1; // Only allow number of buttons up to number of devices device = 1; // Only allow number of buttons up to number of devices
} }
GetTopic_P(stopic, CMND, key_topic, GetTopic_P(stopic, CMND, key_topic,
GetPowerDevice(scommand, device, sizeof(scommand), (key + Settings.flag.device_index_enable))); // cmnd/switchtopic/POWERx GetPowerDevice(scommand, device, sizeof(scommand), (key + Settings.flag.device_index_enable))); // cmnd/switchtopic/POWERx - SetOption26 - Switch between POWER or POWER1
if (CLEAR_RETAIN == state) { if (CLEAR_RETAIN == state) {
mqtt_data[0] = '\0'; mqtt_data[0] = '\0';
} else { } else {
@ -542,10 +542,12 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
} }
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
if (!(DomoticzSendKey(key, device, state, strlen(mqtt_data)))) { if (!(DomoticzSendKey(key, device, state, strlen(mqtt_data)))) {
MqttPublishDirect(stopic, ((key) ? Settings.flag.mqtt_switch_retain : Settings.flag.mqtt_button_retain) && (state != POWER_HOLD || !Settings.flag3.no_hold_retain)); #endif // USE_DOMOTICZ
MqttPublishDirect(stopic, ((key) ? Settings.flag.mqtt_switch_retain // CMND_SWITCHRETAIN
: Settings.flag.mqtt_button_retain) && // CMND_BUTTONRETAIN
(state != POWER_HOLD || !Settings.flag3.no_hold_retain)); // SetOption62 - Don't use retain flag on HOLD messages
#ifdef USE_DOMOTICZ
} }
#else
MqttPublishDirect(stopic, ((key) ? Settings.flag.mqtt_switch_retain : Settings.flag.mqtt_button_retain) && (state != POWER_HOLD || !Settings.flag3.no_hold_retain));
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
result = !Settings.flag3.button_switch_force_local; result = !Settings.flag3.button_switch_force_local;
} else { } else {
@ -577,7 +579,7 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source)
#ifdef USE_SONOFF_IFAN #ifdef USE_SONOFF_IFAN
if (IsModuleIfan()) { if (IsModuleIfan()) {
blink_mask &= 1; // No blinking on the fan relays blink_mask &= 1; // No blinking on the fan relays
Settings.flag.interlock = 0; // No interlock mode as it is already done by the microcontroller Settings.flag.interlock = 0; // No interlock mode as it is already done by the microcontroller - CMND_INTERLOCK - Enable/disable interlock
Settings.pulse_timer[1] = 0; // No pulsetimers on the fan relays Settings.pulse_timer[1] = 0; // No pulsetimers on the fan relays
Settings.pulse_timer[2] = 0; Settings.pulse_timer[2] = 0;
Settings.pulse_timer[3] = 0; Settings.pulse_timer[3] = 0;
@ -605,7 +607,7 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source)
MqttPublishPowerBlinkState(device); MqttPublishPowerBlinkState(device);
} }
if (Settings.flag.interlock && if (Settings.flag.interlock && // CMND_INTERLOCK - Enable/disable interlock
!interlock_mutex && !interlock_mutex &&
((POWER_ON == state) || ((POWER_TOGGLE == state) && !(power & mask))) ((POWER_ON == state) || ((POWER_TOGGLE == state) && !(power & mask)))
) { ) {
@ -722,7 +724,8 @@ void MqttShowState(void)
if (i == LightDevice()) { LightState(1); } // call it only once if (i == LightDevice()) { LightState(1); } // call it only once
} else { } else {
#endif #endif
ResponseAppend_P(PSTR(",\"%s\":\"%s\""), GetPowerDevice(stemp1, i, sizeof(stemp1), Settings.flag.device_index_enable), GetStateText(bitRead(power, i-1))); ResponseAppend_P(PSTR(",\"%s\":\"%s\""), GetPowerDevice(stemp1, i, sizeof(stemp1), Settings.flag.device_index_enable), // SetOption26 - Switch between POWER or POWER1
GetStateText(bitRead(power, i-1)));
#ifdef USE_SONOFF_IFAN #ifdef USE_SONOFF_IFAN
if (IsModuleIfan()) { if (IsModuleIfan()) {
ResponseAppend_P(PSTR(",\"" D_CMND_FANSPEED "\":%d"), GetFanspeed()); ResponseAppend_P(PSTR(",\"" D_CMND_FANSPEED "\":%d"), GetFanspeed());
@ -847,7 +850,7 @@ void PerformEverySecond(void)
mqtt_data[0] = '\0'; mqtt_data[0] = '\0';
if (MqttShowSensor()) { if (MqttShowSensor()) {
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
#if defined(USE_RULES) || defined(USE_SCRIPT) #if defined(USE_RULES) || defined(USE_SCRIPT)
RulesTeleperiod(); // Allow rule based HA messages RulesTeleperiod(); // Allow rule based HA messages
#endif // USE_RULES #endif // USE_RULES
@ -914,7 +917,7 @@ void Every250mSeconds(void)
if (mqtt_cmnd_publish) mqtt_cmnd_publish--; // Clean up if (mqtt_cmnd_publish) mqtt_cmnd_publish--; // Clean up
if (!Settings.flag.global_state) { // Problem blinkyblinky enabled if (!Settings.flag.global_state) { // Problem blinkyblinky enabled - SetOption31 - Control link led blinking
if (global_state.data) { // Any problem if (global_state.data) { // Any problem
if (global_state.mqtt_down) { blinkinterval = 7; } // MQTT problem so blink every 2 seconds (slowest) if (global_state.mqtt_down) { blinkinterval = 7; } // MQTT problem so blink every 2 seconds (slowest)
if (global_state.wifi_down) { blinkinterval = 3; } // Wifi problem so blink every second (slow) if (global_state.wifi_down) { blinkinterval = 3; } // Wifi problem so blink every second (slow)
@ -1027,7 +1030,7 @@ void Every250mSeconds(void)
if (save_data_counter && BACKLOG_EMPTY) { if (save_data_counter && BACKLOG_EMPTY) {
save_data_counter--; save_data_counter--;
if (save_data_counter <= 0) { if (save_data_counter <= 0) {
if (Settings.flag.save_state) { if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
power_t mask = POWER_MASK; power_t mask = POWER_MASK;
for (uint32_t i = 0; i < MAX_PULSETIMERS; i++) { for (uint32_t i = 0; i < MAX_PULSETIMERS; i++) {
if ((Settings.pulse_timer[i] > 0) && (Settings.pulse_timer[i] < 30)) { // 3 seconds if ((Settings.pulse_timer[i] > 0) && (Settings.pulse_timer[i] < 30)) { // 3 seconds
@ -1120,18 +1123,20 @@ void ArduinoOTAInit(void)
ArduinoOTA.onStart([]() ArduinoOTA.onStart([]()
{ {
SettingsSave(1); // Free flash for OTA update SettingsSave(1); // Free flash for OTA update
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
if (Settings.webserver) { StopWebserver(); } if (Settings.webserver) { StopWebserver(); }
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
#ifdef USE_ARILUX_RF #ifdef USE_ARILUX_RF
AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine
#endif // USE_ARILUX_RF #endif // USE_ARILUX_RF
if (Settings.flag.mqtt_enabled) { MqttDisconnect(); } if (Settings.flag.mqtt_enabled) {
MqttDisconnect(); // SetOption3 - Enable MQTT
}
AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_UPLOAD "Arduino OTA " D_UPLOAD_STARTED)); AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_UPLOAD "Arduino OTA " D_UPLOAD_STARTED));
arduino_ota_triggered = true; arduino_ota_triggered = true;
arduino_ota_progress_dot_count = 0; arduino_ota_progress_dot_count = 0;
delay(100); // Allow time for message xfer delay(100); // Allow time for message xfer
}); });
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
@ -1201,12 +1206,12 @@ void SerialInput(void)
/*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/
if (serial_in_byte > 127 && !Settings.flag.mqtt_serial_raw) { // Discard binary data above 127 if no raw reception allowed if (serial_in_byte > 127 && !Settings.flag.mqtt_serial_raw) { // Discard binary data above 127 if no raw reception allowed - CMND_SERIALSEND3
serial_in_byte_counter = 0; serial_in_byte_counter = 0;
Serial.flush(); Serial.flush();
return; return;
} }
if (!Settings.flag.mqtt_serial) { // SerialSend active if (!Settings.flag.mqtt_serial) { // SerialSend active - CMND_SERIALSEND and CMND_SERIALLOG
if (isprint(serial_in_byte)) { // Any char between 32 and 127 if (isprint(serial_in_byte)) { // Any char between 32 and 127
if (serial_in_byte_counter < INPUT_BUFFER_SIZE -1) { // Add char to string if it still fits if (serial_in_byte_counter < INPUT_BUFFER_SIZE -1) { // Add char to string if it still fits
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte; serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
@ -1215,11 +1220,11 @@ void SerialInput(void)
} }
} }
} else { } else {
if (serial_in_byte || Settings.flag.mqtt_serial_raw) { // Any char between 1 and 127 or any char (0 - 255) if (serial_in_byte || Settings.flag.mqtt_serial_raw) { // Any char between 1 and 127 or any char (0 - 255) - CMND_SERIALSEND3
if ((serial_in_byte_counter < INPUT_BUFFER_SIZE -1) && // Add char to string if it still fits and ... if ((serial_in_byte_counter < INPUT_BUFFER_SIZE -1) && // Add char to string if it still fits and ...
((isprint(serial_in_byte) && (128 == Settings.serial_delimiter)) || // Any char between 32 and 127 ((isprint(serial_in_byte) && (128 == Settings.serial_delimiter)) || // Any char between 32 and 127
((serial_in_byte != Settings.serial_delimiter) && (128 != Settings.serial_delimiter)) || // Any char between 1 and 127 and not being delimiter ((serial_in_byte != Settings.serial_delimiter) && (128 != Settings.serial_delimiter)) || // Any char between 1 and 127 and not being delimiter
Settings.flag.mqtt_serial_raw)) { // Any char between 0 and 255 Settings.flag.mqtt_serial_raw)) { // Any char between 0 and 255 - CMND_SERIALSEND3
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte; serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
serial_polling_window = millis(); serial_polling_window = millis();
} else { } else {
@ -1245,7 +1250,7 @@ void SerialInput(void)
#endif // USE_SONOFF_SC #endif // USE_SONOFF_SC
/*-------------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------------*/
if (!Settings.flag.mqtt_serial && (serial_in_byte == '\n')) { if (!Settings.flag.mqtt_serial && (serial_in_byte == '\n')) { // CMND_SERIALSEND and CMND_SERIALLOG
serial_in_buffer[serial_in_byte_counter] = 0; // Serial data completed serial_in_buffer[serial_in_byte_counter] = 0; // Serial data completed
seriallog_level = (Settings.seriallog_level < LOG_LEVEL_INFO) ? (uint8_t)LOG_LEVEL_INFO : Settings.seriallog_level; seriallog_level = (Settings.seriallog_level < LOG_LEVEL_INFO) ? (uint8_t)LOG_LEVEL_INFO : Settings.seriallog_level;
AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_COMMAND "%s"), serial_in_buffer); AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_COMMAND "%s"), serial_in_buffer);
@ -1257,7 +1262,7 @@ void SerialInput(void)
} }
} }
if (Settings.flag.mqtt_serial && serial_in_byte_counter && (millis() > (serial_polling_window + SERIAL_POLLING))) { if (Settings.flag.mqtt_serial && serial_in_byte_counter && (millis() > (serial_polling_window + SERIAL_POLLING))) { // CMND_SERIALSEND and CMND_SERIALLOG
serial_in_buffer[serial_in_byte_counter] = 0; // Serial data completed serial_in_buffer[serial_in_byte_counter] = 0; // Serial data completed
char hex_char[(serial_in_byte_counter * 2) + 2]; char hex_char[(serial_in_byte_counter * 2) + 2];
Response_P(PSTR(",\"" D_JSON_SERIALRECEIVED "\":\"%s\"}"), Response_P(PSTR(",\"" D_JSON_SERIALRECEIVED "\":\"%s\"}"),
@ -1410,18 +1415,18 @@ void GpioInit(void)
// devices_present = 1; // devices_present = 1;
} }
else if (SONOFF_DUAL == my_module_type) { else if (SONOFF_DUAL == my_module_type) {
Settings.flag.mqtt_serial = 0; Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
devices_present = 2; devices_present = 2;
baudrate = 19200; baudrate = 19200;
} }
else if (CH4 == my_module_type) { else if (CH4 == my_module_type) {
Settings.flag.mqtt_serial = 0; Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
devices_present = 4; devices_present = 4;
baudrate = 19200; baudrate = 19200;
} }
#ifdef USE_SONOFF_SC #ifdef USE_SONOFF_SC
else if (SONOFF_SC == my_module_type) { else if (SONOFF_SC == my_module_type) {
Settings.flag.mqtt_serial = 0; Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
devices_present = 0; devices_present = 0;
baudrate = 19200; baudrate = 19200;
} }
@ -1524,7 +1529,7 @@ void setup(void)
seriallog_level = Settings.seriallog_level; seriallog_level = Settings.seriallog_level;
seriallog_timer = SERIALLOG_TIMER; seriallog_timer = SERIALLOG_TIMER;
syslog_level = Settings.syslog_level; syslog_level = Settings.syslog_level;
stop_flash_rotate = Settings.flag.stop_flash_rotate; stop_flash_rotate = Settings.flag.stop_flash_rotate; // SetOption12 - Switch between dynamic or fixed slot flash save location
save_data_counter = Settings.save_data; save_data_counter = Settings.save_data;
sleep = Settings.sleep; sleep = Settings.sleep;
#ifndef USE_EMULATION #ifndef USE_EMULATION
@ -1598,20 +1603,20 @@ void setup(void)
break; break;
case POWER_ALL_SAVED_TOGGLE: case POWER_ALL_SAVED_TOGGLE:
power = (Settings.power & ((1 << devices_present) -1)) ^ POWER_MASK; power = (Settings.power & ((1 << devices_present) -1)) ^ POWER_MASK;
if (Settings.flag.save_state) { if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
SetDevicePower(power, SRC_RESTART); SetDevicePower(power, SRC_RESTART);
} }
break; break;
case POWER_ALL_SAVED: case POWER_ALL_SAVED:
power = Settings.power & ((1 << devices_present) -1); power = Settings.power & ((1 << devices_present) -1);
if (Settings.flag.save_state) { if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
SetDevicePower(power, SRC_RESTART); SetDevicePower(power, SRC_RESTART);
} }
break; break;
} }
} else { } else {
power = Settings.power & ((1 << devices_present) -1); power = Settings.power & ((1 << devices_present) -1);
if (Settings.flag.save_state) { if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart
SetDevicePower(power, SRC_RESTART); SetDevicePower(power, SRC_RESTART);
} }
} }

View File

@ -991,7 +991,7 @@ void HandleRoot(void)
if (devices_present) { if (devices_present) {
#ifdef USE_LIGHT #ifdef USE_LIGHT
if (light_type) { if (light_type) {
if (!Settings.flag3.pwm_multi_channels) { if (!Settings.flag3.pwm_multi_channels) { // SetOption68 0
if ((LST_COLDWARM == (light_type &7)) || (LST_RGBWC == (light_type &7))) { if ((LST_COLDWARM == (light_type &7)) || (LST_RGBWC == (light_type &7))) {
// Cold - Warm &t related to lb("t", value) and WebGetArg("t", tmp, sizeof(tmp)); // Cold - Warm &t related to lb("t", value) and WebGetArg("t", tmp, sizeof(tmp));
WSContentSend_P(HTTP_MSG_SLIDER1, F(D_COLDLIGHT), F(D_WARMLIGHT), WSContentSend_P(HTTP_MSG_SLIDER1, F(D_COLDLIGHT), F(D_WARMLIGHT),
@ -1000,7 +1000,7 @@ void HandleRoot(void)
// Dark - Bright &d related to lb("d", value) and WebGetArg("d", tmp, sizeof(tmp)); // Dark - Bright &d related to lb("d", value) and WebGetArg("d", tmp, sizeof(tmp));
WSContentSend_P(HTTP_MSG_SLIDER1, F(D_DARKLIGHT), F(D_BRIGHTLIGHT), WSContentSend_P(HTTP_MSG_SLIDER1, F(D_DARKLIGHT), F(D_BRIGHTLIGHT),
1, 100, Settings.light_dimmer, 'd'); 1, 100, Settings.light_dimmer, 'd');
} else { // Settings.flag3.pwm_multi_channels } else { // Settings.flag3.pwm_multi_channels - SetOption68 1
uint32_t pwm_channels = (light_type & 7) > LST_MAX ? LST_MAX : (light_type & 7); uint32_t pwm_channels = (light_type & 7) > LST_MAX ? LST_MAX : (light_type & 7);
for (uint32_t i = 0; i < pwm_channels; i++) { for (uint32_t i = 0; i < pwm_channels; i++) {
snprintf_P(stemp, sizeof(stemp), PSTR("c%d"), i); snprintf_P(stemp, sizeof(stemp), PSTR("c%d"), i);
@ -1012,7 +1012,7 @@ void HandleRoot(void)
} }
#endif #endif
#ifdef USE_SHUTTER #ifdef USE_SHUTTER
if (Settings.flag3.shutter_mode) { if (Settings.flag3.shutter_mode) { // SetOption80 1
for (uint32_t i = 0; i < shutters_present; i++) { for (uint32_t i = 0; i < shutters_present; i++) {
WSContentSend_P(HTTP_MSG_SLIDER2, F(D_CLOSE), F(D_OPEN), WSContentSend_P(HTTP_MSG_SLIDER2, F(D_CLOSE), F(D_OPEN),
0, 100, Settings.shutter_position[i], 'u', i+1); 0, 100, Settings.shutter_position[i], 'u', i+1);
@ -1625,7 +1625,7 @@ void HandleLoggingConfiguration(void)
char stemp2[32]; char stemp2[32];
uint8_t dlevel[4] = { LOG_LEVEL_INFO, LOG_LEVEL_INFO, LOG_LEVEL_NONE, LOG_LEVEL_NONE }; uint8_t dlevel[4] = { LOG_LEVEL_INFO, LOG_LEVEL_INFO, LOG_LEVEL_NONE, LOG_LEVEL_NONE };
for (uint32_t idx = 0; idx < 4; idx++) { for (uint32_t idx = 0; idx < 4; idx++) {
if ((2==idx) && !Settings.flag.mqtt_enabled) { continue; } if ((2==idx) && !Settings.flag.mqtt_enabled) { continue; } // SetOption3 - Enable MQTT
uint32_t llevel = (0==idx)?Settings.seriallog_level:(1==idx)?Settings.weblog_level:(2==idx)?Settings.mqttlog_level:Settings.syslog_level; uint32_t llevel = (0==idx)?Settings.seriallog_level:(1==idx)?Settings.weblog_level:(2==idx)?Settings.mqttlog_level:Settings.syslog_level;
WSContentSend_P(PSTR("<p><b>%s</b> (%s)<br><select id='l%d'>"), WSContentSend_P(PSTR("<p><b>%s</b> (%s)<br><select id='l%d'>"),
GetTextIndexed(stemp1, sizeof(stemp1), idx, kLoggingOptions), GetTextIndexed(stemp1, sizeof(stemp1), idx, kLoggingOptions),
@ -1689,7 +1689,7 @@ void HandleOtherConfiguration(void)
TemplateJson(); TemplateJson();
char stemp[strlen(mqtt_data) +1]; char stemp[strlen(mqtt_data) +1];
strlcpy(stemp, mqtt_data, sizeof(stemp)); // Get JSON template strlcpy(stemp, mqtt_data, sizeof(stemp)); // Get JSON template
WSContentSend_P(HTTP_FORM_OTHER, stemp, (USER_MODULE == Settings.module) ? " checked disabled" : "", (Settings.flag.mqtt_enabled) ? " checked" : ""); WSContentSend_P(HTTP_FORM_OTHER, stemp, (USER_MODULE == Settings.module) ? " checked disabled" : "", (Settings.flag.mqtt_enabled) ? " checked" : ""); // SetOption3 - Enable MQTT
uint32_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!devices_present) ? 1 : devices_present; uint32_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!devices_present) ? 1 : devices_present;
#ifdef USE_SONOFF_IFAN #ifdef USE_SONOFF_IFAN
@ -1738,7 +1738,7 @@ void OtherSaveSettings(void)
WebGetArg("wp", tmp, sizeof(tmp)); WebGetArg("wp", tmp, sizeof(tmp));
strlcpy(Settings.web_password, (!strlen(tmp)) ? "" : (strchr(tmp,'*')) ? Settings.web_password : tmp, sizeof(Settings.web_password)); strlcpy(Settings.web_password, (!strlen(tmp)) ? "" : (strchr(tmp,'*')) ? Settings.web_password : tmp, sizeof(Settings.web_password));
Settings.flag.mqtt_enabled = WebServer->hasArg("b1"); Settings.flag.mqtt_enabled = WebServer->hasArg("b1"); // SetOption3 - Enable MQTT
#ifdef USE_EMULATION #ifdef USE_EMULATION
WebGetArg("b2", tmp, sizeof(tmp)); WebGetArg("b2", tmp, sizeof(tmp));
Settings.flag2.emulation = (!strlen(tmp)) ? 0 : atoi(tmp); Settings.flag2.emulation = (!strlen(tmp)) ? 0 : atoi(tmp);
@ -1900,7 +1900,7 @@ void HandleInformation(void)
WSContentSend_P(PSTR("}1" D_MAC_ADDRESS "}2%s"), WiFi.softAPmacAddress().c_str()); WSContentSend_P(PSTR("}1" D_MAC_ADDRESS "}2%s"), WiFi.softAPmacAddress().c_str());
} }
WSContentSend_P(PSTR("}1}2&nbsp;")); // Empty line WSContentSend_P(PSTR("}1}2&nbsp;")); // Empty line
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
#ifdef USE_MQTT_AWS_IOT #ifdef USE_MQTT_AWS_IOT
WSContentSend_P(PSTR("}1" D_MQTT_HOST "}2%s%s"), Settings.mqtt_user, Settings.mqtt_host); WSContentSend_P(PSTR("}1" D_MQTT_HOST "}2%s%s"), Settings.mqtt_user, Settings.mqtt_host);
WSContentSend_P(PSTR("}1" D_MQTT_PORT "}2%d"), Settings.mqtt_port); WSContentSend_P(PSTR("}1" D_MQTT_PORT "}2%d"), Settings.mqtt_port);
@ -2039,7 +2039,7 @@ void HandleUploadDone(void)
} }
WSContentSend_P(error); WSContentSend_P(error);
DEBUG_CORE_LOG(PSTR("UPL: %s"), error); DEBUG_CORE_LOG(PSTR("UPL: %s"), error);
stop_flash_rotate = Settings.flag.stop_flash_rotate; stop_flash_rotate = Settings.flag.stop_flash_rotate; // SetOption12 - Switch between dynamic or fixed slot flash save location
} else { } else {
WSContentSend_P(PSTR("%06x'>" D_SUCCESSFUL "</font></b><br>"), WebColor(COL_TEXT_SUCCESS)); WSContentSend_P(PSTR("%06x'>" D_SUCCESSFUL "</font></b><br>"), WebColor(COL_TEXT_SUCCESS));
WSContentSend_P(HTTP_MSG_RSTRT); WSContentSend_P(HTTP_MSG_RSTRT);
@ -2099,7 +2099,9 @@ void HandleUploadLoop(void)
#ifdef USE_ARILUX_RF #ifdef USE_ARILUX_RF
AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine
#endif // USE_ARILUX_RF #endif // USE_ARILUX_RF
if (Settings.flag.mqtt_enabled) MqttDisconnect(); if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
MqttDisconnect();
}
uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
if (!Update.begin(maxSketchSpace)) { //start with max available size if (!Update.begin(maxSketchSpace)) { //start with max available size

View File

@ -316,7 +316,7 @@ void MqttUnsubscribe(const char *topic)
void MqttPublishLogging(const char *mxtime) void MqttPublishLogging(const char *mxtime)
{ {
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
if (MqttIsConnected()) { if (MqttIsConnected()) {
char saved_mqtt_data[MESSZ]; char saved_mqtt_data[MESSZ];
@ -355,7 +355,7 @@ void MqttPublishDirect(const char* topic, bool retained)
sretained[0] = '\0'; sretained[0] = '\0';
snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_RESULT)); snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_RESULT));
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
if (MqttIsConnected()) { if (MqttIsConnected()) {
if (MqttPublishLib(topic, retained)) { if (MqttPublishLib(topic, retained)) {
snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_MQTT)); snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_MQTT));
@ -366,7 +366,7 @@ void MqttPublishDirect(const char* topic, bool retained)
} }
} }
snprintf_P(log_data, sizeof(log_data), PSTR("%s%s = %s"), slog_type, (Settings.flag.mqtt_enabled) ? topic : strrchr(topic,'/')+1, mqtt_data); snprintf_P(log_data, sizeof(log_data), PSTR("%s%s = %s"), slog_type, (Settings.flag.mqtt_enabled) ? topic : strrchr(topic,'/')+1, mqtt_data); // SetOption3 - Enable MQTT
if (strlen(log_data) >= (sizeof(log_data) - strlen(sretained) -1)) { if (strlen(log_data) >= (sizeof(log_data) - strlen(sretained) -1)) {
log_data[sizeof(log_data) - strlen(sretained) -5] = '\0'; log_data[sizeof(log_data) - strlen(sretained) -5] = '\0';
snprintf_P(log_data, sizeof(log_data), PSTR("%s ..."), log_data); snprintf_P(log_data, sizeof(log_data), PSTR("%s ..."), log_data);
@ -415,7 +415,7 @@ void MqttPublishPrefixTopic_P(uint32_t prefix, const char* subtopic, bool retain
char romram[33]; char romram[33];
char stopic[TOPSZ]; char stopic[TOPSZ];
snprintf_P(romram, sizeof(romram), ((prefix > 3) && !Settings.flag.mqtt_response) ? S_RSLT_RESULT : subtopic); snprintf_P(romram, sizeof(romram), ((prefix > 3) && !Settings.flag.mqtt_response) ? S_RSLT_RESULT : subtopic); // SetOption4 - Switch between MQTT RESULT or COMMAND
for (uint32_t i = 0; i < strlen(romram); i++) { for (uint32_t i = 0; i < strlen(romram); i++) {
romram[i] = toupper(romram[i]); romram[i] = toupper(romram[i]);
} }
@ -443,20 +443,20 @@ void MqttPublishPowerState(uint32_t device)
DomoticzUpdateFanState(); // RC Button feedback DomoticzUpdateFanState(); // RC Button feedback
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
snprintf_P(scommand, sizeof(scommand), PSTR(D_CMND_FANSPEED)); snprintf_P(scommand, sizeof(scommand), PSTR(D_CMND_FANSPEED));
GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT); GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT); // SetOption4 - Switch between MQTT RESULT or COMMAND
Response_P(S_JSON_COMMAND_NVALUE, scommand, GetFanspeed()); Response_P(S_JSON_COMMAND_NVALUE, scommand, GetFanspeed());
MqttPublish(stopic); MqttPublish(stopic);
} }
} else { } else {
#endif // USE_SONOFF_IFAN #endif // USE_SONOFF_IFAN
GetPowerDevice(scommand, device, sizeof(scommand), Settings.flag.device_index_enable); GetPowerDevice(scommand, device, sizeof(scommand), Settings.flag.device_index_enable); // SetOption26 - Switch between POWER or POWER1
GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT); GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT); // SetOption4 - Switch between MQTT RESULT or COMMAND
Response_P(S_JSON_COMMAND_SVALUE, scommand, GetStateText(bitRead(power, device -1))); Response_P(S_JSON_COMMAND_SVALUE, scommand, GetStateText(bitRead(power, device -1)));
MqttPublish(stopic); MqttPublish(stopic);
GetTopic_P(stopic, STAT, mqtt_topic, scommand); GetTopic_P(stopic, STAT, mqtt_topic, scommand);
Response_P(GetStateText(bitRead(power, device -1))); Response_P(GetStateText(bitRead(power, device -1)));
MqttPublish(stopic, Settings.flag.mqtt_power_retain); MqttPublish(stopic, Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN
#ifdef USE_SONOFF_IFAN #ifdef USE_SONOFF_IFAN
} }
#endif // USE_SONOFF_IFAN #endif // USE_SONOFF_IFAN
@ -480,7 +480,7 @@ void MqttPublishPowerBlinkState(uint32_t device)
device = 1; device = 1;
} }
Response_P(PSTR("{\"%s\":\"" D_JSON_BLINK " %s\"}"), Response_P(PSTR("{\"%s\":\"" D_JSON_BLINK " %s\"}"),
GetPowerDevice(scommand, device, sizeof(scommand), Settings.flag.device_index_enable), GetStateText(bitRead(blink_mask, device -1))); GetPowerDevice(scommand, device, sizeof(scommand), Settings.flag.device_index_enable), GetStateText(bitRead(blink_mask, device -1))); // SetOption26 - Switch between POWER or POWER1
MqttPublishPrefixTopic_P(RESULT_OR_STAT, S_RSLT_POWER); MqttPublishPrefixTopic_P(RESULT_OR_STAT, S_RSLT_POWER);
} }
@ -559,7 +559,7 @@ void MqttConnected(void)
Mqtt.initial_connection_state = 0; Mqtt.initial_connection_state = 0;
global_state.mqtt_down = 0; global_state.mqtt_down = 0;
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
rules_flag.mqtt_connected = 1; rules_flag.mqtt_connected = 1;
} }
} }
@ -568,7 +568,7 @@ void MqttReconnect(void)
{ {
char stopic[TOPSZ]; char stopic[TOPSZ];
Mqtt.allowed = Settings.flag.mqtt_enabled; Mqtt.allowed = Settings.flag.mqtt_enabled; // SetOption3 - Enable MQTT
if (Mqtt.allowed) { if (Mqtt.allowed) {
#ifdef USE_DISCOVERY #ifdef USE_DISCOVERY
#ifdef MQTT_HOST_DISCOVERY #ifdef MQTT_HOST_DISCOVERY
@ -697,7 +697,7 @@ void MqttReconnect(void)
void MqttCheck(void) void MqttCheck(void)
{ {
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
if (!MqttIsConnected()) { if (!MqttIsConnected()) {
global_state.mqtt_down = 1; global_state.mqtt_down = 1;
if (!Mqtt.retry_counter) { if (!Mqtt.retry_counter) {
@ -836,8 +836,8 @@ void CmndFullTopic(void)
char stemp1[TOPSZ]; char stemp1[TOPSZ];
strlcpy(stemp1, (SC_DEFAULT == Shortcut()) ? MQTT_FULLTOPIC : XdrvMailbox.data, sizeof(stemp1)); strlcpy(stemp1, (SC_DEFAULT == Shortcut()) ? MQTT_FULLTOPIC : XdrvMailbox.data, sizeof(stemp1));
if (strcmp(stemp1, Settings.mqtt_fulltopic)) { if (strcmp(stemp1, Settings.mqtt_fulltopic)) {
Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); // SetOption10 - Control MQTT LWT message format
MqttPublishPrefixTopic_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic MqttPublishPrefixTopic_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic
strlcpy(Settings.mqtt_fulltopic, stemp1, sizeof(Settings.mqtt_fulltopic)); strlcpy(Settings.mqtt_fulltopic, stemp1, sizeof(Settings.mqtt_fulltopic));
restart_flag = 2; restart_flag = 2;
} }
@ -897,8 +897,8 @@ void CmndTopic(void)
char stemp1[TOPSZ]; char stemp1[TOPSZ];
strlcpy(stemp1, (SC_DEFAULT == Shortcut()) ? MQTT_TOPIC : XdrvMailbox.data, sizeof(stemp1)); strlcpy(stemp1, (SC_DEFAULT == Shortcut()) ? MQTT_TOPIC : XdrvMailbox.data, sizeof(stemp1));
if (strcmp(stemp1, Settings.mqtt_topic)) { if (strcmp(stemp1, Settings.mqtt_topic)) {
Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); // SetOption10 - Control MQTT LWT message format
MqttPublishPrefixTopic_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic MqttPublishPrefixTopic_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic
strlcpy(Settings.mqtt_topic, stemp1, sizeof(Settings.mqtt_topic)); strlcpy(Settings.mqtt_topic, stemp1, sizeof(Settings.mqtt_topic));
restart_flag = 2; restart_flag = 2;
} }
@ -944,9 +944,9 @@ void CmndButtonRetain(void)
SendKey(KEY_BUTTON, i, CLEAR_RETAIN); // Clear MQTT retain in broker SendKey(KEY_BUTTON, i, CLEAR_RETAIN); // Clear MQTT retain in broker
} }
} }
Settings.flag.mqtt_button_retain = XdrvMailbox.payload; Settings.flag.mqtt_button_retain = XdrvMailbox.payload; // CMND_BUTTONRETAIN
} }
ResponseCmndStateText(Settings.flag.mqtt_button_retain); ResponseCmndStateText(Settings.flag.mqtt_button_retain); // CMND_BUTTONRETAIN
} }
void CmndSwitchRetain(void) void CmndSwitchRetain(void)
@ -957,9 +957,9 @@ void CmndSwitchRetain(void)
SendKey(KEY_SWITCH, i, CLEAR_RETAIN); // Clear MQTT retain in broker SendKey(KEY_SWITCH, i, CLEAR_RETAIN); // Clear MQTT retain in broker
} }
} }
Settings.flag.mqtt_switch_retain = XdrvMailbox.payload; Settings.flag.mqtt_switch_retain = XdrvMailbox.payload; // CMND_SWITCHRETAIN
} }
ResponseCmndStateText(Settings.flag.mqtt_switch_retain); ResponseCmndStateText(Settings.flag.mqtt_switch_retain); // CMND_SWITCHRETAIN
} }
void CmndPowerRetain(void) void CmndPowerRetain(void)
@ -969,14 +969,14 @@ void CmndPowerRetain(void)
char stemp1[TOPSZ]; char stemp1[TOPSZ];
char scommand[CMDSZ]; char scommand[CMDSZ];
for (uint32_t i = 1; i <= devices_present; i++) { // Clear MQTT retain in broker for (uint32_t i = 1; i <= devices_present; i++) { // Clear MQTT retain in broker
GetTopic_P(stemp1, STAT, mqtt_topic, GetPowerDevice(scommand, i, sizeof(scommand), Settings.flag.device_index_enable)); GetTopic_P(stemp1, STAT, mqtt_topic, GetPowerDevice(scommand, i, sizeof(scommand), Settings.flag.device_index_enable)); // SetOption26 - Switch between POWER or POWER1
mqtt_data[0] = '\0'; mqtt_data[0] = '\0';
MqttPublish(stemp1, Settings.flag.mqtt_power_retain); MqttPublish(stemp1, Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN
} }
} }
Settings.flag.mqtt_power_retain = XdrvMailbox.payload; Settings.flag.mqtt_power_retain = XdrvMailbox.payload; // CMND_POWERRETAIN
} }
ResponseCmndStateText(Settings.flag.mqtt_power_retain); ResponseCmndStateText(Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN
} }
void CmndSensorRetain(void) void CmndSensorRetain(void)
@ -984,12 +984,12 @@ void CmndSensorRetain(void)
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) {
if (!XdrvMailbox.payload) { if (!XdrvMailbox.payload) {
mqtt_data[0] = '\0'; mqtt_data[0] = '\0';
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_ENERGY), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_ENERGY), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
Settings.flag.mqtt_sensor_retain = XdrvMailbox.payload; Settings.flag.mqtt_sensor_retain = XdrvMailbox.payload; // CMND_SENSORRETAIN
} }
ResponseCmndStateText(Settings.flag.mqtt_sensor_retain); ResponseCmndStateText(Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
/*********************************************************************************************\ /*********************************************************************************************\
@ -1250,8 +1250,8 @@ void MqttSaveSettings(void)
strlcpy(stemp2, (!strlen(tmp)) ? MQTT_FULLTOPIC : tmp, sizeof(stemp2)); strlcpy(stemp2, (!strlen(tmp)) ? MQTT_FULLTOPIC : tmp, sizeof(stemp2));
MakeValidMqtt(1, stemp2); MakeValidMqtt(1, stemp2);
if ((strcmp(stemp, Settings.mqtt_topic)) || (strcmp(stemp2, Settings.mqtt_fulltopic))) { if ((strcmp(stemp, Settings.mqtt_topic)) || (strcmp(stemp2, Settings.mqtt_fulltopic))) {
Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); Response_P((Settings.flag.mqtt_offline) ? S_OFFLINE : ""); // SetOption10 - Control MQTT LWT message format
MqttPublishPrefixTopic_P(TELE, S_LWT, true); // Offline or remove previous retained topic MqttPublishPrefixTopic_P(TELE, S_LWT, true); // Offline or remove previous retained topic
} }
strlcpy(Settings.mqtt_topic, stemp, sizeof(Settings.mqtt_topic)); strlcpy(Settings.mqtt_topic, stemp, sizeof(Settings.mqtt_topic));
strlcpy(Settings.mqtt_fulltopic, stemp2, sizeof(Settings.mqtt_fulltopic)); strlcpy(Settings.mqtt_fulltopic, stemp2, sizeof(Settings.mqtt_fulltopic));
@ -1287,7 +1287,7 @@ bool Xdrv02(uint8_t function)
{ {
bool result = false; bool result = false;
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
switch (function) { switch (function) {
case FUNC_PRE_INIT: case FUNC_PRE_INIT:
MqttInit(); MqttInit();

View File

@ -213,7 +213,7 @@ void EnergyUpdateTotal(float value, bool kwh)
void Energy200ms(void) void Energy200ms(void)
{ {
Energy.power_on = (power != 0) | Settings.flag.no_power_on_check; Energy.power_on = (power != 0) | Settings.flag.no_power_on_check; // SetOption21 - Show voltage even if powered off
Energy.fifth_second++; Energy.fifth_second++;
if (5 == Energy.fifth_second) { if (5 == Energy.fifth_second) {
@ -424,7 +424,7 @@ void EnergyMqttShow(void)
EnergyShow(true); EnergyShow(true);
tele_period = tele_period_save; tele_period = tele_period_save;
ResponseJsonEnd(); ResponseJsonEnd();
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
Energy.power_delta = false; Energy.power_delta = false;
} }
#endif // USE_ENERGY_MARGIN_DETECTION #endif // USE_ENERGY_MARGIN_DETECTION

View File

@ -929,13 +929,13 @@ public:
void changeBriRGB(uint8_t bri) { void changeBriRGB(uint8_t bri) {
_state->setBriRGB(bri); _state->setBriRGB(bri);
saveSettings(); saveSettings();
calcLevels(); calcLevels();
} }
void changeBriCT(uint8_t bri) { void changeBriCT(uint8_t bri) {
_state->setBriCT(bri); _state->setBriCT(bri);
saveSettings(); saveSettings();
calcLevels(); calcLevels();
} }
void changeRGB(uint8_t r, uint8_t g, uint8_t b, bool keep_bri = false) { void changeRGB(uint8_t r, uint8_t g, uint8_t b, bool keep_bri = false) {
@ -1091,9 +1091,9 @@ void LightPwmOffset(uint32_t offset)
bool LightModuleInit(void) bool LightModuleInit(void)
{ {
light_type = LT_BASIC; // Use basic PWM control if SetOption15 = 0 light_type = LT_BASIC; // Use basic PWM control if SetOption15 = 0
if (Settings.flag.pwm_control) { if (Settings.flag.pwm_control) { // SetOption15 - Switch between commands PWM or COLOR/DIMMER/CT/CHANNEL
for (uint32_t i = 0; i < MAX_PWMS; i++) { for (uint32_t i = 0; i < MAX_PWMS; i++) {
if (pin[GPIO_PWM1 +i] < 99) { light_type++; } // Use Dimmer/Color control for all PWM as SetOption15 = 1 if (pin[GPIO_PWM1 +i] < 99) { light_type++; } // Use Dimmer/Color control for all PWM as SetOption15 = 1
} }
@ -1301,7 +1301,7 @@ void LightSetSignal(uint16_t lo, uint16_t hi, uint16_t value)
/* lo - below lo is green /* lo - below lo is green
hi - above hi is red hi - above hi is red
*/ */
if (Settings.flag.light_signal) { if (Settings.flag.light_signal) { // SetOption18 - Pair light signal with CO2 sensor
uint16_t signal = changeUIntScale(value, lo, hi, 0, 255); // 0..255 uint16_t signal = changeUIntScale(value, lo, hi, 0, 255); // 0..255
// AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "Light signal %d"), signal); // AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "Light signal %d"), signal);
light_controller.changeRGB(signal, 255 - signal, 0, true); // keep bri light_controller.changeRGB(signal, 255 - signal, 0, true); // keep bri
@ -1318,7 +1318,7 @@ char* LightGetColor(char* scolor, boolean force_hex = false)
light_controller.calcLevels(); light_controller.calcLevels();
scolor[0] = '\0'; scolor[0] = '\0';
for (uint32_t i = 0; i < Light.subtype; i++) { for (uint32_t i = 0; i < Light.subtype; i++) {
if (!force_hex && Settings.flag.decimal_text) { if (!force_hex && Settings.flag.decimal_text) { // SetOption17 - Switch between decimal or hexadecimal output
snprintf_P(scolor, LIGHT_COLOR_SIZE, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Light.current_color[i]); snprintf_P(scolor, LIGHT_COLOR_SIZE, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Light.current_color[i]);
} else { } else {
snprintf_P(scolor, LIGHT_COLOR_SIZE, PSTR("%s%02X"), scolor, Light.current_color[i]); snprintf_P(scolor, LIGHT_COLOR_SIZE, PSTR("%s%02X"), scolor, Light.current_color[i]);
@ -1345,7 +1345,7 @@ void LightState(uint8_t append)
Response_P(PSTR("{")); Response_P(PSTR("{"));
} }
if (!Light.pwm_multi_channels) { if (!Light.pwm_multi_channels) {
GetPowerDevice(scommand, Light.device, sizeof(scommand), Settings.flag.device_index_enable); GetPowerDevice(scommand, Light.device, sizeof(scommand), Settings.flag.device_index_enable); // SetOption26 - Switch between POWER or POWER1
ResponseAppend_P(PSTR("\"%s\":\"%s\",\"" D_CMND_DIMMER "\":%d"), scommand, GetStateText(Light.power), light_state.getDimmer()); ResponseAppend_P(PSTR("\"%s\":\"%s\",\"" D_CMND_DIMMER "\":%d"), scommand, GetStateText(Light.power), light_state.getDimmer());
if (Light.subtype > LST_SINGLE) { if (Light.subtype > LST_SINGLE) {
@ -1429,7 +1429,7 @@ void LightPreparePower(void)
} else { } else {
if (light_controller.isCTRGBLinked()) { // linked, standard if (light_controller.isCTRGBLinked()) { // linked, standard
if (light_state.getBri() && !(Light.power)) { if (light_state.getBri() && !(Light.power)) {
if (!Settings.flag.not_power_linked) { if (!Settings.flag.not_power_linked) { // SetOption20 - Control power in relation to Dimmer/Color/Ct changes
ExecuteCommandPower(Light.device, POWER_ON_NO_STATE, SRC_LIGHT); ExecuteCommandPower(Light.device, POWER_ON_NO_STATE, SRC_LIGHT);
} }
} else if (!light_state.getBri() && Light.power) { } else if (!light_state.getBri() && Light.power) {
@ -1438,7 +1438,7 @@ void LightPreparePower(void)
} else { } else {
// RGB // RGB
if (light_state.getBriRGB() && !(Light.power & 1)) { if (light_state.getBriRGB() && !(Light.power & 1)) {
if (!Settings.flag.not_power_linked) { if (!Settings.flag.not_power_linked) { // SetOption20 - Control power in relation to Dimmer/Color/Ct changes
ExecuteCommandPower(Light.device, POWER_ON_NO_STATE, SRC_LIGHT); ExecuteCommandPower(Light.device, POWER_ON_NO_STATE, SRC_LIGHT);
} }
} else if (!light_state.getBri() && (Light.power & 1)) { } else if (!light_state.getBri() && (Light.power & 1)) {
@ -1446,7 +1446,7 @@ void LightPreparePower(void)
} }
// White CT // White CT
if (light_state.getBriCT() && !(Light.power & 2)) { if (light_state.getBriCT() && !(Light.power & 2)) {
if (!Settings.flag.not_power_linked) { if (!Settings.flag.not_power_linked) { // SetOption20 - Control power in relation to Dimmer/Color/Ct changes
ExecuteCommandPower(Light.device + 1, POWER_ON_NO_STATE, SRC_LIGHT); ExecuteCommandPower(Light.device + 1, POWER_ON_NO_STATE, SRC_LIGHT);
} }
} else if (!light_state.getBri() && (Light.power & 2)) { } else if (!light_state.getBri() && (Light.power & 2)) {
@ -1878,7 +1878,7 @@ bool LightColorEntry(char *buffer, uint32_t buffer_length)
char scolor[10]; char scolor[10];
char *p; char *p;
char *str; char *str;
uint32_t entry_type = 0; // Invalid uint32_t entry_type = 0; // Invalid
uint8_t value = Light.fixed_color_index; uint8_t value = Light.fixed_color_index;
if (buffer[0] == '#') { // Optional hexadecimal entry if (buffer[0] == '#') { // Optional hexadecimal entry
@ -1923,19 +1923,19 @@ bool LightColorEntry(char *buffer, uint32_t buffer_length)
else if ((value > 199) && (value <= 199 + MAX_FIXED_COLD_WARM)) { else if ((value > 199) && (value <= 199 + MAX_FIXED_COLD_WARM)) {
if (LST_RGBW == Light.subtype) { if (LST_RGBW == Light.subtype) {
memcpy_P(&Light.entry_color[3], &kFixedWhite[value -200], 1); memcpy_P(&Light.entry_color[3], &kFixedWhite[value -200], 1);
entry_type = 1; // Hexadecimal entry_type = 1; // Hexadecimal
} }
else if (LST_COLDWARM == Light.subtype) { else if (LST_COLDWARM == Light.subtype) {
memcpy_P(&Light.entry_color, &kFixedColdWarm[value -200], 2); memcpy_P(&Light.entry_color, &kFixedColdWarm[value -200], 2);
entry_type = 1; // Hexadecimal entry_type = 1; // Hexadecimal
} }
else if (LST_RGBWC == Light.subtype) { else if (LST_RGBWC == Light.subtype) {
memcpy_P(&Light.entry_color[3], &kFixedColdWarm[value -200], 2); memcpy_P(&Light.entry_color[3], &kFixedColdWarm[value -200], 2);
entry_type = 1; // Hexadecimal entry_type = 1; // Hexadecimal
} }
} }
if (entry_type) { if (entry_type) {
Settings.flag.decimal_text = entry_type -1; Settings.flag.decimal_text = entry_type -1; // SetOption17 - Switch between decimal or hexadecimal output
} }
return (entry_type); return (entry_type);
} }
@ -1975,7 +1975,7 @@ void CmndSupportColor(void)
if (XdrvMailbox.index >= 3) { if (XdrvMailbox.index >= 3) {
scolor[0] = '\0'; scolor[0] = '\0';
for (uint32_t i = 0; i < LST_RGB; i++) { for (uint32_t i = 0; i < LST_RGB; i++) {
if (Settings.flag.decimal_text) { if (Settings.flag.decimal_text) { // SetOption17 - Switch between decimal or hexadecimal output
snprintf_P(scolor, sizeof(scolor), PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Settings.ws_color[XdrvMailbox.index -3][i]); snprintf_P(scolor, sizeof(scolor), PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Settings.ws_color[XdrvMailbox.index -3][i]);
} else { } else {
snprintf_P(scolor, sizeof(scolor), PSTR("%s%02X"), scolor, Settings.ws_color[XdrvMailbox.index -3][i]); snprintf_P(scolor, sizeof(scolor), PSTR("%s%02X"), scolor, Settings.ws_color[XdrvMailbox.index -3][i]);
@ -2031,7 +2031,7 @@ void CmndChannel(void)
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
Light.current_color[XdrvMailbox.index - Light.device] = changeUIntScale(XdrvMailbox.payload,0,100,0,255); Light.current_color[XdrvMailbox.index - Light.device] = changeUIntScale(XdrvMailbox.payload,0,100,0,255);
if (Light.pwm_multi_channels) { if (Light.pwm_multi_channels) {
// if (!Settings.flag.not_power_linked) { // SetOption20 // if (!Settings.flag.not_power_linked) { // SetOption20 - Control power in relation to Dimmer/Color/Ct changes
// Light.power = Light.power | (1 << (XdrvMailbox.index - Light.device)); // ask to turn on channel // Light.power = Light.power | (1 << (XdrvMailbox.index - Light.device)); // ask to turn on channel
// } // }
} else { } else {
@ -2164,7 +2164,7 @@ void CmndDimmer(void)
{ {
uint32_t dimmer; uint32_t dimmer;
if (XdrvMailbox.index > 2) { XdrvMailbox.index = 1; } if (XdrvMailbox.index > 2) { XdrvMailbox.index = 1; }
if ((light_controller.isCTRGBLinked()) || (0 == XdrvMailbox.index)) { if ((light_controller.isCTRGBLinked()) || (0 == XdrvMailbox.index)) {
dimmer = light_state.getDimmer(); dimmer = light_state.getDimmer();
} else { } else {

View File

@ -137,7 +137,7 @@ void IrReceiveCheck(void)
ir_lasttime = now; ir_lasttime = now;
char svalue[64]; char svalue[64];
if (Settings.flag.ir_receive_decimal) { if (Settings.flag.ir_receive_decimal) { // SetOption29 - IR receive data format
ulltoa(results.value, svalue, 10); ulltoa(results.value, svalue, 10);
} else { } else {
snprintf_P(svalue, sizeof(svalue), PSTR("\"0x%s\""), hvalue); snprintf_P(svalue, sizeof(svalue), PSTR("\"0x%s\""), hvalue);

View File

@ -161,7 +161,7 @@ String sendIRJsonState(const struct decode_results &results) {
} else { } else {
json += ",\"" D_JSON_IR_HASH "\":"; json += ",\"" D_JSON_IR_HASH "\":";
} }
if (Settings.flag.ir_receive_decimal) { if (Settings.flag.ir_receive_decimal) { // SetOption29 - IR receive data format
char svalue[32]; char svalue[32];
ulltoa(results.value, svalue, 10); ulltoa(results.value, svalue, 10);
json += svalue; json += svalue;

View File

@ -291,7 +291,7 @@ void SonoffBridgeReceived(void)
} }
} }
} }
if (Settings.flag.rf_receive_decimal) { if (Settings.flag.rf_receive_decimal) { // SetOption28 - RF receive data format
snprintf_P(stemp, sizeof(stemp), PSTR("%u"), received_id); snprintf_P(stemp, sizeof(stemp), PSTR("%u"), received_id);
} else { } else {
snprintf_P(stemp, sizeof(stemp), PSTR("\"%06X\""), received_id); snprintf_P(stemp, sizeof(stemp), PSTR("\"%06X\""), received_id);
@ -578,7 +578,7 @@ bool Xdrv06(uint8_t function)
SonoffBridgeSendCommand(0xA7); // Stop reading RF signals enabling iTead default RF handling SonoffBridgeSendCommand(0xA7); // Stop reading RF signals enabling iTead default RF handling
break; break;
case FUNC_PRE_INIT: case FUNC_PRE_INIT:
Settings.flag.mqtt_serial = 0; Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
baudrate = 19200; baudrate = 19200;
break; break;
} }

View File

@ -82,7 +82,7 @@ int DomoticzRssiQuality(void)
#ifdef USE_SONOFF_IFAN #ifdef USE_SONOFF_IFAN
void MqttPublishDomoticzFanState() void MqttPublishDomoticzFanState()
{ {
if (Settings.flag.mqtt_enabled && Settings.domoticz_relay_idx[1]) { if (Settings.flag.mqtt_enabled && Settings.domoticz_relay_idx[1]) { // SetOption3 - Enable MQTT
char svalue[8]; // Fanspeed value char svalue[8]; // Fanspeed value
int fan_speed = GetFanspeed(); int fan_speed = GetFanspeed();
@ -105,7 +105,7 @@ void DomoticzUpdateFanState()
void MqttPublishDomoticzPowerState(uint8_t device) void MqttPublishDomoticzPowerState(uint8_t device)
{ {
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
if ((device < 1) || (device > devices_present)) { device = 1; } if ((device < 1) || (device > devices_present)) { device = 1; }
if (Settings.domoticz_relay_idx[device -1]) { if (Settings.domoticz_relay_idx[device -1]) {
#ifdef USE_SONOFF_IFAN #ifdef USE_SONOFF_IFAN
@ -574,7 +574,7 @@ bool Xdrv07(uint8_t function)
{ {
bool result = false; bool result = false;
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
switch (function) { switch (function) {
case FUNC_EVERY_SECOND: case FUNC_EVERY_SECOND:
DomoticzMqttUpdate(); DomoticzMqttUpdate();

View File

@ -2664,15 +2664,15 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) {
// allow recursive call // allow recursive call
} else { } else {
tasm_cmd_activ=1; tasm_cmd_activ=1;
svmqtt=Settings.flag.mqtt_enabled; svmqtt=Settings.flag.mqtt_enabled; // SetOption3 - Enable MQTT
swll=Settings.weblog_level; swll=Settings.weblog_level;
Settings.flag.mqtt_enabled=0; Settings.flag.mqtt_enabled=0; // SetOption3 - Enable MQTT
Settings.weblog_level=0; Settings.weblog_level=0;
} }
ExecuteCommand((char*)tmp, SRC_RULE); ExecuteCommand((char*)tmp, SRC_RULE);
tasm_cmd_activ=0; tasm_cmd_activ=0;
if (sflag==1) { if (sflag==1) {
Settings.flag.mqtt_enabled=svmqtt; Settings.flag.mqtt_enabled=svmqtt; // SetOption3 - Enable MQTT
Settings.weblog_level=swll; Settings.weblog_level=swll;
} }
} }

View File

@ -210,7 +210,7 @@ void HAssAnnounceRelayLight(void)
for (uint32_t i = 1; i <= MAX_RELAYS; i++) { for (uint32_t i = 1; i <= MAX_RELAYS; i++) {
is_light = ((i == devices_present) && (light_type)); is_light = ((i == devices_present) && (light_type));
is_topic_light = Settings.flag.hass_light || is_light; is_topic_light = Settings.flag.hass_light || is_light; // SetOption30 - Enforce HAss autodiscovery as light
mqtt_data[0] = '\0'; // Clear retained message mqtt_data[0] = '\0'; // Clear retained message
@ -224,7 +224,7 @@ void HAssAnnounceRelayLight(void)
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s/config"), snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/%s/%s/config"),
(is_topic_light) ? "light" : "switch", unique_id); (is_topic_light) ? "light" : "switch", unique_id);
if (Settings.flag.hass_discovery && (i <= devices_present)) { if (Settings.flag.hass_discovery && (i <= devices_present)) { // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
char name[33+2]; // friendlyname(33) + " " + index char name[33+2]; // friendlyname(33) + " " + index
char value_template[33]; char value_template[33];
char prefix[TOPSZ]; char prefix[TOPSZ];
@ -237,7 +237,7 @@ void HAssAnnounceRelayLight(void)
} else { } else {
snprintf_P(name, sizeof(name), Settings.friendlyname[i -1]); snprintf_P(name, sizeof(name), Settings.friendlyname[i -1]);
} }
GetPowerDevice(value_template, i, sizeof(value_template), Settings.flag.device_index_enable); GetPowerDevice(value_template, i, sizeof(value_template), Settings.flag.device_index_enable); // SetOption26 - Switch between POWER or POWER1
GetTopic_P(command_topic, CMND, mqtt_topic, value_template); GetTopic_P(command_topic, CMND, mqtt_topic, value_template);
//GetTopic_P(state_topic, STAT, mqtt_topic, S_RSLT_RESULT); //GetTopic_P(state_topic, STAT, mqtt_topic, S_RSLT_RESULT);
GetTopic_P(state_topic, TELE, mqtt_topic, D_RSLT_STATE); GetTopic_P(state_topic, TELE, mqtt_topic, D_RSLT_STATE);
@ -257,7 +257,7 @@ void HAssAnnounceRelayLight(void)
GetTopic_P(brightness_command_topic, CMND, mqtt_topic, D_CMND_DIMMER); GetTopic_P(brightness_command_topic, CMND, mqtt_topic, D_CMND_DIMMER);
Shorten(&brightness_command_topic, prefix); Shorten(&brightness_command_topic, prefix);
strncpy_P(stemp3, Settings.flag.not_power_linked?PSTR("last"):PSTR("brightness"), sizeof(stemp3)); strncpy_P(stemp3, Settings.flag.not_power_linked?PSTR("last"):PSTR("brightness"), sizeof(stemp3)); // SetOption20 - Control power in relation to Dimmer/Color/Ct changes
TryResponseAppend_P(HASS_DISCOVER_LIGHT_DIMMER, brightness_command_topic, state_topic, stemp3); TryResponseAppend_P(HASS_DISCOVER_LIGHT_DIMMER, brightness_command_topic, state_topic, stemp3);
if (Light.subtype >= LST_RGB) { if (Light.subtype >= LST_RGB) {
@ -310,7 +310,7 @@ void HAssAnnounceButtonSwitch(uint8_t device, char* topic, uint8_t present, uint
snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_%s_%d"), ESP.getChipId(), key?"SW":"BTN", device+1); snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_%s_%d"), ESP.getChipId(), key?"SW":"BTN", device+1);
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/binary_sensor/%s/config"), unique_id); snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/binary_sensor/%s/config"), unique_id);
if (Settings.flag.hass_discovery && present) { if (Settings.flag.hass_discovery && present) { // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
char name[33+6]; // friendlyname(33) + " " + "BTN" + " " + index char name[33+6]; // friendlyname(33) + " " + "BTN" + " " + index
char value_template[33]; char value_template[33];
char prefix[TOPSZ]; char prefix[TOPSZ];
@ -320,7 +320,7 @@ void HAssAnnounceButtonSwitch(uint8_t device, char* topic, uint8_t present, uint
snprintf_P(name, sizeof(name), PSTR("%s %s%d"), Settings.friendlyname[0], key?"Switch":"Button", device+1); snprintf_P(name, sizeof(name), PSTR("%s %s%d"), Settings.friendlyname[0], key?"Switch":"Button", device+1);
GetPowerDevice(value_template, device+1, sizeof(value_template), GetPowerDevice(value_template, device+1, sizeof(value_template),
key + Settings.flag.device_index_enable); // Force index for Switch 1, Index on Button1 is controlled by Settings.flag.device_index_enable key + Settings.flag.device_index_enable); // Force index for Switch 1, Index on Button1 is controlled by SetOption26 - Switch between POWER or POWER1
//GetTopic_P(state_topic, CMND, topic, value_template); // State of button is sent as CMND TOGGLE, state of switch is sent as ON/OFF //GetTopic_P(state_topic, CMND, topic, value_template); // State of button is sent as CMND TOGGLE, state of switch is sent as ON/OFF
GetTopic_P(state_topic, STAT, mqtt_topic, PSTR(D_RSLT_RESULT)); GetTopic_P(state_topic, STAT, mqtt_topic, PSTR(D_RSLT_RESULT));
GetTopic_P(availability_topic, TELE, mqtt_topic, S_LWT); GetTopic_P(availability_topic, TELE, mqtt_topic, S_LWT);
@ -420,7 +420,7 @@ void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
} else { } else {
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/sensor/%s/config"), unique_id); snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/sensor/%s/config"), unique_id);
} }
if (Settings.flag.hass_discovery) { if (Settings.flag.hass_discovery) { // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
char name[33+42]; // friendlyname(33) + " " + sensorname(20?) + " " + sensortype(20?) char name[33+42]; // friendlyname(33) + " " + sensorname(20?) + " " + sensortype(20?)
char prefix[TOPSZ]; char prefix[TOPSZ];
char *state_topic = stemp1; char *state_topic = stemp1;
@ -531,7 +531,7 @@ void HAssAnnounceStatusSensor(void)
snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_status"), ESP.getChipId()); snprintf_P(unique_id, sizeof(unique_id), PSTR("%06X_status"), ESP.getChipId());
snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/sensor/%s/config"), unique_id); snprintf_P(stopic, sizeof(stopic), PSTR(HOME_ASSISTANT_DISCOVERY_PREFIX "/sensor/%s/config"), unique_id);
if (Settings.flag.hass_discovery) { if (Settings.flag.hass_discovery) { // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
char name[33+7]; // friendlyname(33) + " " + "status" char name[33+7]; // friendlyname(33) + " " + "status"
char prefix[TOPSZ]; char prefix[TOPSZ];
char *state_topic = stemp1; char *state_topic = stemp1;
@ -572,9 +572,9 @@ void HAssPublishStatus(void)
void HAssDiscovery(void) void HAssDiscovery(void)
{ {
// Configure Tasmota for default Home Assistant parameters to keep discovery message as short as possible // Configure Tasmota for default Home Assistant parameters to keep discovery message as short as possible
if (Settings.flag.hass_discovery) { if (Settings.flag.hass_discovery) { // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
Settings.flag.mqtt_response = 0; // Response always as RESULT and not as uppercase command Settings.flag.mqtt_response = 0; // SetOption4 - Switch between MQTT RESULT or COMMAND - Response always as RESULT and not as uppercase command
Settings.flag.decimal_text = 1; // Respond with decimal color values Settings.flag.decimal_text = 1; // SetOption17 - Switch between decimal or hexadecimal output - Respond with decimal color values
Settings.flag3.hass_tele_on_power = 1; // send tele/STATE message as stat/RESULT Settings.flag3.hass_tele_on_power = 1; // send tele/STATE message as stat/RESULT
// Settings.light_scheme = 0; // To just control color it needs to be Scheme 0 // Settings.light_scheme = 0; // To just control color it needs to be Scheme 0
if (strcmp_P(Settings.mqtt_fulltopic, PSTR("%topic%/%prefix%/"))) { if (strcmp_P(Settings.mqtt_fulltopic, PSTR("%topic%/%prefix%/"))) {
@ -584,7 +584,7 @@ void HAssDiscovery(void)
} }
} }
if (Settings.flag.hass_discovery || (1 == hass_mode)) { if (Settings.flag.hass_discovery || (1 == hass_mode)) { // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
// Send info about relays and lights // Send info about relays and lights
HAssAnnounceRelayLight(); HAssAnnounceRelayLight();
@ -610,7 +610,7 @@ void HAssDiscover(void)
void HAssAnyKey(void) void HAssAnyKey(void)
{ {
if (!Settings.flag.hass_discovery) { return; } if (!Settings.flag.hass_discovery) { return; } // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
uint32_t key = (XdrvMailbox.payload >> 16) & 0xFF; uint32_t key = (XdrvMailbox.payload >> 16) & 0xFF;
uint32_t device = XdrvMailbox.payload & 0xFF; uint32_t device = XdrvMailbox.payload & 0xFF;
@ -619,7 +619,7 @@ void HAssAnyKey(void)
char scommand[CMDSZ]; char scommand[CMDSZ];
snprintf_P(scommand, sizeof(scommand), PSTR("%s%d"), (key) ? "SWITCH" : "BUTTON", device); snprintf_P(scommand, sizeof(scommand), PSTR("%s%d"), (key) ? "SWITCH" : "BUTTON", device);
char stopic[TOPSZ]; char stopic[TOPSZ];
GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT); GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT); // SetOption4 - Switch between MQTT RESULT or COMMAND
Response_P(S_JSON_COMMAND_SVALUE, scommand, GetStateText(state)); Response_P(S_JSON_COMMAND_SVALUE, scommand, GetStateText(state));
MqttPublish(stopic); MqttPublish(stopic);
} }
@ -632,7 +632,7 @@ bool Xdrv12(uint8_t function)
{ {
bool result = false; bool result = false;
if (Settings.flag.mqtt_enabled) { if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
switch (function) { switch (function) {
case FUNC_EVERY_SECOND: case FUNC_EVERY_SECOND:
if (hass_init_step) { if (hass_init_step) {
@ -640,7 +640,7 @@ bool Xdrv12(uint8_t function)
if (!hass_init_step) { if (!hass_init_step) {
HAssDiscovery(); // Scheduled discovery using available resources HAssDiscovery(); // Scheduled discovery using available resources
} }
} else if (Settings.flag.hass_discovery && Settings.tele_period) { } else if (Settings.flag.hass_discovery && Settings.tele_period) { // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59)
hass_tele_period++; hass_tele_period++;
if (hass_tele_period >= Settings.tele_period) { if (hass_tele_period >= Settings.tele_period) {
hass_tele_period = 0; hass_tele_period = 0;

View File

@ -172,7 +172,7 @@ void PCA9685_OutputTelemetry(bool telemetry) {
} }
ResponseAppend_P(PSTR("\"END\":1}}")); ResponseAppend_P(PSTR("\"END\":1}}"));
if (telemetry) { if (telemetry) {
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
} }

View File

@ -404,7 +404,7 @@ void TuyaRequestState(void)
void TuyaResetWifi(void) void TuyaResetWifi(void)
{ {
if (!Settings.flag.button_restrict) { if (!Settings.flag.button_restrict) { // SetOption1 - Control button multipress
char scmnd[20]; char scmnd[20];
snprintf_P(scmnd, sizeof(scmnd), D_CMND_WIFICONFIG " %d", 2); snprintf_P(scmnd, sizeof(scmnd), D_CMND_WIFICONFIG " %d", 2);
ExecuteCommand(scmnd, SRC_BUTTON); ExecuteCommand(scmnd, SRC_BUTTON);

View File

@ -62,7 +62,7 @@ void RfReceiveCheck(void)
rf_lasttime = now; rf_lasttime = now;
char stemp[16]; char stemp[16];
if (Settings.flag.rf_receive_decimal) { // SetOption28 (0 = hexadecimal, 1 = decimal) if (Settings.flag.rf_receive_decimal) { // SetOption28 - RF receive data format (0 = hexadecimal, 1 = decimal)
snprintf_P(stemp, sizeof(stemp), PSTR("%u"), (uint32_t)data); snprintf_P(stemp, sizeof(stemp), PSTR("%u"), (uint32_t)data);
} else { } else {
snprintf_P(stemp, sizeof(stemp), PSTR("\"0x%lX\""), (uint32_t)data); snprintf_P(stemp, sizeof(stemp), PSTR("\"0x%lX\""), (uint32_t)data);

View File

@ -154,7 +154,7 @@ void PS16DZSerialInput(void)
else if (!strncmp(Ps16dz.rx_buffer+3, "SETTING", 7)) { else if (!strncmp(Ps16dz.rx_buffer+3, "SETTING", 7)) {
// AT+SETTING=enterESPTOUCH - When ON button is held for over 5 seconds // AT+SETTING=enterESPTOUCH - When ON button is held for over 5 seconds
// AT+SETTING=exitESPTOUCH - When ON button is pressed // AT+SETTING=exitESPTOUCH - When ON button is pressed
if (!Settings.flag.button_restrict) { if (!Settings.flag.button_restrict) { // SetOption1 - Control button multipress
int state = WIFI_MANAGER; int state = WIFI_MANAGER;
if (!strncmp(Ps16dz.rx_buffer+10, "=exit", 5)) { state = WIFI_RETRY; } if (!strncmp(Ps16dz.rx_buffer+10, "=exit", 5)) { state = WIFI_RETRY; }
if (state != Settings.sta_config) { if (state != Settings.sta_config) {

View File

@ -217,7 +217,7 @@ void CmndFanspeed(void)
bool SonoffIfanInit(void) bool SonoffIfanInit(void)
{ {
if (SONOFF_IFAN03 == my_module_type) { if (SONOFF_IFAN03 == my_module_type) {
Settings.flag.mqtt_serial = 0; Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
baudrate = 9600; baudrate = 9600;
SetSeriallog(LOG_LEVEL_NONE); SetSeriallog(LOG_LEVEL_NONE);
} }

View File

@ -174,7 +174,7 @@ void ShutterInit(void)
// Determine shutter types // Determine shutter types
Shutter.mask |= 3 << (Settings.shutter_startrelay[i] -1) ; Shutter.mask |= 3 << (Settings.shutter_startrelay[i] -1) ;
for (uint32_t j = 0; j < MAX_INTERLOCKS * Settings.flag.interlock; j++) { for (uint32_t j = 0; j < MAX_INTERLOCKS * Settings.flag.interlock; j++) { // CMND_INTERLOCK - Enable/disable interlock
//AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Interlock state i=%d %d, flag %d, , shuttermask %d, maskedIL %d"),i, Settings.interlock[i], Settings.flag.interlock,Shutter.mask, Settings.interlock[i]&Shutter.mask); //AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Interlock state i=%d %d, flag %d, , shuttermask %d, maskedIL %d"),i, Settings.interlock[i], Settings.flag.interlock,Shutter.mask, Settings.interlock[i]&Shutter.mask);
if (Settings.interlock[j] && Settings.interlock[j] & Shutter.mask) { if (Settings.interlock[j] && Settings.interlock[j] & Shutter.mask) {
//AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Relay in Interlock group")); //AddLog_P2(LOG_LEVEL_INFO, PSTR("SHT: Relay in Interlock group"));
@ -275,7 +275,7 @@ void ShutterUpdatePosition(void)
snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1); snprintf_P(scommand, sizeof(scommand),PSTR(D_SHUTTER "%d"), i+1);
GetTopic_P(stopic, STAT, mqtt_topic, scommand); GetTopic_P(stopic, STAT, mqtt_topic, scommand);
Response_P("%d", Settings.shutter_invert[i] ? 100 - Settings.shutter_position[i]: Settings.shutter_position[i]); Response_P("%d", Settings.shutter_invert[i] ? 100 - Settings.shutter_position[i]: Settings.shutter_position[i]);
MqttPublish(stopic, Settings.flag.mqtt_power_retain); MqttPublish(stopic, Settings.flag.mqtt_power_retain); // CMND_POWERRETAIN
switch (Shutter.mode) { switch (Shutter.mode) {
case SHT_PULSE_OPEN__PULSE_CLOSE: case SHT_PULSE_OPEN__PULSE_CLOSE:
@ -638,7 +638,7 @@ bool Xdrv27(uint8_t function)
{ {
bool result = false; bool result = false;
if (Settings.flag3.shutter_mode) { if (Settings.flag3.shutter_mode) { // SetOption80 1
switch (function) { switch (function) {
case FUNC_PRE_INIT: case FUNC_PRE_INIT:
ShutterInit(); ShutterInit();

View File

@ -355,7 +355,7 @@ void ExsPacketProcess(void)
bool ExsModuleSelected(void) bool ExsModuleSelected(void)
{ {
Settings.light_correction = 0; Settings.light_correction = 0;
Settings.flag.mqtt_serial = 0; Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
Settings.flag3.pwm_multi_channels = 1; Settings.flag3.pwm_multi_channels = 1;
SetSeriallog(LOG_LEVEL_NONE); SetSeriallog(LOG_LEVEL_NONE);

View File

@ -125,7 +125,7 @@ void ILI9488_InitDriver()
#ifdef USE_TOUCH_BUTTONS #ifdef USE_TOUCH_BUTTONS
void ILI9488_MQTT(uint8_t count,const char *cp) { void ILI9488_MQTT(uint8_t count,const char *cp) {
ResponseTime_P(PSTR(",\"RA8876\":{\"%s%d\":\"%d\"}}"), cp,count+1,(buttons[count]->vpower&0x80)>>7); ResponseTime_P(PSTR(",\"RA8876\":{\"%s%d\":\"%d\"}}"), cp,count+1,(buttons[count]->vpower&0x80)>>7);
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
void ILI9488_RDW_BUTT(uint32_t count,uint32_t pwr) { void ILI9488_RDW_BUTT(uint32_t count,uint32_t pwr) {

View File

@ -110,7 +110,7 @@ void RA8876_InitDriver()
#ifdef USE_TOUCH_BUTTONS #ifdef USE_TOUCH_BUTTONS
void RA8876_MQTT(uint8_t count,const char *cp) { void RA8876_MQTT(uint8_t count,const char *cp) {
ResponseTime_P(PSTR(",\"RA8876\":{\"%s%d\":\"%d\"}}"), cp,count+1,(buttons[count]->vpower&0x80)>>7); ResponseTime_P(PSTR(",\"RA8876\":{\"%s%d\":\"%d\"}}"), cp,count+1,(buttons[count]->vpower&0x80)>>7);
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
void RA8876_RDW_BUTT(uint32_t count,uint32_t pwr) { void RA8876_RDW_BUTT(uint32_t count,uint32_t pwr) {

View File

@ -191,7 +191,9 @@ void Ws2812UpdateHand(int position, uint32_t index)
position = (position + Settings.light_rotation) % Settings.light_pixels; position = (position + Settings.light_rotation) % Settings.light_pixels;
if (Settings.flag.ws_clock_reverse) position = Settings.light_pixels -position; if (Settings.flag.ws_clock_reverse) { // SetOption16 - Switch between clockwise or counter-clockwise
position = Settings.light_pixels -position;
}
WsColor hand_color = { Settings.ws_color[index][WS_RED], Settings.ws_color[index][WS_GREEN], Settings.ws_color[index][WS_BLUE] }; WsColor hand_color = { Settings.ws_color[index][WS_RED], Settings.ws_color[index][WS_GREEN], Settings.ws_color[index][WS_BLUE] };
Ws2812UpdatePixelColor(position, hand_color, 1); Ws2812UpdatePixelColor(position, hand_color, 1);
@ -387,7 +389,7 @@ char* Ws2812GetColor(uint32_t led, char* scolor)
sl_ledcolor[2] = lcolor.B; sl_ledcolor[2] = lcolor.B;
scolor[0] = '\0'; scolor[0] = '\0';
for (uint32_t i = 0; i < Light.subtype; i++) { for (uint32_t i = 0; i < Light.subtype; i++) {
if (Settings.flag.decimal_text) { if (Settings.flag.decimal_text) { // SetOption17 - Switch between decimal or hexadecimal output (0 = hexadecimal, 1 = decimal)
snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", sl_ledcolor[i]); snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", sl_ledcolor[i]);
} else { } else {
snprintf_P(scolor, 25, PSTR("%s%02X"), scolor, sl_ledcolor[i]); snprintf_P(scolor, 25, PSTR("%s%02X"), scolor, sl_ledcolor[i]);

View File

@ -222,7 +222,7 @@ void SnfL1ModuleSelected(void)
{ {
if (SONOFF_L1 == my_module_type) { if (SONOFF_L1 == my_module_type) {
if ((pin[GPIO_RXD] < 99) && (pin[GPIO_TXD] < 99)) { if ((pin[GPIO_RXD] < 99) && (pin[GPIO_TXD] < 99)) {
Settings.flag.mqtt_serial = 0; Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
baudrate = 19200; baudrate = 19200;
light_type = LT_RGB; light_type = LT_RGB;

View File

@ -1812,7 +1812,7 @@ void handleGesture(void) {
mqtt_data[0] = '\0'; mqtt_data[0] = '\0';
if (MqttShowSensor()) { if (MqttShowSensor()) {
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
#ifdef USE_RULES #ifdef USE_RULES
RulesTeleperiod(); // Allow rule based HA messages RulesTeleperiod(); // Allow rule based HA messages
#endif // USE_RULES #endif // USE_RULES

View File

@ -161,7 +161,7 @@ void MCP230xx_ApplySettings(void) {
#ifdef USE_MCP230xx_OUTPUT #ifdef USE_MCP230xx_OUTPUT
case 5 ... 6: case 5 ... 6:
reg_iodir &= ~(1 << idx); reg_iodir &= ~(1 << idx);
if (Settings.flag.save_state) { // Firmware configuration wants us to use the last pin state if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart - Firmware configuration wants us to use the last pin state
reg_portpins |= (Settings.mcp230xx_config[idx+(mcp230xx_port*8)].saved_state << idx); reg_portpins |= (Settings.mcp230xx_config[idx+(mcp230xx_port*8)].saved_state << idx);
} else { } else {
if (Settings.mcp230xx_config[idx+(mcp230xx_port*8)].pullup) { if (Settings.mcp230xx_config[idx+(mcp230xx_port*8)].pullup) {
@ -347,7 +347,7 @@ void MCP230xx_SetOutPin(uint8_t pin,uint8_t pinstate) {
uint8_t portpins; uint8_t portpins;
uint8_t port = 0; uint8_t port = 0;
uint8_t pinmo = Settings.mcp230xx_config[pin].pinmode; uint8_t pinmo = Settings.mcp230xx_config[pin].pinmode;
uint8_t interlock = Settings.flag.interlock; uint8_t interlock = Settings.flag.interlock; // CMND_INTERLOCK - Enable/disable interlock
int pinadd = (pin % 2)+1-(3*(pin % 2)); //check if pin is odd or even and convert to 1 (if even) or -1 (if odd) int pinadd = (pin % 2)+1-(3*(pin % 2)); //check if pin is odd or even and convert to 1 (if even) or -1 (if odd)
char cmnd[7], stt[4]; char cmnd[7], stt[4];
if (pin > 7) { port = 1; } if (pin > 7) { port = 1; }
@ -374,7 +374,7 @@ void MCP230xx_SetOutPin(uint8_t pin,uint8_t pinstate) {
} }
} }
I2cWrite8(USE_MCP230xx_ADDR, MCP230xx_GPIO + port, portpins); I2cWrite8(USE_MCP230xx_ADDR, MCP230xx_GPIO + port, portpins);
if (Settings.flag.save_state) { // Firmware configured to save last known state in settings if (Settings.flag.save_state) { // SetOption0 - Save power state and use after restart - Firmware configured to save last known state in settings
Settings.mcp230xx_config[pin].saved_state=portpins>>(pin-(port*8))&1; Settings.mcp230xx_config[pin].saved_state=portpins>>(pin-(port*8))&1;
Settings.mcp230xx_config[pin+pinadd].saved_state=portpins>>(pin+pinadd-(port*8))&1; Settings.mcp230xx_config[pin+pinadd].saved_state=portpins>>(pin+pinadd-(port*8))&1;
} }
@ -737,7 +737,7 @@ void MCP230xx_OutputTelemetry(void) {
} }
} }
ResponseAppend_P(PSTR("\"END\":1}}")); ResponseAppend_P(PSTR("\"END\":1}}"));
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
} }
@ -752,7 +752,7 @@ void MCP230xx_Interrupt_Counter_Report(void) {
} }
} }
ResponseAppend_P(PSTR("\"END\":1}}")); ResponseAppend_P(PSTR("\"END\":1}}"));
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
mcp230xx_int_sec_counter = 0; mcp230xx_int_sec_counter = 0;
} }
@ -767,7 +767,7 @@ void MCP230xx_Interrupt_Retain_Report(void) {
} }
} }
ResponseAppend_P(PSTR("\"Value\":%u}}"),retainresult); ResponseAppend_P(PSTR("\"Value\":%u}}"),retainresult);
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
/*********************************************************************************************\ /*********************************************************************************************\

View File

@ -360,7 +360,7 @@ void HxEvery100mSecond(void)
ResponseAppendTime(); ResponseAppendTime();
HxShow(true); HxShow(true);
ResponseJsonEnd(); ResponseJsonEnd();
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
Hx.weight_changed = false; Hx.weight_changed = false;
} }
} }

View File

@ -200,7 +200,7 @@ uint8_t MGC3130enableAirwheel[] = {0x10, 0x00, 0x00, 0xA2, 0x90, 0x00 , 0x00, 0x
void MGC3130_triggerTele(){ void MGC3130_triggerTele(){
mqtt_data[0] = '\0'; mqtt_data[0] = '\0';
if (MqttShowSensor()) { if (MqttShowSensor()) {
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
#ifdef USE_RULES #ifdef USE_RULES
RulesTeleperiod(); // Allow rule based HA messages RulesTeleperiod(); // Allow rule based HA messages
#endif // USE_RULES #endif // USE_RULES

View File

@ -74,7 +74,7 @@ float MAX31855_GetProbeTemperature(int32_t RawData){
float result = (RawData * 0.25); // MAX31855 LSB resolution is 0.25°C for probe temperature float result = (RawData * 0.25); // MAX31855 LSB resolution is 0.25°C for probe temperature
return (Settings.flag.temperature_conversion) ? ConvertTemp(result) : result; // Check if we have to convert to Fahrenheit return ConvertTemp(result); // Check if we have to convert to Fahrenheit
} }
/* /*
@ -89,7 +89,7 @@ float MAX31855_GetReferenceTemperature(int32_t RawData){
float result = (RawData * 0.0625); // MAX31855 LSB resolution is 0.0625°C for reference temperature float result = (RawData * 0.0625); // MAX31855 LSB resolution is 0.0625°C for reference temperature
return (Settings.flag.temperature_conversion) ? ConvertTemp(result) : result; // Check if we have to convert to Fahrenheit return ConvertTemp(result); // Check if we have to convert to Fahrenheit
} }
/* /*

View File

@ -500,7 +500,7 @@ void PN532_ScanForTag(void)
ResponseTime_P(PSTR(",\"PN532\":{\"UID\":\"%s\"}}"), uids); ResponseTime_P(PSTR(",\"PN532\":{\"UID\":\"%s\"}}"), uids);
#endif // USE_PN532_DATA_FUNCTION #endif // USE_PN532_DATA_FUNCTION
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
#ifdef USE_PN532_CAUSE_EVENTS #ifdef USE_PN532_CAUSE_EVENTS

View File

@ -254,7 +254,7 @@ void SPS30_Show(bool json) {
void CmdClean(void) { void CmdClean(void) {
sps30_cmd(SPS_CMD_CLEAN); sps30_cmd(SPS_CMD_CLEAN);
ResponseTime_P(PSTR(",\"SPS30\":{\"CFAN\":\"true\"}}")); ResponseTime_P(PSTR(",\"SPS30\":{\"CFAN\":\"true\"}}"));
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
bool SPS30_cmd(void) { bool SPS30_cmd(void) {

View File

@ -133,7 +133,7 @@ void PAJ7620SelectBank(uint8_t bank)
void PAJ7620TriggerTele(){ void PAJ7620TriggerTele(){
mqtt_data[0] = '\0'; mqtt_data[0] = '\0';
if (MqttShowSensor()) { if (MqttShowSensor()) {
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
#ifdef USE_RULES #ifdef USE_RULES
RulesTeleperiod(); // Allow rule based HA messages RulesTeleperiod(); // Allow rule based HA messages
#endif // USE_RULES #endif // USE_RULES

View File

@ -107,7 +107,7 @@ void RDM6300_ScanForTag() {
rdm_uid_str[9]=0; rdm_uid_str[9]=0;
ResponseTime_P(PSTR(",\"RDM6300\":{\"UID\":\"%s\"}}"), rdm_uid_str); ResponseTime_P(PSTR(",\"RDM6300\":{\"UID\":\"%s\"}}"), rdm_uid_str);
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
/* /*
char command[24]; char command[24];
sprintf(command,"event RDM6300=%s",rdm_uid_str); sprintf(command,"event RDM6300=%s",rdm_uid_str);

View File

@ -548,7 +548,7 @@ void ibeacon_mqtt(const char *mac,const char *rssi) {
s_rssi[4]=0; s_rssi[4]=0;
int16_t n_rssi=atoi(s_rssi); int16_t n_rssi=atoi(s_rssi);
ResponseTime_P(PSTR(",\"" D_CMND_IBEACON "_%s\":{\"RSSI\":%d}}"),s_mac,n_rssi); ResponseTime_P(PSTR(",\"" D_CMND_IBEACON "_%s\":{\"RSSI\":%d}}"),s_mac,n_rssi);
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }

View File

@ -1621,7 +1621,7 @@ void SML_Immediate_MQTT(const char *mp,uint8_t index,uint8_t mindex) {
// immediate mqtt // immediate mqtt
dtostrfd(meter_vars[index],dp&0xf,tpowstr); dtostrfd(meter_vars[index],dp&0xf,tpowstr);
ResponseTime_P(PSTR(",\"%s\":{\"%s\":%s}}"),meter_desc_p[mindex].prefix,jname,tpowstr); ResponseTime_P(PSTR(",\"%s\":{\"%s\":%s}}"),meter_desc_p[mindex].prefix,jname,tpowstr);
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); // CMND_SENSORRETAIN
} }
} }
} }