3.9.12 20170208
* Fix compile error when webserver is disabled (#30)
* Fix possible ESP8285 flash problem by updating Flash Chip Mode to DOUT
during OTA upload
* Fix hostname issues by not allowing user entry of string formatting
and removing from user_config.h (#36)
This commit is contained in:
arendst 2017-02-08 12:56:51 +01:00
parent f751ad1e26
commit 971ffef4a9
8 changed files with 57 additions and 56 deletions

View File

@ -1,7 +1,7 @@
## 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.
Current version is **3.9.11** - See ```sonoff/_releasenotes.ino``` for change information.
Current version is **3.9.12** - See ```sonoff/_releasenotes.ino``` for change information.
- This version provides all (Sonoff) modules in one file and starts up with Sonoff Basic.
- Once uploaded select module using the configuration webpage or the commands ```Modules``` and ```Module```.

Binary file not shown.

View File

@ -1,5 +1,7 @@
/* 3.9.11a
/* 3.9.12 20170208
* Fix compile error when webserver is disabled (#30)
* Fix possible ESP8285 flash problem by updating Flash Chip Mode to DOUT during OTA upload
* Fix hostname issues by not allowing user entry of string formatting and removing from user_config.h (#36)
*
* 3.9.11 20170204
* Fix command I2Cscan

View File

@ -10,7 +10,7 @@
* ====================================================
*/
#define VERSION 0x03090B00 // 3.9.11
#define VERSION 0x03090C00 // 3.9.12
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};
@ -58,7 +58,7 @@ enum emul_t {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX};
#define WS2812_LEDS 30 // [Pixels] Number of LEDs
#endif
#define DEF_WIFI_HOSTNAME "%s-%04d" // Expands to <MQTT_TOPIC>-<last 4 decimal chars of MAC address>
#define WIFI_HOSTNAME "%s-%04d" // Expands to <MQTT_TOPIC>-<last 4 decimal chars of MAC address>
#define HLW_PREF_PULSE 12530 // was 4975us = 201Hz = 1000W
#define HLW_UREF_PULSE 1950 // was 1666us = 600Hz = 220V
@ -1087,7 +1087,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
uint16_t i = 0, grpflg = 0, index;
char topicBuf[TOPSZ], dataBuf[data_len+1], dataBufUc[MESSZ];
char *p, *mtopic = NULL, *type = NULL;
char stopic[TOPSZ], stemp1[TOPSZ], stemp2[10];
char stemp1[TOPSZ], stemp2[10];
strncpy(topicBuf, topic, sizeof(topicBuf));
memcpy(dataBuf, data, sizeof(dataBuf));
@ -1306,6 +1306,12 @@ 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" : "");
}
else if (!strcmp(type,"FLASHCHIPMODE")) {
if ((data_len > 0) && (payload >= 2) && (payload <= 3)) {
if (ESP.getFlashChipMode() != payload) setFlashChipMode(0, payload &3);
}
snprintf_P(svalue, sizeof(svalue), PSTR("{\"FlashChipMode\":%d}"), ESP.getFlashChipMode());
}
else if (!strcmp(type,"UPGRADE") || !strcmp(type,"UPLOAD")) {
if ((data_len > 0) && (payload == 1)) {
otaflag = 3;
@ -1383,8 +1389,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
else if (!grpflg && !strcmp(type,"HOSTNAME")) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.hostname))) {
strlcpy(sysCfg.hostname, (payload == 1) ? WIFI_HOSTNAME : dataBuf, sizeof(sysCfg.hostname));
if (strstr(sysCfg.hostname,"%"))
strlcpy(sysCfg.hostname, DEF_WIFI_HOSTNAME, sizeof(sysCfg.hostname));
if (strstr(sysCfg.hostname,"%")) strlcpy(sysCfg.hostname, WIFI_HOSTNAME, sizeof(sysCfg.hostname));
restartflag = 2;
}
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Hostname\":\"%s\"}"), sysCfg.hostname);
@ -1838,9 +1843,7 @@ void do_cmnd(char *cmnd)
void publish_status(uint8_t payload)
{
char svalue[MESSZ], stemp1[TOPSZ], stemp2[10], stemp3[10];
float ped, pi, pc;
uint16_t pe, pw, pu;
char svalue[MESSZ];
uint8_t option = 0;
// Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX
@ -1966,7 +1969,7 @@ void every_second_cb()
void every_second()
{
char log[LOGSZ], stopic[TOPSZ], svalue[MESSZ], stime[21];
char svalue[MESSZ], stime[21];
snprintf_P(stime, sizeof(stime), PSTR("%04d-%02d-%02dT%02d:%02d:%02d"),
rtcTime.Year, rtcTime.Month, rtcTime.Day, rtcTime.Hour, rtcTime.Minute, rtcTime.Second);
@ -2246,6 +2249,7 @@ void stateloop()
if (otaflag == 10) { // Allow MQTT to reconnect
otaflag = 0;
if (otaok) {
if ((sysCfg.module == SONOFF_TOUCH) || (sysCfg.module == SONOFF_4CH)) setFlashChipMode(1, 3); // DOUT - ESP8285
snprintf_P(svalue, sizeof(svalue), PSTR("Successful. Restarting"));
restartflag = 2;
} else {
@ -2508,8 +2512,8 @@ void setup()
Serial.println();
}
if (strstr(sysCfg.hostname, "%")) strlcpy(sysCfg.hostname, DEF_WIFI_HOSTNAME, sizeof(sysCfg.hostname));
if (!strcmp(sysCfg.hostname, DEF_WIFI_HOSTNAME)) {
if (strstr(sysCfg.hostname, "%")) {
strlcpy(sysCfg.hostname, WIFI_HOSTNAME, sizeof(sysCfg.hostname));
snprintf_P(Hostname, sizeof(Hostname)-1, sysCfg.hostname, sysCfg.mqtt_topic, ESP.getChipId() & 0x1FFF);
} else {
snprintf_P(Hostname, sizeof(Hostname)-1, sysCfg.hostname);

View File

@ -275,26 +275,40 @@ void initSpiffs()
}
#endif // USE_SPIFFS
#include "eboot_command.h"
/*
void setFlashChipMode(byte mode)
* Based on cores/esp8266/Updater.cpp
*/
void setFlashChipMode(byte option, byte mode)
{
char log[LOGSZ];
uint32_t data;
uint8_t * bytes = (uint8_t *) &data;
// read first 4 byte (magic byte + flash config)
if (spi_flash_read(0x0000, &data, 4) == SPI_FLASH_RESULT_OK) {
uint8_t *_buffer;
uint32_t address;
snprintf_P(log, sizeof(log), PSTR("FLSH: Magic byte and flash config %08X"), data);
addLog(LOG_LEVEL_DEBUG, log);
if (bytes[2] != mode) {
bytes[2] = mode &3;
// spi_flash_write(0x0000, &data, 4);
if (option) {
eboot_command ebcmd;
eboot_command_read(&ebcmd);
address = ebcmd.args[0];
} else {
address = 0;
}
_buffer = new uint8_t[FLASH_SECTOR_SIZE];
if (spi_flash_read(address, (uint32_t*)_buffer, FLASH_SECTOR_SIZE) == SPI_FLASH_RESULT_OK) {
if (_buffer[2] != mode) {
_buffer[2] = mode &3;
noInterrupts();
if (spi_flash_erase_sector(address / FLASH_SECTOR_SIZE) == SPI_FLASH_RESULT_OK) {
spi_flash_write(address, (uint32_t*)_buffer, FLASH_SECTOR_SIZE);
}
interrupts();
snprintf_P(log, sizeof(log), PSTR("FLSH: Updated Flash Chip Mode to %d"), (option) ? mode : ESP.getFlashChipMode());
addLog(LOG_LEVEL_DEBUG, log);
}
}
delete[] _buffer;
}
*/
/*********************************************************************************************\
* Wifi
\*********************************************************************************************/
@ -629,7 +643,6 @@ void IPtoCharArray(IPAddress address, char *ip_str, size_t size)
int32_t i2c_read(uint8_t addr, uint8_t reg, uint8_t size)
{
char log[LOGSZ];
byte x = 0;
int32_t data = 0;
@ -646,10 +659,6 @@ int32_t i2c_read(uint8_t addr, uint8_t reg, uint8_t size)
}
x++;
} while (Wire.endTransmission(true) != 0 && x <= I2C_RETRY_COUNTER); // end transmission
// snprintf_P(log, sizeof(log), PSTR("I2C: received %X, retries %d"), data, x -1);
// addLog(LOG_LEVEL_DEBUG_MORE, log);
return data;
}

View File

@ -21,7 +21,6 @@
#define STA_PASS1 "VnsqrtnrsddbrN" // [Password1] Wifi password
#define STA_SSID2 "indebuurt2" // [Ssid2] Optional alternate AP Wifi SSID
#define STA_PASS2 "VnsqrtnrsddbrN" // [Password2] Optional alternate AP Wifi password
#define WIFI_HOSTNAME "%s-%04d" // [Hostname] Expands to <MQTT_TOPIC>-<last 4 decimal chars of MAC address>
#define WIFI_CONFIG_TOOL WIFI_WPSCONFIG // [WifiConfig] Default tool if wifi fails to connect
// (WIFI_RESTART, WIFI_SMARTCONFIG, WIFI_MANAGER, WIFI_WPSCONFIG, WIFI_RETRY)
// -- Syslog --------------------------------------
@ -37,7 +36,7 @@
// -- MQTT ----------------------------------------
#define MQTT_USE 1 // [Mqtt] Select default MQTT use (0 = Off, 1 = On)
// !!! TLS uses a LOT OF MEMORY (20k) so be careful to enable other options at the same time !!!
//#define USE_MQTT_TLS // EXPERIMENTAL Use TLS for MQTT connection (+53k code, +20k mem)
//#define USE_MQTT_TLS // EXPERIMENTAL Use TLS for MQTT connection (+53k code, +20k mem) - Disable by //
// Needs Fingerprint, TLS Port, UserId and Password
#ifdef USE_MQTT_TLS
#define MQTT_HOST "m20.cloudmqtt.com" // [MqttHost]
@ -72,20 +71,20 @@
#define TELE_PERIOD 300 // [TelePeriod] Telemetry (0 = disable, 10 - 3600 seconds)
// -- MQTT - Domoticz -----------------------------
#define USE_DOMOTICZ // Enable Domoticz (+5k code, +0.3k mem) - Disable by //
#define USE_DOMOTICZ // Enable Domoticz (+7k code, +0.3k mem) - Disable by //
#define DOMOTICZ_IN_TOPIC "domoticz/in" // [DomoticzInTopic]
#define DOMOTICZ_OUT_TOPIC "domoticz/out" // [DomoticzOutTopic]
#define DOMOTICZ_UPDATE_TIMER 0 // [DomoticzUpdateTimer] Send relay status (0 = disable, 1 - 3600 seconds) (Optional)
// -- HTTP ----------------------------------------
#define USE_WEBSERVER // Enable web server and wifi manager (+43k code, +2k mem) - Disable by //
#define USE_WEBSERVER // Enable web server and wifi manager (+60k code, +4k mem) - Disable by //
#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_EMULATION // Enable Belkin WeMo and Hue Bridge emulation for Alexa (+11k code, +2k mem)
#define EMULATION EMUL_NONE // [Emulation] Select Belkin WeMo or Hue Bridge emulation (EMUL_NONE, EMUL_WEMO or EMUL_HUE)
// -- mDNS ----------------------------------------
#define USE_DISCOVERY // Enable mDNS for the following services (+8k code, +0.3k mem)
#define USE_DISCOVERY // Enable mDNS for the following services (+8k code, +0.3k mem) - Disable by //
#define WEBSERVER_ADVERTISE // Provide access to webserver by name <Hostname>.local/
#define MQTT_HOST_DISCOVERY // Find MQTT host server (overrides MQTT_HOST if found)
@ -121,12 +120,12 @@
//#define USE_DHT2 // Optional using Adafruit DHT library
//#define USE_DS18x20 // Optional using OneWire library for multiple DS18B20 and/or DS18S20
#define USE_I2C // I2C Support (+10k code, 0.2k mem)
#define USE_I2C // I2C using library wire (+10k code, 0.2k mem) - Disable by //
#define USE_BH1750 // Add I2C code for BH1750 sensor
#define USE_BMP // Add I2C code for BMP/BME280 sensor
#define USE_HTU // Add I2C code for HTU21 sensor
#define USE_WS2812 // WS2812 Led string support (+8k code, +1k mem)
#define USE_WS2812 // WS2812 Led string using library NeoPixelBus (+8k code, +1k mem) - Disable by //
#define USE_WS2812_CTYPE 1 // WS2812 Color type (0 - RGB, 1 - GRB)
// #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial TXD) (+1k mem)
// When USE_WS2812_DMA is enabled expect Exceptions on Pow

View File

@ -130,7 +130,7 @@ const char HTTP_FORM_WIFI[] PROGMEM =
"<br/><b>AP1 Password</b></br><input id='p1' name='p1' length=64 type='password' placeholder='" STA_PASS1 "' value='{p1}'><br/>"
"<br/><b>AP2 SSId</b> (" STA_SSID2 ")<br/><input id='s2' name='s2' length=32 placeholder='" STA_SSID2 "' value='{s2}'><br/>"
"<br/><b>AP2 Password</b></br><input id='p2' name='p2' length=64 type='password' placeholder='" STA_PASS2 "' value='{p2}'><br/>"
"<br/><b>Hostname</b> ({h0})<br/><input id='h' name='h' length=32 placeholder='" WIFI_HOSTNAME" ' value='{h1}'><br/>";
"<br/><b>Hostname</b> (" WIFI_HOSTNAME ")<br/><input id='h' name='h' length=32 placeholder='" WIFI_HOSTNAME" ' value='{h1}'><br/>";
const char HTTP_FORM_MQTT[] PROGMEM =
"<fieldset><legend><b>&nbsp;MQTT parameters&nbsp;</b></legend><form method='post' action='sv'>"
"<input id='w' name='w' value='2' hidden><input id='r' name='r' value='1' hidden>"
@ -414,7 +414,6 @@ void showPage(String &page)
{
page.replace("{ha}", my_module.name);
page.replace("{h}", String(sysCfg.friendlyname[0]));
// page.replace("{ha}", Hostname);
if (_httpflag == HTTP_MANAGER) {
if (WIFI_configCounter()) {
page.replace("<body>", "<body onload='u()'>");
@ -557,7 +556,6 @@ void handleModule()
for (byte i = 0; i < MAX_GPIO_PIN; i++) {
if (cmodule.gp.io[i] == GPIO_USER) {
page += F("<br/><b>GPIO"); page += String(i); page += F("</b> <select id='g"); page += String(i); page += F("' name='g"); page += String(i); page += F("'>");
byte k = 0;
for (byte j = GPIO_SENSOR_START; j < GPIO_SENSOR_END; j++) {
page += F("<option ");
if (j == my_module.gp.io[i]) page += F("selected ");
@ -672,14 +670,6 @@ void handleWifi(boolean scan)
}
page += FPSTR(HTTP_FORM_WIFI);
char str[33];
if (!strcmp(WIFI_HOSTNAME, DEF_WIFI_HOSTNAME)) {
snprintf_P(str, sizeof(str), PSTR(DEF_WIFI_HOSTNAME), sysCfg.mqtt_topic, ESP.getChipId() & 0x1FFF);
} else {
snprintf_P(str, sizeof(str), PSTR(WIFI_HOSTNAME));
}
page.replace("{h0}", str);
page.replace("{h1}", String(sysCfg.hostname));
page.replace("{s1}", String(sysCfg.sta_ssid[0]));
page.replace("{p1}", String(sysCfg.sta_pwd[0]));
@ -820,7 +810,7 @@ void handleSave()
switch (what) {
case 1:
strlcpy(sysCfg.hostname, (!strlen(webServer->arg("h").c_str())) ? WIFI_HOSTNAME : webServer->arg("h").c_str(), sizeof(sysCfg.hostname));
if (strstr(sysCfg.hostname,"%")) strlcpy(sysCfg.hostname, DEF_WIFI_HOSTNAME, sizeof(sysCfg.hostname));
if (strstr(sysCfg.hostname,"%")) strlcpy(sysCfg.hostname, WIFI_HOSTNAME, sizeof(sysCfg.hostname));
strlcpy(sysCfg.sta_ssid[0], (!strlen(webServer->arg("s1").c_str())) ? STA_SSID1 : webServer->arg("s1").c_str(), sizeof(sysCfg.sta_ssid[0]));
strlcpy(sysCfg.sta_pwd[0], (!strlen(webServer->arg("p1").c_str())) ? STA_PASS1 : webServer->arg("p1").c_str(), sizeof(sysCfg.sta_pwd[0]));
strlcpy(sysCfg.sta_ssid[1], (!strlen(webServer->arg("s2").c_str())) ? STA_SSID2 : webServer->arg("s2").c_str(), sizeof(sysCfg.sta_ssid[1]));
@ -1076,13 +1066,10 @@ void handleUploadLoop()
_uploaderror = 4;
return;
}
if ((sysCfg.module == SONOFF_TOUCH) || (sysCfg.module == SONOFF_4CH) || (ESP.getFlashChipMode() == 3)) {
if ((sysCfg.module == SONOFF_TOUCH) || (sysCfg.module == SONOFF_4CH)) {
upload.buf[2] = 3; // DOUT - ESP8285
} else {
upload.buf[2] = 2; // DIO - ESP8266
addLog_P(LOG_LEVEL_DEBUG, PSTR("FLSH: Updated Flash Chip Mode to 3"));
}
// snprintf_P(log, sizeof(log), PSTR("Upload: Flash Chip Mode %02X"), upload.buf[2]);
// addLog(LOG_LEVEL_DEBUG, log);
}
if (!_uploaderror && (Update.write(upload.buf, upload.currentSize) != upload.currentSize)) {
if (_serialoutput) Update.printError(Serial);

View File

@ -42,7 +42,7 @@ byte domoticz_update_flag = 1;
unsigned long getKeyIntValue(const char *json, const char *key)
{
char *p, *b, log[LOGSZ];
char *p, *b;
int i;
// search key