4.0.1 20170305
* Fix char default sizes and set MESSZ to 360 (#143)
* Fix SerialLog setting status
* Disable syslog when emulation is active
* Add DS18B20 web page display refresh
This commit is contained in:
arendst 2017-03-05 15:07:30 +01:00
parent acb5252b54
commit 47d711b1b2
15 changed files with 73 additions and 52 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 **4.0.0** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information.
Current version is **4.0.1** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/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.

Binary file not shown.

View File

@ -1,4 +1,10 @@
/* 4.0.0 20170303
/* 4.0.1 20170305
* Fix char default sizes and set MESSZ to 360 (#143)
* Fix SerialLog setting status
* Disable syslog when emulation is active
* Add DS18B20 web page display refresh
*
* 4.0.0 20170303
* Add define to remove config migration code for versions below 3.0 (See Wiki-Upgrade-Migration path)
* Free memory by switching from String to char[]
* Raised Sonoff Led PWM frequency from 200Hz to 432Hz in search of stability (hardware watchdog timeouts) (#122)

View File

@ -12,9 +12,9 @@
//#define ALLOW_MIGRATE_TO_V3
#ifdef ALLOW_MIGRATE_TO_V3
#define VERSION 0x03091700 // 3.9.23
#define VERSION 0x03091800 // 3.9.24
#else
#define VERSION 0x04000000 // 4.0.0
#define VERSION 0x04000100 // 4.0.1
#endif // ALLOW_MIGRATE_TO_V3
enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL};
@ -36,8 +36,6 @@ enum emul_t {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX};
\*********************************************************************************************/
//#define USE_SPIFFS // Switch persistent configuration from flash to spiffs (+24k code, +0.6k mem)
//#define BE_MINIMAL // Compile a minimal version if upgrade memory gets tight (-45k code, -2k mem)
// To be used as step 1. Next step is compile and use desired version
/*********************************************************************************************\
* No user configurable items below
@ -52,9 +50,9 @@ enum emul_t {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX};
//#define DEBUG_THEO // Add debug code
#ifdef BE_MINIMAL
//#ifdef USE_MQTT_TLS
//#undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set
//#endif
#ifdef USE_MQTT_TLS
#undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set
#endif
#ifdef USE_DISCOVERY
#undef USE_DISCOVERY // Disable Discovery services for both MQTT and web server
#endif
@ -145,10 +143,10 @@ enum butt_t {PRESSED, NOT_PRESSED};
#include "support.h" // Global support
#include <PubSubClient.h> // MQTT
#define MESSZ 352 // Max number of characters in JSON message string
#if (MQTT_MAX_PACKET_SIZE -TOPSZ -60 -40) < MESSZ // If the max message size is too small, throw an error at compile time
// 60 bytes for the IPv4 TCP header, 40 bytes to keep the original 400/240 headroom
#error "MQTT_MAX_PACKET_SIZE is too small in libraries/PubSubClient/src/PubSubClient.h, increase it to at least 512"
#define MESSZ 360 // Max number of characters in JSON message string (4 x DS18x20 sensors)
#if (MQTT_MAX_PACKET_SIZE -TOPSZ -7) < MESSZ // If the max message size is too small, throw an error at compile time
// See pubsubclient.c line 359
#error "MQTT_MAX_PACKET_SIZE is too small in libraries/PubSubClient/src/PubSubClient.h, increase it to at least 427"
#endif
#include <Ticker.h> // RTC
@ -415,7 +413,7 @@ void json2legacy(char* stopic, char* svalue)
void mqtt_publish_sec(const char* topic, const char* data, boolean retained)
{
char log[TOPSZ+MESSZ];
char log[TOPSZ + MESSZ];
if (sysCfg.mqtt_enabled) {
if (mqttClient.publish(topic, data, retained)) {
@ -459,7 +457,7 @@ void mqtt_publish_topic_P(uint8_t prefix, const char* subtopic, const char* data
void mqtt_publishPowerState(byte device)
{
char stopic[TOPSZ], svalue[MESSZ], sdevice[10];
char stopic[TOPSZ], sdevice[10], svalue[64]; // was MESSZ
if ((device < 1) || (device > Maxdevice)) device = 1;
snprintf_P(sdevice, sizeof(sdevice), PSTR("%d"), device);
@ -473,7 +471,7 @@ void mqtt_publishPowerState(byte device)
void mqtt_publishPowerBlinkState(byte device)
{
char svalue[MESSZ], sdevice[10];
char sdevice[10], svalue[64]; // was MESSZ
if ((device < 1) || (device > Maxdevice)) device = 1;
snprintf_P(sdevice, sizeof(sdevice), PSTR("%d"), device);
@ -484,7 +482,7 @@ void mqtt_publishPowerBlinkState(byte device)
void mqtt_connected()
{
char stopic[TOPSZ], svalue[MESSZ];
char stopic[TOPSZ], svalue[128]; // was MESSZ
if (sysCfg.mqtt_enabled) {
@ -596,7 +594,6 @@ void mqtt_reconnect()
void mqttDataCb(char* topic, byte* data, unsigned int data_len)
{
char *str;
char svalue[MESSZ];
if (!strcmp(SUB_PREFIX,PUB_PREFIX)) {
str = strstr(topic,SUB_PREFIX);
@ -606,10 +603,10 @@ 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 topicBuf[TOPSZ], dataBuf[data_len+1], dataBufUc[128], svalue[MESSZ];
char *p, *mtopic = NULL, *type = NULL;
char stemp1[TOPSZ], stemp2[10];
uint16_t i = 0, grpflg = 0, index;
strncpy(topicBuf, topic, sizeof(topicBuf));
memcpy(dataBuf, data, sizeof(dataBuf));
@ -823,19 +820,16 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
sysCfg.seriallog_level = payload;
seriallog_level = payload;
seriallog_timer = 0;
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SerialLog\":%d}"), sysCfg.syslog_level);
}
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SerialLog\":\"%d (Setting %d)\"}"), seriallog_level, sysCfg.seriallog_level);
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SerialLog\":\"%d (Active %d)\"}"), sysCfg.seriallog_level, seriallog_level);
}
else if (!strcmp(type,"SYSLOG")) {
if ((data_len > 0) && (payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) {
sysCfg.syslog_level = payload;
syslog_level = payload;
syslog_level = (sysCfg.emulation) ? 0 : payload;
syslog_timer = 0;
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SysLog\":%d}"), sysCfg.syslog_level);
} else {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SysLog\":\"%d (Setting %d)\"}"), syslog_level, sysCfg.syslog_level);
}
snprintf_P(svalue, sizeof(svalue), PSTR("{\"SysLog\":\"%d (Active %d)\"}"), sysCfg.syslog_level, syslog_level);
}
else if (!strcmp(type,"LOGHOST")) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.syslog_host))) {
@ -1507,7 +1501,7 @@ void every_second()
if (syslog_timer) { // Restore syslog level
syslog_timer--;
if (!syslog_timer) {
syslog_level = sysCfg.syslog_level;
syslog_level = (sysCfg.emulation) ? 0 : sysCfg.syslog_level;
if (sysCfg.syslog_level) {
addLog_P(LOG_LEVEL_INFO, PSTR("SYSL: Syslog logging re-enabled")); // Might trigger disable again (on purpose)
}
@ -1591,7 +1585,7 @@ void every_second()
void stateloop()
{
uint8_t button = NOT_PRESSED, flag, switchflag, power_now;
char scmnd[20], log[LOGSZ], svalue[MESSZ];
char scmnd[20], log[LOGSZ], svalue[80]; // was MESSZ
timerxs = millis() + (1000 / STATES);
state++;
@ -2038,7 +2032,10 @@ void setup()
savedatacounter = sysCfg.savedata;
seriallog_timer = SERIALLOG_TIMER;
seriallog_level = sysCfg.seriallog_level;
syslog_level = sysCfg.syslog_level;
#ifndef USE_EMULATION
sysCfg.emulation = 0;
#endif // USE_EMULATION
syslog_level = (sysCfg.emulation) ? 0 : sysCfg.syslog_level;
sleep = sysCfg.sleep;
GPIO_init();

View File

@ -807,7 +807,7 @@ void rtc_init(rtcCallback cb)
void syslog(const char *message)
{
char str[TOPSZ+MESSZ];
char str[TOPSZ + MESSZ];
if (portUDP.beginPacket(sysCfg.syslog_host, sysCfg.syslog_port)) {
snprintf_P(str, sizeof(str), PSTR("%s ESP-%s"), Hostname, message);
@ -835,12 +835,13 @@ void addLog(byte loglevel, const char *line)
if (logidx > MAX_LOG_LINES -1) logidx = 0;
}
#endif // USE_WEBSERVER
// if (sysCfg.emulation) return; // Disable syslog (UDP) when emulation using UDP is selected
if ((WiFi.status() == WL_CONNECTED) && (loglevel <= syslog_level)) syslog(line);
}
void addLog_P(byte loglevel, const char *formatP)
{
char mess[MESSZ];
char mess[LOGSZ]; // was MESSZ
snprintf_P(mess, sizeof(mess), formatP);
addLog(loglevel, mess);

View File

@ -126,7 +126,7 @@
#define ENERGY_RESOLUTION 3 // Maximum number of decimals (0 - 5) showing energy usage in kWh
// -- Sensor code selection -----------------------
//#define USE_DS18x20 // Optional using OneWire library for multiple DS18B20 and/or DS18S20
//#define USE_DS18x20 // Optional using OneWire library for multiple DS18B20 and/or DS18S20 (+2k code)
#define USE_I2C // I2C using library wire (+10k code, 0.2k mem) - Disable by //
#define USE_BH1750 // Add I2C code for BH1750 sensor
@ -140,6 +140,15 @@
// #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial TXD) (+1k mem)
// When USE_WS2812_DMA is enabled expect Exceptions on Pow
/*********************************************************************************************\
* Compile a minimal version if upgrade memory gets tight.
* To be used as step 1 during upgrade.
* Step 2 is re-compile with option BE_MINIMAL commented out.
* !!! Needed for next release of Arduino/ESP8266 (+22k code, +2k mem) !!!
\*********************************************************************************************/
//#define BE_MINIMAL // Minimal version if upgrade memory gets tight (-45k code, -2k mem)
/*********************************************************************************************\
* No user configurable items below
\*********************************************************************************************/

View File

@ -423,11 +423,7 @@ void handleAjax2()
if (pin[GPIO_DSB] < 99) tpage += dsb_webPresent();
#endif // USE_DS18B20
#ifdef USE_DS18x20
if (pin[GPIO_DSB] < 99) {
tpage += ds18x20_webPresent();
ds18x20_search(); // Check for changes in sensors number
ds18x20_convert(); // Start Conversion, takes up to one second
}
if (pin[GPIO_DSB] < 99) tpage += ds18x20_webPresent();
#endif // USE_DS18x20
#ifdef USE_DHT
if (dht_type) tpage += dht_webPresent();
@ -874,7 +870,7 @@ void handleReset()
{
if (httpUser()) return;
char svalue[MESSZ];
char svalue[16]; // was MESSZ
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Reset parameters"));
@ -923,7 +919,7 @@ void handleUpgrade()
void handleUpgradeStart()
{
if (httpUser()) return;
char svalue[MESSZ];
char svalue[16]; // was MESSZ
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Firmware upgrade start"));
WIFI_configCounter();
@ -1097,7 +1093,7 @@ void handleUploadLoop()
void handleCmnd()
{
if (httpUser()) return;
char svalue[MESSZ];
char svalue[128]; // was MESSZ
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Handle cmnd"));
@ -1166,7 +1162,7 @@ void handleConsole()
void handleAjax()
{
if (httpUser()) return;
char svalue[MESSZ], log[LOGSZ];
char log[LOGSZ], svalue[128]; // was MESSZ
byte cflg = 1, counter = 99;
if (strlen(webServer->arg("c1").c_str())) {

View File

@ -42,7 +42,7 @@ byte domoticz_update_flag = 1;
void mqtt_publishDomoticzPowerState(byte device)
{
char svalue[MESSZ];
char svalue[64]; // was MESSZ
if (sysCfg.domoticz_relay_idx[device -1] && (strlen(sysCfg.domoticz_in_topic) != 0)) {
if ((device < 1) || (device > Maxdevice)) device = 1;
@ -236,7 +236,7 @@ void domoticz_commands(char *svalue, uint16_t ssvalue)
boolean domoticz_button(byte key, byte device, byte state, byte svalflg)
{
if ((sysCfg.domoticz_key_idx[device -1] || sysCfg.domoticz_switch_idx[device -1]) && (svalflg)) {
char svalue[MESSZ];
char svalue[80]; // was MESSZ
snprintf_P(svalue, sizeof(svalue), PSTR("{\"command\":\"switchlight\",\"idx\":%d,\"switchcmd\":\"%s\"}"),
(key) ? sysCfg.domoticz_switch_idx[device -1] : sysCfg.domoticz_key_idx[device -1], (state) ? (state == 2) ? "Toggle" : "On" : "Off");

View File

@ -122,7 +122,8 @@ void sl_setPower(uint8_t power)
void sl_animate()
{
char svalue[MESSZ];
// {"Wakeup":"Done"}
char svalue[32]; // was MESSZ
uint8_t fadeValue;
if ((sl_power == 0) || sl_blankv) { // Power Off

View File

@ -214,7 +214,7 @@ String dht_webPresent()
float t, h;
if (dht_readTempHum(TEMP_CONVERSION, t, h)) { // Read temperature as Celsius (the default)
char stemp[10], sensor[128];
char stemp[10], sensor[80];
dtostrf(t, 1, TEMP_RESOLUTION &3, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, dhtstype, stemp, (TEMP_CONVERSION) ? 'F' : 'C');
page += sensor;

View File

@ -30,6 +30,8 @@ POSSIBILITY OF SUCH DAMAGE.
* Source: Marinus vd Broek https://github.com/ESP8266nu/ESPEasy and AlexTransit (CRC)
\*********************************************************************************************/
float dsb_mt = 0;
uint8_t dsb_reset()
{
uint8_t r;
@ -131,11 +133,15 @@ boolean dsb_readTemp(bool S, float &t)
int16_t DSTemp;
byte msb, lsb, crc;
t = NAN;
if (!dsb_mt) {
t = NAN;
} else {
t = dsb_mt;
}
if (!dsb_read_bit()) { //check measurement end
addLog_P(LOG_LEVEL_DEBUG, PSTR("DSB: Sensor busy"));
return false;
return !isnan(t);
}
/*
dsb_reset();
@ -165,6 +171,7 @@ boolean dsb_readTemp(bool S, float &t)
t = (float(DSTemp) * 0.0625);
if(S) t = dsb_convertCtoF(t);
}
if (!isnan(t)) dsb_mt = t;
return !isnan(t);
}
@ -177,7 +184,7 @@ void dsb_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
char stemp1[10];
float t;
if (dsb_readTemp(TEMP_CONVERSION, t)) { // Check if read failed
if (dsb_readTemp(TEMP_CONVERSION, t)) { // Check if read failed
dtostrf(t, 1, TEMP_RESOLUTION &3, stemp1);
snprintf_P(svalue, ssvalue, PSTR("%s, \"DS18B20\":{\"Temperature\":%s}"), svalue, stemp1);
*djson = 1;
@ -194,12 +201,13 @@ String dsb_webPresent()
String page = "";
float st;
if (dsb_readTemp(TEMP_CONVERSION, st)) { // Check if read failed
if (dsb_readTemp(TEMP_CONVERSION, st)) { // Check if read failed
char stemp[10], sensor[80];
dtostrf(st, 1, TEMP_RESOLUTION &3, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "DS18B20", stemp, (TEMP_CONVERSION) ? 'F' : 'C');
page += sensor;
}
dsb_readTempPrep();
return page;
}
#endif // USE_WEBSERVER

View File

@ -200,6 +200,8 @@ String ds18x20_webPresent()
page += sensor;
}
}
ds18x20_search(); // Check for changes in sensors number
ds18x20_convert(); // Start Conversion, takes up to one second
return page;
}
#endif // USE_WEBSERVER

View File

@ -282,7 +282,7 @@ void hlw_setPowerSteadyCounter(byte value)
void hlw_margin_chk()
{
char log[LOGSZ], svalue[MESSZ];
char log[LOGSZ], svalue[200]; // was MESSZ
float ped, pi, pc;
uint16_t uped, piv, pe, pw, pu;
byte flag, jsonflg;
@ -543,7 +543,8 @@ void hlw_mqttStat(byte option, char* svalue, uint16_t ssvalue)
void hlw_mqttPresent()
{
char svalue[MESSZ];
// {"Time":"2017-03-04T13:37:24", "Yesterday":0.013, "Today":0.000, "Period":0, "Power":0, "Factor":0.00, "Voltage":0, "Current":0.000}
char svalue[200]; // was MESSZ
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Time\":\"%04d-%02d-%02dT%02d:%02d:%02d\", "),
rtcTime.Year, rtcTime.Month, rtcTime.Day, rtcTime.Hour, rtcTime.Minute, rtcTime.Second);

View File

@ -275,7 +275,7 @@ String htu_webPresent()
{
String page = "";
if (htutype) {
char stemp[10], sensor[128];
char stemp[10], sensor[80];
float t_htu21 = htu21_readTemperature(TEMP_CONVERSION);
float h_htu21 = htu21_readHumidity();