diff --git a/README.md b/README.md index e8ab14f11..fca1f5af6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Sonoff-Tasmota Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. -Current version is **5.6.1h** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. +Current version is **5.6.1i** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. ### ATTENTION All versions @@ -55,5 +55,5 @@ The following devices are supported: - [iTead Motor Clockwise/Anticlockwise](https://www.itead.cc/smart-home/motor-reversing-wifi-wireless-switch.html) - [Electrodragon IoT Relay Board](http://www.electrodragon.com/product/wifi-iot-relay-board-based-esp8266/) - - + + diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index b2a269e77..669d4e3c5 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,8 @@ -/* 5.6.1h +/* 5.6.1i + * Add basic internationalization and localization (#763) + * Fix invalid JSON (#822) + * + * 5.6.1h * Add PulseTime to power check at startup (#526) * * 5.6.1g @@ -80,7 +84,7 @@ * Fix button 1 double press behaviour on multi relay devices * Add support for Hua Fan Smart Socket (#479) * Add support for Sonoff 4ch Pro (#565) - * Add command SetOption13 1 to allow immediate action on single button press + * Add command SetOption13 1 to allow immediate action on single button press * (disables multipress, hold and unrestricted commands) (#587) * * 5.3.0 20170715 @@ -111,7 +115,7 @@ * * 5.2.1 20170622 * Fix Restore Configuration in case of lower version - * Revert auto configuration upgrade allowing easy upgrade which was removed in version 5.2.0 + * Revert auto configuration upgrade allowing easy upgrade which was removed in version 5.2.0 * Fix config auto upgrade from versions below version 4.1.1 (#530) * * 5.2.0 20170619 @@ -180,7 +184,7 @@ * Add command MqttRetry to change default MQTT reconnect retry timer from minimal 10 seconds (#429) * * 5.0.5 20170508 - * Add command FullTopic with tokens %topic% (replaced by command Topic value) and + * Add command FullTopic with tokens %topic% (replaced by command Topic value) and * %prefix% (replaced by command Prefix values) for more flexible topic definitions (#244) * See wiki > MQTT Features https://github.com/arendst/Sonoff-Tasmota/wiki/MQTT-Features for more information * @@ -255,7 +259,7 @@ * Remove restart after IPAddress changes (#292) * Add support for MAX31850 in xsns_ds18x20.ino (#295) * Fix possible uptime update misses (#302) - * + * * 4.1.0 20170325 * Change static IP addresses in user_config.h from list (using commas) to string (using dots) * Unify display result of commands Modules, Module and Gpios @@ -354,7 +358,7 @@ * 3.9.20 20170221 * Add minimal basic authentication to Web Admin mode (#87) * Fix Hue and add HSB support (#89) - * + * * 3.9.19 20170219 * Sonoff Led: Made GPIO04, 05 and 15 available for user * Sonoff Led: Add commands Fade, Speed, WakupDuration, Wakeup and LedTable @@ -364,7 +368,7 @@ * Fix Sonoff Led dimmer range (#16) * Change Sonoff Led command Dimmer to act on both cold and warm color * Add Sonoff Led command Color CCWW where CCWW are hexadecimal values fro 00 - FF - * Reduce Sonoff Led flickering by disabling interrupts during flash save and disabling + * Reduce Sonoff Led flickering by disabling interrupts during flash save and disabling * Led during OTA upgrade and Web upload (#16) * * 3.9.17 20170217 @@ -435,7 +439,7 @@ * * 3.9.3 20170127 * Add confirmation before Restart via webpage - * Expand Domoticz Configuration webpage with Key, Switch and Sensor Index and + * Expand Domoticz Configuration webpage with Key, Switch and Sensor Index and * add commands DomoticzSwitchIdx and DomoticzSensorIdx (#86) (#174) (#219) * Fix default DHT11 sensor driver selection * Fix LedPower status after button press (#279) @@ -498,7 +502,7 @@ * Add friendlyname to webpage replacing former hostname * * 3.1.15 20170108 - * Fix Domoticz send key regression with Toggle command + * Fix Domoticz send key regression with Toggle command * * 3.1.14 20170107 * Add support for command TOGGLE (define MQTT_CMND_TOGGLE) when ButtonTopic is in use and not equal to Topic (#207) diff --git a/sonoff/i18n.h b/sonoff/i18n.h new file mode 100644 index 000000000..6685662d0 --- /dev/null +++ b/sonoff/i18n.h @@ -0,0 +1,80 @@ +/* + i18n.h - internationalization for Sonoff-Tasmota + + Copyright (C) 2017 Theo Arends + + 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 + #define LANGUAGE "language\en-GB.h" +#endif +#include LANGUAGE + +// Common + +const char S_LOG_HTTP[] PROGMEM = D_LOG_HTTP; +const char S_LOG_WIFI[] PROGMEM = D_LOG_WIFI; +const char S_LOG_MQTT[] PROGMEM = D_LOG_MQTT; + +const char S_RSLT_POWER[] PROGMEM = D_RSLT_POWER; +const char S_RSLT_RESULT[] PROGMEM = D_RSLT_RESULT; +const char S_RSLT_WARNING[] PROGMEM = D_RSLT_WARNING; + +const char S_LWT[] PROGMEM = D_LWT; +const char S_OFFLINE[] PROGMEM = D_OFFLINE; + +// sonoff.ino + +#define MAX_BUTTON_COMMANDS 5 // Max number of button commands supported +const char commands[MAX_BUTTON_COMMANDS][14] PROGMEM = { + D_CMND_WIFICONFIG " 1", // Press button three times + D_CMND_WIFICONFIG " 2", // Press button four times + D_CMND_WIFICONFIG " 3", // Press button five times + D_CMND_RESTART " 1", // Press button six times + D_CMND_UPGRADE " 1" }; // Press button seven times +const char wificfg[5][WCFG_MAX_STRING_LENGTH] PROGMEM = { + D_WCFG_0_RESTART, + D_WCFG_1_SMARTCONFIG, + D_WCFG_2_WIFIMANAGER, + D_WCFG_3_WPSCONFIG, + D_WCFG_4_RETRY }; +const char PREFIXES[3][PRFX_MAX_STRING_LENGTH] PROGMEM = { + D_CMND, + D_STAT, + D_TELE }; + +const char JSON_SNS_TEMPHUM[] PROGMEM = + "%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s}"; + +// support.ino + +static const char monthNames[] = D_MONTH3LIST; + +// webserver.ino +const char S_MAIN_MENU[] PROGMEM = D_MAIN_MENU; +const char S_CONFIGURATION[] PROGMEM = D_CONFIGURATION; +const char S_CONFIGURE_MODULE[] PROGMEM = D_CONFIGURE_MODULE; +const char S_CONFIGURE_WIFI[] PROGMEM = D_CONFIGURE_WIFI; +const char S_NO_NETWORKS_FOUND[] PROGMEM = D_NO_NETWORKS_FOUND; +const char S_CONFIGURE_MQTT[] PROGMEM = D_CONFIGURE_MQTT; +const char S_CONFIGURE_LOGGING[] PROGMEM = D_CONFIGURE_LOGGING; +const char S_CONFIGURE_OTHER[] PROGMEM = D_CONFIGURE_OTHER; +const char S_SAVE_CONFIGURATION[] PROGMEM = D_SAVE_CONFIGURATION; +const char S_RESET_CONFIGURATION[] PROGMEM = D_RESET_CONFIGURATION; +const char S_RESTORE_CONFIGURATION[] PROGMEM = D_RESTORE_CONFIGURATION; +const char S_FIRMWARE_UPGRADE[] PROGMEM = D_FIRMWARE_UPGRADE; +const char S_CONSOLE[] PROGMEM = D_CONSOLE; +const char S_INFORMATION[] PROGMEM = D_INFORMATION; +const char S_RESTART[] PROGMEM = D_RESTART; diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h new file mode 100644 index 000000000..dedb22a3b --- /dev/null +++ b/sonoff/language/en-GB.h @@ -0,0 +1,665 @@ +/* + en-GB.h - localization for English - United Kingdom for Sonoff-Tasmota + + Copyright (C) 2017 Theo Arends + + 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 . +*/ + +/*************************** ATTENTION *******************************\ + * + * Due to memory constraints only UTF-8 is supported. + * 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. + * +\*********************************************************************/ + +// "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 "SunMonTueWedThuFriSat" +#define D_MONTH3LIST "JanFebMarAprMayJunJulAugSepOctNovDec" + +// Non JSON decimal separator +#define D_DECIMAL_SEPARATOR "." + +// Common +#define D_ABORTED "Aborted" +#define D_ACTIVE "Active" +#define D_ADDRESS "Address" +#define D_ADMIN "Admin" +#define D_AIR_QUALITY "Air quality" +#define D_AIRQUALITY "AirQuality" +#define D_AP "AP" // Access Point +#define D_APMAC_ADDRESS "APMac" +#define D_APPENDED "Appended" +#define D_AS "as" +#define D_AUTO "AUTO" +#define D_BAUDRATE "Baudrate" +#define D_BLINK "Blink" +#define D_BLINKOFF "BlinkOff" +#define D_BOOTVERSION "Boot" +#define D_BOOT_COUNT "Boot Count" +#define D_BOOTCOUNT "BootCount" +#define D_BRIGHTLIGHT "Bright" +#define D_BUILDDATETIME "BuildDateTime" +#define D_BUTTON "Button" +#define D_CELSIUS "Celsius" +#define D_CODE "code" // Button code +#define D_COLDLIGHT "Cold" +#define D_COMMAND "Command" +#define D_CONNECTED "Connected" +#define D_COREVERSION "Core" +#define D_COUNT "Count" +#define D_COUNTER "Counter" +#define D_CURRENT "Current" // As in Voltage and Current +#define D_DATA "Data" +#define D_DARKLIGHT "Dark" +#define D_DEBUG "Debug" +#define D_DISABLED "Disabled" +#define D_DNS_SERVER "DNS Server" +#define D_DNSSERVER "DNSServer" +#define D_DONE "Done" +#define D_DST_TIME "DST" +#define D_EMPTY "Empty" +#define D_EMULATION "Emulation" +#define D_ENABLED "Enabled" +#define D_ENDDST "EndDST" // End Daylight Savings Time +#define D_ERASE "Erase" +#define D_ERROR "Error" +#define D_EVERY "Every" +#define D_FAHRENHEIT "Fahrenheit" +#define D_FAILED "Failed" +#define D_FALLBACK "Fallback" +#define D_FALLBACK_TOPIC "Fallback Topic" +#define D_FALLBACKTOPIC "FallbackTopic" +#define D_FALSE "False" +#define D_FILE "File" +#define D_FLASHMODE "FlashMode" +#define D_FLASHSIZE "FlashSize" +#define D_FREE_MEMORY "Free Memory" +#define D_FREEMEMORY "Free" +#define D_FROM "from" +#define D_GATEWAY "Gateway" +#define D_GROUP "Group" +#define D_HEAPSIZE "Heap" +#define D_HIGH "High" +#define D_HOST "Host" +#define D_HOSTNAME "Hostname" +#define D_HUMIDITY "Humidity" +#define D_ILLUMINANCE "Illuminance" +#define D_IMMEDIATE "immediate" // Button immediate +#define D_INDEX "Index" +#define D_INFO "Info" +#define D_INITIALIZED "Initialized" +#define D_IP_ADDRESS "IP Address" +#define D_LIGHT "Light" +#define D_LOCAL_TIME "Local" +#define D_LOW "Low" +#define D_LWT "LWT" +#define D_MAC "Mac" +#define D_MASK "Mask" +#define D_MODULE "Module" +#define D_MQTT "MQTT" +#define D_MULTI_PRESS "multi-press" +#define D_NO "No" +#define D_NOISE "Noise" +#define D_NONE "None" +#define D_OFF "Off" +#define D_OFFLINE "Offline" +#define D_OK "Ok" +#define D_ON "On" +#define D_ONLINE "Online" +#define D_OR "or" +#define D_PASSWORD "Password" +#define D_PERIOD "Period" +#define D_PORT "Port" +#define D_POWER_FACTOR "Power Factor" +#define D_POWERFACTOR "Factor" +#define D_POWERUSAGE "Power" +#define D_PRESSURE "Pressure" +#define D_PROGRAM_FLASH_SIZE "Program Flash Size" +#define D_PROGRAMFLASHSIZE "ProgramFlashSize" +#define D_PROGRAM_SIZE "Program Size" +#define D_PROGRAMSIZE "ProgramSize" +#define D_PROJECT "Project" +#define D_RECEIVED "Received" +#define D_RESTART "Restart" +#define D_RESTARTING "Restarting" +#define D_RESTART_REASON "Restart Reason" +#define D_RESTARTREASON "RestartReason" +#define D_RESTORE "restore" +#define D_RETAINED "retained" +#define D_SAVE "Save" +#define D_SAVEADDRESS "SaveAddress" +#define D_SAVECOUNT "SaveCount" +#define D_SAVESTATE "SaveState" +#define D_SDKVERSION "SDK" +#define D_SELECTED "selected" +#define D_SENSOR "Sensor" +#define D_SERIAL "Serial" +#define D_BYTES "Bytes" +#define D_SSID "SSId" +#define D_START "Start" +#define D_STARTED "Started" +#define D_STARTDST "StartDST" // Start Daylight Savings Time +#define D_STD_TIME "STD" +#define D_STOP "Stop" +#define D_SUBNET_MASK "Subnet Mask" +#define D_SUBNETMASK "Subnetmask" +#define D_SUCCESSFUL "Successful" +#define D_SWITCH "Switch" +#define D_SYNC "Sync" +#define D_SYS "Sys" // Sys log +#define D_TEMPERATURE "Temperature" +#define D_TEMPERATURE_UNIT "TempUnit" +#define D_TIME "Time" +#define D_TO "to" +#define D_TODAY "Today" +#define D_TOGGLE "Toggle" +#define D_TOPIC "Topic" +#define D_TOTAL "Total" +#define D_TRUE "True" +#define D_TYPE "Type" +#define D_UNKNOWN "Unknown" +#define D_UPGRADE "upgrade" +#define D_UPLOAD "Upload" +#define D_UPTIME "Uptime" +#define D_UTC_TIME "UTC" +#define D_USER "User" +#define D_VCC "Vcc" +#define D_VERSION "Version" +#define D_VOLTAGE "Voltage" +#define D_WARMLIGHT "Warm" +#define D_WEB "Web" // Web log +#define D_WEB_SERVER "Web Server" +#define D_WIFI "Wifi" +#define D_WRONG "Wrong" +#define D_YESTERDAY "Yesterday" + +// settings.ino +#define D_SAVED_TO_FLASH_AT "Saved to flash at" +#define D_LOADED_FROM_FLASH_AT "Loaded from flash at" +#define D_USE_DEFAULTS "Use defaults" +#define D_ERASED_SECTOR "Erased sector" + +// sonoff.ino +#define D_LEVEL_10 "level 1-0" +#define D_LEVEL_01 "level 0-1" +#define D_SERIAL_LOGGING_DISABLED "Serial logging disabled" +#define D_SYSLOG_LOGGING_REENABLED "Syslog logging re-enabled" + +#define D_SET_BAUDRATE_TO "Set Baudrate to" +#define D_RECEIVED_TOPIC "Received Topic" +#define D_DATA_SIZE "Data Size" +#define D_ANALOG_INPUT0 "Analog0" + +#define D_FINGERPRINT "Verify TLS fingerprint..." +#define D_TLS_CONNECT_FAILED_TO "TLS Connect failed to" +#define D_RETRY_IN "Retry in" +#define D_VERIFIED "Verified" +#define D_INSECURE "Insecure connection due to invalid Fingerprint" +#define D_CONNECT_FAILED_TO "Connect failed to" + +// support.ino +#define D_OSWATCH "osWatch" +#define D_BLOCKED_LOOP "Blocked Loop" +#define D_WPS_FAILED_WITH_STATUS "WPSconfig FAILED with status" +#define D_ACTIVE_FOR_1_MINUTE "active for 1 minute" +#define D_FAILED_TO_START "failed to start" +#define D_PATCH_ISSUE_2186 "Patch issue 2186" +#define D_CONNECTING_TO_AP "Connecting to AP" +#define D_IN_MODE "in mode" +#define D_CONNECT_FAILED_NO_IP_ADDRESS "Connect failed as no IP address received" +#define D_CONNECT_FAILED_AP_NOT_REACHED "Connect failed as AP cannot be reached" +#define D_CONNECT_FAILED_WRONG_PASSWORD "Connect failed with AP incorrect password" +#define D_CONNECT_FAILED_AP_TIMEOUT "Connect failed with AP timeout" +#define D_ATTEMPTING_CONNECTION "Attempting connection..." +#define D_CHECKING_CONNECTION "Checking connection..." +#define D_QUERY_DONE "Query done. MQTT services found" +#define D_MQTT_SERVICE_FOUND "MQTT service found on" +#define D_I2CSCAN_DEVICES_FOUND_AT "Device(s) found at" +#define D_FOUND_AT "found at" +#define D_I2CSCAN_UNKNOWN_ERROR_AT "Unknown error at" +#define D_I2CSCAN_NO_DEVICES_FOUND "No devices found" +#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host not found" + +// webserver.ino +#define D_WEBSERVER_ACTIVE_ON "Web server active on" +#define D_WITH_IP_ADDRESS "with IP address" +#define D_WEBSERVER_STOPPED "Web server stopped" +#define D_FILE_NOT_FOUND "File Not Found" +#define D_REDIRECTED "Redirected to captive portal" +#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager set AccessPoint and keep Station" +#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager set AccessPoint" +#define D_TRYING_TO_CONNECT "Trying to connect device to network" + +#define D_RESTART_IN "Restart in" +#define D_SECONDS "seconds" +#define D_DEVICE_WILL_RESTART "Device will restart in a few seconds" +#define D_BUTTON_TOGGLE "Toggle" +#define D_CONFIGURATION "Configuration" +#define D_INFORMATION "Information" +#define D_FIRMWARE_UPGRADE "Firmware Upgrade" +#define D_CONSOLE "Console" +#define D_CONFIRM_RESTART "Confirm Restart" + +#define D_CONFIGURE_MODULE "Configure Module" +#define D_CONFIGURE_WIFI "Configure WiFi" +#define D_CONFIGURE_MQTT "Configure MQTT" +#define D_CONFIGURE_DOMOTICZ "Configure Domoticz" +#define D_CONFIGURE_LOGGING "Configure Logging" +#define D_CONFIGURE_OTHER "Configure Other" +#define D_CONFIRM_RESET_CONFIGURATION "Confirm Reset Configuration" +#define D_RESET_CONFIGURATION "Reset Configuration" +#define D_BACKUP_CONFIGURATION "Backup Configuration" +#define D_RESTORE_CONFIGURATION "Restore Configuration" +#define D_MAIN_MENU "Main Menu" + +#define D_MODULE_PARAMETERS "Module parameters" +#define D_MODULE_TYPE "Module type" +#define D_GPIO "GPIO" +#define D_SERIAL_IN "Serial In" +#define D_SERIAL_OUT "Serial Out" + +#define D_WIFI_PARAMETERS "Wifi parameters" +#define D_SCAN_FOR_WIFI_NETWORKS "Scan for wifi networks" +#define D_SCAN_DONE "Scan done" +#define D_NO_NETWORKS_FOUND "No networks found" +#define D_REFRESH_TO_SCAN_AGAIN "Refresh to scan again" +#define D_DUPLICATE_ACCESSPOINT "Duplicate AccessPoint" +#define D_SKIPPING_LOW_QUALITY "Skipping due to 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 Password" +#define D_AP2_SSID "AP2 SSId" +#define D_AP2_PASSWORD "AP2 Password" + +#define D_MQTT_PARAMETERS "MQTT parameters" +#define D_CLIENT "Client" +#define D_FULL_TOPIC "Full Topic" + +#define D_LOGGING_PARAMETERS "Logging parameters" +#define D_LOG_LEVEL "log level" +#define D_MORE_DEBUG "More debug" +#define D_SYSLOG_HOST "Syslog host" +#define D_SYSLOG_PORT "Syslog port" +#define D_TELEMETRY_PERIOD "Telemetry period" + +#define D_OTHER_PARAMETERS "Other parameters" +#define D_WEB_ADMIN_PASSWORD "Web Admin Password" +#define D_MQTT_ENABLE "MQTT enable" +#define D_FRIENDLY_NAME "Friendly Name" +#define D_BELKIN_WEMO "Belkin WeMo" +#define D_HUE_BRIDGE "Hue Bridge" +#define D_SINGLE_DEVICE "single device" +#define D_MULTI_DEVICE "multi device" + +#define D_SAVE_CONFIGURATION "Save configuration" +#define D_CONFIGURATION_SAVED "Configuration saved" +#define D_CONFIGURATION_RESET "Configuration reset" + +#define D_PROGRAM_VERSION "Program Version" +#define D_BUILD_DATE_AND_TIME "Build Date & Time" +#define D_CORE_AND_SDK_VERSION "Core/SDK Version" +#define D_FLASH_WRITE_COUNT "Flash write Count" +#define D_MAC_ADDRESS "MAC Address" +#define D_MQTT_HOST "MQTT Host" +#define D_MQTT_PORT "MQTT Port" +#define D_MQTT_CLIENT "MQTT Client" +#define D_MQTT_USER "MQTT User" +#define D_MQTT_TOPIC "MQTT Topic" +#define D_MQTT_GROUP_TOPIC "MQTT Group Topic" +#define D_MQTT_FULL_TOPIC "MQTT Full Topic" +#define D_MDNS_DISCOVERY "mDNS Discovery" +#define D_MDNS_ADVERTISE "mDNS Advertise" +#define D_ESP_CHIP_ID "ESP Chip Id" +#define D_FLASH_CHIP_ID "Flash Chip Id" +#define D_FLASH_CHIP_SIZE "Flash Size" +#define D_FREE_PROGRAM_SPACE "Free Program Space" + +#define D_UPGRADE_BY_WEBSERVER "Upgrade by web server" +#define D_OTA_URL "OTA Url" +#define D_START_UPGRADE "Start upgrade" +#define D_UPGRADE_BY_FILE_UPLOAD "Upgrade by file upload" +#define D_UPLOAD_STARTED "Upload started" +#define D_UPGRADE_STARTED "Upgrade started" +#define D_UPLOAD_DONE "Upload done" +#define D_UPLOAD_ERR_1 "No file selected" +#define D_UPLOAD_ERR_2 "Not enough space" +#define D_UPLOAD_ERR_3 "Magic byte is not 0xE9" +#define D_UPLOAD_ERR_4 "Program flash size is larger than real flash size" +#define D_UPLOAD_ERR_5 "Upload buffer miscompare" +#define D_UPLOAD_ERR_6 "Upload failed. Enable logging 3" +#define D_UPLOAD_ERR_7 "Upload aborted" +#define D_UPLOAD_ERR_8 "File invalid" +#define D_UPLOAD_ERR_9 "File too large" +#define D_UPLOAD_ERROR_CODE "Upload error code" + +#define D_ENTER_COMMAND "Enter command" +#define D_ENABLE_WEBLOG_FOR_RESPONSE "Enable weblog 2 if response expected" +#define D_NEED_USER_AND_PASSWORD "Need user=&password=" + +// xdrv_domoticz.ino +#define D_DOMOTICZ_PARAMETERS "Domoticz parameters" +#define D_DOMOTICZ_IDX "Idx" +#define D_DOMOTICZ_KEY_IDX "Key idx" +#define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_SENSOR_IDX "Sensor idx" + #define DOMOTICZ_SENSORS_MAX_STRING_LENGTH 14 + #define D_DOMOTICZ_TEMP "Temp" + #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" + #define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro" + #define D_DOMOTICZ_POWER_ENERGY "Power,Energy" + #define D_DOMOTICZ_ILLUMINANCE "Illuminance" + #define D_DOMOTICZ_COUNT "Count" +#define D_DOMOTICZ_UPDATE_TIMER "Update timer" +#define D_CONFIGURE_DOMOTICZ "Configure Domoticz" + +// xdrv_ir-send.ino +#define D_INVALID_JSON "Invalid JSON" +#define D_PROTOCOL_NOT_SUPPORTED "Protocol not supported" +#define D_IRSEND_PROTOCOL "PROTOCOL" +#define D_IRSEND_BITS "BITS" +#define D_IRSEND_DATA "DATA" +#define D_IRHVAC_VENDOR "VENDOR" +#define D_IRHVAC_POWER "POWER" +#define D_IRHVAC_MODE "MODE" +#define D_IRHVAC_FANSPEED "FANSPEED" +#define D_IRHVAC_TEMP "TEMP" + +// xdrv_snfbridge.ino +#define D_RFRECEIVED "RfReceived" +#define D_START_LEARNING "Start learning" +#define D_SET_TO_DEFAULT "Set to default" +#define D_DEFAULT_SENT "Default sent" +#define D_LEARNED_SENT "Learned sent" +#define D_LEARNING_ACTIVE "Learning active" +#define D_LEARN_FAILED "Learn failed" +#define D_LEARNED "Learned" + +// xdrv_wemohue.ino +#define D_MULTICAST_DISABLED "Multicast disabled" +#define D_MULTICAST_REJOINED "Multicast (re)joined" +#define D_MULTICAST_JOIN_FAILED "Multicast join failed" +#define D_FAILED_TO_SEND_RESPONSE "Failed to send response" + +#define D_WEMO "WeMo" +#define D_WEMO_BASIC_EVENT "WeMo basic event" +#define D_WEMO_EVENT_SERVICE "WeMo event service" +#define D_WEMO_SETUP "WeMo setup" +#define D_RESPONSE_SENT "Response sent" + +#define D_HUE "Hue" +#define D_HUE_BRIDGE_SETUP "Hue setup" +#define D_HUE_API_NOT_IMPLEMENTED "Hue API not implemented" +#define D_HUE_API "Hue API" +#define D_HUE_POST_ARGS "Hue POST args" +#define D_3_RESPONSE_PACKETS_SENT "3 response packets sent" + +// xsns_dht.ino +#define D_TIMEOUT_WAITING_FOR "Timeout waiting for" +#define D_START_SIGNAL_LOW "start signal low" +#define D_START_SIGNAL_HIGH "start signal high" +#define D_PULSE "pulse" +#define D_CHECKSUM_FAILURE "Checksum failure" + +// xsns_ds18b20.ino +#define D_SENSOR_BUSY "Sensor busy" +#define D_SENSOR_CRC_ERROR "Sensor CRC error" + +// xsns_hlw8012.ino +#define D_MAXPOWERREACHED "MaxPowerReached" +#define D_MAXPOWERREACHEDRETRY "MaxPowerReachedRetry" +#define D_POWERMONITOR "PowerMonitor" +#define D_ENERGYMONITOR "EnergyMonitor" +#define D_MAXENERGYREACHED "MaxEnergyReached" +#define D_ENERGY_TODAY "Energy Today" +#define D_ENERGY_YESTERDAY "Energy Yesterday" +#define D_ENERGY_TOTAL "Energy Total" + +// xsns_sht1x.ino +#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor did not ACK command" +#define D_SHT1X_FOUND "SHT1X found" + +// sonoff_template.h +// Max string length is 8 characters including suffixes +#define D_SENSOR_NONE "None" +#define D_SENSOR_DHT11 "DHT11" +#define D_SENSOR_AM2301 "AM2301" +#define D_SENSOR_DHT22 "DHT22" +#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_IRREMOTE "IRremote" +#define D_SENSOR_SWITCH "Switch" // Suffix "1" +#define D_SENSOR_BUTTON "Button" // Suffix "1" +#define D_SENSOR_RELAY "Relay" // Suffix "1I" +#define D_SENSOR_LED "Led" // Suffix "1I" +#define D_SENSOR_PWM "PWM" // Suffix "1" +#define D_SENSOR_COUNTER "Counter" // Suffix "1" + +// Units +#define D_UNIT_AMPERE "A" +#define D_UNIT_HOUR "Hr" +#define D_UNIT_KILOWATTHOUR "kWh" +#define D_UNIT_MICROSECOND "us" +#define D_UNIT_MILLIAMPERE "mA" +#define D_UNIT_MILLISECOND "ms" +#define D_UNIT_MINUTE "Min" +#define D_UNIT_PRESSURE "hPa" +#define D_UNIT_SECOND "sec" +#define D_UNIT_SECTORS "sectors" +#define D_UNIT_VOLT "V" +#define D_UNIT_WATT "W" +#define D_UNIT_WATTHOUR "Wh" + +// Log message prefix +#define D_LOG_APPLICATION "APP: " +#define D_LOG_BRIDGE "BRG: " +#define D_LOG_CONFIG "CFG: " +#define D_LOG_COMMAND "CND: " +#define D_LOG_DHT "DHT: " +#define D_LOG_DOMOTICZ "DOM: " +#define D_LOG_DSB "DSB: " +#define D_LOG_HTTP "HTP: " +#define D_LOG_I2C "I2C: " +#define D_LOG_LOG "LOG: " +#define D_LOG_MODULE "MOD: " +#define D_LOG_MDNS "DNS: " +#define D_LOG_MQTT "MQT: " +#define D_LOG_OTHER "OTH: " +#define D_LOG_RESULT "RSL: " +#define D_LOG_SHT1 "SHT: " +#define D_LOG_UPLOAD "UPL: " +#define D_LOG_UPNP "UPP: " +#define D_LOG_WIFI "WIF: " + +// Result +#define D_RSLT_RESULT "RESULT" +#define D_RSLT_INFO "INFO" +#define D_RSLT_STATE "STATE" +#define D_RSLT_SENSOR "SENSOR" +#define D_RSLT_UPTIME "UPTIME" +#define D_RSLT_MARGINS "MARGINS" +#define D_RSLT_WARNING "WARNING" +#define D_RSLT_ENERGY "ENERGY" + +// Commands +#define D_CMND_MQTTHOST "MqttHost" +#define D_CMND_MQTTPORT "MqttPort" +#define D_CMND_MQTTRETRY "MqttRetry" +#define D_CMND_STATETEXT "StateText" +#define D_CMND_MQTTFINGERPRINT "MqttFingerprint" +#define D_CMND_MQTTCLIENT "MqttClient" +#define D_CMND_MQTTUSER "MqttUser" +#define D_CMND_MQTTPASSWORD "MqttPassword" +#define D_CMND_FULLTOPIC "FullTopic" +#define D_CMND_PREFIX "Prefix" + #define PRFX_MAX_STRING_LENGTH 5 + #define D_CMND "cmnd" + #define D_STAT "stat" + #define D_TELE "tele" +#define D_CMND_GROUPTOPIC "GroupTopic" +#define D_CMND_TOPIC "Topic" +#define D_CMND_BUTTONTOPIC "ButtonTopic" +#define D_CMND_SWITCHTOPIC "SwitchTopic" +#define D_CMND_BUTTONRETAIN "ButtonRetain" +#define D_CMND_SWITCHRETAIN "SwitchRetain" +#define D_CMND_POWERRETAIN "PowerRetain" +#define D_CMND_SENSORRETAIN "SensorRetain" +#define D_CMND_BACKLOG "Backlog" +#define D_CMND_DELAY "Delay" +#define D_CMND_STATUS "Status" + #define D_STATUS1_PARAMETER "PRM" + #define D_STATUS2_FIRMWARE "FWR" + #define D_STATUS3_LOGGING "LOG" + #define D_STATUS4_MEMORY "MEM" + #define D_STATUS5_NETWORK "NET" + #define D_STATUS6_MQTT "MQT" + #define D_STATUS7_TIME "TIM" + #define D_STATUS8_POWER "PWR" + #define D_STATUS9_MARGIN "PTH" + #define D_STATUS10_SENSOR "SNS" + #define D_STATUS11_STATUS "STS" +#define D_CMND_POWER "Power" + #define D_RSLT_POWER "POWER" +#define D_CMND_POWERONSTATE "PowerOnState" +#define D_CMND_PULSETIME "PulseTime" +#define D_CMND_BLINKTIME "BlinkTime" +#define D_CMND_BLINKCOUNT "BlinkCount" +#define D_CMND_SAVEDATA "SaveData" +#define D_CMND_SETOPTION "SetOption" +#define D_CMND_TEMPERATURE_RESOLUTION "TempRes" +#define D_CMND_HUMIDITY_RESOLUTION "HumRes" +#define D_CMND_PRESSURE_RESOLUTION "PressRes" +#define D_CMND_POWER_RESOLUTION "WattRes" +#define D_CMND_VOLTAGE_RESOLUTION "VoltRes" +#define D_CMND_ENERGY_RESOLUTION "EnergyRes" +#define D_CMND_MODULE "Module" +#define D_CMND_MODULES "Modules" +#define D_CMND_GPIO "GPIO" + #define D_NOT_SUPPORTED "Not supported" +#define D_CMND_GPIOS "GPIOs" +#define D_CMND_PWM "PWM" +#define D_CMND_COUNTER "Counter" +#define D_CMND_COUNTERTYPE "CounterType" +#define D_CMND_COUNTERDEBOUNCE "CounterDebounce" +#define D_CMND_SLEEP "Sleep" +#define D_CMND_UPLOAD "Upload" +#define D_CMND_UPGRADE "Upgrade" + #define D_ONE_OR_GT "1 or >%s to upgrade" +#define D_CMND_OTAURL "OtaUrl" +#define D_CMND_SERIALLOG "SerialLog" +#define D_CMND_SYSLOG "SysLog" +#define D_CMND_LOGHOST "LogHost" +#define D_CMND_LOGPORT "LogPort" +#define D_CMND_IPADDRESS "IPAddress" +#define D_CMND_NTPSERVER "NtpServer" +#define D_CMND_AP "Ap" +#define D_CMND_SSID "SSId" +#define D_CMND_PASSWORD "Password" +#define D_CMND_HOSTNAME "Hostname" +#define D_CMND_WIFICONFIG "WifiConfig" + #define WCFG_MAX_STRING_LENGTH 12 + #define D_WCFG_0_RESTART "Restart" + #define D_WCFG_1_SMARTCONFIG "SmartConfig" + #define D_WCFG_2_WIFIMANAGER "WifiManager" + #define D_WCFG_3_WPSCONFIG "WPSConfig" + #define D_WCFG_4_RETRY "Retry" +#define D_CMND_FRIENDLYNAME "FriendlyName" +#define D_CMND_SWITCHMODE "SwitchMode" +#define D_CMND_WEBSERVER "Webserver" + #define D_WEBSERVER_MODE "WebServerMode" + #define D_ACTIVE_FOR "Active for" + #define D_ON_DEVICE "on" +#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_ONE_TO_RESTART "1 to restart" +#define D_CMND_RESET "Reset" + #define D_RESET_AND_RESTARTING "Reset and Restarting" + #define D_ONE_TO_RESET "1 to reset" +#define D_CMND_TIMEZONE "Timezone" +#define D_CMND_LEDPOWER "LedPower" +#define D_CMND_LEDSTATE "LedState" +#define D_CMND_CFGDUMP "CfgDump" +#define D_CMND_I2CSCAN "I2CScan" +#define D_CMND_EXCEPTION "Exception" + +// Commands xdrv_domoticz.ino +#define D_CMND_DOMOTICZ "Domoticz" +#define D_CMND_IDX "Idx" +#define D_CMND_KEYIDX "KeyIdx" +#define D_CMND_SWITCHIDX "SwitchIdx" +#define D_CMND_SENSORIDX "SensorIdx" +#define D_CMND_UPDATETIMER "UpdateTimer" + +// Commands xdrv_ir_send.ino +#define D_CMND_IRSEND "IRSend" +#define D_CMND_IRHVAC "IRHVAC" + +// Commands xdrv_snfbridge.ino +#define D_CMND_RFKEY "RfKey" +#define D_CMND_RFDEFAULT "RfDefault" + +// Commands xdrv_snfled.ino +#define D_CMND_COLOR "Color" +#define D_CMND_COLORTEMPERATURE "CT" +#define D_CMND_DIMMER "Dimmer" +#define D_CMND_LEDTABLE "LedTable" +#define D_CMND_FADE "Fade" +#define D_CMND_SPEED "Speed" +#define D_CMND_WAKEUPDURATION "WakeUpDuration" +#define D_CMND_WAKEUP "Wakeup" + +// Commands xdrv_ws2812.ino +#define D_CMND_PIXELS "Pixels" +#define D_CMND_LED "Led" +#define D_CMND_WIDTH "Width" +#define D_CMND_SCHEME "Scheme" + +// Commands xsns_hlw8012.ino +#define D_CMND_POWERLOW "PowerLow" +#define D_CMND_POWERHIGH "PowerHigh" +#define D_CMND_VOLTAGELOW "VoltageLow" +#define D_CMND_VOLTAGEHIGH "VoltageHigh" +#define D_CMND_CURRENTLOW "CurrentLow" +#define D_CMND_CURRENTHIGH "CurrentHigh" +#define D_CMND_ENERGYRESET "EnergyReset" +#define D_CMND_HLWPCAL "HlwPcal" +#define D_CMND_HLWPSET "HlwPset" +#define D_CMND_HLWUCAL "HlwUcal" +#define D_CMND_HLWUSET "HlwUset" +#define D_CMND_HLWICAL "HlwIcal" +#define D_CMND_HLWISET "HlwIset" +#define D_CMND_MAXPOWER "MaxPower" +#define D_CMND_MAXPOWERHOLD "MaxPowerHold" +#define D_CMND_MAXPOWERWINDOW "MaxPowerWindow" +#define D_CMND_SAFEPOWER "SafePower" +#define D_CMND_SAFEPOWERHOLD "SafePowerHold" +#define D_CMND_SAFEPOWERWINDOW "SafePowerWindow" +#define D_CMND_MAXENERGY "MaxEnergy" +#define D_CMND_MAXENERGYSTART "MaxEnergyStart" diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h new file mode 100644 index 000000000..dc0e4b369 --- /dev/null +++ b/sonoff/language/nl-NL.h @@ -0,0 +1,666 @@ +/* + i18n_nl-NL.h - localization for Dutch - Nederland for Sonoff-Tasmota + + Copyright (C) 2017 Theo Arends + + 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 . +*/ + +/*************************** ATTENTION *******************************\ + * + * Due to memory constraints only UTF-8 is supported. + * 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. + * +\*********************************************************************/ + +// Time and Date managed by SDK will not be localized (yet) +// "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 "Zo Ma Di Wo Do Vr Za " +#define D_MONTH3LIST "JanFebMarAprMeiJunJulAugSepOktNovDec" + +// Non JSON decimal separator +#define D_DECIMAL_SEPARATOR "," + +// Common +#define D_ABORTED "Afgebroken" +#define D_ACTIVE "Actief" +#define D_ADDRESS "Adres" +#define D_ADMIN "Admin" +#define D_AIR_QUALITY "Lucht kwalitiet" +#define D_AIRQUALITY "LuchtKwaliteit" +#define D_AP "AP" // Access Point +#define D_APMAC_ADDRESS "APMac" +#define D_APPENDED "Aangevuld" +#define D_AS "als" +#define D_AUTO "AUTO" +#define D_BAUDRATE "Baudrate" +#define D_BLINK "Knipper" +#define D_BLINKOFF "KnipperUit" +#define D_BOOTVERSION "Boot" +#define D_BOOT_COUNT "Herstarts" +#define D_BOOTCOUNT "Herstarts" +#define D_BRIGHTLIGHT "Fel" +#define D_BUILDDATETIME "BuildDateTime" +#define D_BUTTON "DrukKnop" +#define D_CELSIUS "Celsius" +#define D_CODE "code" // Button code +#define D_COLDLIGHT "Koud" +#define D_COMMAND "Opdracht" +#define D_CONNECTED "Verbonden" +#define D_COREVERSION "Core" +#define D_COUNT "Aantal" +#define D_COUNTER "Teller" +#define D_CURRENT "Stroom" // As in Voltage and Current +#define D_DATA "Data" +#define D_DARKLIGHT "Donker" +#define D_DEBUG "Debug" +#define D_DISABLED "Uitgeschakeld" +#define D_DNS_SERVER "DNS Server" +#define D_DNSSERVER "DNSServer" +#define D_DONE "Klaar" +#define D_DST_TIME "ZT" +#define D_EMPTY "Leeg" +#define D_EMULATION "Emulatie" +#define D_ENABLED "Geactiveerd" +#define D_ENDDST "WinterTijd" // End Daylight Savings Time +#define D_ERASE "Wissen" +#define D_ERROR "Fout" +#define D_EVERY "Iedere" +#define D_FAHRENHEIT "Fahrenheit" +#define D_FAILED "Mislukt" +#define D_FALLBACK "Fallback" +#define D_FALLBACK_TOPIC "Fallback Topic" +#define D_FALLBACKTOPIC "FallbackTopic" +#define D_FALSE "Onwaar" +#define D_FILE "Bestand" +#define D_FLASHMODE "FlashStand" +#define D_FLASHSIZE "FlashGrootte" +#define D_FREE_MEMORY "Vrij geheugen" +#define D_FREEMEMORY "Vrij" +#define D_FROM "van" +#define D_GATEWAY "Gateway" +#define D_GROUP "Groep" +#define D_HEAPSIZE "Heap" +#define D_HIGH "Hoog" +#define D_HOST "Host" +#define D_HOSTNAME "Hostnaam" +#define D_HUMIDITY "Luchtvochtigheid" +#define D_ILLUMINANCE "Verlichtingssterkte" +#define D_IMMEDIATE "onmiddelijk" // Button immediate +#define D_INDEX "Index" +#define D_INFO "Info" +#define D_INITIALIZED "Geinitialiseerd" +#define D_IP_ADDRESS "IP Adres" +#define D_LIGHT "Ligt" +#define D_LOCAL_TIME "Plaatselijk" +#define D_LOW "Laag" +#define D_LWT "LWT" +#define D_MAC "Mac" +#define D_MASK "Masker" +#define D_MODULE "Module" +#define D_MQTT "MQTT" +#define D_MULTI_PRESS "meervoudig" +#define D_NO "Nee" +#define D_NOISE "Lawaai" +#define D_NONE "Geen" +#define D_OFF "Uit" +#define D_OFFLINE "Offline" +#define D_OK "Ok" +#define D_ON "Ann" +#define D_ONLINE "Online" +#define D_OR "of" +#define D_PASSWORD "Wachtwoord" +#define D_PERIOD "Periode" +#define D_PORT "Poort" +#define D_POWER_FACTOR "Arbeidsfactor" +#define D_POWERFACTOR "Factor" +#define D_POWERUSAGE "Vermogen" +#define D_PRESSURE "Luchtdruk" +#define D_PROGRAM_FLASH_SIZE "Programma Flash Grootte" +#define D_PROGRAMFLASHSIZE "ProgrammaFlashGrootte" +#define D_PROGRAM_SIZE "Programma Grootte" +#define D_PROGRAMSIZE "ProgrammaGrootte" +#define D_PROJECT "Project" +#define D_RECEIVED "Ontvangen" +#define D_RESTART "Herstart" +#define D_RESTARTING "Herstarten" +#define D_RESTART_REASON "Reden herstart" +#define D_RESTARTREASON "RedenHerstart" +#define D_RESTORE "herstellen" +#define D_RETAINED "retained" +#define D_SAVE "Opslaan" +#define D_SAVEADDRESS "OpslagAdres" +#define D_SAVECOUNT "AantalOpslagen" +#define D_SAVESTATE "OpslagToestand" +#define D_SDKVERSION "SDK" +#define D_SELECTED "gekozen" +#define D_SENSOR "Sensor" +#define D_SERIAL "Serieel" +#define D_BYTES "Bytes" +#define D_SSID "SSId" +#define D_START "Start" +#define D_STARTED "Gestart" +#define D_STARTDST "Zomertijd" // Start Daylight Savings Time +#define D_STD_TIME "WT" +#define D_STOP "Stop" +#define D_SUBNET_MASK "Subnet Masker" +#define D_SUBNETMASK "Subnetmasker" +#define D_SUCCESSFUL "Gelukt" +#define D_SWITCH "Schakelaar" +#define D_SYNC "Sync" +#define D_SYS "Sys" // Sys log +#define D_TEMPERATURE "Temperatuur" +#define D_TEMPERATURE_UNIT "TempEenheid" +#define D_TIME "Tijd" +#define D_TO "naar" +#define D_TODAY "Vandaag" +#define D_TOGGLE "Toggle" // Wissel, Tuimel +#define D_TOPIC "Topic" // Onderwerp +#define D_TOTAL "Totaal" +#define D_TRUE "Waar" +#define D_TYPE "Soort" +#define D_UNKNOWN "Onbekend" +#define D_UPGRADE "opwaarderen" +#define D_UPLOAD "Verzenden" +#define D_UPTIME "Bedrijfstijd" +#define D_UTC_TIME "UTC" +#define D_USER "Gebruiker" +#define D_VCC "Vcc" +#define D_VERSION "Versie" +#define D_VOLTAGE "Spanning" +#define D_WARMLIGHT "Warm" +#define D_WEB "Web" // Web log +#define D_WEB_SERVER "Webserver" +#define D_WIFI "Wifi" +#define D_WRONG "Fout" +#define D_YESTERDAY "Gisteren" + +// settings.ino +#define D_SAVED_TO_FLASH_AT "Opgeslagen in flash op" +#define D_LOADED_FROM_FLASH_AT "Geladen vanuit flash op" +#define D_USE_DEFAULTS "Gebruik standaardwaarden" +#define D_ERASED_SECTOR "Wis sector" + +// sonoff.ino +#define D_LEVEL_10 "niveau 1-0" +#define D_LEVEL_01 "niveau 0-1" +#define D_SERIAL_LOGGING_DISABLED "Serieel logging uitgeschakeld" +#define D_SYSLOG_LOGGING_REENABLED "Syslog logging weer ingeschakeld" + +#define D_SET_BAUDRATE_TO "Zet baudrate op" +#define D_RECEIVED_TOPIC "Ontvangen topic" +#define D_DATA_SIZE "Data lengte" +#define D_ANALOG_INPUT0 "Analoog0" + +#define D_FINGERPRINT "Controleer TLS vingerafdruk..." +#define D_TLS_CONNECT_FAILED_TO "TLS Verbinding mislukt naar" +#define D_RETRY_IN "Opnieuw proberen over" +#define D_VERIFIED "Gecontroleerd" +#define D_INSECURE "Door ongeldige vingerafdruk een onveilige verbinding" +#define D_CONNECT_FAILED_TO "Verbinding mislukt naar" + +// support.ino +#define D_OSWATCH "osWatch" +#define D_BLOCKED_LOOP "Blocked Loop" +#define D_WPS_FAILED_WITH_STATUS "WPSconfig mislukt met status" +#define D_ACTIVE_FOR_1_MINUTE "1 minuut actief" +#define D_FAILED_TO_START "mislukt" +#define D_PATCH_ISSUE_2186 "Patch issue 2186" +#define D_CONNECTING_TO_AP "Verbinden met AP" +#define D_IN_MODE "in stand" +#define D_CONNECT_FAILED_NO_IP_ADDRESS "Verbinding mislukt omdat geen IP adres werd ontvangen" +#define D_CONNECT_FAILED_AP_NOT_REACHED "Verbinding mislukt omdat AP onbereikbaar is" +#define D_CONNECT_FAILED_WRONG_PASSWORD "Verbinding mislukt door fout wachtwoord" +#define D_CONNECT_FAILED_AP_TIMEOUT "Verbinding mislukt door AP time-out" +#define D_ATTEMPTING_CONNECTION "Verbinden..." +#define D_CHECKING_CONNECTION "Controleer verbinding..." +#define D_QUERY_DONE "Aanvraag klaar. Aantal MQTT diensten gevonden" +#define D_MQTT_SERVICE_FOUND "MQTT dienst gevonden op" +#define D_I2CSCAN_DEVICES_FOUND_AT "Apparaten gevonden op" +#define D_FOUND_AT "gevonden op" +#define D_I2CSCAN_UNKNOWN_ERROR_AT "Onbekende fout op" +#define D_I2CSCAN_NO_DEVICES_FOUND "Geen apparaten gevonden" +#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host niet gevonden" + +// webserver.ino +#define D_WEBSERVER_ACTIVE_ON "Webserver actief op" +#define D_WITH_IP_ADDRESS "met IP adres" +#define D_WEBSERVER_STOPPED "Webserver gestopt" +#define D_FILE_NOT_FOUND "Bestand niet gevonden" +#define D_REDIRECTED "Redirected to captive portal" +#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager start AccessPoint en hou Station" +#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager start AccessPoint" +#define D_TRYING_TO_CONNECT "Apparaat probeert te verbinden met netwerk" + +#define D_RESTART_IN "Herstart over" +#define D_SECONDS "seconden" +#define D_DEVICE_WILL_RESTART "Herstart over enkele seconden" +#define D_BUTTON_TOGGLE "Toggle" // Wissel, Tuimel +#define D_CONFIGURATION "Configuratie" +#define D_INFORMATION "Informatie" +#define D_FIRMWARE_UPGRADE "Opwaarderen" +#define D_CONSOLE "Console" +#define D_CONFIRM_RESTART "Bevestig herstart" + +#define D_CONFIGURE_MODULE "Configureer Module" +#define D_CONFIGURE_WIFI "Configureer WiFi" +#define D_CONFIGURE_MQTT "Configureer MQTT" +#define D_CONFIGURE_DOMOTICZ "Configureer Domoticz" +#define D_CONFIGURE_LOGGING "Configureer Logging" +#define D_CONFIGURE_OTHER "Configureer Overige" +#define D_CONFIRM_RESET_CONFIGURATION "Bevestig reset configuratie" +#define D_RESET_CONFIGURATION "Reset Configuratie" +#define D_BACKUP_CONFIGURATION "Bewaar Configuratie" +#define D_RESTORE_CONFIGURATION "Herstel Configuration" +#define D_MAIN_MENU "Hoofdmenu" + +#define D_MODULE_PARAMETERS "Module parameters" +#define D_MODULE_TYPE "Module soort" +#define D_GPIO "GPIO" +#define D_SERIAL_IN "Serieel In" +#define D_SERIAL_OUT "Serieel Uit" + +#define D_WIFI_PARAMETERS "Wifi parameters" +#define D_SCAN_FOR_WIFI_NETWORKS "Zoek wifi netwerken" +#define D_SCAN_DONE "Scan klaar" +#define D_NO_NETWORKS_FOUND "Geen netwerken gevonden" +#define D_REFRESH_TO_SCAN_AGAIN "Vernieuw om opnieuw te zoeken" +#define D_DUPLICATE_ACCESSPOINT "Dubbel AccessPoint" +#define D_SKIPPING_LOW_QUALITY "Overslaan agv lage ontvangskwaliteit" +#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 Wachtwoord" +#define D_AP2_SSID "AP2 SSId" +#define D_AP2_PASSWORD "AP2 Wachtwoord" + +#define D_MQTT_PARAMETERS "MQTT parameters" +#define D_CLIENT "Client" +#define D_FULL_TOPIC "Volledig Topic" + +#define D_LOGGING_PARAMETERS "Logging parameters" +#define D_LOG_LEVEL "log niveau" +#define D_MORE_DEBUG "Meer debug" +#define D_SYSLOG_HOST "Syslog host" +#define D_SYSLOG_PORT "Syslog poort" +#define D_TELEMETRY_PERIOD "Telemetry periode" + +#define D_OTHER_PARAMETERS "Overige parameters" +#define D_WEB_ADMIN_PASSWORD "Web Admin Wachtwoord" +#define D_MQTT_ENABLE "MQTT ingeschakeld" +#define D_FRIENDLY_NAME "Beschrijvende naam" +#define D_BELKIN_WEMO "Belkin WeMo" +#define D_HUE_BRIDGE "Hue Bridge" +#define D_SINGLE_DEVICE "een apparaat" +#define D_MULTI_DEVICE "meer apparaten" + +#define D_SAVE_CONFIGURATION "Bewaar configuratie" +#define D_CONFIGURATION_SAVED "Configuratie opgeslagen" +#define D_CONFIGURATION_RESET "Configuratie ge-reset" + +#define D_PROGRAM_VERSION "Programma Versie" +#define D_BUILD_DATE_AND_TIME "Compileer Datum & Tijd" +#define D_CORE_AND_SDK_VERSION "Core/SDK Versie" +#define D_FLASH_WRITE_COUNT "Aantal Flash opslagen" +#define D_MAC_ADDRESS "MAC Adres" +#define D_MQTT_HOST "MQTT Host" +#define D_MQTT_PORT "MQTT Poort" +#define D_MQTT_CLIENT "MQTT Client" +#define D_MQTT_USER "MQTT Gebruiker" +#define D_MQTT_TOPIC "MQTT Topic" +#define D_MQTT_GROUP_TOPIC "MQTT Groep Topic" +#define D_MQTT_FULL_TOPIC "MQTT Volledig Topic" +#define D_MDNS_DISCOVERY "mDNS Discovery" +#define D_MDNS_ADVERTISE "mDNS Advertise" +#define D_ESP_CHIP_ID "ESP Chip Id" +#define D_FLASH_CHIP_ID "Flash Chip Id" +#define D_FLASH_CHIP_SIZE "Flash Grootte" +#define D_FREE_PROGRAM_SPACE "Vrij programma ruimte" + +#define D_UPGRADE_BY_WEBSERVER "Opwaarderen dmv webserver" +#define D_OTA_URL "OTA Url" +#define D_START_UPGRADE "Start opwaarderen" +#define D_UPGRADE_BY_FILE_UPLOAD "Opwaarderen dmv verzenden bestand" +#define D_UPLOAD_STARTED "Verzending gestart" +#define D_UPGRADE_STARTED "Opwaarderen gestart" +#define D_UPLOAD_DONE "Opwaarderen klaar" +#define D_UPLOAD_ERR_1 "Geen bestand gekozen" +#define D_UPLOAD_ERR_2 "Onvoldoende geheugen ruimte" +#define D_UPLOAD_ERR_3 "Magische byte is niet 0xE9" +#define D_UPLOAD_ERR_4 "Programma flash grootte is groter dan werkelijke flash grootte" +#define D_UPLOAD_ERR_5 "Opwaardeer buffer verschil" +#define D_UPLOAD_ERR_6 "Opwaarderen mislukt. Schakel logging 3 in" +#define D_UPLOAD_ERR_7 "Opwaarderen afgebroken" +#define D_UPLOAD_ERR_8 "Ongeldig bestand" +#define D_UPLOAD_ERR_9 "Bestand is te groot" +#define D_UPLOAD_ERROR_CODE "Opwaardeer foutcode" + +#define D_ENTER_COMMAND "Geef opdracht" +#define D_ENABLE_WEBLOG_FOR_RESPONSE "Schakel weblog 2 in indien antwoord verwacht" +#define D_NEED_USER_AND_PASSWORD "Benodig user=&password=" + +// xdrv_domoticz.ino +#define D_DOMOTICZ_PARAMETERS "Domoticz parameters" +#define D_DOMOTICZ_IDX "Idx" +#define D_DOMOTICZ_KEY_IDX "Toets idx" +#define D_DOMOTICZ_SWITCH_IDX "Schakelaar idx" +#define D_DOMOTICZ_SENSOR_IDX "Sensor idx" + #define DOMOTICZ_SENSORS_MAX_STRING_LENGTH 14 + #define D_DOMOTICZ_TEMP "Temp" + #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" + #define D_DOMOTICZ_TEMP_HUM_BARO "Temp,Hum,Baro" + #define D_DOMOTICZ_POWER_ENERGY "Power,Energy" + #define D_DOMOTICZ_ILLUMINANCE "Illuminance" + #define D_DOMOTICZ_COUNT "Count" +#define D_DOMOTICZ_UPDATE_TIMER "Bijwerk timer" +#define D_CONFIGURE_DOMOTICZ "Configureer Domoticz" + +// xdrv_ir-send.ino +#define D_INVALID_JSON "Ongeldig JSON" +#define D_PROTOCOL_NOT_SUPPORTED "Protocol wordt niet ondersteund" +#define D_IRSEND_PROTOCOL "PROTOCOL" +#define D_IRSEND_BITS "BITS" +#define D_IRSEND_DATA "DATA" +#define D_IRHVAC_VENDOR "VENDOR" +#define D_IRHVAC_POWER "POWER" +#define D_IRHVAC_MODE "MODE" +#define D_IRHVAC_FANSPEED "FANSPEED" +#define D_IRHVAC_TEMP "TEMP" + +// xdrv_snfbridge.ino +#define D_RFRECEIVED "RfReceived" +#define D_START_LEARNING "Start leren" +#define D_SET_TO_DEFAULT "Zet standaard waarden" +#define D_DEFAULT_SENT "Standaard verzonden" +#define D_LEARNED_SENT "Geleerde verzonden" +#define D_LEARNING_ACTIVE "Leren actief" +#define D_LEARN_FAILED "Leren mislukt" +#define D_LEARNED "Geleerd" + +// xdrv_wemohue.ino +#define D_MULTICAST_DISABLED "Multicast uitgeschakeld" +#define D_MULTICAST_REJOINED "Multicast verbonden" +#define D_MULTICAST_JOIN_FAILED "Multicast verbinding mislukt" +#define D_FAILED_TO_SEND_RESPONSE "Antwoord versturen mislukt" + +#define D_WEMO "WeMo" +#define D_WEMO_BASIC_EVENT "WeMo basis gebeurtenis" +#define D_WEMO_EVENT_SERVICE "WeMo gebeurtenis dienst" +#define D_WEMO_SETUP "WeMo installatie" +#define D_RESPONSE_SENT "Antwoord verstuurd" + +#define D_HUE "Hue" +#define D_HUE_BRIDGE_SETUP "Hue installatie" +#define D_HUE_API_NOT_IMPLEMENTED "Hue API niet beschikbaar" +#define D_HUE_API "Hue API" +#define D_HUE_POST_ARGS "Hue POST argumenten" +#define D_3_RESPONSE_PACKETS_SENT "3 antwoord paketten verstuurd" + +// xsns_dht.ino +#define D_TIMEOUT_WAITING_FOR "Te lang wachten op" +#define D_START_SIGNAL_LOW "laag start signaal" +#define D_START_SIGNAL_HIGH "hoog start signaal" +#define D_PULSE "signaal" +#define D_CHECKSUM_FAILURE "Controle mislukt" + +// xsns_ds18b20.ino +#define D_SENSOR_BUSY "Sensor bezet" +#define D_SENSOR_CRC_ERROR "Sensor CRC fout" + +// xsns_hlw8012.ino +#define D_MAXPOWERREACHED "MaxPowerReached" +#define D_MAXPOWERREACHEDRETRY "MaxPowerReachedRetry" +#define D_POWERMONITOR "PowerMonitor" +#define D_ENERGYMONITOR "EnergyMonitor" +#define D_MAXENERGYREACHED "MaxEnergyReached" +#define D_ENERGY_TODAY "Verbruik vandaag" +#define D_ENERGY_YESTERDAY "Verbruik gisteren" +#define D_ENERGY_TOTAL "Verbruik totaal" + +// xsns_sht1x.ino +#define D_SENSOR_DID_NOT_ACK_COMMAND "Geen opdracht ACK van sensor" +#define D_SHT1X_FOUND "SHT1X gevonden" + +// sonoff_template.h +// Max string length is 8 characters including suffixes +#define D_SENSOR_NONE "Geen" +#define D_SENSOR_DHT11 "DHT11" +#define D_SENSOR_AM2301 "AM2301" +#define D_SENSOR_DHT22 "DHT22" +#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_IRREMOTE "IRremote" +#define D_SENSOR_SWITCH "Switch" // Suffix "1" +#define D_SENSOR_BUTTON "Button" // Suffix "1" +#define D_SENSOR_RELAY "Relais" // Suffix "1I" +#define D_SENSOR_LED "Led" // Suffix "1I" +#define D_SENSOR_PWM "PWM" // Suffix "1" +#define D_SENSOR_COUNTER "Teller" // Suffix "1" + +// Units +#define D_UNIT_AMPERE "A" +#define D_UNIT_HOUR "Hr" +#define D_UNIT_KILOWATTHOUR "kWh" +#define D_UNIT_MICROSECOND "us" +#define D_UNIT_MILLIAMPERE "mA" +#define D_UNIT_MILLISECOND "ms" +#define D_UNIT_MINUTE "Min" +#define D_UNIT_PRESSURE "hPa" +#define D_UNIT_SECOND "sec" +#define D_UNIT_SECTORS "sectoren" +#define D_UNIT_VOLT "V" +#define D_UNIT_WATT "W" +#define D_UNIT_WATTHOUR "Wh" + +// Log message prefix +#define D_LOG_APPLICATION "APP: " +#define D_LOG_BRIDGE "BRG: " +#define D_LOG_CONFIG "CFG: " +#define D_LOG_COMMAND "CND: " +#define D_LOG_DHT "DHT: " +#define D_LOG_DOMOTICZ "DOM: " +#define D_LOG_DSB "DSB: " +#define D_LOG_HTTP "HTP: " +#define D_LOG_I2C "I2C: " +#define D_LOG_LOG "LOG: " +#define D_LOG_MODULE "MOD: " +#define D_LOG_MDNS "DNS: " +#define D_LOG_MQTT "MQT: " +#define D_LOG_OTHER "OTH: " +#define D_LOG_RESULT "RSL: " +#define D_LOG_SHT1 "SHT: " +#define D_LOG_UPLOAD "UPL: " +#define D_LOG_UPNP "UPP: " +#define D_LOG_WIFI "WIF: " + +// Result +#define D_RSLT_RESULT "RESULTAAT" +#define D_RSLT_INFO "INFO" +#define D_RSLT_STATE "TOESTAND" +#define D_RSLT_SENSOR "SENSOR" +#define D_RSLT_UPTIME "BEDRIJFSTIJD" +#define D_RSLT_MARGINS "GRENSWAARDEN" +#define D_RSLT_WARNING "WAARSCHUWING" +#define D_RSLT_ENERGY "ENERGIE" + +// Commands +#define D_CMND_MQTTHOST "MqttHost" +#define D_CMND_MQTTPORT "MqttPort" +#define D_CMND_MQTTRETRY "MqttRetry" +#define D_CMND_STATETEXT "StateText" +#define D_CMND_MQTTFINGERPRINT "MqttFingerprint" +#define D_CMND_MQTTCLIENT "MqttClient" +#define D_CMND_MQTTUSER "MqttUser" +#define D_CMND_MQTTPASSWORD "MqttPassword" +#define D_CMND_FULLTOPIC "FullTopic" +#define D_CMND_PREFIX "Prefix" + #define PRFX_MAX_STRING_LENGTH 5 + #define D_CMND "cmnd" + #define D_STAT "stat" + #define D_TELE "tele" +#define D_CMND_GROUPTOPIC "GroupTopic" +#define D_CMND_TOPIC "Topic" +#define D_CMND_BUTTONTOPIC "ButtonTopic" +#define D_CMND_SWITCHTOPIC "SwitchTopic" +#define D_CMND_BUTTONRETAIN "ButtonRetain" +#define D_CMND_SWITCHRETAIN "SwitchRetain" +#define D_CMND_POWERRETAIN "PowerRetain" +#define D_CMND_SENSORRETAIN "SensorRetain" +#define D_CMND_BACKLOG "Backlog" +#define D_CMND_DELAY "Delay" +#define D_CMND_STATUS "Status" + #define D_STATUS1_PARAMETER "PRM" + #define D_STATUS2_FIRMWARE "FWR" + #define D_STATUS3_LOGGING "LOG" + #define D_STATUS4_MEMORY "MEM" + #define D_STATUS5_NETWORK "NET" + #define D_STATUS6_MQTT "MQT" + #define D_STATUS7_TIME "TIM" + #define D_STATUS8_POWER "PWR" + #define D_STATUS9_MARGIN "PTH" + #define D_STATUS10_SENSOR "SNS" + #define D_STATUS11_STATUS "STS" +#define D_CMND_POWER "Power" + #define D_RSLT_POWER "POWER" +#define D_CMND_POWERONSTATE "PowerOnState" +#define D_CMND_PULSETIME "PulseTime" +#define D_CMND_BLINKTIME "BlinkTime" +#define D_CMND_BLINKCOUNT "BlinkCount" +#define D_CMND_SAVEDATA "SaveData" +#define D_CMND_SETOPTION "SetOption" +#define D_CMND_TEMPERATURE_RESOLUTION "TempRes" +#define D_CMND_HUMIDITY_RESOLUTION "HumRes" +#define D_CMND_PRESSURE_RESOLUTION "PressRes" +#define D_CMND_POWER_RESOLUTION "WattRes" +#define D_CMND_VOLTAGE_RESOLUTION "VoltRes" +#define D_CMND_ENERGY_RESOLUTION "EnergyRes" +#define D_CMND_MODULE "Module" +#define D_CMND_MODULES "Modules" +#define D_CMND_GPIO "GPIO" + #define D_NOT_SUPPORTED "Not supported" +#define D_CMND_GPIOS "GPIOs" +#define D_CMND_PWM "PWM" +#define D_CMND_COUNTER "Counter" +#define D_CMND_COUNTERTYPE "CounterType" +#define D_CMND_COUNTERDEBOUNCE "CounterDebounce" +#define D_CMND_SLEEP "Sleep" +#define D_CMND_UPLOAD "Upload" +#define D_CMND_UPGRADE "Upgrade" + #define D_ONE_OR_GT "1 or >%s to upgrade" +#define D_CMND_OTAURL "OtaUrl" +#define D_CMND_SERIALLOG "SerialLog" +#define D_CMND_SYSLOG "SysLog" +#define D_CMND_LOGHOST "LogHost" +#define D_CMND_LOGPORT "LogPort" +#define D_CMND_IPADDRESS "IPAddress" +#define D_CMND_NTPSERVER "NtpServer" +#define D_CMND_AP "Ap" +#define D_CMND_SSID "SSId" +#define D_CMND_PASSWORD "Password" +#define D_CMND_HOSTNAME "Hostname" +#define D_CMND_WIFICONFIG "WifiConfig" + #define WCFG_MAX_STRING_LENGTH 12 + #define D_WCFG_0_RESTART "Restart" + #define D_WCFG_1_SMARTCONFIG "SmartConfig" + #define D_WCFG_2_WIFIMANAGER "WifiManager" + #define D_WCFG_3_WPSCONFIG "WPSConfig" + #define D_WCFG_4_RETRY "Opnieuw" +#define D_CMND_FRIENDLYNAME "FriendlyName" +#define D_CMND_SWITCHMODE "SwitchMode" +#define D_CMND_WEBSERVER "Webserver" + #define D_WEBSERVER_MODE "WebServerSoort" + #define D_ACTIVE_FOR "Aktief als" + #define D_ON_DEVICE "op" +#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_ONE_TO_RESTART "1 voor herstart" +#define D_CMND_RESET "Reset" + #define D_RESET_AND_RESTARTING "Reset en herstarten" + #define D_ONE_TO_RESET "1 voor reset" +#define D_CMND_TIMEZONE "Timezone" +#define D_CMND_LEDPOWER "LedPower" +#define D_CMND_LEDSTATE "LedState" +#define D_CMND_CFGDUMP "CfgDump" +#define D_CMND_I2CSCAN "I2CScan" +#define D_CMND_EXCEPTION "Exception" + +// Commands xdrv_domoticz.ino +#define D_CMND_DOMOTICZ "Domoticz" +#define D_CMND_IDX "Idx" +#define D_CMND_KEYIDX "KeyIdx" +#define D_CMND_SWITCHIDX "SwitchIdx" +#define D_CMND_SENSORIDX "SensorIdx" +#define D_CMND_UPDATETIMER "UpdateTimer" + +// Commands xdrv_ir_send.ino +#define D_CMND_IRSEND "IRSend" +#define D_CMND_IRHVAC "IRHVAC" + +// Commands xdrv_snfbridge.ino +#define D_CMND_RFKEY "RfKey" +#define D_CMND_RFDEFAULT "RfDefault" + +// Commands xdrv_snfled.ino +#define D_CMND_COLOR "Color" +#define D_CMND_COLORTEMPERATURE "CT" +#define D_CMND_DIMMER "Dimmer" +#define D_CMND_LEDTABLE "LedTable" +#define D_CMND_FADE "Fade" +#define D_CMND_SPEED "Speed" +#define D_CMND_WAKEUPDURATION "WakeUpDuration" +#define D_CMND_WAKEUP "Wakeup" + +// Commands xdrv_ws2812.ino +#define D_CMND_PIXELS "Pixels" +#define D_CMND_LED "Led" +#define D_CMND_WIDTH "Width" +#define D_CMND_SCHEME "Scheme" + +// Commands xsns_hlw8012.ino +#define D_CMND_POWERLOW "PowerLow" +#define D_CMND_POWERHIGH "PowerHigh" +#define D_CMND_VOLTAGELOW "VoltageLow" +#define D_CMND_VOLTAGEHIGH "VoltageHigh" +#define D_CMND_CURRENTLOW "CurrentLow" +#define D_CMND_CURRENTHIGH "CurrentHigh" +#define D_CMND_ENERGYRESET "EnergyReset" +#define D_CMND_HLWPCAL "HlwPcal" +#define D_CMND_HLWPSET "HlwPset" +#define D_CMND_HLWUCAL "HlwUcal" +#define D_CMND_HLWUSET "HlwUset" +#define D_CMND_HLWICAL "HlwIcal" +#define D_CMND_HLWISET "HlwIset" +#define D_CMND_MAXPOWER "MaxPower" +#define D_CMND_MAXPOWERHOLD "MaxPowerHold" +#define D_CMND_MAXPOWERWINDOW "MaxPowerWindow" +#define D_CMND_SAFEPOWER "SafePower" +#define D_CMND_SAFEPOWERHOLD "SafePowerHold" +#define D_CMND_SAFEPOWERWINDOW "SafePowerWindow" +#define D_CMND_MAXENERGY "MaxEnergy" +#define D_CMND_MAXENERGYSTART "MaxEnergyStart" diff --git a/sonoff/settings.h b/sonoff/settings.h index f51f8c1f8..cd0df85e7 100644 --- a/sonoff/settings.h +++ b/sonoff/settings.h @@ -19,7 +19,7 @@ #define PARAM8_SIZE 23 // Number of param bytes -typedef union { // Restricted by MISRA-C Rule 18.4 but so usefull... +typedef union { // Restricted by MISRA-C Rule 18.4 but so usefull... uint32_t data; // Allow bit manipulation using SetOption struct { uint32_t savestate : 1; // bit 0 @@ -58,7 +58,7 @@ struct SYSCFG { unsigned long bootcount; sysBitfield flag; // Add flag since 5.0.2 int16_t savedata; - + int8_t timezone; char otaUrl[101]; @@ -98,7 +98,7 @@ struct SYSCFG { uint8_t param[PARAM8_SIZE]; // was domoticz_in_topic until 5.1.6 char state_text[4][11]; // was domoticz_out_topic until 5.1.6 - + uint16_t domoticz_update_timer; unsigned long domoticz_relay_idx[4]; unsigned long domoticz_key_idx[4]; @@ -115,14 +115,14 @@ struct SYSCFG { uint16_t hlw_umax; uint16_t hlw_imin; uint16_t hlw_imax; - uint16_t hlw_mpl; // MaxPowerLimit - uint16_t hlw_mplh; // MaxPowerLimitHold - uint16_t hlw_mplw; // MaxPowerLimitWindow - uint16_t hlw_mspl; // MaxSafePowerLimit - uint16_t hlw_msplh; // MaxSafePowerLimitHold - uint16_t hlw_msplw; // MaxSafePowerLimitWindow - uint16_t hlw_mkwh; // MaxEnergy - uint16_t hlw_mkwhs; // MaxEnergyStart + uint16_t hlw_mpl; // MaxPowerLimit + uint16_t hlw_mplh; // MaxPowerLimitHold + uint16_t hlw_mplw; // MaxPowerLimitWindow + uint16_t hlw_mspl; // MaxSafePowerLimit + uint16_t hlw_msplh; // MaxSafePowerLimitHold + uint16_t hlw_msplw; // MaxSafePowerLimitWindow + uint16_t hlw_mkwh; // MaxEnergy + uint16_t hlw_mkwhs; // MaxEnergyStart // 3.0.6 uint16_t mqtt_retry; // was ex_pulsetime until 4.0.4 @@ -217,8 +217,7 @@ struct RTCMEM { unsigned long pCounter[MAX_COUNTERS]; } rtcMem; -// See issue https://github.com/esp8266/Arduino/issues/2913 +// See issue https://github.com/esp8266/Arduino/issues/2913 #ifdef USE_ADC_VCC - ADC_MODE(ADC_VCC); // Set ADC input for Power Supply Voltage usage + ADC_MODE(ADC_VCC); // Set ADC input for Power Supply Voltage usage #endif - diff --git a/sonoff/settings.ino b/sonoff/settings.ino index 47a537a1b..844a3a595 100644 --- a/sonoff/settings.ino +++ b/sonoff/settings.ino @@ -81,7 +81,7 @@ boolean RTC_Valid() void RTC_Dump() { #define CFG_COLS 16 - + char log[LOGSZ]; uint16_t idx; uint16_t maxrow; @@ -186,7 +186,7 @@ uint32_t CFG_Address() void CFG_Save(byte rotate) { /* Save configuration in eeprom or one of 7 slots below - * + * * rotate 0 = Save in next flash slot * rotate 1 = Save only in eeprom flash slot until SetOption12 0 or restart * rotate 2 = Save in eeprom flash slot, erase next flash slots and continue depending on stop_flash_rotate @@ -224,7 +224,8 @@ void CFG_Save(byte rotate) delay(1); } } - snprintf_P(log, sizeof(log), PSTR("Cnfg: Save (%d bytes) to flash at %X and count %d"), sizeof(SYSCFG), _cfgLocation, sysCfg.saveFlag); + snprintf_P(log, sizeof(log), PSTR(D_LOG_CONFIG D_SAVED_TO_FLASH_AT " %X, " D_COUNT " %d, " D_BYTES " %d"), + _cfgLocation, sysCfg.saveFlag, sizeof(SYSCFG)); addLog(LOG_LEVEL_DEBUG, log); _cfgHash = getHash(); } @@ -259,7 +260,8 @@ void CFG_Load() } delay(1); } - snprintf_P(log, sizeof(log), PSTR("Cnfg: Load from flash at %X and count %d"), _cfgLocation, sysCfg.saveFlag); + snprintf_P(log, sizeof(log), PSTR(D_LOG_CONFIG D_LOADED_FROM_FLASH_AT " %X, " D_COUNT " %d"), + _cfgLocation, sysCfg.saveFlag); addLog(LOG_LEVEL_DEBUG, log); if (sysCfg.cfg_holder != CFG_HOLDER) { // Auto upgrade @@ -273,7 +275,7 @@ void CFG_Load() CFG_Default(); } } - + _cfgHash = getHash(); RTC_Load(); @@ -288,7 +290,7 @@ void CFG_Erase() uint32_t _sectorEnd = ESP.getFlashChipRealSize() / SPI_FLASH_SEC_SIZE; boolean _serialoutput = (LOG_LEVEL_DEBUG_MORE <= seriallog_level); - snprintf_P(log, sizeof(log), PSTR("Cnfg: Erase %d flash sectors"), _sectorEnd - _sectorStart); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_ERASE " %d " D_UNIT_SECTORS), _sectorEnd - _sectorStart); addLog(LOG_LEVEL_DEBUG, log); for (uint32_t _sector = _sectorStart; _sector < _sectorEnd; _sector++) { @@ -296,12 +298,12 @@ void CFG_Erase() result = spi_flash_erase_sector(_sector); interrupts(); if (_serialoutput) { - Serial.print(F("Flash: Erased sector ")); + Serial.print(F(D_LOG_APPLICATION D_ERASED_SECTOR " ")); Serial.print(_sector); if (SPI_FLASH_RESULT_OK == result) { - Serial.println(F(" OK")); + Serial.println(F(" " D_OK)); } else { - Serial.println(F(" Error")); + Serial.println(F(" " D_ERROR)); } delay(10); } @@ -311,7 +313,7 @@ void CFG_Erase() void CFG_Dump(char* parms) { #define CFG_COLS 16 - + char log[LOGSZ]; uint16_t idx; uint16_t maxrow; @@ -364,7 +366,7 @@ void CFG_Dump(char* parms) void CFG_Default() { - addLog_P(LOG_LEVEL_NONE, PSTR("Cnfg: Use defaults")); + addLog_P(LOG_LEVEL_NONE, PSTR(D_LOG_CONFIG D_USE_DEFAULTS)); CFG_DefaultSet1(); CFG_DefaultSet2(); CFG_Save(2); @@ -379,11 +381,11 @@ void CFG_DefaultSet1() sysCfg.version = VERSION; // sysCfg.bootcount = 0; } - + void CFG_DefaultSet2() { memset((char*)&sysCfg +16, 0x00, sizeof(SYSCFG) -16); - + sysCfg.flag.savestate = SAVE_STATE; sysCfg.savedata = SAVE_DATA; sysCfg.timezone = APP_TIMEZONE; @@ -504,7 +506,7 @@ void CFG_DefaultSet2() // 5.4.1 memcpy_P(sysCfg.sfb_code[0], sfb_codeDefault, 9); - + } /********************************************************************************************/ @@ -619,7 +621,7 @@ void CFG_Delta() strlcpy(sysCfg.friendlyname[1], FRIENDLY_NAME"2", sizeof(sysCfg.friendlyname[1])); strlcpy(sysCfg.friendlyname[2], FRIENDLY_NAME"3", sizeof(sysCfg.friendlyname[2])); strlcpy(sysCfg.friendlyname[3], FRIENDLY_NAME"4", sizeof(sysCfg.friendlyname[3])); - } + } if (sysCfg.version < 0x03020800) { // 3.2.8 - Add parameter strlcpy(sysCfg.switch_topic, sysCfg.button_topic, sizeof(sysCfg.switch_topic)); sysCfg.ex_mqtt_switch_retain = MQTT_SWITCH_RETAIN; @@ -713,7 +715,7 @@ void CFG_Delta() } memcpy_P(sysCfg.sfb_code[0], sfb_codeDefault, 9); } - + sysCfg.version = VERSION; CFG_Save(1); } diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 9e04fdee4..c77c2ae55 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,7 +25,7 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x05060108 // 5.6.1h +#define VERSION 0x05060109 // 5.6.1i enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL}; enum week_t {Last, First, Second, Third, Fourth}; @@ -36,10 +36,10 @@ enum swtch_t {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTON enum led_t {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQTTPUB, LED_POWER_MQTTPUB, LED_MQTT, LED_POWER_MQTT, MAX_LED_OPTION}; enum emul_t {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX}; -#include "sonoff_template.h" - #include "user_config.h" #include "user_config_override.h" +#include "i18n.h" +#include "sonoff_template.h" /*********************************************************************************************\ * No user configurable items below @@ -188,17 +188,6 @@ enum opt_t {P_HOLD_TIME, P_MAX_POWER_RETRY, P_MAX_PARAM8}; // Index in sysCf #endif // USE_SPI #include "settings.h" -#define MAX_BUTTON_COMMANDS 5 // Max number of button commands supported -const char commands[MAX_BUTTON_COMMANDS][14] PROGMEM = { - {"wificonfig 1"}, // Press button three times - {"wificonfig 2"}, // Press button four times - {"wificonfig 3"}, // Press button five times - {"restart 1"}, // Press button six times - {"upgrade 1"}}; // Press button seven times - -const char wificfg[5][12] PROGMEM = { "Restart", "Smartconfig", "Wifimanager", "WPSconfig", "Retry" }; -const char PREFIXES[3][5] PROGMEM = { "cmnd", "stat", "tele" }; - struct TIME_T { uint8_t Second; uint8_t Minute; @@ -342,7 +331,7 @@ void getTopic_P(char *stopic, byte prefix, char *topic, const char* subtopic) { char romram[CMDSZ]; String fulltopic; - + snprintf_P(romram, sizeof(romram), subtopic); if (fallbacktopic) { fulltopic = FPSTR(PREFIXES[prefix]); @@ -460,13 +449,13 @@ void mqtt_publish_sec(const char* topic, const char* data, boolean retained) if (sysCfg.flag.mqtt_enabled) { if (mqttClient.publish(topic, data, retained)) { - snprintf_P(log, sizeof(log), PSTR("MQTT: %s = %s%s"), topic, data, (retained) ? " (retained)" : ""); + snprintf_P(log, sizeof(log), PSTR(D_LOG_MQTT "%s = %s%s"), topic, data, (retained) ? " (" D_RETAINED ")" : ""); // mqttClient.loop(); // Do not use here! Will block previous publishes } else { - snprintf_P(log, sizeof(log), PSTR("RSLT: %s = %s"), topic, data); + snprintf_P(log, sizeof(log), PSTR(D_LOG_RESULT "%s = %s"), topic, data); } } else { - snprintf_P(log, sizeof(log), PSTR("RSLT: %s = %s"), strrchr(topic,'/')+1, data); + snprintf_P(log, sizeof(log), PSTR(D_LOG_RESULT "%s = %s"), strrchr(topic,'/')+1, data); } addLog(LOG_LEVEL_INFO, log); @@ -503,9 +492,12 @@ void mqtt_publish_topic_P(uint8_t prefix, const char* subtopic, const char* data * prefix 6 = tele using subtopic or RESULT */ char romram[16]; - char stopic[TOPSZ]; + char stopic[TOPSZ]; - snprintf_P(romram, sizeof(romram), ((prefix > 3) && !sysCfg.flag.mqtt_response) ? PSTR("RESULT") : subtopic); + snprintf_P(romram, sizeof(romram), ((prefix > 3) && !sysCfg.flag.mqtt_response) ? S_RSLT_RESULT : subtopic); + for (byte i = 0; i < strlen(romram); i++) { + romram[i] = toupper(romram[i]); + } prefix &= 3; getTopic_P(stopic, prefix, sysCfg.mqtt_topic, romram); mqtt_publish(stopic, data, retained); @@ -519,20 +511,17 @@ void mqtt_publish_topic_P(uint8_t prefix, const char* subtopic, const char* data void mqtt_publishPowerState(byte device) { char stopic[TOPSZ]; - char sdevice[10]; - char scommand[10]; + char scommand[16]; char svalue[64]; // was MESSZ if ((device < 1) || (device > Maxdevice)) { device = 1; } - snprintf_P(sdevice, sizeof(sdevice), PSTR("%d"), device); - snprintf_P(scommand, sizeof(scommand), PSTR("POWER%s"), (Maxdevice > 1) ? sdevice : ""); - - getTopic_P(stopic, 1, sysCfg.mqtt_topic, (sysCfg.flag.mqtt_response)?"POWER":"RESULT"); + getPowerDevice(scommand, device, sizeof(scommand)); + getTopic_P(stopic, 1, sysCfg.mqtt_topic, (sysCfg.flag.mqtt_response) ? scommand : S_RSLT_RESULT); snprintf_P(svalue, sizeof(svalue), PSTR("{\"%s\":\"%s\"}"), scommand, getStateText(bitRead(power, device -1))); mqtt_publish(stopic, svalue); - + getTopic_P(stopic, 1, sysCfg.mqtt_topic, scommand); snprintf_P(svalue, sizeof(svalue), PSTR("%s"), getStateText(bitRead(power, device -1))); mqtt_publish(stopic, svalue, sysCfg.flag.mqtt_power_retain); @@ -540,16 +529,16 @@ void mqtt_publishPowerState(byte device) void mqtt_publishPowerBlinkState(byte device) { - char sdevice[10]; + char scommand[16]; char svalue[64]; // was MESSZ if ((device < 1) || (device > Maxdevice)) { device = 1; } - snprintf_P(sdevice, sizeof(sdevice), PSTR("%d"), device); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"POWER%s\":\"BLINK %s\"}"), - (Maxdevice > 1) ? sdevice : "", getStateText(bitRead(blink_mask, device -1))); - mqtt_publish_topic_P(5, PSTR("POWER"), svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"%s\":\"" D_BLINK " %s\"}"), + getPowerDevice(scommand, device, sizeof(scommand)), getStateText(bitRead(blink_mask, device -1))); + + mqtt_publish_topic_P(5, S_RSLT_POWER, svalue); } void mqtt_connected() @@ -561,8 +550,8 @@ void mqtt_connected() // Satisfy iobroker (#299) svalue[0] = '\0'; - mqtt_publish_topic_P(0, PSTR("POWER"), svalue); - + mqtt_publish_topic_P(0, S_RSLT_POWER, svalue); + getTopic_P(stopic, 0, sysCfg.mqtt_topic, PSTR("#")); mqttClient.subscribe(stopic); mqttClient.loop(); // Solve LmacRxBlk:1 messages @@ -582,19 +571,19 @@ void mqtt_connected() } if (mqttflag) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Module\":\"%s\", \"Version\":\"%s\", \"FallbackTopic\":\"%s\", \"GroupTopic\":\"%s\"}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_MODULE "\":\"%s\", \"" D_VERSION "\":\"%s\", \"" D_FALLBACKTOPIC "\":\"%s\", \"" D_CMND_GROUPTOPIC "\":\"%s\"}"), my_module.name, Version, MQTTClient, sysCfg.mqtt_grptopic); - mqtt_publish_topic_P(2, PSTR("INFO1"), svalue); + mqtt_publish_topic_P(2, PSTR(D_RSLT_INFO "1"), svalue); #ifdef USE_WEBSERVER if (sysCfg.webserver) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebserverMode\":\"%s\", \"Hostname\":\"%s\", \"IPaddress\":\"%s\"}"), - (2 == sysCfg.webserver) ? "Admin" : "User", Hostname, WiFi.localIP().toString().c_str()); - mqtt_publish_topic_P(2, PSTR("INFO2"), svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_WEBSERVER_MODE "\":\"%s\", \"" D_CMND_HOSTNAME "\":\"%s\", \"" D_CMND_IPADDRESS "\":\"%s\"}"), + (2 == sysCfg.webserver) ? D_ADMIN : D_USER, Hostname, WiFi.localIP().toString().c_str()); + mqtt_publish_topic_P(2, PSTR(D_RSLT_INFO "2"), svalue); } #endif // USE_WEBSERVER - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Started\":\"%s\"}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_RESTARTREASON "\":\"%s\"}"), (getResetReason() == "Exception") ? ESP.getResetInfo().c_str() : getResetReason().c_str()); - mqtt_publish_topic_P(2, PSTR("INFO3"), svalue); + mqtt_publish_topic_P(2, PSTR(D_RSLT_INFO "3"), svalue); if (sysCfg.tele_period) { tele_period = sysCfg.tele_period -9; } @@ -623,17 +612,17 @@ void mqtt_reconnect() #endif // USE_EMULATION if (mqttflag > 1) { #ifdef USE_MQTT_TLS - addLog_P(LOG_LEVEL_INFO, PSTR("MQTT: Verify TLS fingerprint...")); + addLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_FINGERPRINT)); if (!espClient.connect(sysCfg.mqtt_host, sysCfg.mqtt_port)) { - snprintf_P(log, sizeof(log), PSTR("MQTT: TLS Connect FAILED to %s:%d. Retry in %d seconds"), + snprintf_P(log, sizeof(log), PSTR(D_LOG_MQTT D_TLS_CONNECT_FAILED_TO " %s:%d. " D_RETRY_IN " %d " D_UNIT_SECOND), sysCfg.mqtt_host, sysCfg.mqtt_port, mqttcounter); addLog(LOG_LEVEL_DEBUG, log); return; } if (espClient.verify(sysCfg.mqtt_fingerprint, sysCfg.mqtt_host)) { - addLog_P(LOG_LEVEL_INFO, PSTR("MQTT: Verified")); + addLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_VERIFIED)); } else { - addLog_P(LOG_LEVEL_DEBUG, PSTR("MQTT: Insecure connection due to invalid Fingerprint")); + addLog_P(LOG_LEVEL_DEBUG, S_LOG_MQTT, PSTR(D_INSECURE)); } #endif // USE_MQTT_TLS mqttClient.setCallback(mqttDataCb); @@ -642,7 +631,7 @@ void mqtt_reconnect() return; } - addLog_P(LOG_LEVEL_INFO, PSTR("MQTT: Attempting connection...")); + addLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_ATTEMPTING_CONNECTION)); #ifndef USE_MQTT_TLS #ifdef USE_DISCOVERY #ifdef MQTT_HOST_DISCOVERY @@ -652,16 +641,16 @@ void mqtt_reconnect() #endif // USE_MQTT_TLS mqttClient.setServer(sysCfg.mqtt_host, sysCfg.mqtt_port); - getTopic_P(stopic, 2, sysCfg.mqtt_topic, PSTR("LWT")); - snprintf_P(svalue, sizeof(svalue), PSTR("Offline")); + getTopic_P(stopic, 2, sysCfg.mqtt_topic, S_LWT); + snprintf_P(svalue, sizeof(svalue), S_OFFLINE); if (mqttClient.connect(MQTTClient, sysCfg.mqtt_user, sysCfg.mqtt_pwd, stopic, 1, true, svalue)) { - addLog_P(LOG_LEVEL_INFO, PSTR("MQTT: Connected")); + addLog_P(LOG_LEVEL_INFO, S_LOG_MQTT, PSTR(D_CONNECTED)); mqttcounter = 0; - snprintf_P(svalue, sizeof(svalue), PSTR("Online")); + snprintf_P(svalue, sizeof(svalue), PSTR(D_ONLINE)); mqtt_publish(stopic, svalue, true); mqtt_connected(); } else { - snprintf_P(log, sizeof(log), PSTR("MQTT: Connect FAILED to %s:%d, rc %d. Retry in %d seconds"), + snprintf_P(log, sizeof(log), PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND), sysCfg.mqtt_host, sysCfg.mqtt_port, mqttClient.state(), mqttcounter); //status codes are documented here http://pubsubclient.knolleary.net/api.html#state addLog(LOG_LEVEL_INFO, log); } @@ -676,29 +665,29 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, char stemp2[10]; char scommand[CMDSZ]; uint16_t i; - - if (!strcmp_P(type,PSTR("MQTTHOST"))) { + + if (!strcasecmp_P(type, PSTR(D_CMND_MQTTHOST))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_host))) { strlcpy(sysCfg.mqtt_host, (1 == payload) ? MQTT_HOST : dataBuf, sizeof(sysCfg.mqtt_host)); restartflag = 2; } - snprintf_P(svalue, ssvalue, PSTR("{\"MqttHost\",\"%s\"}"), sysCfg.mqtt_host); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MQTTHOST "\":\"%s\"}"), sysCfg.mqtt_host); } - else if (!strcmp_P(type,PSTR("MQTTPORT"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_MQTTPORT))) { if ((payload > 0) && (payload < 32766)) { sysCfg.mqtt_port = (1 == payload) ? MQTT_PORT : payload; restartflag = 2; } - snprintf_P(svalue, ssvalue, PSTR("{\"MqttPort\":%d}"), sysCfg.mqtt_port); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MQTTPORT "\":%d}"), sysCfg.mqtt_port); } - else if (!strcmp_P(type,PSTR("MQTTRETRY"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_MQTTRETRY))) { if ((payload >= MQTT_RETRY_SECS) && (payload < 32001)) { sysCfg.mqtt_retry = payload; mqttcounter = sysCfg.mqtt_retry; } - snprintf_P(svalue, ssvalue, PSTR("{\"MqttRetry\":%d}"), sysCfg.mqtt_retry); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MQTTRETRY "\":%d}"), sysCfg.mqtt_retry); } - else if (!strcmp_P(type,PSTR("STATETEXT")) && (index > 0) && (index <= 4)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_STATETEXT)) && (index > 0) && (index <= 4)) { if ((data_len > 0) && (data_len < sizeof(sysCfg.state_text[0]))) { for(i = 0; i <= data_len; i++) { if (dataBuf[i] == ' ') { @@ -707,39 +696,39 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, } strlcpy(sysCfg.state_text[index -1], dataBuf, sizeof(sysCfg.state_text[0])); } - snprintf_P(svalue, ssvalue, PSTR("{\"StateText%d\":\"%s\"}"), index, getStateText(index -1)); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_STATETEXT "%d\":\"%s\"}"), index, getStateText(index -1)); } #ifdef USE_MQTT_TLS - else if (!strcmp_P(type,PSTR("MQTTFINGERPRINT"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_MQTTFINGERPRINT))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_fingerprint))) { strlcpy(sysCfg.mqtt_fingerprint, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_FINGERPRINT : dataBuf, sizeof(sysCfg.mqtt_fingerprint)); restartflag = 2; } - snprintf_P(svalue, ssvalue, PSTR("{\"MqttFingerprint\":\"%s\"}"), sysCfg.mqtt_fingerprint); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MQTTFINGERPRINT "\":\"%s\"}"), sysCfg.mqtt_fingerprint); } #endif - else if (!grpflg && !strcmp_P(type,PSTR("MQTTCLIENT"))) { + else if (!grpflg && !strcasecmp_P(type, PSTR(D_CMND_MQTTCLIENT))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_client))) { strlcpy(sysCfg.mqtt_client, (1 == payload) ? MQTT_CLIENT_ID : dataBuf, sizeof(sysCfg.mqtt_client)); restartflag = 2; } - snprintf_P(svalue, ssvalue, PSTR("{\"MqttClient\":\"%s\"}"), sysCfg.mqtt_client); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MQTTCLIENT "\":\"%s\"}"), sysCfg.mqtt_client); } - else if (!strcmp_P(type,PSTR("MQTTUSER"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_MQTTUSER))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_user))) { strlcpy(sysCfg.mqtt_user, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_USER : dataBuf, sizeof(sysCfg.mqtt_user)); restartflag = 2; } - snprintf_P(svalue, ssvalue, PSTR("{\"MqttUser\":\"%s\"}"), sysCfg.mqtt_user); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MQTTUSER "\":\"%s\"}"), sysCfg.mqtt_user); } - else if (!strcmp_P(type,PSTR("MQTTPASSWORD"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_MQTTPASSWORD))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_pwd))) { strlcpy(sysCfg.mqtt_pwd, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_PASS : dataBuf, sizeof(sysCfg.mqtt_pwd)); restartflag = 2; } - snprintf_P(svalue, ssvalue, PSTR("{\"MqttPassword\":\"%s\"}"), sysCfg.mqtt_pwd); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MQTTPASSWORD "\":\"%s\"}"), sysCfg.mqtt_pwd); } - else if (!strcmp_P(type,PSTR("FULLTOPIC"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_FULLTOPIC))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_fulltopic))) { mqttfy(1, dataBuf); if (!strcmp(dataBuf, MQTTClient)) { @@ -747,23 +736,23 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, } strlcpy(stemp1, (1 == payload) ? MQTT_FULLTOPIC : dataBuf, sizeof(stemp1)); if (strcmp(stemp1, sysCfg.mqtt_fulltopic)) { - mqtt_publish_topic_P(2, PSTR("LWT"), (sysCfg.flag.mqtt_offline) ? "Offline" : "", true); // Offline or remove previous retained topic + mqtt_publish_topic_P(2, PSTR(D_LWT), (sysCfg.flag.mqtt_offline) ? D_OFFLINE : "", true); // Offline or remove previous retained topic strlcpy(sysCfg.mqtt_fulltopic, stemp1, sizeof(sysCfg.mqtt_fulltopic)); restartflag = 2; } } - snprintf_P(svalue, ssvalue, PSTR("{\"FullTopic\":\"%s\"}"), sysCfg.mqtt_fulltopic); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_FULLTOPIC "\":\"%s\"}"), sysCfg.mqtt_fulltopic); } - else if (!strcmp_P(type,PSTR("PREFIX")) && (index > 0) && (index <= 3)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_PREFIX)) && (index > 0) && (index <= 3)) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_prefix[0]))) { mqttfy(0, dataBuf); strlcpy(sysCfg.mqtt_prefix[index -1], (1 == payload) ? (1==index)?SUB_PREFIX:(2==index)?PUB_PREFIX:PUB_PREFIX2 : dataBuf, sizeof(sysCfg.mqtt_prefix[0])); // if (sysCfg.mqtt_prefix[index -1][strlen(sysCfg.mqtt_prefix[index -1])] == '/') sysCfg.mqtt_prefix[index -1][strlen(sysCfg.mqtt_prefix[index -1])] = 0; restartflag = 2; } - snprintf_P(svalue, ssvalue, PSTR("{\"Prefix%d\":\"%s\"}"), index, sysCfg.mqtt_prefix[index -1]); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_PREFIX "%d\":\"%s\"}"), index, sysCfg.mqtt_prefix[index -1]); } - else if (!strcmp_P(type,PSTR("GROUPTOPIC"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_GROUPTOPIC))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_grptopic))) { mqttfy(0, dataBuf); if (!strcmp(dataBuf, MQTTClient)) { @@ -772,9 +761,9 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, strlcpy(sysCfg.mqtt_grptopic, (1 == payload) ? MQTT_GRPTOPIC : dataBuf, sizeof(sysCfg.mqtt_grptopic)); restartflag = 2; } - snprintf_P(svalue, ssvalue, PSTR("{\"GroupTopic\":\"%s\"}"), sysCfg.mqtt_grptopic); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_GROUPTOPIC "\":\"%s\"}"), sysCfg.mqtt_grptopic); } - else if (!grpflg && !strcmp_P(type,PSTR("TOPIC"))) { + else if (!grpflg && !strcasecmp_P(type, PSTR(D_CMND_TOPIC))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_topic))) { mqttfy(0, dataBuf); if (!strcmp(dataBuf, MQTTClient)) { @@ -782,14 +771,14 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, } strlcpy(stemp1, (1 == payload) ? MQTT_TOPIC : dataBuf, sizeof(stemp1)); if (strcmp(stemp1, sysCfg.mqtt_topic)) { - mqtt_publish_topic_P(2, PSTR("LWT"), (sysCfg.flag.mqtt_offline) ? "Offline" : "", true); // Offline or remove previous retained topic + mqtt_publish_topic_P(2, PSTR(D_LWT), (sysCfg.flag.mqtt_offline) ? D_OFFLINE : "", true); // Offline or remove previous retained topic strlcpy(sysCfg.mqtt_topic, stemp1, sizeof(sysCfg.mqtt_topic)); restartflag = 2; } } - snprintf_P(svalue, ssvalue, PSTR("{\"Topic\":\"%s\"}"), sysCfg.mqtt_topic); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_TOPIC "\":\"%s\"}"), sysCfg.mqtt_topic); } - else if (!grpflg && !strcmp_P(type,PSTR("BUTTONTOPIC"))) { + else if (!grpflg && !strcasecmp_P(type, PSTR(D_CMND_BUTTONTOPIC))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.button_topic))) { mqttfy(0, dataBuf); if (!strcmp(dataBuf, MQTTClient)) { @@ -797,9 +786,9 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, } strlcpy(sysCfg.button_topic, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? sysCfg.mqtt_topic : dataBuf, sizeof(sysCfg.button_topic)); } - snprintf_P(svalue, ssvalue, PSTR("{\"ButtonTopic\":\"%s\"}"), sysCfg.button_topic); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_BUTTONTOPIC "\":\"%s\"}"), sysCfg.button_topic); } - else if (!grpflg && !strcmp_P(type,PSTR("SWITCHTOPIC"))) { + else if (!grpflg && !strcasecmp_P(type, PSTR(D_CMND_SWITCHTOPIC))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.switch_topic))) { mqttfy(0, dataBuf); if (!strcmp(dataBuf, MQTTClient)) { @@ -807,9 +796,9 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, } strlcpy(sysCfg.switch_topic, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? sysCfg.mqtt_topic : dataBuf, sizeof(sysCfg.switch_topic)); } - snprintf_P(svalue, ssvalue, PSTR("{\"SwitchTopic\":\"%s\"}"), sysCfg.switch_topic); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SWITCHTOPIC "\":\"%s\"}"), sysCfg.switch_topic); } - else if (!strcmp_P(type,PSTR("BUTTONRETAIN"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_BUTTONRETAIN))) { if ((payload >= 0) && (payload <= 1)) { strlcpy(sysCfg.button_topic, sysCfg.mqtt_topic, sizeof(sysCfg.button_topic)); if (!payload) { @@ -819,9 +808,9 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, } sysCfg.flag.mqtt_button_retain = payload; } - snprintf_P(svalue, ssvalue, PSTR("{\"ButtonRetain\":\"%s\"}"), getStateText(sysCfg.flag.mqtt_button_retain)); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_BUTTONRETAIN "\":\"%s\"}"), getStateText(sysCfg.flag.mqtt_button_retain)); } - else if (!strcmp_P(type,PSTR("SWITCHRETAIN"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SWITCHRETAIN))) { if ((payload >= 0) && (payload <= 1)) { strlcpy(sysCfg.button_topic, sysCfg.mqtt_topic, sizeof(sysCfg.button_topic)); if (!payload) { @@ -831,31 +820,29 @@ boolean mqtt_command(boolean grpflg, char *type, uint16_t index, char *dataBuf, } sysCfg.flag.mqtt_switch_retain = payload; } - snprintf_P(svalue, ssvalue, PSTR("{\"SwitchRetain\":\"%s\"}"), getStateText(sysCfg.flag.mqtt_switch_retain)); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SWITCHRETAIN "\":\"%s\"}"), getStateText(sysCfg.flag.mqtt_switch_retain)); } - else if (!strcmp_P(type,PSTR("POWERRETAIN"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_POWERRETAIN))) { if ((payload >= 0) && (payload <= 1)) { if (!payload) { for(i = 1; i <= Maxdevice; i++) { // Clear MQTT retain in broker - snprintf_P(stemp2, sizeof(stemp2), PSTR("%d"), i); - snprintf_P(scommand, sizeof(scommand), PSTR("POWER%s"), (Maxdevice > 1) ? stemp2 : ""); - getTopic_P(stemp1, 1, sysCfg.mqtt_topic, scommand); + getTopic_P(stemp1, 1, sysCfg.mqtt_topic, getPowerDevice(scommand, i, sizeof(scommand))); mqtt_publish(stemp1, "", sysCfg.flag.mqtt_power_retain); } } sysCfg.flag.mqtt_power_retain = payload; } - snprintf_P(svalue, ssvalue, PSTR("{\"PowerRetain\":\"%s\"}"), getStateText(sysCfg.flag.mqtt_power_retain)); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_POWERRETAIN "\":\"%s\"}"), getStateText(sysCfg.flag.mqtt_power_retain)); } - else if (!strcmp_P(type,PSTR("SENSORRETAIN"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SENSORRETAIN))) { if ((payload >= 0) && (payload <= 1)) { if (!payload) { svalue[0] = '\0'; - mqtt_publish_topic_P(2, PSTR("SENSOR"), svalue, sysCfg.flag.mqtt_sensor_retain); + mqtt_publish_topic_P(2, PSTR(D_RSLT_SENSOR), svalue, sysCfg.flag.mqtt_sensor_retain); } sysCfg.flag.mqtt_sensor_retain = payload; } - snprintf_P(svalue, ssvalue, PSTR("{\"SensorRetain\":\"%s\"}"), getStateText(sysCfg.flag.mqtt_sensor_retain)); + snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SENSORRETAIN "\":\"%s\"}"), getStateText(sysCfg.flag.mqtt_sensor_retain)); } #ifdef USE_DOMOTICZ @@ -879,7 +866,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) str = strstr(topic,sysCfg.mqtt_prefix[0]); if ((str == topic) && mqtt_cmnd_publish) { if (mqtt_cmnd_publish > 8) { - mqtt_cmnd_publish -= 8; + mqtt_cmnd_publish -= 8; } else { mqtt_cmnd_publish = 0; } @@ -906,7 +893,8 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) memcpy(dataBuf, data, sizeof(dataBuf)); dataBuf[sizeof(dataBuf)-1] = 0; - snprintf_P(svalue, sizeof(svalue), PSTR("RSLT: Receive topic %s, data size %d, data %s"), topicBuf, data_len, dataBuf); + snprintf_P(svalue, sizeof(svalue), PSTR(D_LOG_RESULT D_RECEIVED_TOPIC " %s, " D_DATA_SIZE " %d, " D_DATA " %s"), + topicBuf, data_len, dataBuf); addLog(LOG_LEVEL_DEBUG_MORE, svalue); // if (LOG_LEVEL_DEBUG_MORE <= seriallog_level) Serial.println(dataBuf); @@ -940,12 +928,12 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) dataBufUc[i] = toupper(dataBuf[i]); } - snprintf_P(svalue, sizeof(svalue), PSTR("RSLT: DataCb Group %d, Index %d, Type %s, Data %s (%s)"), + snprintf_P(svalue, sizeof(svalue), PSTR(D_LOG_RESULT D_GROUP " %d, " D_INDEX " %d, " D_COMMAND " %s, " D_DATA " %s (%s)"), grpflg, index, type, dataBuf, dataBufUc); addLog(LOG_LEVEL_DEBUG, svalue); if (type != NULL) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Command\":\"Error\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_COMMAND "\":\"" D_ERROR "\"}")); if (sysCfg.ledstate &0x02) { blinks++; } @@ -962,26 +950,26 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } blogdelay = MIN_BACKLOG_DELAY; // Reset backlog delay - if (!strcmp_P(dataBufUc,PSTR("OFF")) || !strcmp_P(dataBufUc,PSTR("FALSE")) || !strcmp_P(dataBufUc,PSTR("STOP")) || !strcmp_P(dataBufUc,PSTR("CELSIUS"))) { + if (!strcasecmp_P(dataBuf, PSTR(D_OFF)) || !strcasecmp_P(dataBuf, PSTR(D_FALSE)) || !strcasecmp_P(dataBuf, PSTR(D_STOP)) || !strcasecmp_P(dataBuf, PSTR(D_CELSIUS))) { payload = 0; } - if (!strcmp_P(dataBufUc,PSTR("ON")) || !strcmp_P(dataBufUc,PSTR("TRUE")) || !strcmp_P(dataBufUc,PSTR("START")) || !strcmp_P(dataBufUc,PSTR("FAHRENHEIT")) || !strcmp_P(dataBufUc,PSTR("USER"))) { + if (!strcasecmp_P(dataBuf, PSTR(D_ON)) || !strcasecmp_P(dataBuf, PSTR(D_TRUE)) || !strcasecmp_P(dataBuf, PSTR(D_START)) || !strcasecmp_P(dataBuf, PSTR(D_FAHRENHEIT)) || !strcasecmp_P(dataBuf, PSTR(D_USER))) { payload = 1; } - if (!strcmp_P(dataBufUc,PSTR("TOGGLE")) || !strcmp_P(dataBufUc,PSTR("ADMIN"))) { + if (!strcasecmp_P(dataBuf, PSTR(D_TOGGLE)) || !strcasecmp_P(dataBuf, PSTR(D_ADMIN))) { payload = 2; } - if (!strcmp_P(dataBufUc,PSTR("BLINK"))) { + if (!strcasecmp_P(dataBuf, PSTR(D_BLINK))) { payload = 3; } - if (!strcmp_P(dataBufUc,PSTR("BLINKOFF"))) { + if (!strcasecmp_P(dataBuf, PSTR(D_BLINKOFF))) { payload = 4; } // snprintf_P(svalue, sizeof(svalue), PSTR("RSLT: Payload %d, Payload16 %d"), payload, payload16); // addLog(LOG_LEVEL_DEBUG, svalue); - if (!strcmp_P(type,PSTR("BACKLOG"))) { + if (!strcasecmp_P(type, PSTR(D_CMND_BACKLOG))) { if (data_len) { char *blcommand = strtok(dataBuf, ";"); while (blcommand != NULL) { @@ -995,20 +983,20 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) blogidx &= 0xF; blcommand = strtok(NULL, ";"); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Backlog\":\"Appended\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_BACKLOG "\":\"" D_APPENDED "\"}")); } else { uint8_t blflag = (blogptr == blogidx); blogptr = blogidx; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Backlog\":\"%s\"}"), blflag ? "Empty" : "Aborted"); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_BACKLOG "\":\"%s\"}"), blflag ? D_EMPTY : D_ABORTED); } } - else if (!strcmp_P(type,PSTR("DELAY"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_DELAY))) { if ((payload >= MIN_BACKLOG_DELAY) && (payload <= 3600)) { blogdelay = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Delay\":%d}"), blogdelay); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_DELAY "\":%d}"), blogdelay); } - else if (!strcmp_P(type,PSTR("POWER")) && (index > 0) && (index <= Maxdevice)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_POWER)) && (index > 0) && (index <= Maxdevice)) { if ((payload < 0) || (payload > 4)) { payload = 9; } @@ -1016,7 +1004,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) fallbacktopic = 0; return; } - else if (!strcmp_P(type,PSTR("STATUS"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_STATUS))) { if ((payload < 0) || (payload > MAX_STATUS)) { payload = 99; } @@ -1024,7 +1012,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) fallbacktopic = 0; return; } - else if ((sysCfg.module != MOTOR) && !strcmp_P(type,PSTR("POWERONSTATE"))) { + else if ((sysCfg.module != MOTOR) && !strcasecmp_P(type, PSTR(D_CMND_POWERONSTATE))) { /* 0 = Keep relays off after power on * 1 = Turn relays on after power on * 2 = Toggle relays after power on @@ -1039,37 +1027,37 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } } } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"PowerOnState\":%d}"), sysCfg.poweronstate); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_POWERONSTATE "\":%d}"), sysCfg.poweronstate); } - else if (!strcmp_P(type,PSTR("PULSETIME")) && (index > 0) && (index <= MAX_PULSETIMERS)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_PULSETIME)) && (index > 0) && (index <= MAX_PULSETIMERS)) { if (data_len > 0) { sysCfg.pulsetime[index -1] = payload16; // 0 - 65535 pulse_timer[index -1] = 0; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"PulseTime%d\":%d}"), index, sysCfg.pulsetime[index -1]); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_PULSETIME "%d\":%d}"), index, sysCfg.pulsetime[index -1]); } - else if (!strcmp_P(type,PSTR("BLINKTIME"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_BLINKTIME))) { if ((payload > 2) && (payload <= 3600)) { sysCfg.blinktime = payload; if (blink_timer) { blink_timer = sysCfg.blinktime; } } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"BlinkTime\":%d}"), sysCfg.blinktime); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_BLINKTIME "\":%d}"), sysCfg.blinktime); } - else if (!strcmp_P(type,PSTR("BLINKCOUNT"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_BLINKCOUNT))) { if (data_len > 0) { sysCfg.blinkcount = payload16; // 0 - 65535 if (blink_counter) { blink_counter = sysCfg.blinkcount *2; } } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"BlinkCount\":%d}"), sysCfg.blinkcount); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_BLINKCOUNT "\":%d}"), sysCfg.blinkcount); } else if (sfl_flg && sl_command(type, index, dataBufUc, data_len, payload, svalue, sizeof(svalue))) { // Serviced } - else if (!strcmp_P(type,PSTR("SAVEDATA"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SAVEDATA))) { if ((payload >= 0) && (payload <= 3600)) { sysCfg.savedata = payload; savedatacounter = sysCfg.savedata; @@ -1079,11 +1067,11 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } CFG_Save(0); if (sysCfg.savedata > 1) { - snprintf_P(stemp1, sizeof(stemp1), PSTR("Every %d seconds"), sysCfg.savedata); + snprintf_P(stemp1, sizeof(stemp1), PSTR(D_EVERY " %d " D_UNIT_SECOND), sysCfg.savedata); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"SaveData\":\"%s\"}"), (sysCfg.savedata > 1) ? stemp1 : getStateText(sysCfg.savedata)); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_SAVEDATA "\":\"%s\"}"), (sysCfg.savedata > 1) ? stemp1 : getStateText(sysCfg.savedata)); } - else if (!strcmp_P(type,PSTR("SETOPTION")) && ((index >= 0) && (index <= 14)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SETOPTION)) && ((index >= 0) && (index <= 14)) || ((index > 31) && (index <= P_MAX_PARAM8 +31))) { if (index <= 31) { ptype = 0; // SetOption0 .. 31 } else { @@ -1132,45 +1120,45 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) if (ptype) { snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), sysCfg.param[index]); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"SetOption%d\":\"%s\"}"), (ptype) ? index +32 : index, (ptype) ? stemp1 : getStateText(bitRead(sysCfg.flag.data, index))); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_SETOPTION "%d\":\"%s\"}"), (ptype) ? index +32 : index, (ptype) ? stemp1 : getStateText(bitRead(sysCfg.flag.data, index))); } - else if (!strcmp_P(type,PSTR("TEMPRES"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_TEMPERATURE_RESOLUTION))) { if ((payload >= 0) && (payload <= 3)) { sysCfg.flag.temperature_resolution = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"TempRes\":%d}"), sysCfg.flag.temperature_resolution); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_TEMPERATURE_RESOLUTION "\":%d}"), sysCfg.flag.temperature_resolution); } - else if (!strcmp_P(type,PSTR("HUMRES"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_HUMIDITY_RESOLUTION))) { if ((payload >= 0) && (payload <= 3)) { sysCfg.flag.humidity_resolution = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"HumRes\":%d}"), sysCfg.flag.humidity_resolution); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_HUMIDITY_RESOLUTION "\":%d}"), sysCfg.flag.humidity_resolution); } - else if (!strcmp_P(type,PSTR("PRESSRES"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_PRESSURE_RESOLUTION))) { if ((payload >= 0) && (payload <= 3)) { sysCfg.flag.pressure_resolution = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"PressRes\":%d}"), sysCfg.flag.pressure_resolution); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_PRESSURE_RESOLUTION "\":%d}"), sysCfg.flag.pressure_resolution); } - else if (!strcmp_P(type,PSTR("WATTRES"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_POWER_RESOLUTION))) { if ((payload >= 0) && (payload <= 1)) { sysCfg.flag.wattage_resolution = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"WattRes\":%d}"), sysCfg.flag.wattage_resolution); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_POWER_RESOLUTION "\":%d}"), sysCfg.flag.wattage_resolution); } - else if (!strcmp_P(type,PSTR("VOLTRES"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_VOLTAGE_RESOLUTION))) { if ((payload >= 0) && (payload <= 1)) { sysCfg.flag.voltage_resolution = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"VoltRes\":%d}"), sysCfg.flag.voltage_resolution); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_VOLTAGE_RESOLUTION "\":%d}"), sysCfg.flag.voltage_resolution); } - else if (!strcmp_P(type,PSTR("ENERGYRES"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_ENERGY_RESOLUTION))) { if ((payload >= 0) && (payload <= 5)) { sysCfg.flag.energy_resolution = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"EnergyRes\":%d}"), sysCfg.flag.energy_resolution); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_ENERGY_RESOLUTION "\":%d}"), sysCfg.flag.energy_resolution); } - else if (!strcmp_P(type,PSTR("MODULE"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_MODULE))) { if ((payload > 0) && (payload <= MAXMODULE)) { payload--; byte new_modflg = (sysCfg.module != payload); @@ -1183,10 +1171,10 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) restartflag = 2; } snprintf_P(stemp1, sizeof(stemp1), modules[sysCfg.module].name); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Module\":\"%d (%s)\"}"), sysCfg.module +1, stemp1); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_MODULE "\":\"%d (%s)\"}"), sysCfg.module +1, stemp1); } - else if (!strcmp_P(type,PSTR("MODULES"))) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Modules1\":\""), svalue); + else if (!strcasecmp_P(type, PSTR(D_CMND_MODULES))) { + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_MODULES "1\":\""), svalue); byte jsflg = 0; for (byte i = 0; i < MAXMODULE /2; i++) { if (jsflg) { @@ -1198,7 +1186,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue); mqtt_publish_topic_P(5, type, svalue); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Modules2\":\""), svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_MODULES "2\":\""), svalue); jsflg = 0; for (byte i = MAXMODULE /2; i < MAXMODULE; i++) { if (jsflg) { @@ -1210,7 +1198,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue); } - else if (!strcmp_P(type,PSTR("GPIO")) && (index < MAX_GPIO_PIN)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_GPIO)) && (index < MAX_GPIO_PIN)) { mytmplt cmodule; memcpy_P(&cmodule, &modules[sysCfg.module], sizeof(cmodule)); if ((GPIO_USER == cmodule.gp.io[index]) && (payload >= 0) && (payload < GPIO_SENSOR_END)) { @@ -1231,17 +1219,17 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } jsflg = 1; snprintf_P(stemp1, sizeof(stemp1), sensors[sysCfg.my_module.gp.io[i]]); - snprintf_P(svalue, sizeof(svalue), PSTR("%s\"GPIO%d\":%d (%s)"), svalue, i, sysCfg.my_module.gp.io[i], stemp1); + snprintf_P(svalue, sizeof(svalue), PSTR("%s\"" D_CMND_GPIO "%d\":%d (%s)"), svalue, i, sysCfg.my_module.gp.io[i], stemp1); } } if (jsflg) { snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue); } else { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"GPIO\":\"Not supported\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_GPIO "\":\"" D_NOT_SUPPORTED "\"}")); } } - else if (!strcmp_P(type,PSTR("GPIOS"))) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"GPIOs1\":\""), svalue); + else if (!strcasecmp_P(type, PSTR(D_CMND_GPIOS))) { + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_GPIOS "1\":\""), svalue); byte jsflg = 0; for (byte i = 0; i < GPIO_SENSOR_END /2; i++) { if (jsflg) { @@ -1253,7 +1241,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue); mqtt_publish_topic_P(5, type, svalue); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"GPIOs2\":\""), svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_GPIOS "2\":\""), svalue); jsflg = 0; for (byte i = GPIO_SENSOR_END /2; i < GPIO_SENSOR_END; i++) { if (jsflg) { @@ -1265,43 +1253,43 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue); } - else if (!strcmp_P(type,PSTR("PWM")) && (index > pwm_idxoffset) && (index <= 5)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_PWM)) && (index > pwm_idxoffset) && (index <= 5)) { if ((payload >= 0) && (payload <= PWM_RANGE) && (pin[GPIO_PWM1 + index -1] < 99)) { sysCfg.pwmvalue[index -1] = payload; analogWrite(pin[GPIO_PWM1 + index -1], payload); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"PWM\":{")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_PWM "\":{")); bool first = true; for (byte i = 0; i < 5; i++) { if(pin[GPIO_PWM1 + i] < 99) { - snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"PWM%d\":%d"), svalue, first ? "" : ", ", i+1, sysCfg.pwmvalue[i]); + snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_PWM "%d\":%d"), svalue, first ? "" : ", ", i+1, sysCfg.pwmvalue[i]); first = false; } } snprintf_P(svalue, sizeof(svalue), PSTR("%s}}"),svalue); } - else if (!strcmp_P(type,PSTR("COUNTER")) && (index > 0) && (index <= MAX_COUNTERS)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_COUNTER)) && (index > 0) && (index <= MAX_COUNTERS)) { if ((data_len > 0) && (pin[GPIO_CNTR1 + index -1] < 99)) { rtcMem.pCounter[index -1] = payload16; sysCfg.pCounter[index -1] = payload16; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Counter%d\":%d}"), index, rtcMem.pCounter[index -1]); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_COUNTER "%d\":%d}"), index, rtcMem.pCounter[index -1]); } - else if (!strcmp_P(type,PSTR("COUNTERTYPE")) && (index > 0) && (index <= MAX_COUNTERS)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_COUNTERTYPE)) && (index > 0) && (index <= MAX_COUNTERS)) { if ((payload >= 0) && (payload <= 1) && (pin[GPIO_CNTR1 + index -1] < 99)) { bitWrite(sysCfg.pCounterType, index -1, payload &1); rtcMem.pCounter[index -1] = 0; sysCfg.pCounter[index -1] = 0; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"CounterType%d\":%d}"), index, bitRead(sysCfg.pCounterType, index -1)); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_COUNTERTYPE "%d\":%d}"), index, bitRead(sysCfg.pCounterType, index -1)); } - else if (!strcmp_P(type,PSTR("COUNTERDEBOUNCE"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_COUNTERDEBOUNCE))) { if ((data_len > 0) && (payload16 < 32001)) { sysCfg.pCounterDebounce = payload16; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"CounterDebounce\":%d}"), sysCfg.pCounterDebounce); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_COUNTERDEBOUNCE "\":%d}"), sysCfg.pCounterDebounce); } - else if (!strcmp_P(type,PSTR("SLEEP"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SLEEP))) { if ((payload >= 0) && (payload < 251)) { if ((!sysCfg.sleep && payload) || (sysCfg.sleep && !payload)) { restartflag = 2; @@ -1309,62 +1297,62 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) sysCfg.sleep = payload; sleep = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Sleep\":\"%d%s (%d%s)\"}"), sleep, (sysCfg.flag.value_units) ? " mS" : "", sysCfg.sleep, (sysCfg.flag.value_units) ? " mS" : ""); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_SLEEP "\":\"%d%s (%d%s)\"}"), sleep, (sysCfg.flag.value_units) ? " " D_UNIT_MILLISECOND : "", sysCfg.sleep, (sysCfg.flag.value_units) ? " " D_UNIT_MILLISECOND : ""); } - else if (!strcmp_P(type,PSTR("UPGRADE")) || !strcmp_P(type,PSTR("UPLOAD"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_UPGRADE)) || !strcasecmp_P(type, PSTR(D_CMND_UPLOAD))) { // Check if the payload is numerically 1, and had no trailing chars. // e.g. "1foo" or "1.2.3" could fool us. // Check if the version we have been asked to upgrade to is higher than our current version. // We also need at least 3 chars to make a valid version number string. if (((1 == data_len) && (1 == payload)) || ((data_len >= 3) && newerVersion(dataBuf))) { otaflag = 3; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Upgrade\":\"Version %s from %s\"}"), Version, sysCfg.otaUrl); + snprintf_P(svalue, sizeof(svalue), "{\"" D_CMND_UPGRADE "\":\"" D_VERSION " %s " D_FROM " %s\"}", Version, sysCfg.otaUrl); } else { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Upgrade\":\"Option 1 or >%s to upgrade\"}"), Version); + snprintf_P(svalue, sizeof(svalue), "{\"" D_CMND_UPGRADE "\":\"" D_ONE_OR_GT "\"}", Version); } } - else if (!strcmp_P(type,PSTR("OTAURL"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_OTAURL))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.otaUrl))) strlcpy(sysCfg.otaUrl, (1 == payload) ? OTA_URL : dataBuf, sizeof(sysCfg.otaUrl)); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"OtaUrl\":\"%s\"}"), sysCfg.otaUrl); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_OTAURL "\":\"%s\"}"), sysCfg.otaUrl); } - else if (!strcmp_P(type,PSTR("SERIALLOG"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SERIALLOG))) { if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { sysCfg.seriallog_level = payload; seriallog_level = payload; seriallog_timer = 0; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"SerialLog\":\"%d (Active %d)\"}"), sysCfg.seriallog_level, seriallog_level); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_SERIALLOG "\":\"%d (" D_ACTIVE " %d)\"}"), sysCfg.seriallog_level, seriallog_level); } - else if (!strcmp_P(type,PSTR("SYSLOG"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SYSLOG))) { if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { sysCfg.syslog_level = payload; syslog_level = (sysCfg.flag.emulation) ? 0 : payload; syslog_timer = 0; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"SysLog\":\"%d (Active %d)\"}"), sysCfg.syslog_level, syslog_level); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_SYSLOG "\":\"%d (" D_ACTIVE " %d)\"}"), sysCfg.syslog_level, syslog_level); } - else if (!strcmp_P(type,PSTR("LOGHOST"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_LOGHOST))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.syslog_host))) { strlcpy(sysCfg.syslog_host, (1 == payload) ? SYS_LOG_HOST : dataBuf, sizeof(sysCfg.syslog_host)); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"LogHost\":\"%s\"}"), sysCfg.syslog_host); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_LOGHOST "\":\"%s\"}"), sysCfg.syslog_host); } - else if (!strcmp_P(type,PSTR("LOGPORT"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_LOGPORT))) { if ((payload > 0) && (payload < 32766)) { sysCfg.syslog_port = (1 == payload) ? SYS_LOG_PORT : payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"LogPort\":%d}"), sysCfg.syslog_port); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_LOGPORT "\":%d}"), sysCfg.syslog_port); } - else if (!strcmp_P(type,PSTR("IPADDRESS")) && (index > 0) && (index <= 4)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_IPADDRESS)) && (index > 0) && (index <= 4)) { if (parseIP(&address, dataBuf)) { sysCfg.ip_address[index -1] = address; // restartflag = 2; } snprintf_P(stemp1, sizeof(stemp1), PSTR(" (%s)"), WiFi.localIP().toString().c_str()); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"IPAddress%d\":\"%s%s\"}"), index, IPAddress(sysCfg.ip_address[index -1]).toString().c_str(), (1 == index) ? stemp1:""); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_IPADDRESS "%d\":\"%s%s\"}"), index, IPAddress(sysCfg.ip_address[index -1]).toString().c_str(), (1 == index) ? stemp1:""); } - else if (!strcmp_P(type,PSTR("NTPSERVER")) && (index > 0) && (index <= 3)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_NTPSERVER)) && (index > 0) && (index <= 3)) { if ((data_len > 0) && (data_len < sizeof(sysCfg.ntp_server[0]))) { strlcpy(sysCfg.ntp_server[index -1], (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? (1==index)?NTP_SERVER1:(2==index)?NTP_SERVER2:NTP_SERVER3 : dataBuf, sizeof(sysCfg.ntp_server[0])); for (i = 0; i < strlen(sysCfg.ntp_server[index -1]); i++) { @@ -1374,9 +1362,9 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } restartflag = 2; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"NtpServer%d\":\"%s\"}"), index, sysCfg.ntp_server[index -1]); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_NTPSERVER "%d\":\"%s\"}"), index, sysCfg.ntp_server[index -1]); } - else if (!strcmp_P(type,PSTR("AP"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_AP))) { if ((payload >= 0) && (payload <= 2)) { switch (payload) { case 0: // Toggle @@ -1388,25 +1376,25 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } restartflag = 2; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Ap\":\"%d (%s)\"}"), sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active]); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_AP "\":\"%d (%s)\"}"), sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active]); } - else if (!strcmp_P(type,PSTR("SSID")) && (index > 0) && (index <= 2)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_SSID)) && (index > 0) && (index <= 2)) { if ((data_len > 0) && (data_len < sizeof(sysCfg.sta_ssid[0]))) { strlcpy(sysCfg.sta_ssid[index -1], (1 == payload) ? (1 == index) ? STA_SSID1 : STA_SSID2 : dataBuf, sizeof(sysCfg.sta_ssid[0])); sysCfg.sta_active = 0; restartflag = 2; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"SSid%d\":\"%s\"}"), index, sysCfg.sta_ssid[index -1]); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_SSID "%d\":\"%s\"}"), index, sysCfg.sta_ssid[index -1]); } - else if (!strcmp_P(type,PSTR("PASSWORD")) && (index > 0) && (index <= 2)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_PASSWORD)) && (index > 0) && (index <= 2)) { if ((data_len > 0) && (data_len < sizeof(sysCfg.sta_pwd[0]))) { strlcpy(sysCfg.sta_pwd[index -1], (1 == payload) ? (1 == index) ? STA_PASS1 : STA_PASS2 : dataBuf, sizeof(sysCfg.sta_pwd[0])); sysCfg.sta_active = 0; restartflag = 2; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Password%d\":\"%s\"}"), index, sysCfg.sta_pwd[index -1]); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_PASSWORD "%d\":\"%s\"}"), index, sysCfg.sta_pwd[index -1]); } - else if (!grpflg && !strcmp_P(type,PSTR("HOSTNAME"))) { + else if (!grpflg && !strcasecmp_P(type, PSTR(D_CMND_HOSTNAME))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.hostname))) { strlcpy(sysCfg.hostname, (1 == payload) ? WIFI_HOSTNAME : dataBuf, sizeof(sysCfg.hostname)); if (strstr(sysCfg.hostname,"%")) { @@ -1414,24 +1402,24 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } restartflag = 2; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Hostname\":\"%s\"}"), sysCfg.hostname); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_HOSTNAME "\":\"%s\"}"), sysCfg.hostname); } - else if (!strcmp_P(type,PSTR("WIFICONFIG"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_WIFICONFIG))) { if ((payload >= WIFI_RESTART) && (payload < MAX_WIFI_OPTION)) { sysCfg.sta_config = payload; wificheckflag = sysCfg.sta_config; snprintf_P(stemp1, sizeof(stemp1), wificfg[sysCfg.sta_config]); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"WifiConfig\":\"%s selected\"}"), stemp1); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_WIFICONFIG "\":\"%s " D_SELECTED "\"}"), stemp1); if (WIFI_State() != WIFI_RESTART) { // snprintf_P(svalue, sizeof(svalue), PSTR("%s after restart"), svalue); restartflag = 2; } } else { snprintf_P(stemp1, sizeof(stemp1), wificfg[sysCfg.sta_config]); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"WifiConfig\":\"%d (%s)\"}"), sysCfg.sta_config, stemp1); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_WIFICONFIG "\":\"%d (%s)\"}"), sysCfg.sta_config, stemp1); } } - else if (!strcmp_P(type,PSTR("FRIENDLYNAME")) && (index > 0) && (index <= 4)) { + else if (!strcasecmp_P(type, PSTR(D_CMND_FRIENDLYNAME)) && (index > 0) && (index <= 4)) { if ((data_len > 0) && (data_len < sizeof(sysCfg.friendlyname[0]))) { if (1 == index) { snprintf_P(stemp1, sizeof(stemp1), PSTR(FRIENDLY_NAME)); @@ -1440,49 +1428,49 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } strlcpy(sysCfg.friendlyname[index -1], (1 == payload) ? stemp1 : dataBuf, sizeof(sysCfg.friendlyname[index -1])); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"FriendlyName%d\":\"%s\"}"), index, sysCfg.friendlyname[index -1]); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_FRIENDLYNAME "%d\":\"%s\"}"), index, sysCfg.friendlyname[index -1]); } - else if (swt_flg && !strcmp_P(type,PSTR("SWITCHMODE")) && (index > 0) && (index <= 4)) { + else if (swt_flg && !strcasecmp_P(type, PSTR(D_CMND_SWITCHMODE)) && (index > 0) && (index <= 4)) { if ((payload >= 0) && (payload < MAX_SWITCH_OPTION)) { sysCfg.switchmode[index -1] = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"SwitchMode%d\":%d}"), index, sysCfg.switchmode[index-1]); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_SWITCHMODE "%d\":%d}"), index, sysCfg.switchmode[index-1]); } #ifdef USE_WEBSERVER - else if (!strcmp_P(type,PSTR("WEBSERVER"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_WEBSERVER))) { if ((payload >= 0) && (payload <= 2)) { sysCfg.webserver = payload; } if (sysCfg.webserver) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Webserver\":\"Active for %s on %s with IP address %s\"}"), - (2 == sysCfg.webserver) ? "ADMIN" : "USER", Hostname, WiFi.localIP().toString().c_str()); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_WEBSERVER "\":\"" D_ACTIVE_FOR " %s " D_ON_DEVICE " %s " D_WITH_IP_ADDRESS " %s\"}"), + (2 == sysCfg.webserver) ? D_ADMIN : D_USER, Hostname, WiFi.localIP().toString().c_str()); } else { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Webserver\":\"%s\"}"), getStateText(0)); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_WEBSERVER "\":\"%s\"}"), getStateText(0)); } } - else if (!strcmp_P(type,PSTR("WEBPASSWORD"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_WEBPASSWORD))) { if ((data_len > 0) && (data_len < sizeof(sysCfg.web_password))) { strlcpy(sysCfg.web_password, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? WEB_PASSWORD : dataBuf, sizeof(sysCfg.web_password)); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebPassword\":\"%s\"}"), sysCfg.web_password); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_WEBPASSWORD "\":\"%s\"}"), sysCfg.web_password); } - else if (!strcmp_P(type,PSTR("WEBLOG"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_WEBLOG))) { if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) { sysCfg.weblog_level = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebLog\":%d}"), sysCfg.weblog_level); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_WEBLOG "\":%d}"), sysCfg.weblog_level); } #ifdef USE_EMULATION - else if (!strcmp_P(type,PSTR("EMULATION"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_EMULATION))) { if ((payload >= 0) && (payload <= 2)) { sysCfg.flag.emulation = payload; restartflag = 2; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Emulation\":%d}"), sysCfg.flag.emulation); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_EMULATION "\":%d}"), sysCfg.flag.emulation); } #endif // USE_EMULATION #endif // USE_WEBSERVER - else if (!strcmp_P(type,PSTR("TELEPERIOD"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_TELEPERIOD))) { if ((payload >= 0) && (payload < 3601)) { sysCfg.tele_period = (1 == payload) ? TELE_PERIOD : payload; if ((sysCfg.tele_period > 0) && (sysCfg.tele_period < 10)) { @@ -1490,43 +1478,43 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } tele_period = sysCfg.tele_period; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"TelePeriod\":\"%d%s\"}"), sysCfg.tele_period, (sysCfg.flag.value_units) ? " Sec" : ""); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_TELEPERIOD "\":\"%d%s\"}"), sysCfg.tele_period, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : ""); } - else if (!strcmp_P(type,PSTR("RESTART"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_RESTART))) { switch (payload) { case 1: restartflag = 2; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Restart\":\"Restarting\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RESTART "\":\"" D_RESTARTING "\"}")); break; case 99: - addLog_P(LOG_LEVEL_INFO, PSTR("APP: Restarting")); + addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_RESTARTING)); ESP.restart(); break; default: - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Restart\":\"1 to restart\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RESTART "\":\"" D_ONE_TO_RESTART "\"}")); } } - else if (!strcmp_P(type,PSTR("RESET"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_RESET))) { switch (payload) { case 1: restartflag = 211; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Reset\":\"Reset and Restarting\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RESET "\":\"" D_RESET_AND_RESTARTING "\"}")); break; case 2: restartflag = 212; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Reset\":\"Erase, Reset and Restarting\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RESET "\":\"" D_ERASE ", " D_RESET_AND_RESTARTING "\"}")); break; default: - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Reset\":\"1 to reset\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RESET "\":\"" D_ONE_TO_RESET "\"}")); } } - else if (!strcmp_P(type,PSTR("TIMEZONE"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_TIMEZONE))) { if ((data_len > 0) && (((payload >= -12) && (payload <= 12)) || (99 == payload))) { sysCfg.timezone = payload; } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Timezone\":%d}"), sysCfg.timezone); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_TIMEZONE "\":%d}"), sysCfg.timezone); } - else if (!strcmp_P(type,PSTR("LEDPOWER"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_LEDPOWER))) { if ((payload >= 0) && (payload <= 2)) { sysCfg.ledstate &= 8; switch (payload) { @@ -1541,20 +1529,20 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) blinks = 0; setLed(sysCfg.ledstate &8); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"LedPower\":\"%s\"}"), getStateText(bitRead(sysCfg.ledstate, 3))); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_LEDPOWER "\":\"%s\"}"), getStateText(bitRead(sysCfg.ledstate, 3))); } - else if (!strcmp_P(type,PSTR("LEDSTATE"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_LEDSTATE))) { if ((payload >= 0) && (payload < MAX_LED_OPTION)) { sysCfg.ledstate = payload; if (!sysCfg.ledstate) { setLed(0); } } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"LedState\":%d}"), sysCfg.ledstate); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_LEDSTATE "\":%d}"), sysCfg.ledstate); } - else if (!strcmp_P(type,PSTR("CFGDUMP"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_CFGDUMP))) { CFG_Dump(dataBuf); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"CfgDump\":\"Done\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_CFGDUMP "\":\"" D_DONE "\"}")); } else if (sysCfg.flag.mqtt_enabled && mqtt_command(grpflg, type, index, dataBuf, data_len, payload, svalue, sizeof(svalue))) { // Serviced @@ -1566,7 +1554,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) // Serviced } #ifdef USE_I2C - else if (i2c_flg && !strcmp_P(type,PSTR("I2CSCAN"))) { + else if (i2c_flg && !strcasecmp_P(type, PSTR(D_CMND_I2CSCAN))) { i2c_scan(svalue, sizeof(svalue)); } #endif // USE_I2C @@ -1581,11 +1569,11 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } #endif // USE_IR_REMOTE #ifdef DEBUG_THEO - else if (!strcmp_P(type,PSTR("EXCEPTION"))) { + else if (!strcasecmp_P(type, PSTR(D_CMND_EXCEPTION))) { if (data_len > 0) { exception_tst(payload); } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Exception\":\"Triggered\"}")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_EXCEPTION "\":\"" D_DONE "\"}")); } #endif // DEBUG_THEO else { @@ -1594,8 +1582,8 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } if (type == NULL) { blinks = 201; - snprintf_P(topicBuf, sizeof(topicBuf), PSTR("COMMAND")); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Command\":\"Unknown\"}")); + snprintf_P(topicBuf, sizeof(topicBuf), PSTR(D_COMMAND)); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_COMMAND "\":\"" D_UNKNOWN "\"}")); type = (char*)topicBuf; } if (svalue[0] != '\0') { @@ -1627,10 +1615,13 @@ boolean send_button_power(byte key, byte device, byte state) if (!key && (device > Maxdevice)) { device = 1; } - snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), device); - snprintf_P(scommand, sizeof(scommand), PSTR("POWER%s"), (key || (Maxdevice > 1)) ? stemp1 : ""); - getTopic_P(stopic, 0, key_topic, scommand); - + +// snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), device); +// snprintf_P(scommand, sizeof(scommand), PSTR("POWER%s"), (key || (Maxdevice > 1)) ? stemp1 : ""); +// getTopic_P(stopic, 0, key_topic, scommand); + + getTopic_P(stopic, 0, key_topic, getPowerDevice(scommand, device, sizeof(scommand), key)); + if (9 == state) { svalue[0] = '\0'; } else { @@ -1781,119 +1772,114 @@ void publish_status(uint8_t payload) } if ((0 == payload) || (99 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Status\":{\"Module\":%d, \"FriendlyName\":\"%s\", \"Topic\":\"%s\", \"ButtonTopic\":\"%s\", \"Power\":%d, \"PowerOnState\":%d, \"LedState\":%d, \"SaveData\":%d, \"SaveState\":%d, \"ButtonRetain\":%d, \"PowerRetain\":%d}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS "\":{\"" D_CMND_MODULE "\":%d, \"" D_CMND_FRIENDLYNAME "\":\"%s\", \"" D_CMND_TOPIC "\":\"%s\", \"" D_CMND_BUTTONTOPIC "\":\"%s\", \"" D_CMND_POWER "\":%d, \"" D_CMND_POWERONSTATE "\":%d, \"" D_CMND_LEDSTATE "\":%d, \"" D_CMND_SAVEDATA "\":%d, \"" D_SAVESTATE "\":%d, \"" D_CMND_BUTTONRETAIN "\":%d, \"" D_CMND_POWERRETAIN "\":%d}}"), sysCfg.module +1, sysCfg.friendlyname[0], sysCfg.mqtt_topic, sysCfg.button_topic, power, sysCfg.poweronstate, sysCfg.ledstate, sysCfg.savedata, sysCfg.flag.savestate, sysCfg.flag.mqtt_button_retain, sysCfg.flag.mqtt_power_retain); - mqtt_publish_topic_P(option, PSTR("STATUS"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS), svalue); } if ((0 == payload) || (1 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusPRM\":{\"Baudrate\":%d, \"GroupTopic\":\"%s\", \"OtaUrl\":\"%s\", \"Uptime\":%d, \"Sleep\":%d, \"BootCount\":%d, \"SaveCount\":%d, \"SaveAddress\":\"%X\"}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS1_PARAMETER "\":{\"" D_BAUDRATE "\":%d, \"" D_CMND_GROUPTOPIC "\":\"%s\", \"" D_CMND_OTAURL "\":\"%s\", \"" D_UPTIME "\":%d, \"" D_CMND_SLEEP "\":%d, \"" D_BOOTCOUNT "\":%d, \"" D_SAVECOUNT "\":%d, \"" D_SAVEADDRESS "\":\"%X\"}}"), Baudrate, sysCfg.mqtt_grptopic, sysCfg.otaUrl, uptime, sysCfg.sleep, sysCfg.bootcount, sysCfg.saveFlag, CFG_Address()); - mqtt_publish_topic_P(option, PSTR("STATUS1"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "1"), svalue); } if ((0 == payload) || (2 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusFWR\":{\"Program\":\"%s\", \"BuildDateTime\":\"%s\", \"Boot\":%d, \"Core\":\"%s\", \"SDK\":\"%s\"}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS2_FIRMWARE "\":{\"" D_VERSION "\":\"%s\", \"" D_BUILDDATETIME "\":\"%s\", \"" D_BOOTVERSION "\":%d, \"" D_COREVERSION "\":\"%s\", \"" D_SDKVERSION "\":\"%s\"}}"), Version, getBuildDateTime().c_str(), ESP.getBootVersion(), ESP.getCoreVersion().c_str(), ESP.getSdkVersion()); - mqtt_publish_topic_P(option, PSTR("STATUS2"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "2"), svalue); } if ((0 == payload) || (3 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusLOG\":{\"Seriallog\":%d, \"Weblog\":%d, \"Syslog\":%d, \"LogHost\":\"%s\", \"SSId1\":\"%s\", \"SSId2\":\"%s\", \"TelePeriod\":%d, \"Option\":\"%08X\"}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS3_LOGGING "\":{\"" D_CMND_SERIALLOG "\":%d, \"" D_CMND_WEBLOG "\":%d, \"" D_CMND_SYSLOG "\":%d, \"" D_CMND_LOGHOST "\":\"%s\", \"" D_CMND_SSID "1\":\"%s\", \"" D_CMND_SSID "2\":\"%s\", \"" D_CMND_TELEPERIOD "\":%d, \"" D_CMND_SETOPTION "\":\"%08X\"}}"), sysCfg.seriallog_level, sysCfg.weblog_level, sysCfg.syslog_level, sysCfg.syslog_host, sysCfg.sta_ssid[0], sysCfg.sta_ssid[1], sysCfg.tele_period, sysCfg.flag.data); - mqtt_publish_topic_P(option, PSTR("STATUS3"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "3"), svalue); } if ((0 == payload) || (4 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusMEM\":{\"ProgramSize\":%d, \"Free\":%d, \"Heap\":%d, \"ProgramFlashSize\":%d, \"FlashSize\":%d, \"FlashMode\":%d}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS4_MEMORY "\":{\"" D_PROGRAMSIZE "\":%d, \"" D_FREEMEMORY "\":%d, \"" D_HEAPSIZE "\":%d, \"" D_PROGRAMFLASHSIZE "\":%d, \"" D_FLASHSIZE "\":%d, \"" D_FLASHMODE "\":%d}}"), ESP.getSketchSize()/1024, ESP.getFreeSketchSpace()/1024, ESP.getFreeHeap()/1024, ESP.getFlashChipSize()/1024, ESP.getFlashChipRealSize()/1024, ESP.getFlashChipMode()); - mqtt_publish_topic_P(option, PSTR("STATUS4"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "4"), svalue); } if ((0 == payload) || (5 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusNET\":{\"Hostname\":\"%s\", \"IPaddress\":\"%s\", \"Gateway\":\"%s\", \"Subnetmask\":\"%s\", \"DNSServer\":\"%s\", \"Mac\":\"%s\", \"Webserver\":%d, \"WifiConfig\":%d}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS5_NETWORK "\":{\"" D_CMND_HOSTNAME "\":\"%s\", \"" D_CMND_IPADDRESS "\":\"%s\", \"" D_GATEWAY "\":\"%s\", \"" D_SUBNETMASK "\":\"%s\", \"" D_DNSSERVER "\":\"%s\", \"" D_MAC "\":\"%s\", \"" D_CMND_WEBSERVER "\":%d, \"" D_CMND_WIFICONFIG "\":%d}}"), Hostname, WiFi.localIP().toString().c_str(), IPAddress(sysCfg.ip_address[1]).toString().c_str(), IPAddress(sysCfg.ip_address[2]).toString().c_str(), IPAddress(sysCfg.ip_address[3]).toString().c_str(), WiFi.macAddress().c_str(), sysCfg.webserver, sysCfg.sta_config); - mqtt_publish_topic_P(option, PSTR("STATUS5"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "5"), svalue); } if (((0 == payload) || (6 == payload)) && sysCfg.flag.mqtt_enabled) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusMQT\":{\"Host\":\"%s\", \"Port\":%d, \"ClientMask\":\"%s\", \"Client\":\"%s\", \"User\":\"%s\", \"MAX_PACKET_SIZE\":%d, \"KEEPALIVE\":%d}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS6_MQTT "\":{\"" D_CMND_MQTTHOST "\":\"%s\", \"" D_CMND_MQTTPORT "\":%d, \"" D_CMND_MQTTCLIENT D_MASK "\":\"%s\", \"" D_CMND_MQTTCLIENT "\":\"%s\", \"" D_CMND_MQTTUSER "\":\"%s\", \"MAX_PACKET_SIZE\":%d, \"KEEPALIVE\":%d}}"), sysCfg.mqtt_host, sysCfg.mqtt_port, sysCfg.mqtt_client, MQTTClient, sysCfg.mqtt_user, MQTT_MAX_PACKET_SIZE, MQTT_KEEPALIVE); - mqtt_publish_topic_P(option, PSTR("STATUS6"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "6"), svalue); } if ((0 == payload) || (7 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusTIM\":{\"UTC\":\"%s\", \"Local\":\"%s\", \"StartDST\":\"%s\", \"EndDST\":\"%s\", \"Timezone\":%d}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS7_TIME "\":{\"" D_UTC_TIME "\":\"%s\", \"" D_LOCAL_TIME "\":\"%s\", \"" D_STARTDST "\":\"%s\", \"" D_ENDDST "\":\"%s\", \"" D_CMND_TIMEZONE "\":%d}}"), rtc_time(0).c_str(), rtc_time(1).c_str(), rtc_time(2).c_str(), rtc_time(3).c_str(), sysCfg.timezone); - mqtt_publish_topic_P(option, PSTR("STATUS7"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "7"), svalue); } if (hlw_flg) { if ((0 == payload) || (8 == payload)) { - hlw_mqttStatus(svalue, sizeof(svalue)); - mqtt_publish_topic_P(option, PSTR("STATUS8"), svalue); + hlw_mqttStatus(svalue, sizeof(svalue)); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "8"), svalue); } if ((0 == payload) || (9 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusPTH\":{\"PowerLow\":%d, \"PowerHigh\":%d, \"VoltageLow\":%d, \"VoltageHigh\":%d, \"CurrentLow\":%d, \"CurrentHigh\":%d}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS9_MARGIN "\":{\"" D_CMND_POWERLOW "\":%d, \"" D_CMND_POWERHIGH "\":%d, \"" D_CMND_VOLTAGELOW "\":%d, \"" D_CMND_VOLTAGEHIGH "\":%d, \"" D_CMND_CURRENTLOW "\":%d, \"" D_CMND_CURRENTHIGH "\":%d}}"), sysCfg.hlw_pmin, sysCfg.hlw_pmax, sysCfg.hlw_umin, sysCfg.hlw_umax, sysCfg.hlw_imin, sysCfg.hlw_imax); - mqtt_publish_topic_P(option, PSTR("STATUS9"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "9"), svalue); } } if ((0 == payload) || (10 == payload)) { uint8_t djson = 0; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusSNS\":")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS10_SENSOR "\":")); sensors_mqttPresent(svalue, sizeof(svalue), &djson); snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue); - mqtt_publish_topic_P(option, PSTR("STATUS10"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "10"), svalue); } if ((0 == payload) || (11 == payload)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusSTS\":")); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_STATUS D_STATUS11_STATUS "\":")); state_mqttPresent(svalue, sizeof(svalue)); snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue); - mqtt_publish_topic_P(option, PSTR("STATUS11"), svalue); + mqtt_publish_topic_P(option, PSTR(D_CMND_STATUS "11"), svalue); } - + } void state_mqttPresent(char* svalue, uint16_t ssvalue) { - char stemp1[8]; - - snprintf_P(svalue, ssvalue, PSTR("%s{\"Time\":\"%s\", \"Uptime\":%d"), svalue, getDateTime().c_str(), uptime); + char stemp1[16]; + + snprintf_P(svalue, ssvalue, PSTR("%s{\"" D_TIME "\":\"%s\", \"" D_UPTIME "\":%d"), svalue, getDateTime().c_str(), uptime); #ifdef USE_ADC_VCC - dtostrf((double)ESP.getVcc()/1000, 1, 3, stemp1); - snprintf_P(svalue, ssvalue, PSTR("%s, \"Vcc\":%s"), svalue, stemp1); -#endif + dtostrfd((double)ESP.getVcc()/1000, 3, stemp1); + snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_VCC "\":%s"), svalue, stemp1); +#endif for (byte i = 0; i < Maxdevice; i++) { - if (1 == Maxdevice) { // Legacy - snprintf_P(svalue, ssvalue, PSTR("%s, \"POWER\":"), svalue); - } else { - snprintf_P(svalue, ssvalue, PSTR("%s, \"POWER%d\":"), svalue, i +1); - } - snprintf_P(svalue, ssvalue, PSTR("%s\"%s\""), svalue, getStateText(bitRead(power, i))); + snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":\"%s\""), svalue, getPowerDevice(stemp1, i +1, sizeof(stemp1)), getStateText(bitRead(power, i))); } - snprintf_P(svalue, ssvalue, PSTR("%s, \"Wifi\":{\"AP\":%d, \"SSID\":\"%s\", \"RSSI\":%d, \"APMac\":\"%s\"}}"), + snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_WIFI "\":{\"" D_AP "\":%d, \"" D_SSID "\":\"%s\", \"" D_RSSI "\":%d, \"" D_APMAC_ADDRESS "\":\"%s\"}}"), svalue, sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active], WIFI_getRSSIasQuality(WiFi.RSSI()), WiFi.BSSIDstr().c_str()); } void sensors_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) { - snprintf_P(svalue, ssvalue, PSTR("%s{\"Time\":\"%s\""), svalue, getDateTime().c_str()); + snprintf_P(svalue, ssvalue, PSTR("%s{\"" D_TIME "\":\"%s\""), svalue, getDateTime().c_str()); for (byte i = 0; i < 4; i++) { if (pin[GPIO_SWT1 +i] < 99) { boolean swm = ((FOLLOW_INV == sysCfg.switchmode[i]) || (PUSHBUTTON_INV == sysCfg.switchmode[i]) || (PUSHBUTTONHOLD_INV == sysCfg.switchmode[i])); - snprintf_P(svalue, ssvalue, PSTR("%s, \"Switch%d\":\"%s\""), svalue, i +1, getStateText(swm ^ lastwallswitch[i])); + snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_SWITCH "%d\":\"%s\""), svalue, i +1, getStateText(swm ^ lastwallswitch[i])); *djson = 1; } } counter_mqttPresent(svalue, ssvalue, djson); #ifndef USE_ADC_VCC if (pin[GPIO_ADC0] < 99) { - snprintf_P(svalue, ssvalue, PSTR("%s, \"AnalogInput0\":%d"), svalue, getAdc0()); + snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_ANALOG_INPUT0 "\":%d"), svalue, getAdc0()); *djson = 1; } #endif @@ -1929,8 +1915,8 @@ void sensors_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) #endif // USE_BH1750 } #endif // USE_I2C - if (strstr_P(svalue, PSTR("Temperature"))) { - snprintf_P(svalue, ssvalue, PSTR("%s, \"TempUnit\":\"%c\""), svalue, tempUnit()); + if (strstr_P(svalue, PSTR(D_TEMPERATURE))) { + snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_TEMPERATURE_UNIT "\":\"%c\""), svalue, tempUnit()); } snprintf_P(svalue, ssvalue, PSTR("%s}"), svalue); } @@ -1955,7 +1941,7 @@ void every_second() seriallog_timer--; if (!seriallog_timer) { if (seriallog_level) { - addLog_P(LOG_LEVEL_INFO, PSTR("APP: Serial logging disabled")); + addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_SERIAL_LOGGING_DISABLED)); } seriallog_level = 0; } @@ -1966,7 +1952,7 @@ void every_second() if (!syslog_timer) { syslog_level = (sysCfg.flag.emulation) ? 0 : sysCfg.syslog_level; if (sysCfg.syslog_level) { - addLog_P(LOG_LEVEL_INFO, PSTR("SYSL: Syslog logging re-enabled")); // Might trigger disable again (on purpose) + addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_SYSLOG_LOGGING_REENABLED)); // Might trigger disable again (on purpose) } } } @@ -2023,13 +2009,13 @@ void every_second() svalue[0] = '\0'; state_mqttPresent(svalue, sizeof(svalue)); - mqtt_publish_topic_P(2, PSTR("STATE"), svalue); + mqtt_publish_topic_P(2, PSTR(D_RSLT_STATE), svalue); uint8_t djson = 0; svalue[0] = '\0'; sensors_mqttPresent(svalue, sizeof(svalue), &djson); if (djson) { - mqtt_publish_topic_P(2, PSTR("SENSOR"), svalue, sysCfg.flag.mqtt_sensor_retain); + mqtt_publish_topic_P(2, PSTR(D_RSLT_SENSOR), svalue, sysCfg.flag.mqtt_sensor_retain); } if (hlw_flg) { @@ -2045,8 +2031,8 @@ void every_second() if ((2 == rtcTime.Minute) && uptime_flg) { uptime_flg = false; uptime++; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Time\":\"%s\", \"Uptime\":%d}"), getDateTime().c_str(), uptime); - mqtt_publish_topic_P(2, PSTR("UPTIME"), svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_TIME "\":\"%s\", \"" D_UPTIME "\":%d}"), getDateTime().c_str(), uptime); + mqtt_publish_topic_P(2, PSTR(D_RSLT_UPTIME), svalue); } if ((3 == rtcTime.Minute) && !uptime_flg) { uptime_flg = true; @@ -2072,7 +2058,7 @@ void button_handler() if (!i && ((SONOFF_DUAL == sysCfg.module) || (CH4 == sysCfg.module))) { butt_present = 1; if (ButtonCode) { - snprintf_P(log, sizeof(log), PSTR("APP: Button code %04X"), ButtonCode); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_BUTTON " " D_CODE " %04X"), ButtonCode); addLog(LOG_LEVEL_DEBUG, log); button = PRESSED; if (0xF500 == ButtonCode) { // Button hold @@ -2094,13 +2080,13 @@ void button_handler() } flag = 0; if ((PRESSED == button) && (NOT_PRESSED == lastbutton[i])) { - snprintf_P(log, sizeof(log), PSTR("APP: Button %d level 1-0"), i +1); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_BUTTON " %d " D_LEVEL_10), i +1); addLog(LOG_LEVEL_DEBUG, log); holdbutton[i] = STATES; flag = 1; } if ((NOT_PRESSED == button) && (PRESSED == lastbutton[i])) { - snprintf_P(log, sizeof(log), PSTR("APP: Button %d level 0-1"), i +1); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_BUTTON " %d " D_LEVEL_01), i +1); addLog(LOG_LEVEL_DEBUG, log); if (!holdbutton[i]) { // Do not allow within 1 second flag = 1; @@ -2114,19 +2100,19 @@ void button_handler() } else { if ((PRESSED == button) && (NOT_PRESSED == lastbutton[i])) { if (sysCfg.flag.button_single) { // Allow only single button press for immediate action - snprintf_P(log, sizeof(log), PSTR("APP: Button %d immediate"), i +1); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_BUTTON " %d " D_IMMEDIATE), i +1); if (!send_button_power(0, i +1, 2)) { // Execute Toggle command via MQTT if ButtonTopic is set do_cmnd_power(i +1, 2); // Execute Toggle command internally } } else { multipress[i] = (multiwindow[i]) ? multipress[i] +1 : 1; - snprintf_P(log, sizeof(log), PSTR("APP: Button %d multi-press %d"), i +1, multipress[i]); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_BUTTON " %d " D_MULTI_PRESS " %d"), i +1, multipress[i]); multiwindow[i] = STATES /2; // 0.5 second multi press window } addLog(LOG_LEVEL_DEBUG, log); blinks = 201; } - + if (NOT_PRESSED == button) { holdbutton[i] = 0; } else { @@ -2134,14 +2120,14 @@ void button_handler() if (sysCfg.flag.button_single) { // Allow only single button press for immediate action if (holdbutton[i] == sysCfg.param[P_HOLD_TIME] * (STATES / 10) * 4) { // Button hold for four times longer // sysCfg.flag.button_single = 0; - snprintf_P(scmnd, sizeof(scmnd), PSTR("setoption13 0")); // Disable single press only + snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_SETOPTION "13 0")); // Disable single press only do_cmnd(scmnd); } } else { if (holdbutton[i] == sysCfg.param[P_HOLD_TIME] * (STATES / 10)) { // Button hold multipress[i] = 0; if (!sysCfg.flag.button_restrict) { // No button restriction - snprintf_P(scmnd, sizeof(scmnd), PSTR("reset 1")); + snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_RESET " 1")); do_cmnd(scmnd); } else { send_button_power(0, i +1, 3); // Execute Hold command via MQTT if ButtonTopic is set @@ -2208,7 +2194,7 @@ void switch_handler() send_button_power(1, i +1, 3); // Execute command via MQTT } } - + button = digitalRead(pin[GPIO_SWT1 +i]); if (button != lastwallswitch[i]) { switchflag = 3; @@ -2251,13 +2237,13 @@ void switch_handler() } break; } - + if (switchflag < 3) { if (!send_button_power(1, i +1, switchflag)) { // Execute command via MQTT do_cmnd_power(i +1, switchflag); // Execute command internally (if i < Maxdevice) } } - + lastwallswitch[i] = button; } } @@ -2295,7 +2281,7 @@ void stateloop() if (mqtt_cmnd_publish) { mqtt_cmnd_publish--; // Clean up } - + if (latching_relay_pulse) { latching_relay_pulse--; if (!latching_relay_pulse) { @@ -2428,12 +2414,12 @@ void stateloop() otaflag = 0; if (otaok) { setFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 - snprintf_P(svalue, sizeof(svalue), PSTR("Successful. Restarting")); + snprintf_P(svalue, sizeof(svalue), PSTR(D_SUCCESSFUL ". " D_RESTARTING)); } else { - snprintf_P(svalue, sizeof(svalue), PSTR("Failed %s"), ESPhttpUpdate.getLastErrorString().c_str()); + snprintf_P(svalue, sizeof(svalue), PSTR(D_FAILED " %s"), ESPhttpUpdate.getLastErrorString().c_str()); } restartflag = 2; // Restart anyway to keep memory clean webserver - mqtt_publish_topic_P(1, PSTR("UPGRADE"), svalue); + mqtt_publish_topic_P(1, PSTR(D_CMND_UPGRADE), svalue); } } break; @@ -2479,7 +2465,7 @@ void stateloop() CFG_Save(0); restartflag--; if (restartflag <= 0) { - addLog_P(LOG_LEVEL_INFO, PSTR("APP: Restarting")); + addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_RESTARTING)); ESP.restart(); } } @@ -2574,7 +2560,7 @@ void serial() else if (SerialInByte == '\n') { serialInBuf[SerialInByteCounter] = 0; // serial data completed seriallog_level = (sysCfg.seriallog_level < LOG_LEVEL_INFO) ? LOG_LEVEL_INFO : sysCfg.seriallog_level; - snprintf_P(log, sizeof(log), PSTR("CMND: %s"), serialInBuf); + snprintf_P(log, sizeof(log), PSTR(D_LOG_COMMAND "%s"), serialInBuf); addLog(LOG_LEVEL_INFO, log); do_cmnd(serialInBuf); SerialInByteCounter = 0; @@ -2616,7 +2602,7 @@ void GPIO_init() // snprintf_P(log, sizeof(log), PSTR("DBG: gpio pin %d, mpin %d"), i, mpin); // addLog(LOG_LEVEL_DEBUG, log); - + if (mpin) { if ((mpin >= GPIO_REL1_INV) && (mpin <= GPIO_REL4_INV)) { rel_inverted[mpin - GPIO_REL1_INV] = 1; @@ -2626,7 +2612,7 @@ void GPIO_init() led_inverted[mpin - GPIO_LED1_INV] = 1; mpin -= 4; } -#ifdef USE_DHT +#ifdef USE_DHT else if ((mpin >= GPIO_DHT11) && (mpin <= GPIO_DHT22)) { if (dht_setup(i, mpin)) { dht_flg = 1; @@ -2635,7 +2621,7 @@ void GPIO_init() mpin = 0; } } -#endif // USE_DHT +#endif // USE_DHT } if (mpin) { pin[mpin] = i; @@ -2703,7 +2689,7 @@ void GPIO_init() lastwallswitch[i] = digitalRead(pin[GPIO_SWT1 +i]); // set global now so doesn't change the saved power state on first switch check } } - + if (sfl_flg) { // Sonoff B1, AiLight, Sonoff Led or BN-SZ01 if (sfl_flg < 4) { pwm_idxoffset = sfl_flg; // 1 for BN-SZ01, 2 for Sonoff Led @@ -2800,14 +2786,14 @@ void setup() sleep = sysCfg.sleep; sysCfg.bootcount++; - snprintf_P(log, sizeof(log), PSTR("APP: Bootcount %d"), sysCfg.bootcount); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_BOOT_COUNT " %d"), sysCfg.bootcount); addLog(LOG_LEVEL_DEBUG, log); GPIO_init(); if (Serial.baudRate() != Baudrate) { if (seriallog_level) { - snprintf_P(log, sizeof(log), PSTR("APP: Set baudrate to %d"), Baudrate); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_SET_BAUDRATE_TO " %d"), Baudrate); addLog(LOG_LEVEL_INFO, log); } delay(100); @@ -2871,7 +2857,7 @@ void setup() pulse_timer[i] = sysCfg.pulsetime[i]; } } - + blink_powersave = power; if (SONOFF_SC == sysCfg.module) { @@ -2880,7 +2866,7 @@ void setup() rtc_init(); - snprintf_P(log, sizeof(log), PSTR("APP: Project %s %s (Topic %s, Fallback %s, GroupTopic %s) Version %s"), + snprintf_P(log, sizeof(log), PSTR(D_PROJECT " %s %s (" D_CMND_TOPIC " %s, " D_FALLBACK " %s, " D_CMND_GROUPTOPIC " %s) " D_VERSION " %s"), PROJECT, sysCfg.friendlyname[0], sysCfg.mqtt_topic, MQTTClient, sysCfg.mqtt_grptopic, Version); addLog(LOG_LEVEL_INFO, log); } @@ -2888,7 +2874,7 @@ void setup() void loop() { osw_loop(); - + #ifdef USE_WEBSERVER pollDnsWeb(); #endif // USE_WEBSERVER diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h index adf932dbd..abb3a33f7 100644 --- a/sonoff/sonoff_template.h +++ b/sonoff/sonoff_template.h @@ -65,50 +65,50 @@ enum upins_t { // Text in webpage Module Parameters and commands GPIOS and GPIO const char sensors[GPIO_SENSOR_END][9] PROGMEM = { - "None", - "DHT11", - "AM2301", - "DHT22", - "DS18x20", - "I2C SCL", - "I2C SDA", - "WS2812", - "IRremote", - "Switch1", - "Switch2", - "Switch3", - "Switch4", - "Button1", - "Button2", - "Button3", - "Button4", - "Relay1", - "Relay2", - "Relay3", - "Relay4", - "Relay1I", - "Relay2I", - "Relay3I", - "Relay4I", - "Led1", - "Led2", - "Led3", - "Led4", - "Led1I", - "Led2I", - "Led3I", - "Led4I", - "PWM1", - "PWM2", - "PWM3", - "PWM4", - "PWM5", - "Counter1", - "Counter2", - "Counter3", - "Counter4" + D_SENSOR_NONE, + D_SENSOR_DHT11, + D_SENSOR_AM2301, + D_SENSOR_DHT22, + D_SENSOR_DS18X20, + D_SENSOR_I2C_SCL, + D_SENSOR_I2C_SDA, + D_SENSOR_WS2812, + D_SENSOR_IRREMOTE, + D_SENSOR_SWITCH "1", + D_SENSOR_SWITCH "2", + D_SENSOR_SWITCH "3", + D_SENSOR_SWITCH "4", + D_SENSOR_BUTTON "1", + D_SENSOR_BUTTON "2", + D_SENSOR_BUTTON "3", + D_SENSOR_BUTTON "4", + D_SENSOR_RELAY "1", + D_SENSOR_RELAY "2", + D_SENSOR_RELAY "3", + D_SENSOR_RELAY "4", + D_SENSOR_RELAY "1I", + D_SENSOR_RELAY "2I", + D_SENSOR_RELAY "3I", + D_SENSOR_RELAY "4I", + D_SENSOR_LED "1", + D_SENSOR_LED "2", + D_SENSOR_LED "3", + D_SENSOR_LED "4", + D_SENSOR_LED "1I", + D_SENSOR_LED "2I", + D_SENSOR_LED "3I", + D_SENSOR_LED "4I", + D_SENSOR_PWM "1", + D_SENSOR_PWM "2", + D_SENSOR_PWM "3", + D_SENSOR_PWM "4", + D_SENSOR_PWM "5", + D_SENSOR_COUNTER "1", + D_SENSOR_COUNTER "2", + D_SENSOR_COUNTER "3", + D_SENSOR_COUNTER "4" }; - + // Programmer selectable GPIO functionality offset by user selectable GPIOs enum fpins_t { GPIO_RXD = GPIO_SENSOR_END, // Serial interface @@ -169,7 +169,7 @@ typedef struct MYIO { typedef struct MYTMPLT { char name[15]; - myio gp; + myio gp; } mytmplt; const uint8_t nicelist[MAXMODULE] PROGMEM = { @@ -211,7 +211,7 @@ const mytmplt modules[MAXMODULE] PROGMEM = { { "Sonoff Basic", // Sonoff Basic (ESP8266) GPIO_KEY1, // GPIO00 Button GPIO_USER, // GPIO01 Serial RXD and Optional sensor - 0, // GPIO02 + 0, // GPIO02 GPIO_USER, // GPIO03 Serial TXD and Optional sensor GPIO_USER, // GPIO04 Optional sensor 0, // GPIO05 @@ -460,13 +460,13 @@ const mytmplt modules[MAXMODULE] PROGMEM = { GPIO_LED1, // GPIO01 Green LED GPIO_TXD, // GPIO02 RX - Pin next to TX on the PCB GPIO_RXD, // GPIO03 TX - Pin next to GND on the PCB - GPIO_PWM2, // GPIO04 W2 + GPIO_PWM2, // GPIO04 W2 GPIO_LED2_INV, // GPIO05 Red LED 0, 0, 0, 0, 0, 0, // Flash connection - GPIO_PWM3, // GPIO12 Blue - GPIO_PWM4, // GPIO13 Green - GPIO_PWM1, // GPIO14 W1 - GPIO_PWM5, // GPIO15 Red + GPIO_PWM3, // GPIO12 Blue + GPIO_PWM4, // GPIO13 Green + GPIO_PWM1, // GPIO14 W1 + GPIO_PWM5, // GPIO15 Red 0, 0 }, { "Sonoff SC", // Sonoff SC (ESP8266) diff --git a/sonoff/support.ino b/sonoff/support.ino index cdf7047a8..44cbaf0ce 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -17,9 +17,6 @@ along with this program. If not, see . */ -const char JSON_SNS_TEMPHUM[] PROGMEM = - "%s, \"%s\":{\"Temperature\":%s, \"Humidity\":%s}"; - /*********************************************************************************************\ * Watchdog extension (https://github.com/esp8266/Arduino/issues/1532) \*********************************************************************************************/ @@ -42,14 +39,14 @@ void osw_osWatch() #ifdef DEBUG_THEO char log[LOGSZ]; - snprintf_P(log, sizeof(log), PSTR("osWatch: FreeRam %d, rssi %d, last_run %d"), ESP.getFreeHeap(), WIFI_getRSSIasQuality(WiFi.RSSI()), last_run); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_OSWATCH " FreeRam %d, rssi %d, last_run %d"), ESP.getFreeHeap(), WIFI_getRSSIasQuality(WiFi.RSSI()), last_run); addLog(LOG_LEVEL_DEBUG, log); #endif // DEBUG_THEO if (last_run >= (OSWATCH_RESET_TIME * 1000)) { - addLog_P(LOG_LEVEL_INFO, PSTR("osWatch: Warning, loop blocked. Restart now")); + addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_OSWATCH " " D_BLOCKED_LOOP ". " D_RESTARTING)); rtcMem.osw_flag = 1; RTC_Save(); -// ESP.restart(); // normal reboot +// ESP.restart(); // normal reboot ESP.reset(); // hard reset } } @@ -72,7 +69,7 @@ String getResetReason() { char buff[32]; if (osw_flag) { - strcpy_P(buff, PSTR("Blocked Loop")); + strcpy_P(buff, PSTR(D_BLOCKED_LOOP)); return String(buff); } else { return ESP.getResetReason(); @@ -82,11 +79,11 @@ String getResetReason() #ifdef DEBUG_THEO void exception_tst(byte type) { -/* +/* Exception (28): epc1=0x4000bf64 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000007 depc=0x00000000 -ctx: cont +ctx: cont sp: 3fff1f30 end: 3fff2840 offset: 01a0 >>>stack>>> @@ -149,6 +146,85 @@ Decoding 14 results * General \*********************************************************************************************/ +char* _dtostrf(double number, unsigned char prec, char *s, bool i18n) +{ + bool negative = false; + + if (isnan(number)) { + strcpy(s, "nan"); + return s; + } + if (isinf(number)) { + strcpy(s, "inf"); + return s; + } + char decimal = '.'; + if (i18n) { + decimal = D_DECIMAL_SEPARATOR[0]; + } + + char* out = s; + + // Handle negative numbers + if (number < 0.0) { + negative = true; + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + // I optimized out most of the divisions + double rounding = 2.0; + for (uint8_t i = 0; i < prec; ++i) { + rounding *= 10.0; + } + rounding = 1.0 / rounding; + number += rounding; + + // Figure out how big our number really is + double tenpow = 1.0; + int digitcount = 1; + while (number >= 10.0 * tenpow) { + tenpow *= 10.0; + digitcount++; + } + number /= tenpow; + + // Handle negative sign + if (negative) { + *out++ = '-'; + } + + // Print the digits, and if necessary, the decimal point + digitcount += prec; + int8_t digit = 0; + while (digitcount-- > 0) { + digit = (int8_t)number; + if (digit > 9) { + digit = 9; // insurance + } + *out++ = (char)('0' | digit); + if ((digitcount == prec) && (prec > 0)) { + *out++ = decimal; + } + number -= digit; + number *= 10.0; + } + + // make sure the string is terminated + *out = 0; + return s; +} + +char* dtostrfd(double number, unsigned char prec, char *s) // Always decimal dot +{ + return _dtostrf(number, prec, s, 0); +} + +char* dtostrfi(double number, unsigned char prec, char *s) // Use localized decimal dot +{ + return _dtostrf(number, prec, s, 1); +} + boolean parseIP(uint32_t* addr, const char* str) { uint8_t *part = (uint8_t*)addr; @@ -169,7 +245,7 @@ boolean parseIP(uint32_t* addr, const char* str) void mqttfy(byte option, char* str) { // option 0 = replace by underscore -// option 1 = delete character +// option 1 = delete character uint16_t i = 0; while (str[i] > 0) { // if ((str[i] == '/') || (str[i] == '+') || (str[i] == '#') || (str[i] == ' ')) { @@ -233,6 +309,23 @@ bool newerVersion(char* version_str) return (version > VERSION); } +char* getPowerDevice(char* dest, uint8_t idx, size_t size, uint8_t option) +{ + char sidx[8]; + + strncpy_P(dest, S_RSLT_POWER, size); + if ((Maxdevice + option) > 1) { + snprintf_P(sidx, sizeof(sidx), PSTR("%d"), idx); + strncat(dest, sidx, size); + } + return dest; +} + +char* getPowerDevice(char* dest, uint8_t idx, size_t size) +{ + return getPowerDevice(dest, idx, size, 0); +} + /*********************************************************************************************\ * Wifi \*********************************************************************************************/ @@ -295,7 +388,7 @@ void WIFI_wps_status_cb(wps_cb_status status) if (WPS_CB_ST_SUCCESS == _wpsresult) { wifi_wps_disable(); } else { - snprintf_P(log, sizeof(log), PSTR("WPSconfig: FAILED with status %d"), _wpsresult); + snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_WPS_FAILED_WITH_STATUS " %d"), _wpsresult); addLog(LOG_LEVEL_DEBUG, log); _wifiConfigCounter = 2; } @@ -342,20 +435,20 @@ void WIFI_config(uint8_t type) restartflag = 2; } else if (WIFI_SMARTCONFIG == _wificonfigflag) { - addLog_P(LOG_LEVEL_INFO, PSTR("Smartconfig: Active for 1 minute")); + addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_WCFG_1_SMARTCONFIG D_ACTIVE_FOR_1_MINUTE)); WiFi.beginSmartConfig(); } else if (WIFI_WPSCONFIG == _wificonfigflag) { if (WIFI_beginWPSConfig()) { - addLog_P(LOG_LEVEL_INFO, PSTR("WPSconfig: Active for 1 minute")); + addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_WCFG_3_WPSCONFIG D_ACTIVE_FOR_1_MINUTE)); } else { - addLog_P(LOG_LEVEL_INFO, PSTR("WPSconfig: Failed to start")); + addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_WCFG_3_WPSCONFIG D_FAILED_TO_START)); _wifiConfigCounter = 3; } } #ifdef USE_WEBSERVER else if (WIFI_MANAGER == _wificonfigflag) { - addLog_P(LOG_LEVEL_INFO, PSTR("Wifimanager: Active for 1 minute")); + addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_WCFG_2_WIFIMANAGER D_ACTIVE_FOR_1_MINUTE)); beginWifiManager(); } #endif // USE_WEBSERVER @@ -371,7 +464,7 @@ void WIFI_begin(uint8_t flag) UDP_Disconnect(); #endif // USE_EMULATION if (!strncmp_P(ESP.getSdkVersion(),PSTR("1.5.3"),5)) { - addLog_P(LOG_LEVEL_DEBUG, PSTR("Wifi: Patch issue 2186")); + addLog_P(LOG_LEVEL_DEBUG, S_LOG_WIFI, PSTR(D_PATCH_ISSUE_2186)); WiFi.mode(WIFI_OFF); // See https://github.com/esp8266/Arduino/issues/2186 } WiFi.disconnect(); @@ -402,7 +495,7 @@ void WIFI_begin(uint8_t flag) } WiFi.hostname(Hostname); WiFi.begin(sysCfg.sta_ssid[sysCfg.sta_active], sysCfg.sta_pwd[sysCfg.sta_active]); - snprintf_P(log, sizeof(log), PSTR("Wifi: Connecting to AP%d %s in mode 11%c as %s..."), + snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_CONNECTING_TO_AP "%d %s " D_IN_MODE " 11%c " D_AS " %s..."), sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active], PhyMode[WiFi.getPhyMode() & 0x3], Hostname); addLog(LOG_LEVEL_INFO, log); } @@ -412,7 +505,7 @@ void WIFI_check_ip() if ((WL_CONNECTED == WiFi.status()) && (static_cast(WiFi.localIP()) != 0)) { _wificounter = WIFI_CHECK_SEC; _wifiretry = WIFI_RETRY_SEC; - addLog_P((_wifistatus != WL_CONNECTED) ? LOG_LEVEL_INFO : LOG_LEVEL_DEBUG_MORE, PSTR("Wifi: Connected")); + addLog_P((_wifistatus != WL_CONNECTED) ? LOG_LEVEL_INFO : LOG_LEVEL_DEBUG_MORE, S_LOG_WIFI, PSTR(D_CONNECTED)); if (_wifistatus != WL_CONNECTED) { // addLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Set IP addresses")); sysCfg.ip_address[1] = (uint32_t)WiFi.gatewayIP(); @@ -424,12 +517,12 @@ void WIFI_check_ip() _wifistatus = WiFi.status(); switch (_wifistatus) { case WL_CONNECTED: - addLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Connect failed as no IP address received")); + addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_NO_IP_ADDRESS)); _wifistatus = 0; _wifiretry = WIFI_RETRY_SEC; break; case WL_NO_SSID_AVAIL: - addLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Connect failed as AP cannot be reached")); + addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_AP_NOT_REACHED)); if (_wifiretry > (WIFI_RETRY_SEC / 2)) { _wifiretry = WIFI_RETRY_SEC / 2; } @@ -438,7 +531,7 @@ void WIFI_check_ip() } break; case WL_CONNECT_FAILED: - addLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Connect failed with AP incorrect password")); + addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_WRONG_PASSWORD)); if (_wifiretry > (WIFI_RETRY_SEC / 2)) { _wifiretry = WIFI_RETRY_SEC / 2; } @@ -448,9 +541,9 @@ void WIFI_check_ip() break; default: // WL_IDLE_STATUS and WL_DISCONNECTED if (!_wifiretry || ((WIFI_RETRY_SEC / 2) == _wifiretry)) { - addLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Connect failed with AP timeout")); + addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_AP_TIMEOUT)); } else { - addLog_P(LOG_LEVEL_DEBUG, PSTR("Wifi: Attempting connection...")); + addLog_P(LOG_LEVEL_DEBUG, S_LOG_WIFI, PSTR(D_ATTEMPTING_CONNECTION)); } } if (_wifiretry) { @@ -500,7 +593,7 @@ void WIFI_Check(uint8_t param) strlcpy(sysCfg.sta_pwd[0], WiFi.psk().c_str(), sizeof(sysCfg.sta_pwd[0])); } sysCfg.sta_active = 0; - snprintf_P(log, sizeof(log), PSTR("Wificonfig: SSID1 %s and Password1 %s"), sysCfg.sta_ssid[0], sysCfg.sta_pwd[0]); + snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_WCFG_1_SMARTCONFIG D_CMND_SSID "1 %s, " D_CMND_PASSWORD "1 %s"), sysCfg.sta_ssid[0], sysCfg.sta_pwd[0]); addLog(LOG_LEVEL_INFO, log); } } @@ -512,7 +605,7 @@ void WIFI_Check(uint8_t param) } } else { if (_wificounter <= 0) { - addLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("Wifi: Checking connection...")); + addLog_P(LOG_LEVEL_DEBUG_MORE, S_LOG_WIFI, PSTR(D_CHECKING_CONNECTION)); _wificounter = WIFI_CHECK_SEC; WIFI_check_ip(); } @@ -520,7 +613,7 @@ void WIFI_Check(uint8_t param) #ifdef USE_DISCOVERY if (!mDNSbegun) { mDNSbegun = MDNS.begin(Hostname); - snprintf_P(log, sizeof(log), PSTR("mDNS: %s"), (mDNSbegun)?"Initialized":"Failed"); + snprintf_P(log, sizeof(log), PSTR(D_LOG_MDNS "%s"), (mDNSbegun) ? D_INITIALIZED : D_FAILED); addLog(LOG_LEVEL_INFO, log); } #endif // USE_DISCOVERY @@ -530,7 +623,7 @@ void WIFI_Check(uint8_t param) #ifdef USE_DISCOVERY #ifdef WEBSERVER_ADVERTISE MDNS.addService("http", "tcp", 80); -#endif // WEBSERVER_ADVERTISE +#endif // WEBSERVER_ADVERTISE #endif // USE_DISCOVERY } else { stopWebserver(); @@ -590,14 +683,14 @@ boolean mdns_discoverMQTTServer() n = MDNS.queryService("mqtt", "tcp"); // Search for mqtt service - snprintf_P(log, sizeof(log), PSTR("mDNS: Query done with %d mqtt services found"), n); + snprintf_P(log, sizeof(log), PSTR(D_LOG_MDNS D_QUERY_DONE " %d"), n); addLog(LOG_LEVEL_INFO, log); if (n > 0) { // Note: current strategy is to get the first MQTT service (even when many are found) IPtoCharArray(MDNS.IP(0), ip_str, 20); - - snprintf_P(log, sizeof(log), PSTR("mDNS: Service found on %s ip %s port %d"), + + snprintf_P(log, sizeof(log), PSTR(D_LOG_MDNS D_MQTT_SERVICE_FOUND " %s, " D_IP_ADDRESS " %s, " D_PORT " %d"), MDNS.hostname(0).c_str(), ip_str, MDNS.port(0)); addLog(LOG_LEVEL_INFO, log); @@ -701,7 +794,7 @@ void i2c_scan(char *devs, unsigned int devs_len) byte any = 0; char tstr[10]; - snprintf_P(devs, devs_len, PSTR("{\"I2Cscan\":\"Device(s) found at")); + snprintf_P(devs, devs_len, PSTR("{\"" D_CMND_I2CSCAN "\":\"" D_I2CSCAN_DEVICES_FOUND_AT)); for (address = 1; address <= 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission(); @@ -711,13 +804,13 @@ void i2c_scan(char *devs, unsigned int devs_len) any = 1; } else if (4 == error) { - snprintf_P(devs, devs_len, PSTR("{\"I2Cscan\":\"Unknown error at 0x%2x\"}"), address); + snprintf_P(devs, devs_len, PSTR("{\"" D_CMND_I2CSCAN "\":\"" D_I2CSCAN_UNKNOWN_ERROR_AT " 0x%2x\"}"), address); } } if (any) { strncat(devs, "\"}", devs_len); } else { - snprintf_P(devs, devs_len, PSTR("{\"I2Cscan\":\"No devices found\"}")); + snprintf_P(devs, devs_len, PSTR("{\"" D_CMND_I2CSCAN "\":\"" D_I2CSCAN_NO_DEVICES_FOUND "\"}")); } } #endif // USE_I2C @@ -741,7 +834,6 @@ extern "C" { Ticker tickerRTC; static const uint8_t monthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // API starts months from 1, this array starts from 0 -static const char monthNames[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; uint32_t utctime = 0; uint32_t loctime = 0; @@ -762,7 +854,7 @@ String getBuildDateTime() int month; int day; int year; - + // sscanf(mdate, "%s %d %d", bdt, &day, &year); // Not implemented in 2.3.0 and probably too many code byte i = 0; for (str = strtok_r(mdate, " ", &p); str && i < 3; str = strtok_r(NULL, " ", &p)) { @@ -778,7 +870,7 @@ String getBuildDateTime() } } month = (strstr(monthNames, smonth) -monthNames) /3 +1; - snprintf_P(bdt, sizeof(bdt), PSTR("%d-%02d-%02dT%s"), year, month, day, __TIME__); + snprintf_P(bdt, sizeof(bdt), PSTR("%d" D_YEAR_MONTH_SEPARATOR "%02d" D_MONTH_DAY_SEPARATOR "%02d" D_DATE_TIME_SEPARATOR "%s"), year, month, day, __TIME__); return String(bdt); } @@ -786,8 +878,8 @@ String getDateTime() { // "2017-03-07T11:08:02" - ISO8601:2004 char dt[21]; - - snprintf_P(dt, sizeof(dt), PSTR("%04d-%02d-%02dT%02d:%02d:%02d"), + + snprintf_P(dt, sizeof(dt), PSTR("%04d" D_YEAR_MONTH_SEPARATOR "%02d" D_MONTH_DAY_SEPARATOR "%02d" D_DATE_TIME_SEPARATOR "%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), rtcTime.Year, rtcTime.Month, rtcTime.Day, rtcTime.Hour, rtcTime.Minute, rtcTime.Second); return String(dt); } @@ -801,7 +893,7 @@ String getUTCDateTime() breakTime(utctime, tmpTime); tmpTime.Year += 1970; - snprintf_P(dt, sizeof(dt), PSTR("%04d-%02d-%02dT%02d:%02d:%02d"), + snprintf_P(dt, sizeof(dt), PSTR("%04d" D_YEAR_MONTH_SEPARATOR "%02d" D_MONTH_DAY_SEPARATOR "%02d" D_DATE_TIME_SEPARATOR "%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), tmpTime.Year, tmpTime.Month, tmpTime.Day, tmpTime.Hour, tmpTime.Minute, tmpTime.Second); return String(dt); } @@ -984,11 +1076,11 @@ void rtc_second() rtcTime.Year = tmpTime.Year + 1970; dsttime = toTime_t(myDST, rtcTime.Year); stdtime = toTime_t(mySTD, rtcTime.Year); - snprintf_P(log, sizeof(log), PSTR("RTC: (UTC) %s"), rtc_time(0).c_str()); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION "(" D_UTC_TIME ") %s"), rtc_time(0).c_str()); addLog(LOG_LEVEL_DEBUG, log); - snprintf_P(log, sizeof(log), PSTR("RTC: (DST) %s"), rtc_time(2).c_str()); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION "(" D_DST_TIME ") %s"), rtc_time(2).c_str()); addLog(LOG_LEVEL_DEBUG, log); - snprintf_P(log, sizeof(log), PSTR("RTC: (STD) %s"), rtc_time(3).c_str()); + snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION "(" D_STD_TIME ") %s"), rtc_time(3).c_str()); addLog(LOG_LEVEL_DEBUG, log); } } @@ -1035,7 +1127,7 @@ void rtc_init() float convertTemp(float c) { float result = c; - + if (!isnan(c) && sysCfg.flag.temperature_conversion) { result = c * 1.8 + 32; // Fahrenheit } @@ -1072,7 +1164,7 @@ void syslog(const char *message) } else { syslog_level = 0; syslog_timer = SYSLOG_TIMER; - snprintf_P(str, sizeof(str), PSTR("SYSL: Syslog Host not found so logging disabled for %d seconds. Consider syslog 0"), SYSLOG_TIMER); + snprintf_P(str, sizeof(str), PSTR(D_LOG_APPLICATION D_SYSLOG_HOST_NOT_FOUND ". " D_RETRY_IN " %d " D_UNIT_SECOND), SYSLOG_TIMER); addLog(LOG_LEVEL_INFO, str); } } @@ -1081,7 +1173,7 @@ void addLog(byte loglevel, const char *line) { char mxtime[9]; - snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d:%02d:%02d"), rtcTime.Hour, rtcTime.Minute, rtcTime.Second); + snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), rtcTime.Hour, rtcTime.Minute, rtcTime.Second); if (loglevel <= seriallog_level) Serial.printf("%s %s\n", mxtime, line); #ifdef USE_WEBSERVER @@ -1106,6 +1198,17 @@ void addLog_P(byte loglevel, const char *formatP) addLog(loglevel, mess); } +void addLog_P(byte loglevel, const char *formatP, const char *formatP2) +{ + char mess[LOGSZ]; // was MESSZ + char mes2[LOGSZ]; + + snprintf_P(mess, sizeof(mess), formatP); + snprintf_P(mes2, sizeof(mes2), formatP2); + strncat(mess, mes2, sizeof(mess)); + addLog(loglevel, mess); +} + /*********************************************************************************************\ * \*********************************************************************************************/ diff --git a/sonoff/user_config.h b/sonoff/user_config.h index ec8cc5984..a81b0bab0 100644 --- a/sonoff/user_config.h +++ b/sonoff/user_config.h @@ -25,6 +25,10 @@ * Corresponding MQTT/Serial/Console commands in [brackets] \*********************************************************************************************/ +// -- Localization -------------------------------- +#define LANGUAGE "language\en-GB.h" +//#define LANGUAGE "language\nl-NL.h" + // -- Project ------------------------------------- #define PROJECT "sonoff" // PROJECT is used as the default topic delimiter and OTA file name // As an IDE restriction it needs to be the same as the main .ino file @@ -45,7 +49,7 @@ #define STA_PASS2 "VnsqrtnrsddbrN" // [Password2] Optional alternate AP Wifi password #define WIFI_CONFIG_TOOL WIFI_WPSCONFIG // [WifiConfig] Default tool if wifi fails to connect // (WIFI_RESTART, WIFI_SMARTCONFIG, WIFI_MANAGER, WIFI_WPSCONFIG, WIFI_RETRY) - + // -- Syslog -------------------------------------- #define SYS_LOG_HOST "domus1" // [LogHost] (Linux) syslog host #define SYS_LOG_PORT 514 // [LogPort] default syslog UDP port @@ -172,7 +176,7 @@ /*********************************************************************************************\ * Compile a minimal version if upgrade memory gets tight ONLY TO BE USED FOR UPGRADE STEP 1! - * To be used as step 1 during upgrade. + * To be used as step 1 during upgrade. * Step 2 is re-compile with option BE_MINIMAL commented out. * !!! Needed for next release of Arduino/ESP8266 (+22k code, +2k mem) !!! \*********************************************************************************************/ diff --git a/sonoff/user_config_override.h b/sonoff/user_config_override.h index 39ce166cb..02631af99 100644 --- a/sonoff/user_config_override.h +++ b/sonoff/user_config_override.h @@ -19,7 +19,7 @@ /*****************************************************************************************************\ * ATTENTION: - Changes to most PARAMETER defines will only override flash settings if you change - * define CFG_HOLDER. + * define CFG_HOLDER. * - Expect compiler warnings when no ifdef/undef/endif sequence is used. * - You still need to update user_config.h for major defines MODULE and USE_MQTT_TLS. * - Changing MODULE defines are not being tested for validity as they are in user_config.h. diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index f17883609..c12da3973 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -41,7 +41,7 @@ const char HTTP_HEAD[] PROGMEM = "x=null;" // Allow for abortion "function u(){" "if(cn>=0){" - "document.getElementById('t').innerHTML='Restart in '+cn+' seconds';" + "document.getElementById('t').innerHTML='" D_RESTART_IN " '+cn+' " D_SECONDS "';" "cn--;" "setTimeout(u,1000);" "}" @@ -91,7 +91,7 @@ const char HTTP_HEAD[] PROGMEM = "" "" "
" - "

{ha} Module

{h}

"; + "

{ha} " D_MODULE "

{h}

"; const char HTTP_SCRIPT_CONSOL[] PROGMEM = "var sn=0;" // Scroll position "var id=99;" // Get most of weblog initially @@ -141,112 +141,118 @@ const char HTTP_SCRIPT_MODULE2[] PROGMEM = const char HTTP_SCRIPT_MODULE3[] PROGMEM = "\";" "os=o0.replace(/}1/g,\"