5.0.1 20170429
* Adjust Sonoff SC messages to prepare for display feature
* Move static data from RAM to Flash
* Fix PowerOnState for some devices not reporting "Power on" state
(#284, #380, #383)
This commit is contained in:
arendst 2017-04-29 14:40:53 +02:00
parent 9b69cead60
commit 1dcde6aac4
10 changed files with 147 additions and 133 deletions

View File

@ -1,9 +1,9 @@
## Sonoff-Tasmota ## Sonoff-Tasmota
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
Current version is **5.0.0** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information. Current version is **5.0.1** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information.
### **** ATTENTION Version 5.0.0 specific information **** ### **** ATTENTION Version 5.0.x specific information ****
This version uses a new linker script to free flash memory for future code additions. It moves the settings from Spiffs to Eeprom. If you compile your own firmware download the new linker to your IDE or Platformio base folder. See [Wiki > Prerequisite](https://github.com/arendst/Sonoff-Tasmota/wiki/Prerequisite). This version uses a new linker script to free flash memory for future code additions. It moves the settings from Spiffs to Eeprom. If you compile your own firmware download the new linker to your IDE or Platformio base folder. See [Wiki > Prerequisite](https://github.com/arendst/Sonoff-Tasmota/wiki/Prerequisite).

Binary file not shown.

View File

@ -1,4 +1,9 @@
/* 5.0.0 20170425 /* 5.0.1 20170429
* Adjust Sonoff SC messages to prepare for display feature
* Move static data from RAM to Flash
* Fix PowerOnState for some devices not reporting "Power on" state (#284, #380, #383)
*
* 5.0.0 20170425
* Memory status message update * Memory status message update
* Fix setting migration to better preserve settings during move (#382) * Fix setting migration to better preserve settings during move (#382)
* Best practice is first doing a Backup Configuration before installing version 5.0.0 * Best practice is first doing a Backup Configuration before installing version 5.0.0

View File

@ -10,7 +10,7 @@
* ==================================================== * ====================================================
*/ */
#define VERSION 0x05000000 // 5.0.0 #define VERSION 0x05000100 // 5.0.1
enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL}; enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL};
enum week_t {Last, First, Second, Third, Fourth}; enum week_t {Last, First, Second, Third, Fourth};
@ -156,6 +156,9 @@ enum butt_t {PRESSED, NOT_PRESSED};
#ifdef USE_I2C #ifdef USE_I2C
#include <Wire.h> // I2C support library #include <Wire.h> // I2C support library
#endif // USE_I2C #endif // USE_I2C
#ifdef USI_SPI
#include <SPI.h> // SPI, TFT
#endif // USE_SPI
#include "settings.h" #include "settings.h"
typedef void (*rtcCallback)(); typedef void (*rtcCallback)();
@ -264,6 +267,7 @@ uint8_t swt_flg = 0; // Any external switch configured
uint8_t dht_type = 0; // DHT type (DHT11, DHT21 or DHT22) uint8_t dht_type = 0; // DHT type (DHT11, DHT21 or DHT22)
uint8_t hlw_flg = 0; // Power monitor configured uint8_t hlw_flg = 0; // Power monitor configured
uint8_t i2c_flg = 0; // I2C configured uint8_t i2c_flg = 0; // I2C configured
uint8_t spi_flg = 0; // SPI configured
uint8_t pwm_flg = 0; // PWM configured uint8_t pwm_flg = 0; // PWM configured
uint8_t pwm_idxoffset = 0; // Allowed PWM command offset (change for Sonoff Led) uint8_t pwm_idxoffset = 0; // Allowed PWM command offset (change for Sonoff Led)
@ -620,27 +624,27 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
char stemp2[10]; char stemp2[10];
uint16_t i; uint16_t i;
if (!strcmp(type,"MQTTHOST")) { if (!strcmp_P(type,PSTR("MQTTHOST"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_host))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_host))) {
strlcpy(sysCfg.mqtt_host, (1 == payload) ? MQTT_HOST : dataBuf, sizeof(sysCfg.mqtt_host)); strlcpy(sysCfg.mqtt_host, (1 == payload) ? MQTT_HOST : dataBuf, sizeof(sysCfg.mqtt_host));
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MqttHost\",\"%s\"}"), sysCfg.mqtt_host); snprintf_P(svalue, ssvalue, PSTR("{\"MqttHost\",\"%s\"}"), sysCfg.mqtt_host);
} }
else if (!strcmp(type,"MQTTPORT")) { else if (!strcmp_P(type,PSTR("MQTTPORT"))) {
if ((data_len > 0) && (payload > 0) && (payload < 32766)) { if ((data_len > 0) && (payload > 0) && (payload < 32766)) {
sysCfg.mqtt_port = (1 == payload) ? MQTT_PORT : payload; sysCfg.mqtt_port = (1 == payload) ? MQTT_PORT : payload;
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MqttPort\":%d}"), sysCfg.mqtt_port); snprintf_P(svalue, ssvalue, PSTR("{\"MqttPort\":%d}"), sysCfg.mqtt_port);
} }
else if (!strcmp(type,"MQTTRESPONSE")) { else if (!strcmp_P(type,PSTR("MQTTRESPONSE"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) {
sysCfg.mqtt_response = payload; sysCfg.mqtt_response = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MqttResponse\":\"%s\"}"), getStateText(sysCfg.mqtt_response)); snprintf_P(svalue, ssvalue, PSTR("{\"MqttResponse\":\"%s\"}"), getStateText(sysCfg.mqtt_response));
} }
else if (!strcmp(type,"STATETEXT") && (index > 0) && (index <= 3)) { else if (!strcmp_P(type,PSTR("STATETEXT")) && (index > 0) && (index <= 3)) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.state_text[0]))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.state_text[0]))) {
for(i = 0; i <= data_len; i++) { for(i = 0; i <= data_len; i++) {
if (dataBuf[i] == ' ') { if (dataBuf[i] == ' ') {
@ -652,7 +656,7 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
snprintf_P(svalue, ssvalue, PSTR("{\"StateText%d\":\"%s\"}"), index, getStateText(index -1)); snprintf_P(svalue, ssvalue, PSTR("{\"StateText%d\":\"%s\"}"), index, getStateText(index -1));
} }
#ifdef USE_MQTT_TLS #ifdef USE_MQTT_TLS
else if (!strcmp(type,"MQTTFINGERPRINT")) { else if (!strcmp_P(type,PSTR("MQTTFINGERPRINT"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_fingerprint))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_fingerprint))) {
strlcpy(sysCfg.mqtt_fingerprint, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_FINGERPRINT : dataBuf, sizeof(sysCfg.mqtt_fingerprint)); strlcpy(sysCfg.mqtt_fingerprint, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_FINGERPRINT : dataBuf, sizeof(sysCfg.mqtt_fingerprint));
restartflag = 2; restartflag = 2;
@ -660,28 +664,28 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
snprintf_P(svalue, ssvalue, PSTR("{\"MqttFingerprint\":\"%s\"}"), sysCfg.mqtt_fingerprint); snprintf_P(svalue, ssvalue, PSTR("{\"MqttFingerprint\":\"%s\"}"), sysCfg.mqtt_fingerprint);
} }
#endif #endif
else if (!grpflg && !strcmp(type,"MQTTCLIENT")) { else if (!grpflg && !strcmp_P(type,PSTR("MQTTCLIENT"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_client))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_client))) {
strlcpy(sysCfg.mqtt_client, (1 == payload) ? MQTT_CLIENT_ID : dataBuf, sizeof(sysCfg.mqtt_client)); strlcpy(sysCfg.mqtt_client, (1 == payload) ? MQTT_CLIENT_ID : dataBuf, sizeof(sysCfg.mqtt_client));
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MqttClient\":\"%s\"}"), sysCfg.mqtt_client); snprintf_P(svalue, ssvalue, PSTR("{\"MqttClient\":\"%s\"}"), sysCfg.mqtt_client);
} }
else if (!strcmp(type,"MQTTUSER")) { else if (!strcmp_P(type,PSTR("MQTTUSER"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_user))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_user))) {
strlcpy(sysCfg.mqtt_user, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_USER : dataBuf, sizeof(sysCfg.mqtt_user)); strlcpy(sysCfg.mqtt_user, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_USER : dataBuf, sizeof(sysCfg.mqtt_user));
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("[\"MqttUser\":\"%s\"}"), sysCfg.mqtt_user); snprintf_P(svalue, ssvalue, PSTR("[\"MqttUser\":\"%s\"}"), sysCfg.mqtt_user);
} }
else if (!strcmp(type,"MQTTPASSWORD")) { else if (!strcmp_P(type,PSTR("MQTTPASSWORD"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_pwd))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_pwd))) {
strlcpy(sysCfg.mqtt_pwd, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_PASS : dataBuf, sizeof(sysCfg.mqtt_pwd)); strlcpy(sysCfg.mqtt_pwd, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_PASS : dataBuf, sizeof(sysCfg.mqtt_pwd));
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MqttPassword\":\"%s\"}"), sysCfg.mqtt_pwd); snprintf_P(svalue, ssvalue, PSTR("{\"MqttPassword\":\"%s\"}"), sysCfg.mqtt_pwd);
} }
else if (!strcmp(type,"PREFIX") && (index > 0) && (index <= 3)) { else if (!strcmp_P(type,PSTR("PREFIX")) && (index > 0) && (index <= 3)) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_prefix[0]))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_prefix[0]))) {
for(i = 0; i <= data_len; i++) { for(i = 0; i <= data_len; i++) {
if ((dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) { if ((dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) {
@ -694,7 +698,7 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Prefix%d\":\"%s\"}"), index, sysCfg.mqtt_prefix[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"Prefix%d\":\"%s\"}"), index, sysCfg.mqtt_prefix[index -1]);
} }
else if (!strcmp(type,"GROUPTOPIC")) { else if (!strcmp_P(type,PSTR("GROUPTOPIC"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_grptopic))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_grptopic))) {
for(i = 0; i <= data_len; i++) { for(i = 0; i <= data_len; i++) {
if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#')) { if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#')) {
@ -709,7 +713,7 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
} }
snprintf_P(svalue, ssvalue, PSTR("{\"GroupTopic\":\"%s\"}"), sysCfg.mqtt_grptopic); snprintf_P(svalue, ssvalue, PSTR("{\"GroupTopic\":\"%s\"}"), sysCfg.mqtt_grptopic);
} }
else if (!grpflg && !strcmp(type,"TOPIC")) { else if (!grpflg && !strcmp_P(type,PSTR("TOPIC"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_topic))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_topic))) {
for(i = 0; i <= data_len; i++) { for(i = 0; i <= data_len; i++) {
if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) { if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) {
@ -724,7 +728,7 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Topic\":\"%s\"}"), sysCfg.mqtt_topic); snprintf_P(svalue, ssvalue, PSTR("{\"Topic\":\"%s\"}"), sysCfg.mqtt_topic);
} }
else if (!grpflg && !strcmp(type,"BUTTONTOPIC")) { else if (!grpflg && !strcmp_P(type,PSTR("BUTTONTOPIC"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.button_topic))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.button_topic))) {
for(i = 0; i <= data_len; i++) { for(i = 0; i <= data_len; i++) {
if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) { if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) {
@ -738,7 +742,7 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
} }
snprintf_P(svalue, ssvalue, PSTR("{\"ButtonTopic\":\"%s\"}"), sysCfg.button_topic); snprintf_P(svalue, ssvalue, PSTR("{\"ButtonTopic\":\"%s\"}"), sysCfg.button_topic);
} }
else if (!grpflg && !strcmp(type,"SWITCHTOPIC")) { else if (!grpflg && !strcmp_P(type,PSTR("SWITCHTOPIC"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.switch_topic))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.switch_topic))) {
for(i = 0; i <= data_len; i++) { for(i = 0; i <= data_len; i++) {
if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) { if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) {
@ -752,7 +756,7 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
} }
snprintf_P(svalue, ssvalue, PSTR("{\"SwitchTopic\":\"%s\"}"), sysCfg.switch_topic); snprintf_P(svalue, ssvalue, PSTR("{\"SwitchTopic\":\"%s\"}"), sysCfg.switch_topic);
} }
else if (!strcmp(type,"BUTTONRETAIN")) { else if (!strcmp_P(type,PSTR("BUTTONRETAIN"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) {
strlcpy(sysCfg.button_topic, sysCfg.mqtt_topic, sizeof(sysCfg.button_topic)); strlcpy(sysCfg.button_topic, sysCfg.mqtt_topic, sizeof(sysCfg.button_topic));
if (!payload) { if (!payload) {
@ -764,7 +768,7 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
} }
snprintf_P(svalue, ssvalue, PSTR("{\"ButtonRetain\":\"%s\"}"), getStateText(sysCfg.mqtt_button_retain)); snprintf_P(svalue, ssvalue, PSTR("{\"ButtonRetain\":\"%s\"}"), getStateText(sysCfg.mqtt_button_retain));
} }
else if (!strcmp(type,"SWITCHRETAIN")) { else if (!strcmp_P(type,PSTR("SWITCHRETAIN"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) {
strlcpy(sysCfg.button_topic, sysCfg.mqtt_topic, sizeof(sysCfg.button_topic)); strlcpy(sysCfg.button_topic, sysCfg.mqtt_topic, sizeof(sysCfg.button_topic));
if (!payload) { if (!payload) {
@ -776,7 +780,7 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf,
} }
snprintf_P(svalue, ssvalue, PSTR("{\"SwitchRetain\":\"%s\"}"), getStateText(sysCfg.mqtt_switch_retain)); snprintf_P(svalue, ssvalue, PSTR("{\"SwitchRetain\":\"%s\"}"), getStateText(sysCfg.mqtt_switch_retain));
} }
else if (!strcmp(type,"POWERRETAIN")) { else if (!strcmp_P(type,PSTR("POWERRETAIN"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) {
if (!payload) { if (!payload) {
for(i = 1; i <= Maxdevice; i++) { // Clear MQTT retain in broker for(i = 1; i <= Maxdevice; i++) { // Clear MQTT retain in broker
@ -897,50 +901,50 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
int16_t payload = atoi(dataBuf); // -32766 - 32767 int16_t payload = atoi(dataBuf); // -32766 - 32767
uint16_t payload16 = atoi(dataBuf); // 0 - 65535 uint16_t payload16 = atoi(dataBuf); // 0 - 65535
if (!strcmp(dataBufUc,"OFF") || !strcmp(dataBufUc,"FALSE") || !strcmp(dataBufUc,"STOP")) { if (!strcmp_P(dataBufUc,PSTR("OFF")) || !strcmp_P(dataBufUc,PSTR("FALSE")) || !strcmp_P(dataBufUc,PSTR("STOP"))) {
payload = 0; payload = 0;
} }
if (!strcmp(dataBufUc,"ON") || !strcmp(dataBufUc,"TRUE") || !strcmp(dataBufUc,"START") || !strcmp(dataBufUc,"USER")) { if (!strcmp_P(dataBufUc,PSTR("ON")) || !strcmp_P(dataBufUc,PSTR("TRUE")) || !strcmp_P(dataBufUc,PSTR("START")) || !strcmp_P(dataBufUc,PSTR("USER"))) {
payload = 1; payload = 1;
} }
if (!strcmp(dataBufUc,"TOGGLE") || !strcmp(dataBufUc,"ADMIN")) { if (!strcmp_P(dataBufUc,PSTR("TOGGLE")) || !strcmp_P(dataBufUc,PSTR("ADMIN"))) {
payload = 2; payload = 2;
} }
if (!strcmp(dataBufUc,"BLINK")) { if (!strcmp_P(dataBufUc,PSTR("BLINK"))) {
payload = 3; payload = 3;
} }
if (!strcmp(dataBufUc,"BLINKOFF")) { if (!strcmp_P(dataBufUc,PSTR("BLINKOFF"))) {
payload = 4; payload = 4;
} }
if (!strcmp(type,"POWER") && (index > 0) && (index <= Maxdevice)) { if (!strcmp_P(type,PSTR("POWER")) && (index > 0) && (index <= Maxdevice)) {
if ((0 == data_len) || (payload > 4)) { if ((0 == data_len) || (payload > 4)) {
payload = 9; payload = 9;
} }
do_cmnd_power(index, payload); do_cmnd_power(index, payload);
return; return;
} }
else if (!strcmp(type,"STATUS")) { else if (!strcmp_P(type,PSTR("STATUS"))) {
if ((0 == data_len) || (payload < 0) || (payload > MAX_STATUS)) { if ((0 == data_len) || (payload < 0) || (payload > MAX_STATUS)) {
payload = 99; payload = 99;
} }
publish_status(payload); publish_status(payload);
return; return;
} }
else if ((sysCfg.module != MOTOR) && !strcmp(type,"POWERONSTATE")) { else if ((sysCfg.module != MOTOR) && !strcmp_P(type,PSTR("POWERONSTATE"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 3)) { if ((data_len > 0) && (payload >= 0) && (payload <= 3)) {
sysCfg.poweronstate = payload; sysCfg.poweronstate = payload;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"PowerOnState\":%d}"), sysCfg.poweronstate); snprintf_P(svalue, sizeof(svalue), PSTR("{\"PowerOnState\":%d}"), sysCfg.poweronstate);
} }
else if (!strcmp(type,"PULSETIME") && (index > 0) && (index <= MAX_PULSETIMERS)) { else if (!strcmp_P(type,PSTR("PULSETIME")) && (index > 0) && (index <= MAX_PULSETIMERS)) {
if (data_len > 0) { if (data_len > 0) {
sysCfg.pulsetime[index -1] = payload16; // 0 - 65535 sysCfg.pulsetime[index -1] = payload16; // 0 - 65535
pulse_timer[index -1] = 0; pulse_timer[index -1] = 0;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"PulseTime%d\":%d}"), index, sysCfg.pulsetime[index -1]); snprintf_P(svalue, sizeof(svalue), PSTR("{\"PulseTime%d\":%d}"), index, sysCfg.pulsetime[index -1]);
} }
else if (!strcmp(type,"BLINKTIME")) { else if (!strcmp_P(type,PSTR("BLINKTIME"))) {
if ((data_len > 0) && (payload > 2) && (payload <= 3600)) { if ((data_len > 0) && (payload > 2) && (payload <= 3600)) {
sysCfg.blinktime = payload; sysCfg.blinktime = payload;
if (blink_timer) { if (blink_timer) {
@ -949,7 +953,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"BlinkTime\":%d}"), sysCfg.blinktime); snprintf_P(svalue, sizeof(svalue), PSTR("{\"BlinkTime\":%d}"), sysCfg.blinktime);
} }
else if (!strcmp(type,"BLINKCOUNT")) { else if (!strcmp_P(type,PSTR("BLINKCOUNT"))) {
if (data_len > 0) { if (data_len > 0) {
sysCfg.blinkcount = payload16; // 0 - 65535 sysCfg.blinkcount = payload16; // 0 - 65535
if (blink_counter) { if (blink_counter) {
@ -961,7 +965,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
else if ((SONOFF_LED == sysCfg.module) && sl_command(type, index, dataBufUc, data_len, payload, svalue, sizeof(svalue))) { else if ((SONOFF_LED == sysCfg.module) && sl_command(type, index, dataBufUc, data_len, payload, svalue, sizeof(svalue))) {
// Serviced // Serviced
} }
else if (!strcmp(type,"SAVEDATA")) { else if (!strcmp_P(type,PSTR("SAVEDATA"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 3600)) { if ((data_len > 0) && (payload >= 0) && (payload <= 3600)) {
sysCfg.savedata = payload; sysCfg.savedata = payload;
savedatacounter = sysCfg.savedata; savedatacounter = sysCfg.savedata;
@ -975,32 +979,32 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SaveData\":\"%s\"}"), (sysCfg.savedata > 1) ? stemp1 : getStateText(sysCfg.savedata)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"SaveData\":\"%s\"}"), (sysCfg.savedata > 1) ? stemp1 : getStateText(sysCfg.savedata));
} }
else if (!strcmp(type,"SAVESTATE")) { else if (!strcmp_P(type,PSTR("SAVESTATE"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) {
sysCfg.savestate = payload; sysCfg.savestate = payload;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SaveState\":\"%s\"}"), getStateText(sysCfg.savestate)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"SaveState\":\"%s\"}"), getStateText(sysCfg.savestate));
} }
else if (!strcmp(type,"BUTTONRESTRICT")) { else if (!strcmp_P(type,PSTR("BUTTONRESTRICT"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) {
sysCfg.button_restrict = payload; sysCfg.button_restrict = payload;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"ButtonRestrict\":\"%s\"}"), getStateText(sysCfg.button_restrict)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"ButtonRestrict\":\"%s\"}"), getStateText(sysCfg.button_restrict));
} }
else if (!strcmp(type,"UNITS")) { else if (!strcmp_P(type,PSTR("UNITS"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) {
sysCfg.value_units = payload; sysCfg.value_units = payload;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Units\":\"%s\"}"), getStateText(sysCfg.value_units)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Units\":\"%s\"}"), getStateText(sysCfg.value_units));
} }
else if (!strcmp(type,"MQTT")) { else if (!strcmp_P(type,PSTR("MQTT"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) {
sysCfg.mqtt_enabled = payload; sysCfg.mqtt_enabled = payload;
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Mqtt\":\"%s\"}"), getStateText(sysCfg.mqtt_enabled)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Mqtt\":\"%s\"}"), getStateText(sysCfg.mqtt_enabled));
} }
else if (!strcmp(type,"MODULE")) { else if (!strcmp_P(type,PSTR("MODULE"))) {
if ((data_len > 0) && (payload > 0) && (payload <= MAXMODULE)) { if ((data_len > 0) && (payload > 0) && (payload <= MAXMODULE)) {
payload--; payload--;
byte new_modflg = (sysCfg.module != payload); byte new_modflg = (sysCfg.module != payload);
@ -1016,7 +1020,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
snprintf_P(stemp1, sizeof(stemp1), modules[sysCfg.module].name); snprintf_P(stemp1, sizeof(stemp1), modules[sysCfg.module].name);
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Module\":\"%d (%s)\"}"), sysCfg.module +1, stemp1); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Module\":\"%d (%s)\"}"), sysCfg.module +1, stemp1);
} }
else if (!strcmp(type,"MODULES")) { else if (!strcmp_P(type,PSTR("MODULES"))) {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Modules1\":\""), svalue); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Modules1\":\""), svalue);
byte jsflg = 0; byte jsflg = 0;
for (byte i = 0; i < MAXMODULE /2; i++) { for (byte i = 0; i < MAXMODULE /2; i++) {
@ -1041,7 +1045,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue); snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue);
} }
else if (!strcmp(type,"GPIO") && (index < MAX_GPIO_PIN)) { else if (!strcmp_P(type,PSTR("GPIO")) && (index < MAX_GPIO_PIN)) {
mytmplt cmodule; mytmplt cmodule;
memcpy_P(&cmodule, &modules[sysCfg.module], sizeof(cmodule)); memcpy_P(&cmodule, &modules[sysCfg.module], sizeof(cmodule));
if ((data_len > 0) && (GPIO_USER == cmodule.gp.io[index]) && (payload >= 0) && (payload < GPIO_SENSOR_END)) { if ((data_len > 0) && (GPIO_USER == cmodule.gp.io[index]) && (payload >= 0) && (payload < GPIO_SENSOR_END)) {
@ -1071,7 +1075,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
snprintf_P(svalue, sizeof(svalue), PSTR("{\"GPIO\":\"Not supported\"}")); snprintf_P(svalue, sizeof(svalue), PSTR("{\"GPIO\":\"Not supported\"}"));
} }
} }
else if (!strcmp(type,"GPIOS")) { else if (!strcmp_P(type,PSTR("GPIOS"))) {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"GPIOs1\":\""), svalue); snprintf_P(svalue, sizeof(svalue), PSTR("{\"GPIOs1\":\""), svalue);
byte jsflg = 0; byte jsflg = 0;
for (byte i = 0; i < GPIO_SENSOR_END /2; i++) { for (byte i = 0; i < GPIO_SENSOR_END /2; i++) {
@ -1096,7 +1100,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue); snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue);
} }
else if (!strcmp(type,"PWM") && (index > pwm_idxoffset) && (index <= 5)) { else if (!strcmp_P(type,PSTR("PWM")) && (index > pwm_idxoffset) && (index <= 5)) {
if ((data_len > 0) && (payload >= 0) && (payload <= PWM_RANGE) && (pin[GPIO_PWM1 + index -1] < 99)) { if ((data_len > 0) && (payload >= 0) && (payload <= PWM_RANGE) && (pin[GPIO_PWM1 + index -1] < 99)) {
sysCfg.pwmvalue[index -1] = payload; sysCfg.pwmvalue[index -1] = payload;
analogWrite(pin[GPIO_PWM1 + index -1], payload); analogWrite(pin[GPIO_PWM1 + index -1], payload);
@ -1111,7 +1115,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("%s}}"),svalue); snprintf_P(svalue, sizeof(svalue), PSTR("%s}}"),svalue);
} }
else if (!strcmp(type,"SLEEP")) { else if (!strcmp_P(type,PSTR("SLEEP"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 251)) { if ((data_len > 0) && (payload >= 0) && (payload < 251)) {
if ((!sysCfg.sleep && payload) || (sysCfg.sleep && !payload)) { if ((!sysCfg.sleep && payload) || (sysCfg.sleep && !payload)) {
restartflag = 2; restartflag = 2;
@ -1121,7 +1125,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Sleep\":\"%d%s (%d%s)\"}"), sleep, (sysCfg.value_units) ? " mS" : "", sysCfg.sleep, (sysCfg.value_units) ? " mS" : ""); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Sleep\":\"%d%s (%d%s)\"}"), sleep, (sysCfg.value_units) ? " mS" : "", sysCfg.sleep, (sysCfg.value_units) ? " mS" : "");
} }
else if (!strcmp(type,"FLASHMODE")) { // 0 = QIO, 1 = QOUT, 2 = DIO, 3 = DOUT else if (!strcmp_P(type,PSTR("FLASHMODE"))) { // 0 = QIO, 1 = QOUT, 2 = DIO, 3 = DOUT
if ((data_len > 0) && (payload >= 0) && (payload <= 3)) { if ((data_len > 0) && (payload >= 0) && (payload <= 3)) {
if (ESP.getFlashChipMode() != payload) { if (ESP.getFlashChipMode() != payload) {
setFlashMode(0, payload &3); setFlashMode(0, payload &3);
@ -1129,7 +1133,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"FlashMode\":%d}"), ESP.getFlashChipMode()); snprintf_P(svalue, sizeof(svalue), PSTR("{\"FlashMode\":%d}"), ESP.getFlashChipMode());
} }
else if (!strcmp(type,"UPGRADE") || !strcmp(type,"UPLOAD")) { else if (!strcmp_P(type,PSTR("UPGRADE")) || !strcmp_P(type,PSTR("UPLOAD"))) {
if ((data_len > 0) && (1 == payload)) { if ((data_len > 0) && (1 == payload)) {
otaflag = 3; otaflag = 3;
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Upgrade\":\"Version %s from %s\"}"), Version, sysCfg.otaUrl); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Upgrade\":\"Version %s from %s\"}"), Version, sysCfg.otaUrl);
@ -1137,12 +1141,12 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Upgrade\":\"Option 1 to upgrade\"}")); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Upgrade\":\"Option 1 to upgrade\"}"));
} }
} }
else if (!strcmp(type,"OTAURL")) { else if (!strcmp_P(type,PSTR("OTAURL"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.otaUrl))) if ((data_len > 0) && (data_len < sizeof(sysCfg.otaUrl)))
strlcpy(sysCfg.otaUrl, (1 == payload) ? OTA_URL : dataBuf, sizeof(sysCfg.otaUrl)); strlcpy(sysCfg.otaUrl, (1 == payload) ? OTA_URL : dataBuf, sizeof(sysCfg.otaUrl));
snprintf_P(svalue, sizeof(svalue), PSTR("{\"OtaUrl\":\"%s\"}"), sysCfg.otaUrl); snprintf_P(svalue, sizeof(svalue), PSTR("{\"OtaUrl\":\"%s\"}"), sysCfg.otaUrl);
} }
else if (!strcmp(type,"SERIALLOG")) { else if (!strcmp_P(type,PSTR("SERIALLOG"))) {
if ((data_len > 0) && (payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { if ((data_len > 0) && (payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) {
sysCfg.seriallog_level = payload; sysCfg.seriallog_level = payload;
seriallog_level = payload; seriallog_level = payload;
@ -1150,7 +1154,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SerialLog\":\"%d (Active %d)\"}"), sysCfg.seriallog_level, seriallog_level); snprintf_P(svalue, sizeof(svalue), PSTR("{\"SerialLog\":\"%d (Active %d)\"}"), sysCfg.seriallog_level, seriallog_level);
} }
else if (!strcmp(type,"SYSLOG")) { else if (!strcmp_P(type,PSTR("SYSLOG"))) {
if ((data_len > 0) && (payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { if ((data_len > 0) && (payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) {
sysCfg.syslog_level = payload; sysCfg.syslog_level = payload;
syslog_level = (sysCfg.emulation) ? 0 : payload; syslog_level = (sysCfg.emulation) ? 0 : payload;
@ -1158,19 +1162,19 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SysLog\":\"%d (Active %d)\"}"), sysCfg.syslog_level, syslog_level); snprintf_P(svalue, sizeof(svalue), PSTR("{\"SysLog\":\"%d (Active %d)\"}"), sysCfg.syslog_level, syslog_level);
} }
else if (!strcmp(type,"LOGHOST")) { else if (!strcmp_P(type,PSTR("LOGHOST"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.syslog_host))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.syslog_host))) {
strlcpy(sysCfg.syslog_host, (1 == payload) ? SYS_LOG_HOST : dataBuf, sizeof(sysCfg.syslog_host)); strlcpy(sysCfg.syslog_host, (1 == payload) ? SYS_LOG_HOST : dataBuf, sizeof(sysCfg.syslog_host));
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"LogHost\":\"%s\"}"), sysCfg.syslog_host); snprintf_P(svalue, sizeof(svalue), PSTR("{\"LogHost\":\"%s\"}"), sysCfg.syslog_host);
} }
else if (!strcmp(type,"LOGPORT")) { else if (!strcmp_P(type,PSTR("LOGPORT"))) {
if ((data_len > 0) && (payload > 0) && (payload < 32766)) { if ((data_len > 0) && (payload > 0) && (payload < 32766)) {
sysCfg.syslog_port = (1 == payload) ? SYS_LOG_PORT : payload; sysCfg.syslog_port = (1 == payload) ? SYS_LOG_PORT : payload;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"LogPort\":%d}"), sysCfg.syslog_port); snprintf_P(svalue, sizeof(svalue), PSTR("{\"LogPort\":%d}"), sysCfg.syslog_port);
} }
else if (!strcmp(type,"IPADDRESS") && (index > 0) && (index <= 4)) { else if (!strcmp_P(type,PSTR("IPADDRESS")) && (index > 0) && (index <= 4)) {
if (parseIP(&address, dataBuf)) { if (parseIP(&address, dataBuf)) {
sysCfg.ip_address[index -1] = address; sysCfg.ip_address[index -1] = address;
// restartflag = 2; // restartflag = 2;
@ -1178,7 +1182,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
snprintf_P(stemp1, sizeof(stemp1), PSTR(" (%s)"), WiFi.localIP().toString().c_str()); snprintf_P(stemp1, sizeof(stemp1), PSTR(" (%s)"), WiFi.localIP().toString().c_str());
snprintf_P(svalue, sizeof(svalue), PSTR("{\"IPAddress%d\":\"%s%s\"}"), index, IPAddress(sysCfg.ip_address[index -1]).toString().c_str(), (1 == index) ? stemp1:""); snprintf_P(svalue, sizeof(svalue), PSTR("{\"IPAddress%d\":\"%s%s\"}"), index, IPAddress(sysCfg.ip_address[index -1]).toString().c_str(), (1 == index) ? stemp1:"");
} }
else if (!strcmp(type,"NTPSERVER") && (index > 0) && (index <= 3)) { else if (!strcmp_P(type,PSTR("NTPSERVER")) && (index > 0) && (index <= 3)) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.ntp_server[0]))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.ntp_server[0]))) {
strlcpy(sysCfg.ntp_server[index -1], (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? (1==index)?NTP_SERVER1:(2==index)?NTP_SERVER2:NTP_SERVER3 : dataBuf, sizeof(sysCfg.ntp_server[0])); strlcpy(sysCfg.ntp_server[index -1], (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? (1==index)?NTP_SERVER1:(2==index)?NTP_SERVER2:NTP_SERVER3 : dataBuf, sizeof(sysCfg.ntp_server[0]));
for (i = 0; i < strlen(sysCfg.ntp_server[index -1]); i++) { for (i = 0; i < strlen(sysCfg.ntp_server[index -1]); i++) {
@ -1190,7 +1194,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"NtpServer%d\":\"%s\"}"), index, sysCfg.ntp_server[index -1]); snprintf_P(svalue, sizeof(svalue), PSTR("{\"NtpServer%d\":\"%s\"}"), index, sysCfg.ntp_server[index -1]);
} }
else if (!strcmp(type,"AP")) { else if (!strcmp_P(type,PSTR("AP"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 2)) { if ((data_len > 0) && (payload >= 0) && (payload <= 2)) {
switch (payload) { switch (payload) {
case 0: // Toggle case 0: // Toggle
@ -1204,7 +1208,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Ap\":\"%d (%s)\"}"), sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active]); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Ap\":\"%d (%s)\"}"), sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active]);
} }
else if (!strcmp(type,"SSID") && (index > 0) && (index <= 2)) { else if (!strcmp_P(type,PSTR("SSID")) && (index > 0) && (index <= 2)) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.sta_ssid[0]))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.sta_ssid[0]))) {
strlcpy(sysCfg.sta_ssid[index -1], (1 == payload) ? (1 == index) ? STA_SSID1 : STA_SSID2 : dataBuf, sizeof(sysCfg.sta_ssid[0])); strlcpy(sysCfg.sta_ssid[index -1], (1 == payload) ? (1 == index) ? STA_SSID1 : STA_SSID2 : dataBuf, sizeof(sysCfg.sta_ssid[0]));
sysCfg.sta_active = 0; sysCfg.sta_active = 0;
@ -1212,7 +1216,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SSid%d\":\"%s\"}"), index, sysCfg.sta_ssid[index -1]); snprintf_P(svalue, sizeof(svalue), PSTR("{\"SSid%d\":\"%s\"}"), index, sysCfg.sta_ssid[index -1]);
} }
else if (!strcmp(type,"PASSWORD") && (index > 0) && (index <= 2)) { else if (!strcmp_P(type,PSTR("PASSWORD")) && (index > 0) && (index <= 2)) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.sta_pwd[0]))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.sta_pwd[0]))) {
strlcpy(sysCfg.sta_pwd[index -1], (1 == payload) ? (1 == index) ? STA_PASS1 : STA_PASS2 : dataBuf, sizeof(sysCfg.sta_pwd[0])); strlcpy(sysCfg.sta_pwd[index -1], (1 == payload) ? (1 == index) ? STA_PASS1 : STA_PASS2 : dataBuf, sizeof(sysCfg.sta_pwd[0]));
sysCfg.sta_active = 0; sysCfg.sta_active = 0;
@ -1220,7 +1224,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Password%d\":\"%s\"}"), index, sysCfg.sta_pwd[index -1]); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Password%d\":\"%s\"}"), index, sysCfg.sta_pwd[index -1]);
} }
else if (!grpflg && !strcmp(type,"HOSTNAME")) { else if (!grpflg && !strcmp_P(type,PSTR("HOSTNAME"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.hostname))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.hostname))) {
strlcpy(sysCfg.hostname, (1 == payload) ? WIFI_HOSTNAME : dataBuf, sizeof(sysCfg.hostname)); strlcpy(sysCfg.hostname, (1 == payload) ? WIFI_HOSTNAME : dataBuf, sizeof(sysCfg.hostname));
if (strstr(sysCfg.hostname,"%")) { if (strstr(sysCfg.hostname,"%")) {
@ -1230,7 +1234,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Hostname\":\"%s\"}"), sysCfg.hostname); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Hostname\":\"%s\"}"), sysCfg.hostname);
} }
else if (!strcmp(type,"WIFICONFIG")) { else if (!strcmp_P(type,PSTR("WIFICONFIG"))) {
if ((data_len > 0) && (payload >= WIFI_RESTART) && (payload < MAX_WIFI_OPTION)) { if ((data_len > 0) && (payload >= WIFI_RESTART) && (payload < MAX_WIFI_OPTION)) {
sysCfg.sta_config = payload; sysCfg.sta_config = payload;
wificheckflag = sysCfg.sta_config; wificheckflag = sysCfg.sta_config;
@ -1245,7 +1249,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
snprintf_P(svalue, sizeof(svalue), PSTR("{\"WifiConfig\":\"%d (%s)\"}"), sysCfg.sta_config, stemp1); snprintf_P(svalue, sizeof(svalue), PSTR("{\"WifiConfig\":\"%d (%s)\"}"), sysCfg.sta_config, stemp1);
} }
} }
else if (!strcmp(type,"FRIENDLYNAME") && (index > 0) && (index <= 4)) { else if (!strcmp_P(type,PSTR("FRIENDLYNAME")) && (index > 0) && (index <= 4)) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.friendlyname[0]))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.friendlyname[0]))) {
if (1 == index) { if (1 == index) {
snprintf_P(stemp1, sizeof(stemp1), PSTR(FRIENDLY_NAME)); snprintf_P(stemp1, sizeof(stemp1), PSTR(FRIENDLY_NAME));
@ -1256,14 +1260,14 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"FriendlyName%d\":\"%s\"}"), index, sysCfg.friendlyname[index -1]); snprintf_P(svalue, sizeof(svalue), PSTR("{\"FriendlyName%d\":\"%s\"}"), index, sysCfg.friendlyname[index -1]);
} }
else if (swt_flg && !strcmp(type,"SWITCHMODE") && (index > 0) && (index <= 4)) { else if (swt_flg && !strcmp_P(type,PSTR("SWITCHMODE")) && (index > 0) && (index <= 4)) {
if ((data_len > 0) && (payload >= 0) && (payload < MAX_SWITCH_OPTION)) { if ((data_len > 0) && (payload >= 0) && (payload < MAX_SWITCH_OPTION)) {
sysCfg.switchmode[index -1] = payload; sysCfg.switchmode[index -1] = payload;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SwitchMode%d\":%d}"), index, sysCfg.switchmode[index-1]); snprintf_P(svalue, sizeof(svalue), PSTR("{\"SwitchMode%d\":%d}"), index, sysCfg.switchmode[index-1]);
} }
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
else if (!strcmp(type,"WEBSERVER")) { else if (!strcmp_P(type,PSTR("WEBSERVER"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 2)) { if ((data_len > 0) && (payload >= 0) && (payload <= 2)) {
sysCfg.webserver = payload; sysCfg.webserver = payload;
} }
@ -1274,20 +1278,20 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Webserver\":\"%s\"}"), getStateText(0)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Webserver\":\"%s\"}"), getStateText(0));
} }
} }
else if (!strcmp(type,"WEBPASSWORD")) { else if (!strcmp_P(type,PSTR("WEBPASSWORD"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.web_password))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.web_password))) {
strlcpy(sysCfg.web_password, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? WEB_PASSWORD : dataBuf, sizeof(sysCfg.web_password)); strlcpy(sysCfg.web_password, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? WEB_PASSWORD : dataBuf, sizeof(sysCfg.web_password));
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebPassword\":\"%s\"}"), sysCfg.web_password); snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebPassword\":\"%s\"}"), sysCfg.web_password);
} }
else if (!strcmp(type,"WEBLOG")) { else if (!strcmp_P(type,PSTR("WEBLOG"))) {
if ((data_len > 0) && (payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { if ((data_len > 0) && (payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) {
sysCfg.weblog_level = payload; sysCfg.weblog_level = payload;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebLog\":%d}"), sysCfg.weblog_level); snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebLog\":%d}"), sysCfg.weblog_level);
} }
#ifdef USE_EMULATION #ifdef USE_EMULATION
else if (!strcmp(type,"EMULATION")) { else if (!strcmp_P(type,PSTR("EMULATION"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 2)) { if ((data_len > 0) && (payload >= 0) && (payload <= 2)) {
sysCfg.emulation = payload; sysCfg.emulation = payload;
restartflag = 2; restartflag = 2;
@ -1296,7 +1300,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
#endif // USE_EMULATION #endif // USE_EMULATION
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
else if (!strcmp(type,"TELEPERIOD")) { else if (!strcmp_P(type,PSTR("TELEPERIOD"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.tele_period = (1 == payload) ? TELE_PERIOD : payload; sysCfg.tele_period = (1 == payload) ? TELE_PERIOD : payload;
if ((sysCfg.tele_period > 0) && (sysCfg.tele_period < 10)) { if ((sysCfg.tele_period > 0) && (sysCfg.tele_period < 10)) {
@ -1306,7 +1310,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"TelePeriod\":\"%d%s\"}"), sysCfg.tele_period, (sysCfg.value_units) ? " Sec" : ""); snprintf_P(svalue, sizeof(svalue), PSTR("{\"TelePeriod\":\"%d%s\"}"), sysCfg.tele_period, (sysCfg.value_units) ? " Sec" : "");
} }
else if (!strcmp(type,"RESTART")) { else if (!strcmp_P(type,PSTR("RESTART"))) {
switch (payload) { switch (payload) {
case 1: case 1:
restartflag = 2; restartflag = 2;
@ -1320,7 +1324,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Restart\":\"1 to restart\"}")); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Restart\":\"1 to restart\"}"));
} }
} }
else if (!strcmp(type,"RESET")) { else if (!strcmp_P(type,PSTR("RESET"))) {
switch (payload) { switch (payload) {
case 1: case 1:
restartflag = 211; restartflag = 211;
@ -1334,13 +1338,13 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Reset\":\"1 to reset\"}")); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Reset\":\"1 to reset\"}"));
} }
} }
else if (!strcmp(type,"TIMEZONE")) { else if (!strcmp_P(type,PSTR("TIMEZONE"))) {
if ((data_len > 0) && (((payload >= -12) && (payload <= 12)) || (99 == payload))) { if ((data_len > 0) && (((payload >= -12) && (payload <= 12)) || (99 == payload))) {
sysCfg.timezone = payload; sysCfg.timezone = payload;
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Timezone\":%d}"), sysCfg.timezone); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Timezone\":%d}"), sysCfg.timezone);
} }
else if (!strcmp(type,"LEDPOWER")) { else if (!strcmp_P(type,PSTR("LEDPOWER"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 2)) { if ((data_len > 0) && (payload >= 0) && (payload <= 2)) {
sysCfg.ledstate &= 8; sysCfg.ledstate &= 8;
switch (payload) { switch (payload) {
@ -1357,7 +1361,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"LedPower\":\"%s\"}"), getStateText(bitRead(sysCfg.ledstate, 3))); snprintf_P(svalue, sizeof(svalue), PSTR("{\"LedPower\":\"%s\"}"), getStateText(bitRead(sysCfg.ledstate, 3)));
} }
else if (!strcmp(type,"LEDSTATE")) { else if (!strcmp_P(type,PSTR("LEDSTATE"))) {
if ((data_len > 0) && (payload >= 0) && (payload < MAX_LED_OPTION)) { if ((data_len > 0) && (payload >= 0) && (payload < MAX_LED_OPTION)) {
sysCfg.ledstate = payload; sysCfg.ledstate = payload;
if (!sysCfg.ledstate) { if (!sysCfg.ledstate) {
@ -1366,7 +1370,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"LedState\":%d}"), sysCfg.ledstate); snprintf_P(svalue, sizeof(svalue), PSTR("{\"LedState\":%d}"), sysCfg.ledstate);
} }
else if (!strcmp(type,"CFGDUMP")) { else if (!strcmp_P(type,PSTR("CFGDUMP"))) {
CFG_Dump(); CFG_Dump();
snprintf_P(svalue, sizeof(svalue), PSTR("{\"CfgDump\":\"Done\"}")); snprintf_P(svalue, sizeof(svalue), PSTR("{\"CfgDump\":\"Done\"}"));
} }
@ -1377,7 +1381,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
// Serviced // Serviced
} }
#ifdef USE_I2C #ifdef USE_I2C
else if (i2c_flg && !strcmp(type,"I2CSCAN")) { else if (i2c_flg && !strcmp_P(type,PSTR("I2CSCAN"))) {
i2c_scan(svalue, sizeof(svalue)); i2c_scan(svalue, sizeof(svalue));
} }
#endif // USE_I2C #endif // USE_I2C
@ -1392,7 +1396,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
} }
#endif // USE_IR_REMOTE #endif // USE_IR_REMOTE
#ifdef DEBUG_THEO #ifdef DEBUG_THEO
else if (!strcmp(type,"EXCEPTION")) { else if (!strcmp_P(type,PSTR("EXCEPTION"))) {
if (data_len > 0) { if (data_len > 0) {
exception_tst(payload); exception_tst(payload);
} }
@ -2353,6 +2357,10 @@ void GPIO_init()
#endif // USE_IR_REMOTE #endif // USE_IR_REMOTE
} }
extern "C" {
extern struct rst_info resetInfo;
}
void setup() void setup()
{ {
char log[LOGSZ]; char log[LOGSZ];
@ -2413,29 +2421,29 @@ void setup()
if (MOTOR == sysCfg.module) { if (MOTOR == sysCfg.module) {
sysCfg.poweronstate = 1; // Needs always on else in limbo! sysCfg.poweronstate = 1; // Needs always on else in limbo!
} }
if (ESP.getResetReason() == "Power on") { if ((resetInfo.reason == REASON_DEFAULT_RST) || (resetInfo.reason == REASON_EXT_SYS_RST)) {
if (0 == sysCfg.poweronstate) { // All off if (0 == sysCfg.poweronstate) { // All off
power = 0; power = 0;
setRelay(power); setRelay(power);
} }
else if (1 == sysCfg.poweronstate) { // All on else if (1 == sysCfg.poweronstate) { // All on
power = ((0x00FF << Maxdevice) >> 8); power = (1 << Maxdevice) -1;
setRelay(power); setRelay(power);
} }
else if (2 == sysCfg.poweronstate) { // All saved state toggle else if (2 == sysCfg.poweronstate) { // All saved state toggle
power = (sysCfg.power & ((0x00FF << Maxdevice) >> 8)) ^ 0xFF; power = sysCfg.power & ((1 << Maxdevice) -1) ^ 0xFF;
if (sysCfg.savestate) { if (sysCfg.savestate) {
setRelay(power); setRelay(power);
} }
} }
else if (3 == sysCfg.poweronstate) { // All saved state else if (3 == sysCfg.poweronstate) { // All saved state
power = sysCfg.power & ((0x00FF << Maxdevice) >> 8); power = sysCfg.power & ((1 << Maxdevice) -1);
if (sysCfg.savestate) { if (sysCfg.savestate) {
setRelay(power); setRelay(power);
} }
} }
} else { } else {
power = sysCfg.power & ((0x00FF << Maxdevice) >> 8); power = sysCfg.power & ((1 << Maxdevice) -1);
if (sysCfg.savestate) { if (sysCfg.savestate) {
setRelay(power); setRelay(power);
} }

View File

@ -152,7 +152,7 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
if (!domoticz.success()) { if (!domoticz.success()) {
return 1; return 1;
} }
// if (strcmp(domoticz["dtype"],"Light/Switch")) { // if (strcmp_P(domoticz["dtype"],PSTR("Light/Switch"))) {
// return 1; // return 1;
// } // }
idx = domoticz["idx"]; idx = domoticz["idx"];
@ -210,47 +210,47 @@ boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16
{ {
boolean serviced = true; boolean serviced = true;
if (!strncmp(type,"DOMOTICZ",8)) { if (!strncmp_P(type,PSTR("DOMOTICZ"),8)) {
if (!strcmp(type +8,"INTOPIC")) { if (!strcmp_P(type +8,PSTR("INTOPIC"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.domoticz_in_topic))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.domoticz_in_topic))) {
strlcpy(sysCfg.domoticz_in_topic, (1 == payload) ? DOMOTICZ_IN_TOPIC : dataBuf, sizeof(sysCfg.domoticz_in_topic)); strlcpy(sysCfg.domoticz_in_topic, (1 == payload) ? DOMOTICZ_IN_TOPIC : dataBuf, sizeof(sysCfg.domoticz_in_topic));
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzInTopic\":\"%s\"}"), sysCfg.domoticz_in_topic); snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzInTopic\":\"%s\"}"), sysCfg.domoticz_in_topic);
} }
else if (!strcmp(type +8,"OUTTOPIC")) { else if (!strcmp_P(type +8,PSTR("OUTTOPIC"))) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.domoticz_out_topic))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.domoticz_out_topic))) {
strlcpy(sysCfg.domoticz_out_topic, (1 == payload) ? DOMOTICZ_OUT_TOPIC : dataBuf, sizeof(sysCfg.domoticz_out_topic)); strlcpy(sysCfg.domoticz_out_topic, (1 == payload) ? DOMOTICZ_OUT_TOPIC : dataBuf, sizeof(sysCfg.domoticz_out_topic));
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzOutTopic\":\"%s\"}"), sysCfg.domoticz_out_topic); snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzOutTopic\":\"%s\"}"), sysCfg.domoticz_out_topic);
} }
else if (!strcmp(type +8,"IDX") && (index > 0) && (index <= Maxdevice)) { else if (!strcmp_P(type +8,PSTR("IDX")) && (index > 0) && (index <= Maxdevice)) {
if ((data_len > 0) && (payload >= 0)) { if ((data_len > 0) && (payload >= 0)) {
sysCfg.domoticz_relay_idx[index -1] = payload; sysCfg.domoticz_relay_idx[index -1] = payload;
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzIdx%d\":%d}"), index, sysCfg.domoticz_relay_idx[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzIdx%d\":%d}"), index, sysCfg.domoticz_relay_idx[index -1]);
} }
else if (!strcmp(type +8,"KEYIDX") && (index > 0) && (index <= Maxdevice)) { else if (!strcmp_P(type +8,PSTR("KEYIDX")) && (index > 0) && (index <= Maxdevice)) {
if ((data_len > 0) && (payload >= 0)) { if ((data_len > 0) && (payload >= 0)) {
sysCfg.domoticz_key_idx[index -1] = payload; sysCfg.domoticz_key_idx[index -1] = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzKeyIdx%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzKeyIdx%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
} }
else if (!strcmp(type +8,"SWITCHIDX") && (index > 0) && (index <= Maxdevice)) { else if (!strcmp_P(type +8,PSTR("SWITCHIDX")) && (index > 0) && (index <= Maxdevice)) {
if ((data_len > 0) && (payload >= 0)) { if ((data_len > 0) && (payload >= 0)) {
sysCfg.domoticz_switch_idx[index -1] = payload; sysCfg.domoticz_switch_idx[index -1] = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzSwitchIdx%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzSwitchIdx%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
} }
else if (!strcmp(type +8,"SENSORIDX") && (index > 0) && (index <= DOMOTICZ_MAX_SENSORS)) { else if (!strcmp_P(type +8,PSTR("SENSORIDX")) && (index > 0) && (index <= DOMOTICZ_MAX_SENSORS)) {
if ((data_len > 0) && (payload >= 0)) { if ((data_len > 0) && (payload >= 0)) {
sysCfg.domoticz_sensor_idx[index -1] = payload; sysCfg.domoticz_sensor_idx[index -1] = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzSensorIdx%d\":%d}"), index, sysCfg.domoticz_sensor_idx[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzSensorIdx%d\":%d}"), index, sysCfg.domoticz_sensor_idx[index -1]);
} }
else if (!strcmp(type +8,"UPDATETIMER")) { else if (!strcmp_P(type +8,PSTR("UPDATETIMER"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.domoticz_update_timer = payload; sysCfg.domoticz_update_timer = payload;
} }

View File

@ -90,7 +90,7 @@ boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t da
// char log[LOGSZ]; // char log[LOGSZ];
if (!strcmp(type,"IRSEND")) { if (!strcmp_P(type,PSTR("IRSEND"))) {
if (data_len) { if (data_len) {
StaticJsonBuffer<128> jsonBuf; StaticJsonBuffer<128> jsonBuf;
JsonObject &ir_json = jsonBuf.parseObject(dataBufUc); JsonObject &ir_json = jsonBuf.parseObject(dataBufUc);
@ -102,13 +102,13 @@ boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t da
bits = ir_json["BITS"]; bits = ir_json["BITS"];
data = ir_json["DATA"]; data = ir_json["DATA"];
if (protocol && bits && data) { if (protocol && bits && data) {
if (!strcmp(protocol,"NEC")) irsend->sendNEC(data, bits); if (!strcmp_P(protocol,PSTR("NEC"))) irsend->sendNEC(data, bits);
else if (!strcmp(protocol,"SONY")) irsend->sendSony(data, bits); else if (!strcmp_P(protocol,PSTR("SONY"))) irsend->sendSony(data, bits);
else if (!strcmp(protocol,"RC5")) irsend->sendRC5(data, bits); else if (!strcmp_P(protocol,PSTR("RC5"))) irsend->sendRC5(data, bits);
else if (!strcmp(protocol,"RC6")) irsend->sendRC6(data, bits); else if (!strcmp_P(protocol,PSTR("RC6"))) irsend->sendRC6(data, bits);
else if (!strcmp(protocol,"DISH")) irsend->sendDISH(data, bits); else if (!strcmp_P(protocol,PSTR("DISH"))) irsend->sendDISH(data, bits);
else if (!strcmp(protocol,"JVC")) irsend->sendJVC(data, bits, 1); else if (!strcmp_P(protocol,PSTR("JVC"))) irsend->sendJVC(data, bits, 1);
else if (!strcmp(protocol,"SAMSUNG")) irsend->sendSAMSUNG(data, bits); else if (!strcmp_P(protocol,PSTR("SAMSUNG"))) irsend->sendSAMSUNG(data, bits);
else { else {
snprintf_P(svalue, ssvalue, PSTR("{\"IRSend\":\"Protocol not supported\"}")); snprintf_P(svalue, ssvalue, PSTR("{\"IRSend\":\"Protocol not supported\"}"));
} }
@ -120,7 +120,7 @@ boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t da
} }
} }
#ifdef USE_IR_HVAC #ifdef USE_IR_HVAC
else if (!strcmp(type,"IRHVAC")) { else if (!strcmp_P(type,PSTR("IRHVAC"))) {
if (data_len) { if (data_len) {
StaticJsonBuffer<164> jsonBufer; StaticJsonBuffer<164> jsonBufer;
JsonObject &root = jsonBufer.parseObject(dataBufUc); JsonObject &root = jsonBufer.parseObject(dataBufUc);
@ -138,10 +138,10 @@ boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t da
// HVAC_Vendor, HVAC_Power, HVAC_Mode, HVAC_FanMode, HVAC_Temp); // HVAC_Vendor, HVAC_Power, HVAC_Mode, HVAC_FanMode, HVAC_Temp);
// addLog(LOG_LEVEL_DEBUG, log); // addLog(LOG_LEVEL_DEBUG, log);
if (HVAC_Vendor == NULL || !strcmp(HVAC_Vendor,"TOSHIBA")) { if (HVAC_Vendor == NULL || !strcmp_P(HVAC_Vendor,PSTR("TOSHIBA"))) {
error = ir_hvac_toshiba(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp); error = ir_hvac_toshiba(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp);
} }
else if (!strcmp(HVAC_Vendor,"MITSUBISHI")) { else if (!strcmp_P(HVAC_Vendor,PSTR("MITSUBISHI"))) {
error = ir_hvac_mitsubishi(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp); error = ir_hvac_mitsubishi(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp);
} }
else error = true; else error = true;

View File

@ -183,7 +183,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
boolean serviced = true; boolean serviced = true;
boolean coldim = false; boolean coldim = false;
if (!strcmp(type,"COLOR")) { if (!strcmp_P(type,PSTR("COLOR"))) {
uint8_t my_color[5]; uint8_t my_color[5];
if (4 == data_len) { if (4 == data_len) {
char ccold[3], cwarm[3]; char ccold[3], cwarm[3];
@ -212,7 +212,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
snprintf_P(svalue, ssvalue, PSTR("{\"Color\":\"%04X\"}"), color); snprintf_P(svalue, ssvalue, PSTR("{\"Color\":\"%04X\"}"), color);
} }
} }
else if (!strcmp(type,"DIMMER")) { else if (!strcmp_P(type,PSTR("DIMMER"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 100)) { if ((data_len > 0) && (payload >= 0) && (payload <= 100)) {
sysCfg.led_dimmer[0] = payload; sysCfg.led_dimmer[0] = payload;
coldim = true; coldim = true;
@ -220,7 +220,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
snprintf_P(svalue, ssvalue, PSTR("{\"Dimmer\":%d}"), sysCfg.led_dimmer[0]); snprintf_P(svalue, ssvalue, PSTR("{\"Dimmer\":%d}"), sysCfg.led_dimmer[0]);
} }
} }
else if (!strcmp(type,"LEDTABLE")) { else if (!strcmp_P(type,PSTR("LEDTABLE"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 2)) { if ((data_len > 0) && (payload >= 0) && (payload <= 2)) {
switch (payload) { switch (payload) {
case 0: // Off case 0: // Off
@ -235,7 +235,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
} }
snprintf_P(svalue, ssvalue, PSTR("{\"LedTable\":\"%s\"}"), getStateText(sysCfg.led_table)); snprintf_P(svalue, ssvalue, PSTR("{\"LedTable\":\"%s\"}"), getStateText(sysCfg.led_table));
} }
else if (!strcmp(type,"FADE")) { else if (!strcmp_P(type,PSTR("FADE"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 2)) { if ((data_len > 0) && (payload >= 0) && (payload <= 2)) {
switch (payload) { switch (payload) {
case 0: // Off case 0: // Off
@ -249,20 +249,20 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Fade\":\"%s\"}"), getStateText(sysCfg.led_fade)); snprintf_P(svalue, ssvalue, PSTR("{\"Fade\":\"%s\"}"), getStateText(sysCfg.led_fade));
} }
else if (!strcmp(type,"SPEED")) { // 1 - fast, 8 - slow else if (!strcmp_P(type,PSTR("SPEED"))) { // 1 - fast, 8 - slow
if ((data_len > 0) && (payload > 0) && (payload <= 8)) { if ((data_len > 0) && (payload > 0) && (payload <= 8)) {
sysCfg.led_speed = payload; sysCfg.led_speed = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Speed\":%d}"), sysCfg.led_speed); snprintf_P(svalue, ssvalue, PSTR("{\"Speed\":%d}"), sysCfg.led_speed);
} }
else if (!strcmp(type,"WAKEUPDURATION")) { else if (!strcmp_P(type,PSTR("WAKEUPDURATION"))) {
if ((data_len > 0) && (payload > 0) && (payload < 3601)) { if ((data_len > 0) && (payload > 0) && (payload < 3601)) {
sysCfg.led_wakeup = payload; sysCfg.led_wakeup = payload;
sl_wakeupActive = 0; sl_wakeupActive = 0;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"WakeUpDuration\":%d}"), sysCfg.led_wakeup); snprintf_P(svalue, ssvalue, PSTR("{\"WakeUpDuration\":%d}"), sysCfg.led_wakeup);
} }
else if (!strcmp(type,"WAKEUP")) { else if (!strcmp_P(type,PSTR("WAKEUP"))) {
do_cmnd_power(index, 1); do_cmnd_power(index, 1);
sl_wakeupActive = 1; sl_wakeupActive = 1;
snprintf_P(svalue, ssvalue, PSTR("{\"Wakeup\":\"Started\"}")); snprintf_P(svalue, ssvalue, PSTR("{\"Wakeup\":\"Started\"}"));

View File

@ -91,7 +91,7 @@ void sc_rcvstat(char *rcvstat)
Serial.write("AT+SEND=fail\e"); Serial.write("AT+SEND=fail\e");
} }
} }
else if (!strcmp(rcvstat,"AT+STATUS?")) { else if (!strcmp_P(rcvstat,PSTR("AT+STATUS?"))) {
Serial.write("AT+STATUS=4\e"); Serial.write("AT+STATUS=4\e");
} }
} }
@ -118,7 +118,8 @@ void sc_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
dtostrf(t, 1, TEMP_RESOLUTION &3, stemp1); dtostrf(t, 1, TEMP_RESOLUTION &3, stemp1);
float h = sc_value[0]; float h = sc_value[0];
dtostrf(h, 1, HUMIDITY_RESOLUTION &3, stemp2); dtostrf(h, 1, HUMIDITY_RESOLUTION &3, stemp2);
snprintf_P(svalue, ssvalue, PSTR("%s, \"SC\":{\"Temperature\":%s, \"Humidity\":%s, \"Light\":%d, \"Noise\":%d, \"AirQuality\":%d}"), // snprintf_P(svalue, ssvalue, PSTR("%s, \"SC\":{\"Temperature\":%s, \"Humidity\":%s, \"Light\":%d, \"Noise\":%d, \"AirQuality\":%d}"),
snprintf_P(svalue, ssvalue, PSTR("%s, \"Temperature\":%s, \"Humidity\":%s, \"Light\":%d, \"Noise\":%d, \"AirQuality\":%d"),
svalue, stemp1, stemp2, sc_value[2], sc_value[3], sc_value[4]); svalue, stemp1, stemp2, sc_value[2], sc_value[3], sc_value[4]);
*djson = 1; *djson = 1;
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
@ -136,7 +137,7 @@ String sc_webPresent()
if (sc_value[0] > 0) { if (sc_value[0] > 0) {
char stemp[10]; char stemp[10];
char sensor[80]; char sensor[80];
char scstype[] = "SC"; char scstype[] = "";
float t = sc_value[1]; float t = sc_value[1];
if (TEMP_CONVERSION) { if (TEMP_CONVERSION) {

View File

@ -532,21 +532,21 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
{ {
boolean serviced = true; boolean serviced = true;
if (!strcmp(type,"PIXELS")) { if (!strcmp_P(type,PSTR("PIXELS"))) {
if ((data_len > 0) && (payload > 0) && (payload <= WS2812_MAX_LEDS)) { if ((data_len > 0) && (payload > 0) && (payload <= WS2812_MAX_LEDS)) {
sysCfg.ws_pixels = payload; sysCfg.ws_pixels = payload;
ws2812_pixels(); ws2812_pixels();
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Pixels\":%d}"), sysCfg.ws_pixels); snprintf_P(svalue, ssvalue, PSTR("{\"Pixels\":%d}"), sysCfg.ws_pixels);
} }
else if (!strcmp(type,"LED") && (index > 0) && (index <= sysCfg.ws_pixels)) { else if (!strcmp_P(type,PSTR("LED")) && (index > 0) && (index <= sysCfg.ws_pixels)) {
if (6 == data_len) { if (6 == data_len) {
// ws2812_setColor(index, dataBufUc); // ws2812_setColor(index, dataBufUc);
ws2812_setColor(index, dataBuf); ws2812_setColor(index, dataBuf);
} }
ws2812_getColor(index, svalue, ssvalue); ws2812_getColor(index, svalue, ssvalue);
} }
else if (!strcmp(type,"COLOR")) { else if (!strcmp_P(type,PSTR("COLOR"))) {
if (6 == data_len) { if (6 == data_len) {
// ws2812_setColor(0, dataBufUc); // ws2812_setColor(0, dataBufUc);
ws2812_setColor(0, dataBuf); ws2812_setColor(0, dataBuf);
@ -554,7 +554,7 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
} }
ws2812_getColor(0, svalue, ssvalue); ws2812_getColor(0, svalue, ssvalue);
} }
else if (!strcmp(type,"DIMMER")) { else if (!strcmp_P(type,PSTR("DIMMER"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 100)) { if ((data_len > 0) && (payload >= 0) && (payload <= 100)) {
sysCfg.ws_dimmer = payload; sysCfg.ws_dimmer = payload;
power = 1; power = 1;
@ -564,7 +564,7 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Dimmer\":%d}"), sysCfg.ws_dimmer); snprintf_P(svalue, ssvalue, PSTR("{\"Dimmer\":%d}"), sysCfg.ws_dimmer);
} }
else if (!strcmp(type,"LEDTABLE")) { else if (!strcmp_P(type,PSTR("LEDTABLE"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 2)) { if ((data_len > 0) && (payload >= 0) && (payload <= 2)) {
switch (payload) { switch (payload) {
case 0: // Off case 0: // Off
@ -579,7 +579,7 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
} }
snprintf_P(svalue, ssvalue, PSTR("{\"LedTable\":\"%s\"}"), getStateText(sysCfg.ws_ledtable)); snprintf_P(svalue, ssvalue, PSTR("{\"LedTable\":\"%s\"}"), getStateText(sysCfg.ws_ledtable));
} }
else if (!strcmp(type,"FADE")) { else if (!strcmp_P(type,PSTR("FADE"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 2)) { if ((data_len > 0) && (payload >= 0) && (payload <= 2)) {
switch (payload) { switch (payload) {
case 0: // Off case 0: // Off
@ -593,19 +593,19 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Fade\":\"%s\"}"), getStateText(sysCfg.ws_fade)); snprintf_P(svalue, ssvalue, PSTR("{\"Fade\":\"%s\"}"), getStateText(sysCfg.ws_fade));
} }
else if (!strcmp(type,"SPEED")) { // 1 - fast, 5 - slow else if (!strcmp_P(type,PSTR("SPEED"))) { // 1 - fast, 5 - slow
if ((data_len > 0) && (payload > 0) && (payload <= 5)) { if ((data_len > 0) && (payload > 0) && (payload <= 5)) {
sysCfg.ws_speed = payload; sysCfg.ws_speed = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Speed\":%d}"), sysCfg.ws_speed); snprintf_P(svalue, ssvalue, PSTR("{\"Speed\":%d}"), sysCfg.ws_speed);
} }
else if (!strcmp(type,"WIDTH")) { else if (!strcmp_P(type,PSTR("WIDTH"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 4)) { if ((data_len > 0) && (payload >= 0) && (payload <= 4)) {
sysCfg.ws_width = payload; sysCfg.ws_width = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Width\":%d}"), sysCfg.ws_width); snprintf_P(svalue, ssvalue, PSTR("{\"Width\":%d}"), sysCfg.ws_width);
} }
else if (!strcmp(type,"WAKEUP")) { else if (!strcmp_P(type,PSTR("WAKEUP"))) {
if ((data_len > 0) && (payload > 0) && (payload < 3601)) { if ((data_len > 0) && (payload > 0) && (payload < 3601)) {
sysCfg.ws_wakeup = payload; sysCfg.ws_wakeup = payload;
if (1 == sysCfg.ws_scheme) { if (1 == sysCfg.ws_scheme) {
@ -614,7 +614,7 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
} }
snprintf_P(svalue, ssvalue, PSTR("{\"WakeUp\":%d}"), sysCfg.ws_wakeup); snprintf_P(svalue, ssvalue, PSTR("{\"WakeUp\":%d}"), sysCfg.ws_wakeup);
} }
else if (!strcmp(type,"SCHEME")) { else if (!strcmp_P(type,PSTR("SCHEME"))) {
if ((data_len > 0) && (payload >= 0) && (payload <= 9)) { if ((data_len > 0) && (payload >= 0) && (payload <= 9)) {
sysCfg.ws_scheme = payload; sysCfg.ws_scheme = payload;
if (1 == sysCfg.ws_scheme) { if (1 == sysCfg.ws_scheme) {

View File

@ -437,105 +437,105 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
{ {
boolean serviced = true; boolean serviced = true;
if (!strcmp(type,"POWERLOW")) { if (!strcmp_P(type,PSTR("POWERLOW"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.hlw_pmin = payload; sysCfg.hlw_pmin = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"PowerLow\":\"%d%s\"}"), sysCfg.hlw_pmin, (sysCfg.value_units) ? " W" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"PowerLow\":\"%d%s\"}"), sysCfg.hlw_pmin, (sysCfg.value_units) ? " W" : "");
} }
else if (!strcmp(type,"POWERHIGH")) { else if (!strcmp_P(type,PSTR("POWERHIGH"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.hlw_pmax = payload; sysCfg.hlw_pmax = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"PowerHigh\":\"%d%s\"}"), sysCfg.hlw_pmax, (sysCfg.value_units) ? " W" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"PowerHigh\":\"%d%s\"}"), sysCfg.hlw_pmax, (sysCfg.value_units) ? " W" : "");
} }
else if (!strcmp(type,"VOLTAGELOW")) { else if (!strcmp_P(type,PSTR("VOLTAGELOW"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 501)) { if ((data_len > 0) && (payload >= 0) && (payload < 501)) {
sysCfg.hlw_umin = payload; sysCfg.hlw_umin = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"VoltageLow\":\"%d%s\"}"), sysCfg.hlw_umin, (sysCfg.value_units) ? " V" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"VoltageLow\":\"%d%s\"}"), sysCfg.hlw_umin, (sysCfg.value_units) ? " V" : "");
} }
else if (!strcmp(type,"VOLTAGEHIGH")) { else if (!strcmp_P(type,PSTR("VOLTAGEHIGH"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 501)) { if ((data_len > 0) && (payload >= 0) && (payload < 501)) {
sysCfg.hlw_umax = payload; sysCfg.hlw_umax = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("[\"VoltageHigh\":\"%d%s\"}"), sysCfg.hlw_umax, (sysCfg.value_units) ? " V" : ""); snprintf_P(svalue, ssvalue, PSTR("[\"VoltageHigh\":\"%d%s\"}"), sysCfg.hlw_umax, (sysCfg.value_units) ? " V" : "");
} }
else if (!strcmp(type,"CURRENTLOW")) { else if (!strcmp_P(type,PSTR("CURRENTLOW"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 16001)) { if ((data_len > 0) && (payload >= 0) && (payload < 16001)) {
sysCfg.hlw_imin = payload; sysCfg.hlw_imin = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"CurrentLow\":\"%d%s\"}"), sysCfg.hlw_imin, (sysCfg.value_units) ? " mA" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"CurrentLow\":\"%d%s\"}"), sysCfg.hlw_imin, (sysCfg.value_units) ? " mA" : "");
} }
else if (!strcmp(type,"CURRENTHIGH")) { else if (!strcmp_P(type,PSTR("CURRENTHIGH"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 16001)) { if ((data_len > 0) && (payload >= 0) && (payload < 16001)) {
sysCfg.hlw_imax = payload; sysCfg.hlw_imax = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"CurrentHigh\":\"%d%s\"}"), sysCfg.hlw_imax, (sysCfg.value_units) ? " mA" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"CurrentHigh\":\"%d%s\"}"), sysCfg.hlw_imax, (sysCfg.value_units) ? " mA" : "");
} }
else if (!strcmp(type,"HLWPCAL")) { else if (!strcmp_P(type,PSTR("HLWPCAL"))) {
if ((data_len > 0) && (payload > 0) && (payload < 32001)) { if ((data_len > 0) && (payload > 0) && (payload < 32001)) {
sysCfg.hlw_pcal = (payload > 9999) ? payload : HLW_PREF_PULSE; // 12530 sysCfg.hlw_pcal = (payload > 9999) ? payload : HLW_PREF_PULSE; // 12530
} }
snprintf_P(svalue, ssvalue, PSTR("(\"HlwPcal\":\"%d%s\"}"), sysCfg.hlw_pcal, (sysCfg.value_units) ? " uS" : ""); snprintf_P(svalue, ssvalue, PSTR("(\"HlwPcal\":\"%d%s\"}"), sysCfg.hlw_pcal, (sysCfg.value_units) ? " uS" : "");
} }
else if (!strcmp(type,"HLWUCAL")) { else if (!strcmp_P(type,PSTR("HLWUCAL"))) {
if ((data_len > 0) && (payload > 0) && (payload < 32001)) { if ((data_len > 0) && (payload > 0) && (payload < 32001)) {
sysCfg.hlw_ucal = (payload > 999) ? payload : HLW_UREF_PULSE; // 1950 sysCfg.hlw_ucal = (payload > 999) ? payload : HLW_UREF_PULSE; // 1950
} }
snprintf_P(svalue, ssvalue, PSTR("{\"HlwUcal\":\"%d%s\"}"), sysCfg.hlw_ucal, (sysCfg.value_units) ? " uS" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"HlwUcal\":\"%d%s\"}"), sysCfg.hlw_ucal, (sysCfg.value_units) ? " uS" : "");
} }
else if (!strcmp(type,"HLWICAL")) { else if (!strcmp_P(type,PSTR("HLWICAL"))) {
if ((data_len > 0) && (payload > 0) && (payload < 32001)) { if ((data_len > 0) && (payload > 0) && (payload < 32001)) {
sysCfg.hlw_ical = (payload > 2499) ? payload : HLW_IREF_PULSE; // 3500 sysCfg.hlw_ical = (payload > 2499) ? payload : HLW_IREF_PULSE; // 3500
} }
snprintf_P(svalue, ssvalue, PSTR("{\"HlwIcal\":\"%d%s\"}"), sysCfg.hlw_ical, (sysCfg.value_units) ? " uS" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"HlwIcal\":\"%d%s\"}"), sysCfg.hlw_ical, (sysCfg.value_units) ? " uS" : "");
} }
#if FEATURE_POWER_LIMIT #if FEATURE_POWER_LIMIT
else if (!strcmp(type,"MAXPOWER")) { else if (!strcmp_P(type,PSTR("MAXPOWER"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mpl = payload; sysCfg.hlw_mpl = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxPower\":\"%d%s\"}"), sysCfg.hlw_mpl, (sysCfg.value_units) ? " W" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"MaxPower\":\"%d%s\"}"), sysCfg.hlw_mpl, (sysCfg.value_units) ? " W" : "");
} }
else if (!strcmp(type,"MAXPOWERHOLD")) { else if (!strcmp_P(type,PSTR("MAXPOWERHOLD"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mplh = (1 == payload) ? MAX_POWER_HOLD : payload; sysCfg.hlw_mplh = (1 == payload) ? MAX_POWER_HOLD : payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxPowerHold\":\"%d%s\"}"), sysCfg.hlw_mplh, (sysCfg.value_units) ? " Sec" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"MaxPowerHold\":\"%d%s\"}"), sysCfg.hlw_mplh, (sysCfg.value_units) ? " Sec" : "");
} }
else if (!strcmp(type,"MAXPOWERWINDOW")) { else if (!strcmp_P(type,PSTR("MAXPOWERWINDOW"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mplw = (1 == payload) ? MAX_POWER_WINDOW : payload; sysCfg.hlw_mplw = (1 == payload) ? MAX_POWER_WINDOW : payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxPowerWindow\":\"%d%s\"}"), sysCfg.hlw_mplw, (sysCfg.value_units) ? " Sec" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"MaxPowerWindow\":\"%d%s\"}"), sysCfg.hlw_mplw, (sysCfg.value_units) ? " Sec" : "");
} }
else if (!strcmp(type,"SAFEPOWER")) { else if (!strcmp_P(type,PSTR("SAFEPOWER"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mspl = payload; sysCfg.hlw_mspl = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"SafePower\":\"%d%s\"}"), sysCfg.hlw_mspl, (sysCfg.value_units) ? " W" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"SafePower\":\"%d%s\"}"), sysCfg.hlw_mspl, (sysCfg.value_units) ? " W" : "");
} }
else if (!strcmp(type,"SAFEPOWERHOLD")) { else if (!strcmp_P(type,PSTR("SAFEPOWERHOLD"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.hlw_msplh = (1 == payload) ? SAFE_POWER_HOLD : payload; sysCfg.hlw_msplh = (1 == payload) ? SAFE_POWER_HOLD : payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"SafePowerHold\":\"%d%s\"}"), sysCfg.hlw_msplh, (sysCfg.value_units) ? " Sec" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"SafePowerHold\":\"%d%s\"}"), sysCfg.hlw_msplh, (sysCfg.value_units) ? " Sec" : "");
} }
else if (!strcmp(type,"SAFEPOWERWINDOW")) { else if (!strcmp_P(type,PSTR("SAFEPOWERWINDOW"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 1440)) { if ((data_len > 0) && (payload >= 0) && (payload < 1440)) {
sysCfg.hlw_msplw = (1 == payload) ? SAFE_POWER_WINDOW : payload; sysCfg.hlw_msplw = (1 == payload) ? SAFE_POWER_WINDOW : payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"SafePowerWindow\":\"%d%s\"}"), sysCfg.hlw_msplw, (sysCfg.value_units) ? " Min" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"SafePowerWindow\":\"%d%s\"}"), sysCfg.hlw_msplw, (sysCfg.value_units) ? " Min" : "");
} }
else if (!strcmp(type,"MAXENERGY")) { else if (!strcmp_P(type,PSTR("MAXENERGY"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 3601)) { if ((data_len > 0) && (payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mkwh = payload; sysCfg.hlw_mkwh = payload;
hlw_mkwh_state = 3; hlw_mkwh_state = 3;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxEnergy\":\"%d%s\"}"), sysCfg.hlw_mkwh, (sysCfg.value_units) ? " Wh" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"MaxEnergy\":\"%d%s\"}"), sysCfg.hlw_mkwh, (sysCfg.value_units) ? " Wh" : "");
} }
else if (!strcmp(type,"MAXENERGYSTART")) { else if (!strcmp_P(type,PSTR("MAXENERGYSTART"))) {
if ((data_len > 0) && (payload >= 0) && (payload < 24)) { if ((data_len > 0) && (payload >= 0) && (payload < 24)) {
sysCfg.hlw_mkwhs = payload; sysCfg.hlw_mkwhs = payload;
} }