diff --git a/README.md b/README.md index 606577d21..cf603026b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ If you like **Sonoff-Tasmota**, give it a star, or fork it and contribute! Current version is **5.14.0b** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. -### Quick install +### 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. ### Important User Compilation Information @@ -68,7 +68,7 @@ The following devices are supported: - [Luani HVIO board](https://luani.de/projekte/esp8266-hvio/) - Wemos D1 mini, NodeMcu and Ledunia -### Firmware release information +### Firmware Release Information Different firmware images are released based on Features and Sensors selection guided by code and memory usage. - The Minimal version allows intermediate OTA uploads to support larger versions and does NOT change any persistent parameter. @@ -129,7 +129,7 @@ Different firmware images are released based on Features and Sensors selection g | USE_ARILUX_RF | x | x | - | x | x | | USE_SR04 | x | - | - | x | x | -#### Typical file size +#### Typical File Size | ESP/Arduino library version | sonoff | classic | minimal | knx | allsensors | |-----------------------------|--------|---------|---------|------|------------| @@ -147,7 +147,7 @@ You can contribute to Sonoff-Tasmota by ### Credits -#### Libraries used +#### Libraries Used Libraries used with Sonoff-Tasmota are: - [ESP8266 core for Arduino](https://github.com/esp8266/Arduino) - [Adafruit BME680](https://github.com/adafruit/Adafruit_BME680) diff --git a/platformio.ini b/platformio.ini index bc5dfca12..cb5da39a9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -30,6 +30,7 @@ env_default = sonoff ;env_default = sonoff-PL ;env_default = sonoff-PT ;env_default = sonoff-RU +;env_default = sonoff-UK ;env_default = sonoff-TW [common] ; ************************************************************ @@ -46,7 +47,7 @@ platform = espressif8266@1.5.0 framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout ; *** Fix espressif8266@1.7.0 induced undesired all warnings build_unflags = -Wall @@ -82,7 +83,7 @@ extra_scripts = pio/strip-floats.py platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} monitor_speed = ${common.monitor_speed} @@ -95,7 +96,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DBE_MINIMAL monitor_speed = ${common.monitor_speed} @@ -107,7 +108,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DUSE_CLASSIC monitor_speed = ${common.monitor_speed} @@ -119,7 +120,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DUSE_KNX_NO_EMULATION monitor_speed = ${common.monitor_speed} @@ -131,7 +132,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DUSE_ALL_SENSORS monitor_speed = ${common.monitor_speed} @@ -143,7 +144,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=bg-BG monitor_speed = ${common.monitor_speed} @@ -155,7 +156,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=pt-BR monitor_speed = ${common.monitor_speed} @@ -167,7 +168,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=zh-CN monitor_speed = ${common.monitor_speed} @@ -179,7 +180,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=cs-CZ monitor_speed = ${common.monitor_speed} @@ -191,7 +192,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=de-DE monitor_speed = ${common.monitor_speed} @@ -203,7 +204,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=es-AR monitor_speed = ${common.monitor_speed} @@ -215,7 +216,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=fr-FR monitor_speed = ${common.monitor_speed} @@ -227,7 +228,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=el-GR monitor_speed = ${common.monitor_speed} @@ -239,7 +240,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=hu-HU monitor_speed = ${common.monitor_speed} @@ -251,7 +252,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=it-IT monitor_speed = ${common.monitor_speed} @@ -263,7 +264,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=nl-NL monitor_speed = ${common.monitor_speed} @@ -275,7 +276,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=pl-PL monitor_speed = ${common.monitor_speed} @@ -287,7 +288,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=pt-PT monitor_speed = ${common.monitor_speed} @@ -299,7 +300,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=ru-RU monitor_speed = ${common.monitor_speed} @@ -307,11 +308,23 @@ upload_speed = ${common.upload_speed} upload_port = ${common.upload_port} extra_scripts = ${common.extra_scripts} +[env:sonoff-UK] +platform = ${common.platform} +framework = ${common.framework} +board = ${common.board} +board_build.flash_mode = ${common.board_build.flash_mode} +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags} -DMY_LANGUAGE=uk-UK +monitor_speed = ${common.monitor_speed} +upload_speed = ${common.upload_speed} +upload_port = ${common.upload_port} +extra_scripts = ${common.extra_scripts} + [env:sonoff-TW] platform = ${common.platform} framework = ${common.framework} board = ${common.board} -board_flash_mode = ${common.board_flash_mode} +board_build.flash_mode = ${common.board_build.flash_mode} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} -DMY_LANGUAGE=zh-TW monitor_speed = ${common.monitor_speed} diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 59db833a6..14ef604f8 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,6 +1,29 @@ /* 5.14.0b +* Added Console Commands to send KNX Commands + usage: KnxTx_Cmnd[slot] command + where [slot] is any of the 5 slots on the KNX Menu and command is 0 or 1 + example: KnxTx_Cmnd1 0 +* Added Console Commands to send KNX Values + usage: KnxTx_Val[slot] value + where [slot] is any of the 5 slots on the KNX Menu and value is a number + example: KnxTx_Val1 35 +* Added Slots on the KNX Web Menu to select Group Addess to send data from console commands +* Added Events to trigger rules when received data from KNX + usage on rules as: event#KnxRx_Val[slot] + where [slot] is any of the 5 slots on the KNX Menu + example: rule on event#KnxRx_Val1 do VAR1 %value% endon +* Added Events to trigger rules when received read requests from KNX + usage on rules as: event#KnxRx_Req[slot] + where [slot] is any of the 5 slots on the KNX Menu + example: rule on event#KnxRx_Req1 do KnxTx_Val1 35 endon + * Added Slots on the KNX Web Menu to select Group Addess to receive data to trigger rules * Add two rule sets of 511 characters using commands rule1, rule2 and rule3 + * Add Ukranian language file * Add rule support for IrReceive and RfReceive (#2758) + * Add command WebSend [(:,:)] (#2821) + * Add source information to command execution to be shown with logging option 3 (#2843) + * Fix some Pow R2 and S31 checksum errors (#1907) + * Fix Hardware Watchdog restart when using event command (#2853) * * 5.14.0a * Add feature information to Status 4 diff --git a/sonoff/i18n.h b/sonoff/i18n.h index 0890c5738..c6346a748 100644 --- a/sonoff/i18n.h +++ b/sonoff/i18n.h @@ -42,6 +42,7 @@ #define D_JSON_BUILDDATETIME "BuildDateTime" #define D_JSON_CO2 "CarbonDioxide" #define D_JSON_COMMAND "Command" +#define D_JSON_CONNECT_FAILED "Connect failed" #define D_JSON_COREVERSION "Core" #define D_JSON_COUNTER "Counter" #define D_JSON_CURRENT "Current" // As in Voltage and Current @@ -67,6 +68,7 @@ #define D_JSON_GATEWAY "Gateway" #define D_JSON_HEAPSIZE "Heap" #define D_JSON_HIGH "High" +#define D_JSON_HOST_NOT_FOUND "Host not found" #define D_JSON_HSBCOLOR "HSBColor" #define D_JSON_HUMIDITY "Humidity" #define D_JSON_I2CSCAN_DEVICES_FOUND_AT "Device(s) found at" @@ -133,6 +135,7 @@ #define D_JSON_VOLTAGE "Voltage" #define D_JSON_WIFI "Wifi" #define D_JSON_WRONG "Wrong" +#define D_JSON_WRONG_PARAMETERS "Wrong parameters" #define D_JSON_YESTERDAY "Yesterday" #define D_JSON_ZERO_POINT_CALIBRATION "Zero Point Calibration" @@ -213,14 +216,6 @@ #define D_WCFG_5_WAIT "Wait" #define D_CMND_FRIENDLYNAME "FriendlyName" #define D_CMND_SWITCHMODE "SwitchMode" -#define D_CMND_WEBSERVER "Webserver" - #define D_JSON_WEBSERVER_MODE "WebServerMode" - #define D_JSON_ACTIVE_FOR "Active for" - #define D_JSON_ON_DEVICE "on" - #define D_JSON_WITH_IP_ADDRESS "with IP address" -#define D_CMND_WEBPASSWORD "WebPassword" -#define D_CMND_WEBLOG "WebLog" -#define D_CMND_EMULATION "Emulation" #define D_CMND_TELEPERIOD "TelePeriod" #define D_CMND_RESTART "Restart" #define D_JSON_ONE_TO_RESTART "1 to restart" @@ -238,7 +233,7 @@ #define D_CMND_SERIALDELIMITER "SerialDelimiter" #define D_CMND_BAUDRATE "Baudrate" -// Commands xdrv_00_mqtt.ino +// Commands xdrv_01_mqtt.ino #define D_CMND_MQTTHOST "MqttHost" #define D_CMND_MQTTPORT "MqttPort" #define D_CMND_MQTTRETRY "MqttRetry" @@ -263,37 +258,16 @@ #define D_CMND_SENSORRETAIN "SensorRetain" #define D_CMND_PUBLISH "Publish" -// Commands xdrv_01_light.ino -#define D_CMND_CHANNEL "Channel" -#define D_CMND_COLOR "Color" -#define D_CMND_COLORTEMPERATURE "CT" -#define D_CMND_DIMMER "Dimmer" -#define D_CMND_HSBCOLOR "HSBColor" -#define D_CMND_LED "Led" -#define D_CMND_LEDTABLE "LedTable" -#define D_CMND_FADE "Fade" -#define D_CMND_PIXELS "Pixels" -#define D_CMND_ROTATION "Rotation" -#define D_CMND_SCHEME "Scheme" -#define D_CMND_SPEED "Speed" -#define D_CMND_WAKEUP "Wakeup" -#define D_CMND_WAKEUPDURATION "WakeUpDuration" -#define D_CMND_WIDTH "Width" - -// Commands xdrv_02_irremote.ino -#define D_CMND_IRSEND "IRSend" - #define D_JSON_INVALID_JSON "Invalid JSON" - #define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocol not supported" - #define D_JSON_IR_PROTOCOL "Protocol" - #define D_JSON_IR_BITS "Bits" - #define D_JSON_IR_DATA "Data" -#define D_CMND_IRHVAC "IRHVAC" - #define D_JSON_IRHVAC_VENDOR "VENDOR" - #define D_JSON_IRHVAC_POWER "POWER" - #define D_JSON_IRHVAC_MODE "MODE" - #define D_JSON_IRHVAC_FANSPEED "FANSPEED" - #define D_JSON_IRHVAC_TEMP "TEMP" -#define D_JSON_IRRECEIVED "IrReceived" +// Commands xdrv_02_webserver.ino +#define D_CMND_WEBSERVER "Webserver" + #define D_JSON_WEBSERVER_MODE "WebServerMode" + #define D_JSON_ACTIVE_FOR "Active for" + #define D_JSON_ON_DEVICE "on" + #define D_JSON_WITH_IP_ADDRESS "with IP address" +#define D_CMND_WEBPASSWORD "WebPassword" +#define D_CMND_WEBLOG "WebLog" +#define D_CMND_WEBSEND "WebSend" +#define D_CMND_EMULATION "Emulation" // Commands xdrv_03_energy.ino #define D_CMND_POWERLOW "PowerLow" @@ -324,7 +298,39 @@ #define D_JSON_ENERGYMONITOR "EnergyMonitor" #define D_JSON_MAXENERGYREACHED "MaxEnergyReached" -// Commands xdrv_04_snfbridge.ino +// Commands xdrv_04_light.ino +#define D_CMND_CHANNEL "Channel" +#define D_CMND_COLOR "Color" +#define D_CMND_COLORTEMPERATURE "CT" +#define D_CMND_DIMMER "Dimmer" +#define D_CMND_HSBCOLOR "HSBColor" +#define D_CMND_LED "Led" +#define D_CMND_LEDTABLE "LedTable" +#define D_CMND_FADE "Fade" +#define D_CMND_PIXELS "Pixels" +#define D_CMND_ROTATION "Rotation" +#define D_CMND_SCHEME "Scheme" +#define D_CMND_SPEED "Speed" +#define D_CMND_WAKEUP "Wakeup" +#define D_CMND_WAKEUPDURATION "WakeUpDuration" +#define D_CMND_WIDTH "Width" + +// Commands xdrv_05_irremote.ino +#define D_CMND_IRSEND "IRSend" + #define D_JSON_INVALID_JSON "Invalid JSON" + #define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocol not supported" + #define D_JSON_IR_PROTOCOL "Protocol" + #define D_JSON_IR_BITS "Bits" + #define D_JSON_IR_DATA "Data" +#define D_CMND_IRHVAC "IRHVAC" + #define D_JSON_IRHVAC_VENDOR "VENDOR" + #define D_JSON_IRHVAC_POWER "POWER" + #define D_JSON_IRHVAC_MODE "MODE" + #define D_JSON_IRHVAC_FANSPEED "FANSPEED" + #define D_JSON_IRHVAC_TEMP "TEMP" +#define D_JSON_IRRECEIVED "IrReceived" + +// Commands xdrv_06_snfbridge.ino #define D_CMND_RFCODE "RfCode" #define D_CMND_RFHIGH "RfHigh" #define D_CMND_RFHOST "RfHost" @@ -340,7 +346,7 @@ #define D_CMND_RFSYNC "RfSync" #define D_JSON_RFRECEIVED "RfReceived" -// Commands xdrv_05_domoticz.ino +// Commands xdrv_07_domoticz.ino #define D_CMND_DOMOTICZ "Domoticz" #define D_CMND_IDX "Idx" #define D_CMND_KEYIDX "KeyIdx" @@ -348,18 +354,6 @@ #define D_CMND_SENSORIDX "SensorIdx" #define D_CMND_UPDATETIMER "UpdateTimer" -// Commands xdrv_06_display.ino -#define D_CMND_DISPLAY "Display" -#define D_CMND_DISP_ADDRESS "Address" -#define D_CMND_DISP_COLS "Cols" -#define D_CMND_DISP_DIMMER "Dimmer" -#define D_CMND_DISP_MODE "Mode" -#define D_CMND_DISP_MODEL "Model" -#define D_CMND_DISP_REFRESH "Refresh" -#define D_CMND_DISP_ROWS "Rows" -#define D_CMND_DISP_SIZE "Size" -#define D_CMND_DISP_TEXT "Text" - // Commands xdrv_08_serial_bridge.ino #define D_CMND_SSERIALSEND "SSerialSend" #define D_CMND_SBAUDRATE "SBaudrate" @@ -380,6 +374,18 @@ #define D_CMND_LATITUDE "Latitude" #define D_CMND_LONGITUDE "Longitude" +// Commands xdrv_98_display.ino +#define D_CMND_DISPLAY "Display" +#define D_CMND_DISP_ADDRESS "Address" +#define D_CMND_DISP_COLS "Cols" +#define D_CMND_DISP_DIMMER "Dimmer" +#define D_CMND_DISP_MODE "Mode" +#define D_CMND_DISP_MODEL "Model" +#define D_CMND_DISP_REFRESH "Refresh" +#define D_CMND_DISP_ROWS "Rows" +#define D_CMND_DISP_SIZE "Size" +#define D_CMND_DISP_TEXT "Text" + /********************************************************************************************/ #define D_ASTERIX "********" diff --git a/sonoff/language/bg-BG.h b/sonoff/language/bg-BG.h index 55482d55c..37a252909 100644 --- a/sonoff/language/bg-BG.h +++ b/sonoff/language/bg-BG.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Използване на параметри по подразбиране" #define D_ERASED_SECTOR "Изтрит сектор" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Минимаен фърмуеър - моля надградете го" #define D_WEBSERVER_ACTIVE_ON "Уеб сървърът е активен на" #define D_WITH_IP_ADDRESS "с IP адрес" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Включете ниво 2 на лога, ако очаквате отговор" #define D_NEED_USER_AND_PASSWORD "Очаква user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Проверка на TLS отпечатък..." #define D_TLS_CONNECT_FAILED_TO "Неуспешно TLS свързване към" #define D_RETRY_IN "Повторно след" @@ -335,7 +335,7 @@ #define D_INSECURE "Нешифрована връзка, недействителен отпечатък" #define D_CONNECT_FAILED_TO "Грешка при свързването към" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast е изключен" #define D_MULTICAST_REJOINED "Multicast е повторно съединен" #define D_MULTICAST_JOIN_FAILED "Multicast грешка при присъединяването" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST аргументи" #define D_3_RESPONSE_PACKETS_SENT "Изпратени са 3 пакета за отговор" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz параметри" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "изпратен до" #define D_KNX_WARNING "Груповият адрес ( 0 / 0 / 0 ) е резервиран и не може да бъде използван." #define D_KNX_ENHANCEMENT "Подобрена комуникация" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Използвана енергия днес" diff --git a/sonoff/language/cs-CZ.h b/sonoff/language/cs-CZ.h index 9f939534a..96883e1fb 100644 --- a/sonoff/language/cs-CZ.h +++ b/sonoff/language/cs-CZ.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Použij defaultní hodnoty" #define D_ERASED_SECTOR "Smazaný sektor" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MINIMÁLNÍ - prosím zaktualizujte" #define D_WEBSERVER_ACTIVE_ON "Aktivní Web server" #define D_WITH_IP_ADDRESS "na IP adrese" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Zapni úroveň 2 zápisu Weblog, pokud je očekávána odpověď" #define D_NEED_USER_AND_PASSWORD "Vyžadován uživatel=&heslo=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Verifikuj otisk TLS..." #define D_TLS_CONNECT_FAILED_TO "Nepřipojeno TLS do" #define D_RETRY_IN "Zopakuji za" @@ -335,7 +335,7 @@ #define D_INSECURE "Nesprávné připojení z důvodu chybného otisku TLS" #define D_CONNECT_FAILED_TO "Spojení se nepodařilo navázat" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast je vypnutý" #define D_MULTICAST_REJOINED "Multicast opět připojený" #define D_MULTICAST_JOIN_FAILED "Multicast neúspěšný" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 pakety odpovědi odeslány" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Nastavení Domoticz" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "pošli" #define D_KNX_WARNING "Skupinová adresa ( 0 / 0 / 0 ) je rezervována a nemůže být použita." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Spotřeba Dnes" diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h index 7d2e7285d..4670b6999 100644 --- a/sonoff/language/de-DE.h +++ b/sonoff/language/de-DE.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Standard verwenden" #define D_ERASED_SECTOR "gelöschter Sektor" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMUM-Firmware - bitte upgraden" #define D_WEBSERVER_ACTIVE_ON "Web-Server aktiv bei" #define D_WITH_IP_ADDRESS "mit IP-Adresse" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Aktivere Web Log Level 2 falls Reaktion erwartet" #define D_NEED_USER_AND_PASSWORD "Benötige user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "TLS-Fingerabdruck wird verifiziert..." #define D_TLS_CONNECT_FAILED_TO "TLS-Verbindung fehlgeschlagen an" #define D_RETRY_IN "Wiederversuch in" @@ -335,7 +335,7 @@ #define D_INSECURE "unsichere Verbindung aufgrund ungültigen Fingerabdrucks" #define D_CONNECT_FAILED_TO "Verbindung fehlgeschlagen aufgrund von" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast deaktiviert" #define D_MULTICAST_REJOINED "Multicast (wieder-)verbunden" #define D_MULTICAST_JOIN_FAILED "Multicast Verbindung fehlgeschlagen" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST-Argumente" #define D_3_RESPONSE_PACKETS_SENT "3 Antwortpakete gesendet" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz-Parameter" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "sent to" #define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Energie heute" diff --git a/sonoff/language/el-GR.h b/sonoff/language/el-GR.h index 97eefcd7b..5abbf2b22 100644 --- a/sonoff/language/el-GR.h +++ b/sonoff/language/el-GR.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Χρήση προεπιλογών" #define D_ERASED_SECTOR "Διαγραμμένος τομέας" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware - παρακαλώ αναβαθμήστε" #define D_WEBSERVER_ACTIVE_ON "Web διακομιστής ενεργός" #define D_WITH_IP_ADDRESS "με διεύθυνση IP" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Ενεργοποιήστε το weblog 2 αν περιμένετε απάντηση" #define D_NEED_USER_AND_PASSWORD "Χρειάζεστε user=<όνομα χρήστη>&password=<κωδικό χρήστη>" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Επαλήθευση TLS fingerprint..." #define D_TLS_CONNECT_FAILED_TO "Αποτυχία TLS σύνδεσης" #define D_RETRY_IN "Επανάληψη σε" @@ -335,7 +335,7 @@ #define D_INSECURE "Μη ασφαλής σύνδεση λόγο ακατάλληλου Fingerprint" #define D_CONNECT_FAILED_TO "Αποτυχία σύνδεσης στο" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast απενεργοποιημένο" #define D_MULTICAST_REJOINED "Multicast επανασύνδεση" #define D_MULTICAST_JOIN_FAILED "Αποτυχία σύνδεσης Multicast" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3πλο πακέτο απάντησεης στάλθηκε" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz παράμετροι" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "αποστολή σε" #define D_KNX_WARNING "Η Ομάδα Διευθύνσεων ( 0 / 0 / 0 ) είναι δεσμευμένη και δεν μπορεί να χρησιμοποιηθεί." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Energy Σήμερα" diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h index 9eb8c9d4a..2d0ffb38a 100644 --- a/sonoff/language/en-GB.h +++ b/sonoff/language/en-GB.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.14.0a + * Updated until v5.14.0b \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Use defaults" #define D_ERASED_SECTOR "Erased sector" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware - please upgrade" #define D_WEBSERVER_ACTIVE_ON "Web server active on" #define D_WITH_IP_ADDRESS "with IP address" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Enable weblog 2 if response expected" #define D_NEED_USER_AND_PASSWORD "Need user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Verify TLS fingerprint..." #define D_TLS_CONNECT_FAILED_TO "TLS Connect failed to" #define D_RETRY_IN "Retry in" @@ -335,7 +335,7 @@ #define D_INSECURE "Insecure connection due to invalid Fingerprint" #define D_CONNECT_FAILED_TO "Connect failed to" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast disabled" #define D_MULTICAST_REJOINED "Multicast (re)joined" #define D_MULTICAST_JOIN_FAILED "Multicast join failed" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 response packets sent" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz parameters" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "sent to" #define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Energy Today" diff --git a/sonoff/language/es-AR.h b/sonoff/language/es-AR.h index aff7b2665..4b08fff62 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.14.0a + * Updated until v5.14.0b \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Usar valores por defecto" #define D_ERASED_SECTOR "Sector borrado" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MÍNIMO - actualice por favor" #define D_WEBSERVER_ACTIVE_ON "Servidor web activo en" #define D_WITH_IP_ADDRESS "con dirección IP" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Habilitar weblog 2 si desea respuesta" #define D_NEED_USER_AND_PASSWORD "Se necesita user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Verificar TLS fingerprint..." #define D_TLS_CONNECT_FAILED_TO "Falló Conección TLS a" #define D_RETRY_IN "Reintentando" @@ -335,7 +335,7 @@ #define D_INSECURE "Conección insegura por Fingerprint no válido" #define D_CONNECT_FAILED_TO "Falló Conección a" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast deshabilitado" #define D_MULTICAST_REJOINED "Multicast (re)conectado" #define D_MULTICAST_JOIN_FAILED "Conección Multicast fallida" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 paquetes de respuesta enviados" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Parámetros Domoticz" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "enviada a" #define D_KNX_WARNING "La dirección de grupo ( 0 / 0 / 0 ) está reservada y no puede ser utilizada." #define D_KNX_ENHANCEMENT "Mejora de Comunicación" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Energía Hoy" diff --git a/sonoff/language/fr-FR.h b/sonoff/language/fr-FR.h index f37d3cfae..4a980e174 100644 --- a/sonoff/language/fr-FR.h +++ b/sonoff/language/fr-FR.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Utiliser par défaut" #define D_ERASED_SECTOR "Secteur effacé" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MINIMAL - merci de mettre à jour" #define D_WEBSERVER_ACTIVE_ON "Serveur web actif sur" #define D_WITH_IP_ADDRESS "avec l'adresse IP" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Activer Weblog 2 si une réponse est attendue" #define D_NEED_USER_AND_PASSWORD "Nécessite utilisateur=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Vérification d'empreinte TLS ..." #define D_TLS_CONNECT_FAILED_TO "Échec de connexion TLS à" #define D_RETRY_IN "Nouvelle tentative dans" @@ -335,7 +335,7 @@ #define D_INSECURE "Connexion non sécurisée car empreinte non vérifiée" #define D_CONNECT_FAILED_TO "Échec de connexion à" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast désactivé" #define D_MULTICAST_REJOINED "Multicast (re)joint" #define D_MULTICAST_JOIN_FAILED "Multicast échec abonnement" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 paquets de réponse envoyés" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Paramètres Domoticz" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "envoyé à" #define D_KNX_WARNING "L'Adresse de Groupe ( 0 / 0 / 0 ) est réservée et ne peut être utilisée." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xsns_03_energy.ino #define D_ENERGY_TODAY "Énergie aujourd'hui" diff --git a/sonoff/language/hu-HU.h b/sonoff/language/hu-HU.h index 4ebeffbf6..f6c1aac8d 100644 --- a/sonoff/language/hu-HU.h +++ b/sonoff/language/hu-HU.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Alapértelmezett beáll. használata" #define D_ERASED_SECTOR "Szektor törlése" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware - frissítsd!" #define D_WEBSERVER_ACTIVE_ON "Web szerver aktív a" #define D_WITH_IP_ADDRESS "IP címe:" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Engedélyezz 2-es weblogolást több információért" #define D_NEED_USER_AND_PASSWORD "Kell felhasználó=&jelszó=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "TLS fingerprint hitelesítése..." #define D_TLS_CONNECT_FAILED_TO "TLS Csatlakozás sikertelen a" #define D_RETRY_IN "Újrapróbálás" @@ -335,7 +335,7 @@ #define D_INSECURE "Nem biztonságos kapcsolat érvénytelen Fingerprint miatt" #define D_CONNECT_FAILED_TO "Sikertelen csatlakozás a" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast kikapcsolva" #define D_MULTICAST_REJOINED "Multicast (újra)csatlakozás" #define D_MULTICAST_JOIN_FAILED "Multicast csatlakozás sikertelen" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 válaszcsomagok elküldve" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz paraméterek" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "sent to" #define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Mai Energia" diff --git a/sonoff/language/it-IT.h b/sonoff/language/it-IT.h index 16c11645b..5ce673196 100644 --- a/sonoff/language/it-IT.h +++ b/sonoff/language/it-IT.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Utilizzo valori default" #define D_ERASED_SECTOR "Settore cancellato" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware - effettuare aggiornamento" #define D_WEBSERVER_ACTIVE_ON "Web server attivo su" #define D_WITH_IP_ADDRESS "con indirizzo IP" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Abilitare weblog 2 se è attesa una risposta" #define D_NEED_USER_AND_PASSWORD "Richiesto user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Verifica TLS fingerprint..." #define D_TLS_CONNECT_FAILED_TO "Connessione TLS fallita a" #define D_RETRY_IN "Nuovo tentativo in" @@ -335,7 +335,7 @@ #define D_INSECURE "Connessione insicura a causa di Fingerprint non valido" #define D_CONNECT_FAILED_TO "Connessione Fallita a" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast disabilitato" #define D_MULTICAST_REJOINED "Multicast (ri)associato" #define D_MULTICAST_JOIN_FAILED "Associazione Multicast fallita" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST argomenti" #define D_3_RESPONSE_PACKETS_SENT "3 pacchetti di risposta inviati" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Parametri Domoticz" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "invia a" #define D_KNX_WARNING "L'indirizzo del gruppo ( 0 / 0 / 0 ) è riservato e non può essere usato." #define D_KNX_ENHANCEMENT "Miglioramento Comunicazione" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Energia Oggi" diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h index 262daee7b..6e088bdb1 100644 --- a/sonoff/language/nl-NL.h +++ b/sonoff/language/nl-NL.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Gebruik standaardwaarden" #define D_ERASED_SECTOR "Wis sector" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware - opwaarderen" #define D_WEBSERVER_ACTIVE_ON "Webserver actief op" #define D_WITH_IP_ADDRESS "met IP adres" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Schakel weblog 2 in indien antwoord verwacht" #define D_NEED_USER_AND_PASSWORD "Benodig user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Controleer TLS vingerafdruk..." #define D_TLS_CONNECT_FAILED_TO "TLS Verbinding mislukt naar" #define D_RETRY_IN "Opnieuw proberen over" @@ -335,7 +335,7 @@ #define D_INSECURE "Door ongeldige vingerafdruk een onveilige verbinding" #define D_CONNECT_FAILED_TO "Verbinding mislukt naar" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast uitgeschakeld" #define D_MULTICAST_REJOINED "Multicast verbonden" #define D_MULTICAST_JOIN_FAILED "Multicast verbinding mislukt" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST argumenten" #define D_3_RESPONSE_PACKETS_SENT "3 antwoord paketten verstuurd" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz parameters" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Toets idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "verzend naar" #define D_KNX_WARNING "Groep adres (0/0/0) is gereserveerd en mag niet worden gebruikt." #define D_KNX_ENHANCEMENT "Verbeter verbinding" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Verbruik vandaag" diff --git a/sonoff/language/pl-PL.h b/sonoff/language/pl-PL.h index 683d43cb3..62b112698 100644 --- a/sonoff/language/pl-PL.h +++ b/sonoff/language/pl-PL.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Użyj domyślnych" #define D_ERASED_SECTOR "Wymazany sektor" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Oprogramowanie MINIMAL - proszę uaktualnić" #define D_WEBSERVER_ACTIVE_ON "Aktywny serwer Web" #define D_WITH_IP_ADDRESS "z adresem IP" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Włącz poziom 2 zapisu Weblog, jeśli oczekiwana jest odpowiedź" #define D_NEED_USER_AND_PASSWORD "Wymagany użytkownik=&hasło=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Weryfikuj odcisk TLS..." #define D_TLS_CONNECT_FAILED_TO "Nieudane połączenie TLS do" #define D_RETRY_IN "Spróbuj ponownie" @@ -335,7 +335,7 @@ #define D_INSECURE "Nieprawidłowe połączenie z powodu błędnego odcisku TLS" #define D_CONNECT_FAILED_TO "Nie udało się nawiązać połączenia" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast jest wyłączony" #define D_MULTICAST_REJOINED "Multicast (re)dołączony" #define D_MULTICAST_JOIN_FAILED "Multicast nie powiodło się" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 pakiety odpowiedzi wysyłane" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Parametry Domoticz" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "sent to" #define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Energia Dzisiaj" diff --git a/sonoff/language/pt-BR.h b/sonoff/language/pt-BR.h index 02bdec2e4..01ff2e48c 100644 --- a/sonoff/language/pt-BR.h +++ b/sonoff/language/pt-BR.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.0 + * Updated until v5.14.0b \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -52,8 +52,8 @@ // Common #define D_ADMIN "Admin" -#define D_AIR_QUALITY "Qualidade do Ar" -#define D_AP "Pondo de acesso" // Ponto de Acesso +#define D_AIR_QUALITY "Qualidade do ar" +#define D_AP "Ponto de acesso" // Ponto de Acesso #define D_AS "como" #define D_AUTO "Auto" #define D_BLINK "Pulsar" @@ -64,16 +64,16 @@ #define D_BY "por" // Write by me #define D_BYTES "Bytes" #define D_CELSIUS "Celsius" -#define D_CO2 "Dióxido de Carbono" +#define D_CO2 "Dióxido de carbono" #define D_CODE "Código" // Button code -#define D_COLDLIGHT "Luz Fria" +#define D_COLDLIGHT "Luz fria" #define D_COMMAND "Comando" #define D_CONNECTED "Ligado" #define D_COUNT "Contagem" #define D_COUNTER "Contador" #define D_CURRENT "Corrente" // As in Voltage and Current #define D_DATA "Dados" -#define D_DARKLIGHT "Luz Escura" +#define D_DARKLIGHT "Luz escura" #define D_DEBUG "Depurar" #define D_DISABLED "Desabilitado" #define D_DISTANCE "Distância" @@ -91,8 +91,8 @@ #define D_FALLBACK_TOPIC "Tópico para retornar" #define D_FALSE "Falso" #define D_FILE "Arquivo" -#define D_FREE_MEMORY "Memória Livre" -#define D_FREQUENCY "Frequency" +#define D_FREE_MEMORY "Memória livre" +#define D_FREQUENCY "Frequência" #define D_GAS "Gás" #define D_GATEWAY "Gateway" #define D_GROUP "Grupo" @@ -103,7 +103,7 @@ #define D_IMMEDIATE "Imediato" // Button immediate #define D_INDEX "Índice" #define D_INFO "Informação" -#define D_INFRARED "Infrared" +#define D_INFRARED "Infravermelho" #define D_INITIALIZED "Inicializado" #define D_IP_ADDRESS "Endereço IP" #define D_LIGHT "Luz" @@ -122,9 +122,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_POWERUSAGE_ACTIVE "Potência ativa" +#define D_POWERUSAGE_APPARENT "Potência aparente" +#define D_POWERUSAGE_REACTIVE "Potência reativa" #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" @@ -168,10 +168,10 @@ #define D_WEB_SERVER "Servidor WEB" // sonoff.ino -#define D_WARNING_MINIMAL_VERSION "AVISO esta versão não supporta configurações persistentes" +#define D_WARNING_MINIMAL_VERSION "AVISO: esta versão não supporta configurações persistentes" #define D_LEVEL_10 "nível 1-0" #define D_LEVEL_01 "nível 0-1" -#define D_SERIAL_LOGGING_DISABLED "Registro em serie desabilitado" +#define D_SERIAL_LOGGING_DISABLED "Registro em série desabilitado" #define D_SYSLOG_LOGGING_REENABLED "Registro do Syslog reativado" #define D_SET_BAUDRATE_TO "Ajuste da velocidade para" @@ -205,15 +205,15 @@ #define D_USE_DEFAULTS "Usar predefinições" #define D_ERASED_SECTOR "Apagar setores" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware mínimo - Atualizar por favor" #define D_WEBSERVER_ACTIVE_ON "Servidor WEB ativo em" #define D_WITH_IP_ADDRESS "com o endereço IP" #define D_WEBSERVER_STOPPED "Servidor WEB parou" #define D_FILE_NOT_FOUND "Arquivo não encontrado" #define D_REDIRECTED "Redirecionado para o portal ativo" -#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager configura o Ponto de Acesso e mantém a estação" -#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager configura o Ponto de Acesso" +#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager: configura o Ponto de Acesso e a Estação" +#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager: configura o Ponto de Acesso" #define D_TRYING_TO_CONNECT "Conectar o dispositivo à rede" #define D_RESTART_IN "Reinicia em" @@ -238,7 +238,7 @@ #define D_RESTORE_CONFIGURATION "Repor configuração" #define D_MAIN_MENU "Menu principal" -#define D_MODULE_PARAMETERS "Parametros do módulo" +#define D_MODULE_PARAMETERS "Parâmetros do módulo" #define D_MODULE_TYPE "Tipo de módulo" #define D_GPIO "GPIO" #define D_SERIAL_IN "Entrada serial" @@ -282,12 +282,12 @@ #define D_SINGLE_DEVICE "Dispositivo único" #define D_MULTI_DEVICE "Múltiplos dispositivos" -#define D_SAVE_CONFIGURATION "Salvar configuração" -#define D_CONFIGURATION_SAVED "Configuração salva" +#define D_SAVE_CONFIGURATION "Gravar configuração" +#define D_CONFIGURATION_SAVED "Configuração gravada" #define D_CONFIGURATION_RESET "Reinicialização da configuração" #define D_PROGRAM_VERSION "Versão do programa" -#define D_BUILD_DATE_AND_TIME "Data e Hora da construção" +#define D_BUILD_DATE_AND_TIME "Data e Hora da compilação" #define D_CORE_AND_SDK_VERSION "Versão Core/SDK" #define D_FLASH_WRITE_COUNT "Contagem de gravação flash" #define D_MAC_ADDRESS "Endereço MAC" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Habilitar weblog 2 se resposta esperada" #define D_NEED_USER_AND_PASSWORD "Necessário user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Verifique a impressão digital TLS..." #define D_TLS_CONNECT_FAILED_TO "TLS não conseguiu ligar" #define D_RETRY_IN "Tentativa em" @@ -335,7 +335,7 @@ #define D_INSECURE "Ligação insegura devido à impressão digital inválida" #define D_CONNECT_FAILED_TO "A ligação falhou ao" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast desabilitado" #define D_MULTICAST_REJOINED "Multicast (re)ingressou" #define D_MULTICAST_JOIN_FAILED "Multicast falha no reingresso" @@ -355,15 +355,15 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 pacotes de resposta enviados" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Parâmetros Domoticz" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Chave idx" #define D_DOMOTICZ_SWITCH_IDX "Interruptor idx" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" - #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" - #define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro" + #define D_DOMOTICZ_TEMP_HUM "Temp,Umi" + #define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Umi,Pres" #define D_DOMOTICZ_POWER_ENERGY "Potência,Energia" #define D_DOMOTICZ_ILLUMINANCE "Luminância" #define D_DOMOTICZ_COUNT "Contagem/PM1" @@ -401,7 +401,9 @@ #define D_KNX_COMMAND_OTHER "Outros" #define D_SENT_TO "Enviar para" #define D_KNX_WARNING "O endereço ( 0 / 0 / 0 ) é reservado e não pode ser usado." -#define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_ENHANCEMENT "Melhoria da comunicação" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Consumo energético de hoje" @@ -439,19 +441,19 @@ #define D_SENSOR_I2C_SDA "I2C SDA" #define D_SENSOR_WS2812 "WS2812" #define D_SENSOR_IRSEND "IRsend" -#define D_SENSOR_SWITCH "Interruptor" // Suffix "1" -#define D_SENSOR_BUTTON "Botão" // Suffix "1" -#define D_SENSOR_RELAY "Relé" // Suffix "1i" -#define D_SENSOR_LED "Led" // Suffix "1i" -#define D_SENSOR_PWM "PWM" // Suffix "1" -#define D_SENSOR_COUNTER "Contador" // Suffix "1" +#define D_SENSOR_SWITCH "Interruptor" // Suffix "1" +#define D_SENSOR_BUTTON "Botão" // Suffix "1" +#define D_SENSOR_RELAY "Relé" // Suffix "1i" +#define D_SENSOR_LED "Led" // Suffix "1i" +#define D_SENSOR_PWM "PWM" // Suffix "1" +#define D_SENSOR_COUNTER "Contador" // Suffix "1" #define D_SENSOR_IRRECV "IRrecv" -#define D_SENSOR_MHZ_RX "MHZ Rx" -#define D_SENSOR_MHZ_TX "MHZ Tx" +#define D_SENSOR_MHZ_RX "MHz Rx" +#define D_SENSOR_MHZ_TX "MHz Tx" #define D_SENSOR_PZEM_RX "PZEM Rx" #define D_SENSOR_PZEM_TX "PZEM Tx" -#define D_SENSOR_SAIR_RX "SAir Rx" -#define D_SENSOR_SAIR_TX "SAir Tx" +#define D_SENSOR_SAIR_RX "SAIR Rx" +#define D_SENSOR_SAIR_TX "SAIR Tx" #define D_SENSOR_SPI_CS "SPI CS" #define D_SENSOR_SPI_DC "SPI DC" #define D_SENSOR_BACKLIGHT "Luz de fundo" diff --git a/sonoff/language/pt-PT.h b/sonoff/language/pt-PT.h index 4cf9e0da3..a7da5a4ac 100644 --- a/sonoff/language/pt-PT.h +++ b/sonoff/language/pt-PT.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Usar predefinições" #define D_ERASED_SECTOR "Apagar setores" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMO firmware - Atualizar Por favor" #define D_WEBSERVER_ACTIVE_ON "Servidor WEB ativo em" #define D_WITH_IP_ADDRESS "com o endereço IP" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Habilitar weblog 2 se resposta esperada" #define D_NEED_USER_AND_PASSWORD "Necessário user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Verifique a impressão digital TLS..." #define D_TLS_CONNECT_FAILED_TO "TLS não conseguiu ligar" #define D_RETRY_IN "Tentativa em" @@ -335,7 +335,7 @@ #define D_INSECURE "Ligação insegura devido à impressão digital inválida" #define D_CONNECT_FAILED_TO "A ligação falhou ao" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast desabilitado" #define D_MULTICAST_REJOINED "Multicast (re)ingressou" #define D_MULTICAST_JOIN_FAILED "Multicast falha no reingresso" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 pacotes de resposta enviados" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Parametros Domoticz" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Chave idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "sent to" #define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Consumo energético de hoje" diff --git a/sonoff/language/ru-RU.h b/sonoff/language/ru-RU.h index 3336484e9..b54f2d7f1 100644 --- a/sonoff/language/ru-RU.h +++ b/sonoff/language/ru-RU.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "Использовать значение по умолчанию" #define D_ERASED_SECTOR "Стереть сектор" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Прошивка MINIMAL - пожалуйста обновите" #define D_WEBSERVER_ACTIVE_ON "Веб-сервер активен" #define D_WITH_IP_ADDRESS "с IP-адресом" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "Включить Веб лог уровня 2 если ожидается ответ" #define D_NEED_USER_AND_PASSWORD "Ожидается user=&password=" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "Проверка TLS Fingerprint..." #define D_TLS_CONNECT_FAILED_TO "Сбой подключения TLS к" #define D_RETRY_IN "Повторить" @@ -335,7 +335,7 @@ #define D_INSECURE "Небезопасное соединение, недействительный Fingerprint" #define D_CONNECT_FAILED_TO "Ошибка подключения к" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast отключен" #define D_MULTICAST_REJOINED "Multicast (ре)соединился" #define D_MULTICAST_JOIN_FAILED "Multicast ошибка соединения" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 ответных пакета получено" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz parameters" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "sent to" #define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Энергия Сегодня" diff --git a/sonoff/language/uk-UK.h b/sonoff/language/uk-UK.h new file mode 100644 index 000000000..481291ee8 --- /dev/null +++ b/sonoff/language/uk-UK.h @@ -0,0 +1,522 @@ +/* + uk-UK.h - localization for Ukrainian - Ukrain for Sonoff-Tasmota + + Copyright (C) 2018 Theo Arends / vadym-adik + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _LANGUAGE_UK_UK_H_ +#define _LANGUAGE_UK_UK_H_ + +/*************************** ATTENTION *******************************\ + * + * Due to memory constraints only UTF-8 is supported. + * To save code space keep text as short as possible. + * Time and Date provided by SDK can not be localized (yet). + * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. + * Use online command Prefix to translate cmnd, stat and tele. + * + * Updated until v5.14.0a +\*********************************************************************/ + +//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) + +#define LANGUAGE_LCID 1058 +// HTML (ISO 639-1) Language Code +#define D_HTML_LANGUAGE "uk" + +// "2017-03-07T11:08:02" - ISO8601:2004 +#define D_YEAR_MONTH_SEPARATOR "-" +#define D_MONTH_DAY_SEPARATOR "-" +#define D_DATE_TIME_SEPARATOR "T" +#define D_HOUR_MINUTE_SEPARATOR ":" +#define D_MINUTE_SECOND_SEPARATOR ":" + +#define D_DAY3LIST "НедПонВівСерЧетПятСуб" +#define D_MONTH3LIST "СічЛютБерКвіТраЧерЛипВерЖовЛисГру" + +// Non JSON decimal separator +#define D_DECIMAL_SEPARATOR "," + +// Common +#define D_ADMIN "Admin" +#define D_AIR_QUALITY "Якість повітря" +#define D_AP "AP" // Access Point +#define D_AS "як" +#define D_AUTO "АВТО" +#define D_BLINK "Блимати" +#define D_BLINKOFF "Не блимати" +#define D_BOOT_COUNT "Кіл-сть завант." +#define D_BRIGHTLIGHT "Яскравість" +#define D_BUTTON "Кнопка" +#define D_BY "by" // Written by me +#define D_BYTES "Байт" +#define D_CELSIUS "Цельсія" +#define D_CO2 "Вуглек. газ" +#define D_CODE "код" // Button code +#define D_COLDLIGHT "Холодний" +#define D_COMMAND "Команда" +#define D_CONNECTED "Під'єднано" +#define D_COUNT "Підрахунок" +#define D_COUNTER "Лічильник" +#define D_CURRENT "Струм" // As in Voltage and Current +#define D_DATA "Дані" +#define D_DARKLIGHT "Темний" +#define D_DEBUG "Налагодження" +#define D_DISABLED "Заблоковано" +#define D_DISTANCE "Дистанція" +#define D_DNS_SERVER "DNS Сервер" +#define D_DONE "Виконано" +#define D_DST_TIME "Літній час" +#define D_ECO2 "eCO2" +#define D_EMULATION "Емуляція" +#define D_ENABLED "Активно" +#define D_ERASE "Стирати" +#define D_ERROR "Помилка" +#define D_FAHRENHEIT "Фаренгейт" +#define D_FAILED "Невдало" +#define D_FALLBACK "Зворотній зв'язок" +#define D_FALLBACK_TOPIC "Топік зворотнього зв'язку" +#define D_FALSE "Помилково" +#define D_FILE "Файл" +#define D_FREE_MEMORY "Вільна память" +#define D_FREQUENCY "Частота" +#define D_GAS "Газ" +#define D_GATEWAY "Шлюз" +#define D_GROUP "Група" +#define D_HOST "Хост" +#define D_HOSTNAME "Ім'я Хосту" +#define D_HUMIDITY "Вологість" +#define D_ILLUMINANCE "Освітленність" +#define D_IMMEDIATE "негайно" // Button immediate +#define D_INDEX "Індекс" +#define D_INFO "Інфо" +#define D_INFRARED "Інфрачервоний" +#define D_INITIALIZED "Ініціалізовано" +#define D_IP_ADDRESS "IP Адрес" +#define D_LIGHT "Світло" +#define D_LWT "LWT" +#define D_MODULE "Модуль" +#define D_MQTT "MQTT" +#define D_MULTI_PRESS "багаторазове натискання" +#define D_NOISE "Шум" +#define D_NONE "Ні" +#define D_OFF "Вимк." +#define D_OFFLINE "Офф-лайн" +#define D_OK "Ок" +#define D_ON "Увімк." +#define D_ONLINE "Он-лайн" +#define D_PASSWORD "Гасло" +#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 "Розмір Flash для програм" +#define D_PROGRAM_SIZE "Розмір програм " +#define D_PROJECT "Проект" +#define D_RECEIVED "Отримано" +#define D_RESTART "Перезавантаження" +#define D_RESTARTING "Перезавантаження" +#define D_RESTART_REASON "Причина перезавантаження" +#define D_RESTORE "відновлення" +#define D_RETAINED "нерозподілений" +#define D_RULE "Правило" +#define D_SAVE "Зберегти" +#define D_SENSOR "Датчик" +#define D_SSID "SSID" +#define D_START "Старт" +#define D_STD_TIME "STD" +#define D_STOP "Стоп" +#define D_SUBNET_MASK "Маска Підмережі" +#define D_SUBSCRIBE_TO "Підписатись на" +#define D_SUCCESSFUL "Успішно" +#define D_SUNRISE "Схід сонця" +#define D_SUNSET "Захід сонця" +#define D_TEMPERATURE "Температура" +#define D_TO "до" +#define D_TOGGLE "Перекл." +#define D_TOPIC "Топік" +#define D_TRANSMIT "Передати" +#define D_TRUE "Істина" +#define D_TVOC "TVOC" +#define D_UPGRADE "оновлення" +#define D_UPLOAD "Завантажити" +#define D_UPTIME "Час роботи" +#define D_USER "Користувач" +#define D_UTC_TIME "UTC" +#define D_UV_INDEX "УФ індекс" +#define D_UV_LEVEL "УФ рівень" +#define D_VERSION "Версія" +#define D_VOLTAGE "Напруга" +#define D_WARMLIGHT "Тепло" +#define D_WEB_SERVER "Web сервер" + +// sonoff.ino +#define D_WARNING_MINIMAL_VERSION "ПОПЕРЕДЖЕННЯ! Ця версія не підтримує персистентні налаштування" +#define D_LEVEL_10 "рівень 1-0" +#define D_LEVEL_01 "рівень 0-1" +#define D_SERIAL_LOGGING_DISABLED "Serial logging вимкнений" +#define D_SYSLOG_LOGGING_REENABLED "Syslog logging увімкнений" + +#define D_SET_BAUDRATE_TO "Встановити швидкість передачі (Baudrate)" +#define D_RECEIVED_TOPIC "Отриманий Топік" +#define D_DATA_SIZE "Розмір даних" +#define D_ANALOG_INPUT "Аналоговий вхід" + +// support.ino +#define D_OSWATCH "osWatch" +#define D_BLOCKED_LOOP "Блокуючий цикл" +#define D_WPS_FAILED_WITH_STATUS "WPS конфігурація з статусом НЕВДАЛА" +#define D_ACTIVE_FOR_3_MINUTES "активний протягом 3 хвилин" +#define D_FAILED_TO_START "не вдалось запустити" +#define D_PATCH_ISSUE_2186 "Проблема з виправленням 2186" +#define D_CONNECTING_TO_AP "Підключення до AP" +#define D_IN_MODE "в режимі" +#define D_CONNECT_FAILED_NO_IP_ADDRESS "Помилка підключення, IP-адрес не отриманий" +#define D_CONNECT_FAILED_AP_NOT_REACHED "Помилка з'єднання, AP не запущений" +#define D_CONNECT_FAILED_WRONG_PASSWORD "Помилка з'єднання, невірне гасло до AP" +#define D_CONNECT_FAILED_AP_TIMEOUT "Помилка з'єднання з AP по тайм-ауту" +#define D_ATTEMPTING_CONNECTION "Спроба підключення..." +#define D_CHECKING_CONNECTION "Перевірка з'єднання..." +#define D_QUERY_DONE "Запит виконаний. Виявлено служби MQTT" +#define D_MQTT_SERVICE_FOUND "MQTT сервіс знайдено" +#define D_FOUND_AT "знайдено в" +#define D_SYSLOG_HOST_NOT_FOUND "System лог хост не знайдено" + +// settings.ino +#define D_SAVED_TO_FLASH_AT "Збережено в флэш-пам'ять" +#define D_LOADED_FROM_FLASH_AT "Завантажено з флэш-пам'яті" +#define D_USE_DEFAULTS "Використовувати значення за замовчуванням" +#define D_ERASED_SECTOR "Стерти сектор" + +// xdrv_02_webserver.ino +#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Прошивка MINIMAL - будь-ласка оновіть" +#define D_WEBSERVER_ACTIVE_ON "Веб-сервер активний" +#define D_WITH_IP_ADDRESS "з IP-адресом" +#define D_WEBSERVER_STOPPED "Веб-сервер зупинений" +#define D_FILE_NOT_FOUND "Файл не знайдений" +#define D_REDIRECTED "Перенаправлено на адаптивний портал" +#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifi менеджер встановлює Точку Доступу і зберігає параметри" +#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifi менеджер встановив Точку Доступу" +#define D_TRYING_TO_CONNECT "Спроба підключення пристрою до мережі" + +#define D_RESTART_IN "Перезавантаження" +#define D_SECONDS "секунд" +#define D_DEVICE_WILL_RESTART "Пристрій буде перезавантажено через декілька секунд" +#define D_BUTTON_TOGGLE "Переключити" +#define D_CONFIGURATION "Конфігурація" +#define D_INFORMATION "Інформація" +#define D_FIRMWARE_UPGRADE "Оновлення прошивки" +#define D_CONSOLE "Консоль" +#define D_CONFIRM_RESTART "Підтвердити перезавантаження" + +#define D_CONFIGURE_MODULE "Конфігурація модуля" +#define D_CONFIGURE_WIFI "Конфігурація WiFi" +#define D_CONFIGURE_MQTT "Конфігурація MQTT" +#define D_CONFIGURE_DOMOTICZ "Конфігурація Domoticz" +#define D_CONFIGURE_LOGGING "Конфігурація Логів" +#define D_CONFIGURE_OTHER "Конфігурація інше" +#define D_CONFIRM_RESET_CONFIGURATION "Підтвердити скидання конфігурації" +#define D_RESET_CONFIGURATION "Скидання конфігурації" +#define D_BACKUP_CONFIGURATION "Резервне копіювання конфігурації" +#define D_RESTORE_CONFIGURATION "Відновлення конфігурації" +#define D_MAIN_MENU "Головне меню" + +#define D_MODULE_PARAMETERS "Параметри модулю" +#define D_MODULE_TYPE "Тип модулю" +#define D_GPIO "GPIO" +#define D_SERIAL_IN "Serial вхід" +#define D_SERIAL_OUT "Serial вихід" + +#define D_WIFI_PARAMETERS "Параметри Wifi" +#define D_SCAN_FOR_WIFI_NETWORKS "Сканування беспроводових мереж Wifi" +#define D_SCAN_DONE "Сканування завершене" +#define D_NO_NETWORKS_FOUND "Не знайдено мереж" +#define D_REFRESH_TO_SCAN_AGAIN "Оновити для повторного сканування" +#define D_DUPLICATE_ACCESSPOINT "Дублювати Точку Доступу (AP)" +#define D_SKIPPING_LOW_QUALITY "Пропущено через низьку якість" +#define D_RSSI "RSSI" +#define D_WEP "WEP" +#define D_WPA_PSK "WPA PSK" +#define D_WPA2_PSK "WPA2 PSK" +#define D_AP1_SSID "AP1 SSID" +#define D_AP1_PASSWORD "AP1 Гасло" +#define D_AP2_SSID "AP2 SSID" +#define D_AP2_PASSWORD "AP2 Гасло" + +#define D_MQTT_PARAMETERS "Параметри MQTT" +#define D_CLIENT "Клієнт" +#define D_FULL_TOPIC "Повний Топік" + +#define D_LOGGING_PARAMETERS "Параметри логів" +#define D_SERIAL_LOG_LEVEL "Serial лог рівень" +#define D_WEB_LOG_LEVEL "Web лог рівень" +#define D_SYS_LOG_LEVEL "System лог рівень" +#define D_MORE_DEBUG "Додаткова інформація для налагодження" +#define D_SYSLOG_HOST "System лог хост" +#define D_SYSLOG_PORT "System лог порт" +#define D_TELEMETRY_PERIOD "Період телеметрії" + +#define D_OTHER_PARAMETERS "Параметри Інше" +#define D_WEB_ADMIN_PASSWORD "Гасло Web адміністратора" +#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_SAVE_CONFIGURATION "Зберегти конфігурацію" +#define D_CONFIGURATION_SAVED "Конфігурація збережена " +#define D_CONFIGURATION_RESET "Конфігурація скинута" + +#define D_PROGRAM_VERSION "Версія програми" +#define D_BUILD_DATE_AND_TIME "Дата & Час збірки" +#define D_CORE_AND_SDK_VERSION "Версія Core/SDK" +#define D_FLASH_WRITE_COUNT "Кіл-ть записів Flash" +#define D_MAC_ADDRESS "MAC Адрес" +#define D_MQTT_HOST "MQTT Хост" +#define D_MQTT_PORT "MQTT Порт" +#define D_MQTT_CLIENT "MQTT Клієнт ID" +#define D_MQTT_USER "MQTT Користувач" +#define D_MQTT_TOPIC "MQTT Топік" +#define D_MQTT_GROUP_TOPIC "MQTT Топік групи" +#define D_MQTT_FULL_TOPIC "MQTT Топік повний" +#define D_MDNS_DISCOVERY "mDNS Виявлення" +#define D_MDNS_ADVERTISE "mDNS Транcляція" +#define D_ESP_CHIP_ID "ID чипу ESP" +#define D_FLASH_CHIP_ID "ID чипу Flash пам'яті" +#define D_FLASH_CHIP_SIZE "Розмір Flash пам'яті" +#define D_FREE_PROGRAM_SPACE "Вільний простір програм" + +#define D_UPGRADE_BY_WEBSERVER "Оновлення через Веб-сервер" +#define D_OTA_URL "OTA Url" +#define D_START_UPGRADE "Почати оновлення" +#define D_UPGRADE_BY_FILE_UPLOAD "Оновлення шляхом завантаження файлів" +#define D_UPLOAD_STARTED "Завантаження почалось" +#define D_UPGRADE_STARTED "Оновлення почалось" +#define D_UPLOAD_DONE "Завантаження завершено" +#define D_UPLOAD_ERR_1 "Файл не вибраний" +#define D_UPLOAD_ERR_2 "Недостатньо місця" +#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_7 "Завантаження перервано" +#define D_UPLOAD_ERR_8 "Файл невірний" +#define D_UPLOAD_ERR_9 "Занадто великий файл" +#define D_UPLOAD_ERROR_CODE "Код помилки завантаження" + +#define D_ENTER_COMMAND "Уведіть команду" +#define D_ENABLE_WEBLOG_FOR_RESPONSE "Увімкніть Веб лог рівня 2 якщо очікуєте відповідь" +#define D_NEED_USER_AND_PASSWORD "Очікується user=&password=" + +// xdrv_01_mqtt.ino +#define D_FINGERPRINT "Перевірка TLS відбитка..." +#define D_TLS_CONNECT_FAILED_TO "Збій підключення TLS до" +#define D_RETRY_IN "Повторити" +#define D_VERIFIED "Перевірено відбиток" +#define D_INSECURE "Небезпечне з'єднання, недійсний відбиток " +#define D_CONNECT_FAILED_TO "Помилка підключення до" + +// xplg_wemohue.ino +#define D_MULTICAST_DISABLED "Multicast вимкнений" +#define D_MULTICAST_REJOINED "Multicast (пере)під'єднався" +#define D_MULTICAST_JOIN_FAILED "Multicast помилка з'єднання" +#define D_FAILED_TO_SEND_RESPONSE "Не вдалось відправити відповідь" + +#define D_WEMO "WeMo" +#define D_WEMO_BASIC_EVENT "WeMo основна подія" +#define D_WEMO_EVENT_SERVICE "WeMo служба подій" +#define D_WEMO_META_SERVICE "WeMo мета-сервіс" +#define D_WEMO_SETUP "WeMo налаштування" +#define D_RESPONSE_SENT "Відповідь відправлена" + +#define D_HUE "Hue" +#define D_HUE_BRIDGE_SETUP "Hue налаштування" +#define D_HUE_API_NOT_IMPLEMENTED "Hue API не реалізовано" +#define D_HUE_API "Hue API" +#define D_HUE_POST_ARGS "Hue POST args" +#define D_3_RESPONSE_PACKETS_SENT "3 пакету відповіді отримано" + +// xdrv_07_domoticz.ino +#define D_DOMOTICZ_PARAMETERS "Domoticz налаштування" +#define D_DOMOTICZ_IDX "Idx" +#define D_DOMOTICZ_KEY_IDX "Ключ idx" +#define D_DOMOTICZ_SWITCH_IDX "Перемикач idx" +#define D_DOMOTICZ_SENSOR_IDX "Датчик idx" + #define D_DOMOTICZ_TEMP "Температура" + #define D_DOMOTICZ_TEMP_HUM "Темп,Волог" + #define D_DOMOTICZ_TEMP_HUM_BARO "Темп,Волог,Тиск" + #define D_DOMOTICZ_POWER_ENERGY "Потуж,Енергія" + #define D_DOMOTICZ_ILLUMINANCE "Освітлення" + #define D_DOMOTICZ_COUNT "Лічильник/PM1" + #define D_DOMOTICZ_VOLTAGE "Напруга/PM2,5" + #define D_DOMOTICZ_CURRENT "Струм/PM10" + #define D_DOMOTICZ_AIRQUALITY "Якість повітря" +#define D_DOMOTICZ_UPDATE_TIMER "Оновлення таймерів" + +// xdrv_09_timers.ino +#define D_CONFIGURE_TIMER "Конфігурація таймеру" +#define D_TIMER_PARAMETERS "Налаштування таймеру" +#define D_TIMER_ARM "Увімкнений" +#define D_TIMER_TIME "Час" +#define D_TIMER_DAYS "Дні" +#define D_TIMER_REPEAT "Повтор" +#define D_TIMER_OUTPUT "Вихід" +#define D_TIMER_ACTION "Дія" + +// xdrv_10_knx.ino +#define D_CONFIGURE_KNX "Конфігурація KNX" +#define D_KNX_PARAMETERS "Налаштування KNX" +#define D_KNX_GENERAL_CONFIG "Основні" +#define D_KNX_PHYSICAL_ADDRESS "Фізична адреса" +#define D_KNX_PHYSICAL_ADDRESS_NOTE "( Має бути унікальним у мережі KNX)" +#define D_KNX_ENABLE "Увімкнений KNX" +#define D_KNX_GROUP_ADDRESS_TO_WRITE "Дані для запису групових адрес" +#define D_ADD "Додати" +#define D_DELETE "Видалити" +#define D_REPLY "Повторити" +#define D_KNX_GROUP_ADDRESS_TO_READ "Дані для читання групових адрес" +#define D_LOG_KNX "KNX: " +#define D_RECEIVED_FROM "Отримати з" +#define D_KNX_COMMAND_WRITE "Записати" +#define D_KNX_COMMAND_READ "Читати" +#define D_KNX_COMMAND_OTHER "Інше" +#define D_SENT_TO "надіслати до" +#define D_KNX_WARNING "Адреса групи (0/0/0) зарезервована і не може бути використана." +#define D_KNX_ENHANCEMENT "Підвищення зв'язку" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" + +// xdrv_03_energy.ino +#define D_ENERGY_TODAY "Енергія Сьогодні" +#define D_ENERGY_YESTERDAY "Енергія Вчора" +#define D_ENERGY_TOTAL "Енергія Всього" + +// xsns_05_ds18b20.ino +#define D_SENSOR_BUSY "Датчик DS18x20 занятий" +#define D_SENSOR_CRC_ERROR "Датчик DS18x20 - помилка CRC" +#define D_SENSORS_FOUND "Датчик DS18x20 знайдено" + +// xsns_06_dht.ino +#define D_TIMEOUT_WAITING_FOR "Тайм-аут, в очікуванні" +#define D_START_SIGNAL_LOW "стартовий сигнал низький" +#define D_START_SIGNAL_HIGH "стартовий сигнал високий" +#define D_PULSE "імпульс" +#define D_CHECKSUM_FAILURE "Помилка контрольної суми" + +// xsns_07_sht1x.ino +#define D_SENSOR_DID_NOT_ACK_COMMAND "Датчик не отримав команду ACK" +#define D_SHT1X_FOUND "SHT1X знайдено" + +// 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 "Через Частини" + +// sonoff_template.h +#define D_SENSOR_NONE "-відсутньо-" +#define D_SENSOR_DHT11 "DHT11" +#define D_SENSOR_AM2301 "AM2301" +#define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_DS18X20 "DS18x20" +#define D_SENSOR_I2C_SCL "I2C SCL" +#define D_SENSOR_I2C_SDA "I2C SDA" +#define D_SENSOR_WS2812 "WS2812" +#define D_SENSOR_IRSEND "IRsend" +#define D_SENSOR_SWITCH "Перемикач" // Suffix "1" +#define D_SENSOR_BUTTON "Кнопка" // Suffix "1" +#define D_SENSOR_RELAY "Реле" // Suffix "1i" +#define D_SENSOR_LED "Led" // Suffix "1i" +#define D_SENSOR_PWM "PWM" // Suffix "1" +#define D_SENSOR_COUNTER "Лічильник" // Suffix "1" +#define D_SENSOR_IRRECV "IRrecv" +#define D_SENSOR_MHZ_RX "MHZ Rx" +#define D_SENSOR_MHZ_TX "MHZ Tx" +#define D_SENSOR_PZEM_RX "PZEM Rx" +#define D_SENSOR_PZEM_TX "PZEM Tx" +#define D_SENSOR_SAIR_RX "SAir Rx" +#define D_SENSOR_SAIR_TX "SAir Tx" +#define D_SENSOR_SPI_CS "SPI CS" +#define D_SENSOR_SPI_DC "SPI DC" +#define D_SENSOR_BACKLIGHT "BkLight" +#define D_SENSOR_PMS5003 "PMS5003" +#define D_SENSOR_SDS0X1 "SDS0X1" +#define D_SENSOR_SBR_RX "SerBr Rx" +#define D_SENSOR_SBR_TX "SerBr Tx" +#define D_SENSOR_SR04_TRIG "SR04 Tri" +#define D_SENSOR_SR04_ECHO "SR04 Ech" +#define D_SENSOR_SDM120_TX "SDM120 Tx" +#define D_SENSOR_SDM120_RX "SDM120 Rx" +#define D_SENSOR_SDM630_TX "SDM630 Tx" +#define D_SENSOR_SDM630_RX "SDM630 Rx" + +// Units +#define D_UNIT_AMPERE "А" +#define D_UNIT_CENTIMETER "cм" +#define D_UNIT_HERTZ "Гц" +#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_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_SECTORS "секторів" +#define D_UNIT_VA "ВA" +#define D_UNIT_VAR "VAr" +#define D_UNIT_VOLT "В" +#define D_UNIT_WATT "Вт" +#define D_UNIT_WATTHOUR "ВтГод" + +// Log message prefix +#define D_LOG_APPLICATION "APP: " // Application +#define D_LOG_BRIDGE "BRG: " // Bridge +#define D_LOG_CONFIG "CFG: " // Settings +#define D_LOG_COMMAND "CMD: " // Command +#define D_LOG_DEBUG "DBG: " // Debug +#define D_LOG_DHT "DHT: " // DHT sensor +#define D_LOG_DOMOTICZ "DOM: " // Domoticz +#define D_LOG_DSB "DSB: " // DS18xB20 sensor +#define D_LOG_HTTP "HTP: " // HTTP webserver +#define D_LOG_I2C "I2C: " // I2C +#define D_LOG_IRR "IRR: " // Infra Red Received +#define D_LOG_LOG "LOG: " // Logging +#define D_LOG_MODULE "MOD: " // Module +#define D_LOG_MDNS "DNS: " // mDNS +#define D_LOG_MQTT "MQT: " // MQTT +#define D_LOG_OTHER "OTH: " // Other +#define D_LOG_RESULT "RSL: " // Result +#define D_LOG_RFR "RFR: " // RF Received +#define D_LOG_SERIAL "SER: " // Serial +#define D_LOG_SHT1 "SHT: " // SHT1x sensor +#define D_LOG_UPLOAD "UPL: " // Upload +#define D_LOG_UPNP "UPP: " // UPnP +#define D_LOG_WIFI "WIF: " // Wifi + +#endif // _LANGUAGE_UK_UK_H_ diff --git a/sonoff/language/zh-CN.h b/sonoff/language/zh-CN.h index 1c3ee0bb7..5b036a557 100644 --- a/sonoff/language/zh-CN.h +++ b/sonoff/language/zh-CN.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "使用默认设置" #define D_ERASED_SECTOR "擦除删除" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "固件版本过低 - 请升级" #define D_WEBSERVER_ACTIVE_ON "Web服务器:" #define D_WITH_IP_ADDRESS "IP地址:" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "如果预期响应,则启用Weblog 2" #define D_NEED_USER_AND_PASSWORD "需要 user=<用户名>&password=<密码>" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "验证 TLS 指纹..." #define D_TLS_CONNECT_FAILED_TO "TLS 连接失败" #define D_RETRY_IN "重试倒计时:" @@ -335,7 +335,7 @@ #define D_INSECURE "指纹无效导致连接不安全" #define D_CONNECT_FAILED_TO "连接失败:" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "组播已禁用" #define D_MULTICAST_REJOINED "组播已(重新)加入" #define D_MULTICAST_JOIN_FAILED "组播加入失败" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST 参数" #define D_3_RESPONSE_PACKETS_SENT "3 请求包发送" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz 设置" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "sent to" #define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "今日用电量" diff --git a/sonoff/language/zh-TW.h b/sonoff/language/zh-TW.h index e8505010f..baecc8318 100644 --- a/sonoff/language/zh-TW.h +++ b/sonoff/language/zh-TW.h @@ -205,7 +205,7 @@ #define D_USE_DEFAULTS "使用默認設置" #define D_ERASED_SECTOR "擦除刪除" -// webserver.ino +// xdrv_02_webserver.ino #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "固件版本過低 - 請升級" #define D_WEBSERVER_ACTIVE_ON "Web服務器:" #define D_WITH_IP_ADDRESS "IP地址:" @@ -327,7 +327,7 @@ #define D_ENABLE_WEBLOG_FOR_RESPONSE "如果預期響應,則啟用Weblog 2" #define D_NEED_USER_AND_PASSWORD "需要 user=<用戶名>&password=<密碼>" -// xdrv_00_mqtt.ino +// xdrv_01_mqtt.ino #define D_FINGERPRINT "驗證 TLS 指紋..." #define D_TLS_CONNECT_FAILED_TO "TLS 連接失敗" #define D_RETRY_IN "重試倒計時:" @@ -335,7 +335,7 @@ #define D_INSECURE "指紋無效導致連接不安全" #define D_CONNECT_FAILED_TO "連接失敗:" -// xdrv_wemohue.ino +// xplg_wemohue.ino #define D_MULTICAST_DISABLED "組播已禁用" #define D_MULTICAST_REJOINED "組播已(重新)加入" #define D_MULTICAST_JOIN_FAILED "組播加入失敗" @@ -355,7 +355,7 @@ #define D_HUE_POST_ARGS "Hue POST 參數" #define D_3_RESPONSE_PACKETS_SENT "3 請求包發送" -// xdrv_05_domoticz.ino +// xdrv_07_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz 設置" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" @@ -402,6 +402,8 @@ #define D_SENT_TO "sent to" #define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." #define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" // xdrv_03_energy.ino #define D_ENERGY_TODAY "今日用電量" diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h index 517b755ae..5dd01a632 100644 --- a/sonoff/sonoff.h +++ b/sonoff/sonoff.h @@ -137,7 +137,7 @@ typedef unsigned long power_t; // Power (Relay) type #define DAWN_NAUTIC -12.0 #define DAWN_ASTRONOMIC -18.0 -// Sensor definition for KNX Driver +// Sensor and Commands definition for KNX Driver #define KNX_TEMPERATURE 17 #define KNX_HUMIDITY 18 #define KNX_ENERGY_VOLTAGE 19 @@ -147,7 +147,13 @@ typedef unsigned long power_t; // Power (Relay) type #define KNX_ENERGY_DAILY 23 #define KNX_ENERGY_START 24 #define KNX_ENERGY_TOTAL 25 -#define KNX_MAX_device_param 25 +#define KNX_SLOT1 26 +#define KNX_SLOT2 27 +#define KNX_SLOT3 28 +#define KNX_SLOT4 29 +#define KNX_SLOT5 30 +#define KNX_MAX_device_param 30 +#define MAX_KNXTX_CMNDS 5 /*********************************************************************************************\ * Enumeration @@ -192,10 +198,14 @@ enum XsnsFunctions {FUNC_INIT, FUNC_LOOP, FUNC_EVERY_50_MSECOND, FUNC_EVERY_SECO const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 }; +enum CommandSource { SRC_IGNORE, SRC_MQTT, SRC_RESTART, SRC_BUTTON, SRC_SWITCH, SRC_BACKLOG, SRC_SERIAL, SRC_WEBGUI, SRC_WEBCOMMAND, SRC_WEBCONSOLE, SRC_PULSETIMER, + SRC_TIMER, SRC_RULE, SRC_MAXPOWER, SRC_MAXENERGY, SRC_LIGHT, SRC_KNX, SRC_DISPLAY, SRC_WEMO, SRC_HUE, SRC_MAX }; +const char kCommandSource[] PROGMEM = "I|MQTT|Restart|Button|Switch|Backlog|Serial|WebGui|WebCommand|WebConsole|PulseTimer|Timer|Rule|MaxPower|MaxEnergy|Light|Knx|Display|Wemo|Hue"; + /*********************************************************************************************\ * Extern global variables \*********************************************************************************************/ extern uint8_t light_device; // Light device number -#endif // _SONOFF_H_ \ No newline at end of file +#endif // _SONOFF_H_ diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 82e745b73..8a16742aa 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -82,7 +82,7 @@ enum TasmotaCommands { CMND_GPIO, CMND_GPIOS, CMND_PWM, CMND_PWMFREQUENCY, CMND_PWMRANGE, CMND_COUNTER, CMND_COUNTERTYPE, 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_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE, 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 = @@ -92,7 +92,7 @@ const char kTasmotaCommands[] PROGMEM = D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_COUNTER "|" D_CMND_COUNTERTYPE "|" 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_WIFICONFIG "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_TELEPERIOD "|" D_CMND_RESTART "|" D_CMND_RESET "|" D_CMND_TIMEZONE "|" D_CMND_TIMESTD "|" D_CMND_TIMEDST "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|" D_CMND_I2CSCAN "|" D_CMND_SERIALSEND "|" D_CMND_BAUDRATE "|" D_CMND_SERIALDELIMITER; @@ -304,10 +304,12 @@ void SetLatchingRelay(power_t power, uint8_t state) } } -void SetDevicePower(power_t rpower) +void SetDevicePower(power_t rpower, int source) { uint8_t state; + ShowSource(source); + if (POWER_ALL_ALWAYS_ON == Settings.poweronstate) { // All on and stay on power = (1 << devices_present) -1; rpower = power; @@ -396,6 +398,8 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) memcpy(dataBuf, data +i, sizeof(dataBuf)); dataBuf[sizeof(dataBuf)-1] = 0; + if (topicBuf[0] != '/') { ShowSource(SRC_MQTT); } + snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_RESULT D_RECEIVED_TOPIC " %s, " D_DATA_SIZE " %d, " D_DATA " %s"), topicBuf, data_len, dataBuf); AddLog(LOG_LEVEL_DEBUG_MORE); @@ -490,7 +494,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) else if ((CMND_POWER == command_code) && (index > 0) && (index <= devices_present)) { if ((payload < 0) || (payload > 4)) payload = 9; // Settings.flag.device_index_enable = user_append_index; - ExecuteCommandPower(index, payload); + ExecuteCommandPower(index, payload, SRC_IGNORE); fallback_topic_flag = 0; return; } @@ -516,7 +520,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) Settings.poweronstate = payload; if (POWER_ALL_ALWAYS_ON == Settings.poweronstate) { for (byte i = 1; i <= devices_present; i++) { - ExecuteCommandPower(i, POWER_ON); + ExecuteCommandPower(i, POWER_ON, SRC_IGNORE); } } } @@ -980,38 +984,6 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) if ((payload >= 0) && (payload < MAX_SWITCH_OPTION)) Settings.switchmode[index -1] = payload; snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_NVALUE, command, index, Settings.switchmode[index-1]); } -#ifdef USE_WEBSERVER - else if (CMND_WEBSERVER == command_code) { - if ((payload >= 0) && (payload <= 2)) Settings.webserver = payload; - if (Settings.webserver) { - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WEBSERVER "\":\"" D_JSON_ACTIVE_FOR " %s " D_JSON_ON_DEVICE " %s " D_JSON_WITH_IP_ADDRESS " %s\"}"), - (2 == Settings.webserver) ? D_ADMIN : D_USER, my_hostname, WiFi.localIP().toString().c_str()); - } else { - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText(0)); - } - } - else if (CMND_WEBPASSWORD == command_code) { - if ((data_len > 0) && (data_len < sizeof(Settings.web_password))) { - strlcpy(Settings.web_password, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? WEB_PASSWORD : dataBuf, sizeof(Settings.web_password)); - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.web_password); - } else { - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_ASTERIX, command); - } - } - else if (CMND_WEBLOG == command_code) { - if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) Settings.weblog_level = payload; - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.weblog_level); - } -#ifdef USE_EMULATION - else if (CMND_EMULATION == command_code) { - if ((payload >= EMUL_NONE) && (payload < EMUL_MAX)) { - Settings.flag2.emulation = payload; - restart_flag = 2; - } - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.flag2.emulation); - } -#endif // USE_EMULATION -#endif // USE_WEBSERVER else if (CMND_TELEPERIOD == command_code) { if ((payload >= 0) && (payload < 3601)) { Settings.tele_period = (1 == payload) ? TELE_PERIOD : payload; @@ -1187,7 +1159,7 @@ boolean SendKey(byte key, byte device, byte state) return result; } -void ExecuteCommandPower(byte device, byte state) +void ExecuteCommandPower(byte device, byte state, int source) { // device = Relay number 1 and up // state 0 = Relay Off @@ -1199,6 +1171,8 @@ void ExecuteCommandPower(byte device, byte state) // state 7 = Relay On and no publishPowerState // state 9 = Show power state +// ShowSource(source); + uint8_t publish_power = 1; if ((POWER_OFF_NO_STATE == state) || (POWER_ON_NO_STATE == state)) { state &= 1; @@ -1216,7 +1190,7 @@ void ExecuteCommandPower(byte device, byte state) interlock_mutex = 1; for (byte i = 0; i < devices_present; i++) { power_t imask = 1 << i; - if ((power & imask) && (mask != imask)) ExecuteCommandPower(i +1, POWER_OFF); + if ((power & imask) && (mask != imask)) ExecuteCommandPower(i +1, POWER_OFF, SRC_IGNORE); } interlock_mutex = 0; } @@ -1230,7 +1204,7 @@ void ExecuteCommandPower(byte device, byte state) case POWER_TOGGLE: power ^= mask; } - SetDevicePower(power); + SetDevicePower(power, source); #ifdef USE_DOMOTICZ DomoticzUpdatePowerState(device); #endif // USE_DOMOTICZ @@ -1257,7 +1231,7 @@ void ExecuteCommandPower(byte device, byte state) byte flag = (blink_mask & mask); blink_mask &= (POWER_MASK ^ mask); // Clear device mask MqttPublishPowerBlinkState(device); - if (flag) ExecuteCommandPower(device, (blink_powersave >> (device -1))&1); // Restore state + if (flag) ExecuteCommandPower(device, (blink_powersave >> (device -1))&1, SRC_IGNORE); // Restore state return; } if (publish_power) MqttPublishPowerState(device); @@ -1272,18 +1246,20 @@ void StopAllPowerBlink() if (blink_mask & mask) { blink_mask &= (POWER_MASK ^ mask); // Clear device mask MqttPublishPowerBlinkState(i); - ExecuteCommandPower(i, (blink_powersave >> (i -1))&1); // Restore state + ExecuteCommandPower(i, (blink_powersave >> (i -1))&1, SRC_IGNORE); // Restore state } } } -void ExecuteCommand(char *cmnd) +void ExecuteCommand(char *cmnd, int source) { char stopic[CMDSZ]; char svalue[INPUT_BUFFER_SIZE]; char *start; char *token; + ShowSource(source); + token = strtok(cmnd, " "); if (token != NULL) { start = strrchr(token, '/'); // Skip possible cmnd/sonoff/ preamble @@ -1582,7 +1558,7 @@ void ButtonHandler() } if (button_pressed) { if (!SendKey(0, button_index +1, POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set - ExecuteCommandPower(button_index +1, POWER_TOGGLE); // Execute Toggle command internally + ExecuteCommandPower(button_index +1, POWER_TOGGLE, SRC_BUTTON); // Execute Toggle command internally } } } else { @@ -1591,7 +1567,7 @@ void ButtonHandler() snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_BUTTON "%d " D_IMMEDIATE), button_index +1); AddLog(LOG_LEVEL_DEBUG); if (!SendKey(0, button_index +1, POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set - ExecuteCommandPower(button_index +1, POWER_TOGGLE); // Execute Toggle command internally + ExecuteCommandPower(button_index +1, POWER_TOGGLE, SRC_BUTTON); // Execute Toggle command internally } } else { multipress[button_index] = (multiwindow[button_index]) ? multipress[button_index] +1 : 1; @@ -1610,7 +1586,7 @@ void ButtonHandler() if (holdbutton[button_index] == Settings.param[P_HOLD_TIME] * (STATES / 10) * hold_time_extent) { // Button held for factor times longer // Settings.flag.button_single = 0; snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_SETOPTION "13 0")); // Disable single press only - ExecuteCommand(scmnd); + ExecuteCommand(scmnd, SRC_BUTTON); } } else { if (Settings.flag.button_restrict) { // Button restriction @@ -1622,7 +1598,7 @@ void ButtonHandler() if (holdbutton[button_index] == (Settings.param[P_HOLD_TIME] * (STATES / 10)) * hold_time_extent) { // Button held for factor times longer multipress[button_index] = 0; snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_RESET " 1")); - ExecuteCommand(scmnd); + ExecuteCommand(scmnd, SRC_BUTTON); } } } @@ -1649,12 +1625,12 @@ void ButtonHandler() if (WifiState()) { // WPSconfig, Smartconfig or Wifimanager active restart_flag = 1; } else { - ExecuteCommandPower(button_index + multipress[button_index], POWER_TOGGLE); // Execute Toggle command internally + ExecuteCommandPower(button_index + multipress[button_index], POWER_TOGGLE, SRC_BUTTON); // Execute Toggle command internally } } else { // 3 - 7 press if (!Settings.flag.button_restrict) { snprintf_P(scmnd, sizeof(scmnd), kCommands[multipress[button_index] -3]); - ExecuteCommand(scmnd); + ExecuteCommand(scmnd, SRC_BUTTON); } } } @@ -1737,7 +1713,7 @@ void SwitchHandler() if (switchflag < 3) { if (!SendKey(1, i +1, switchflag)) { // Execute command via MQTT - ExecuteCommandPower(i +1, switchflag); // Execute command internally (if i < devices_present) + ExecuteCommandPower(i +1, switchflag, SRC_SWITCH); // Execute command internally (if i < devices_present) } } @@ -1784,8 +1760,8 @@ void StateLoop() if ((pulse_timer[i] > 0) && (pulse_timer[i] < 112)) { pulse_timer[i]--; if (!pulse_timer[i]) { -// ExecuteCommandPower(i +1, POWER_OFF); - ExecuteCommandPower(i +1, (POWER_ALL_OFF_PULSETIME_ON == Settings.poweronstate) ? POWER_ON : POWER_OFF); +// ExecuteCommandPower(i +1, POWER_OFF, SRC_PULSETIMER); + ExecuteCommandPower(i +1, (POWER_ALL_OFF_PULSETIME_ON == Settings.poweronstate) ? POWER_ON : POWER_OFF, SRC_PULSETIMER); } } } @@ -1800,7 +1776,7 @@ void StateLoop() } else { blink_power ^= 1; power_now = (power & (POWER_MASK ^ blink_mask)) | ((blink_power) ? blink_mask : 0); - SetDevicePower(power_now); + SetDevicePower(power_now, SRC_IGNORE); } } } @@ -1809,7 +1785,7 @@ void StateLoop() if (backlog_delay) backlog_delay--; if ((backlog_pointer != backlog_index) && !backlog_delay && !backlog_mutex) { backlog_mutex = 1; - ExecuteCommand((char*)backlog[backlog_pointer].c_str()); + ExecuteCommand((char*)backlog[backlog_pointer].c_str(), SRC_BACKLOG); backlog_mutex = 0; backlog_pointer++; if (backlog_pointer >= MAX_BACKLOG) backlog_pointer = 0; @@ -2154,7 +2130,7 @@ void SerialInput() seriallog_level = (Settings.seriallog_level < LOG_LEVEL_INFO) ? (byte)LOG_LEVEL_INFO : Settings.seriallog_level; snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_COMMAND "%s"), serial_in_buffer); AddLog(LOG_LEVEL_INFO); - ExecuteCommand(serial_in_buffer); + ExecuteCommand(serial_in_buffer, SRC_SERIAL); serial_in_byte_counter = 0; serial_polling_window = 0; Serial.flush(); @@ -2411,36 +2387,36 @@ void setup() if (MOTOR == Settings.module) Settings.poweronstate = POWER_ALL_ON; // Needs always on else in limbo! if (POWER_ALL_ALWAYS_ON == Settings.poweronstate) { - SetDevicePower(1); + SetDevicePower(1, SRC_RESTART); } else { if ((resetInfo.reason == REASON_DEFAULT_RST) || (resetInfo.reason == REASON_EXT_SYS_RST)) { switch (Settings.poweronstate) { case POWER_ALL_OFF: case POWER_ALL_OFF_PULSETIME_ON: power = 0; - SetDevicePower(power); + SetDevicePower(power, SRC_RESTART); break; case POWER_ALL_ON: // All on power = (1 << devices_present) -1; - SetDevicePower(power); + SetDevicePower(power, SRC_RESTART); break; case POWER_ALL_SAVED_TOGGLE: power = (Settings.power & ((1 << devices_present) -1)) ^ POWER_MASK; if (Settings.flag.save_state) { - SetDevicePower(power); + SetDevicePower(power, SRC_RESTART); } break; case POWER_ALL_SAVED: power = Settings.power & ((1 << devices_present) -1); if (Settings.flag.save_state) { - SetDevicePower(power); + SetDevicePower(power, SRC_RESTART); } break; } } else { power = Settings.power & ((1 << devices_present) -1); if (Settings.flag.save_state) { - SetDevicePower(power); + SetDevicePower(power, SRC_RESTART); } } } @@ -2480,13 +2456,6 @@ void loop() OsWatchLoop(); -#ifdef USE_WEBSERVER - PollDnsWebserver(); -#ifdef USE_EMULATION - if (Settings.flag2.emulation) PollUdp(); -#endif // USE_EMULATION -#endif // USE_WEBSERVER - if (millis() >= state_loop_timer) StateLoop(); if (!serial_local) SerialInput(); diff --git a/sonoff/support.ino b/sonoff/support.ino index 2bc80c5eb..f92d32235 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -244,6 +244,29 @@ char* LTrim(char* p) return p; } +char* RTrim(char* p) +{ + char* q = p + strlen(p) -1; + while ((q >= p) && (isblank(*q))) { + q--; // Trim trailing spaces + } + q++; + *q = '\0'; + return p; +} + +char* Trim(char* p) +{ + if (*p == '\0') { return p; } + while (isspace(*p)) { p++; } // Trim leading spaces + if (*p == '\0') { return p; } + char* q = p + strlen(p) -1; + while (isspace(*q) && q >= p) { q--; } // Trim trailing spaces + q++; + *q = '\0'; + return p; +} + char* NoAlNumToUnderscore(char* dest, const char* source) { char* write = dest; @@ -606,6 +629,15 @@ uint32_t GetHash(const char *buffer, size_t size) return hash; } +void ShowSource(int source) +{ + if ((source > 0) && (source < SRC_MAX)) { + char stemp1[20]; + snprintf_P(log_data, sizeof(log_data), PSTR("SRC: %s"), GetTextIndexed(stemp1, sizeof(stemp1), source, kCommandSource)); + AddLog(LOG_LEVEL_DEBUG); + } +} + /*********************************************************************************************\ * Fill feature list \*********************************************************************************************/ @@ -633,52 +665,52 @@ void GetFeatures() feature_drv1 |= 0x00000040; // sonoff.ino #endif #ifdef USE_WEBSERVER - feature_drv1 |= 0x00000080; // webserver.ino + feature_drv1 |= 0x00000080; // xdrv_02_webserver.ino #endif #ifdef WEBSERVER_ADVERTISE - feature_drv1 |= 0x00000100; // webserver.ino + feature_drv1 |= 0x00000100; // xdrv_02_webserver.ino #endif #ifdef USE_EMULATION feature_drv1 |= 0x00000200; // xplg_wemohue.ino #endif #if (MQTT_LIBRARY_TYPE == MQTT_PUBSUBCLIENT) - feature_drv1 |= 0x00000400; // xdrv_00_mqtt.ino + feature_drv1 |= 0x00000400; // xdrv_01_mqtt.ino #endif #if (MQTT_LIBRARY_TYPE == MQTT_TASMOTAMQTT) - feature_drv1 |= 0x00000800; // xdrv_00_mqtt.ino + feature_drv1 |= 0x00000800; // xdrv_01_mqtt.ino #endif #if (MQTT_LIBRARY_TYPE == MQTT_ESPMQTTARDUINO) - feature_drv1 |= 0x00001000; // xdrv_00_mqtt.ino + feature_drv1 |= 0x00001000; // xdrv_01_mqtt.ino #endif #ifdef MQTT_HOST_DISCOVERY - feature_drv1 |= 0x00002000; // xdrv_00_mqtt.ino + feature_drv1 |= 0x00002000; // xdrv_01_mqtt.ino #endif #ifdef USE_ARILUX_RF - feature_drv1 |= 0x00004000; // xdrv_01_light.ino + feature_drv1 |= 0x00004000; // xdrv_04_light.ino #endif #ifdef USE_WS2812 - feature_drv1 |= 0x00008000; // xdrv_01_light.ino + feature_drv1 |= 0x00008000; // xdrv_04_light.ino #endif #ifdef USE_WS2812_DMA - feature_drv1 |= 0x00010000; // xdrv_01_light.ino + feature_drv1 |= 0x00010000; // xdrv_04_light.ino #endif #ifdef USE_IR_REMOTE - feature_drv1 |= 0x00020000; // xdrv_02_irremote.ino + feature_drv1 |= 0x00020000; // xdrv_05_irremote.ino #endif #ifdef USE_IR_HVAC - feature_drv1 |= 0x00040000; // xdrv_02_irremote.ino + feature_drv1 |= 0x00040000; // xdrv_05_irremote.ino #endif #ifdef USE_IR_RECEIVE - feature_drv1 |= 0x00080000; // xdrv_02_irremote.ino + feature_drv1 |= 0x00080000; // xdrv_05_irremote.ino #endif #ifdef USE_DOMOTICZ - feature_drv1 |= 0x00100000; // xdrv_05_domoticz.ino + feature_drv1 |= 0x00100000; // xdrv_07_domoticz.ino #endif #ifdef USE_DISPLAY - feature_drv1 |= 0x00200000; // xdrv_06_display.ino + feature_drv1 |= 0x00200000; // xdrv_98_display.ino #endif #ifdef USE_HOME_ASSISTANT - feature_drv1 |= 0x00400000; // xdrv_07_home_assistant.ino + feature_drv1 |= 0x00400000; // xdrv_12_home_assistant.ino #endif #ifdef USE_SERIAL_BRIDGE feature_drv1 |= 0x00800000; // xdrv_08_serial_bridge.ino @@ -1141,7 +1173,7 @@ void WifiCheck(uint8_t param) StartWebserver(Settings.webserver, WiFi.localIP()); #ifdef USE_DISCOVERY #ifdef WEBSERVER_ADVERTISE - MDNS.addService("http", "tcp", 80); + MDNS.addService("http", "tcp", WEB_PORT); #endif // WEBSERVER_ADVERTISE #endif // USE_DISCOVERY } else { diff --git a/sonoff/user_config.h b/sonoff/user_config.h index 91b0a137f..8cc07d356 100644 --- a/sonoff/user_config.h +++ b/sonoff/user_config.h @@ -196,6 +196,7 @@ //#define MY_LANGUAGE pt-BR // Portuguese in Brazil //#define MY_LANGUAGE pt-PT // Portuguese in Portugal //#define MY_LANGUAGE ru-RU // Russian in Russia +//#define MY_LANGUAGE uk-UK // Ukrainian in Ukrain //#define MY_LANGUAGE zh-CN // Chinese (Simplified) in China //#define MY_LANGUAGE zh-TW // Chinese (Traditional) in Taiwan diff --git a/sonoff/xdrv_00_mqtt.ino b/sonoff/xdrv_01_mqtt.ino similarity index 99% rename from sonoff/xdrv_00_mqtt.ino rename to sonoff/xdrv_01_mqtt.ino index 5d688e721..7a2c5e666 100644 --- a/sonoff/xdrv_00_mqtt.ino +++ b/sonoff/xdrv_01_mqtt.ino @@ -1,5 +1,5 @@ /* - xdrv_00_mqtt.ino - mqtt support for Sonoff-Tasmota + xdrv_01_mqtt.ino - mqtt support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -745,9 +745,9 @@ bool MqttCommand() * Interface \*********************************************************************************************/ -#define XDRV_00 +#define XDRV_01 -boolean Xdrv00(byte function) +boolean Xdrv01(byte function) { boolean result = false; diff --git a/sonoff/webserver.ino b/sonoff/xdrv_02_webserver.ino similarity index 89% rename from sonoff/webserver.ino rename to sonoff/xdrv_02_webserver.ino index e1656ec31..7059bcc4c 100644 --- a/sonoff/webserver.ino +++ b/sonoff/xdrv_02_webserver.ino @@ -1,5 +1,5 @@ /* - webserver.ino - webserver for Sonoff-Tasmota + xdrv_02_webserver.ino - webserver for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -337,6 +337,21 @@ static void WebGetArg(const char* arg, char* out, size_t max) out[max-1] = '\0'; // Ensure terminating NUL } +void ShowWebSource(int source) +{ + if ((source > 0) && (source < SRC_MAX)) { + char stemp1[20]; + snprintf_P(log_data, sizeof(log_data), PSTR("SRC: %s from %s"), GetTextIndexed(stemp1, sizeof(stemp1), source, kCommandSource), WebServer->client().remoteIP().toString().c_str()); + AddLog(LOG_LEVEL_DEBUG); + } +} + +void ExecuteWebCommand(char* svalue, int source) +{ + ShowWebSource(source); + ExecuteCommand(svalue, SRC_IGNORE); +} + void StartWebserver(int type, IPAddress ipweb) { if (!webserver_state) { @@ -567,22 +582,23 @@ void HandleAjaxStatusRefresh() WebGetArg("o", tmp, sizeof(tmp)); if (strlen(tmp)) { - ExecuteCommandPower(atoi(tmp), POWER_TOGGLE); + ShowWebSource(SRC_WEBGUI); + ExecuteCommandPower(atoi(tmp), POWER_TOGGLE, SRC_IGNORE); } WebGetArg("d", tmp, sizeof(tmp)); if (strlen(tmp)) { snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_DIMMER " %s"), tmp); - ExecuteCommand(svalue); + ExecuteWebCommand(svalue, SRC_WEBGUI); } WebGetArg("t", tmp, sizeof(tmp)); if (strlen(tmp)) { snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_COLORTEMPERATURE " %s"), tmp); - ExecuteCommand(svalue); + ExecuteWebCommand(svalue, SRC_WEBGUI); } WebGetArg("k", tmp, sizeof(tmp)); if (strlen(tmp)) { snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_RFKEY "%s"), tmp); - ExecuteCommand(svalue); + ExecuteWebCommand(svalue, SRC_WEBGUI); } snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{t}")); @@ -1106,6 +1122,7 @@ void HandleSaveSettings() } ShowPage(page); + ShowWebSource(SRC_WEBGUI); restart_flag = 2; } else { HandleConfiguration(); @@ -1129,7 +1146,7 @@ void HandleResetConfiguration() ShowPage(page); snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_RESET " 1")); - ExecuteCommand(svalue); + ExecuteWebCommand(svalue, SRC_WEBGUI); } void HandleRestoreConfiguration() @@ -1181,7 +1198,7 @@ void HandleUpgradeFirmwareStart() WebGetArg("o", tmp, sizeof(tmp)); if (strlen(tmp)) { snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_OTAURL " %s"), tmp); - ExecuteCommand(svalue); + ExecuteWebCommand(svalue, SRC_WEBGUI); } String page = FPSTR(HTTP_HEAD); @@ -1193,7 +1210,7 @@ void HandleUpgradeFirmwareStart() ShowPage(page); snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_UPGRADE " 1")); - ExecuteCommand(svalue); + ExecuteWebCommand(svalue, SRC_WEBGUI); } void HandleUploadDone() @@ -1233,6 +1250,8 @@ void HandleUploadDone() } else { page += F("green'>" D_SUCCESSFUL "
"); page += FPSTR(HTTP_MSG_RSTRT); + + ShowWebSource(SRC_WEBGUI); restart_flag = 2; } SettingsBufferFree(); @@ -1381,16 +1400,16 @@ void HandleHttpCommand() WebGetArg("user", tmp1, sizeof(tmp1)); char tmp2[100]; WebGetArg("password", tmp2, sizeof(tmp2)); - if (!(!strcmp(tmp1, WEB_USERNAME) && !strcmp(tmp2, Settings.web_password))) { - valid = 0; - } + if (!(!strcmp(tmp1, WEB_USERNAME) && !strcmp(tmp2, Settings.web_password))) { valid = 0; } } String message = F("{\"" D_RSLT_WARNING "\":\""); if (valid) { byte curridx = web_log_index; WebGetArg("cmnd", svalue, sizeof(svalue)); - if (strlen(svalue)) { ExecuteCommand(svalue); } + if (strlen(svalue)) { + ExecuteWebCommand(svalue, SRC_WEBCOMMAND); + } if (web_log_index != curridx) { byte counter = curridx; @@ -1449,7 +1468,7 @@ void HandleAjaxConsoleRefresh() if (strlen(svalue)) { snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_COMMAND "%s"), svalue); AddLog(LOG_LEVEL_INFO); - ExecuteCommand(svalue); + ExecuteWebCommand(svalue, SRC_WEBCONSOLE); } WebGetArg("c2", svalue, sizeof(svalue)); @@ -1624,6 +1643,7 @@ void HandleRestart() } ShowPage(page); + ShowWebSource(SRC_WEBGUI); restart_flag = 2; } @@ -1676,4 +1696,202 @@ boolean ValidIpAddress(String str) } return true; } + +/*********************************************************************************************/ + +String UrlEncode(const String& text) +{ + const char hex[] = "0123456789ABCDEF"; + + String encoded = ""; + int len = text.length(); + int i = 0; + while (i < len) { + char decodedChar = text.charAt(i++); + +/* + if (('a' <= decodedChar && decodedChar <= 'z') || + ('A' <= decodedChar && decodedChar <= 'Z') || + ('0' <= decodedChar && decodedChar <= '9') || + ('=' == decodedChar)) { + encoded += decodedChar; + } else { + encoded += '%'; + encoded += hex[decodedChar >> 4]; + encoded += hex[decodedChar & 0xF]; + } +*/ + if (' ' == decodedChar) { + encoded += '%'; + encoded += hex[decodedChar >> 4]; + encoded += hex[decodedChar & 0xF]; + } else { + encoded += decodedChar; + } + + } + return encoded; +} + +int WebSend(char *buffer) +{ + // http://192.168.178.86:80/cm?user=admin&password=joker&cmnd=POWER1 ON + // http://192.168.178.86:80/cm?cmnd=POWER1 ON + // [192.168.178.86:80,admin:joker] POWER1 ON + + char *host; + char *port; + char *user; + char *password; + char *command; + uint16_t nport = 80; + int status = 1; // Wrong parameters + + host = strtok_r(buffer, "]", &command); // buffer = [192.168.178.86:80,admin:joker] POWER1 ON + if (host && command) { + host = LTrim(host); + host++; // Skip [ + host = strtok_r(host, ",", &user); // host = 192.168.178.86:80,admin:joker > 192.168.178.86:80 + host = strtok_r(host, ":", &port); // host = 192.168.178.86:80 > 192.168.178.86 + if (user) { + user = strtok_r(user, ":", &password); // user = admin:joker > admin + } + +//snprintf_P(log_data, sizeof(log_data), PSTR("DBG: Buffer |%X|, Host |%X|, Port |%X|, User |%X|, Password |%X|, Command |%X|"), buffer, host, port, user, password, command); +//AddLog(LOG_LEVEL_DEBUG); + + if (port) { nport = atoi(port); } + + String nuri = ""; + if (user && password) { + nuri += F("user="); + nuri += user; + nuri += F("&password="); + nuri += password; + nuri += F("&"); + } + nuri += F("cmnd="); + nuri += LTrim(command); + String uri = UrlEncode(nuri); + + IPAddress host_ip; + if (WiFi.hostByName(host, host_ip)) { + WiFiClient client; + + bool connected = false; + byte retry = 2; + while ((retry > 0) && !connected) { + --retry; + connected = client.connect(host_ip, nport); + if (connected) break; + } + + if (connected) { + String url = F("GET /cm?"); + url += uri; + url += F(" HTTP/1.1\r\n Host: "); + url += IPAddress(host_ip).toString(); + if (port) { + url += F(" \r\n Port: "); + url += port; + } + url += F(" \r\n Connection: close\r\n\r\n"); + +//snprintf_P(log_data, sizeof(log_data), PSTR("DBG: Url |%s|"), url.c_str()); +//AddLog(LOG_LEVEL_DEBUG); + + client.print(url.c_str()); + client.flush(); + client.stop(); + status = 0; // No error - Done + } else { + status = 2; // Connection failed + } + } else { + status = 3; // Host not found + } + } + return status; +} + +/*********************************************************************************************/ + +enum WebCommands { CMND_WEBSERVER, CMND_WEBPASSWORD, CMND_WEBLOG, CMND_WEBSEND, CMND_EMULATION }; +const char kWebCommands[] PROGMEM = D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_WEBSEND "|" D_CMND_EMULATION ; +const char kWebSendStatus[] PROGMEM = D_JSON_DONE "|" D_JSON_WRONG_PARAMETERS "|" D_JSON_CONNECT_FAILED "|" D_JSON_HOST_NOT_FOUND ; + +bool WebCommand() +{ + char command[CMDSZ]; + bool serviced = true; + + int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kWebCommands); + if (-1 == command_code) { + serviced = false; // Unknown command + } + if (CMND_WEBSERVER == command_code) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) { Settings.webserver = XdrvMailbox.payload; } + if (Settings.webserver) { + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WEBSERVER "\":\"" D_JSON_ACTIVE_FOR " %s " D_JSON_ON_DEVICE " %s " D_JSON_WITH_IP_ADDRESS " %s\"}"), + (2 == Settings.webserver) ? D_ADMIN : D_USER, my_hostname, WiFi.localIP().toString().c_str()); + } else { + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText(0)); + } + } + else if (CMND_WEBPASSWORD == command_code) { + if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.web_password))) { + strlcpy(Settings.web_password, (!strcmp(XdrvMailbox.data,"0")) ? "" : (1 == XdrvMailbox.payload) ? WEB_PASSWORD : XdrvMailbox.data, sizeof(Settings.web_password)); + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.web_password); + } else { + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_ASTERIX, command); + } + } + else if (CMND_WEBLOG == command_code) { + if ((XdrvMailbox.payload >= LOG_LEVEL_NONE) && (XdrvMailbox.payload <= LOG_LEVEL_ALL)) { Settings.weblog_level = XdrvMailbox.payload; } + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.weblog_level); + } + else if (CMND_WEBSEND == command_code) { + if (XdrvMailbox.data_len > 0) { + uint8_t result = WebSend(XdrvMailbox.data); + char stemp1[20]; + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetTextIndexed(stemp1, sizeof(stemp1), result, kWebSendStatus)); + } + } +#ifdef USE_EMULATION + else if (CMND_EMULATION == command_code) { + if ((XdrvMailbox.payload >= EMUL_NONE) && (XdrvMailbox.payload < EMUL_MAX)) { + Settings.flag2.emulation = XdrvMailbox.payload; + restart_flag = 2; + } + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.flag2.emulation); + } +#endif // USE_EMULATION + else serviced = false; // Unknown command + + return serviced; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +#define XDRV_02 + +boolean Xdrv02(byte function) +{ + boolean result = false; + + switch (function) { + case FUNC_LOOP: + PollDnsWebserver(); +#ifdef USE_EMULATION + if (Settings.flag2.emulation) PollUdp(); +#endif // USE_EMULATION + break; + case FUNC_COMMAND: + result = WebCommand(); + break; + } + return result; +} #endif // USE_WEBSERVER diff --git a/sonoff/xdrv_03_energy.ino b/sonoff/xdrv_03_energy.ino index b3d717d65..10b8f1c95 100644 --- a/sonoff/xdrv_03_energy.ino +++ b/sonoff/xdrv_03_energy.ino @@ -371,7 +371,12 @@ bool CseSerialInput() return 1; } } else { - if (0x5A == serial_in_byte) { // 0x5A - Packet header 2 + if ((0x5A == serial_in_byte) && (serial_in_byte_counter)) { // 0x5A - Packet header 2 + if (serial_in_byte_counter > 1) { // Sync buffer with data (issue #1907) + serial_in_buffer[0] = serial_in_buffer[--serial_in_byte_counter]; + serial_in_byte_counter = 1; + AddLog_P(LOG_LEVEL_DEBUG, PSTR("CSE: Fixed out-of-sync")); + } cse_receive_flag = 1; } else { serial_in_byte_counter = 0; @@ -721,7 +726,7 @@ void EnergyMarginCheck() snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_MAXPOWERREACHED "\":\"%d%s\"}"), energy_power_u, (Settings.flag.value_units) ? " " D_UNIT_WATT : ""); MqttPublishPrefixTopic_P(STAT, S_RSLT_WARNING); EnergyMqttShow(); - ExecuteCommandPower(1, POWER_OFF); + ExecuteCommandPower(1, POWER_OFF, SRC_MAXPOWER); if (!energy_mplr_counter) { energy_mplr_counter = Settings.param[P_MAX_POWER_RETRY] +1; } @@ -743,7 +748,7 @@ void EnergyMarginCheck() if (energy_mplr_counter) { snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_POWERMONITOR "\":\"%s\"}"), GetStateText(1)); MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR)); - ExecuteCommandPower(1, POWER_ON); + ExecuteCommandPower(1, POWER_ON, SRC_MAXPOWER); } else { snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_MAXPOWERREACHEDRETRY "\":\"%s\"}"), GetStateText(0)); MqttPublishPrefixTopic_P(STAT, S_RSLT_WARNING); @@ -761,7 +766,7 @@ void EnergyMarginCheck() energy_max_energy_state = 1; snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_ENERGYMONITOR "\":\"%s\"}"), GetStateText(1)); MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_JSON_ENERGYMONITOR)); - ExecuteCommandPower(1, POWER_ON); + ExecuteCommandPower(1, POWER_ON, SRC_MAXENERGY); } else if ((1 == energy_max_energy_state) && (energy_daily_u >= Settings.energy_max_energy)) { energy_max_energy_state = 2; @@ -769,7 +774,7 @@ void EnergyMarginCheck() snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_MAXENERGYREACHED "\":\"%s%s\"}"), mqtt_data, (Settings.flag.value_units) ? " " D_UNIT_KILOWATTHOUR : ""); MqttPublishPrefixTopic_P(STAT, S_RSLT_WARNING); EnergyMqttShow(); - ExecuteCommandPower(1, POWER_OFF); + ExecuteCommandPower(1, POWER_OFF, SRC_MAXENERGY); } } #endif // FEATURE_POWER_LIMIT diff --git a/sonoff/xdrv_01_light.ino b/sonoff/xdrv_04_light.ino similarity index 99% rename from sonoff/xdrv_01_light.ino rename to sonoff/xdrv_04_light.ino index 6ea7ca7e9..34a1a9861 100644 --- a/sonoff/xdrv_01_light.ino +++ b/sonoff/xdrv_04_light.ino @@ -1,5 +1,5 @@ /* - xdrv_01_light.ino - PWM, WS2812 and sonoff led support for Sonoff-Tasmota + xdrv_04_light.ino - PWM, WS2812 and sonoff led support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -230,7 +230,7 @@ void AriluxRfHandler() } } if (strlen(command)) { - ExecuteCommand(command); + ExecuteCommand(command, SRC_LIGHT); } } } @@ -529,7 +529,7 @@ char* LightGetColor(uint8_t type, char* scolor) void LightPowerOn() { if (Settings.light_dimmer && !(light_power)) { - ExecuteCommandPower(light_device, POWER_ON); + ExecuteCommandPower(light_device, POWER_ON, SRC_LIGHT); } } @@ -585,11 +585,11 @@ void LightPreparePower() { if (Settings.light_dimmer && !(light_power)) { if (!Settings.flag.not_power_linked) { - ExecuteCommandPower(light_device, POWER_ON_NO_STATE); + ExecuteCommandPower(light_device, POWER_ON_NO_STATE, SRC_LIGHT); } } else if (!Settings.light_dimmer && light_power) { - ExecuteCommandPower(light_device, POWER_OFF_NO_STATE); + ExecuteCommandPower(light_device, POWER_OFF_NO_STATE, SRC_LIGHT); } #ifdef USE_DOMOTICZ DomoticzUpdatePowerState(light_device); @@ -1279,7 +1279,7 @@ boolean LightCommand() if (coldim) { LightPreparePower(); } - + return serviced; } @@ -1287,9 +1287,9 @@ boolean LightCommand() * Interface \*********************************************************************************************/ -#define XDRV_01 +#define XDRV_04 -boolean Xdrv01(byte function) +boolean Xdrv04(byte function) { boolean result = false; diff --git a/sonoff/xdrv_02_irremote.ino b/sonoff/xdrv_05_irremote.ino similarity index 99% rename from sonoff/xdrv_02_irremote.ino rename to sonoff/xdrv_05_irremote.ino index eed1fd228..df2828fb9 100644 --- a/sonoff/xdrv_02_irremote.ino +++ b/sonoff/xdrv_05_irremote.ino @@ -1,5 +1,5 @@ /* - xdrv_02_irremote.ino - infra red support for Sonoff-Tasmota + xdrv_05_irremote.ino - infra red support for Sonoff-Tasmota Copyright (C) 2018 Heiko Krupp, Lazar Obradovic and Theo Arends @@ -393,9 +393,9 @@ boolean IrSendCommand() * Interface \*********************************************************************************************/ -#define XDRV_02 +#define XDRV_05 -boolean Xdrv02(byte function) +boolean Xdrv05(byte function) { boolean result = false; diff --git a/sonoff/xdrv_04_snfbridge.ino b/sonoff/xdrv_06_snfbridge.ino similarity index 99% rename from sonoff/xdrv_04_snfbridge.ino rename to sonoff/xdrv_06_snfbridge.ino index 8aa300f5d..4149ae2a9 100644 --- a/sonoff/xdrv_04_snfbridge.ino +++ b/sonoff/xdrv_06_snfbridge.ino @@ -1,5 +1,5 @@ /* - xdrv_04_snfbridge.ino - sonoff RF bridge 433 support for Sonoff-Tasmota + xdrv_06_snfbridge.ino - sonoff RF bridge 433 support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -295,7 +295,7 @@ boolean SonoffBridgeCommand() snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, sonoff_bridge_learn_key, D_JSON_LEARNING_ACTIVE); } } else serviced = false; // Unknown command - + return serviced; } @@ -303,9 +303,9 @@ boolean SonoffBridgeCommand() * Interface \*********************************************************************************************/ -#define XDRV_04 +#define XDRV_06 -boolean Xdrv04(byte function) +boolean Xdrv06(byte function) { boolean result = false; diff --git a/sonoff/xdrv_05_domoticz.ino b/sonoff/xdrv_07_domoticz.ino similarity index 99% rename from sonoff/xdrv_05_domoticz.ino rename to sonoff/xdrv_07_domoticz.ino index bf9ae023e..f2b972326 100644 --- a/sonoff/xdrv_05_domoticz.ino +++ b/sonoff/xdrv_07_domoticz.ino @@ -1,5 +1,5 @@ /* - xdrv_05_domoticz.ino - domoticz support for Sonoff-Tasmota + xdrv_07_domoticz.ino - domoticz support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -265,7 +265,7 @@ boolean DomoticzCommand() else serviced = false; // Unknown command } else serviced = false; // Unknown command - + return serviced; } @@ -437,9 +437,9 @@ void DomoticzSaveSettings() * Interface \*********************************************************************************************/ -#define XDRV_05 +#define XDRV_07 -boolean Xdrv05(byte function) +boolean Xdrv07(byte function) { boolean result = false; diff --git a/sonoff/xdrv_09_timers.ino b/sonoff/xdrv_09_timers.ino index bc517ae1a..e19be6fff 100644 --- a/sonoff/xdrv_09_timers.ino +++ b/sonoff/xdrv_09_timers.ino @@ -290,7 +290,7 @@ void TimerEverySecond() XdrvRulesProcess(); } else #endif // USE_RULES - if (devices_present) { ExecuteCommandPower(xtimer.device +1, xtimer.power); } + if (devices_present) { ExecuteCommandPower(xtimer.device +1, xtimer.power, SRC_TIMER); } } } } diff --git a/sonoff/xdrv_10_rules.ino b/sonoff/xdrv_10_rules.ino index abaf700a2..b33872b7e 100644 --- a/sonoff/xdrv_10_rules.ino +++ b/sonoff/xdrv_10_rules.ino @@ -90,6 +90,7 @@ uint32_t rules_triggers[MAX_RULE_SETS] = { 0 }; uint8_t rules_trigger_count[MAX_RULE_SETS] = { 0 }; uint8_t rules_teleperiod = 0; +char event_data[100]; char vars[RULES_MAX_VARS][10] = { 0 }; /*******************************************************************************************/ @@ -324,7 +325,7 @@ bool RuleSetProcess(byte rule_set, String &event_saved) // snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, D_CMND_RULE, D_JSON_INITIATED); // MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_CMND_RULE)); - ExecuteCommand(command); + ExecuteCommand(command, SRC_RULE); serviced = true; } rules_trigger_count[rule_set]++; @@ -374,7 +375,26 @@ void RulesEvery50ms() } } rules_old_power = rules_new_power; - } else { + } + else if(event_data[0]) { + char *event; + char *parameter; + event = strtok_r(event_data, "=", ¶meter); // event_data = fanspeed=10 + if (event) { + event = Trim(event); + if (parameter) { + parameter = Trim(parameter); + } else { + parameter = event + strlen(event); // '\0' + } + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"Event\":{\"%s\":\"%s\"}}"), event, parameter); + event_data[0] ='\0'; + RulesProcess(); + } else { + event_data[0] ='\0'; + } + } + else { rules_quota++; if (rules_quota &1) { // Every 100 ms mqtt_data[0] = '\0'; @@ -464,17 +484,7 @@ boolean RulesCommand() } else if (CMND_EVENT == command_code) { if (XdrvMailbox.data_len > 0) { - String event = XdrvMailbox.data; - String parameter = ""; - int pos = event.indexOf('='); - if (pos > 0) { - parameter = event.substring(pos +1); - parameter.trim(); - event = event.substring(0, pos); - } - event.trim(); - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"Event\":{\"%s\":\"%s\"}}"), event.c_str(), parameter.c_str()); - RulesProcess(); + strlcpy(event_data, XdrvMailbox.data, sizeof(event_data)); } snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_DONE); } diff --git a/sonoff/xdrv_11_knx.ino b/sonoff/xdrv_11_knx.ino index dfbdbb33b..1dc9fcd44 100644 --- a/sonoff/xdrv_11_knx.ino +++ b/sonoff/xdrv_11_knx.ino @@ -115,6 +115,11 @@ device_parameters_t device_param[] = { { KNX_ENERGY_DAILY , false, false, KNX_Empty }, { KNX_ENERGY_START , false, false, KNX_Empty }, { KNX_ENERGY_TOTAL , false, false, KNX_Empty }, + { KNX_SLOT1 , false, false, KNX_Empty }, + { KNX_SLOT2 , false, false, KNX_Empty }, + { KNX_SLOT3 , false, false, KNX_Empty }, + { KNX_SLOT4 , false, false, KNX_Empty }, + { KNX_SLOT5 , false, false, KNX_Empty }, { KNX_Empty, false, false, KNX_Empty} }; @@ -145,6 +150,11 @@ const char * device_param_ga[] = { D_ENERGY_TODAY , D_ENERGY_YESTERDAY , D_ENERGY_TOTAL , + D_KNX_TX_SLOT " 1", + D_KNX_TX_SLOT " 2", + D_KNX_TX_SLOT " 3", + D_KNX_TX_SLOT " 4", + D_KNX_TX_SLOT " 5", nullptr }; @@ -175,9 +185,20 @@ const char *device_param_cb[] = { D_REPLY " " D_ENERGY_TODAY , D_REPLY " " D_ENERGY_YESTERDAY , D_REPLY " " D_ENERGY_TOTAL , + D_KNX_RX_SLOT " 1", + D_KNX_RX_SLOT " 2", + D_KNX_RX_SLOT " 3", + D_KNX_RX_SLOT " 4", + D_KNX_RX_SLOT " 5", nullptr }; +// Commands +#define D_CMND_KNXTXCMND "KnxTx_Cmnd" +#define D_CMND_KNXTXVAL "KnxTx_Val" +enum KnxCommands { CMND_KNXTXCMND, CMND_KNXTXVAL }; +const char kKnxCommands[] PROGMEM = D_CMND_KNXTXCMND "|" D_CMND_KNXTXVAL ; + byte KNX_GA_Search( byte param, byte start = 0 ) { @@ -377,12 +398,20 @@ bool KNX_CONFIG_NOT_MATCH() { if ( !device_param[i].show ) { // device has this parameter ? // if not, search for all registered group address to this parameter for deletion + + // Checks all GA if ( KNX_GA_Search(i+1) != KNX_Empty ) { return true; } - if ( (i < 8) || (i > 15) ) // check relays and sensors (i from 8 to 16 are toggle relays parameters) + + // Check all CB + if ( i < 8 ) // check relays (i from 8 to 15 are toggle relays parameters) { if ( KNX_CB_Search(i+1) != KNX_Empty ) { return true; } if ( KNX_CB_Search(i+9) != KNX_Empty ) { return true; } } + if ( i > 15 ) // check sensors and others + { + if ( KNX_CB_Search(i+1) != KNX_Empty ) { return true; } + } } } return false; @@ -448,6 +477,14 @@ void KNX_INIT() device_param[KNX_ENERGY_POWERFACTOR-1].show = true; } +#ifdef USE_RULES + device_param[KNX_SLOT1-1].show = true; + device_param[KNX_SLOT2-1].show = true; + device_param[KNX_SLOT3-1].show = true; + device_param[KNX_SLOT4-1].show = true; + device_param[KNX_SLOT5-1].show = true; +#endif + // Delete from KNX settings all configuration is not anymore related to this device if (KNX_CONFIG_NOT_MATCH()) { Settings.knx_GA_registered = 0; @@ -494,18 +531,32 @@ void KNX_CB_Action(message_t const &msg, void *arg) case KNX_CT_WRITE: if (chan->type < 9) // Set Relays { - ExecuteCommandPower(chan->type, msg.data[0]); + ExecuteCommandPower(chan->type, msg.data[0], SRC_KNX); } else if (chan->type < 17) // Toggle Relays { if (!toggle_inhibit) { - ExecuteCommandPower((chan->type) -8, 2); + ExecuteCommandPower((chan->type) -8, 2, SRC_KNX); if (Settings.flag.knx_enable_enhancement) { toggle_inhibit = TOGGLE_INHIBIT_TIME; } } } +#ifdef USE_RULES + else if ((chan->type >= KNX_SLOT1) && (chan->type <= KNX_SLOT5)) // KNX RX SLOTs (write command) + { + if (!toggle_inhibit) { + char command[25]; + snprintf_P(command, sizeof(command), PSTR("event KNXRX_VAL%d=%d"), ((chan->type) - KNX_SLOT1 + 1 ), msg.data[0]); + ExecuteCommand(command, SRC_KNX); + if (Settings.flag.knx_enable_enhancement) { + toggle_inhibit = TOGGLE_INHIBIT_TIME; + } + } + } +#endif break; + case KNX_CT_READ: if (chan->type < 9) // reply Relays status { @@ -531,6 +582,19 @@ void KNX_CB_Action(message_t const &msg, void *arg) knx.answer_2byte_float(msg.received_on, last_hum); } } +#ifdef USE_RULES + else if ((chan->type >= KNX_SLOT1) && (chan->type <= KNX_SLOT5)) // KNX RX SLOTs (read command) + { + if (!toggle_inhibit) { + char command[25]; + snprintf_P(command, sizeof(command), PSTR("event KNXRX_REQ%d"), ((chan->type) - KNX_SLOT1 + 1 ) ); + ExecuteCommand(command, SRC_KNX); + if (Settings.flag.knx_enable_enhancement) { + toggle_inhibit = TOGGLE_INHIBIT_TIME; + } + } + } +#endif break; } } @@ -939,6 +1003,71 @@ void KNX_Save_Settings() #endif // USE_WEBSERVER +boolean KnxCommand() +{ + char command[CMDSZ]; + uint8_t index = XdrvMailbox.index; + int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kKnxCommands); + + if (!(Settings.flag.knx_enabled)) { return false; } + + if (-1 == command_code) { return false; } // Unknown command + + else if ((CMND_KNXTXCMND == command_code) && (index > 0) && (index <= MAX_KNXTX_CMNDS) && (XdrvMailbox.data_len > 0)) { + // index <- KNX SLOT to use + // XdrvMailbox.payload <- data to send + + // Search all the registered GA that has that output (variable: KNX SLOTx) as parameter + byte i = KNX_GA_Search(index + KNX_SLOT1 -1); + while ( i != KNX_Empty ) { + KNX_addr.value = Settings.knx_GA_addr[i]; + knx.write_1bit(KNX_addr, !(XdrvMailbox.payload == 0)); + if (Settings.flag.knx_enable_enhancement) { + knx.write_1bit(KNX_addr, !(XdrvMailbox.payload == 0)); + knx.write_1bit(KNX_addr, !(XdrvMailbox.payload == 0)); + } + + snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_KNX "%s = %d " D_SENT_TO " %d.%d.%d"), + device_param_ga[index + KNX_SLOT1 -2], !(XdrvMailbox.payload == 0), + KNX_addr.ga.area, KNX_addr.ga.line, KNX_addr.ga.member); + AddLog(LOG_LEVEL_INFO); + + i = KNX_GA_Search(index + KNX_SLOT1 -1, i + 1); + } + } + + else if ((CMND_KNXTXVAL == command_code) && (index > 0) && (index <= MAX_KNXTX_CMNDS) && (XdrvMailbox.data_len > 0)) { + // index <- KNX SLOT to use + // XdrvMailbox.payload <- data to send + + // Search all the registered GA that has that output (variable: KNX SLOTx) as parameter + byte i = KNX_GA_Search(index + KNX_SLOT1 -1); + while ( i != KNX_Empty ) { + KNX_addr.value = Settings.knx_GA_addr[i]; + knx.write_2byte_float(KNX_addr, XdrvMailbox.payload); + if (Settings.flag.knx_enable_enhancement) { + knx.write_2byte_float(KNX_addr, XdrvMailbox.payload); + knx.write_2byte_float(KNX_addr, XdrvMailbox.payload); + } + + snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_KNX "%s = %d " D_SENT_TO " %d.%d.%d"), + device_param_ga[index + KNX_SLOT1 -2], XdrvMailbox.payload, + KNX_addr.ga.area, KNX_addr.ga.line, KNX_addr.ga.member); + AddLog(LOG_LEVEL_INFO); + + i = KNX_GA_Search(index + KNX_SLOT1 -1, i + 1); + } + } + + else { return false; } // Incomplete command + + snprintf_P (mqtt_data, sizeof(mqtt_data), PSTR("{\"%s%d\":\"%d\"}"), + command, index, XdrvMailbox.payload ); + + return true; +} + + /*********************************************************************************************\ * Interface \*********************************************************************************************/ @@ -960,9 +1089,9 @@ boolean Xdrv11(byte function) toggle_inhibit--; } break; -// case FUNC_COMMAND: -// result = KNXCommand(); -// break; + case FUNC_COMMAND: + result = KnxCommand(); + break; // case FUNC_SET_POWER: // break; } diff --git a/sonoff/xdrv_07_home_assistant.ino b/sonoff/xdrv_12_home_assistant.ino similarity index 98% rename from sonoff/xdrv_07_home_assistant.ino rename to sonoff/xdrv_12_home_assistant.ino index 657f8d5b7..ee008280b 100644 --- a/sonoff/xdrv_07_home_assistant.ino +++ b/sonoff/xdrv_12_home_assistant.ino @@ -1,5 +1,5 @@ /* - xdrv_07_home_assistant.ino - home assistant support for Sonoff-Tasmota + xdrv_12_home_assistant.ino - home assistant support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -208,9 +208,9 @@ void HAssDiscovery(uint8_t mode) * Interface \*********************************************************************************************/ -#define XDRV_07 +#define XDRV_12 -boolean Xdrv07(byte function) +boolean Xdrv12(byte function) { boolean result = false; diff --git a/sonoff/xdrv_interface.ino b/sonoff/xdrv_interface.ino index d075f3136..1897cec5f 100644 --- a/sonoff/xdrv_interface.ino +++ b/sonoff/xdrv_interface.ino @@ -18,10 +18,6 @@ */ boolean (* const xdrv_func_ptr[])(byte) PROGMEM = { // Driver Function Pointers -#ifdef XDRV_00 - &Xdrv00, -#endif - #ifdef XDRV_01 &Xdrv01, #endif diff --git a/sonoff/xplg_wemohue.ino b/sonoff/xplg_wemohue.ino index aba8827b0..9a7cdeec7 100644 --- a/sonoff/xplg_wemohue.ino +++ b/sonoff/xplg_wemohue.ino @@ -387,10 +387,10 @@ void HandleUpnpEvent() //differentiate get and set state if (request.indexOf(F("SetBinaryState")) > 0) { if (request.indexOf(F("State>1 0) { - ExecuteCommandPower(devices_present, POWER_ON); + ExecuteCommandPower(devices_present, POWER_ON, SRC_WEMO); } else if (request.indexOf(F("State>0 0) { - ExecuteCommandPower(devices_present, POWER_OFF); + ExecuteCommandPower(devices_present, POWER_OFF, SRC_WEMO); } } else if(request.indexOf(F("GetBinaryState")) > 0){ @@ -660,10 +660,10 @@ void HueLights(String *path) on = hue_json["on"]; switch(on) { - case false : ExecuteCommandPower(device, POWER_OFF); + case false : ExecuteCommandPower(device, POWER_OFF, SRC_HUE); response.replace("{re", "false"); break; - case true : ExecuteCommandPower(device, POWER_ON); + case true : ExecuteCommandPower(device, POWER_ON, SRC_HUE); response.replace("{re", "true"); break; default : response.replace("{re", (power & (1 << (device-1))) ? "true" : "false"); diff --git a/sonoff/xsns_21_sgp30.ino b/sonoff/xsns_21_sgp30.ino index d30281155..5fef47bfd 100644 --- a/sonoff/xsns_21_sgp30.ino +++ b/sonoff/xsns_21_sgp30.ino @@ -76,8 +76,8 @@ void Sgp30Show(boolean json) #ifdef USE_DOMOTICZ if (0 == tele_period) DomoticzSensor(DZ_AIRQUALITY, sgp.eCO2); #endif // USE_DOMOTICZ - } else { #ifdef USE_WEBSERVER + } else { snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SGP30, mqtt_data, sgp.eCO2, sgp.TVOC); #endif } diff --git a/sonoff/xsns_23_sdm120.ino b/sonoff/xsns_23_sdm120.ino index 937efc89e..5966f9cd3 100644 --- a/sonoff/xsns_23_sdm120.ino +++ b/sonoff/xsns_23_sdm120.ino @@ -262,8 +262,8 @@ void SDM120Show(boolean json) #ifdef USE_WEBSERVER } else { 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 + } } /*********************************************************************************************\ diff --git a/sonoff/xsns_24_si1145.ino b/sonoff/xsns_24_si1145.ino index 5ddd713d8..95ad930af 100644 --- a/sonoff/xsns_24_si1145.ino +++ b/sonoff/xsns_24_si1145.ino @@ -335,8 +335,8 @@ void Si1145Show(boolean json) #ifdef USE_DOMOTICZ if (0 == tele_period) DomoticzSensor(DZ_ILLUMINANCE, visible); #endif // USE_DOMOTICZ - } else { #ifdef USE_WEBSERVER + } else { snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SI1145, mqtt_data, visible, infrared, uvindex /100, uvindex %100); #endif } diff --git a/sonoff/xsns_25_sdm630.ino b/sonoff/xsns_25_sdm630.ino index 40dc8d0f9..193c3a936 100644 --- a/sonoff/xsns_25_sdm630.ino +++ b/sonoff/xsns_25_sdm630.ino @@ -317,8 +317,8 @@ void SDM630Show(boolean json) active_power_l1, active_power_l2, active_power_l3, reactive_power_l1, reactive_power_l2, reactive_power_l3, power_factor_l1, power_factor_l2, power_factor_l3, energy_total); - } #endif // USE_WEBSERVER + } } /*********************************************************************************************\