diff --git a/README.md b/README.md index e676f6d..f811ddd 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Sonoff-MQTT-OTA-Arduino Provide ESP8266 based itead Sonoff with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. -Current version is **3.1.15** - See ```sonoff/_releasenotes.ino``` for change information. +Current version is **3.1.16** - See ```sonoff/_releasenotes.ino``` for change information. Starting with version 2.0.0 the following devices are supported: Sonoff diff --git a/api/arduino/sonoff.ino.bin b/api/arduino/sonoff.ino.bin index 4dcfb1c..621601e 100644 Binary files a/api/arduino/sonoff.ino.bin and b/api/arduino/sonoff.ino.bin differ diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 9048a08..f211532 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,12 @@ -/* 3.1.15 20170108 +/* 3.1.16 20170109 + * Fix Domoticz possible error condition + * Remove Wifi password from connection message (#216) + * Add Configure Other menu item to web page (#209) + * Add command FriendlyName, field Friendly Name and define FRIENDLY_NAME to be used by Alexa + * eliminating current use of MQTT_CLIENT_ID (#209) + * Add friendlyname to webpage replacing former hostname + * + * 3.1.15 20170108 * Fix Domoticz send key regression with Toggle command * * 3.1.14 20170107 diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 86a4e71..85a68c5 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -10,7 +10,7 @@ * ==================================================== */ -#define VERSION 0x03010F00 // 3.1.15 +#define VERSION 0x03011000 // 3.1.16 #define SONOFF 1 // Sonoff, Sonoff RF, Sonoff SV, Sonoff Dual, Sonoff TH, S20 Smart Socket, 4 Channel #define SONOFF_POW 9 // Sonoff Pow @@ -429,7 +429,7 @@ void CFG_DefaultSet() sysCfg.model = 0; sysCfg.timezone = APP_TIMEZONE; strlcpy(sysCfg.otaUrl, OTA_URL, sizeof(sysCfg.otaUrl)); - strlcpy(sysCfg.friendlyname, MQTT_TOPIC, sizeof(sysCfg.friendlyname)); + strlcpy(sysCfg.friendlyname, FRIENDLY_NAME, sizeof(sysCfg.friendlyname)); sysCfg.seriallog_level = SERIAL_LOG_LEVEL; sysCfg.sta_active = 0; @@ -637,6 +637,9 @@ void CFG_Delta() sysCfg.blinktime = APP_BLINKTIME; sysCfg.blinkcount = APP_BLINKCOUNT; } + if (sysCfg.version < 0x03011000) { // 3.1.16 - Add parameter + getClient(sysCfg.friendlyname, sysCfg.mqtt_client, sizeof(sysCfg.friendlyname)); + } sysCfg.version = VERSION; } @@ -1012,23 +1015,32 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) unsigned long idx = 0; int16_t nvalue; - if (strlen(dataBuf) < 20) return; + if (data_len < 20) return; idx = getKeyIntValue(dataBuf,"\"idx\""); nvalue = getKeyIntValue(dataBuf,"\"nvalue\""); - dataBuf[0] = '\0'; + + snprintf_P(svalue, sizeof(svalue), PSTR("DMTZ: idx %d, nvalue %d"), idx, nvalue); + addLog(LOG_LEVEL_DEBUG_MORE, svalue); + + data_len = 0; if (nvalue == 0 || nvalue == 1) { for (i = 0; i < Maxdevice; i++) { - if (idx > 0 && idx == sysCfg.domoticz_relay_idx[i]) { + if ((idx > 0) && (idx == sysCfg.domoticz_relay_idx[i])) { snprintf_P(dataBuf, sizeof(dataBuf), PSTR("%d"), nvalue); + data_len = strlen(dataBuf); break; } } } - if (!strlen(dataBuf)) return; + if (!data_len) return; if (((power >> i) &1) == nvalue) return; snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1); snprintf_P(topicBuf, sizeof(topicBuf), PSTR("%s/%s/%s%s"), SUB_PREFIX, sysCfg.mqtt_topic, sysCfg.mqtt_subtopic, (Maxdevice > 1) ? stemp1 : ""); + + snprintf_P(svalue, sizeof(svalue), PSTR("DMTZ: Receive topic %s, data size %d, data %s"), topicBuf, data_len, dataBuf); + addLog(LOG_LEVEL_DEBUG_MORE, svalue); + domoticz_update_flag = 0; } #endif // USE_DOMOTICZ @@ -1266,6 +1278,12 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) snprintf_P(svalue, sizeof(svalue), PSTR("{\"WifiConfig\":\"%d (%s)\"}"), sysCfg.sta_config, stemp1); } } + else if (!strcmp(type,"FRIENDLYNAME")) { + if ((data_len > 0) && (data_len < sizeof(sysCfg.friendlyname))) { + strlcpy(sysCfg.friendlyname, (payload == 1) ? FRIENDLY_NAME : dataBuf, sizeof(sysCfg.friendlyname)); + } + snprintf_P(svalue, sizeof(svalue), PSTR("{\"FriendlyName\":\"%s\"}"), sysCfg.friendlyname); + } #ifdef USE_WALL_SWITCH else if (!strcmp(type,"SWITCHMODE")) { if ((data_len > 0) && (payload >= 0) && (payload < MAX_SWITCH_OPTION)) { @@ -1293,13 +1311,6 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebLog\":%d}"), sysCfg.weblog_level); } #endif // USE_WEBSERVER - else if (!grpflg && !strcmp(type,"MQTTCLIENT")) { // Also Alexa friendlyname - if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_client))) { - strlcpy(sysCfg.mqtt_client, (payload == 1) ? MQTT_CLIENT_ID : dataBuf, sizeof(sysCfg.mqtt_client)); - restartflag = 2; - } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"MqttClient\":\"%s\"}"), sysCfg.mqtt_client); - } else if (!strcmp(type,"MQTTUNITS")) { if ((data_len > 0) && (payload >= 0) && (payload <= 1)) { sysCfg.mqtt_units = payload; @@ -1330,6 +1341,13 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) snprintf_P(svalue, sizeof(svalue), PSTR("{\"MqttFingerprint\":\"%s\"}"), sysCfg.mqtt_fingerprint); } #endif + else if (!grpflg && !strcmp(type,"MQTTCLIENT")) { + if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_client))) { + strlcpy(sysCfg.mqtt_client, (payload == 1) ? MQTT_CLIENT_ID : dataBuf, sizeof(sysCfg.mqtt_client)); + restartflag = 2; + } + snprintf_P(svalue, sizeof(svalue), PSTR("{\"MqttClient\":\"%s\"}"), sysCfg.mqtt_client); + } else if (!strcmp(type,"MQTTUSER")) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_user))) { strlcpy(sysCfg.mqtt_user, (payload == 1) ? MQTT_USER : dataBuf, sizeof(sysCfg.mqtt_user)); diff --git a/sonoff/support.ino b/sonoff/support.ino index 437bca2..ffb01fe 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -430,8 +430,8 @@ void WIFI_begin(uint8_t flag) } // 3: Current AP if (strlen(sysCfg.sta_ssid[1]) == 0) sysCfg.sta_active = 0; WiFi.begin(sysCfg.sta_ssid[sysCfg.sta_active], sysCfg.sta_pwd[sysCfg.sta_active]); - snprintf_P(log, sizeof(log), PSTR("Wifi: Connecting to AP%d %s (%s) in mode 11%c as %s..."), - sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active], sysCfg.sta_pwd[sysCfg.sta_active], PhyMode[WiFi.getPhyMode() & 0x3], Hostname); + snprintf_P(log, sizeof(log), PSTR("Wifi: Connecting to AP%d %s in mode 11%c as %s..."), + sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active], PhyMode[WiFi.getPhyMode() & 0x3], Hostname); addLog(LOG_LEVEL_INFO, log); } diff --git a/sonoff/user_config.h b/sonoff/user_config.h index fe9e3f2..74be312 100644 --- a/sonoff/user_config.h +++ b/sonoff/user_config.h @@ -101,8 +101,9 @@ // -- HTTP ----------------------------------- #define USE_WEBSERVER // Enable web server and wifi manager (+43k code, +2k mem) - Disable by // -// #define USE_WEMO_EMULATION // Enable Belkin WeMo PowerSwitch emulation for Alexa (+4k code, +2k mem) + #define FRIENDLY_NAME "Sonoff" // [FriendlyName] Friendlyname up to 32 characters used by webpages and Alexa #define WEB_SERVER 2 // [WebServer] Web server (0 = Off, 1 = Start as User, 2 = Start as Admin) +// #define USE_WEMO_EMULATION // Enable Belkin WeMo PowerSwitch emulation for Alexa (+4k code, +2k mem) // -- mDNS ----------------------------------- #define USE_DISCOVERY // Enable mDNS for the following services (+8k code, +0.3k mem) diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index 9f9fd9f..8cf4e65 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -88,6 +88,7 @@ const char HTTP_HEAD[] PROGMEM = "" "
" "

" APP_NAME "

{h}

"; +// "

" APP_NAME "

{h}

({ha})

"; const char HTTP_MSG_RSTRT[] PROGMEM = "
Device will restart in a few seconds

"; const char HTTP_BTN_MENU1[] PROGMEM = @@ -99,13 +100,14 @@ const char HTTP_BTN_RSTRT[] PROGMEM = "
"; const char HTTP_BTN_MENU2[] PROGMEM = "
" - "
" #ifdef USE_MQTT + "
" #ifdef USE_DOMOTICZ "
" #endif // USE_DOMOTICZ #endif // USE_MQTT - "
" + "
" + "
" "
"; const char HTTP_BTN_MAIN[] PROGMEM = "

"; @@ -123,6 +125,7 @@ const char HTTP_FORM_WIFI[] PROGMEM = "
AP2 SSId (" STA_SSID2 ")

" "
AP2 Password

" "
Hostname ({h0})

"; +#ifdef USE_MQTT const char HTTP_FORM_MQTT[] PROGMEM = "
 MQTT parameters 
" "" @@ -133,7 +136,6 @@ const char HTTP_FORM_MQTT[] PROGMEM = // "
Password (" MQTT_PASS ")

" "
Password

" "
Topic (" MQTT_TOPIC ")

"; -#ifdef USE_MQTT #ifdef USE_DOMOTICZ const char HTTP_FORM_DOMOTICZ[] PROGMEM = "
 Domoticz parameters " @@ -145,33 +147,25 @@ const char HTTP_FORM_DOMOTICZ2[] PROGMEM = "
Update timer (" STR(DOMOTICZ_UPDATE_TIMER) ")

"; #endif // USE_DOMOTICZ #endif // USE_MQTT -const char HTTP_FORM_LOG[] PROGMEM = +const char HTTP_FORM_LOG1[] PROGMEM = "
 Logging parameters " - "" - "
Serial log level (" STR(SERIAL_LOG_LEVEL) ")
"; +const char HTTP_FORM_LOG2[] PROGMEM = + "
{b0} level ({b1})

" - "
Web log level (" STR(WEB_LOG_LEVEL) ")

" - "
Syslog level (" STR(SYS_LOG_LEVEL) ")

" + "
"; +const char HTTP_FORM_LOG3[] PROGMEM = "
Syslog host (" SYS_LOG_HOST ")

" "
Syslog port (" STR(SYS_LOG_PORT) ")

" "
Telemetric period (" STR(TELE_PERIOD) ")

"; +const char HTTP_FORM_OTHER[] PROGMEM = + "
 Other parameters " + "" + "
Friendly Name (" FRIENDLY_NAME ")

"; const char HTTP_FORM_END[] PROGMEM = "
"; const char HTTP_FORM_UPG[] PROGMEM = @@ -276,13 +270,14 @@ void startWebserver(int type, IPAddress ipweb) webServer->on("/cn", handleConfig); webServer->on("/w1", handleWifi1); webServer->on("/w0", handleWifi0); - webServer->on("/mq", handleMqtt); #ifdef USE_MQTT + webServer->on("/mq", handleMqtt); #ifdef USE_DOMOTICZ webServer->on("/dm", handleDomoticz); #endif // USE_DOMOTICZ #endif // USE_MQTT webServer->on("/lg", handleLog); + webServer->on("/co", handleOther); webServer->on("/sv", handleSave); webServer->on("/rt", handleReset); webServer->on("/up", handleUpgrade); @@ -351,7 +346,8 @@ void pollDnsWeb() void showPage(String &page) { - page.replace("{h}", Hostname); + page.replace("{h}", String(sysCfg.friendlyname)); + page.replace("{ha}", Hostname); if (_httpflag == HTTP_MANAGER) { if (WIFI_configCounter()) { page.replace("", ""); @@ -650,6 +646,7 @@ void handleWifi(boolean scan) showPage(page); } +#ifdef USE_MQTT void handleMqtt() { if (_httpflag == HTTP_USER) { @@ -675,7 +672,6 @@ void handleMqtt() showPage(page); } -#ifdef USE_MQTT #ifdef USE_DOMOTICZ void handleDomoticz() { @@ -722,12 +718,37 @@ void handleLog() String page = FPSTR(HTTP_HEAD); page.replace("{v}", "Config logging"); - page += FPSTR(HTTP_FORM_LOG); - for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) { - page.replace("{a" + String(i), (i == sysCfg.seriallog_level) ? " selected " : " "); - page.replace("{b" + String(i), (i == sysCfg.weblog_level) ? " selected " : " "); - page.replace("{c" + String(i), (i == sysCfg.syslog_level) ? " selected " : " "); + page += FPSTR(HTTP_FORM_LOG1); + for (byte idx = 0; idx < 3; idx++) { + page += FPSTR(HTTP_FORM_LOG2); + switch (idx) { + case 0: + page.replace("{b0}", "Serial log"); + page.replace("{b1}", STR(SERIAL_LOG_LEVEL)); + page.replace("{b2}", "ls"); + for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) { + page.replace("{a" + String(i), (i == sysCfg.seriallog_level) ? " selected " : " "); + } + break; + case 1: + page.replace("{b0}", "Web log"); + page.replace("{b1}", STR(WEB_LOG_LEVEL)); + page.replace("{b2}", "lw"); + for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) { + page.replace("{a" + String(i), (i == sysCfg.weblog_level) ? " selected " : " "); + } + break; + case 2: + page.replace("{b0}", "Syslog"); + page.replace("{b1}", STR(SYS_LOG_LEVEL)); + page.replace("{b2}", "ll"); + for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) { + page.replace("{a" + String(i), (i == sysCfg.syslog_level) ? " selected " : " "); + } + break; + } } + page += FPSTR(HTTP_FORM_LOG3); page.replace("{l2}", String(sysCfg.syslog_host)); page.replace("{l3}", String(sysCfg.syslog_port)); page.replace("{l4}", String(sysCfg.tele_period)); @@ -736,6 +757,23 @@ void handleLog() showPage(page); } +void handleOther() +{ + if (_httpflag == HTTP_USER) { + handleRoot(); + return; + } + addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Handle other config")); + + String page = FPSTR(HTTP_HEAD); + page.replace("{v}", "Configure Other"); + page += FPSTR(HTTP_FORM_OTHER); + page.replace("{a1}", String(sysCfg.friendlyname)); + page += FPSTR(HTTP_FORM_END); + page += FPSTR(HTTP_BTN_CONF); + showPage(page); +} + void handleSave() { if (_httpflag == HTTP_USER) { @@ -803,6 +841,12 @@ void handleSave() break; #endif // USE_DOMOTICZ #endif // USE_MQTT + case 5: + strlcpy(sysCfg.friendlyname, (!strlen(webServer->arg("an").c_str())) ? FRIENDLY_NAME : webServer->arg("an").c_str(), sizeof(sysCfg.friendlyname)); + snprintf_P(log, sizeof(log), PSTR("HTTP: Other Friendly Name %s"), + sysCfg.friendlyname); + addLog(LOG_LEVEL_INFO, log); + break; } restart = (!strlen(webServer->arg("r").c_str())) ? 1 : atoi(webServer->arg("r").c_str()); @@ -1135,6 +1179,7 @@ void handleInfo() // page += F("
 Information "); page += F(""); page += F(""); + page += F(""); page += F(""); page += F(""); // page += F(""); @@ -1157,6 +1202,7 @@ void handleInfo() page += F(""); } page += F(""); +#ifdef USE_MQTT page += F(""); page += F(""); page += F(""); @@ -1164,6 +1210,9 @@ void handleInfo() // page += F(""); page += F(""); page += F(""); +#else + page += F(""); +#endif // USE_MQTT page += F(""); page += F(""); page += F(""); @@ -1223,7 +1272,8 @@ void handleUPnPsetup() addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Handle WeMo setup")); String setup_xml = FPSTR(WEMO_SETUP_XML); - setup_xml.replace("{x1}", String(MQTTClient)); +// setup_xml.replace("{x1}", String(MQTTClient)); + setup_xml.replace("{x1}", String(sysCfg.friendlyname)); setup_xml.replace("{x2}", wemo_UUID()); setup_xml.replace("{x3}", wemo_serial()); webServer->send(200, "text/xml", setup_xml);
Friendly name"); page += String(sysCfg.friendlyname); page += F("
Program version"); page += Version; page += F("
Core/SDK version"); page += ESP.getCoreVersion(); page += F("/"); page += String(ESP.getSdkVersion()); page += F("
Boot version"); page += String(ESP.getBootVersion()); page += F("
AP MAC address"); page += WiFi.softAPmacAddress(); page += F("
 
MQTT Host"); page += sysCfg.mqtt_host; page += F("
MQTT Port"); page += String(sysCfg.mqtt_port); page += F("
MQTT Client and
 Fallback Topic
"); page += MQTTClient; page += F("
MQTT Password"); page += sysCfg.mqtt_pwd; page += F("
MQTT Topic"); page += sysCfg.mqtt_topic; page += F("
MQTT Group Topic"); page += sysCfg.mqtt_grptopic; page += F("
MQTTDisabled
 
ESP Chip id"); page += String(ESP.getChipId()); page += F("
Flash Chip id"); page += String(ESP.getFlashChipId()); page += F("