Merge branch 'arendst/development' into development

# Conflicts:
#	.gitignore
This commit is contained in:
reloxx13 2018-05-15 22:02:32 +02:00
commit 8f0b5d6715
28 changed files with 361 additions and 168 deletions

7
.gitignore vendored
View File

@ -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

View File

@ -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

View File

@ -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}

View File

@ -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

View File

@ -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"

View File

@ -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 ""
#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

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 "ВтЧ"

View File

@ -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 "瓦时"

View File

@ -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 "瓦時"

View File

@ -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

View File

@ -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;

View File

@ -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 <core_version.h> // 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);

View File

@ -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

View File

@ -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)

View File

@ -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") )

View File

@ -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
}