diff --git a/README.md b/README.md index 9fef62adb..46c76619f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ If you like **Sonoff-Tasmota**, give it a star, or fork it and contribute! ### Development [![Build Status](https://img.shields.io/travis/arendst/Sonoff-Tasmota.svg)](https://travis-ci.org/arendst/Sonoff-Tasmota) -Current version is **6.0.0c** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. +Current version is **6.1.0a** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. ### Disclaimer :warning: **DANGER OF ELECTROCUTION** :warning: @@ -39,7 +39,7 @@ If you want to compile Sonoff-Tasmota yourself keep in mind the following: - Once uploaded select module using the configuration webpage or the commands ```Modules``` and ```Module```. - After reboot select config menu again or use commands ```GPIOs``` and ```GPIO``` to change GPIO with desired sensor. -### Migration Instructions +### Migration Information See [wiki migration path](https://github.com/arendst/Sonoff-Tasmota/wiki/Upgrade#migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates: 1. Migrate to **Sonoff-Tasmota 3.9.x** @@ -134,34 +134,34 @@ Different firmware images are released based on Features and Sensors selection g | USE_ADS1115 | - | - | - | - | x | | USE_ADS1115_I2CDEV | - | - | - | - | - | | USE_INA219 | - | - | - | - | x | -| USE_APDS9960 | - | - | - | - | - | | USE_MGS | - | - | - | - | x | | USE_SPI | - | - | - | - | - | | USE_MHZ19 | x | x | - | x | x | -| USE_SENSEAIR | x | x | - | x | x | -| USE_PMS5003 | x | x | - | x | x | +| USE_SENSEAIR | x | - | - | x | x | +| USE_PMS5003 | x | - | - | x | x | | USE_NOVA_SDS | x | - | - | x | x | -| USE_PZEM004T | x | x | - | x | x | +| USE_PZEM004T | x | - | - | x | x | | USE_SERIAL_BRIDGE | x | - | - | x | x | -| USE_SDM120 | x | - | - | - | x | -| USE_SDM630 | x | - | - | - | x | +| USE_SDM120 | - | - | - | - | x | +| USE_SDM630 | - | - | - | - | x | | USE_IR_REMOTE | x | x | - | x | x | | USE_IR_HVAC | - | - | - | - | x | | USE_IR_RECEIVE | x | - | - | x | x | | USE_WS2812 | x | x | - | x | x | | USE_WS2812_DMA | - | - | - | - | - | -| USE_ARILUX_RF | x | x | - | x | x | +| USE_ARILUX_RF | x | - | - | x | x | | USE_SR04 | x | - | - | x | x | -| USE_TM1638 | - | - | - | - | - | | USE_RF_FLASH | x | - | - | x | x | -#### Typical File Size +#### Typical file size | ESP/Arduino library version | sonoff | classic | minimal | knx | allsensors | |-----------------------------|--------|---------|---------|------|------------| -| ESP/Arduino lib v2.3.0 | 529k | 490k | 429k | 538k | 554k | -| ESP/Arduino lib v2.4.0 | 534k | 498k | 436k | 542k | 558k | -| ESP/Arduino lib v2.4.1 | 536k | 501k | 439k | 545k | 560k | +| ESP/Arduino lib v2.3.0 | 538k | 490k | 399k | 548k | 562k | +| ESP/Arduino lib v2.4.0 | 543k | 498k | 406k | 553k | 565k | +| ESP/Arduino lib v2.4.1 | 544k | 500k | 408k | 555k | 567k | + +See [Tasmota ESP/Arduino library version related issues](https://github.com/arendst/Sonoff-Tasmota/wiki/Theo's-Tasmota-Tips#20180523---relation-tasmota-and-esp8266arduino-core-version) for more information. ### Contribute You can contribute to Sonoff-Tasmota by @@ -176,13 +176,14 @@ You can contribute to Sonoff-Tasmota by #### Libraries Used Libraries used with Sonoff-Tasmota are: - [ESP8266 core for Arduino](https://github.com/esp8266/Arduino) -- [Adafruit BME680](https://github.com/adafruit/Adafruit_BME680) -- [Adafruit Sensor](https://github.com/adafruit/Adafruit_Sensor) - [Adafruit SGP30](https://github.com/adafruit/Adafruit_SGP30) - [ArduinoJson](https://arduinojson.org/) +- [Bosch BME680](https://github.com/BoschSensortec/BME680_driver) +- [C2 Programmer](http://app.cear.ufpb.br/~lucas.hartmann/tag/efm8bb1/) - [Esp8266MqttClient](https://github.com/tuanpmt/ESP8266MQTTClient) - [esp-knx-ip](https://github.com/envy/esp-knx-ip) - [esp-mqtt-arduino](https://github.com/i-n-g-o/esp-mqtt-arduino) +- [ESPAsyncUDP](https://github.com/me-no-dev/ESPAsyncUDP) - [I2Cdevlib](https://github.com/jrowberg/i2cdevlib) - [IRremoteEsp8266](https://github.com/markszabo/IRremoteESP8266) - [JobaTsl2561](https://github.com/joba-1/Joba_Tsl2561) diff --git a/platformio.ini b/platformio.ini index cb5da39a9..4e1e4be7b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -39,7 +39,7 @@ platform = espressif8266@1.5.0 ; *** Esp8266 core for Arduino version 2.4.0 ;platform = espressif8266@1.6.0 ; *** Esp8266 core for Arduino version 2.4.1 -;platform = espressif8266@1.7.0 +;platform = espressif8266@1.7.3 ; *** Esp8266 core for Arduino version latest beta ;platform = https://github.com/platformio/platform-espressif8266.git#feature/stage ; *** Esp8266 core for Arduino current version @@ -62,8 +62,7 @@ build_flags = monitor_speed = 115200 ; *** Upload Serial reset method for Wemos and NodeMCU -;upload_speed = 115200 -upload_speed = 512000 +upload_speed = 115200 upload_resetmethod = nodemcu upload_port = COM5 ; *** Fix Esp/Arduino core 2.4.x induced Tasmota unused floating point includes diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 25d26f547..0892f1364 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,38 +1,37 @@ -/* 6.0.0c - * Rewrite BME680 driver now using latest Bosch BME680 library (#2969) - * Add support for bitflags SetOption50 .. SetOption81 (#3118) - * - * 6.0.0b - * Add support for BlitzWolf BW-SHP2 (and Homecube, Gosund SP1) Energy Monitoring Smart Socket (#2223) - * Add support for Sonoff iFan02 as module 44 introducing command FanSpeed 0..3 (#2839) - * Add support for Sonoff S26 Smart Socket (#2808) - * Add command SetOption30 to enforce Hass discovery as light group (#1784) - * Add decimal values support for commands ADD, SUB, MULT and SCALE (#3083, #3089) +/* 6.1.0a * Add experimental (untested) TM1638 switch support (#2226) - * Change number of switches from 4 to 8 (#2885, #3086) - * - * 6.0.0a * Add support for APDS9960 proximity sensor (#3051) - * Add increment and decrement value to command Counter (#2838) - * Add option 0 to command Timers disarming all timers (#2962) - * Add time in minutes to rule Time#Initialized, Time#set and Time#Minute (#2669) - * Add rule variables %time% for minutes since midnight, %uptime%, %sunrise% and %sunset% giving time in minutes (#2669) * Add heap and stack debug information - * Add command SetOption28 to switch between hex or decimal Sonoff Bridge RF received data format (#3008) - * Add command SetOption29 to switch between hex or decimal IR received data format - * Add performance improvement when updating multiple individual WS2812 pixels (#3007) * Add debug facilities using optional xdrv_99_debug.ino to enable in user_config.h - * Add KNX support for DS18S20 Temperature sensor - * Add CRC to Settings making future upgrades more fail-safe - * Add support for uploading Sonoff Bridge firmware found in tools/fw_efm8bb1 folder build by Portisch using Web Gui File Upload (#2886) - * Add support for I2C temperature sensor LM75AD (#2909) - * Add command RfRaw to control Portisch firmware features + * + * 6.1.0 20180706 * Remove version 3, 4 and pre 5.2 settings auto-upgrade. See https://github.com/arendst/Sonoff-Tasmota/wiki/Upgrade#migration-path * Change default CFG_HOLDER from 0x20161209 to 4617 (=0x1209) - no impact on default upgrades + * Change number of supported switches from 4 to 8 (#2885, #3086) + * Change BME680 driver from Adafruit to Bosch BME680 library (#2969) * Fix Pzem004T checksum error * Fix KNX bug when doing reply of sensors values * Fix rules induced LWT message * Fix possible wifi connection problem (#1366) + * Add Ukrainian language file + * Add KNX support for DS18S20 Temperature sensor + * Add CRC to Settings making future upgrades more fail-safe + * Add command SetOption30 to enforce Hass discovery as light group (#1784) + * Add support for BlitzWolf BW-SHP2 (and Homecube, Gosund SP1) Energy Monitoring Smart Socket (#2223) + * Add time in minutes to rule Time#Initialized, Time#set and Time#Minute (#2669) + * Add rule variables %time% for minutes since midnight, %uptime%, %sunrise% and %sunset% giving time in minutes (#2669) + * Add support for Sonoff S26 Smart Socket (#2808) + * Add increment and decrement value to command Counter (#2838) + * Add support for Sonoff iFan02 as module 44 introducing command FanSpeed 0..3 (#2839) + * Add support for uploading Sonoff Bridge firmware found in tools/fw_efm8bb1 folder build by Portisch using Web Gui File Upload (#2886) + * Add command RfRaw to control Portisch firmware features + * Add support for I2C temperature sensor LM75AD (#2909) + * Add option 0 to command Timers disarming all timers (#2962) + * Add performance improvement when updating multiple individual WS2812 pixels (#3007) + * Add command SetOption28 to switch between hex or decimal Sonoff Bridge RF received data format (#3008) + * Add command SetOption29 to switch between hex or decimal IR received data format + * Add decimal values support for commands ADD, SUB, MULT and SCALE (#3083, #3089) + * Add support for bitflags SetOption50 .. SetOption81 (#3118) * * 5.14.0b * Add Console Commands to send KNX Commands diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index e23627f26..99ce6f759 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,7 +25,7 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x06000003 // 6.0.0c +#define VERSION 0x06010001 // 6.1.0a // Location specific includes #include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0) @@ -75,6 +75,12 @@ // Structs #include "settings.h" +#ifdef BE_MINIMAL +enum TasmotaCommands { + CMND_POWER, CMND_FANSPEED, CMND_STATUS, CMND_STATE, CMND_SLEEP, CMND_UPGRADE, CMND_UPLOAD, CMND_OTAURL, CMND_SERIALLOG, CMND_RESTART }; +const char kTasmotaCommands[] PROGMEM = + D_CMND_POWER "|" D_CMND_FANSPEED "|" D_CMND_STATUS "|" D_CMND_STATE "|" D_CMND_SLEEP "|" D_CMND_UPGRADE "|" D_CMND_UPLOAD "|" D_CMND_OTAURL "|" D_CMND_SERIALLOG "|" D_CMND_RESTART; +#else enum TasmotaCommands { CMND_BACKLOG, CMND_DELAY, CMND_POWER, CMND_FANSPEED, CMND_STATUS, CMND_STATE, CMND_POWERONSTATE, CMND_PULSETIME, CMND_BLINKTIME, CMND_BLINKCOUNT, CMND_SENSOR, CMND_SAVEDATA, CMND_SETOPTION, CMND_TEMPERATURE_RESOLUTION, CMND_HUMIDITY_RESOLUTION, @@ -95,6 +101,7 @@ const char kTasmotaCommands[] PROGMEM = D_CMND_WIFICONFIG "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_TELEPERIOD "|" D_CMND_RESTART "|" D_CMND_RESET "|" D_CMND_TIMEZONE "|" D_CMND_TIMESTD "|" D_CMND_TIMEDST "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|" D_CMND_I2CSCAN "|" D_CMND_SERIALSEND "|" D_CMND_BAUDRATE "|" D_CMND_SERIALDELIMITER; +#endif const uint8_t kIFan02Speed[4][3] = {{6,6,6}, {7,6,6}, {7,7,6}, {7,6,7}}; @@ -480,6 +487,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) type = NULL; // Unknown command } } +#ifndef BE_MINIMAL else if (CMND_BACKLOG == command_code) { if (data_len) { uint8_t bl_pointer = (!backlog_pointer) ? MAX_BACKLOG -1 : backlog_pointer; @@ -513,6 +521,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) if ((payload >= MIN_BACKLOG_DELAY) && (payload <= 3600)) backlog_delay = payload; snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, backlog_delay); } +#endif // Not BE_MINIMAL else if ((CMND_POWER == command_code) && (index > 0) && (index <= devices_present)) { if ((payload < 0) || (payload > 4)) payload = 9; // Settings.flag.device_index_enable = user_append_index; @@ -540,6 +549,54 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) mqtt_data[0] = '\0'; MqttShowState(); } + else if (CMND_SLEEP == command_code) { + if ((payload >= 0) && (payload < 251)) { + if ((!Settings.sleep && payload) || (Settings.sleep && !payload)) restart_flag = 2; + Settings.sleep = payload; + sleep = payload; + } + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE_UNIT_NVALUE_UNIT, command, sleep, (Settings.flag.value_units) ? " " D_UNIT_MILLISECOND : "", Settings.sleep, (Settings.flag.value_units) ? " " D_UNIT_MILLISECOND : ""); + } + else if ((CMND_UPGRADE == command_code) || (CMND_UPLOAD == command_code)) { + // Check if the payload is numerically 1, and had no trailing chars. + // e.g. "1foo" or "1.2.3" could fool us. + // Check if the version we have been asked to upgrade to is higher than our current version. + // We also need at least 3 chars to make a valid version number string. + if (((1 == data_len) && (1 == payload)) || ((data_len >= 3) && NewerVersion(dataBuf))) { + ota_state_flag = 3; +// snprintf_P(mqtt_data, sizeof(mqtt_data), "{\"%s\":\"" D_JSON_VERSION " %s " D_JSON_FROM " %s\"}", command, my_version, Settings.ota_url); + snprintf_P(mqtt_data, sizeof(mqtt_data), "{\"%s\":\"" D_JSON_VERSION " %s " D_JSON_FROM " %s\"}", command, my_version, GetOtaUrl(stemp1, sizeof(stemp1))); + } else { + snprintf_P(mqtt_data, sizeof(mqtt_data), "{\"%s\":\"" D_JSON_ONE_OR_GT "\"}", command, my_version); + } + } + else if (CMND_OTAURL == command_code) { + if ((data_len > 0) && (data_len < sizeof(Settings.ota_url))) + strlcpy(Settings.ota_url, (1 == payload) ? OTA_URL : dataBuf, sizeof(Settings.ota_url)); + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.ota_url); + } + else if (CMND_SERIALLOG == command_code) { + if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { + Settings.flag.mqtt_serial = 0; + SetSeriallog(payload); + } + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE_ACTIVE_NVALUE, command, Settings.seriallog_level, seriallog_level); + } + else if (CMND_RESTART == command_code) { + switch (payload) { + case 1: + restart_flag = 2; + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_RESTARTING); + break; + case 99: + AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_RESTARTING)); + EspRestart(); + break; + default: + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_ONE_TO_RESTART); + } + } +#ifndef BE_MINIMAL else if ((CMND_POWERONSTATE == command_code) && (Settings.module != MOTOR)) { /* 0 = Keep relays off after power on * 1 = Turn relays on after power on, if PulseTime set wait for PulseTime seconds, and turn relays off @@ -854,32 +911,6 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) } snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.pulse_counter_debounce); } - else if (CMND_SLEEP == command_code) { - if ((payload >= 0) && (payload < 251)) { - if ((!Settings.sleep && payload) || (Settings.sleep && !payload)) restart_flag = 2; - Settings.sleep = payload; - sleep = payload; - } - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE_UNIT_NVALUE_UNIT, command, sleep, (Settings.flag.value_units) ? " " D_UNIT_MILLISECOND : "", Settings.sleep, (Settings.flag.value_units) ? " " D_UNIT_MILLISECOND : ""); - } - else if ((CMND_UPGRADE == command_code) || (CMND_UPLOAD == command_code)) { - // Check if the payload is numerically 1, and had no trailing chars. - // e.g. "1foo" or "1.2.3" could fool us. - // Check if the version we have been asked to upgrade to is higher than our current version. - // We also need at least 3 chars to make a valid version number string. - if (((1 == data_len) && (1 == payload)) || ((data_len >= 3) && NewerVersion(dataBuf))) { - ota_state_flag = 3; -// snprintf_P(mqtt_data, sizeof(mqtt_data), "{\"%s\":\"" D_JSON_VERSION " %s " D_JSON_FROM " %s\"}", command, my_version, Settings.ota_url); - snprintf_P(mqtt_data, sizeof(mqtt_data), "{\"%s\":\"" D_JSON_VERSION " %s " D_JSON_FROM " %s\"}", command, my_version, GetOtaUrl(stemp1, sizeof(stemp1))); - } else { - snprintf_P(mqtt_data, sizeof(mqtt_data), "{\"%s\":\"" D_JSON_ONE_OR_GT "\"}", command, my_version); - } - } - else if (CMND_OTAURL == command_code) { - if ((data_len > 0) && (data_len < sizeof(Settings.ota_url))) - strlcpy(Settings.ota_url, (1 == payload) ? OTA_URL : dataBuf, sizeof(Settings.ota_url)); - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.ota_url); - } else if (CMND_BAUDRATE == command_code) { if (payload32 > 0) { payload32 /= 1200; // Make it a valid baudrate @@ -917,13 +948,6 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) } snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.serial_delimiter); } - else if (CMND_SERIALLOG == command_code) { - if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { - Settings.flag.mqtt_serial = 0; - SetSeriallog(payload); - } - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE_ACTIVE_NVALUE, command, Settings.seriallog_level, seriallog_level); - } else if (CMND_SYSLOG == command_code) { if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { Settings.syslog_level = payload; @@ -1040,20 +1064,6 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) } snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE_UNIT, command, Settings.tele_period, (Settings.flag.value_units) ? " " D_UNIT_SECOND : ""); } - else if (CMND_RESTART == command_code) { - switch (payload) { - case 1: - restart_flag = 2; - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_RESTARTING); - break; - case 99: - AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_RESTARTING)); - EspRestart(); - break; - default: - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_ONE_TO_RESTART); - } - } else if (CMND_RESET == command_code) { switch (payload) { case 1: @@ -1147,6 +1157,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) I2cScan(mqtt_data, sizeof(mqtt_data)); } #endif // USE_I2C +#endif // Not BE_MINIMAL else type = NULL; // Unknown command } if (type == NULL) { @@ -2142,6 +2153,7 @@ void SerialInput() } } +#ifdef USE_ENERGY_SENSOR /*-------------------------------------------------------------------------------------------*\ * Sonoff S31 and Sonoff Pow R2 4800 baud serial interface \*-------------------------------------------------------------------------------------------*/ @@ -2152,7 +2164,7 @@ void SerialInput() return; } } - +#endif // USE_ENERGY_SENSOR /*-------------------------------------------------------------------------------------------*/ if (serial_in_byte > 127) { // binary data... diff --git a/sonoff/sonoff_post.h b/sonoff/sonoff_post.h index afdded74d..9c9aab0f6 100644 --- a/sonoff/sonoff_post.h +++ b/sonoff/sonoff_post.h @@ -51,6 +51,7 @@ void KNX_CB_Action(message_t const &msg, void *arg); #endif #define USE_DHT // Default DHT11 sensor needs no external library +#define USE_ENERGY_SENSOR // Use energy sensors /*********************************************************************************************\ * [sonoff-allsensors.bin] @@ -58,6 +59,7 @@ void KNX_CB_Action(message_t const &msg, void *arg); \*********************************************************************************************/ #ifdef USE_ALL_SENSORS + #define USE_ADC_VCC // Display Vcc in Power status. Disable for use as Analog input on selected devices #define USE_DS18x20 // For more than one DS18x20 sensors with id sort, single scan and read retry (+1k3 code) //#define USE_DS18x20_LEGACY // For more than one DS18x20 sensors with dynamic scan using library OneWire (+1k5 code) @@ -65,16 +67,19 @@ void KNX_CB_Action(message_t const &msg, void *arg); #define USE_SHT // Add I2C emulating code for SHT1X sensor (+1k4 code) #define USE_SHT3X // Add I2C code for SHT3x sensor (+0k6 code) #define USE_HTU // Add I2C code for HTU21/SI7013/SI7020/SI7021 sensor (+1k5 code) +#define USE_LM75AD // Add I2C code for LM75AD sensor (+0k5 code) #define USE_BMP // Add I2C code for BMP085/BMP180/BMP280/BME280 sensor (+4k code) - #define USE_BME680 // Add additional support for BME680 sensor using Adafruit Sensor and BME680 libraries (+6k code) + #define USE_BME680 // Add additional support for BME680 sensor using Bosch BME680 library (+4k code) #define USE_SGP30 // Add I2C code for SGP30 sensor (+1k1 code) #define USE_BH1750 // Add I2C code for BH1750 sensor (+0k5 code) #define USE_VEML6070 // Add I2C code for VEML6070 sensor (+0k5 code) #define USE_TSL2561 // Add I2C code for TSL2561 sensor using library Adafruit TSL2561 Arduino (+1k2 code) +//#define USE_SI1145 // Add I2C code for SI1145/46/47 sensor (+1k code) #define USE_ADS1115 // Add I2C code for ADS1115 16 bit A/D converter based on Adafruit ADS1x15 library (no library needed) (+0k7 code) //#define USE_ADS1115_I2CDEV // Add I2C code for ADS1115 16 bit A/D converter using library i2cdevlib-Core and i2cdevlib-ADS1115 (+2k code) #define USE_INA219 // Add I2C code for INA219 Low voltage and current sensor (+1k code) #define USE_MGS // Add I2C code for Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code) +//#define USE_APDS9960 // Add I2C code for APDS9960 Proximity Sensor. Disables SHT and VEML6070 (+4k7 code) #define USE_MHZ19 // Add support for MH-Z19 CO2 sensor (+2k code) #define USE_SENSEAIR // Add support for SenseAir K30, K70 and S8 CO2 sensor (+2k3 code) #ifndef CO2_LOW @@ -87,6 +92,8 @@ void KNX_CB_Action(message_t const &msg, void *arg); #define USE_NOVA_SDS // Add support for SDS011 and SDS021 particle concentration sensor (+0k7 code) #define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code) #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code) +#define USE_SDM120 // Add support for Eastron SDM120-Modbus energy meter (+1k7 code) +#define USE_SDM630 // Add support for Eastron SDM630-Modbus energy meter (+2k code) #define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+4k code, 0k3 mem, 48 iram) #define USE_IR_HVAC // Support for HVAC system using IR (+2k code) #define USE_IR_RECEIVE // Support for IR receiver (+5k5 code, 264 iram) @@ -105,36 +112,28 @@ void KNX_CB_Action(message_t const &msg, void *arg); \*********************************************************************************************/ #ifdef USE_CLASSIC -#ifdef USE_KNX -#undef USE_KNX -#endif -#ifdef USE_TIMERS -#undef USE_TIMERS -#endif -#ifdef USE_TIMERS_WEB -#undef USE_TIMERS_WEB -#endif -#ifdef USE_SUNRISE -#undef USE_SUNRISE -#endif -#ifdef USE_RULES -#undef USE_RULES -#endif -#ifdef USE_SGP30 -#undef USE_SGP30 -#endif -#ifdef USE_NOVA_SDS -#undef USE_NOVA_SDS -#endif -#ifdef USE_IR_RECEIVE -#undef USE_IR_RECEIVE -#endif -#ifdef USE_SERIAL_BRIDGE -#undef USE_SERIAL_BRIDGE -#endif -#ifdef USE_SR04 -#undef USE_SR04 -#endif + +#undef USE_KNX // Disable KNX IP Protocol Support +#undef USE_TIMERS // Disable support for up to 16 timers +#undef USE_TIMERS_WEB // Disable support for timer webpage +#undef USE_SUNRISE // Disable support for Sunrise and sunset tools +#undef USE_RULES // Disable support for rules +#undef USE_LM75AD // Disable sensor +#undef USE_BME680 // Disable sensor +#undef USE_SGP30 // Disable sensor +#undef USE_SENSEAIR // Disable support for SenseAir K30, K70 and S8 CO2 sensor +#undef USE_NOVA_SDS // Disable support for SDS011 and SDS021 particle concentration sensor +#undef USE_PZEM004T // Disable PZEM004T energy sensor +#undef USE_IR_RECEIVE // Disable support for IR receiver +#undef USE_SERIAL_BRIDGE // Disable support for software Serial Bridge +#undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter +#undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy meter +#undef USE_ARILUX_RF // Disable support for Arilux RF remote controller +#undef USE_SR04 // Disable support for for HC-SR04 ultrasonic devices +#undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 +#undef USE_RF_FLASH // Disable support for flashing the EFM8BB1 chip on the Sonoff RF Bridge. C2CK must be connected to GPIO4, C2D to GPIO5 on the PCB +#undef DEBUG_THEO // Disable debug code +#undef USE_DEBUG_DRIVER // Disable debug code #endif // USE_CLASSIC /*********************************************************************************************\ @@ -143,12 +142,11 @@ void KNX_CB_Action(message_t const &msg, void *arg); \*********************************************************************************************/ #ifdef USE_KNX_NO_EMULATION + #ifndef USE_KNX #define USE_KNX // Enable KNX IP Protocol Support (+23k code, +3k3 mem) #endif -#ifdef USE_EMULATION #undef USE_EMULATION // Disable Belkin WeMo and Hue Bridge emulation for Alexa (-16k code, -2k mem) -#endif #endif // USE_KNX_NO_EMULATION /*********************************************************************************************\ @@ -166,90 +164,43 @@ void KNX_CB_Action(message_t const &msg, void *arg); \*********************************************************************************************/ #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_DISCOVERY -#undef USE_DISCOVERY // Disable Discovery services for both MQTT and web server -#endif -#ifdef USE_DOMOTICZ + +#undef USE_ENERGY_SENSOR // Disable energy sensors +#undef USE_ARDUINO_OTA // Disable support for Arduino OTA #undef USE_DOMOTICZ // Disable Domoticz -#endif -#ifdef USE_HOME_ASSISTANT #undef USE_HOME_ASSISTANT // Disable Home Assistant -#endif -#ifdef USE_KNX +#undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set #undef USE_KNX // Disable KNX IP Protocol Support -#endif -//#ifdef USE_WEBSERVER //#undef USE_WEBSERVER // Disable Webserver -//#endif -#ifdef USE_EMULATION +#undef USE_DISCOVERY // Disable Discovery services for both MQTT and web server #undef USE_EMULATION // Disable Wemo or Hue emulation -#endif -#ifdef USE_TIMERS #undef USE_TIMERS // Disable support for up to 16 timers -#endif -#ifdef USE_SUNRISE +#undef USE_TIMERS_WEB // Disable support for timer webpage #undef USE_SUNRISE // Disable support for Sunrise and sunset tools -#endif -#ifdef USE_RULES #undef USE_RULES // Disable support for rules -#endif -#ifdef USE_DHT #undef USE_DHT // Disable internal DHT sensor -#endif -#ifdef USE_DS18x20 #undef USE_DS18x20 // Disable DS18x20 sensor -#endif -#ifdef USE_DS18B20 +#undef USE_DS18x20_LEGACY // Disable DS18x20 sensor #undef USE_DS18B20 // Disable internal DS18B20 sensor -#endif -#ifdef USE_I2C #undef USE_I2C // Disable all I2C sensors and devices -#endif -#ifdef USE_SPI #undef USE_SPI // Disable all SPI devices -#endif -#ifdef USE_DISPLAY #undef USE_DISPLAY // Disable Display support -#endif -#ifdef USE_MHZ19 #undef USE_MHZ19 // Disable support for MH-Z19 CO2 sensor -#endif -#ifdef USE_SENSEAIR #undef USE_SENSEAIR // Disable support for SenseAir K30, K70 and S8 CO2 sensor -#endif -#ifdef USE_PMS5003 #undef USE_PMS5003 // Disable support for PMS5003 and PMS7003 particle concentration sensor -#endif -#ifdef USE_NOVA_SDS #undef USE_NOVA_SDS // Disable support for SDS011 and SDS021 particle concentration sensor -#endif -#ifdef USE_PZEM004T #undef USE_PZEM004T // Disable PZEM004T energy sensor -#endif -#ifdef USE_SERIAL_BRIDGE #undef USE_SERIAL_BRIDGE // Disable support for software Serial Bridge -#endif -#ifdef USE_IR_REMOTE +#undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter +#undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy meter #undef USE_IR_REMOTE // Disable IR driver -#endif -#ifdef USE_WS2812 #undef USE_WS2812 // Disable WS2812 Led string -#endif -#ifdef USE_ARILUX_RF #undef USE_ARILUX_RF // Disable support for Arilux RF remote controller -#endif -#ifdef USE_SR04 #undef USE_SR04 // Disable support for for HC-SR04 ultrasonic devices -#endif -#ifdef DEBUG_THEO +#undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 +#undef USE_RF_FLASH // Disable support for flashing the EFM8BB1 chip on the Sonoff RF Bridge. C2CK must be connected to GPIO4, C2D to GPIO5 on the PCB #undef DEBUG_THEO // Disable debug code -#endif -#ifdef USE_DEBUG_DRIVER #undef USE_DEBUG_DRIVER // Disable debug code -#endif #endif // BE_MINIMAL /*********************************************************************************************\ diff --git a/sonoff/user_config.h b/sonoff/user_config.h index 0c4aa66f5..f54cf865f 100644 --- a/sonoff/user_config.h +++ b/sonoff/user_config.h @@ -44,7 +44,7 @@ \*********************************************************************************************/ // -- Master parameter control -------------------- -#define CFG_HOLDER 4617 // [Reset 1] Change this value to load SECTION1 configuration parameters to flash +#define CFG_HOLDER 4617 // [Reset 1] Change this value (max 32000) to load SECTION1 configuration parameters to flash // -- Project ------------------------------------- #define PROJECT "sonoff" // PROJECT is used as the default topic delimiter @@ -265,7 +265,7 @@ #define USE_HTU // Add I2C code for HTU21/SI7013/SI7020/SI7021 sensor (+1k5 code) #define USE_LM75AD // Add I2C code for LM75AD sensor (+0k5 code) #define USE_BMP // Add I2C code for BMP085/BMP180/BMP280/BME280 sensor (+4k code) -// #define USE_BME680 // Add additional support for BME680 sensor using Adafruit Sensor and BME680 libraries (+6k code) +// #define USE_BME680 // Add additional support for BME680 sensor using Bosch BME680 library (+4k code) #define USE_SGP30 // Add I2C code for SGP30 sensor (+1k1 code) #define USE_BH1750 // Add I2C code for BH1750 sensor (+0k5 code) // #define USE_VEML6070 // Add I2C code for VEML6070 sensor (+0k5 code) diff --git a/sonoff/xdrv_02_webserver.ino b/sonoff/xdrv_02_webserver.ino index b29e32ea2..d04226b9d 100644 --- a/sonoff/xdrv_02_webserver.ino +++ b/sonoff/xdrv_02_webserver.ino @@ -367,6 +367,14 @@ void StartWebserver(int type, IPAddress ipweb) if (!WebServer) { WebServer = new ESP8266WebServer((HTTP_MANAGER==type) ? 80 : WEB_PORT); WebServer->on("/", HandleRoot); + WebServer->on("/up", HandleUpgradeFirmware); + WebServer->on("/u1", HandleUpgradeFirmwareStart); // OTA + WebServer->on("/u2", HTTP_POST, HandleUploadDone, HandleUploadLoop); + WebServer->on("/cs", HandleConsole); + WebServer->on("/ax", HandleAjaxConsoleRefresh); + WebServer->on("/ay", HandleAjaxStatusRefresh); + WebServer->on("/rb", HandleRestart); +#ifndef BE_MINIMAL WebServer->on("/cn", HandleConfiguration); WebServer->on("/md", HandleModuleConfiguration); #if defined(USE_TIMERS) && defined(USE_TIMERS_WEB) @@ -389,17 +397,9 @@ void StartWebserver(int type, IPAddress ipweb) WebServer->on("/sv", HandleSaveSettings); WebServer->on("/rs", HandleRestoreConfiguration); WebServer->on("/rt", HandleResetConfiguration); - WebServer->on("/up", HandleUpgradeFirmware); - WebServer->on("/u1", HandleUpgradeFirmwareStart); // OTA - WebServer->on("/u2", HTTP_POST, HandleUploadDone, HandleUploadLoop); WebServer->on("/u2", HTTP_OPTIONS, HandlePreflightRequest); WebServer->on("/cm", HandleHttpCommand); - WebServer->on("/cs", HandleConsole); - WebServer->on("/ax", HandleAjaxConsoleRefresh); - WebServer->on("/ay", HandleAjaxStatusRefresh); WebServer->on("/in", HandleInformation); - WebServer->on("/rb", HandleRestart); - WebServer->on("/fwlink", HandleRoot); // Microsoft captive portal. Maybe not needed. Might be handled by notFound handler. #ifdef USE_EMULATION if (EMUL_WEMO == Settings.flag2.emulation) { WebServer->on("/upnp/control/basicevent1", HTTP_POST, HandleUpnpEvent); @@ -411,6 +411,8 @@ void StartWebserver(int type, IPAddress ipweb) WebServer->on("/description.xml", HandleUpnpSetupHue); } #endif // USE_EMULATION +#endif // Not BE_MINIMAL + WebServer->on("/fwlink", HandleRoot); // Microsoft captive portal. Maybe not needed. Might be handled by notFound handler. WebServer->onNotFound(HandleNotFound); } reset_web_log_flag = 0; @@ -520,6 +522,7 @@ void HandleRoot() if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the page. if (HTTP_MANAGER == webserver_state) { +#ifndef BE_MINIMAL if ((Settings.web_password[0] != 0) && !(WebServer->hasArg("USER1")) && !(WebServer->hasArg("PASS1"))) { HandleWifiLogin(); } else { @@ -537,6 +540,7 @@ void HandleRoot() HandleWifiLogin(); } } +#endif // Not BE_MINIMAL } else { char stemp[10]; String page = FPSTR(HTTP_HEAD); @@ -672,6 +676,7 @@ boolean HttpUser() return status; } +#ifndef BE_MINIMAL void HandleConfiguration() { if (HttpUser()) { return; } @@ -1205,6 +1210,122 @@ void HandleRestoreConfiguration() upload_file_type = UPL_SETTINGS; } +void HandleInformation() +{ + if (HttpUser()) { return; } + AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_INFORMATION); + + char stopic[TOPSZ]; + + int freeMem = ESP.getFreeHeap(); + + String page = FPSTR(HTTP_HEAD); + page.replace(F("{v}"), FPSTR(S_INFORMATION)); + page += FPSTR(HTTP_HEAD_STYLE); + // page += F("
 Information "); + + page += F(""); + page += F("
"); + + // Save 1k of code space replacing table html with javascript replace codes + // }1 = + // }2 = + String func = FPSTR(HTTP_SCRIPT_INFO_BEGIN); + func += F("
"); + func += F(D_PROGRAM_VERSION "}2"); func += my_version; + func += F("}1" D_BUILD_DATE_AND_TIME "}2"); func += GetBuildDateAndTime(); + func += F("}1" D_CORE_AND_SDK_VERSION "}2" ARDUINO_ESP8266_RELEASE "/"); func += String(ESP.getSdkVersion()); + func += F("}1" D_UPTIME "}2"); func += GetDateAndTime(DT_UPTIME); + snprintf_P(stopic, sizeof(stopic), PSTR(" at %X"), GetSettingsAddress()); + func += F("}1" D_FLASH_WRITE_COUNT "}2"); func += String(Settings.save_flag); func += stopic; + func += F("}1" D_BOOT_COUNT "}2"); func += String(Settings.bootcount); + func += F("}1" D_RESTART_REASON "}2"); func += GetResetReason(); + uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present; + if (SONOFF_IFAN02 == Settings.module) { maxfn = 1; } + for (byte i = 0; i < maxfn; i++) { + func += F("}1" D_FRIENDLY_NAME " "); func += i +1; func += F("}2"); func += Settings.friendlyname[i]; + } + + func += F("}1}2 "); // Empty line + func += F("}1" D_AP); func += String(Settings.sta_active +1); + func += F(" " D_SSID " (" D_RSSI ")}2"); func += Settings.sta_ssid[Settings.sta_active]; func += F(" ("); func += WifiGetRssiAsQuality(WiFi.RSSI()); func += F("%)"); + func += F("}1" D_HOSTNAME "}2"); func += my_hostname; + if (static_cast(WiFi.localIP()) != 0) { + func += F("}1" D_IP_ADDRESS "}2"); func += WiFi.localIP().toString(); + func += F("}1" D_GATEWAY "}2"); func += IPAddress(Settings.ip_address[1]).toString(); + func += F("}1" D_SUBNET_MASK "}2"); func += IPAddress(Settings.ip_address[2]).toString(); + func += F("}1" D_DNS_SERVER "}2"); func += IPAddress(Settings.ip_address[3]).toString(); + func += F("}1" D_MAC_ADDRESS "}2"); func += WiFi.macAddress(); + } + if (static_cast(WiFi.softAPIP()) != 0) { + func += F("}1" D_AP " " D_IP_ADDRESS "}2"); func += WiFi.softAPIP().toString(); + func += F("}1" D_AP " " D_GATEWAY "}2"); func += WiFi.softAPIP().toString(); + func += F("}1" D_AP " " D_MAC_ADDRESS "}2"); func += WiFi.softAPmacAddress(); + } + + func += F("}1}2 "); // Empty line + if (Settings.flag.mqtt_enabled) { + func += F("}1" D_MQTT_HOST "}2"); func += Settings.mqtt_host; + func += F("}1" D_MQTT_PORT "}2"); func += String(Settings.mqtt_port); + func += F("}1" D_MQTT_CLIENT " &
 " D_FALLBACK_TOPIC "}2"); func += mqtt_client; + func += F("}1" D_MQTT_USER "}2"); func += Settings.mqtt_user; + func += F("}1" D_MQTT_TOPIC "}2"); func += Settings.mqtt_topic; + func += F("}1" D_MQTT_GROUP_TOPIC "}2"); func += Settings.mqtt_grptopic; + GetTopic_P(stopic, CMND, mqtt_topic, ""); + func += F("}1" D_MQTT_FULL_TOPIC "}2"); func += stopic; + + } else { + func += F("}1" D_MQTT "}2" D_DISABLED); + } + + func += F("}1}2 "); // Empty line + func += F("}1" D_EMULATION "}2"); +#ifdef USE_EMULATION + if (EMUL_WEMO == Settings.flag2.emulation) { + func += F(D_BELKIN_WEMO); + } + else if (EMUL_HUE == Settings.flag2.emulation) { + func += F(D_HUE_BRIDGE); + } + else { + func += F(D_NONE); + } +#else + func += F(D_DISABLED); +#endif // USE_EMULATION + + func += F("}1" D_MDNS_DISCOVERY "}2"); +#ifdef USE_DISCOVERY + func += F(D_ENABLED); + func += F("}1" D_MDNS_ADVERTISE "}2"); +#ifdef WEBSERVER_ADVERTISE + func += F(D_WEB_SERVER); +#else + func += F(D_DISABLED); +#endif // WEBSERVER_ADVERTISE +#else + func += F(D_DISABLED); +#endif // USE_DISCOVERY + + func += F("}1}2 "); // Empty line + func += F("}1" D_ESP_CHIP_ID "}2"); func += String(ESP.getChipId()); + func += F("}1" D_FLASH_CHIP_ID "}2"); func += String(ESP.getFlashChipId()); + func += F("}1" D_FLASH_CHIP_SIZE "}2"); func += String(ESP.getFlashChipRealSize() / 1024); func += F("kB"); + func += F("}1" D_PROGRAM_FLASH_SIZE "}2"); func += String(ESP.getFlashChipSize() / 1024); func += F("kB"); + func += F("}1" D_PROGRAM_SIZE "}2"); func += String(ESP.getSketchSize() / 1024); func += F("kB"); + func += F("}1" D_FREE_PROGRAM_SPACE "}2"); func += String(ESP.getFreeSketchSpace() / 1024); func += F("kB"); + func += F("}1" D_FREE_MEMORY "}2"); func += String(freeMem / 1024); func += F("kB"); + func += F("
"); + func += FPSTR(HTTP_SCRIPT_INFO_END); + page.replace(F(""), func); + page.replace(F(""), F("")); + + // page += F("
"); + page += FPSTR(HTTP_BTN_MAIN); + ShowPage(page); +} +#endif // Not BE_MINIMAL + void HandleUpgradeFirmware() { if (HttpUser()) { return; } @@ -1629,121 +1750,6 @@ void HandleAjaxConsoleRefresh() WebServer->send(200, FPSTR(HDR_CTYPE_XML), message); } -void HandleInformation() -{ - if (HttpUser()) { return; } - AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_INFORMATION); - - char stopic[TOPSZ]; - - int freeMem = ESP.getFreeHeap(); - - String page = FPSTR(HTTP_HEAD); - page.replace(F("{v}"), FPSTR(S_INFORMATION)); - page += FPSTR(HTTP_HEAD_STYLE); - // page += F("
 Information "); - - page += F(""); - page += F("
"); - - // Save 1k of code space replacing table html with javascript replace codes - // }1 = - // }2 = - String func = FPSTR(HTTP_SCRIPT_INFO_BEGIN); - func += F("
"); - func += F(D_PROGRAM_VERSION "}2"); func += my_version; - func += F("}1" D_BUILD_DATE_AND_TIME "}2"); func += GetBuildDateAndTime(); - func += F("}1" D_CORE_AND_SDK_VERSION "}2" ARDUINO_ESP8266_RELEASE "/"); func += String(ESP.getSdkVersion()); - func += F("}1" D_UPTIME "}2"); func += GetDateAndTime(DT_UPTIME); - snprintf_P(stopic, sizeof(stopic), PSTR(" at %X"), GetSettingsAddress()); - func += F("}1" D_FLASH_WRITE_COUNT "}2"); func += String(Settings.save_flag); func += stopic; - func += F("}1" D_BOOT_COUNT "}2"); func += String(Settings.bootcount); - func += F("}1" D_RESTART_REASON "}2"); func += GetResetReason(); - uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present; - if (SONOFF_IFAN02 == Settings.module) { maxfn = 1; } - for (byte i = 0; i < maxfn; i++) { - func += F("}1" D_FRIENDLY_NAME " "); func += i +1; func += F("}2"); func += Settings.friendlyname[i]; - } - - func += F("}1}2 "); // Empty line - func += F("}1" D_AP); func += String(Settings.sta_active +1); - func += F(" " D_SSID " (" D_RSSI ")}2"); func += Settings.sta_ssid[Settings.sta_active]; func += F(" ("); func += WifiGetRssiAsQuality(WiFi.RSSI()); func += F("%)"); - func += F("}1" D_HOSTNAME "}2"); func += my_hostname; - if (static_cast(WiFi.localIP()) != 0) { - func += F("}1" D_IP_ADDRESS "}2"); func += WiFi.localIP().toString(); - func += F("}1" D_GATEWAY "}2"); func += IPAddress(Settings.ip_address[1]).toString(); - func += F("}1" D_SUBNET_MASK "}2"); func += IPAddress(Settings.ip_address[2]).toString(); - func += F("}1" D_DNS_SERVER "}2"); func += IPAddress(Settings.ip_address[3]).toString(); - func += F("}1" D_MAC_ADDRESS "}2"); func += WiFi.macAddress(); - } - if (static_cast(WiFi.softAPIP()) != 0) { - func += F("}1" D_AP " " D_IP_ADDRESS "}2"); func += WiFi.softAPIP().toString(); - func += F("}1" D_AP " " D_GATEWAY "}2"); func += WiFi.softAPIP().toString(); - func += F("}1" D_AP " " D_MAC_ADDRESS "}2"); func += WiFi.softAPmacAddress(); - } - - func += F("}1}2 "); // Empty line - if (Settings.flag.mqtt_enabled) { - func += F("}1" D_MQTT_HOST "}2"); func += Settings.mqtt_host; - func += F("}1" D_MQTT_PORT "}2"); func += String(Settings.mqtt_port); - func += F("}1" D_MQTT_CLIENT " &
 " D_FALLBACK_TOPIC "}2"); func += mqtt_client; - func += F("}1" D_MQTT_USER "}2"); func += Settings.mqtt_user; - func += F("}1" D_MQTT_TOPIC "}2"); func += Settings.mqtt_topic; - func += F("}1" D_MQTT_GROUP_TOPIC "}2"); func += Settings.mqtt_grptopic; - GetTopic_P(stopic, CMND, mqtt_topic, ""); - func += F("}1" D_MQTT_FULL_TOPIC "}2"); func += stopic; - - } else { - func += F("}1" D_MQTT "}2" D_DISABLED); - } - - func += F("}1}2 "); // Empty line - func += F("}1" D_EMULATION "}2"); -#ifdef USE_EMULATION - if (EMUL_WEMO == Settings.flag2.emulation) { - func += F(D_BELKIN_WEMO); - } - else if (EMUL_HUE == Settings.flag2.emulation) { - func += F(D_HUE_BRIDGE); - } - else { - func += F(D_NONE); - } -#else - func += F(D_DISABLED); -#endif // USE_EMULATION - - func += F("}1" D_MDNS_DISCOVERY "}2"); -#ifdef USE_DISCOVERY - func += F(D_ENABLED); - func += F("}1" D_MDNS_ADVERTISE "}2"); -#ifdef WEBSERVER_ADVERTISE - func += F(D_WEB_SERVER); -#else - func += F(D_DISABLED); -#endif // WEBSERVER_ADVERTISE -#else - func += F(D_DISABLED); -#endif // USE_DISCOVERY - - func += F("}1}2 "); // Empty line - func += F("}1" D_ESP_CHIP_ID "}2"); func += String(ESP.getChipId()); - func += F("}1" D_FLASH_CHIP_ID "}2"); func += String(ESP.getFlashChipId()); - func += F("}1" D_FLASH_CHIP_SIZE "}2"); func += String(ESP.getFlashChipRealSize() / 1024); func += F("kB"); - func += F("}1" D_PROGRAM_FLASH_SIZE "}2"); func += String(ESP.getFlashChipSize() / 1024); func += F("kB"); - func += F("}1" D_PROGRAM_SIZE "}2"); func += String(ESP.getSketchSize() / 1024); func += F("kB"); - func += F("}1" D_FREE_PROGRAM_SPACE "}2"); func += String(ESP.getFreeSketchSpace() / 1024); func += F("kB"); - func += F("}1" D_FREE_MEMORY "}2"); func += String(freeMem / 1024); func += F("kB"); - func += F("
"); - func += FPSTR(HTTP_SCRIPT_INFO_END); - page.replace(F(""), func); - page.replace(F(""), F("")); - - // page += F("
"); - page += FPSTR(HTTP_BTN_MAIN); - ShowPage(page); -} - void HandleRestart() { if (HttpUser()) { return; } diff --git a/sonoff/xdrv_03_energy.ino b/sonoff/xdrv_03_energy.ino index e862ffdcd..3e12ef94f 100644 --- a/sonoff/xdrv_03_energy.ino +++ b/sonoff/xdrv_03_energy.ino @@ -17,8 +17,6 @@ along with this program. If not, see . */ -#define USE_ENERGY_SENSOR - #ifdef USE_ENERGY_SENSOR /*********************************************************************************************\ * HLW8012 and PZEM004T - Energy @@ -93,18 +91,18 @@ void EnergyUpdateToday() } /*********************************************************************************************\ - * HLW8012, BL0937 or HJL-01 - Energy (Sonoff Pow) + * HLW8012, BL0937 or HJL-01 - Energy (Sonoff Pow, HuaFan, KMC70011, BlitzWolf) * * Based on Source: Shenzhen Heli Technology Co., Ltd \*********************************************************************************************/ -// HLW8012 based (Sonoff Pow, KMC70011) +// HLW8012 based (Sonoff Pow, KMC70011, HuaFan) #define HLW_PREF 10000 // 1000.0W #define HLW_UREF 2200 // 220.0V #define HLW_IREF 4545 // 4.545A #define HLW_SEL_VOLTAGE 1 -// HJL-01 based (Homecube, BlitzWolf) +// HJL-01 based (BlitzWolf, Homecube, Gosund) #define HJL_PREF 1362 #define HJL_UREF 822 #define HJL_IREF 3300