diff --git a/.gitignore b/.gitignore index 3ac33def4..b6460347b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,12 +2,13 @@ .DS_Store .fuse_hidden* - ## Project files ###### .pioenvs .piolibdeps .clang_complete .gcc-flags.json -lib/readme.txt sonoff/user_config_override.h -sonoff/user_config_my.h +build + +## Visual Studio Code specific ###### +.vscode diff --git a/README.md b/README.md index 303fb872e..3eca78b2b 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,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 **5.13.1b** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. +Current version is **5.14.0a** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. ### Quick install Download one of the released binaries from https://github.com/arendst/Sonoff-Tasmota/releases and flash it to your hardware as documented in the wiki. @@ -108,6 +108,7 @@ Different firmware images are released based on Features and Sensors selection g | USE_BH1750 | x | x | - | x | x | | USE_VEML6070 | - | - | - | - | x | | USE_TSL2561 | - | - | - | - | x | +| USE_SI1145 | - | - | - | - | x | | USE_ADS1115 | - | - | - | - | x | | USE_ADS1115_I2CDEV | - | - | - | - | - | | USE_INA219 | - | - | - | - | x | @@ -119,6 +120,7 @@ Different firmware images are released based on Features and Sensors selection g | USE_NOVA_SDS | x | - | - | x | x | | USE_PZEM004T | x | x | - | x | x | | USE_SERIAL_BRIDGE | x | - | - | x | x | +| USE_SDM120 | - | - | - | - | x | | USE_IR_REMOTE | x | x | - | x | x | | USE_IR_HVAC | - | - | - | - | x | | USE_IR_RECEIVE | x | - | - | x | x | @@ -129,11 +131,11 @@ Different firmware images are released based on Features and Sensors selection g #### Typical file size -| ESP/Arduino library version | sonoff | classic | minimal | knx | allsensors | -|--------------------------------|--------|---------|---------|------|------------| -| ESP/Arduino lib v2.3.0 | 526k | 488k | 427k | 535k | 549k | -| ESP/Arduino lib v2.4.0 | 531k | 496k | 435k | 540k | 552k | -| ESP/Arduino lib v2.4.1 | 534k | 499k | 437k | 543k | 555k | +| 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 | ### Contribute You can contribute to Sonoff-Tasmota by @@ -182,7 +184,7 @@ People helping to keep the show on the road: - Gerhard Mutz for his SGP30 and Sunrise/Sunset driver - Nuno Ferreira for his HC-SR04 driver - Adrian Scillato for his (security)fixes and implementing and maintaining KNX -- Gennaro Tortone for his Eastron SDM120 driver +- Gennaro Tortone for implementing and maintaining Eastron drivers - Raymond Mouthaan for managing Wemos Wiki information - Norbert Richter, Frogmore42 and Jason2866 for providing many issue answers - Many more providing Tips, Pocs or PRs diff --git a/platformio.ini b/platformio.ini index 5ac5a1941..233f36553 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,12 +11,13 @@ src_dir = sonoff ; *** Uncomment one of the lines below to build/upload only one environment -;env_default = sonoff +env_default = sonoff ;env_default = sonoff-minimal ;env_default = sonoff-classic ;env_default = sonoff-knx ;env_default = sonoff-allsensors ;env_default = sonoff-BG +;env_default = sonoff-BR ;env_default = sonoff-CN ;env_default = sonoff-CZ ;env_default = sonoff-DE @@ -33,11 +34,11 @@ src_dir = sonoff [common] ; ************************************************************ ; *** Esp8266 core for Arduino version -;platform = espressif8266@1.5.0 ; v2.3.0 +platform = espressif8266@1.5.0 ; v2.3.0 ;platform = espressif8266@1.6.0 ; v2.4.0 ;platform = espressif8266@1.7.0 ; v2.4.1 ;platform = https://github.com/platformio/platform-espressif8266.git#feature/stage -platform = espressif8266 +;platform = espressif8266 framework = arduino board = esp01_1m @@ -147,6 +148,18 @@ upload_speed = ${common.upload_speed} upload_port = ${common.upload_port} extra_scripts = ${common.extra_scripts} +[env:sonoff-BR] +platform = ${common.platform} +framework = ${common.framework} +board = ${common.board} +board_flash_mode = ${common.board_flash_mode} +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags} -DMY_LANGUAGE=pt-BR +monitor_baud = ${common.monitor_baud} +upload_speed = ${common.upload_speed} +upload_port = ${common.upload_port} +extra_scripts = ${common.extra_scripts} + [env:sonoff-CN] platform = ${common.platform} framework = ${common.framework} diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index fc814d10a..dafa7a55a 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,8 +1,12 @@ -/* 5.13.1b - * Prep for user entry DST/STD (#2721) +/* 5.14.0a + * Updated to latest release * - * 5.13.1a - * Change user_config.h otaurl to http://sonoff.maddox.co.uk/tasmota/sonoff.bin (#2588, #2602) + * 5.14.0 20180515 + * Update language files + * Update TasmotaSerial to 2.0.0 allowing Hardware Serial Fallback when correct connections are configured + * Change command handling + * Change user_config(_override).h defines TIME_STD and TIME_DST + * Change user_config(_override).h otaurl to http://sonoff.maddox.co.uk/tasmota/sonoff.bin (#2588, #2602) * Fix configuration restore regression from 5.13.1 * Fix compile error when ADC is enabled and Rules are disabled (#2608) * Fix rule power trigger when no backlog command is used (#2613) @@ -11,20 +15,18 @@ * Fix sensor MHZ-19 vanishing data over time (#2659) * Fix KNX reconnection issue (#2679) * Fix DST and STD time for Southern Hemisphere (#2684, #2714) - * Add SetOption26 to enforce use of indexes even when only one relay is present (#1055) * Add Portuguese in Brazil language file + * Add SetOption26 to enforce use of indexes even when only one relay is present (#1055) + * Add support for sensor SI1145 UV Index / IR / Visible light (#2496) * Add rule state test for On/Off in addition to 0/1 (#2613) * Add hardware serial option to MHZ-19 sensor (#2659) * Add Eastron SDM120 energy meter (#2694) - * Add support for sensor SI1145 UV Index / IR / Visible light (#2496) - * Updated Italian language file (#2618) - * Update TasmotaSerial to 2.0.0 allowing Hardware Serial Fallback when correct connections are configured - * Optimize command handling + * Add user entry DST/STD using commands TimeStd and TimeDst (See wiki for parameter syntax) (#2721) * * 5.13.1 20180501 * Fix JSON buffers size too small for execution in some situations (#2580) - * Add define MODULE for user selecting default model although it preferably should not be changed (#569, #2589) * Fix configuration restore (#2591) + * Add define MODULE for user selecting default model although it preferably should not be changed (#569, #2589) * * 5.13.0 20180430 * Change platformio option sonoff-ds18x20 to sonoff-allsensors enabling ds18x20 and all other sensors in one image diff --git a/sonoff/i18n.h b/sonoff/i18n.h index ea626017c..365fee826 100644 --- a/sonoff/i18n.h +++ b/sonoff/i18n.h @@ -88,6 +88,9 @@ #define D_JSON_PERIOD "Period" #define D_JSON_POWERFACTOR "Factor" #define D_JSON_POWERUSAGE "Power" +#define D_JSON_ACTIVE_POWERUSAGE "ActivePower" +#define D_JSON_APPARENT_POWERUSAGE "ApparentPower" +#define D_JSON_REACTIVE_POWERUSAGE "ReactivePower" #define D_JSON_PRESSURE "Pressure" #define D_JSON_PRESSUREATSEALEVEL "SeaPressure" #define D_JSON_PROGRAMFLASHSIZE "ProgramFlashSize" @@ -224,6 +227,8 @@ #define D_JSON_RESET_AND_RESTARTING "Reset and Restarting" #define D_JSON_ONE_TO_RESET "1 to reset" #define D_CMND_TIMEZONE "Timezone" +#define D_CMND_TIMESTD "TimeStd" +#define D_CMND_TIMEDST "TimeDst" #define D_CMND_ALTITUDE "Altitude" #define D_CMND_LEDPOWER "LedPower" #define D_CMND_LEDSTATE "LedState" diff --git a/sonoff/language/bg-BG.h b/sonoff/language/bg-BG.h index dfaebe802..4e4bbae5b 100644 --- a/sonoff/language/bg-BG.h +++ b/sonoff/language/bg-BG.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v5.12.0m + * Updated until v5.13.1c \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -61,7 +61,7 @@ #define D_BRIGHTLIGHT "Яркост" #define D_BUTTON "Бутон" #define D_BY "от" // Written by me -#define D_BYTES "Байт" +#define D_BYTES "Байта" #define D_CELSIUS "Целзий" #define D_CO2 "Въглероден диоксид" #define D_CODE "код" // Button code @@ -75,7 +75,7 @@ #define D_DARKLIGHT "Тъмна" #define D_DEBUG "Дебъгване" #define D_DISABLED "Деактивиран" -#define D_DISTANCE "Distance" +#define D_DISTANCE "Разстояние" #define D_DNS_SERVER "DNS Сървър" #define D_DONE "Изпълнено" #define D_DST_TIME "DST" @@ -86,12 +86,12 @@ #define D_ERROR "Грешка" #define D_FAHRENHEIT "Фаренхайт" #define D_FAILED "Неуспешно" -#define D_FALLBACK "Обратна връзка" -#define D_FALLBACK_TOPIC "Топик на обратната връзка" +#define D_FALLBACK "Помощен" +#define D_FALLBACK_TOPIC "Помощен топик" #define D_FALSE "Невярно" #define D_FILE "Файл" #define D_FREE_MEMORY "Свободна памет" -#define D_FREQUENCY "Frequency" +#define D_FREQUENCY "Честота" #define D_GAS "Газ" #define D_GATEWAY "Шлюз" #define D_GROUP "Група" @@ -99,10 +99,10 @@ #define D_HOSTNAME "Име на хоста" #define D_HUMIDITY "Влажност" #define D_ILLUMINANCE "Осветеност" -#define D_IMMEDIATE "моментален" // Button immediate +#define D_IMMEDIATE "Моментен" // Button immediate #define D_INDEX "Индекс" #define D_INFO "Информация" -#define D_INFRARED "Infrared" +#define D_INFRARED "Инфрачервен" #define D_INITIALIZED "Инициализирано" #define D_IP_ADDRESS "IP адрес" #define D_LIGHT "Светлина" @@ -121,6 +121,9 @@ #define D_PORT "Порт" #define D_POWER_FACTOR "Фактор на мощността" #define D_POWERUSAGE "Мощност" +#define D_POWERUSAGE_ACTIVE "Активна мощност" +#define D_POWERUSAGE_APPARENT "Пълна мощност" +#define D_POWERUSAGE_REACTIVE "Реактивна мощност" #define D_PRESSURE "Налягане" #define D_PRESSUREATSEALEVEL "Налягане на морското ниво" #define D_PROGRAM_FLASH_SIZE "Размер на флаш паметта за програми" @@ -156,7 +159,7 @@ #define D_UPTIME "Време от стартирането" #define D_USER "Потребител" #define D_UTC_TIME "UTC" -#define D_UV_INDEX "UV Index" +#define D_UV_INDEX "UV индекс" #define D_UV_LEVEL "Ниво на ултравиолетово излъчване" #define D_VERSION "Версия" #define D_VOLTAGE "Напрежение" @@ -202,7 +205,7 @@ #define D_ERASED_SECTOR "Изтрит сектор" // webserver.ino -#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Фърмуеър MINIMAL - моля надградете го" +#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Минимаен фърмуеър - моля надградете го" #define D_WEBSERVER_ACTIVE_ON "Уеб сървърът е активен на" #define D_WITH_IP_ADDRESS "с IP адрес" #define D_WEBSERVER_STOPPED "Уеб сървърът е спрян" @@ -271,12 +274,12 @@ #define D_OTHER_PARAMETERS "Други параметри" #define D_WEB_ADMIN_PASSWORD "Парола на уеб администратора" -#define D_MQTT_ENABLE "активиране на MQTT" -#define D_FRIENDLY_NAME "приятелско име" +#define D_MQTT_ENABLE "Активиране на MQTT" +#define D_FRIENDLY_NAME "Приятелско име" #define D_BELKIN_WEMO "Belkin WeMo" #define D_HUE_BRIDGE "Hue Bridge" -#define D_SINGLE_DEVICE "единично" -#define D_MULTI_DEVICE "мулти" +#define D_SINGLE_DEVICE "Единично" +#define D_MULTI_DEVICE "Мулти" #define D_SAVE_CONFIGURATION "Запазване на конфигурацията" #define D_CONFIGURATION_SAVED "Конфигурацията е запазена" @@ -296,7 +299,7 @@ #define D_MQTT_FULL_TOPIC "MQTT пълен топик" #define D_MDNS_DISCOVERY "mDNS откриване" #define D_MDNS_ADVERTISE "mDNS транслация" -#define D_ESP_CHIP_ID "ID на чипа ESP" +#define D_ESP_CHIP_ID "ID на ESP чипа" #define D_FLASH_CHIP_ID "ID на чипа на флаш паметта" #define D_FLASH_CHIP_SIZE "Размер на флаш паметта" #define D_FREE_PROGRAM_SPACE "Свободно пространство за програми" @@ -313,7 +316,7 @@ #define D_UPLOAD_ERR_3 "Magic байтът не е 0xE9" #define D_UPLOAD_ERR_4 "Размерът на програмата е по-голям от реалния размер на флаш паметта" #define D_UPLOAD_ERR_5 "Грешка при зареждането в буфера" -#define D_UPLOAD_ERR_6 "Грешка пр зареждането. Включено е ниво 3 на лога" +#define D_UPLOAD_ERR_6 "Грешка при зареждането. Включено е ниво 3 на лога" #define D_UPLOAD_ERR_7 "Зареждането е прекъснато" #define D_UPLOAD_ERR_8 "Файлът е невалиден" #define D_UPLOAD_ERR_9 "Файлът е прекалено голям" @@ -345,7 +348,7 @@ #define D_RESPONSE_SENT "Отговорът е изпратен" #define D_HUE "Hue" -#define D_HUE_BRIDGE_SETUP "Hue мост настройка" +#define D_HUE_BRIDGE_SETUP "Настройка на Hue bridge" #define D_HUE_API_NOT_IMPLEMENTED "Hue API не е внедрено" #define D_HUE_API "Hue API" #define D_HUE_POST_ARGS "Hue POST аргументи" @@ -410,9 +413,9 @@ // xsns_06_dht.ino #define D_TIMEOUT_WAITING_FOR "Изтекло време за очакване на" -#define D_START_SIGNAL_LOW "стартов сигнал нисък" -#define D_START_SIGNAL_HIGH "стартов сигнал висок" -#define D_PULSE "импулс" +#define D_START_SIGNAL_LOW "Нисък стартов сигнал" +#define D_START_SIGNAL_HIGH "Висок стартов сигнал" +#define D_PULSE "Импулс" #define D_CHECKSUM_FAILURE "Грешка в контролната сума" // xsns_07_sht1x.ino @@ -422,10 +425,10 @@ // xsns_18_pms5003.ino #define D_STANDARD_CONCENTRATION "CF-1 PM" // Standard Particle CF-1 Particle Matter #define D_ENVIRONMENTAL_CONCENTRATION "PM" // Environmetal Particle Matter -#define D_PARTICALS_BEYOND "Particals" +#define D_PARTICALS_BEYOND "Частици" // sonoff_template.h -#define D_SENSOR_NONE "няма" +#define D_SENSOR_NONE "Няма" #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" @@ -460,28 +463,30 @@ #define D_SENSOR_SDM120_RX "SDM120 Rx" // Units -#define D_UNIT_AMPERE "А" -#define D_UNIT_CENTIMETER "см" +#define D_UNIT_AMPERE "A" +#define D_UNIT_CENTIMETER "cm" #define D_UNIT_HERTZ "Hz" -#define D_UNIT_HOUR "ч" -#define D_UNIT_KILOOHM "кОм" -#define D_UNIT_KILOWATTHOUR "кВт/ч" -#define D_UNIT_LUX "лукс" -#define D_UNIT_MICROGRAM_PER_CUBIC_METER "микрограм/м3" -#define D_UNIT_MICROMETER "микрометър" -#define D_UNIT_MICROSECOND "микросек" -#define D_UNIT_MILLIAMPERE "мА" -#define D_UNIT_MILLISECOND "мсек" -#define D_UNIT_MINUTE "мин" +#define D_UNIT_HOUR "h" +#define D_UNIT_KILOOHM "kΩ" +#define D_UNIT_KILOWATTHOUR "kWh" +#define D_UNIT_LUX "lx" +#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m3" +#define D_UNIT_MICROMETER "µm" +#define D_UNIT_MICROSECOND "µs" +#define D_UNIT_MILLIAMPERE "mA" +#define D_UNIT_MILLISECOND "ms" +#define D_UNIT_MINUTE "min" #define D_UNIT_PARTS_PER_BILLION "ppb" #define D_UNIT_PARTS_PER_DECILITER "ppd" #define D_UNIT_PARTS_PER_MILLION "ppm" -#define D_UNIT_PRESSURE "хПа" -#define D_UNIT_SECOND "сек" +#define D_UNIT_PRESSURE "hPa" +#define D_UNIT_SECOND "s" #define D_UNIT_SECTORS "сектори" -#define D_UNIT_VOLT "В" -#define D_UNIT_WATT "Вт" -#define D_UNIT_WATTHOUR "Вт/ч" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" +#define D_UNIT_VOLT "V" +#define D_UNIT_WATT "W" +#define D_UNIT_WATTHOUR "Wh" // Log message prefix #define D_LOG_APPLICATION "APP: " // Application diff --git a/sonoff/language/cs-CZ.h b/sonoff/language/cs-CZ.h index 49239eef8..73e2098c5 100644 --- a/sonoff/language/cs-CZ.h +++ b/sonoff/language/cs-CZ.h @@ -121,6 +121,9 @@ #define D_PORT "Port" #define D_POWER_FACTOR "Účiník" #define D_POWERUSAGE "Příkon" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Tlak" #define D_PRESSUREATSEALEVEL "Tlak na úrovni hladiny moře" #define D_PROGRAM_FLASH_SIZE "Velikost paměti flash" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sec" #define D_UNIT_SECTORS "sektory" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h index 0201e00ed..35a9f3dad 100644 --- a/sonoff/language/de-DE.h +++ b/sonoff/language/de-DE.h @@ -121,6 +121,9 @@ #define D_PORT "Port" #define D_POWER_FACTOR "Leistungsfaktor" #define D_POWERUSAGE "Leistung" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Luftdruck" #define D_PRESSUREATSEALEVEL "Luftdruck auf Meereshöhe" #define D_PROGRAM_FLASH_SIZE "Ges. Flash Speicher" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sek" #define D_UNIT_SECTORS "Sektoren" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/el-GR.h b/sonoff/language/el-GR.h index c479b3586..e23f629b0 100644 --- a/sonoff/language/el-GR.h +++ b/sonoff/language/el-GR.h @@ -121,6 +121,9 @@ #define D_PORT "Πόρτα" #define D_POWER_FACTOR "Παράγοντας ισχύος" #define D_POWERUSAGE "Ισχύης" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Πίεση" #define D_PRESSUREATSEALEVEL "Πίεση στην επιφάνεια της Θάλασσας" #define D_PROGRAM_FLASH_SIZE "Μέγεθος Προγράμματος Flash" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sec" #define D_UNIT_SECTORS "sectors" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h index b841f02d5..4f97a5eef 100644 --- a/sonoff/language/en-GB.h +++ b/sonoff/language/en-GB.h @@ -121,6 +121,9 @@ #define D_PORT "Port" #define D_POWER_FACTOR "Power Factor" #define D_POWERUSAGE "Power" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Pressure" #define D_PRESSUREATSEALEVEL "SeaPressure" #define D_PROGRAM_FLASH_SIZE "Program Flash Size" @@ -478,6 +481,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sec" #define D_UNIT_SECTORS "sectors" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/es-AR.h b/sonoff/language/es-AR.h index a0f80b73f..15dac69ab 100644 --- a/sonoff/language/es-AR.h +++ b/sonoff/language/es-AR.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v5.13.1a + * Updated until v5.13.1c \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -121,6 +121,9 @@ #define D_PORT "Puerto" #define D_POWER_FACTOR "Factor de Potencia" #define D_POWERUSAGE "Potencia" +#define D_POWERUSAGE_ACTIVE "Potencia Activa" +#define D_POWERUSAGE_APPARENT "Potencia Aparente" +#define D_POWERUSAGE_REACTIVE "Potencia Reactiva" #define D_PRESSURE "Presión" #define D_PRESSUREATSEALEVEL "Presión al nivel del mar" #define D_PROGRAM_FLASH_SIZE "Tamaño de Flash de Programa" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "seg" #define D_UNIT_SECTORS "sectores" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/fr-FR.h b/sonoff/language/fr-FR.h index cae6908ae..26cee81e9 100644 --- a/sonoff/language/fr-FR.h +++ b/sonoff/language/fr-FR.h @@ -121,6 +121,9 @@ #define D_PORT "Port" #define D_POWER_FACTOR "Facteur de puissance" #define D_POWERUSAGE "Puissance" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Pression" #define D_PRESSUREATSEALEVEL "PressionMer" #define D_PROGRAM_FLASH_SIZE "Taille Flash Programme" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sec" #define D_UNIT_SECTORS "secteurs" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/hu-HU.h b/sonoff/language/hu-HU.h index 773ff3d2e..5ecab817b 100644 --- a/sonoff/language/hu-HU.h +++ b/sonoff/language/hu-HU.h @@ -121,6 +121,9 @@ #define D_PORT "Port" #define D_POWER_FACTOR "Teljesítmény tényező" #define D_POWERUSAGE "Energiafelhasználás" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Nyomás" #define D_PRESSUREATSEALEVEL "Tengerszinti nyomás" #define D_PROGRAM_FLASH_SIZE "Program Flash Méret" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "m" #define D_UNIT_SECTORS "szektorok" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/it-IT.h b/sonoff/language/it-IT.h index 2096fe8c3..91808c973 100644 --- a/sonoff/language/it-IT.h +++ b/sonoff/language/it-IT.h @@ -121,6 +121,9 @@ #define D_PORT "Porta" #define D_POWER_FACTOR "Fattore di potenza" #define D_POWERUSAGE "Potenza" +#define D_POWERUSAGE_ACTIVE "Potenza Attiva" +#define D_POWERUSAGE_APPARENT "Potenza Apparente" +#define D_POWERUSAGE_REACTIVE "Potenza Reattiva" #define D_PRESSURE "Pressione" #define D_PRESSUREATSEALEVEL "Pressione al livello del mare" #define D_PROGRAM_FLASH_SIZE "Dimensione Flash Programma" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sec" #define D_UNIT_SECTORS "settori" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h index dec9a11de..86125053e 100644 --- a/sonoff/language/nl-NL.h +++ b/sonoff/language/nl-NL.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v5.13.1a + * Updated until v5.13.1c \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -121,6 +121,9 @@ #define D_PORT "Poort" #define D_POWER_FACTOR "Arbeidsfactor" #define D_POWERUSAGE "Vermogen" +#define D_POWERUSAGE_ACTIVE "Werkelijk vermogen" +#define D_POWERUSAGE_APPARENT "Schijnbaar vermogen" +#define D_POWERUSAGE_REACTIVE "Blindvermogen" #define D_PRESSURE "Luchtdruk" #define D_PRESSUREATSEALEVEL "ZeeLuchtdruk" #define D_PROGRAM_FLASH_SIZE "Programma Flash Grootte" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sec" #define D_UNIT_SECTORS "sectoren" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/pl-PL.h b/sonoff/language/pl-PL.h index 5d30ffd7f..688c3507e 100644 --- a/sonoff/language/pl-PL.h +++ b/sonoff/language/pl-PL.h @@ -121,6 +121,9 @@ #define D_PORT "Port" #define D_POWER_FACTOR "Współczynik mocy" #define D_POWERUSAGE "Moc" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Ciśnienie" #define D_PRESSUREATSEALEVEL "Ciśnienie na poziomie morza" #define D_PROGRAM_FLASH_SIZE "Wielkość programu flash" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sec" #define D_UNIT_SECTORS "sektory" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/pt-BR.h b/sonoff/language/pt-BR.h index c29cf9bd9..6bf9a6211 100644 --- a/sonoff/language/pt-BR.h +++ b/sonoff/language/pt-BR.h @@ -121,6 +121,9 @@ #define D_PORT "Porta" #define D_POWER_FACTOR "Fator de potência" #define D_POWERUSAGE "Potência" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Pressão" #define D_PRESSUREATSEALEVEL "Pressão ao nível do mar" #define D_PROGRAM_FLASH_SIZE "Tamanho do programa na memória" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "s" #define D_UNIT_SECTORS "setores" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "W/h" diff --git a/sonoff/language/pt-PT.h b/sonoff/language/pt-PT.h index 4605975c3..68d7cd1c5 100644 --- a/sonoff/language/pt-PT.h +++ b/sonoff/language/pt-PT.h @@ -121,6 +121,9 @@ #define D_PORT "Porta" #define D_POWER_FACTOR "Factor de Potência" #define D_POWERUSAGE "Potência" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Pressão" #define D_PRESSUREATSEALEVEL "Pressão ao nível do Mar" #define D_PROGRAM_FLASH_SIZE "Tamanho do Programa na Flash" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "hPa" #define D_UNIT_SECOND "sec" #define D_UNIT_SECTORS "sectors" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "V" #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" diff --git a/sonoff/language/ru-RU.h b/sonoff/language/ru-RU.h index 0de9d88cc..85540343d 100644 --- a/sonoff/language/ru-RU.h +++ b/sonoff/language/ru-RU.h @@ -121,6 +121,9 @@ #define D_PORT "Порт" #define D_POWER_FACTOR "Коэффициент Мощности" #define D_POWERUSAGE "Мощность" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "Давление" #define D_PRESSUREATSEALEVEL "Давление на уровне моря" #define D_PROGRAM_FLASH_SIZE "Размер Flash для программ" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "гПа" #define D_UNIT_SECOND "сек" #define D_UNIT_SECTORS "секторов" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "В" #define D_UNIT_WATT "Вт" #define D_UNIT_WATTHOUR "ВтЧ" diff --git a/sonoff/language/zh-CN.h b/sonoff/language/zh-CN.h index fce4fe3e7..853c68389 100644 --- a/sonoff/language/zh-CN.h +++ b/sonoff/language/zh-CN.h @@ -121,6 +121,9 @@ #define D_PORT "端口" #define D_POWER_FACTOR "功率因数" #define D_POWERUSAGE "功率" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "气压" #define D_PRESSUREATSEALEVEL "海平面气压" #define D_PROGRAM_FLASH_SIZE "固件 Flash 大小" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "百帕" #define D_UNIT_SECOND "秒" #define D_UNIT_SECTORS "扇区" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "伏" #define D_UNIT_WATT "瓦" #define D_UNIT_WATTHOUR "瓦时" diff --git a/sonoff/language/zh-TW.h b/sonoff/language/zh-TW.h index f17caf10e..5986dc804 100644 --- a/sonoff/language/zh-TW.h +++ b/sonoff/language/zh-TW.h @@ -121,6 +121,9 @@ #define D_PORT "端口" #define D_POWER_FACTOR "功率因數" #define D_POWERUSAGE "功率" +#define D_POWERUSAGE_ACTIVE "Active Power" +#define D_POWERUSAGE_APPARENT "Apparent Power" +#define D_POWERUSAGE_REACTIVE "Reactive Power" #define D_PRESSURE "氣壓" #define D_PRESSUREATSEALEVEL "海平面氣壓" #define D_PROGRAM_FLASH_SIZE "韌體 Flash 大小" @@ -479,6 +482,8 @@ #define D_UNIT_PRESSURE "百帕" #define D_UNIT_SECOND "秒" #define D_UNIT_SECTORS "扇區" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "VAr" #define D_UNIT_VOLT "伏" #define D_UNIT_WATT "瓦" #define D_UNIT_WATTHOUR "瓦時" diff --git a/sonoff/settings.h b/sonoff/settings.h index 6dfc4cdeb..ec156c85a 100644 --- a/sonoff/settings.h +++ b/sonoff/settings.h @@ -20,7 +20,7 @@ #ifndef _SETTINGS_H_ #define _SETTINGS_H_ -#define PARAM8_SIZE 23 // Number of param bytes +#define PARAM8_SIZE 18 // Number of param bytes typedef union { // Restricted by MISRA-C Rule 18.4 but so usefull... uint32_t data; // Allow bit manipulation using SetOption @@ -159,8 +159,7 @@ struct SYSCFG { uint8_t display_address[8]; // 2D8 uint8_t display_dimmer; // 2E0 uint8_t display_size; // 2E1 - TimeRule std_flags; // 2E2 - int16_t std_offset; // 2E4 offset from UTC in minutes + TimeRule tflag[2]; // 2E2 uint16_t pwm_frequency; // 2E6 power_t power; // 2E8 uint16_t pwm_value[MAX_PWMS]; // 2EC @@ -169,6 +168,10 @@ struct SYSCFG { uint8_t ex_power; // 2FA Not used since 5.8.0j uint8_t ledstate; // 2FB uint8_t param[PARAM8_SIZE]; // 2FC was domoticz_in_topic until 5.1.6 + int16_t toffset[2]; // 30E + + byte free_312[1]; // 312 + char state_text[4][11]; // 313 uint8_t energy_power_delta; // 33F uint16_t domoticz_update_timer; // 340 @@ -244,7 +247,9 @@ struct SYSCFG { char ntp_server[3][33]; // 4CE byte ina219_mode; // 531 uint16_t pulse_timer[MAX_PULSETIMERS]; // 532 - TimeRule dst_flags; // 542 + + byte free_542[2]; // 542 + uint32_t ip_address[4]; // 544 unsigned long energy_kWhtotal; // 554 char mqtt_fulltopic[100]; // 558 @@ -254,9 +259,8 @@ struct SYSCFG { uint16_t pulse_counter_debounce; // 5D2 uint8_t rf_code[17][9]; // 5D4 - byte free_66d[1]; // 66D + byte free_66d[3]; // 66D - int16_t dst_offset; // 66E Timer timer[MAX_TIMERS]; // 670 int latitude; // 6B0 int longitude; // 6B4 diff --git a/sonoff/settings.ino b/sonoff/settings.ino index 78a48e657..2d3f3c3d8 100644 --- a/sonoff/settings.ino +++ b/sonoff/settings.ino @@ -522,7 +522,7 @@ void SettingsDefaultSet2() Settings.latitude = (int)((double)LATITUDE * 1000000); Settings.longitude = (int)((double)LONGITUDE * 1000000); - SettingsDefaultSet_5_13_1a(); + SettingsDefaultSet_5_13_1c(); } /********************************************************************************************/ @@ -654,20 +654,30 @@ void SettingsDefaultSet_5_10_1() Settings.display_size = 1; } -void SettingsDefaultSet_5_13_1a() +void SettingsResetStd() { - Settings.dst_flags.hemis = TIME_DST_HEMISPHERE; - Settings.dst_flags.week = TIME_DST_WEEK; - Settings.dst_flags.dow = TIME_DST_DAY; - Settings.dst_flags.month = TIME_DST_MONTH; - Settings.dst_flags.hour = TIME_DST_HOUR; - Settings.dst_offset = TIME_DST_OFFSET; - Settings.std_flags.hemis = TIME_STD_HEMISPHERE; - Settings.std_flags.week = TIME_STD_WEEK; - Settings.std_flags.dow = TIME_STD_DAY; - Settings.std_flags.month = TIME_STD_MONTH; - Settings.std_flags.hour = TIME_STD_HOUR; - Settings.std_offset = TIME_STD_OFFSET; + Settings.tflag[0].hemis = TIME_STD_HEMISPHERE; + Settings.tflag[0].week = TIME_STD_WEEK; + Settings.tflag[0].dow = TIME_STD_DAY; + Settings.tflag[0].month = TIME_STD_MONTH; + Settings.tflag[0].hour = TIME_STD_HOUR; + Settings.toffset[0] = TIME_STD_OFFSET; +} + +void SettingsResetDst() +{ + Settings.tflag[1].hemis = TIME_DST_HEMISPHERE; + Settings.tflag[1].week = TIME_DST_WEEK; + Settings.tflag[1].dow = TIME_DST_DAY; + Settings.tflag[1].month = TIME_DST_MONTH; + Settings.tflag[1].hour = TIME_DST_HOUR; + Settings.toffset[1] = TIME_DST_OFFSET; +} + +void SettingsDefaultSet_5_13_1c() +{ + SettingsResetStd(); + SettingsResetDst(); } /********************************************************************************************/ @@ -874,8 +884,8 @@ void SettingsDelta() Settings.energy_kWhyesterday /= 1000; RtcSettings.energy_kWhtoday /= 1000; } - if (Settings.version < 0x050D0102) { - SettingsDefaultSet_5_13_1a(); + if (Settings.version < 0x050D0103) { + SettingsDefaultSet_5_13_1c(); } Settings.version = VERSION; diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 858ff8579..d8e6eb2f5 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,7 +25,7 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x050D0102 // 5.13.1b +#define VERSION 0x050E0001 // 5.14.0a // Location specific includes #include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0) @@ -83,7 +83,7 @@ enum TasmotaCommands { CMND_COUNTERDEBOUNCE, CMND_SLEEP, CMND_UPGRADE, CMND_UPLOAD, CMND_OTAURL, CMND_SERIALLOG, CMND_SYSLOG, CMND_LOGHOST, CMND_LOGPORT, CMND_IPADDRESS, CMND_NTPSERVER, CMND_AP, CMND_SSID, CMND_PASSWORD, CMND_HOSTNAME, CMND_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE, CMND_WEBSERVER, CMND_WEBPASSWORD, CMND_WEBLOG, CMND_EMULATION, - CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE, + CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_TIMESTD, CMND_TIMEDST, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE, CMND_I2CSCAN, CMND_SERIALSEND, CMND_BAUDRATE, CMND_SERIALDELIMITER }; const char kTasmotaCommands[] PROGMEM = D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_STATUS "|" D_CMND_STATE "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|" @@ -93,7 +93,7 @@ const char kTasmotaCommands[] PROGMEM = D_CMND_COUNTERDEBOUNCE "|" D_CMND_SLEEP "|" D_CMND_UPGRADE "|" D_CMND_UPLOAD "|" D_CMND_OTAURL "|" D_CMND_SERIALLOG "|" D_CMND_SYSLOG "|" D_CMND_LOGHOST "|" D_CMND_LOGPORT "|" D_CMND_IPADDRESS "|" D_CMND_NTPSERVER "|" D_CMND_AP "|" D_CMND_SSID "|" D_CMND_PASSWORD "|" D_CMND_HOSTNAME "|" D_CMND_WIFICONFIG "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_EMULATION "|" - D_CMND_TELEPERIOD "|" D_CMND_RESTART "|" D_CMND_RESET "|" D_CMND_TIMEZONE "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|" + 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; // Global variables @@ -177,6 +177,7 @@ uint8_t light_type = 0; // Light types bool pwm_present = false; // Any PWM channel configured with SetOption15 0 boolean mdns_begun = false; unsigned long features = 0UL; +uint8_t ntp_force_sync = 0; // Force NTP sync char my_version[33]; // Composed version string char my_hostname[33]; // Composed Wifi hostname @@ -454,7 +455,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) char *blcommand = strtok(dataBuf, ";"); while ((blcommand != NULL) && (backlog_index != bl_pointer)) { while(true) { - while ((*blcommand != '\0') && (isblank(*blcommand))) { blcommand++; } // Trim leading spaces + blcommand = LTrim(blcommand); if (!strncasecmp_P(blcommand, PSTR(D_CMND_BACKLOG), strlen(D_CMND_BACKLOG))) { blcommand += strlen(D_CMND_BACKLOG); // Skip unnecessary command Backlog } else { @@ -1046,6 +1047,47 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) if ((data_len > 0) && (((payload >= -13) && (payload <= 14)) || (99 == payload))) Settings.timezone = payload; snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.timezone); } + else if ((CMND_TIMESTD == command_code) || (CMND_TIMEDST == command_code)) { + // TimeStd 0/1, 0/1/2/3/4, 1..12, 1..7, 0..23, +/-780 + uint8_t ts = 0; + if (CMND_TIMEDST == command_code) { ts = 1; } + if (data_len > 0) { + if (strstr(dataBuf, ",")) { // Process parameter entry + uint8_t tpos = 0; // Parameter index + int value = 0; + p = dataBuf; // Parameters like "1, 2,3 , 4 ,5, -120" or ",,,,,+240" + char *q = p; // Value entered flag + while (p && (tpos < 7)) { + if (p > q) { // Any value entered + if (1 == tpos) { Settings.tflag[ts].hemis = value &1; } + if (2 == tpos) { Settings.tflag[ts].week = (value < 0) ? 0 : (value > 4) ? 4 : value; } + if (3 == tpos) { Settings.tflag[ts].month = (value < 1) ? 1 : (value > 12) ? 12 : value; } + if (4 == tpos) { Settings.tflag[ts].dow = (value < 1) ? 1 : (value > 7) ? 7 : value; } + if (5 == tpos) { Settings.tflag[ts].hour = (value < 0) ? 0 : (value > 23) ? 23 : value; } + if (6 == tpos) { Settings.toffset[ts] = (value < -900) ? -900 : (value > 900) ? 900 : value; } + } + p = LTrim(p); // Skip spaces + if (tpos && (*p == ',')) { p++; } // Skip separator + p = LTrim(p); // Skip spaces + q = p; // Reset any value entered flag + value = strtol(p, &p, 10); + tpos++; // Next parameter + } + ntp_force_sync = 1; + } else { + if (0 == payload) { + if (0 == ts) { + SettingsResetStd(); + } else { + SettingsResetDst(); + } + } + ntp_force_sync = 1; + } + } + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":{\"Hemisphere\":%d,\"Week\":%d,\"Month\":%d,\"Day\":%d,\"Hour\":%d,\"Offset\":%d\"}}"), + command, Settings.tflag[ts].hemis, Settings.tflag[ts].week, Settings.tflag[ts].month, Settings.tflag[ts].dow, Settings.tflag[ts].hour, Settings.toffset[ts]); + } else if (CMND_ALTITUDE == command_code) { if ((data_len > 0) && ((payload >= -30000) && (payload <= 30000))) Settings.altitude = payload; snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.altitude); diff --git a/sonoff/support.ino b/sonoff/support.ino index 9564f83aa..a12cbb6a1 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -236,6 +236,14 @@ char* UpperCase_P(char* dest, const char* source) return dest; } +char* LTrim(char* p) +{ + while ((*p != '\0') && (isblank(*p))) { + p++; // Trim leading spaces + } + return p; +} + char* NoAlNumToUnderscore(char* dest, const char* source) { char* write = dest; @@ -1357,9 +1365,10 @@ void RtcSecond() if ((ntp_sync_minute > 59) && (RtcTime.minute > 2)) ntp_sync_minute = 1; // If sync prepare for a new cycle uint8_t offset = (uptime < 30) ? RtcTime.second : (((ESP.getChipId() & 0xF) * 3) + 3) ; // First try ASAP to sync. If fails try once every 60 seconds based on chip id - if ((WL_CONNECTED == WiFi.status()) && (offset == RtcTime.second) && ((RtcTime.year < 2016) || (ntp_sync_minute == RtcTime.minute))) { + if ((WL_CONNECTED == WiFi.status()) && (offset == RtcTime.second) && ((RtcTime.year < 2016) || (ntp_sync_minute == RtcTime.minute) || ntp_force_sync)) { ntp_time = sntp_get_current_timestamp(); if (ntp_time > 1451602800) { // Fix NTP bug in core 2.4.1/SDK 2.2.1 (returns Thu Jan 01 08:00:10 1970 after power on) + ntp_force_sync = 0; utc_time = ntp_time; ntp_sync_minute = 60; // Sync so block further requests if (restart_time == 0) { @@ -1367,8 +1376,8 @@ void RtcSecond() } BreakTime(utc_time, tmpTime); RtcTime.year = tmpTime.year + 1970; - daylight_saving_time = RuleToTime(Settings.dst_flags, RtcTime.year); - standard_time = RuleToTime(Settings.std_flags, RtcTime.year); + daylight_saving_time = RuleToTime(Settings.tflag[1], RtcTime.year); + standard_time = RuleToTime(Settings.tflag[0], RtcTime.year); snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION "(" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"), GetTime(0).c_str(), GetTime(2).c_str(), GetTime(3).c_str()); AddLog(LOG_LEVEL_DEBUG); @@ -1389,9 +1398,9 @@ void RtcSecond() if (local_time > 1451602800) { // 2016-01-01 int32_t time_offset = Settings.timezone * SECS_PER_HOUR; if (99 == Settings.timezone) { - dstoffset = Settings.dst_offset * SECS_PER_MIN; - stdoffset = Settings.std_offset * SECS_PER_MIN; - if (Settings.dst_flags.hemis) { + dstoffset = Settings.toffset[1] * SECS_PER_MIN; + stdoffset = Settings.toffset[0] * SECS_PER_MIN; + if (Settings.tflag[1].hemis) { // Southern hemisphere if ((utc_time >= (standard_time - dstoffset)) && (utc_time < (daylight_saving_time - stdoffset))) { time_offset = stdoffset; // Standard Time diff --git a/sonoff/user_config.h b/sonoff/user_config.h index e06d1935a..2323e4a16 100644 --- a/sonoff/user_config.h +++ b/sonoff/user_config.h @@ -130,20 +130,20 @@ #define NTP_SERVER3 "0.nl.pool.ntp.org" // [NtpServer3] Select third NTP server by name or IP address (93.94.224.67) // -- Time - Start Daylight Saving Time and timezone offset from UTC in minutes -#define TIME_DST_HEMISPHERE North // Northern Hemisphere -#define TIME_DST_WEEK Last -#define TIME_DST_DAY Sun -#define TIME_DST_MONTH Mar // Last sunday in march -#define TIME_DST_HOUR 2 // at 02:00 -#define TIME_DST_OFFSET +120 // +120 minutes +#define TIME_DST_HEMISPHERE North // [TimeDst] Hemisphere (0 or North, 1 or South) +#define TIME_DST_WEEK Last // Week of month (0 or Last, 1 or First, 2 or Second, 3 or Third, 4 or Fourth) +#define TIME_DST_DAY Sun // Day of week (1 or Sun, 2 or Mon, 3 or Tue, 4 or Wed, 5 or Thu, 6 or Fri, 7 or Sat) +#define TIME_DST_MONTH Mar // Month (1 or Jan, 2 or Feb, 3 or Mar, 4 or Apr, 5 or May, 6 or Jun, 7 or Jul, 8 or Aug, 9 or Sep, 10 or Oct, 11 or Nov, 12 or Dec) +#define TIME_DST_HOUR 2 // Hour (0 to 23) +#define TIME_DST_OFFSET +120 // Offset from UTC in minutes (-780 to +780) // -- Time - Start Standard Time and timezone offset from UTC in minutes -#define TIME_STD_HEMISPHERE North // Northern Hemisphere -#define TIME_STD_WEEK Last -#define TIME_STD_DAY Sun -#define TIME_STD_MONTH Oct // Last sunday in october -#define TIME_STD_HOUR 3 // at 03:00 -#define TIME_STD_OFFSET +60 // +60 minutes +#define TIME_STD_HEMISPHERE North // [TimeStd] Hemisphere (0 or North, 1 or South) +#define TIME_STD_WEEK Last // Week of month (0 or Last, 1 or First, 2 or Second, 3 or Third, 4 or Fourth) +#define TIME_STD_DAY Sun // Day of week (1 or Sun, 2 or Mon, 3 or Tue, 4 or Wed, 5 or Thu, 6 or Fri, 7 or Sat) +#define TIME_STD_MONTH Oct // Month (1 or Jan, 2 or Feb, 3 or Mar, 4 or Apr, 5 or May, 6 or Jun, 7 or Jul, 8 or Aug, 9 or Sep, 10 or Oct, 11 or Nov, 12 or Dec) +#define TIME_STD_HOUR 3 // Hour (0 to 23) +#define TIME_STD_OFFSET +60 // Offset from UTC in minutes (-780 to +780) // -- Location ------------------------------------ #define LATITUDE 48.858360 // [Latitude] Your location to be used with sunrise and sunset @@ -291,7 +291,8 @@ #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 (+1k2 code) +#define USE_SDM120 // Add support for Eastron SDM120-Modbus energy meter (+1k7 code) + #define SDM120_SPEED 9600 // SDM120-Modbus RS485 serial speed (default: 2400 baud) // -- Low level interface devices ----------------- #define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+4k code, 0k3 mem, 48 iram) diff --git a/sonoff/xdrv_11_knx.ino b/sonoff/xdrv_11_knx.ino index 4c3c8b19f..89959d269 100644 --- a/sonoff/xdrv_11_knx.ino +++ b/sonoff/xdrv_11_knx.ino @@ -108,14 +108,14 @@ device_parameters_t device_param[] = { // device parameters (information that can be sent) const char * device_param_ga[] = { - D_SENSOR_RELAY " 1", // Relay 1 - D_SENSOR_RELAY " 2", // Relay 2 - D_SENSOR_RELAY " 3", // Relay 3 - D_SENSOR_RELAY " 4", // Relay 4 - D_SENSOR_RELAY " 5", // Relay 5 - D_SENSOR_RELAY " 6", // Relay 6 - D_SENSOR_RELAY " 7", // Relay 7 - D_SENSOR_RELAY " 8", // Relay 8 + D_TIMER_OUTPUT " 1", // Relay 1 + D_TIMER_OUTPUT " 2", // Relay 2 + D_TIMER_OUTPUT " 3", // Relay 3 + D_TIMER_OUTPUT " 4", // Relay 4 + D_TIMER_OUTPUT " 5", // Relay 5 + D_TIMER_OUTPUT " 6", // Relay 6 + D_TIMER_OUTPUT " 7", // Relay 7 + D_TIMER_OUTPUT " 8", // Relay 8 D_SENSOR_BUTTON " 1", // Button 1 D_SENSOR_BUTTON " 2", // Button 2 D_SENSOR_BUTTON " 3", // Button 3 @@ -131,22 +131,22 @@ const char * device_param_ga[] = { // device actions (posible actions to be performed on the device) const char *device_param_cb[] = { - D_SENSOR_RELAY " 1", // Set Relay 1 (1-On or 0-OFF) - D_SENSOR_RELAY " 2", - D_SENSOR_RELAY " 3", - D_SENSOR_RELAY " 4", - D_SENSOR_RELAY " 5", - D_SENSOR_RELAY " 6", - D_SENSOR_RELAY " 7", - D_SENSOR_RELAY " 8", - D_SENSOR_RELAY " 1 " D_BUTTON_TOGGLE, // Relay 1 Toggle (1 or 0 will toggle) - D_SENSOR_RELAY " 2 " D_BUTTON_TOGGLE, - D_SENSOR_RELAY " 3 " D_BUTTON_TOGGLE, - D_SENSOR_RELAY " 4 " D_BUTTON_TOGGLE, - D_SENSOR_RELAY " 5 " D_BUTTON_TOGGLE, - D_SENSOR_RELAY " 6 " D_BUTTON_TOGGLE, - D_SENSOR_RELAY " 7 " D_BUTTON_TOGGLE, - D_SENSOR_RELAY " 8 " D_BUTTON_TOGGLE, + D_TIMER_OUTPUT " 1", // Set Relay 1 (1-On or 0-OFF) + D_TIMER_OUTPUT " 2", + D_TIMER_OUTPUT " 3", + D_TIMER_OUTPUT " 4", + D_TIMER_OUTPUT " 5", + D_TIMER_OUTPUT " 6", + D_TIMER_OUTPUT " 7", + D_TIMER_OUTPUT " 8", + D_TIMER_OUTPUT " 1 " D_BUTTON_TOGGLE, // Relay 1 Toggle (1 or 0 will toggle) + D_TIMER_OUTPUT " 2 " D_BUTTON_TOGGLE, + D_TIMER_OUTPUT " 3 " D_BUTTON_TOGGLE, + D_TIMER_OUTPUT " 4 " D_BUTTON_TOGGLE, + D_TIMER_OUTPUT " 5 " D_BUTTON_TOGGLE, + D_TIMER_OUTPUT " 6 " D_BUTTON_TOGGLE, + D_TIMER_OUTPUT " 7 " D_BUTTON_TOGGLE, + D_TIMER_OUTPUT " 8 " D_BUTTON_TOGGLE, D_REPLY " " D_TEMPERATURE, // Reply Temperature D_REPLY " " D_HUMIDITY, // Reply Humidity nullptr @@ -384,13 +384,17 @@ void KNX_INIT() // Read Configuration // Check which relays, buttons and sensors where configured for this device // and activate options according to the hardware - for (int i = GPIO_REL1; i < GPIO_REL8 + 1; ++i) + /*for (int i = GPIO_REL1; i < GPIO_REL8 + 1; ++i) { if (GetUsedInModule(i, my_module.gp.io)) { device_param[i - GPIO_REL1].show = true; } } for (int i = GPIO_REL1_INV; i < GPIO_REL8_INV + 1; ++i) { if (GetUsedInModule(i, my_module.gp.io)) { device_param[i - GPIO_REL1_INV].show = true; } + }*/ + for (int i = 0; i < devices_present; ++i) + { + device_param[i].show = true; } for (int i = GPIO_SWT1; i < GPIO_SWT4 + 1; ++i) { @@ -642,8 +646,9 @@ void HandleKNXConfiguration() stmp = WebServer->arg("GA_FDEF"); byte GA_FDEF = stmp.toInt(); - KNX_ADD_GA( GAop, GA_FNUM, GA_AREA, GA_FDEF ); - + if (GAop) { + KNX_ADD_GA( GAop, GA_FNUM, GA_AREA, GA_FDEF ); + } } else { @@ -657,8 +662,9 @@ void HandleKNXConfiguration() stmp = WebServer->arg("CB_FDEF"); byte CB_FDEF = stmp.toInt(); - KNX_ADD_CB( CBop, CB_FNUM, CB_AREA, CB_FDEF ); - + if (CBop) { + KNX_ADD_CB( CBop, CB_FNUM, CB_AREA, CB_FDEF ); + } } } else if ( WebServer->hasArg("btn_del_ga") ) diff --git a/sonoff/xsns_23_sdm120.ino b/sonoff/xsns_23_sdm120.ino index 69baa35e5..937efc89e 100644 --- a/sonoff/xsns_23_sdm120.ino +++ b/sonoff/xsns_23_sdm120.ino @@ -34,17 +34,19 @@ uint8_t sdm120_state = 0; float sdm120_voltage = 0; float sdm120_current = 0; -float sdm120_power = 0; +float sdm120_active_power = 0; +float sdm120_apparent_power = 0; +float sdm120_reactive_power = 0; float sdm120_power_factor = 0; float sdm120_frequency = 0; float sdm120_energy_total = 0; -bool SDM_ModbusReceiveReady() +bool SDM120_ModbusReceiveReady() { return (SDM120Serial->available() > 1); } -void SDM_ModbusSend(uint8_t function_code, uint16_t start_address, uint16_t register_count) +void SDM120_ModbusSend(uint8_t function_code, uint16_t start_address, uint16_t register_count) { uint8_t frame[8]; @@ -55,7 +57,7 @@ void SDM_ModbusSend(uint8_t function_code, uint16_t start_address, uint16_t regi frame[4] = (uint8_t)(register_count >> 8); frame[5] = (uint8_t)(register_count); - uint16_t crc = SDM_calculateCRC(frame, 6); // calculate out crc only from first 6 bytes + uint16_t crc = SDM120_calculateCRC(frame, 6); // calculate out crc only from first 6 bytes frame[6] = lowByte(crc); frame[7] = highByte(crc); @@ -67,7 +69,7 @@ void SDM_ModbusSend(uint8_t function_code, uint16_t start_address, uint16_t regi SDM120Serial->write(frame, sizeof(frame)); } -uint8_t SDM_ModbusReceive(float *value) +uint8_t SDM120_ModbusReceive(float *value) { uint8_t buffer[9]; @@ -84,22 +86,22 @@ uint8_t SDM_ModbusReceive(float *value) if (buffer[0] == 0x01 && buffer[1] == 0x04 && buffer[2] == 4) { // check node number, op code and reply bytes count - if((SDM_calculateCRC(buffer, 7)) == ((buffer[8] << 8) | buffer[7])) { //calculate crc from first 7 bytes and compare with received crc (bytes 7 & 8) + if((SDM120_calculateCRC(buffer, 7)) == ((buffer[8] << 8) | buffer[7])) { //calculate crc from first 7 bytes and compare with received crc (bytes 7 & 8) ((uint8_t*)value)[3] = buffer[3]; ((uint8_t*)value)[2] = buffer[4]; ((uint8_t*)value)[1] = buffer[5]; ((uint8_t*)value)[0] = buffer[6]; - + } else return 1; // SDM_ERR_CRC_ERROR - + } else return 2; // SDM_ERR_WRONG_BYTES } return 0; // SDM_ERR_NO_ERROR } -uint16_t SDM_calculateCRC(uint8_t *frame, uint8_t num) +uint16_t SDM120_calculateCRC(uint8_t *frame, uint8_t num) { uint16_t crc, flag; crc = 0xFFFF; @@ -119,33 +121,31 @@ uint16_t SDM_calculateCRC(uint8_t *frame, uint8_t num) /*********************************************************************************************/ -const uint16_t sdm_start_addresses[] { +const uint16_t sdm120_start_addresses[] { 0x0000, // SDM120C_VOLTAGE [V] 0x0006, // SDM120C_CURRENT [A] 0x000C, // SDM120C_POWER [W] - 0x0012, // SDM120C_ACTIVE_APPARENT_POWER [VA] - 0x0018, // SDM120C_REACTIVE_APPARENT_POWER [VAR] + 0x0012, // SDM120C_APPARENT_POWER [VA] + 0x0018, // SDM120C_REACTIVE_POWER [VAR] 0x001E, // SDM120C_POWER_FACTOR 0x0046, // SDM120C_FREQUENCY [Hz] - 0x0048, // SDM120C_IMPORT_ACTIVE_ENERGY [Wh] - 0x004A, // SDM120C_EXPORT_ACTIVE_ENERGY [Wh] 0x0156 // SDM120C_TOTAL_ACTIVE_ENERGY [Wh] }; uint8_t sdm120_read_state = 0; uint8_t sdm120_send_retry = 0; -void SDM12050ms() // Every 50 mSec +void SDM12050ms() // Every 50 mSec { sdm120_state++; if (6 == sdm120_state) { // Every 300 mSec sdm120_state = 0; float value = 0; - bool data_ready = SDM_ModbusReceiveReady(); + bool data_ready = SDM120_ModbusReceiveReady(); if (data_ready) { - uint8_t error = SDM_ModbusReceive(&value); + uint8_t error = SDM120_ModbusReceive(&value); if (error) { snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DEBUG "SDM120 response error %d"), error); AddLog(LOG_LEVEL_DEBUG); @@ -160,7 +160,15 @@ void SDM12050ms() // Every 50 mSec break; case 2: - sdm120_power = value; + sdm120_active_power = value; + break; + + case 3: + sdm120_apparent_power = value; + break; + + case 4: + sdm120_reactive_power = value; break; case 5: @@ -171,14 +179,14 @@ void SDM12050ms() // Every 50 mSec sdm120_frequency = value; break; - case 9: + case 7: sdm120_energy_total = value; break; } // end switch sdm120_read_state++; - if (sizeof(sdm_start_addresses)/2 == sdm120_read_state) { + if (sizeof(sdm120_start_addresses)/2 == sdm120_read_state) { sdm120_read_state = 0; } } @@ -186,7 +194,7 @@ void SDM12050ms() // Every 50 mSec if (0 == sdm120_send_retry || data_ready) { sdm120_send_retry = 5; - SDM_ModbusSend(0x04, sdm_start_addresses[sdm120_read_state], 2); + SDM120_ModbusSend(0x04, sdm120_start_addresses[sdm120_read_state], 2); } else { sdm120_send_retry--; } @@ -198,7 +206,11 @@ void SDM120Init() sdm120_type = 0; if ((pin[GPIO_SDM120_RX] < 99) && (pin[GPIO_SDM120_TX] < 99)) { SDM120Serial = new TasmotaSerial(pin[GPIO_SDM120_RX], pin[GPIO_SDM120_TX], 1); - if (SDM120Serial->begin(9600)) { +#ifdef SDM120_SPEED + if (SDM120Serial->begin(SDM120_SPEED)) { +#else + if (SDM120Serial->begin(2400)) { +#endif if (SDM120Serial->hardwareSerial()) { ClaimSerial(); } sdm120_type = 1; } @@ -209,7 +221,9 @@ void SDM120Init() const char HTTP_SNS_SDM120_DATA[] PROGMEM = "%s" "{s}SDM120 " D_VOLTAGE "{m}%s " D_UNIT_VOLT "{e}" "{s}SDM120 " D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}" - "{s}SDM120 " D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}" + "{s}SDM120 " D_POWERUSAGE_ACTIVE "{m}%s " D_UNIT_WATT "{e}" + "{s}SDM120 " D_POWERUSAGE_APPARENT "{m}%s " D_UNIT_VA "{e}" + "{s}SDM120 " D_POWERUSAGE_REACTIVE "{m}%s " D_UNIT_VAR "{e}" "{s}SDM120 " D_POWER_FACTOR "{m}%s{e}" "{s}SDM120 " D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}" "{s}SDM120 " D_ENERGY_TOTAL "{m}%s " D_UNIT_KILOWATTHOUR "{e}"; @@ -219,31 +233,35 @@ void SDM120Show(boolean json) { char voltage[10]; char current[10]; - char power[10]; + char active_power[10]; + char apparent_power[10]; + char reactive_power[10]; char power_factor[10]; char frequency[10]; char energy_total[10]; dtostrfd(sdm120_voltage, Settings.flag2.voltage_resolution, voltage); dtostrfd(sdm120_current, Settings.flag2.current_resolution, current); - dtostrfd(sdm120_power, Settings.flag2.wattage_resolution, power); + dtostrfd(sdm120_active_power, Settings.flag2.wattage_resolution, active_power); + dtostrfd(sdm120_apparent_power, Settings.flag2.wattage_resolution, apparent_power); + dtostrfd(sdm120_reactive_power, Settings.flag2.wattage_resolution, reactive_power); dtostrfd(sdm120_power_factor, 2, power_factor); dtostrfd(sdm120_frequency, 2, frequency); dtostrfd(sdm120_energy_total, Settings.flag2.energy_resolution, energy_total); if (json) { - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_RSLT_ENERGY "\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_POWERUSAGE "\":%s,\"" D_JSON_FREQUENCY "\":%s,\"" D_JSON_POWERFACTOR "\":%s,\"" D_JSON_VOLTAGE "\":%s,\"" D_JSON_CURRENT "\":%s}"), - mqtt_data, energy_total, power, frequency, power_factor, voltage, current); + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_RSLT_ENERGY "\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_ACTIVE_POWERUSAGE "\":%s,\"" D_JSON_APPARENT_POWERUSAGE "\":%s,\"" D_JSON_REACTIVE_POWERUSAGE "\":%s,\"" D_JSON_FREQUENCY "\":%s,\"" D_JSON_POWERFACTOR "\":%s,\"" D_JSON_VOLTAGE "\":%s,\"" D_JSON_CURRENT "\":%s}"), + mqtt_data, energy_total, active_power, apparent_power, reactive_power, frequency, power_factor, voltage, current); #ifdef USE_DOMOTICZ - if (0 == tele_period) { + if (0 == tele_period) { DomoticzSensor(DZ_VOLTAGE, voltage); DomoticzSensor(DZ_CURRENT, current); - DomoticzSensorPowerEnergy((uint16_t)sdm120_power, energy_total); + DomoticzSensorPowerEnergy((uint16_t)sdm120_active_power, energy_total); } #endif // USE_DOMOTICZ #ifdef USE_WEBSERVER } else { - snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SDM120_DATA, mqtt_data, voltage, current, power, power_factor, frequency, energy_total); + snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SDM120_DATA, mqtt_data, voltage, current, active_power, apparent_power, reactive_power, power_factor, frequency, energy_total); } #endif // USE_WEBSERVER }