Add I18n and fix invalid JSON

5.6.1i
* Add basic internationalization and localization (#763)
* Fix invalid JSON (#822)
This commit is contained in:
arendst 2017-09-02 14:37:02 +02:00
parent 740a0c6283
commit 0fbbc23b2c
29 changed files with 2539 additions and 1035 deletions

View File

@ -1,7 +1,7 @@
## Sonoff-Tasmota ## 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. 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 ### ATTENTION All versions

View File

@ -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) * Add PulseTime to power check at startup (#526)
* *
* 5.6.1g * 5.6.1g

80
sonoff/i18n.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#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;

665
sonoff/language/en-GB.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/*************************** 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=<username>&password=<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"

666
sonoff/language/nl-NL.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/*************************** 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=<gebruiker>&password=<webwachtwoord>"
// 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"

View File

@ -115,14 +115,14 @@ struct SYSCFG {
uint16_t hlw_umax; uint16_t hlw_umax;
uint16_t hlw_imin; uint16_t hlw_imin;
uint16_t hlw_imax; uint16_t hlw_imax;
uint16_t hlw_mpl; // MaxPowerLimit uint16_t hlw_mpl; // MaxPowerLimit
uint16_t hlw_mplh; // MaxPowerLimitHold uint16_t hlw_mplh; // MaxPowerLimitHold
uint16_t hlw_mplw; // MaxPowerLimitWindow uint16_t hlw_mplw; // MaxPowerLimitWindow
uint16_t hlw_mspl; // MaxSafePowerLimit uint16_t hlw_mspl; // MaxSafePowerLimit
uint16_t hlw_msplh; // MaxSafePowerLimitHold uint16_t hlw_msplh; // MaxSafePowerLimitHold
uint16_t hlw_msplw; // MaxSafePowerLimitWindow uint16_t hlw_msplw; // MaxSafePowerLimitWindow
uint16_t hlw_mkwh; // MaxEnergy uint16_t hlw_mkwh; // MaxEnergy
uint16_t hlw_mkwhs; // MaxEnergyStart uint16_t hlw_mkwhs; // MaxEnergyStart
// 3.0.6 // 3.0.6
uint16_t mqtt_retry; // was ex_pulsetime until 4.0.4 uint16_t mqtt_retry; // was ex_pulsetime until 4.0.4
@ -219,6 +219,5 @@ struct RTCMEM {
// See issue https://github.com/esp8266/Arduino/issues/2913 // See issue https://github.com/esp8266/Arduino/issues/2913
#ifdef USE_ADC_VCC #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 #endif

View File

@ -224,7 +224,8 @@ void CFG_Save(byte rotate)
delay(1); 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); addLog(LOG_LEVEL_DEBUG, log);
_cfgHash = getHash(); _cfgHash = getHash();
} }
@ -259,7 +260,8 @@ void CFG_Load()
} }
delay(1); 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); addLog(LOG_LEVEL_DEBUG, log);
if (sysCfg.cfg_holder != CFG_HOLDER) { if (sysCfg.cfg_holder != CFG_HOLDER) {
// Auto upgrade // Auto upgrade
@ -288,7 +290,7 @@ void CFG_Erase()
uint32_t _sectorEnd = ESP.getFlashChipRealSize() / SPI_FLASH_SEC_SIZE; uint32_t _sectorEnd = ESP.getFlashChipRealSize() / SPI_FLASH_SEC_SIZE;
boolean _serialoutput = (LOG_LEVEL_DEBUG_MORE <= seriallog_level); 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); addLog(LOG_LEVEL_DEBUG, log);
for (uint32_t _sector = _sectorStart; _sector < _sectorEnd; _sector++) { for (uint32_t _sector = _sectorStart; _sector < _sectorEnd; _sector++) {
@ -296,12 +298,12 @@ void CFG_Erase()
result = spi_flash_erase_sector(_sector); result = spi_flash_erase_sector(_sector);
interrupts(); interrupts();
if (_serialoutput) { if (_serialoutput) {
Serial.print(F("Flash: Erased sector ")); Serial.print(F(D_LOG_APPLICATION D_ERASED_SECTOR " "));
Serial.print(_sector); Serial.print(_sector);
if (SPI_FLASH_RESULT_OK == result) { if (SPI_FLASH_RESULT_OK == result) {
Serial.println(F(" OK")); Serial.println(F(" " D_OK));
} else { } else {
Serial.println(F(" Error")); Serial.println(F(" " D_ERROR));
} }
delay(10); delay(10);
} }
@ -364,7 +366,7 @@ void CFG_Dump(char* parms)
void CFG_Default() 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_DefaultSet1();
CFG_DefaultSet2(); CFG_DefaultSet2();
CFG_Save(2); CFG_Save(2);

File diff suppressed because it is too large Load Diff

View File

@ -65,48 +65,48 @@ enum upins_t {
// Text in webpage Module Parameters and commands GPIOS and GPIO // Text in webpage Module Parameters and commands GPIOS and GPIO
const char sensors[GPIO_SENSOR_END][9] PROGMEM = { const char sensors[GPIO_SENSOR_END][9] PROGMEM = {
"None", D_SENSOR_NONE,
"DHT11", D_SENSOR_DHT11,
"AM2301", D_SENSOR_AM2301,
"DHT22", D_SENSOR_DHT22,
"DS18x20", D_SENSOR_DS18X20,
"I2C SCL", D_SENSOR_I2C_SCL,
"I2C SDA", D_SENSOR_I2C_SDA,
"WS2812", D_SENSOR_WS2812,
"IRremote", D_SENSOR_IRREMOTE,
"Switch1", D_SENSOR_SWITCH "1",
"Switch2", D_SENSOR_SWITCH "2",
"Switch3", D_SENSOR_SWITCH "3",
"Switch4", D_SENSOR_SWITCH "4",
"Button1", D_SENSOR_BUTTON "1",
"Button2", D_SENSOR_BUTTON "2",
"Button3", D_SENSOR_BUTTON "3",
"Button4", D_SENSOR_BUTTON "4",
"Relay1", D_SENSOR_RELAY "1",
"Relay2", D_SENSOR_RELAY "2",
"Relay3", D_SENSOR_RELAY "3",
"Relay4", D_SENSOR_RELAY "4",
"Relay1I", D_SENSOR_RELAY "1I",
"Relay2I", D_SENSOR_RELAY "2I",
"Relay3I", D_SENSOR_RELAY "3I",
"Relay4I", D_SENSOR_RELAY "4I",
"Led1", D_SENSOR_LED "1",
"Led2", D_SENSOR_LED "2",
"Led3", D_SENSOR_LED "3",
"Led4", D_SENSOR_LED "4",
"Led1I", D_SENSOR_LED "1I",
"Led2I", D_SENSOR_LED "2I",
"Led3I", D_SENSOR_LED "3I",
"Led4I", D_SENSOR_LED "4I",
"PWM1", D_SENSOR_PWM "1",
"PWM2", D_SENSOR_PWM "2",
"PWM3", D_SENSOR_PWM "3",
"PWM4", D_SENSOR_PWM "4",
"PWM5", D_SENSOR_PWM "5",
"Counter1", D_SENSOR_COUNTER "1",
"Counter2", D_SENSOR_COUNTER "2",
"Counter3", D_SENSOR_COUNTER "3",
"Counter4" D_SENSOR_COUNTER "4"
}; };
// Programmer selectable GPIO functionality offset by user selectable GPIOs // Programmer selectable GPIO functionality offset by user selectable GPIOs

View File

@ -17,9 +17,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
const char JSON_SNS_TEMPHUM[] PROGMEM =
"%s, \"%s\":{\"Temperature\":%s, \"Humidity\":%s}";
/*********************************************************************************************\ /*********************************************************************************************\
* Watchdog extension (https://github.com/esp8266/Arduino/issues/1532) * Watchdog extension (https://github.com/esp8266/Arduino/issues/1532)
\*********************************************************************************************/ \*********************************************************************************************/
@ -42,11 +39,11 @@ void osw_osWatch()
#ifdef DEBUG_THEO #ifdef DEBUG_THEO
char log[LOGSZ]; 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); addLog(LOG_LEVEL_DEBUG, log);
#endif // DEBUG_THEO #endif // DEBUG_THEO
if (last_run >= (OSWATCH_RESET_TIME * 1000)) { 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; rtcMem.osw_flag = 1;
RTC_Save(); RTC_Save();
// ESP.restart(); // normal reboot // ESP.restart(); // normal reboot
@ -72,7 +69,7 @@ String getResetReason()
{ {
char buff[32]; char buff[32];
if (osw_flag) { if (osw_flag) {
strcpy_P(buff, PSTR("Blocked Loop")); strcpy_P(buff, PSTR(D_BLOCKED_LOOP));
return String(buff); return String(buff);
} else { } else {
return ESP.getResetReason(); return ESP.getResetReason();
@ -149,6 +146,85 @@ Decoding 14 results
* General * 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) boolean parseIP(uint32_t* addr, const char* str)
{ {
uint8_t *part = (uint8_t*)addr; uint8_t *part = (uint8_t*)addr;
@ -233,6 +309,23 @@ bool newerVersion(char* version_str)
return (version > VERSION); 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 * Wifi
\*********************************************************************************************/ \*********************************************************************************************/
@ -295,7 +388,7 @@ void WIFI_wps_status_cb(wps_cb_status status)
if (WPS_CB_ST_SUCCESS == _wpsresult) { if (WPS_CB_ST_SUCCESS == _wpsresult) {
wifi_wps_disable(); wifi_wps_disable();
} else { } 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); addLog(LOG_LEVEL_DEBUG, log);
_wifiConfigCounter = 2; _wifiConfigCounter = 2;
} }
@ -342,20 +435,20 @@ void WIFI_config(uint8_t type)
restartflag = 2; restartflag = 2;
} }
else if (WIFI_SMARTCONFIG == _wificonfigflag) { 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(); WiFi.beginSmartConfig();
} }
else if (WIFI_WPSCONFIG == _wificonfigflag) { else if (WIFI_WPSCONFIG == _wificonfigflag) {
if (WIFI_beginWPSConfig()) { 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 { } 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; _wifiConfigCounter = 3;
} }
} }
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
else if (WIFI_MANAGER == _wificonfigflag) { 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(); beginWifiManager();
} }
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
@ -371,7 +464,7 @@ void WIFI_begin(uint8_t flag)
UDP_Disconnect(); UDP_Disconnect();
#endif // USE_EMULATION #endif // USE_EMULATION
if (!strncmp_P(ESP.getSdkVersion(),PSTR("1.5.3"),5)) { 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.mode(WIFI_OFF); // See https://github.com/esp8266/Arduino/issues/2186
} }
WiFi.disconnect(); WiFi.disconnect();
@ -402,7 +495,7 @@ void WIFI_begin(uint8_t flag)
} }
WiFi.hostname(Hostname); WiFi.hostname(Hostname);
WiFi.begin(sysCfg.sta_ssid[sysCfg.sta_active], sysCfg.sta_pwd[sysCfg.sta_active]); 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); sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active], PhyMode[WiFi.getPhyMode() & 0x3], Hostname);
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
} }
@ -412,7 +505,7 @@ void WIFI_check_ip()
if ((WL_CONNECTED == WiFi.status()) && (static_cast<uint32_t>(WiFi.localIP()) != 0)) { if ((WL_CONNECTED == WiFi.status()) && (static_cast<uint32_t>(WiFi.localIP()) != 0)) {
_wificounter = WIFI_CHECK_SEC; _wificounter = WIFI_CHECK_SEC;
_wifiretry = WIFI_RETRY_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) { if (_wifistatus != WL_CONNECTED) {
// addLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Set IP addresses")); // addLog_P(LOG_LEVEL_INFO, PSTR("Wifi: Set IP addresses"));
sysCfg.ip_address[1] = (uint32_t)WiFi.gatewayIP(); sysCfg.ip_address[1] = (uint32_t)WiFi.gatewayIP();
@ -424,12 +517,12 @@ void WIFI_check_ip()
_wifistatus = WiFi.status(); _wifistatus = WiFi.status();
switch (_wifistatus) { switch (_wifistatus) {
case WL_CONNECTED: 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; _wifistatus = 0;
_wifiretry = WIFI_RETRY_SEC; _wifiretry = WIFI_RETRY_SEC;
break; break;
case WL_NO_SSID_AVAIL: 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)) { if (_wifiretry > (WIFI_RETRY_SEC / 2)) {
_wifiretry = WIFI_RETRY_SEC / 2; _wifiretry = WIFI_RETRY_SEC / 2;
} }
@ -438,7 +531,7 @@ void WIFI_check_ip()
} }
break; break;
case WL_CONNECT_FAILED: 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)) { if (_wifiretry > (WIFI_RETRY_SEC / 2)) {
_wifiretry = WIFI_RETRY_SEC / 2; _wifiretry = WIFI_RETRY_SEC / 2;
} }
@ -448,9 +541,9 @@ void WIFI_check_ip()
break; break;
default: // WL_IDLE_STATUS and WL_DISCONNECTED default: // WL_IDLE_STATUS and WL_DISCONNECTED
if (!_wifiretry || ((WIFI_RETRY_SEC / 2) == _wifiretry)) { 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 { } else {
addLog_P(LOG_LEVEL_DEBUG, PSTR("Wifi: Attempting connection...")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_WIFI, PSTR(D_ATTEMPTING_CONNECTION));
} }
} }
if (_wifiretry) { 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])); strlcpy(sysCfg.sta_pwd[0], WiFi.psk().c_str(), sizeof(sysCfg.sta_pwd[0]));
} }
sysCfg.sta_active = 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); addLog(LOG_LEVEL_INFO, log);
} }
} }
@ -512,7 +605,7 @@ void WIFI_Check(uint8_t param)
} }
} else { } else {
if (_wificounter <= 0) { 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; _wificounter = WIFI_CHECK_SEC;
WIFI_check_ip(); WIFI_check_ip();
} }
@ -520,7 +613,7 @@ void WIFI_Check(uint8_t param)
#ifdef USE_DISCOVERY #ifdef USE_DISCOVERY
if (!mDNSbegun) { if (!mDNSbegun) {
mDNSbegun = MDNS.begin(Hostname); 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); addLog(LOG_LEVEL_INFO, log);
} }
#endif // USE_DISCOVERY #endif // USE_DISCOVERY
@ -590,14 +683,14 @@ boolean mdns_discoverMQTTServer()
n = MDNS.queryService("mqtt", "tcp"); // Search for mqtt service 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); addLog(LOG_LEVEL_INFO, log);
if (n > 0) { if (n > 0) {
// Note: current strategy is to get the first MQTT service (even when many are found) // Note: current strategy is to get the first MQTT service (even when many are found)
IPtoCharArray(MDNS.IP(0), ip_str, 20); 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)); MDNS.hostname(0).c_str(), ip_str, MDNS.port(0));
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
@ -701,7 +794,7 @@ void i2c_scan(char *devs, unsigned int devs_len)
byte any = 0; byte any = 0;
char tstr[10]; 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++) { for (address = 1; address <= 127; address++) {
Wire.beginTransmission(address); Wire.beginTransmission(address);
error = Wire.endTransmission(); error = Wire.endTransmission();
@ -711,13 +804,13 @@ void i2c_scan(char *devs, unsigned int devs_len)
any = 1; any = 1;
} }
else if (4 == error) { 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) { if (any) {
strncat(devs, "\"}", devs_len); strncat(devs, "\"}", devs_len);
} else { } 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 #endif // USE_I2C
@ -741,7 +834,6 @@ extern "C" {
Ticker tickerRTC; 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 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 utctime = 0;
uint32_t loctime = 0; uint32_t loctime = 0;
@ -778,7 +870,7 @@ String getBuildDateTime()
} }
} }
month = (strstr(monthNames, smonth) -monthNames) /3 +1; 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); return String(bdt);
} }
@ -787,7 +879,7 @@ String getDateTime()
// "2017-03-07T11:08:02" - ISO8601:2004 // "2017-03-07T11:08:02" - ISO8601:2004
char dt[21]; 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); rtcTime.Year, rtcTime.Month, rtcTime.Day, rtcTime.Hour, rtcTime.Minute, rtcTime.Second);
return String(dt); return String(dt);
} }
@ -801,7 +893,7 @@ String getUTCDateTime()
breakTime(utctime, tmpTime); breakTime(utctime, tmpTime);
tmpTime.Year += 1970; 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); tmpTime.Year, tmpTime.Month, tmpTime.Day, tmpTime.Hour, tmpTime.Minute, tmpTime.Second);
return String(dt); return String(dt);
} }
@ -984,11 +1076,11 @@ void rtc_second()
rtcTime.Year = tmpTime.Year + 1970; rtcTime.Year = tmpTime.Year + 1970;
dsttime = toTime_t(myDST, rtcTime.Year); dsttime = toTime_t(myDST, rtcTime.Year);
stdtime = toTime_t(mySTD, 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); 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); 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); addLog(LOG_LEVEL_DEBUG, log);
} }
} }
@ -1072,7 +1164,7 @@ void syslog(const char *message)
} else { } else {
syslog_level = 0; syslog_level = 0;
syslog_timer = SYSLOG_TIMER; 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); addLog(LOG_LEVEL_INFO, str);
} }
} }
@ -1081,7 +1173,7 @@ void addLog(byte loglevel, const char *line)
{ {
char mxtime[9]; 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); if (loglevel <= seriallog_level) Serial.printf("%s %s\n", mxtime, line);
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
@ -1106,6 +1198,17 @@ void addLog_P(byte loglevel, const char *formatP)
addLog(loglevel, mess); 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);
}
/*********************************************************************************************\ /*********************************************************************************************\
* *
\*********************************************************************************************/ \*********************************************************************************************/

View File

@ -25,6 +25,10 @@
* Corresponding MQTT/Serial/Console commands in [brackets] * Corresponding MQTT/Serial/Console commands in [brackets]
\*********************************************************************************************/ \*********************************************************************************************/
// -- Localization --------------------------------
#define LANGUAGE "language\en-GB.h"
//#define LANGUAGE "language\nl-NL.h"
// -- Project ------------------------------------- // -- Project -------------------------------------
#define PROJECT "sonoff" // PROJECT is used as the default topic delimiter and OTA file name #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 // As an IDE restriction it needs to be the same as the main .ino file

View File

@ -41,7 +41,7 @@ const char HTTP_HEAD[] PROGMEM =
"x=null;" // Allow for abortion "x=null;" // Allow for abortion
"function u(){" "function u(){"
"if(cn>=0){" "if(cn>=0){"
"document.getElementById('t').innerHTML='Restart in '+cn+' seconds';" "document.getElementById('t').innerHTML='" D_RESTART_IN " '+cn+' " D_SECONDS "';"
"cn--;" "cn--;"
"setTimeout(u,1000);" "setTimeout(u,1000);"
"}" "}"
@ -91,7 +91,7 @@ const char HTTP_HEAD[] PROGMEM =
"</head>" "</head>"
"<body>" "<body>"
"<div style='text-align:left;display:inline-block;min-width:340px;'>" "<div style='text-align:left;display:inline-block;min-width:340px;'>"
"<div style='text-align:center;'><h3>{ha} Module</h3><h2>{h}</h2></div>"; "<div style='text-align:center;'><h3>{ha} " D_MODULE "</h3><h2>{h}</h2></div>";
const char HTTP_SCRIPT_CONSOL[] PROGMEM = const char HTTP_SCRIPT_CONSOL[] PROGMEM =
"var sn=0;" // Scroll position "var sn=0;" // Scroll position
"var id=99;" // Get most of weblog initially "var id=99;" // Get most of weblog initially
@ -141,112 +141,118 @@ const char HTTP_SCRIPT_MODULE2[] PROGMEM =
const char HTTP_SCRIPT_MODULE3[] PROGMEM = const char HTTP_SCRIPT_MODULE3[] PROGMEM =
"\";" "\";"
"os=o0.replace(/}1/g,\"<option value=\").replace(/}2/g,\"</option>\");"; "os=o0.replace(/}1/g,\"<option value=\").replace(/}2/g,\"</option>\");";
const char HTTP_MSG_SLIDER1[] PROGMEM =
"<div><span class='p'>" D_COLDLIGHT "</span><span class='q'>" D_WARMLIGHT "</span></div>"
"<div><input type='range' min='153' max='500' value='%d' onchange='lc(value)'></div>";
const char HTTP_MSG_SLIDER2[] PROGMEM =
"<div><span class='p'>" D_DARKLIGHT "</span><span class='q'>" D_BRIGHTLIGHT "</span></div>"
"<div><input type='range' min='1' max='100' value='%d' onchange='lb(value)'></div>";
const char HTTP_MSG_RSTRT[] PROGMEM = const char HTTP_MSG_RSTRT[] PROGMEM =
"<br/><div style='text-align:center;'>Device will restart in a few seconds</div><br/>"; "<br/><div style='text-align:center;'>" D_DEVICE_WILL_RESTART "</div><br/>";
const char HTTP_BTN_MENU1[] PROGMEM = const char HTTP_BTN_MENU1[] PROGMEM =
"<br/><form action='cn' method='get'><button>Configuration</button></form>" "<br/><form action='cn' method='get'><button>" D_CONFIGURATION "</button></form>"
"<br/><form action='in' method='get'><button>Information</button></form>" "<br/><form action='in' method='get'><button>" D_INFORMATION "</button></form>"
"<br/><form action='up' method='get'><button>Firmware upgrade</button></form>" "<br/><form action='up' method='get'><button>" D_FIRMWARE_UPGRADE "</button></form>"
"<br/><form action='cs' method='get'><button>Console</button></form>"; "<br/><form action='cs' method='get'><button>" D_CONSOLE "</button></form>";
const char HTTP_BTN_RSTRT[] PROGMEM = const char HTTP_BTN_RSTRT[] PROGMEM =
"<br/><form action='rb' method='get' onsubmit='return confirm(\"Confirm Restart\");'><button>Restart</button></form>"; "<br/><form action='rb' method='get' onsubmit='return confirm(\"" D_CONFIRM_RESTART "\");'><button>" D_RESTART "</button></form>";
const char HTTP_BTN_MENU2[] PROGMEM = const char HTTP_BTN_MENU2[] PROGMEM =
"<br/><form action='md' method='get'><button>Configure Module</button></form>" "<br/><form action='md' method='get'><button>" D_CONFIGURE_MODULE "</button></form>"
"<br/><form action='w0' method='get'><button>Configure WiFi</button></form>"; "<br/><form action='w0' method='get'><button>" D_CONFIGURE_WIFI "</button></form>";
const char HTTP_BTN_MENU3[] PROGMEM = const char HTTP_BTN_MENU3[] PROGMEM =
"<br/><form action='mq' method='get'><button>Configure MQTT</button></form>" "<br/><form action='mq' method='get'><button>" D_CONFIGURE_MQTT "</button></form>"
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
"<br/><form action='dm' method='get'><button>Configure Domoticz</button></form>" "<br/><form action='dm' method='get'><button>" D_CONFIGURE_DOMOTICZ "</button></form>"
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
""; "";
const char HTTP_BTN_MENU4[] PROGMEM = const char HTTP_BTN_MENU4[] PROGMEM =
"<br/><form action='lg' method='get'><button>Configure Logging</button></form>" "<br/><form action='lg' method='get'><button>" D_CONFIGURE_LOGGING "</button></form>"
"<br/><form action='co' method='get'><button>Configure Other</button></form>" "<br/><form action='co' method='get'><button>" D_CONFIGURE_OTHER "</button></form>"
"<br/><form action='rt' method='get' onsubmit='return confirm(\"Confirm Reset Configuration\");'><button>Reset Configuration</button></form>" "<br/><form action='rt' method='get' onsubmit='return confirm(\"" D_CONFIRM_RESET_CONFIGURATION "\");'><button>" D_RESET_CONFIGURATION "</button></form>"
"<br/><form action='dl' method='get'><button>Backup Configuration</button></form>" "<br/><form action='dl' method='get'><button>" D_BACKUP_CONFIGURATION "</button></form>"
"<br/><form action='rs' method='get'><button>Restore Configuration</button></form>"; "<br/><form action='rs' method='get'><button>" D_RESTORE_CONFIGURATION "</button></form>";
const char HTTP_BTN_MAIN[] PROGMEM = const char HTTP_BTN_MAIN[] PROGMEM =
"<br/><br/><form action='.' method='get'><button>Main menu</button></form>"; "<br/><br/><form action='.' method='get'><button>" D_MAIN_MENU "</button></form>";
const char HTTP_BTN_CONF[] PROGMEM = const char HTTP_BTN_CONF[] PROGMEM =
"<br/><br/><form action='cn' method='get'><button>Configuration menu</button></form>"; "<br/><br/><form action='cn' method='get'><button>" D_CONFIGURATION "</button></form>";
const char HTTP_FORM_MODULE[] PROGMEM = const char HTTP_FORM_MODULE[] PROGMEM =
"<fieldset><legend><b>&nbsp;Module parameters&nbsp;</b></legend><form method='get' action='sv'>" "<fieldset><legend><b>&nbsp;" D_MODULE_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>"
"<input id='w' name='w' value='6' hidden><input id='r' name='r' value='1' hidden>" "<input id='w' name='w' value='6' hidden><input id='r' name='r' value='1' hidden>"
"<br/><b>Module type</b> ({mt})<br/><select id='g99' name='g99'></select></br>"; "<br/><b>" D_MODULE_TYPE "</b> ({mt})<br/><select id='g99' name='g99'></select></br>";
const char HTTP_LNK_ITEM[] PROGMEM = const char HTTP_LNK_ITEM[] PROGMEM =
"<div><a href='#p' onclick='c(this)'>{v}</a>&nbsp;<span class='q'>{i} {r}%</span></div>"; "<div><a href='#p' onclick='c(this)'>{v}</a>&nbsp;<span class='q'>{i} {r}%</span></div>";
const char HTTP_LNK_SCAN[] PROGMEM = const char HTTP_LNK_SCAN[] PROGMEM =
"<div><a href='/w1'>Scan for wifi networks</a></div><br/>"; "<div><a href='/w1'>" D_SCAN_FOR_WIFI_NETWORKS "</a></div><br/>";
const char HTTP_FORM_WIFI[] PROGMEM = const char HTTP_FORM_WIFI[] PROGMEM =
"<fieldset><legend><b>&nbsp;Wifi parameters&nbsp;</b></legend><form method='get' action='sv'>" "<fieldset><legend><b>&nbsp;" D_WIFI_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>"
"<input id='w' name='w' value='1' hidden><input id='r' name='r' value='1' hidden>" "<input id='w' name='w' value='1' hidden><input id='r' name='r' value='1' hidden>"
"<br/><b>AP1 SSId</b> (" STA_SSID1 ")<br/><input id='s1' name='s1' length=32 placeholder='" STA_SSID1 "' value='{s1}'><br/>" "<br/><b>" D_AP1_SSID "</b> (" STA_SSID1 ")<br/><input id='s1' name='s1' length=32 placeholder='" STA_SSID1 "' value='{s1}'><br/>"
"<br/><b>AP1 Password</b></br><input id='p1' name='p1' length=64 type='password' placeholder='" STA_PASS1 "' value='{p1}'><br/>" "<br/><b>" D_AP1_PASSWORD "</b></br><input id='p1' name='p1' length=64 type='password' placeholder='" STA_PASS1 "' value='{p1}'><br/>"
"<br/><b>AP2 SSId</b> (" STA_SSID2 ")<br/><input id='s2' name='s2' length=32 placeholder='" STA_SSID2 "' value='{s2}'><br/>" "<br/><b>" D_AP2_SSID "</b> (" STA_SSID2 ")<br/><input id='s2' name='s2' length=32 placeholder='" STA_SSID2 "' value='{s2}'><br/>"
"<br/><b>AP2 Password</b></br><input id='p2' name='p2' length=64 type='password' placeholder='" STA_PASS2 "' value='{p2}'><br/>" "<br/><b>" D_AP2_PASSWORD "</b></br><input id='p2' name='p2' length=64 type='password' placeholder='" STA_PASS2 "' value='{p2}'><br/>"
"<br/><b>Hostname</b> (" WIFI_HOSTNAME ")<br/><input id='h' name='h' length=32 placeholder='" WIFI_HOSTNAME" ' value='{h1}'><br/>"; "<br/><b>" D_HOSTNAME "</b> (" WIFI_HOSTNAME ")<br/><input id='h' name='h' length=32 placeholder='" WIFI_HOSTNAME" ' value='{h1}'><br/>";
const char HTTP_FORM_MQTT[] PROGMEM = const char HTTP_FORM_MQTT[] PROGMEM =
"<fieldset><legend><b>&nbsp;MQTT parameters&nbsp;</b></legend><form method='get' action='sv'>" "<fieldset><legend><b>&nbsp;" D_MQTT_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>"
"<input id='w' name='w' value='2' hidden><input id='r' name='r' value='1' hidden>" "<input id='w' name='w' value='2' hidden><input id='r' name='r' value='1' hidden>"
"<br/><b>Host</b> (" MQTT_HOST ")<br/><input id='mh' name='mh' length=32 placeholder='" MQTT_HOST" ' value='{m1}'><br/>" "<br/><b>" D_HOST "</b> (" MQTT_HOST ")<br/><input id='mh' name='mh' length=32 placeholder='" MQTT_HOST" ' value='{m1}'><br/>"
"<br/><b>Port</b> (" STR(MQTT_PORT) ")<br/><input id='ml' name='ml' length=5 placeholder='" STR(MQTT_PORT) "' value='{m2}'><br/>" "<br/><b>" D_PORT "</b> (" STR(MQTT_PORT) ")<br/><input id='ml' name='ml' length=5 placeholder='" STR(MQTT_PORT) "' value='{m2}'><br/>"
"<br/><b>Client Id</b> ({m0})<br/><input id='mc' name='mc' length=32 placeholder='" MQTT_CLIENT_ID "' value='{m3}'><br/>" "<br/><b>" D_CLIENT "</b> ({m0})<br/><input id='mc' name='mc' length=32 placeholder='" MQTT_CLIENT_ID "' value='{m3}'><br/>"
"<br/><b>User</b> (" MQTT_USER ")<br/><input id='mu' name='mu' length=32 placeholder='" MQTT_USER "' value='{m4}'><br/>" "<br/><b>" D_USER "</b> (" MQTT_USER ")<br/><input id='mu' name='mu' length=32 placeholder='" MQTT_USER "' value='{m4}'><br/>"
"<br/><b>Password</b><br/><input id='mp' name='mp' length=32 type='password' placeholder='" MQTT_PASS "' value='{m5}'><br/>" "<br/><b>" D_PASSWORD "</b><br/><input id='mp' name='mp' length=32 type='password' placeholder='" MQTT_PASS "' value='{m5}'><br/>"
"<br/><b>Topic</b> = %topic% (" MQTT_TOPIC ")<br/><input id='mt' name='mt' length=32 placeholder='" MQTT_TOPIC" ' value='{m6}'><br/>" "<br/><b>" D_TOPIC "</b> = %topic% (" MQTT_TOPIC ")<br/><input id='mt' name='mt' length=32 placeholder='" MQTT_TOPIC" ' value='{m6}'><br/>"
"<br/><b>Full Topic</b> (" MQTT_FULLTOPIC ")<br/><input id='mf' name='mf' length=80 placeholder='" MQTT_FULLTOPIC" ' value='{m7}'><br/>"; "<br/><b>" D_FULL_TOPIC "</b> (" MQTT_FULLTOPIC ")<br/><input id='mf' name='mf' length=80 placeholder='" MQTT_FULLTOPIC" ' value='{m7}'><br/>";
const char HTTP_FORM_LOG1[] PROGMEM = const char HTTP_FORM_LOG1[] PROGMEM =
"<fieldset><legend><b>&nbsp;Logging parameters&nbsp;</b></legend><form method='get' action='sv'>" "<fieldset><legend><b>&nbsp;" D_LOGGING_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>"
"<input id='w' name='w' value='3' hidden><input id='r' name='r' value='0' hidden>"; "<input id='w' name='w' value='3' hidden><input id='r' name='r' value='0' hidden>";
const char HTTP_FORM_LOG2[] PROGMEM = const char HTTP_FORM_LOG2[] PROGMEM =
"<br/><b>{b0}log level</b> ({b1})<br/><select id='{b2}' name='{b2}'>" "<br/><b>{b0}" D_LOG_LEVEL "</b> ({b1})<br/><select id='{b2}' name='{b2}'>"
"<option{a0value='0'>0 None</option>" "<option{a0value='0'>0 " D_NONE "</option>"
"<option{a1value='1'>1 Error</option>" "<option{a1value='1'>1 " D_ERROR "</option>"
"<option{a2value='2'>2 Info</option>" "<option{a2value='2'>2 " D_INFO "</option>"
"<option{a3value='3'>3 Debug</option>" "<option{a3value='3'>3 " D_DEBUG "</option>"
"<option{a4value='4'>4 More debug</option>" "<option{a4value='4'>4 " D_MORE_DEBUG "</option>"
"</select></br>"; "</select></br>";
const char HTTP_FORM_LOG3[] PROGMEM = const char HTTP_FORM_LOG3[] PROGMEM =
"<br/><b>Syslog host</b> (" SYS_LOG_HOST ")<br/><input id='lh' name='lh' length=32 placeholder='" SYS_LOG_HOST "' value='{l2}'><br/>" "<br/><b>" D_SYSLOG_HOST "</b> (" SYS_LOG_HOST ")<br/><input id='lh' name='lh' length=32 placeholder='" SYS_LOG_HOST "' value='{l2}'><br/>"
"<br/><b>Syslog port</b> (" STR(SYS_LOG_PORT) ")<br/><input id='lp' name='lp' length=5 placeholder='" STR(SYS_LOG_PORT) "' value='{l3}'><br/>" "<br/><b>" D_SYSLOG_PORT "</b> (" STR(SYS_LOG_PORT) ")<br/><input id='lp' name='lp' length=5 placeholder='" STR(SYS_LOG_PORT) "' value='{l3}'><br/>"
"<br/><b>Telemetric period</b> (" STR(TELE_PERIOD) ")<br/><input id='lt' name='lt' length=4 placeholder='" STR(TELE_PERIOD) "' value='{l4}'><br/>"; "<br/><b>" D_TELEMETRY_PERIOD "</b> (" STR(TELE_PERIOD) ")<br/><input id='lt' name='lt' length=4 placeholder='" STR(TELE_PERIOD) "' value='{l4}'><br/>";
const char HTTP_FORM_OTHER[] PROGMEM = const char HTTP_FORM_OTHER[] PROGMEM =
"<fieldset><legend><b>&nbsp;Other parameters&nbsp;</b></legend><form method='get' action='sv'>" "<fieldset><legend><b>&nbsp;" D_OTHER_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>"
"<input id='w' name='w' value='5' hidden><input id='r' name='r' value='1' hidden>" "<input id='w' name='w' value='5' hidden><input id='r' name='r' value='1' hidden>"
"<br/><b>Web Admin Password</b><br/><input id='p1' name='p1' length=32 type='password' placeholder='" WEB_PASSWORD "' value='{p1}'><br/>" "<br/><b>" D_WEB_ADMIN_PASSWORD "</b><br/><input id='p1' name='p1' length=32 type='password' placeholder='" WEB_PASSWORD "' value='{p1}'><br/>"
"<br/><input style='width:10%;float:left' id='b1' name='b1' type='checkbox'{r1}><b>MQTT enable</b><br/>"; "<br/><input style='width:10%;float:left' id='b1' name='b1' type='checkbox'{r1}><b>" D_MQTT_ENABLE "</b><br/>";
const char HTTP_FORM_OTHER2[] PROGMEM = const char HTTP_FORM_OTHER2[] PROGMEM =
"<br/><b>Friendly Name {1</b> ({2)<br/><input id='a{1' name='a{1' length=32 placeholder='{2' value='{3'><br/>"; "<br/><b>" D_FRIENDLY_NAME " {1</b> ({2)<br/><input id='a{1' name='a{1' length=32 placeholder='{2' value='{3'><br/>";
#ifdef USE_EMULATION #ifdef USE_EMULATION
const char HTTP_FORM_OTHER3a[] PROGMEM = const char HTTP_FORM_OTHER3a[] PROGMEM =
"<br/><fieldset><legend><b>&nbsp;Emulation&nbsp;</b></legend>"; "<br/><fieldset><legend><b>&nbsp;" D_EMULATION "&nbsp;</b></legend>";
const char HTTP_FORM_OTHER3b[] PROGMEM = const char HTTP_FORM_OTHER3b[] PROGMEM =
"<br/><input style='width:10%;float:left' id='b2' name='b2' type='radio' value='{1'{2><b>{3</b>{4"; "<br/><input style='width:10%;float:left' id='b2' name='b2' type='radio' value='{1'{2><b>{3</b>{4";
#endif // USE_EMULATION #endif // USE_EMULATION
const char HTTP_FORM_END[] PROGMEM = const char HTTP_FORM_END[] PROGMEM =
"<br/><button type='submit'>Save</button></form></fieldset>"; "<br/><button type='submit'>" D_SAVE "</button></form></fieldset>";
const char HTTP_FORM_RST[] PROGMEM = const char HTTP_FORM_RST[] PROGMEM =
"<div id='f1' name='f1' style='display:block;'>" "<div id='f1' name='f1' style='display:block;'>"
"<fieldset><legend><b>&nbsp;Restore configuration&nbsp;</b></legend>"; "<fieldset><legend><b>&nbsp;" D_RESTORE_CONFIGURATION "&nbsp;</b></legend>";
const char HTTP_FORM_UPG[] PROGMEM = const char HTTP_FORM_UPG[] PROGMEM =
"<div id='f1' name='f1' style='display:block;'>" "<div id='f1' name='f1' style='display:block;'>"
"<fieldset><legend><b>&nbsp;Upgrade by web server&nbsp;</b></legend>" "<fieldset><legend><b>&nbsp;" D_UPGRADE_BY_WEBSERVER "&nbsp;</b></legend>"
"<form method='get' action='u1'>" "<form method='get' action='u1'>"
"<br/>OTA Url<br/><input id='o' name='o' length=80 placeholder='OTA_URL' value='{o1}'><br/>" "<br/>" D_OTA_URL "<br/><input id='o' name='o' length=80 placeholder='OTA_URL' value='{o1}'><br/>"
"<br/><button type='submit'>Start upgrade</button></form>" "<br/><button type='submit'>" D_START_UPGRADE "</button></form>"
"</fieldset><br/><br/>" "</fieldset><br/><br/>"
"<fieldset><legend><b>&nbsp;Upgrade by file upload&nbsp;</b></legend>"; "<fieldset><legend><b>&nbsp;" D_UPGRADE_BY_FILE_UPLOAD "&nbsp;</b></legend>";
const char HTTP_FORM_RST_UPG[] PROGMEM = const char HTTP_FORM_RST_UPG[] PROGMEM =
"<form method='post' action='u2' enctype='multipart/form-data'>" "<form method='post' action='u2' enctype='multipart/form-data'>"
"<br/><input type='file' name='u2'><br/>" "<br/><input type='file' name='u2'><br/>"
"<br/><button type='submit' onclick='document.getElementById(\"f1\").style.display=\"none\";document.getElementById(\"f2\").style.display=\"block\";this.form.submit();'>Start {r1}</button></form>" "<br/><button type='submit' onclick='document.getElementById(\"f1\").style.display=\"none\";document.getElementById(\"f2\").style.display=\"block\";this.form.submit();'>" D_START " {r1}</button></form>"
"</fieldset>" "</fieldset>"
"</div>" "</div>"
"<div id='f2' name='f2' style='display:none;text-align:center;'><b>Upload started ...</b></div>"; "<div id='f2' name='f2' style='display:none;text-align:center;'><b>" D_UPLOAD_STARTED " ...</b></div>";
const char HTTP_FORM_CMND[] PROGMEM = const char HTTP_FORM_CMND[] PROGMEM =
"<br/><textarea readonly id='t1' name='t1' cols='" STR(MESSZ) "' wrap='off'></textarea><br/><br/>" "<br/><textarea readonly id='t1' name='t1' cols='" STR(MESSZ) "' wrap='off'></textarea><br/><br/>"
"<form method='get' onsubmit='return l(1);'>" "<form method='get' onsubmit='return l(1);'>"
"<input style='width:98%' id='c1' name='c1' length='99' placeholder='Enter command' autofocus><br/>" "<input style='width:98%' id='c1' name='c1' length='99' placeholder='" D_ENTER_COMMAND "' autofocus><br/>"
// "<br/><button type='submit'>Send command</button>" // "<br/><button type='submit'>Send command</button>"
"</form>"; "</form>";
const char HTTP_TABLE100[] PROGMEM = const char HTTP_TABLE100[] PROGMEM =
@ -254,17 +260,17 @@ const char HTTP_TABLE100[] PROGMEM =
const char HTTP_COUNTER[] PROGMEM = const char HTTP_COUNTER[] PROGMEM =
"<br/><div id='t' name='t' style='text-align:center;'></div>"; "<br/><div id='t' name='t' style='text-align:center;'></div>";
const char HTTP_SNS_TEMP[] PROGMEM = const char HTTP_SNS_TEMP[] PROGMEM =
"<tr><th>%s Temperature</th><td>%s&deg;%c</td></tr>"; "<tr><th>%s " D_TEMPERATURE "</th><td>%s&deg;%c</td></tr>";
const char HTTP_SNS_HUM[] PROGMEM = const char HTTP_SNS_HUM[] PROGMEM =
"<tr><th>%s Humidity</th><td>%s%</td></tr>"; "<tr><th>%s " D_HUMIDITY "</th><td>%s%</td></tr>";
const char HTTP_SNS_PRESSURE[] PROGMEM = const char HTTP_SNS_PRESSURE[] PROGMEM =
"<tr><th>%s Pressure</th><td>%s hPa</td></tr>"; "<tr><th>%s " D_PRESSURE "</th><td>%s " D_UNIT_PRESSURE "</td></tr>";
const char HTTP_SNS_LIGHT[] PROGMEM = const char HTTP_SNS_LIGHT[] PROGMEM =
"<tr><th>%s Light</th><td>%d%</td></tr>"; "<tr><th>%s " D_LIGHT "</th><td>%d%</td></tr>";
const char HTTP_SNS_NOISE[] PROGMEM = const char HTTP_SNS_NOISE[] PROGMEM =
"<tr><th>%s Noise</th><td>%d%</td></tr>"; "<tr><th>%s " D_NOISE "</th><td>%d%</td></tr>";
const char HTTP_SNS_DUST[] PROGMEM = const char HTTP_SNS_DUST[] PROGMEM =
"<tr><th>%s Air quality</th><td>%d%</td></tr>"; "<tr><th>%s " D_AIR_QUALITY "</th><td>%d%</td></tr>";
const char HTTP_END[] PROGMEM = const char HTTP_END[] PROGMEM =
"</div>" "</div>"
"</body>" "</body>"
@ -339,8 +345,8 @@ void startWebserver(int type, IPAddress ipweb)
webServer->begin(); // Web server start webServer->begin(); // Web server start
} }
if (_httpflag != type) { if (_httpflag != type) {
snprintf_P(log, sizeof(log), PSTR("HTTP: Webserver active on %s%s with IP address %s"), snprintf_P(log, sizeof(log), PSTR(D_LOG_HTTP D_WEBSERVER_ACTIVE_ON " %s%s " D_WITH_IP_ADDRESS " %s"),
Hostname, (mDNSbegun)?".local":"", ipweb.toString().c_str()); Hostname, (mDNSbegun) ? ".local" : "", ipweb.toString().c_str());
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
} }
if (type) _httpflag = type; if (type) _httpflag = type;
@ -351,7 +357,7 @@ void stopWebserver()
if (_httpflag) { if (_httpflag) {
webServer->close(); webServer->close();
_httpflag = HTTP_OFF; _httpflag = HTTP_OFF;
addLog_P(LOG_LEVEL_INFO, PSTR("HTTP: Webserver stopped")); addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP D_WEBSERVER_STOPPED));
} }
} }
@ -360,10 +366,10 @@ void beginWifiManager()
// setup AP // setup AP
if ((WL_CONNECTED == WiFi.status()) && (static_cast<uint32_t>(WiFi.localIP()) != 0)) { if ((WL_CONNECTED == WiFi.status()) && (static_cast<uint32_t>(WiFi.localIP()) != 0)) {
WiFi.mode(WIFI_AP_STA); WiFi.mode(WIFI_AP_STA);
addLog_P(LOG_LEVEL_DEBUG, PSTR("Wifimanager: Set AccessPoint and keep Station")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION));
} else { } else {
WiFi.mode(WIFI_AP); WiFi.mode(WIFI_AP);
addLog_P(LOG_LEVEL_DEBUG, PSTR("Wifimanager: Set AccessPoint")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI D_WIFIMANAGER_SET_ACCESSPOINT));
} }
stopWebserver(); stopWebserver();
@ -415,7 +421,8 @@ void showPage(String &page)
void handleRoot() void handleRoot()
{ {
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Root")); // addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_MAIN_MENU));
addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_MAIN_MENU);
if (captivePortal()) { // If captive portal redirect instead of displaying the page. if (captivePortal()) { // If captive portal redirect instead of displaying the page.
return; return;
@ -426,26 +433,24 @@ void handleRoot()
} else { } else {
char stemp[10], line[160]; char stemp[10], line[160];
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Main menu")); page.replace(F("{v}"), S_MAIN_MENU);
page.replace(F("<body>"), F("<body onload='la()'>")); page.replace(F("<body>"), F("<body onload='la()'>"));
page += F("<div id='l1' name='l1'></div>"); page += F("<div id='l1' name='l1'></div>");
if (Maxdevice) { if (Maxdevice) {
if (sfl_flg) { if (sfl_flg) {
if ((2 == sfl_flg) || (5 == sfl_flg)) { if ((2 == sfl_flg) || (5 == sfl_flg)) {
snprintf_P(line, sizeof(line), PSTR("<div><span class='p'>Cold</span><span class='q'>Warm</span></div><div><input type='range' min='153' max='500' value='%d' onchange='lc(value)'></div>"), snprintf_P(line, sizeof(line), HTTP_MSG_SLIDER1, sl_getColorTemp());
sl_getColorTemp());
page += line; page += line;
} }
snprintf_P(line, sizeof(line), PSTR("<div><span class='p'>Dark</span><span class='q'>Bright</span></div><div><input type='range' min='1' max='100' value='%d' onchange='lb(value)'></div>"), snprintf_P(line, sizeof(line), HTTP_MSG_SLIDER2, sysCfg.led_dimmer[0]);
sysCfg.led_dimmer[0]);
page += line; page += line;
} }
page += FPSTR(HTTP_TABLE100); page += FPSTR(HTTP_TABLE100);
page += F("<tr>"); page += F("<tr>");
for (byte idx = 1; idx <= Maxdevice; idx++) { for (byte idx = 1; idx <= Maxdevice; idx++) {
snprintf_P(stemp, sizeof(stemp), PSTR(" %d"), idx); snprintf_P(stemp, sizeof(stemp), PSTR(" %d"), idx);
snprintf_P(line, sizeof(line), PSTR("<td style='width:%d%'><button onclick='la(\"?o=%d\");'>Toggle%s</button></td>"), snprintf_P(line, sizeof(line), PSTR("<td style='width:%d%'><button onclick='la(\"?o=%d\");'>" D_BUTTON_TOGGLE "%s</button></td>"),
100 / Maxdevice, idx, (Maxdevice > 1) ? stemp : ""); 100 / Maxdevice, idx, (Maxdevice > 1) ? stemp : "");
page += line; page += line;
} }
@ -485,15 +490,15 @@ void handleAjax2()
do_cmnd_power(atoi(webServer->arg("o").c_str()), 2); do_cmnd_power(atoi(webServer->arg("o").c_str()), 2);
} }
if (strlen(webServer->arg("d").c_str())) { if (strlen(webServer->arg("d").c_str())) {
snprintf_P(svalue, sizeof(svalue), PSTR("dimmer %s"), webServer->arg("d").c_str()); snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_DIMMER " %s"), webServer->arg("d").c_str());
do_cmnd(svalue); do_cmnd(svalue);
} }
if (strlen(webServer->arg("t").c_str())) { if (strlen(webServer->arg("t").c_str())) {
snprintf_P(svalue, sizeof(svalue), PSTR("ct %s"), webServer->arg("t").c_str()); snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_COLORTEMPERATURE " %s"), webServer->arg("t").c_str());
do_cmnd(svalue); do_cmnd(svalue);
} }
if (strlen(webServer->arg("k").c_str())) { if (strlen(webServer->arg("k").c_str())) {
snprintf_P(svalue, sizeof(svalue), PSTR("rfkey%s"), webServer->arg("k").c_str()); snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_RFKEY "%s"), webServer->arg("k").c_str());
do_cmnd(svalue); do_cmnd(svalue);
} }
@ -501,7 +506,7 @@ void handleAjax2()
tpage += counter_webPresent(); tpage += counter_webPresent();
#ifndef USE_ADC_VCC #ifndef USE_ADC_VCC
if (pin[GPIO_ADC0] < 99) { if (pin[GPIO_ADC0] < 99) {
snprintf_P(svalue, sizeof(svalue), PSTR("<tr><th>AnalogInput0</th><td>%d</td></tr>"), getAdc0()); snprintf_P(svalue, sizeof(svalue), PSTR("<tr><th>" D_ANALOG_INPUT0 "</th><td>%d</td></tr>"), getAdc0());
tpage += svalue; tpage += svalue;
} }
#endif #endif
@ -584,10 +589,10 @@ void handleConfig()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Config")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURATION);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Configuration")); page.replace(F("{v}"), S_CONFIGURATION);
page += FPSTR(HTTP_BTN_MENU2); page += FPSTR(HTTP_BTN_MENU2);
if (sysCfg.flag.mqtt_enabled) { if (sysCfg.flag.mqtt_enabled) {
page += FPSTR(HTTP_BTN_MENU3); page += FPSTR(HTTP_BTN_MENU3);
@ -648,10 +653,10 @@ void handleModule()
char line[128]; char line[128];
uint8_t midx; uint8_t midx;
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Module config")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_MODULE);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Config module")); page.replace(F("{v}"), S_CONFIGURE_MODULE);
page += FPSTR(HTTP_FORM_MODULE); page += FPSTR(HTTP_FORM_MODULE);
snprintf_P(stemp, sizeof(stemp), modules[MODULE].name); snprintf_P(stemp, sizeof(stemp), modules[MODULE].name);
page.replace(F("{mt}"), stemp); page.replace(F("{mt}"), stemp);
@ -679,8 +684,8 @@ void handleModule()
func += FPSTR(HTTP_SCRIPT_MODULE3); func += FPSTR(HTTP_SCRIPT_MODULE3);
for (byte i = 0; i < MAX_GPIO_PIN; i++) { for (byte i = 0; i < MAX_GPIO_PIN; i++) {
if (GPIO_USER == cmodule.gp.io[i]) { if (GPIO_USER == cmodule.gp.io[i]) {
snprintf_P(line, sizeof(line), PSTR("<br/><b>GPIO%d</b> %s<select id='g%d' name='g%d'></select></br>"), snprintf_P(line, sizeof(line), PSTR("<br/><b>" D_GPIO "%d</b> %s<select id='g%d' name='g%d'></select></br>"),
i, (0==i)?"Button1":(1==i)?"Serial Out":(3==i)?"Serial In":(12==i)?"Relay1":(13==i)?"Led1I":(14==i)?"Sensor":"", i, i); i, (0==i)? D_SENSOR_BUTTON "1":(1==i)? D_SERIAL_OUT :(3==i)? D_SERIAL_IN :(12==i)? D_SENSOR_RELAY "1":(13==i)? D_SENSOR_LED "1I":(14==i)? D_SENSOR :"", i, i);
page += line; page += line;
snprintf_P(line, sizeof(line), PSTR("sk(%d,%d);"), my_module.gp.io[i], i); // g0 - g16 snprintf_P(line, sizeof(line), PSTR("sk(%d,%d);"), my_module.gp.io[i], i); // g0 - g16
func += line; func += line;
@ -712,21 +717,22 @@ void handleWifi(boolean scan)
} }
char log[LOGSZ]; char log[LOGSZ];
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Wifi config")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_WIFI);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Configure Wifi")); page.replace(F("{v}"), S_CONFIGURE_WIFI);
if (scan) { if (scan) {
#ifdef USE_EMULATION #ifdef USE_EMULATION
UDP_Disconnect(); UDP_Disconnect();
#endif // USE_EMULATION #endif // USE_EMULATION
int n = WiFi.scanNetworks(); int n = WiFi.scanNetworks();
addLog_P(LOG_LEVEL_DEBUG, PSTR("Wifi: Scan done")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI D_SCAN_DONE));
if (0 == n) { if (0 == n) {
addLog_P(LOG_LEVEL_DEBUG, PSTR("Wifi: No networks found")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_WIFI, S_NO_NETWORKS_FOUND);
page += F("No networks found. Refresh to scan again."); page += S_NO_NETWORKS_FOUND;
page += F(". " D_REFRESH_TO_SCAN_AGAIN ".");
} else { } else {
//sort networks //sort networks
int indices[n]; int indices[n];
@ -753,7 +759,7 @@ void handleWifi(boolean scan)
cssid = WiFi.SSID(indices[i]); cssid = WiFi.SSID(indices[i]);
for (int j = i + 1; j < n; j++) { for (int j = i + 1; j < n; j++) {
if (cssid == WiFi.SSID(indices[j])) { if (cssid == WiFi.SSID(indices[j])) {
snprintf_P(log, sizeof(log), PSTR("Wifi: Duplicate AccessPoint %s"), WiFi.SSID(indices[j]).c_str()); snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_DUPLICATE_ACCESSPOINT " %s"), WiFi.SSID(indices[j]).c_str());
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
indices[j] = -1; // set dup aps to index -1 indices[j] = -1; // set dup aps to index -1
} }
@ -766,7 +772,7 @@ void handleWifi(boolean scan)
if (-1 == indices[i]) { if (-1 == indices[i]) {
continue; // skip dups continue; // skip dups
} }
snprintf_P(log, sizeof(log), PSTR("Wifi: SSID %s, RSSI %d"), WiFi.SSID(indices[i]).c_str(), WiFi.RSSI(indices[i])); snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_SSID " %s, " D_RSSI " %d"), WiFi.SSID(indices[i]).c_str(), WiFi.RSSI(indices[i]));
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
int quality = WIFI_getRSSIasQuality(WiFi.RSSI(indices[i])); int quality = WIFI_getRSSIasQuality(WiFi.RSSI(indices[i]));
@ -777,11 +783,11 @@ void handleWifi(boolean scan)
item.replace(F("{v}"), WiFi.SSID(indices[i])); item.replace(F("{v}"), WiFi.SSID(indices[i]));
item.replace(F("{r}"), rssiQ); item.replace(F("{r}"), rssiQ);
uint8_t auth = WiFi.encryptionType(indices[i]); uint8_t auth = WiFi.encryptionType(indices[i]);
item.replace(F("{i}"), (ENC_TYPE_WEP == auth) ? F("WEP") : (ENC_TYPE_TKIP == auth) ? F("WPA PSK") : (ENC_TYPE_CCMP == auth) ? F("WPA2 PSK") : (ENC_TYPE_AUTO == auth) ? F("AUTO") : F("")); item.replace(F("{i}"), (ENC_TYPE_WEP == auth) ? F(D_WEP) : (ENC_TYPE_TKIP == auth) ? F(D_WPA_PSK) : (ENC_TYPE_CCMP == auth) ? F(D_WPA2_PSK) : (ENC_TYPE_AUTO == auth) ? F(D_AUTO) : F(""));
page += item; page += item;
delay(0); delay(0);
} else { } else {
addLog_P(LOG_LEVEL_DEBUG, PSTR("Wifi: Skipping due to low quality")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI D_SKIPPING_LOW_QUALITY));
} }
} }
@ -811,10 +817,10 @@ void handleMqtt()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: MQTT config")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_MQTT);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Configure MQTT")); page.replace(F("{v}"), S_CONFIGURE_MQTT);
page += FPSTR(HTTP_FORM_MQTT); page += FPSTR(HTTP_FORM_MQTT);
char str[sizeof(sysCfg.mqtt_client)]; char str[sizeof(sysCfg.mqtt_client)];
getClient(str, MQTT_CLIENT_ID, sizeof(sysCfg.mqtt_client)); getClient(str, MQTT_CLIENT_ID, sizeof(sysCfg.mqtt_client));
@ -836,16 +842,16 @@ void handleLog()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Log config")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_LOGGING);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Config logging")); page.replace(F("{v}"), S_CONFIGURE_LOGGING);
page += FPSTR(HTTP_FORM_LOG1); page += FPSTR(HTTP_FORM_LOG1);
for (byte idx = 0; idx < 3; idx++) { for (byte idx = 0; idx < 3; idx++) {
page += FPSTR(HTTP_FORM_LOG2); page += FPSTR(HTTP_FORM_LOG2);
switch (idx) { switch (idx) {
case 0: case 0:
page.replace(F("{b0}"), F("Serial ")); page.replace(F("{b0}"), F(D_SERIAL " "));
page.replace(F("{b1}"), STR(SERIAL_LOG_LEVEL)); page.replace(F("{b1}"), STR(SERIAL_LOG_LEVEL));
page.replace(F("{b2}"), F("ls")); page.replace(F("{b2}"), F("ls"));
for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) { for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) {
@ -853,7 +859,7 @@ void handleLog()
} }
break; break;
case 1: case 1:
page.replace(F("{b0}"), F("Web ")); page.replace(F("{b0}"), F(D_WEB " "));
page.replace(F("{b1}"), STR(WEB_LOG_LEVEL)); page.replace(F("{b1}"), STR(WEB_LOG_LEVEL));
page.replace(F("{b2}"), F("lw")); page.replace(F("{b2}"), F("lw"));
for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) { for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) {
@ -861,7 +867,7 @@ void handleLog()
} }
break; break;
case 2: case 2:
page.replace(F("{b0}"), F("Sys")); page.replace(F("{b0}"), F(D_SYS));
page.replace(F("{b1}"), STR(SYS_LOG_LEVEL)); page.replace(F("{b1}"), STR(SYS_LOG_LEVEL));
page.replace(F("{b2}"), F("ll")); page.replace(F("{b2}"), F("ll"));
for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) { for (byte i = LOG_LEVEL_NONE; i < LOG_LEVEL_ALL; i++) {
@ -884,11 +890,11 @@ void handleOther()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Other config")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_OTHER);
char stemp[40]; char stemp[40];
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Configure Other")); page.replace(F("{v}"), S_CONFIGURE_OTHER);
page += FPSTR(HTTP_FORM_OTHER); page += FPSTR(HTTP_FORM_OTHER);
page.replace(F("{p1}"), sysCfg.web_password); page.replace(F("{p1}"), sysCfg.web_password);
page.replace(F("{r1}"), (sysCfg.flag.mqtt_enabled) ? F(" checked") : F("")); page.replace(F("{r1}"), (sysCfg.flag.mqtt_enabled) ? F(" checked") : F(""));
@ -902,8 +908,8 @@ void handleOther()
page += FPSTR(HTTP_FORM_OTHER3b); page += FPSTR(HTTP_FORM_OTHER3b);
page.replace(F("{1"), String(i)); page.replace(F("{1"), String(i));
page.replace(F("{2"), (i == sysCfg.flag.emulation) ? F(" checked") : F("")); page.replace(F("{2"), (i == sysCfg.flag.emulation) ? F(" checked") : F(""));
page.replace(F("{3"), (i == EMUL_NONE) ? F("None") : (i == EMUL_WEMO) ? F("Belkin WeMo") : F("Hue Bridge")); page.replace(F("{3"), (i == EMUL_NONE) ? F(D_NONE) : (i == EMUL_WEMO) ? F(D_BELKIN_WEMO) : F(D_HUE_BRIDGE));
page.replace(F("{4"), (i == EMUL_NONE) ? F("") : (i == EMUL_WEMO) ? F(" single device") : F(" multi devices")); page.replace(F("{4"), (i == EMUL_NONE) ? F("") : (i == EMUL_WEMO) ? F(" " D_SINGLE_DEVICE) : F(" " D_MULTI_DEVICE));
} }
page += F("<br/>"); page += F("<br/>");
for (int i = 1; i < Maxdevice; i++) { for (int i = 1; i < Maxdevice; i++) {
@ -925,7 +931,7 @@ void handleDownload()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Download config")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_BACKUP_CONFIGURATION));
uint8_t buffer[sizeof(sysCfg)]; uint8_t buffer[sizeof(sysCfg)];
@ -961,7 +967,7 @@ void handleSave()
byte restart; byte restart;
String result = ""; String result = "";
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Parameter save")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_SAVE_CONFIGURATION);
if (strlen(webServer->arg("w").c_str())) { if (strlen(webServer->arg("w").c_str())) {
what = atoi(webServer->arg("w").c_str()); what = atoi(webServer->arg("w").c_str());
@ -976,10 +982,10 @@ void handleSave()
strlcpy(sysCfg.sta_pwd[0], (!strlen(webServer->arg("p1").c_str())) ? STA_PASS1 : webServer->arg("p1").c_str(), sizeof(sysCfg.sta_pwd[0])); strlcpy(sysCfg.sta_pwd[0], (!strlen(webServer->arg("p1").c_str())) ? STA_PASS1 : webServer->arg("p1").c_str(), sizeof(sysCfg.sta_pwd[0]));
strlcpy(sysCfg.sta_ssid[1], (!strlen(webServer->arg("s2").c_str())) ? STA_SSID2 : webServer->arg("s2").c_str(), sizeof(sysCfg.sta_ssid[1])); strlcpy(sysCfg.sta_ssid[1], (!strlen(webServer->arg("s2").c_str())) ? STA_SSID2 : webServer->arg("s2").c_str(), sizeof(sysCfg.sta_ssid[1]));
strlcpy(sysCfg.sta_pwd[1], (!strlen(webServer->arg("p2").c_str())) ? STA_PASS2 : webServer->arg("p2").c_str(), sizeof(sysCfg.sta_pwd[1])); strlcpy(sysCfg.sta_pwd[1], (!strlen(webServer->arg("p2").c_str())) ? STA_PASS2 : webServer->arg("p2").c_str(), sizeof(sysCfg.sta_pwd[1]));
snprintf_P(log, sizeof(log), PSTR("HTTP: Wifi Hostname %s, SSID1 %s, Password1 %s, SSID2 %s, Password2 %s"), snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_CMND_HOSTNAME " %s, " D_CMND_SSID "1 %s, " D_CMND_PASSWORD "1 %s, " D_CMND_SSID "2 %s, " D_CMND_PASSWORD "2 %s"),
sysCfg.hostname, sysCfg.sta_ssid[0], sysCfg.sta_pwd[0], sysCfg.sta_ssid[1], sysCfg.sta_pwd[1]); sysCfg.hostname, sysCfg.sta_ssid[0], sysCfg.sta_pwd[0], sysCfg.sta_ssid[1], sysCfg.sta_pwd[1]);
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
result += F("<br/>Trying to connect device to network<br/>If it fails reconnect to try again"); result += F("<br/>" D_TRYING_TO_CONNECT "<br/>");
break; break;
case 2: case 2:
strlcpy(stemp, (!strlen(webServer->arg("mt").c_str())) ? MQTT_TOPIC : webServer->arg("mt").c_str(), sizeof(stemp)); strlcpy(stemp, (!strlen(webServer->arg("mt").c_str())) ? MQTT_TOPIC : webServer->arg("mt").c_str(), sizeof(stemp));
@ -987,7 +993,7 @@ void handleSave()
strlcpy(stemp2, (!strlen(webServer->arg("mf").c_str())) ? MQTT_FULLTOPIC : webServer->arg("mf").c_str(), sizeof(stemp2)); strlcpy(stemp2, (!strlen(webServer->arg("mf").c_str())) ? MQTT_FULLTOPIC : webServer->arg("mf").c_str(), sizeof(stemp2));
mqttfy(1,stemp2); mqttfy(1,stemp2);
if ((strcmp(stemp, sysCfg.mqtt_topic)) || (strcmp(stemp2, sysCfg.mqtt_fulltopic))) { if ((strcmp(stemp, sysCfg.mqtt_topic)) || (strcmp(stemp2, 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, S_LWT, (sysCfg.flag.mqtt_offline) ? S_OFFLINE : "", true); // Offline or remove previous retained topic
} }
strlcpy(sysCfg.mqtt_topic, stemp, sizeof(sysCfg.mqtt_topic)); strlcpy(sysCfg.mqtt_topic, stemp, sizeof(sysCfg.mqtt_topic));
strlcpy(sysCfg.mqtt_fulltopic, stemp2, sizeof(sysCfg.mqtt_fulltopic)); strlcpy(sysCfg.mqtt_fulltopic, stemp2, sizeof(sysCfg.mqtt_fulltopic));
@ -996,7 +1002,7 @@ void handleSave()
strlcpy(sysCfg.mqtt_client, (!strlen(webServer->arg("mc").c_str())) ? MQTT_CLIENT_ID : webServer->arg("mc").c_str(), sizeof(sysCfg.mqtt_client)); strlcpy(sysCfg.mqtt_client, (!strlen(webServer->arg("mc").c_str())) ? MQTT_CLIENT_ID : webServer->arg("mc").c_str(), sizeof(sysCfg.mqtt_client));
strlcpy(sysCfg.mqtt_user, (!strlen(webServer->arg("mu").c_str())) ? MQTT_USER : (!strcmp(webServer->arg("mu").c_str(),"0")) ? "" : webServer->arg("mu").c_str(), sizeof(sysCfg.mqtt_user)); strlcpy(sysCfg.mqtt_user, (!strlen(webServer->arg("mu").c_str())) ? MQTT_USER : (!strcmp(webServer->arg("mu").c_str(),"0")) ? "" : webServer->arg("mu").c_str(), sizeof(sysCfg.mqtt_user));
strlcpy(sysCfg.mqtt_pwd, (!strlen(webServer->arg("mp").c_str())) ? MQTT_PASS : (!strcmp(webServer->arg("mp").c_str(),"0")) ? "" : webServer->arg("mp").c_str(), sizeof(sysCfg.mqtt_pwd)); strlcpy(sysCfg.mqtt_pwd, (!strlen(webServer->arg("mp").c_str())) ? MQTT_PASS : (!strcmp(webServer->arg("mp").c_str(),"0")) ? "" : webServer->arg("mp").c_str(), sizeof(sysCfg.mqtt_pwd));
snprintf_P(log, sizeof(log), PSTR("HTTP: MQTT Host %s, Port %d, Client %s, User %s, Password %s, Topic %s, FullTopic %s"), snprintf_P(log, sizeof(log), PSTR(D_LOG_MQTT D_CMND_MQTTHOST " %s, " D_CMND_MQTTPORT " %d, " D_CMND_MQTTCLIENT " %s, " D_CMND_MQTTUSER " %s, " D_CMND_MQTTPASSWORD " %s, " D_CMND_TOPIC " %s, " D_CMND_FULLTOPIC " %s"),
sysCfg.mqtt_host, sysCfg.mqtt_port, sysCfg.mqtt_client, sysCfg.mqtt_user, sysCfg.mqtt_pwd, sysCfg.mqtt_topic, sysCfg.mqtt_fulltopic); sysCfg.mqtt_host, sysCfg.mqtt_port, sysCfg.mqtt_client, sysCfg.mqtt_user, sysCfg.mqtt_pwd, sysCfg.mqtt_topic, sysCfg.mqtt_fulltopic);
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
break; break;
@ -1009,7 +1015,7 @@ void handleSave()
strlcpy(sysCfg.syslog_host, (!strlen(webServer->arg("lh").c_str())) ? SYS_LOG_HOST : webServer->arg("lh").c_str(), sizeof(sysCfg.syslog_host)); strlcpy(sysCfg.syslog_host, (!strlen(webServer->arg("lh").c_str())) ? SYS_LOG_HOST : webServer->arg("lh").c_str(), sizeof(sysCfg.syslog_host));
sysCfg.syslog_port = (!strlen(webServer->arg("lp").c_str())) ? SYS_LOG_PORT : atoi(webServer->arg("lp").c_str()); sysCfg.syslog_port = (!strlen(webServer->arg("lp").c_str())) ? SYS_LOG_PORT : atoi(webServer->arg("lp").c_str());
sysCfg.tele_period = (!strlen(webServer->arg("lt").c_str())) ? TELE_PERIOD : atoi(webServer->arg("lt").c_str()); sysCfg.tele_period = (!strlen(webServer->arg("lt").c_str())) ? TELE_PERIOD : atoi(webServer->arg("lt").c_str());
snprintf_P(log, sizeof(log), PSTR("HTTP: Logging Seriallog %d, Weblog %d, Syslog %d, Host %s, Port %d, TelePeriod %d"), snprintf_P(log, sizeof(log), PSTR(D_LOG_LOG D_CMND_SERIALLOG " %d, " D_CMND_WEBLOG " %d, " D_CMND_SYSLOG " %d, " D_CMND_LOGHOST " %s, " D_CMND_LOGPORT " %d, " D_CMND_TELEPERIOD " %d"),
sysCfg.seriallog_level, sysCfg.weblog_level, sysCfg.syslog_level, sysCfg.syslog_host, sysCfg.syslog_port, sysCfg.tele_period); sysCfg.seriallog_level, sysCfg.weblog_level, sysCfg.syslog_level, sysCfg.syslog_host, sysCfg.syslog_port, sysCfg.tele_period);
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
break; break;
@ -1028,7 +1034,7 @@ void handleSave()
strlcpy(sysCfg.friendlyname[1], (!strlen(webServer->arg("a2").c_str())) ? FRIENDLY_NAME"2" : webServer->arg("a2").c_str(), sizeof(sysCfg.friendlyname[1])); strlcpy(sysCfg.friendlyname[1], (!strlen(webServer->arg("a2").c_str())) ? FRIENDLY_NAME"2" : webServer->arg("a2").c_str(), sizeof(sysCfg.friendlyname[1]));
strlcpy(sysCfg.friendlyname[2], (!strlen(webServer->arg("a3").c_str())) ? FRIENDLY_NAME"3" : webServer->arg("a3").c_str(), sizeof(sysCfg.friendlyname[2])); strlcpy(sysCfg.friendlyname[2], (!strlen(webServer->arg("a3").c_str())) ? FRIENDLY_NAME"3" : webServer->arg("a3").c_str(), sizeof(sysCfg.friendlyname[2]));
strlcpy(sysCfg.friendlyname[3], (!strlen(webServer->arg("a4").c_str())) ? FRIENDLY_NAME"4" : webServer->arg("a4").c_str(), sizeof(sysCfg.friendlyname[3])); strlcpy(sysCfg.friendlyname[3], (!strlen(webServer->arg("a4").c_str())) ? FRIENDLY_NAME"4" : webServer->arg("a4").c_str(), sizeof(sysCfg.friendlyname[3]));
snprintf_P(log, sizeof(log), PSTR("HTTP: Other MQTT Enable %s, Emulation %d, Friendly Names %s, %s, %s and %s"), snprintf_P(log, sizeof(log), PSTR(D_LOG_OTHER D_MQTT_ENABLE " %s, " D_CMND_EMULATION " %d, " D_CMND_FRIENDLYNAME " %s, %s, %s, %s"),
getStateText(sysCfg.flag.mqtt_enabled), sysCfg.flag.emulation, sysCfg.friendlyname[0], sysCfg.friendlyname[1], sysCfg.friendlyname[2], sysCfg.friendlyname[3]); getStateText(sysCfg.flag.mqtt_enabled), sysCfg.flag.emulation, sysCfg.friendlyname[0], sysCfg.friendlyname[1], sysCfg.friendlyname[2], sysCfg.friendlyname[3]);
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
break; break;
@ -1046,11 +1052,11 @@ void handleSave()
if (GPIO_USER == cmodule.gp.io[i]) { if (GPIO_USER == cmodule.gp.io[i]) {
snprintf_P(stemp, sizeof(stemp), PSTR("g%d"), i); snprintf_P(stemp, sizeof(stemp), PSTR("g%d"), i);
sysCfg.my_module.gp.io[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str()); sysCfg.my_module.gp.io[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
gpios += F(", GPIO"); gpios += String(i); gpios += F(" "); gpios += String(sysCfg.my_module.gp.io[i]); gpios += F(", " D_GPIO ); gpios += String(i); gpios += F(" "); gpios += String(sysCfg.my_module.gp.io[i]);
} }
} }
snprintf_P(stemp, sizeof(stemp), modules[sysCfg.module].name); snprintf_P(stemp, sizeof(stemp), modules[sysCfg.module].name);
snprintf_P(log, sizeof(log), PSTR("HTTP: %s Module%s"), stemp, gpios.c_str()); snprintf_P(log, sizeof(log), PSTR(D_LOG_MODULE "%s " D_CMND_MODULE "%s"), stemp, gpios.c_str());
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
break; break;
} }
@ -1058,8 +1064,8 @@ void handleSave()
restart = (!strlen(webServer->arg("r").c_str())) ? 1 : atoi(webServer->arg("r").c_str()); restart = (!strlen(webServer->arg("r").c_str())) ? 1 : atoi(webServer->arg("r").c_str());
if (restart) { if (restart) {
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Save parameters")); page.replace(F("{v}"), S_SAVE_CONFIGURATION);
page += F("<div style='text-align:center;'><b>Parameters saved</b><br/>"); page += F("<div style='text-align:center;'><b>" D_CONFIGURATION_SAVED "</b><br/>");
page += result; page += result;
page += F("</div>"); page += F("</div>");
page += FPSTR(HTTP_MSG_RSTRT); page += FPSTR(HTTP_MSG_RSTRT);
@ -1084,16 +1090,16 @@ void handleReset()
char svalue[16]; // was MESSZ char svalue[16]; // was MESSZ
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Reset parameters")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_RESET_CONFIGURATION);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Default parameters")); page.replace(F("{v}"), S_RESET_CONFIGURATION);
page += F("<div style='text-align:center;'>Parameters reset to default</div>"); page += F("<div style='text-align:center;'>" D_CONFIGURATION_RESET "</div>");
page += FPSTR(HTTP_MSG_RSTRT); page += FPSTR(HTTP_MSG_RSTRT);
page += FPSTR(HTTP_BTN_MAIN); page += FPSTR(HTTP_BTN_MAIN);
showPage(page); showPage(page);
snprintf_P(svalue, sizeof(svalue), PSTR("reset 1")); snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_RESET " 1"));
do_cmnd(svalue); do_cmnd(svalue);
} }
@ -1102,13 +1108,13 @@ void handleRestore()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Restore")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_RESTORE_CONFIGURATION);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Restore Configuration")); page.replace(F("{v}"), S_RESTORE_CONFIGURATION);
page += FPSTR(HTTP_FORM_RST); page += FPSTR(HTTP_FORM_RST);
page += FPSTR(HTTP_FORM_RST_UPG); page += FPSTR(HTTP_FORM_RST_UPG);
page.replace(F("{r1}"), F("restore")); page.replace(F("{r1}"), F(D_RESTORE));
page += FPSTR(HTTP_BTN_CONF); page += FPSTR(HTTP_BTN_CONF);
showPage(page); showPage(page);
@ -1121,14 +1127,14 @@ void handleUpgrade()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Upgrade")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_FIRMWARE_UPGRADE);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Firmware upgrade")); page.replace(F("{v}"), S_FIRMWARE_UPGRADE);
page += FPSTR(HTTP_FORM_UPG); page += FPSTR(HTTP_FORM_UPG);
page.replace(F("{o1}"), sysCfg.otaUrl); page.replace(F("{o1}"), sysCfg.otaUrl);
page += FPSTR(HTTP_FORM_RST_UPG); page += FPSTR(HTTP_FORM_RST_UPG);
page.replace(F("{r1}"), F("upgrade")); page.replace(F("{r1}"), F(D_UPGRADE));
page += FPSTR(HTTP_BTN_MAIN); page += FPSTR(HTTP_BTN_MAIN);
showPage(page); showPage(page);
@ -1143,22 +1149,22 @@ void handleUpgradeStart()
} }
char svalue[100]; // was MESSZ char svalue[100]; // was MESSZ
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Firmware upgrade start")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPGRADE_STARTED));
WIFI_configCounter(); WIFI_configCounter();
if (strlen(webServer->arg("o").c_str())) { if (strlen(webServer->arg("o").c_str())) {
snprintf_P(svalue, sizeof(svalue), PSTR("otaurl %s"), webServer->arg("o").c_str()); snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_OTAURL " %s"), webServer->arg("o").c_str());
do_cmnd(svalue); do_cmnd(svalue);
} }
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Info")); page.replace(F("{v}"), S_INFORMATION);
page += F("<div style='text-align:center;'><b>Upgrade started ...</b></div>"); page += F("<div style='text-align:center;'><b>" D_UPGRADE_STARTED " ...</b></div>");
page += FPSTR(HTTP_MSG_RSTRT); page += FPSTR(HTTP_MSG_RSTRT);
page += FPSTR(HTTP_BTN_MAIN); page += FPSTR(HTTP_BTN_MAIN);
showPage(page); showPage(page);
snprintf_P(svalue, sizeof(svalue), PSTR("upgrade 1")); snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_UPGRADE " 1"));
do_cmnd(svalue); do_cmnd(svalue);
} }
@ -1167,9 +1173,9 @@ void handleUploadDone()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: File upload done")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPLOAD_DONE));
char error[80]; char error[100];
char log[LOGSZ]; char log[LOGSZ];
WIFI_configCounter(); WIFI_configCounter();
@ -1177,29 +1183,30 @@ void handleUploadDone()
mqttcounter = 0; mqttcounter = 0;
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Info")); page.replace(F("{v}"), S_INFORMATION);
page += F("<div style='text-align:center;'><b>Upload "); page += F("<div style='text-align:center;'><b>" D_UPLOAD " <font color='");
if (_uploaderror) { if (_uploaderror) {
page += F("<font color='red'>failed</font></b><br/><br/>"); page += F("red'>" D_FAILED "</font></b><br/><br/>");
switch (_uploaderror) { switch (_uploaderror) {
case 1: strcpy_P(error, PSTR("No file selected")); break; case 1: strcpy_P(error, PSTR(D_UPLOAD_ERR_1)); break;
case 2: strcpy_P(error, PSTR("Not enough space")); break; case 2: strcpy_P(error, PSTR(D_UPLOAD_ERR_2)); break;
case 3: strcpy_P(error, PSTR("Magic byte is not 0xE9")); break; case 3: strcpy_P(error, PSTR(D_UPLOAD_ERR_3)); break;
case 4: strcpy_P(error, PSTR("IDE flash size larger than device flash size")); break; case 4: strcpy_P(error, PSTR(D_UPLOAD_ERR_4)); break;
case 5: strcpy_P(error, PSTR("Upload buffer miscompare")); break; case 5: strcpy_P(error, PSTR(D_UPLOAD_ERR_5)); break;
case 6: strcpy_P(error, PSTR("Upload failed. Enable logging 3")); break; case 6: strcpy_P(error, PSTR(D_UPLOAD_ERR_6)); break;
case 7: strcpy_P(error, PSTR("Upload aborted")); break; case 7: strcpy_P(error, PSTR(D_UPLOAD_ERR_7)); break;
case 8: strcpy_P(error, PSTR("File invalid")); break; case 8: strcpy_P(error, PSTR(D_UPLOAD_ERR_8)); break;
case 9: strcpy_P(error, PSTR("File too large")); break; case 9: strcpy_P(error, PSTR(D_UPLOAD_ERR_9)); break;
default: default:
snprintf_P(error, sizeof(error), PSTR("Upload error code %d"), _uploaderror); snprintf_P(error, sizeof(error), PSTR(D_UPLOAD_ERROR_CODE " %d"), _uploaderror);
} }
page += error; page += error;
snprintf_P(log, sizeof(log), PSTR("Upload: %s"), error); snprintf_P(log, sizeof(log), PSTR(D_UPLOAD ": %s"), error);
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
stop_flash_rotate = sysCfg.flag.stop_flash_rotate; stop_flash_rotate = sysCfg.flag.stop_flash_rotate;
} else { } else {
page += F("<font color='green'>successful</font></b><br/><br/>Device will restart in a few seconds"); page += F("green'>" D_SUCCESSFUL "</font></b><br/>");
page += FPSTR(HTTP_MSG_RSTRT);
restartflag = 2; restartflag = 2;
} }
page += F("</div><br/>"); page += F("</div><br/>");
@ -1232,7 +1239,7 @@ void handleUploadLoop()
return; return;
} }
CFG_Save(1); // Free flash for upload CFG_Save(1); // Free flash for upload
snprintf_P(log, sizeof(log), PSTR("Upload: File %s ..."), upload.filename.c_str()); snprintf_P(log, sizeof(log), PSTR(D_LOG_UPLOAD D_FILE " %s ..."), upload.filename.c_str());
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
if (!_uploadfiletype) { if (!_uploadfiletype) {
mqttcounter = 60; mqttcounter = 60;
@ -1312,7 +1319,7 @@ void handleUploadLoop()
} }
} }
if (!_uploaderror) { if (!_uploaderror) {
snprintf_P(log, sizeof(log), PSTR("Upload: Successful %u bytes. Restarting"), upload.totalSize); snprintf_P(log, sizeof(log), PSTR(D_LOG_UPLOAD D_SUCCESSFUL " %u bytes. " D_RESTARTING), upload.totalSize);
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
} }
} else if (UPLOAD_FILE_ABORTED == upload.status) { } else if (UPLOAD_FILE_ABORTED == upload.status) {
@ -1333,7 +1340,7 @@ void handleCmnd()
} }
char svalue[INPUT_BUFFER_SIZE]; // big to serve Backlog char svalue[INPUT_BUFFER_SIZE]; // big to serve Backlog
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Command")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_COMMAND));
uint8_t valid = 1; uint8_t valid = 1;
if (sysCfg.web_password[0] != 0) { if (sysCfg.web_password[0] != 0) {
@ -1376,10 +1383,10 @@ void handleCmnd()
} }
} while (counter != logidx); } while (counter != logidx);
} else { } else {
message = F("Enable weblog 2 if response expected\n"); message = F(D_ENABLE_WEBLOG_FOR_RESPONSE "\n");
} }
} else { } else {
message = F("Need user=<username>&password=<password>\n"); message = F(D_NEED_USER_AND_PASSWORD "\n");
} }
webServer->send(200, FPSTR(HDR_CTYPE_PLAIN), message); webServer->send(200, FPSTR(HDR_CTYPE_PLAIN), message);
} }
@ -1390,10 +1397,10 @@ void handleConsole()
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Console")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONSOLE);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Console")); page.replace(F("{v}"), S_CONSOLE);
page.replace(F("</script>"), FPSTR(HTTP_SCRIPT_CONSOL)); page.replace(F("</script>"), FPSTR(HTTP_SCRIPT_CONSOL));
page.replace(F("<body>"), F("<body onload='l()'>")); page.replace(F("<body>"), F("<body onload='l()'>"));
page += FPSTR(HTTP_FORM_CMND); page += FPSTR(HTTP_FORM_CMND);
@ -1413,7 +1420,7 @@ void handleAjax()
if (strlen(webServer->arg("c1").c_str())) { if (strlen(webServer->arg("c1").c_str())) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s"), webServer->arg("c1").c_str()); snprintf_P(svalue, sizeof(svalue), PSTR("%s"), webServer->arg("c1").c_str());
snprintf_P(log, sizeof(log), PSTR("CMND: %s"), svalue); snprintf_P(log, sizeof(log), PSTR(D_LOG_COMMAND "%s"), svalue);
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
byte syslog_now = syslog_level; byte syslog_now = syslog_level;
syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT
@ -1463,103 +1470,100 @@ void handleInfo()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Info")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_INFORMATION);
char stopic[TOPSZ]; char stopic[TOPSZ];
int freeMem = ESP.getFreeHeap(); int freeMem = ESP.getFreeHeap();
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Information")); page.replace(F("{v}"), S_INFORMATION);
// page += F("<fieldset><legend><b>&nbsp;Information&nbsp;</b></legend>"); // page += F("<fieldset><legend><b>&nbsp;Information&nbsp;</b></legend>");
page += F("<style>td{padding:0px 5px;}</style>"); page += F("<style>td{padding:0px 5px;}</style>");
page += F("<table style'width:100%;'>"); page += F("<table style'width:100%;'>");
page += F("<tr><th>Program version</th><td>"); page += Version; page += F("</td></tr>"); page += F("<tr><th>" D_PROGRAM_VERSION "</th><td>"); page += Version; page += F("</td></tr>");
page += F("<tr><th>Build Date & Time</th><td>"); page += getBuildDateTime(); page += F("</td></tr>"); page += F("<tr><th>" D_BUILD_DATE_AND_TIME "</th><td>"); page += getBuildDateTime(); page += F("</td></tr>");
page += F("<tr><th>Core/SDK version</th><td>"); page += ESP.getCoreVersion(); page += F("/"); page += String(ESP.getSdkVersion()); page += F("</td></tr>"); page += F("<tr><th>" D_CORE_AND_SDK_VERSION "</th><td>"); page += ESP.getCoreVersion(); page += F("/"); page += String(ESP.getSdkVersion()); page += F("</td></tr>");
// page += F("<tr><th>Boot version</th><td>"); page += String(ESP.getBootVersion()); page += F("</td></tr>"); page += F("<tr><th>" D_UPTIME "</th><td>"); page += String(uptime); page += F(" Hours</td></tr>");
page += F("<tr><th>Uptime</th><td>"); page += String(uptime); page += F(" Hours</td></tr>");
snprintf_P(stopic, sizeof(stopic), PSTR(" at %X"), CFG_Address()); snprintf_P(stopic, sizeof(stopic), PSTR(" at %X"), CFG_Address());
page += F("<tr><th>Flash write count</th><td>"); page += String(sysCfg.saveFlag); page += stopic; page += F("</td></tr>"); page += F("<tr><th>" D_FLASH_WRITE_COUNT "</th><td>"); page += String(sysCfg.saveFlag); page += stopic; page += F("</td></tr>");
page += F("<tr><th>Boot count</th><td>"); page += String(sysCfg.bootcount); page += F("</td></tr>"); page += F("<tr><th>" D_BOOT_COUNT "</th><td>"); page += String(sysCfg.bootcount); page += F("</td></tr>");
page += F("<tr><th>Reset reason</th><td>"); page += getResetReason(); page += F("</td></tr>"); page += F("<tr><th>" D_RESTART_REASON "</th><td>"); page += getResetReason(); page += F("</td></tr>");
for (byte i = 0; i < Maxdevice; i++) { for (byte i = 0; i < Maxdevice; i++) {
page += F("<tr><th>Friendly name "); page += F("<tr><th>" D_FRIENDLY_NAME " ");
page += i +1; page += i +1;
page += F("</th><td>"); page += sysCfg.friendlyname[i]; page += F("</td></tr>"); page += F("</th><td>"); page += sysCfg.friendlyname[i]; page += F("</td></tr>");
} }
page += F("<tr><td>&nbsp;</td></tr>"); page += F("<tr><td>&nbsp;</td></tr>");
page += F("<tr><th>AP"); page += String(sysCfg.sta_active +1); page += F("<tr><th>" D_AP); page += String(sysCfg.sta_active +1);
page += F(" SSId (RSSI)</th><td>"); page += sysCfg.sta_ssid[sysCfg.sta_active]; page += F(" ("); page += WIFI_getRSSIasQuality(WiFi.RSSI()); page += F("%)</td></tr>"); page += F(" " D_SSID " (" D_RSSI ")</th><td>"); page += sysCfg.sta_ssid[sysCfg.sta_active]; page += F(" ("); page += WIFI_getRSSIasQuality(WiFi.RSSI()); page += F("%)</td></tr>");
page += F("<tr><th>Hostname</th><td>"); page += Hostname; page += F("</td></tr>"); page += F("<tr><th>" D_HOSTNAME "</th><td>"); page += Hostname; page += F("</td></tr>");
if (static_cast<uint32_t>(WiFi.localIP()) != 0) { if (static_cast<uint32_t>(WiFi.localIP()) != 0) {
page += F("<tr><th>IP address</th><td>"); page += WiFi.localIP().toString(); page += F("</td></tr>"); page += F("<tr><th>" D_IP_ADDRESS "</th><td>"); page += WiFi.localIP().toString(); page += F("</td></tr>");
page += F("<tr><th>Gateway</th><td>"); page += IPAddress(sysCfg.ip_address[1]).toString(); page += F("</td></tr>"); page += F("<tr><th>" D_GATEWAY "</th><td>"); page += IPAddress(sysCfg.ip_address[1]).toString(); page += F("</td></tr>");
page += F("<tr><th>Subnet mask</th><td>"); page += IPAddress(sysCfg.ip_address[2]).toString(); page += F("</td></tr>"); page += F("<tr><th>" D_SUBNET_MASK "</th><td>"); page += IPAddress(sysCfg.ip_address[2]).toString(); page += F("</td></tr>");
page += F("<tr><th>DNS server</th><td>"); page += IPAddress(sysCfg.ip_address[3]).toString(); page += F("</td></tr>"); page += F("<tr><th>" D_DNS_SERVER "</th><td>"); page += IPAddress(sysCfg.ip_address[3]).toString(); page += F("</td></tr>");
page += F("<tr><th>MAC address</th><td>"); page += WiFi.macAddress(); page += F("</td></tr>"); page += F("<tr><th>" D_MAC_ADDRESS "</th><td>"); page += WiFi.macAddress(); page += F("</td></tr>");
} }
if (static_cast<uint32_t>(WiFi.softAPIP()) != 0) { if (static_cast<uint32_t>(WiFi.softAPIP()) != 0) {
page += F("<tr><th>AP IP address</th><td>"); page += WiFi.softAPIP().toString(); page += F("</td></tr>"); page += F("<tr><th>" D_AP " " D_IP_ADDRESS "</th><td>"); page += WiFi.softAPIP().toString(); page += F("</td></tr>");
page += F("<tr><th>AP Gateway</th><td>"); page += WiFi.softAPIP().toString(); page += F("</td></tr>"); page += F("<tr><th>" D_AP " " D_GATEWAY "</th><td>"); page += WiFi.softAPIP().toString(); page += F("</td></tr>");
page += F("<tr><th>AP MAC address</th><td>"); page += WiFi.softAPmacAddress(); page += F("</td></tr>"); page += F("<tr><th>" D_AP " " D_MAC_ADDRESS "</th><td>"); page += WiFi.softAPmacAddress(); page += F("</td></tr>");
} }
page += F("<tr><td>&nbsp;</td></tr>"); page += F("<tr><td>&nbsp;</td></tr>");
if (sysCfg.flag.mqtt_enabled) { if (sysCfg.flag.mqtt_enabled) {
page += F("<tr><th>MQTT Host</th><td>"); page += sysCfg.mqtt_host; page += F("</td></tr>"); page += F("<tr><th>" D_MQTT_HOST "</th><td>"); page += sysCfg.mqtt_host; page += F("</td></tr>");
page += F("<tr><th>MQTT Port</th><td>"); page += String(sysCfg.mqtt_port); page += F("</td></tr>"); page += F("<tr><th>" D_MQTT_PORT "</th><td>"); page += String(sysCfg.mqtt_port); page += F("</td></tr>");
page += F("<tr><th>MQTT Client &<br/>&nbsp;Fallback Topic</th><td>"); page += MQTTClient; page += F("</td></tr>"); page += F("<tr><th>" D_MQTT_CLIENT " &<br/>&nbsp;" D_FALLBACK_TOPIC "</th><td>"); page += MQTTClient; page += F("</td></tr>");
page += F("<tr><th>MQTT User</th><td>"); page += sysCfg.mqtt_user; page += F("</td></tr>"); page += F("<tr><th>" D_MQTT_USER "</th><td>"); page += sysCfg.mqtt_user; page += F("</td></tr>");
// page += F("<tr><th>MQTT Password</th><td>"); page += sysCfg.mqtt_pwd; page += F("</td></tr>"); page += F("<tr><th>" D_MQTT_TOPIC "</th><td>"); page += sysCfg.mqtt_topic; page += F("</td></tr>");
page += F("<tr><th>MQTT Topic</th><td>"); page += sysCfg.mqtt_topic; page += F("</td></tr>"); page += F("<tr><th>" D_MQTT_GROUP_TOPIC "</th><td>"); page += sysCfg.mqtt_grptopic; page += F("</td></tr>");
page += F("<tr><th>MQTT Group Topic</th><td>"); page += sysCfg.mqtt_grptopic; page += F("</td></tr>");
getTopic_P(stopic, 0, sysCfg.mqtt_topic, ""); getTopic_P(stopic, 0, sysCfg.mqtt_topic, "");
page += F("<tr><th>MQTT Full Topic</th><td>"); page += stopic; page += F("</td></tr>"); page += F("<tr><th>" D_MQTT_FULL_TOPIC "</th><td>"); page += stopic; page += F("</td></tr>");
} else { } else {
page += F("<tr><th>MQTT</th><td>Disabled</td></tr>"); page += F("<tr><th>" D_MQTT "</th><td>" D_DISABLED "</td></tr>");
} }
page += F("<tr><td>&nbsp;</td></tr>"); page += F("<tr><td>&nbsp;</td></tr>");
page += F("<tr><th>Emulation</th><td>"); page += F("<tr><th>" D_EMULATION "</th><td>");
#ifdef USE_EMULATION #ifdef USE_EMULATION
if (EMUL_WEMO == sysCfg.flag.emulation) { if (EMUL_WEMO == sysCfg.flag.emulation) {
page += F("Belkin WeMo"); page += F(D_BELKIN_WEMO);
} }
else if (EMUL_HUE == sysCfg.flag.emulation) { else if (EMUL_HUE == sysCfg.flag.emulation) {
page += F("Hue Bridge"); page += F(D_HUE_BRIDGE);
} }
else { else {
page += F("None"); page += F(D_NONE);
} }
#else #else
page += F("Disabled"); page += F(D_DISABLED);
#endif // USE_EMULATION #endif // USE_EMULATION
page += F("</td></tr>"); page += F("</td></tr>");
page += F("<tr><th>mDNS Discovery</th><td>"); page += F("<tr><th>" D_MDNS_DISCOVERY "</th><td>");
#ifdef USE_DISCOVERY #ifdef USE_DISCOVERY
page += F("Enabled"); page += F(D_ENABLED);
page += F("</td></tr>"); page += F("</td></tr>");
page += F("<tr><th>mDNS Advertise</th><td>"); page += F("<tr><th>" D_MDNS_ADVERTISE "</th><td>");
#ifdef WEBSERVER_ADVERTISE #ifdef WEBSERVER_ADVERTISE
page += F("Webserver"); page += F(D_WEB_SERVER);
#else #else
page += F("Disabled"); page += F(D_DISABLED);
#endif // WEBSERVER_ADVERTISE #endif // WEBSERVER_ADVERTISE
#else #else
page += F("Disabled"); page += F(D_DISABLED);
#endif // USE_DISCOVERY #endif // USE_DISCOVERY
page += F("</td></tr>"); page += F("</td></tr>");
page += F("<tr><td>&nbsp;</td></tr>"); page += F("<tr><td>&nbsp;</td></tr>");
page += F("<tr><th>ESP Chip id</th><td>"); page += String(ESP.getChipId()); page += F("</td></tr>"); page += F("<tr><th>" D_ESP_CHIP_ID "</th><td>"); page += String(ESP.getChipId()); page += F("</td></tr>");
page += F("<tr><th>Flash Chip id</th><td>"); page += String(ESP.getFlashChipId()); page += F("</td></tr>"); page += F("<tr><th>" D_FLASH_CHIP_ID "</th><td>"); page += String(ESP.getFlashChipId()); page += F("</td></tr>");
page += F("<tr><th>Flash size</th><td>"); page += String(ESP.getFlashChipRealSize() / 1024); page += F("kB</td></tr>"); page += F("<tr><th>" D_FLASH_CHIP_SIZE "</th><td>"); page += String(ESP.getFlashChipRealSize() / 1024); page += F("kB</td></tr>");
page += F("<tr><th>Program flash size</th><td>"); page += String(ESP.getFlashChipSize() / 1024); page += F("kB</td></tr>"); page += F("<tr><th>" D_PROGRAM_FLASH_SIZE "</th><td>"); page += String(ESP.getFlashChipSize() / 1024); page += F("kB</td></tr>");
page += F("<tr><th>Program size</th><td>"); page += String(ESP.getSketchSize() / 1024); page += F("kB</td></tr>"); page += F("<tr><th>" D_PROGRAM_SIZE "</th><td>"); page += String(ESP.getSketchSize() / 1024); page += F("kB</td></tr>");
page += F("<tr><th>Free program space</th><td>"); page += String(ESP.getFreeSketchSpace() / 1024); page += F("kB</td></tr>"); page += F("<tr><th>" D_FREE_PROGRAM_SPACE "</th><td>"); page += String(ESP.getFreeSketchSpace() / 1024); page += F("kB</td></tr>");
page += F("<tr><th>Free memory</th><td>"); page += String(freeMem / 1024); page += F("kB</td></tr>"); page += F("<tr><th>" D_FREE_MEMORY "</th><td>"); page += String(freeMem / 1024); page += F("kB</td></tr>");
page += F("</table>"); page += F("</table>");
// page += F("</fieldset>"); // page += F("</fieldset>");
page += FPSTR(HTTP_BTN_MAIN); page += FPSTR(HTTP_BTN_MAIN);
@ -1571,10 +1575,10 @@ void handleRestart()
if (httpUser()) { if (httpUser()) {
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Restarting")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_RESTART);
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), F("Info")); page.replace(F("{v}"), S_RESTART);
page += FPSTR(HTTP_MSG_RSTRT); page += FPSTR(HTTP_MSG_RSTRT);
if (HTTP_MANAGER == _httpflag) { if (HTTP_MANAGER == _httpflag) {
_httpflag = HTTP_ADMIN; _httpflag = HTTP_ADMIN;
@ -1601,7 +1605,7 @@ void handleNotFound()
} else } else
#endif // USE_EMULATION #endif // USE_EMULATION
{ {
String message = F("File Not Found\n\nURI: "); String message = F(D_FILE_NOT_FOUND "\n\nURI: ");
message += webServer->uri(); message += webServer->uri();
message += F("\nMethod: "); message += F("\nMethod: ");
message += (webServer->method() == HTTP_GET) ? F("GET") : F("POST"); message += (webServer->method() == HTTP_GET) ? F("GET") : F("POST");
@ -1620,7 +1624,7 @@ void handleNotFound()
boolean captivePortal() boolean captivePortal()
{ {
if ((HTTP_MANAGER == _httpflag) && !isIp(webServer->hostHeader())) { if ((HTTP_MANAGER == _httpflag) && !isIp(webServer->hostHeader())) {
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Request redirected to captive portal")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_REDIRECTED));
webServer->sendHeader(F("Location"), String("http://") + webServer->client().localIP().toString(), true); webServer->sendHeader(F("Location"), String("http://") + webServer->client().localIP().toString(), true);
webServer->send(302, FPSTR(HDR_CTYPE_PLAIN), ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. webServer->send(302, FPSTR(HDR_CTYPE_PLAIN), ""); // Empty content inhibits Content-length header so we have to close the socket ourselves.

View File

@ -23,22 +23,22 @@
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
const char HTTP_FORM_DOMOTICZ[] PROGMEM = const char HTTP_FORM_DOMOTICZ[] PROGMEM =
"<fieldset><legend><b>&nbsp;Domoticz parameters&nbsp;</b></legend><form method='post' action='sv'>" "<fieldset><legend><b>&nbsp;" D_DOMOTICZ_PARAMETERS "&nbsp;</b></legend><form method='post' action='sv'>"
"<input id='w' name='w' value='4' hidden><input id='r' name='r' value='1' hidden>" "<input id='w' name='w' value='4' hidden><input id='r' name='r' value='1' hidden>"
"<br/><table style='width:97%'>"; "<br/><table style='width:97%'>";
const char HTTP_FORM_DOMOTICZ_RELAY[] PROGMEM = const char HTTP_FORM_DOMOTICZ_RELAY[] PROGMEM =
"<tr><td><b>Idx {1</b></td></td><td width='20%'><input id='r{1' name='r{1' length=8 placeholder='0' value='{2'></td></tr>" "<tr><td><b>" D_DOMOTICZ_IDX " {1</b></td></td><td width='20%'><input id='r{1' name='r{1' length=8 placeholder='0' value='{2'></td></tr>"
"<tr><td><b>Key idx {1</b></td><td><input id='k{1' name='k{1' length=8 placeholder='0' value='{3'></td></tr>"; "<tr><td><b>" D_DOMOTICZ_KEY_IDX " {1</b></td><td><input id='k{1' name='k{1' length=8 placeholder='0' value='{3'></td></tr>";
const char HTTP_FORM_DOMOTICZ_SWITCH[] PROGMEM = const char HTTP_FORM_DOMOTICZ_SWITCH[] PROGMEM =
"<tr><td><b>Switch idx {1</b></td><td width='20%'><input id='s{1' name='s{1' length=8 placeholder='0' value='{4'></td></tr>"; "<tr><td><b>" D_DOMOTICZ_SWITCH_IDX " {1</b></td><td width='20%'><input id='s{1' name='s{1' length=8 placeholder='0' value='{4'></td></tr>";
const char HTTP_FORM_DOMOTICZ_SENSOR[] PROGMEM = const char HTTP_FORM_DOMOTICZ_SENSOR[] PROGMEM =
"<tr><td><b>Sensor idx {1</b> - {2</td><td width='20%'><input id='l{1' name='l{1' length=8 placeholder='0' value='{5'></td></tr>"; "<tr><td><b>" D_DOMOTICZ_SENSOR_IDX " {1</b> - {2</td><td width='20%'><input id='l{1' name='l{1' length=8 placeholder='0' value='{5'></td></tr>";
const char HTTP_FORM_DOMOTICZ_TIMER[] PROGMEM = const char HTTP_FORM_DOMOTICZ_TIMER[] PROGMEM =
"<tr><td><b>Update timer</b> (" STR(DOMOTICZ_UPDATE_TIMER) ")</td><td><input id='ut' name='ut' length=32 placeholder='" STR(DOMOTICZ_UPDATE_TIMER) "' value='{6'</td></tr>"; "<tr><td><b>" D_DOMOTICZ_UPDATE_TIMER "</b> (" STR(DOMOTICZ_UPDATE_TIMER) ")</td><td><input id='ut' name='ut' length=32 placeholder='" STR(DOMOTICZ_UPDATE_TIMER) "' value='{6'</td></tr>";
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
const char domoticz_sensors[DOMOTICZ_MAX_SENSORS][14] PROGMEM = const char domoticz_sensors[DOMOTICZ_MAX_SENSORS][DOMOTICZ_SENSORS_MAX_STRING_LENGTH] PROGMEM =
{ "Temp", "Temp,Hum", "Temp,Hum,Baro", "Power,Energy", "Illuminance", "Count" }; { D_DOMOTICZ_TEMP, D_DOMOTICZ_TEMP_HUM, D_DOMOTICZ_TEMP_HUM_BARO, D_DOMOTICZ_POWER_ENERGY, D_DOMOTICZ_ILLUMINANCE, D_DOMOTICZ_COUNT };
char domoticz_in_topic[] = DOMOTICZ_IN_TOPIC; char domoticz_in_topic[] = DOMOTICZ_IN_TOPIC;
char domoticz_out_topic[] = DOMOTICZ_OUT_TOPIC; char domoticz_out_topic[] = DOMOTICZ_OUT_TOPIC;
@ -159,7 +159,7 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
idx = domoticz["idx"]; idx = domoticz["idx"];
nvalue = domoticz["nvalue"]; nvalue = domoticz["nvalue"];
snprintf_P(log, sizeof(log), PSTR("DMTZ: idx %d, nvalue %d"), idx, nvalue); snprintf_P(log, sizeof(log), PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), idx, nvalue);
addLog(LOG_LEVEL_DEBUG_MORE, log); addLog(LOG_LEVEL_DEBUG_MORE, log);
if (nvalue >= 0 && nvalue <= 2) { if (nvalue >= 0 && nvalue <= 2) {
@ -174,14 +174,14 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
if (sfl_flg && (sysCfg.led_dimmer[i] == nvalue)) { if (sfl_flg && (sysCfg.led_dimmer[i] == nvalue)) {
return 1; return 1;
} }
snprintf_P(topicBuf, stopicBuf, PSTR("/DIMMER%s"), (Maxdevice > 1) ? stemp1 : ""); snprintf_P(topicBuf, stopicBuf, PSTR("/" D_CMND_DIMMER "%s"), (Maxdevice > 1) ? stemp1 : "");
snprintf_P(dataBuf, sdataBuf, PSTR("%d"), nvalue); snprintf_P(dataBuf, sdataBuf, PSTR("%d"), nvalue);
found = 1; found = 1;
} else { } else {
if (((power >> i) &1) == nvalue) { if (((power >> i) &1) == nvalue) {
return 1; return 1;
} }
snprintf_P(topicBuf, stopicBuf, PSTR("/POWER%s"), (Maxdevice > 1) ? stemp1 : ""); snprintf_P(topicBuf, stopicBuf, PSTR("/" D_CMND_POWER "%s"), (Maxdevice > 1) ? stemp1 : "");
snprintf_P(dataBuf, sdataBuf, PSTR("%d"), nvalue); snprintf_P(dataBuf, sdataBuf, PSTR("%d"), nvalue);
found = 1; found = 1;
} }
@ -193,7 +193,7 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
return 1; return 1;
} }
snprintf_P(log, sizeof(log), PSTR("DMTZ: Receive topic %s, data %s"), topicBuf, dataBuf); snprintf_P(log, sizeof(log), PSTR(D_LOG_DOMOTICZ D_RECEIVED_TOPIC " %s, " D_DATA " %s"), topicBuf, dataBuf);
addLog(LOG_LEVEL_DEBUG_MORE, log); addLog(LOG_LEVEL_DEBUG_MORE, log);
domoticz_update_flag = 0; domoticz_update_flag = 0;
@ -208,38 +208,39 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload, char *svalue, uint16_t ssvalue) boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload, char *svalue, uint16_t ssvalue)
{ {
boolean serviced = true; boolean serviced = true;
uint8_t dmtcz_len = strlen(D_CMND_DOMOTICZ); // Prep for string length change
if (!strncmp_P(type,PSTR("DOMOTICZ"),8)) { if (!strncasecmp_P(type, PSTR(D_CMND_DOMOTICZ), dmtcz_len)) { // Prefix
if (!strcmp_P(type +8,PSTR("IDX")) && (index > 0) && (index <= Maxdevice)) { if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_IDX)) && (index > 0) && (index <= Maxdevice)) {
if (payload >= 0) { if (payload >= 0) {
sysCfg.domoticz_relay_idx[index -1] = payload; sysCfg.domoticz_relay_idx[index -1] = payload;
restartflag = 2; restartflag = 2;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzIdx%d\":%d}"), index, sysCfg.domoticz_relay_idx[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_IDX "%d\":%d}"), index, sysCfg.domoticz_relay_idx[index -1]);
} }
else if (!strcmp_P(type +8,PSTR("KEYIDX")) && (index > 0) && (index <= Maxdevice)) { else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_KEYIDX)) && (index > 0) && (index <= Maxdevice)) {
if (payload >= 0) { if (payload >= 0) {
sysCfg.domoticz_key_idx[index -1] = payload; sysCfg.domoticz_key_idx[index -1] = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzKeyIdx%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_KEYIDX "%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
} }
else if (!strcmp_P(type +8,PSTR("SWITCHIDX")) && (index > 0) && (index <= Maxdevice)) { else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_SWITCHIDX)) && (index > 0) && (index <= Maxdevice)) {
if (payload >= 0) { if (payload >= 0) {
sysCfg.domoticz_switch_idx[index -1] = payload; sysCfg.domoticz_switch_idx[index -1] = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzSwitchIdx%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_SWITCHIDX "%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
} }
else if (!strcmp_P(type +8,PSTR("SENSORIDX")) && (index > 0) && (index <= DOMOTICZ_MAX_SENSORS)) { else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_SENSORIDX)) && (index > 0) && (index <= DOMOTICZ_MAX_SENSORS)) {
if (payload >= 0) { if (payload >= 0) {
sysCfg.domoticz_sensor_idx[index -1] = payload; sysCfg.domoticz_sensor_idx[index -1] = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzSensorIdx%d\":%d}"), index, sysCfg.domoticz_sensor_idx[index -1]); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_SENSORIDX "%d\":%d}"), index, sysCfg.domoticz_sensor_idx[index -1]);
} }
else if (!strcmp_P(type +8,PSTR("UPDATETIMER"))) { else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_UPDATETIMER))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.domoticz_update_timer = payload; sysCfg.domoticz_update_timer = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"DomoticzUpdateTimer\":%d}"), sysCfg.domoticz_update_timer); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_UPDATETIMER "\":%d}"), sysCfg.domoticz_update_timer);
} }
else serviced = false; else serviced = false;
} }
@ -327,18 +328,20 @@ void domoticz_sensor6(uint32_t count)
\*********************************************************************************************/ \*********************************************************************************************/
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
const char S_CONFIGURE_DOMOTICZ[] PROGMEM = D_CONFIGURE_DOMOTICZ;
void handleDomoticz() void handleDomoticz()
{ {
if (HTTP_USER == _httpflag) { if (HTTP_USER == _httpflag) {
handleRoot(); handleRoot();
return; return;
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Handle Domoticz config")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_DOMOTICZ);
char stemp[20]; char stemp[20];
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace("{v}", "Configure Domoticz"); page.replace("{v}", S_CONFIGURE_DOMOTICZ);
page += FPSTR(HTTP_FORM_DOMOTICZ); page += FPSTR(HTTP_FORM_DOMOTICZ);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
if (i < Maxdevice) { if (i < Maxdevice) {
@ -384,11 +387,11 @@ void domoticz_saveSettings()
sysCfg.domoticz_sensor_idx[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str()); sysCfg.domoticz_sensor_idx[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
} }
sysCfg.domoticz_update_timer = (!strlen(webServer->arg("ut").c_str())) ? DOMOTICZ_UPDATE_TIMER : atoi(webServer->arg("ut").c_str()); sysCfg.domoticz_update_timer = (!strlen(webServer->arg("ut").c_str())) ? DOMOTICZ_UPDATE_TIMER : atoi(webServer->arg("ut").c_str());
snprintf_P(log, sizeof(log), PSTR("HTTP: Domoticz idx %d, %d, %d, %d, update timer %d"), snprintf_P(log, sizeof(log), PSTR(D_LOG_DOMOTICZ D_CMND_IDX " %d, %d, %d, %d, " D_CMND_UPDATETIMER " %d"),
sysCfg.domoticz_relay_idx[0], sysCfg.domoticz_relay_idx[1], sysCfg.domoticz_relay_idx[2], sysCfg.domoticz_relay_idx[3], sysCfg.domoticz_relay_idx[0], sysCfg.domoticz_relay_idx[1], sysCfg.domoticz_relay_idx[2], sysCfg.domoticz_relay_idx[3],
sysCfg.domoticz_update_timer); sysCfg.domoticz_update_timer);
addLog(LOG_LEVEL_INFO, log); addLog(LOG_LEVEL_INFO, log);
snprintf_P(log, sizeof(log), PSTR("HTTP: key %d, %d, %d, %d, switch %d, %d, %d, %d, sensor %d, %d, %d, %d, %d, %d"), snprintf_P(log, sizeof(log), PSTR(D_LOG_DOMOTICZ D_CMND_KEYIDX " %d, %d, %d, %d, " D_CMND_SWITCHIDX " %d, %d, %d, %d, " D_CMND_SENSORIDX " %d, %d, %d, %d, %d, %d"),
sysCfg.domoticz_key_idx[0], sysCfg.domoticz_key_idx[1], sysCfg.domoticz_key_idx[2], sysCfg.domoticz_key_idx[3], sysCfg.domoticz_key_idx[0], sysCfg.domoticz_key_idx[1], sysCfg.domoticz_key_idx[2], sysCfg.domoticz_key_idx[3],
sysCfg.domoticz_switch_idx[0], sysCfg.domoticz_switch_idx[1], sysCfg.domoticz_switch_idx[2], sysCfg.domoticz_switch_idx[3], sysCfg.domoticz_switch_idx[0], sysCfg.domoticz_switch_idx[1], sysCfg.domoticz_switch_idx[2], sysCfg.domoticz_switch_idx[3],
sysCfg.domoticz_sensor_idx[0], sysCfg.domoticz_sensor_idx[1], sysCfg.domoticz_sensor_idx[2], sysCfg.domoticz_sensor_idx[3], sysCfg.domoticz_sensor_idx[0], sysCfg.domoticz_sensor_idx[1], sysCfg.domoticz_sensor_idx[2], sysCfg.domoticz_sensor_idx[3],
@ -397,4 +400,3 @@ void domoticz_saveSettings()
} }
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ

View File

@ -84,17 +84,17 @@ boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t da
// char log[LOGSZ]; // char log[LOGSZ];
if (!strcmp_P(type,PSTR("IRSEND"))) { if (!strcasecmp_P(type, PSTR(D_CMND_IRSEND))) {
if (data_len) { if (data_len) {
StaticJsonBuffer<128> jsonBuf; StaticJsonBuffer<128> jsonBuf;
JsonObject &ir_json = jsonBuf.parseObject(dataBufUc); JsonObject &ir_json = jsonBuf.parseObject(dataBufUc);
if (!ir_json.success()) { if (!ir_json.success()) {
snprintf_P(svalue, ssvalue, PSTR("{\"IRSend\":\"Invalid JSON\"}")); // JSON decode failed snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRSEND "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
} else { } else {
snprintf_P(svalue, ssvalue, PSTR("{\"IRSend\":\"Done\"}")); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRSEND "\":\"" D_DONE "\"}"));
protocol = ir_json["PROTOCOL"]; protocol = ir_json[D_IRSEND_PROTOCOL];
bits = ir_json["BITS"]; bits = ir_json[D_IRSEND_BITS];
data = ir_json["DATA"]; data = ir_json[D_IRSEND_DATA];
if (protocol && bits && data) { if (protocol && bits && data) {
if (!strcmp_P(protocol,PSTR("NEC"))) irsend->sendNEC(data, bits); if (!strcmp_P(protocol,PSTR("NEC"))) irsend->sendNEC(data, bits);
else if (!strcmp_P(protocol,PSTR("SONY"))) irsend->sendSony(data, bits); else if (!strcmp_P(protocol,PSTR("SONY"))) irsend->sendSony(data, bits);
@ -104,29 +104,29 @@ boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t da
else if (!strcmp_P(protocol,PSTR("JVC"))) irsend->sendJVC(data, bits, 1); else if (!strcmp_P(protocol,PSTR("JVC"))) irsend->sendJVC(data, bits, 1);
else if (!strcmp_P(protocol,PSTR("SAMSUNG"))) irsend->sendSAMSUNG(data, bits); else if (!strcmp_P(protocol,PSTR("SAMSUNG"))) irsend->sendSAMSUNG(data, bits);
else { else {
snprintf_P(svalue, ssvalue, PSTR("{\"IRSend\":\"Protocol not supported\"}")); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRSEND "\":\"" D_PROTOCOL_NOT_SUPPORTED "\"}"));
} }
} else error = true; } else error = true;
} }
} else error = true; } else error = true;
if (error) { if (error) {
snprintf_P(svalue, ssvalue, PSTR("{\"IRSend\":\"No protocol, bits or data\"}")); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRSEND "\":\"" D_NO D_IRSEND_PROTOCOL ", " D_IRSEND_BITS " " D_OR " " D_IRSEND_DATA "\"}"));
} }
} }
#ifdef USE_IR_HVAC #ifdef USE_IR_HVAC
else if (!strcmp_P(type,PSTR("IRHVAC"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_IRHVAC))) {
if (data_len) { if (data_len) {
StaticJsonBuffer<164> jsonBufer; StaticJsonBuffer<164> jsonBufer;
JsonObject &root = jsonBufer.parseObject(dataBufUc); JsonObject &root = jsonBufer.parseObject(dataBufUc);
if (!root.success()) { if (!root.success()) {
snprintf_P(svalue, ssvalue, PSTR("{\"IRHVAC\":\"Invalid JSON\"}")); // JSON decode failed snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRHVAC "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
} else { } else {
snprintf_P(svalue, ssvalue, PSTR("{\"IRHVAC\":\"Done\"}")); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRHVAC "\":\"" D_DONE "\"}"));
HVAC_Vendor = root["VENDOR"]; HVAC_Vendor = root[D_IRHVAC_VENDOR];
HVAC_Power = root["POWER"]; HVAC_Power = root[D_IRHVAC_POWER];
HVAC_Mode = root["MODE"]; HVAC_Mode = root[D_IRHVAC_MODE];
HVAC_FanMode = root["FANSPEED"]; HVAC_FanMode = root[D_IRHVAC_FANSPEED];
HVAC_Temp = root["TEMP"]; HVAC_Temp = root[D_IRHVAC_TEMP];
// snprintf_P(log, sizeof(log), PSTR("IRHVAC: Received Vendor %s, Power %d, Mode %s, FanSpeed %s, Temp %d"), // snprintf_P(log, sizeof(log), PSTR("IRHVAC: Received Vendor %s, Power %d, Mode %s, FanSpeed %s, Temp %d"),
// HVAC_Vendor, HVAC_Power, HVAC_Mode, HVAC_FanMode, HVAC_Temp); // HVAC_Vendor, HVAC_Power, HVAC_Mode, HVAC_FanMode, HVAC_Temp);
@ -142,7 +142,7 @@ boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t da
} }
} else error = true; } else error = true;
if (error) { if (error) {
snprintf_P(svalue, ssvalue, PSTR("{\"IRHVAC\":\"Wrong Vendor, Mode and/or FanSpeed\"}")); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRHVAC "\":\"" D_WRONG D_IRHVAC_VENDOR ", " D_IRHVAC_MODE " " D_OR " " D_IRHVAC_FANSPEED "\"}"));
} }
} }
#endif // USE_IR_HVAC #endif // USE_IR_HVAC

View File

@ -45,13 +45,13 @@ void sb_received()
for (i = 0; i < SerialInByteCounter; i++) { for (i = 0; i < SerialInByteCounter; i++) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%02X "), svalue, serialInBuf[i]); snprintf_P(svalue, sizeof(svalue), PSTR("%s%02X "), svalue, serialInBuf[i]);
} }
snprintf_P(log, sizeof(log), PSTR("BRDG: Received %s"), svalue); snprintf_P(log, sizeof(log), PSTR(D_LOG_BRIDGE D_RECEIVED " %s"), svalue);
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
if (0xA2 == serialInBuf[0]) { // Learn timeout if (0xA2 == serialInBuf[0]) { // Learn timeout
sfb_learnFlg = 0; sfb_learnFlg = 0;
snprintf_P(svalue, sizeof(svalue), PSTR("{\"RfKey%d\":\"Learn failed\"}"), sfb_learnKey); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sfb_learnKey);
mqtt_publish_topic_P(5, PSTR("RFKEY"), svalue); mqtt_publish_topic_P(5, PSTR(D_CMND_RFKEY), svalue);
} }
else if (0xA3 == serialInBuf[0]) { // Learned A3 20 F8 01 18 03 3E 2E 1A 22 55 else if (0xA3 == serialInBuf[0]) { // Learned A3 20 F8 01 18 03 3E 2E 1A 22 55
sfb_learnFlg = 0; sfb_learnFlg = 0;
@ -61,11 +61,11 @@ void sb_received()
for (i = 0; i < 9; i++) { for (i = 0; i < 9; i++) {
sysCfg.sfb_code[sfb_learnKey][i] = serialInBuf[i +1]; sysCfg.sfb_code[sfb_learnKey][i] = serialInBuf[i +1];
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"RfKey%d\":\"Learned\"}"), sfb_learnKey); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED "\"}"), sfb_learnKey);
} else { } else {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"RfKey%d\":\"Learn failed\"}"), sfb_learnKey); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sfb_learnKey);
} }
mqtt_publish_topic_P(5, PSTR("RFKEY"), svalue); mqtt_publish_topic_P(5, PSTR(D_CMND_RFKEY), svalue);
} }
else if (0xA4 == serialInBuf[0]) { // Received RF data A4 20 EE 01 18 03 3E 2E 1A 22 55 else if (0xA4 == serialInBuf[0]) { // Received RF data A4 20 EE 01 18 03 3E 2E 1A 22 55
rsy = serialInBuf[1] << 8 | serialInBuf[2]; // Sync time in uSec rsy = serialInBuf[1] << 8 | serialInBuf[2]; // Sync time in uSec
@ -77,7 +77,7 @@ void sb_received()
if (!((rid == sfb_lastrid) && (now - sfb_lasttime < SFB_TIME_AVOID_DUPLICATE))) { if (!((rid == sfb_lastrid) && (now - sfb_lasttime < SFB_TIME_AVOID_DUPLICATE))) {
sfb_lastrid = rid; sfb_lastrid = rid;
sfb_lasttime = now; sfb_lasttime = now;
strcpy_P(rfkey, PSTR("\"None\"")); strcpy_P(rfkey, PSTR("\"" D_NONE "\""));
for (i = 1; i <= 16; i++) { for (i = 1; i <= 16; i++) {
if (sysCfg.sfb_code[i][0]) { if (sysCfg.sfb_code[i][0]) {
sid = sysCfg.sfb_code[i][6] << 16 | sysCfg.sfb_code[i][7] << 8 | sysCfg.sfb_code[i][8]; sid = sysCfg.sfb_code[i][6] << 16 | sysCfg.sfb_code[i][7] << 8 | sysCfg.sfb_code[i][8];
@ -87,9 +87,9 @@ void sb_received()
} }
} }
} }
snprintf_P(svalue, sizeof(svalue), PSTR("{\"RfReceived\":{\"Sync\":%d, \"Low\":%d, \"High\":%d, \"Data\":\"%06X\", \"RfKey\":%s}}"), snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_RFRECEIVED "\":{\"" D_SYNC "\":%d, \"" D_LOW "\":%d, \"" D_HIGH "\":%d, \"" D_DATA "\":\"%06X\", \"" D_CMND_RFKEY "\":%s}}"),
rsy, rlo, rhi, rid, rfkey); rsy, rlo, rhi, rid, rfkey);
mqtt_publish_topic_P(6, PSTR("RFRECEIVED"), svalue); mqtt_publish_topic_P(6, PSTR(D_RFRECEIVED), svalue);
} }
} }
} }
@ -160,7 +160,7 @@ boolean sb_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len,
boolean serviced = true; boolean serviced = true;
char *p; char *p;
if (!strcmp_P(type, PSTR("RFDEFAULT"))) { if (!strcasecmp_P(type, PSTR(D_CMND_RFDEFAULT))) {
if (4 == data_len) { if (4 == data_len) {
uint16_t hexcode = strtol(dataBuf, &p, 16); uint16_t hexcode = strtol(dataBuf, &p, 16);
uint8_t msb = hexcode >> 8; uint8_t msb = hexcode >> 8;
@ -170,28 +170,28 @@ boolean sb_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len,
sysCfg.sfb_code[0][7] = lsb; sysCfg.sfb_code[0][7] = lsb;
} }
} }
snprintf_P(svalue, ssvalue, PSTR("{\"RfDefault\":\"%0X%0X\"}"), sysCfg.sfb_code[0][6], sysCfg.sfb_code[0][7]); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFDEFAULT "\":\"%0X%0X\"}"), sysCfg.sfb_code[0][6], sysCfg.sfb_code[0][7]);
} }
else if (!strcmp_P(type, PSTR("RFKEY")) && (index > 0) && (index <= 16)) { else if (!strcasecmp_P(type, PSTR(D_CMND_RFKEY)) && (index > 0) && (index <= 16)) {
if (!sfb_learnFlg) { if (!sfb_learnFlg) {
if (2 == payload) { if (2 == payload) {
sb_learn(index); sb_learn(index);
snprintf_P(svalue, ssvalue, PSTR("{\"RfKey%d\":\"Start learning\"}"), index); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_START_LEARNING "\"}"), index);
} }
else if (3 == payload) { else if (3 == payload) {
sysCfg.sfb_code[index][0] = 0; sysCfg.sfb_code[index][0] = 0;
snprintf_P(svalue, ssvalue, PSTR("{\"RfKey%d\":\"Set to default\"}"), index); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_SET_TO_DEFAULT "\"}"), index);
} else { } else {
if ((1 == payload) || (0 == sysCfg.sfb_code[index][0])) { if ((1 == payload) || (0 == sysCfg.sfb_code[index][0])) {
sb_send(0, index); sb_send(0, index);
snprintf_P(svalue, ssvalue, PSTR("{\"RfKey%d\":\"Default sent\"}"), index); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_DEFAULT_SENT "\"}"), index);
} else { } else {
sb_send(index, 0); sb_send(index, 0);
snprintf_P(svalue, ssvalue, PSTR("{\"RfKey%d\":\"Learned sent\"}"), index); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED_SENT "\"}"), index);
} }
} }
} else { } else {
snprintf_P(svalue, ssvalue, PSTR("{\"RfKey%d\":\"Learning active\"}"), sfb_learnKey); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNING_ACTIVE "\"}"), sfb_learnKey);
} }
} }
else { else {

View File

@ -272,10 +272,10 @@ void sl_prepPower(char *svalue, uint16_t ssvalue)
mqtt_publishDomoticzPowerState(1); mqtt_publishDomoticzPowerState(1);
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
if (sfl_flg > 1) { if (sfl_flg > 1) {
snprintf_P(svalue, ssvalue, PSTR("{\"POWER\":\"%s\", \"Dimmer\":%d, \"Color\":\"%s\"}"), snprintf_P(svalue, ssvalue, PSTR("{\"" D_RSLT_POWER "\":\"%s\", \"" D_CMND_DIMMER "\":%d, \"" D_CMND_COLOR "\":\"%s\"}"),
getStateText(power &1), sysCfg.led_dimmer[0], sl_getColor(scolor)); getStateText(power &1), sysCfg.led_dimmer[0], sl_getColor(scolor));
} else { } else {
snprintf_P(svalue, ssvalue, PSTR("{\"POWER\":\"%s\", \"Dimmer\":%d}"), snprintf_P(svalue, ssvalue, PSTR("{\"" D_RSLT_POWER "\":\"%s\", \"" D_CMND_DIMMER "\":%d}"),
getStateText(power &1), sysCfg.led_dimmer[0]); getStateText(power &1), sysCfg.led_dimmer[0]);
} }
} }
@ -339,8 +339,8 @@ void sl_animate()
sl_tcolor[i] = sl_dcolor[i]; sl_tcolor[i] = sl_dcolor[i];
} }
} else { } else {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Wakeup\":\"Done\"}")); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_DONE "\"}"));
mqtt_publish_topic_P(2, PSTR("WAKEUP"), svalue); mqtt_publish_topic_P(2, PSTR(D_CMND_WAKEUP), svalue);
sl_wakeupActive = 0; sl_wakeupActive = 0;
} }
} }
@ -429,9 +429,9 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct)
char stemp1[10]; char stemp1[10];
char stemp2[10]; char stemp2[10];
char stemp3[10]; char stemp3[10];
dtostrf(hue, 1, 3, stemp1); dtostrfi(hue, 3, stemp1);
dtostrf(sat, 1, 3, stemp2); dtostrfi(sat, 3, stemp2);
dtostrf(bri, 1, 3, stemp3); dtostrfi(bri, 3, stemp3);
snprintf_P(log, sizeof(log), PSTR("HUE: Set Hue %s, Sat %s, Bri %s, Ct %d"), stemp1, stemp2, stemp3, ct); snprintf_P(log, sizeof(log), PSTR("HUE: Set Hue %s, Sat %s, Bri %s, Ct %d"), stemp1, stemp2, stemp3, ct);
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
*/ */
@ -450,7 +450,7 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct)
sl_setColor(); sl_setColor();
} }
sl_prepPower(svalue, sizeof(svalue)); sl_prepPower(svalue, sizeof(svalue));
mqtt_publish_topic_P(5, "COLOR", svalue); mqtt_publish_topic_P(5, PSTR(D_CMND_COLOR), svalue);
} else { } else {
uint8_t tmp = (uint8_t)(bri * 100); uint8_t tmp = (uint8_t)(bri * 100);
sysCfg.led_dimmer[0] = tmp; sysCfg.led_dimmer[0] = tmp;
@ -459,10 +459,10 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct)
sl_setColorTemp(ct); sl_setColorTemp(ct);
} }
sl_prepPower(svalue, sizeof(svalue)); sl_prepPower(svalue, sizeof(svalue));
mqtt_publish_topic_P(5, "COLOR", svalue); mqtt_publish_topic_P(5, PSTR(D_CMND_COLOR), svalue);
} else { } else {
sl_prepPower(svalue, sizeof(svalue)); sl_prepPower(svalue, sizeof(svalue));
mqtt_publish_topic_P(5, "DIMMER", svalue); mqtt_publish_topic_P(5, PSTR(D_CMND_DIMMER), svalue);
} }
} }
} }
@ -478,7 +478,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
char scolor[11]; char scolor[11];
char *p; char *p;
if ((sfl_flg > 1) && !strcmp_P(type,PSTR("COLOR"))) { if ((sfl_flg > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR))) {
if ((2 * sfl_flg) == data_len) { if ((2 * sfl_flg) == data_len) {
for (byte i = 0; i < sfl_flg; i++) { for (byte i = 0; i < sfl_flg; i++) {
strlcpy(scolor, dataBufUc + (i *2), 3); strlcpy(scolor, dataBufUc + (i *2), 3);
@ -487,26 +487,26 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
sl_setColor(); sl_setColor();
coldim = true; coldim = true;
} else { } else {
snprintf_P(svalue, ssvalue, PSTR("{\"Color\":\"%s\"}"), sl_getColor(scolor)); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_COLOR "\":\"%s\"}"), sl_getColor(scolor));
} }
} }
else if (!strcmp_P(type,PSTR("CT")) && ((2 == sfl_flg) || (5 == sfl_flg))) { // ColorTemp else if (!strcasecmp_P(type, PSTR(D_CMND_COLORTEMPERATURE)) && ((2 == sfl_flg) || (5 == sfl_flg))) { // ColorTemp
if ((payload >= 153) && (payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts if ((payload >= 153) && (payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts
sl_setColorTemp(payload); sl_setColorTemp(payload);
coldim = true; coldim = true;
} else { } else {
snprintf_P(svalue, ssvalue, PSTR("{\"CT\":%d}"), sl_getColorTemp()); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_COLORTEMPERATURE "\":%d}"), sl_getColorTemp());
} }
} }
else if (!strcmp_P(type,PSTR("DIMMER"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_DIMMER))) {
if ((payload >= 0) && (payload <= 100)) { if ((payload >= 0) && (payload <= 100)) {
sysCfg.led_dimmer[0] = payload; sysCfg.led_dimmer[0] = payload;
coldim = true; coldim = true;
} else { } else {
snprintf_P(svalue, ssvalue, PSTR("{\"Dimmer\":%d}"), sysCfg.led_dimmer[0]); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DIMMER "\":%d}"), sysCfg.led_dimmer[0]);
} }
} }
else if (!strcmp_P(type,PSTR("LEDTABLE"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_LEDTABLE))) {
if ((payload >= 0) && (payload <= 2)) { if ((payload >= 0) && (payload <= 2)) {
switch (payload) { switch (payload) {
case 0: // Off case 0: // Off
@ -519,9 +519,9 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
} }
sl_any = 1; sl_any = 1;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"LedTable\":\"%s\"}"), getStateText(sysCfg.led_table)); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_LEDTABLE "\":\"%s\"}"), getStateText(sysCfg.led_table));
} }
else if (!strcmp_P(type,PSTR("FADE"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_FADE))) {
switch (payload) { switch (payload) {
case 0: // Off case 0: // Off
case 1: // On case 1: // On
@ -531,25 +531,25 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
sysCfg.led_fade ^= 1; sysCfg.led_fade ^= 1;
break; break;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Fade\":\"%s\"}"), getStateText(sysCfg.led_fade)); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_FADE "\":\"%s\"}"), getStateText(sysCfg.led_fade));
} }
else if (!strcmp_P(type,PSTR("SPEED"))) { // 1 - fast, 8 - slow else if (!strcasecmp_P(type, PSTR(D_CMND_SPEED))) { // 1 - fast, 8 - slow
if ((payload > 0) && (payload <= 8)) { if ((payload > 0) && (payload <= 8)) {
sysCfg.led_speed = payload; sysCfg.led_speed = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Speed\":%d}"), sysCfg.led_speed); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SPEED "\":%d}"), sysCfg.led_speed);
} }
else if (!strcmp_P(type,PSTR("WAKEUPDURATION"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUPDURATION))) {
if ((payload > 0) && (payload < 3001)) { if ((payload > 0) && (payload < 3001)) {
sysCfg.led_wakeup = payload; sysCfg.led_wakeup = payload;
sl_wakeupActive = 0; sl_wakeupActive = 0;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"WakeUpDuration\":%d}"), sysCfg.led_wakeup); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_WAKEUPDURATION "\":%d}"), sysCfg.led_wakeup);
} }
else if (!strcmp_P(type,PSTR("WAKEUP"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUP))) {
sl_wakeupActive = 3; sl_wakeupActive = 3;
do_cmnd_power(1, 1); do_cmnd_power(1, 1);
snprintf_P(svalue, ssvalue, PSTR("{\"Wakeup\":\"Started\"}")); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_WAKEUP "\":\"" D_STARTED "\"}"));
} }
else { else {
serviced = false; // Unknown command serviced = false; // Unknown command

View File

@ -106,11 +106,10 @@ void sc_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
char stemp2[10]; char stemp2[10];
float t = convertTemp(sc_value[1]); float t = convertTemp(sc_value[1]);
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp1); dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
float h = sc_value[0]; float h = sc_value[0];
dtostrf(h, 1, sysCfg.flag.humidity_resolution, stemp2); dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
// snprintf_P(svalue, ssvalue, PSTR("%s, \"SC\":{\"Temperature\":%s, \"Humidity\":%s, \"Light\":%d, \"Noise\":%d, \"AirQuality\":%d}"), snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_LIGHT "\":%d, \"" D_NOISE "\":%d, \"" D_AIRQUALITY "\":%d"),
snprintf_P(svalue, ssvalue, PSTR("%s, \"Temperature\":%s, \"Humidity\":%s, \"Light\":%d, \"Noise\":%d, \"AirQuality\":%d"),
svalue, stemp1, stemp2, sc_value[2], sc_value[3], sc_value[4]); svalue, stemp1, stemp2, sc_value[2], sc_value[3], sc_value[4]);
*djson = 1; *djson = 1;
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
@ -131,11 +130,11 @@ String sc_webPresent()
char scstype[] = ""; char scstype[] = "";
float t = convertTemp(sc_value[1]); float t = convertTemp(sc_value[1]);
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp); dtostrfi(t, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, scstype, stemp, tempUnit()); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, scstype, stemp, tempUnit());
page += sensor; page += sensor;
float h = sc_value[0]; float h = sc_value[0];
dtostrf(h, 1, sysCfg.flag.humidity_resolution, stemp); dtostrfi(h, sysCfg.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, scstype, stemp); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, scstype, stemp);
page += sensor; page += sensor;
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_LIGHT, scstype, sc_value[2]); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_LIGHT, scstype, sc_value[2]);

View File

@ -76,11 +76,11 @@ void wemo_respondToMSearch()
response.replace("{r2}", wemo_UUID()); response.replace("{r2}", wemo_UUID());
portUDP.write(response.c_str()); portUDP.write(response.c_str());
portUDP.endPacket(); portUDP.endPacket();
snprintf_P(message, sizeof(message), PSTR("Response sent")); snprintf_P(message, sizeof(message), PSTR(D_RESPONSE_SENT));
} else { } else {
snprintf_P(message, sizeof(message), PSTR("Failed to send response")); snprintf_P(message, sizeof(message), PSTR(D_FAILED_TO_SEND_RESPONSE));
} }
snprintf_P(log, sizeof(log), PSTR("UPnP: Wemo %s to %s:%d"), snprintf_P(log, sizeof(log), PSTR(D_LOG_UPNP D_WEMO " %s " D_TO " %s:%d"),
message, portUDP.remoteIP().toString().c_str(), portUDP.remotePort()); message, portUDP.remoteIP().toString().c_str(), portUDP.remotePort());
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
} }
@ -171,11 +171,11 @@ void hue_respondToMSearch()
//addLog(LOG_LEVEL_DEBUG_MORE, response.c_str()); //addLog(LOG_LEVEL_DEBUG_MORE, response.c_str());
snprintf_P(message, sizeof(message), PSTR("3 response packets sent")); snprintf_P(message, sizeof(message), PSTR(D_3_RESPONSE_PACKETS_SENT));
} else { } else {
snprintf_P(message, sizeof(message), PSTR("Failed to send response")); snprintf_P(message, sizeof(message), PSTR(D_FAILED_TO_SEND_RESPONSE));
} }
snprintf_P(log, sizeof(log), PSTR("UPnP: HUE %s to %s:%d"), snprintf_P(log, sizeof(log), PSTR(D_LOG_UPNP D_HUE " %s " D_TO " %s:%d"),
message, portUDP.remoteIP().toString().c_str(), portUDP.remotePort()); message, portUDP.remoteIP().toString().c_str(), portUDP.remotePort());
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
} }
@ -188,7 +188,7 @@ boolean UDP_Disconnect()
{ {
if (udpConnected) { if (udpConnected) {
WiFiUDP::stopAll(); WiFiUDP::stopAll();
addLog_P(LOG_LEVEL_DEBUG, PSTR("UPnP: Multicast disabled")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP D_MULTICAST_DISABLED));
udpConnected = false; udpConnected = false;
} }
return udpConnected; return udpConnected;
@ -198,10 +198,10 @@ boolean UDP_Connect()
{ {
if (!udpConnected) { if (!udpConnected) {
if (portUDP.beginMulticast(WiFi.localIP(), ipMulticast, portMulticast)) { if (portUDP.beginMulticast(WiFi.localIP(), ipMulticast, portMulticast)) {
addLog_P(LOG_LEVEL_INFO, PSTR("UPnP: Multicast (re)joined")); addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPNP D_MULTICAST_REJOINED));
udpConnected = true; udpConnected = true;
} else { } else {
addLog_P(LOG_LEVEL_INFO, PSTR("UPnP: Multicast join failed")); addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_UPNP D_MULTICAST_JOIN_FAILED));
udpConnected = false; udpConnected = false;
} }
} }
@ -305,8 +305,7 @@ const char WEMO_SETUP_XML[] PROGMEM =
void handleUPnPevent() void handleUPnPevent()
{ {
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: WeMo basic event")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_BASIC_EVENT));
String request = webServer->arg(0); String request = webServer->arg(0);
if (request.indexOf(F("State>1</Binary")) > 0) { if (request.indexOf(F("State>1</Binary")) > 0) {
// do_cmnd_power(1, 1); // do_cmnd_power(1, 1);
@ -321,14 +320,13 @@ void handleUPnPevent()
void handleUPnPservice() void handleUPnPservice()
{ {
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: WeMo event service")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_EVENT_SERVICE));
webServer->send(200, FPSTR(HDR_CTYPE_PLAIN), FPSTR(WEMO_EVENTSERVICE_XML)); webServer->send(200, FPSTR(HDR_CTYPE_PLAIN), FPSTR(WEMO_EVENTSERVICE_XML));
} }
void handleUPnPsetupWemo() void handleUPnPsetupWemo()
{ {
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: WeMo setup")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_SETUP));
String setup_xml = FPSTR(WEMO_SETUP_XML); String setup_xml = FPSTR(WEMO_SETUP_XML);
setup_xml.replace("{x1}", sysCfg.friendlyname[0]); setup_xml.replace("{x1}", sysCfg.friendlyname[0]);
@ -432,8 +430,7 @@ String hue_userId()
void handleUPnPsetupHue() void handleUPnPsetupHue()
{ {
addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Hue Bridge setup")); addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_HUE_BRIDGE_SETUP));
String description_xml = FPSTR(HUE_DESCRIPTION_XML); String description_xml = FPSTR(HUE_DESCRIPTION_XML);
description_xml.replace("{x1}", WiFi.localIP().toString()); description_xml.replace("{x1}", WiFi.localIP().toString());
description_xml.replace("{x2}", hue_UUID()); description_xml.replace("{x2}", hue_UUID());
@ -445,7 +442,7 @@ void hue_todo(String *path)
{ {
char log[LOGSZ]; char log[LOGSZ];
snprintf_P(log, sizeof(log), PSTR("HTTP: HUE API not implemented (%s)"),path->c_str()); snprintf_P(log, sizeof(log), PSTR(D_LOG_HTTP D_HUE_API_NOT_IMPLEMENTED " (%s)"), path->c_str());
addLog(LOG_LEVEL_DEBUG_MORE, log); addLog(LOG_LEVEL_DEBUG_MORE, log);
webServer->send(200, FPSTR(HDR_CTYPE_JSON), "{}"); webServer->send(200, FPSTR(HDR_CTYPE_JSON), "{}");
@ -726,11 +723,11 @@ void handle_hue_api(String *path)
path->remove(0, 4); // remove /api path->remove(0, 4); // remove /api
uint16_t apilen = path->length(); uint16_t apilen = path->length();
snprintf_P(log, sizeof(log), PSTR("HTTP: Hue API (%s)"), path->c_str()); snprintf_P(log, sizeof(log), PSTR(D_LOG_HTTP D_HUE_API " (%s)"), path->c_str());
addLog(LOG_LEVEL_DEBUG_MORE, log); addLog(LOG_LEVEL_DEBUG_MORE, log);
for (args = 0; args < webServer->args(); args++) { for (args = 0; args < webServer->args(); args++) {
String json = webServer->arg(args); String json = webServer->arg(args);
snprintf_P(log, sizeof(log), PSTR("HTTP: Hue POST args (%s)"), json.c_str()); snprintf_P(log, sizeof(log), PSTR(D_LOG_HTTP D_HUE_POST_ARGS " (%s)"), json.c_str());
addLog(LOG_LEVEL_DEBUG_MORE, log); addLog(LOG_LEVEL_DEBUG_MORE, log);
} }

View File

@ -152,11 +152,11 @@ void ws2812_getColor(uint16_t led, char* svalue, uint16_t ssvalue)
if (led) { if (led) {
mcolor = strip->GetPixelColor(led -1); mcolor = strip->GetPixelColor(led -1);
snprintf_P(stemp, sizeof(stemp), PSTR("Led%d"), led); snprintf_P(stemp, sizeof(stemp), PSTR(D_CMND_LED "%d"), led);
} else { } else {
ws2812_setDim(sysCfg.ws_dimmer); ws2812_setDim(sysCfg.ws_dimmer);
mcolor = dcolor; mcolor = dcolor;
snprintf_P(stemp, sizeof(stemp), PSTR("Color")); snprintf_P(stemp, sizeof(stemp), PSTR(D_CMND_COLOR));
} }
uint32_t color = (uint32_t)mcolor.R << 16; uint32_t color = (uint32_t)mcolor.R << 16;
color += (uint32_t)mcolor.G << 8; color += (uint32_t)mcolor.G << 8;
@ -516,27 +516,27 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
{ {
boolean serviced = true; boolean serviced = true;
if (!strcmp_P(type,PSTR("PIXELS"))) { if (!strcasecmp_P(type, PSTR(D_CMND_PIXELS))) {
if ((payload > 0) && (payload <= WS2812_MAX_LEDS)) { if ((payload > 0) && (payload <= WS2812_MAX_LEDS)) {
sysCfg.ws_pixels = payload; sysCfg.ws_pixels = payload;
ws2812_pixels(); ws2812_pixels();
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Pixels\":%d}"), sysCfg.ws_pixels); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_PIXELS "\":%d}"), sysCfg.ws_pixels);
} }
else if (!strcmp_P(type,PSTR("LED")) && (index > 0) && (index <= sysCfg.ws_pixels)) { else if (!strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= sysCfg.ws_pixels)) {
if (6 == data_len) { if (6 == data_len) {
ws2812_setColor(index, dataBuf); ws2812_setColor(index, dataBuf);
} }
ws2812_getColor(index, svalue, ssvalue); ws2812_getColor(index, svalue, ssvalue);
} }
else if (!strcmp_P(type,PSTR("COLOR"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_COLOR))) {
if (6 == data_len) { if (6 == data_len) {
ws2812_setColor(0, dataBuf); ws2812_setColor(0, dataBuf);
bitSet(power, ws_bit); bitSet(power, ws_bit);
} }
ws2812_getColor(0, svalue, ssvalue); ws2812_getColor(0, svalue, ssvalue);
} }
else if (!strcmp_P(type,PSTR("DIMMER"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_DIMMER))) {
if ((payload >= 0) && (payload <= 100)) { if ((payload >= 0) && (payload <= 100)) {
sysCfg.ws_dimmer = payload; sysCfg.ws_dimmer = payload;
bitSet(power, ws_bit); bitSet(power, ws_bit);
@ -545,9 +545,9 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
mqtt_publishDomoticzPowerState(ws_bit +1); mqtt_publishDomoticzPowerState(ws_bit +1);
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Dimmer\":%d}"), sysCfg.ws_dimmer); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DIMMER "\":%d}"), sysCfg.ws_dimmer);
} }
else if (!strcmp_P(type,PSTR("LEDTABLE"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_LEDTABLE))) {
if ((payload >= 0) && (payload <= 2)) { if ((payload >= 0) && (payload <= 2)) {
switch (payload) { switch (payload) {
case 0: // Off case 0: // Off
@ -560,9 +560,9 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
} }
ws2812_update(); ws2812_update();
} }
snprintf_P(svalue, ssvalue, PSTR("{\"LedTable\":\"%s\"}"), getStateText(sysCfg.ws_ledtable)); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_LEDTABLE "\":\"%s\"}"), getStateText(sysCfg.ws_ledtable));
} }
else if (!strcmp_P(type,PSTR("FADE"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_FADE))) {
switch (payload) { switch (payload) {
case 0: // Off case 0: // Off
case 1: // On case 1: // On
@ -572,30 +572,30 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
sysCfg.ws_fade ^= 1; sysCfg.ws_fade ^= 1;
break; break;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Fade\":\"%s\"}"), getStateText(sysCfg.ws_fade)); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_FADE "\":\"%s\"}"), getStateText(sysCfg.ws_fade));
} }
else if (!strcmp_P(type,PSTR("SPEED"))) { // 1 - fast, 5 - slow else if (!strcasecmp_P(type, PSTR(D_CMND_SPEED))) { // 1 - fast, 5 - slow
if ((payload > 0) && (payload <= 5)) { if ((payload > 0) && (payload <= 5)) {
sysCfg.ws_speed = payload; sysCfg.ws_speed = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Speed\":%d}"), sysCfg.ws_speed); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SPEED "\":%d}"), sysCfg.ws_speed);
} }
else if (!strcmp_P(type,PSTR("WIDTH"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_WIDTH))) {
if ((payload >= 0) && (payload <= 4)) { if ((payload >= 0) && (payload <= 4)) {
sysCfg.ws_width = payload; sysCfg.ws_width = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Width\":%d}"), sysCfg.ws_width); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_WIDTH "\":%d}"), sysCfg.ws_width);
} }
else if (!strcmp_P(type,PSTR("WAKEUP"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUP))) {
if ((payload > 0) && (payload < 3001)) { if ((payload > 0) && (payload < 3001)) {
sysCfg.ws_wakeup = payload; sysCfg.ws_wakeup = payload;
if (1 == sysCfg.ws_scheme) { if (1 == sysCfg.ws_scheme) {
sysCfg.ws_scheme = 0; sysCfg.ws_scheme = 0;
} }
} }
snprintf_P(svalue, ssvalue, PSTR("{\"WakeUp\":%d}"), sysCfg.ws_wakeup); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_WAKEUP "\":%d}"), sysCfg.ws_wakeup);
} }
else if (!strcmp_P(type,PSTR("SCHEME"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_SCHEME))) {
if ((payload >= 0) && (payload <= 9)) { if ((payload >= 0) && (payload <= 9)) {
sysCfg.ws_scheme = payload; sysCfg.ws_scheme = payload;
if (1 == sysCfg.ws_scheme) { if (1 == sysCfg.ws_scheme) {
@ -604,7 +604,7 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
bitSet(power, ws_bit); bitSet(power, ws_bit);
ws2812_resetStripTimer(); ws2812_resetStripTimer();
} }
snprintf_P(svalue, ssvalue, PSTR("{\"Scheme\":%d}"), sysCfg.ws_scheme); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SCHEME "\":%d}"), sysCfg.ws_scheme);
} }
else if (!strcmp_P(type,PSTR("UNDOCA"))) { // Theos WS2812 legacy status else if (!strcmp_P(type,PSTR("UNDOCA"))) { // Theos WS2812 legacy status
RgbColor mcolor; RgbColor mcolor;

View File

@ -67,7 +67,7 @@ boolean bh1750_detect()
strcpy(bh1750stype, "BH1750"); strcpy(bh1750stype, "BH1750");
} }
if (success) { if (success) {
snprintf_P(log, sizeof(log), PSTR("I2C: %s found at address 0x%x"), bh1750stype, bh1750addr); snprintf_P(log, sizeof(log), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bh1750stype, bh1750addr);
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
} else { } else {
bh1750type = 0; bh1750type = 0;
@ -86,7 +86,7 @@ void bh1750_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
} }
uint16_t l = bh1750_readLux(); uint16_t l = bh1750_readLux();
snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"Illuminance\":%d}"), svalue, bh1750stype, l); snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"" D_ILLUMINANCE "\":%d}"), svalue, bh1750stype, l);
*djson = 1; *djson = 1;
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
domoticz_sensor5(l); domoticz_sensor5(l);
@ -95,7 +95,7 @@ void bh1750_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
const char HTTP_SNS_ILLUMINANCE[] PROGMEM = const char HTTP_SNS_ILLUMINANCE[] PROGMEM =
"<tr><th>BH1750 Illuminance</th><td>%d lx</td></tr>"; "<tr><th>BH1750 " D_ILLUMINANCE "</th><td>%d lx</td></tr>";
String bh1750_webPresent() String bh1750_webPresent()
{ {

View File

@ -418,7 +418,7 @@ boolean bmp_detect()
strcpy_P(bmpstype, PSTR("BME280")); strcpy_P(bmpstype, PSTR("BME280"));
} }
if (success) { if (success) {
snprintf_P(log, sizeof(log), PSTR("I2C: %s found at address 0x%x"), bmpstype, bmpaddr); snprintf_P(log, sizeof(log), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bmpstype, bmpaddr);
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
} else { } else {
bmptype = 0; bmptype = 0;
@ -443,14 +443,14 @@ void bmp_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
double t = bmp_readTemperature(); double t = bmp_readTemperature();
double p = bmp_readPressure(); double p = bmp_readPressure();
double h = bmp_readHumidity(); double h = bmp_readHumidity();
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp1); dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
dtostrf(p, 1, sysCfg.flag.pressure_resolution, stemp2); dtostrfd(p, sysCfg.flag.pressure_resolution, stemp2);
dtostrf(h, 1, sysCfg.flag.humidity_resolution, stemp3); dtostrfd(h, sysCfg.flag.humidity_resolution, stemp3);
if (!strcmp(bmpstype,"BME280")) { if (!strcmp(bmpstype,"BME280")) {
snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"Temperature\":%s, \"Humidity\":%s, \"Pressure\":%s}"), snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_PRESSURE "\":%s}"),
svalue, bmpstype, stemp1, stemp3, stemp2); svalue, bmpstype, stemp1, stemp3, stemp2);
} else { } else {
snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"Temperature\":%s, \"Pressure\":%s}"), snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_PRESSURE "\":%s}"),
svalue, bmpstype, stemp1, stemp2); svalue, bmpstype, stemp1, stemp2);
} }
*djson = 1; *djson = 1;
@ -470,15 +470,15 @@ String bmp_webPresent()
double t_bmp = bmp_readTemperature(); double t_bmp = bmp_readTemperature();
double p_bmp = bmp_readPressure(); double p_bmp = bmp_readPressure();
double h_bmp = bmp_readHumidity(); double h_bmp = bmp_readHumidity();
dtostrf(t_bmp, 1, sysCfg.flag.temperature_resolution, stemp); dtostrfi(t_bmp, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, bmpstype, stemp, tempUnit()); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, bmpstype, stemp, tempUnit());
page += sensor; page += sensor;
if (!strcmp(bmpstype,"BME280")) { if (!strcmp(bmpstype,"BME280")) {
dtostrf(h_bmp, 1, sysCfg.flag.humidity_resolution, stemp); dtostrfi(h_bmp, sysCfg.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, bmpstype, stemp); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, bmpstype, stemp);
page += sensor; page += sensor;
} }
dtostrf(p_bmp, 1, sysCfg.flag.pressure_resolution, stemp); dtostrfi(p_bmp, sysCfg.flag.pressure_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_PRESSURE, bmpstype, stemp); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_PRESSURE, bmpstype, stemp);
page += sensor; page += sensor;
} }

View File

@ -95,12 +95,12 @@ void counter_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
for (byte i = 0; i < MAX_COUNTERS; i++) { for (byte i = 0; i < MAX_COUNTERS; i++) {
if (pin[GPIO_CNTR1 +i] < 99) { if (pin[GPIO_CNTR1 +i] < 99) {
if (bitRead(sysCfg.pCounterType, i)) { if (bitRead(sysCfg.pCounterType, i)) {
dtostrf((double)rtcMem.pCounter[i] / 1000, 1, 3, stemp); dtostrfd((double)rtcMem.pCounter[i] / 1000, 3, stemp);
} else { } else {
dsxflg++; dsxflg++;
dtostrf(rtcMem.pCounter[i], 1, 0, stemp); dtostrfd(rtcMem.pCounter[i], 0, stemp);
} }
snprintf_P(svalue, ssvalue, PSTR("%s, \"Counter%d\":%s"), svalue, i +1, stemp); snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_COUNTER "%d\":%s"), svalue, i +1, stemp);
*djson = 1; *djson = 1;
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
if (1 == dsxflg) { if (1 == dsxflg) {
@ -114,7 +114,7 @@ void counter_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
const char HTTP_SNS_COUNTER[] PROGMEM = const char HTTP_SNS_COUNTER[] PROGMEM =
"<tr><th>Counter%d</th><td>%s%s</td></tr>"; "<tr><th>" D_COUNTER "%d</th><td>%s%s</td></tr>";
String counter_webPresent() String counter_webPresent()
{ {
@ -125,11 +125,11 @@ String counter_webPresent()
for (byte i = 0; i < MAX_COUNTERS; i++) { for (byte i = 0; i < MAX_COUNTERS; i++) {
if (pin[GPIO_CNTR1 +i] < 99) { if (pin[GPIO_CNTR1 +i] < 99) {
if (bitRead(sysCfg.pCounterType, i)) { if (bitRead(sysCfg.pCounterType, i)) {
dtostrf((double)rtcMem.pCounter[i] / 1000, 1, 3, stemp); dtostrfi((double)rtcMem.pCounter[i] / 1000, 3, stemp);
} else { } else {
dtostrf(rtcMem.pCounter[i], 1, 0, stemp); dtostrfi(rtcMem.pCounter[i], 0, stemp);
} }
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_COUNTER, i+1, stemp, (bitRead(sysCfg.pCounterType, i)) ? " Sec" : ""); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_COUNTER, i+1, stemp, (bitRead(sysCfg.pCounterType, i)) ? " " D_UNIT_SECOND : "");
page += sensor; page += sensor;
} }
} }

View File

@ -88,12 +88,12 @@ boolean dht_read(byte sensor)
pinMode(dht[sensor].pin, INPUT_PULLUP); pinMode(dht[sensor].pin, INPUT_PULLUP);
delayMicroseconds(10); delayMicroseconds(10);
if (0 == dht_expectPulse(sensor, LOW)) { if (0 == dht_expectPulse(sensor, LOW)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR("DHT: Timeout waiting for start signal low pulse")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_LOW " " D_PULSE));
dht[sensor].lastresult = false; dht[sensor].lastresult = false;
return dht[sensor].lastresult; return dht[sensor].lastresult;
} }
if (0 == dht_expectPulse(sensor, HIGH)) { if (0 == dht_expectPulse(sensor, HIGH)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR("DHT: Timeout waiting for start signal high pulse")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_HIGH " " D_PULSE));
dht[sensor].lastresult = false; dht[sensor].lastresult = false;
return dht[sensor].lastresult; return dht[sensor].lastresult;
} }
@ -107,7 +107,7 @@ boolean dht_read(byte sensor)
uint32_t lowCycles = cycles[2*i]; uint32_t lowCycles = cycles[2*i];
uint32_t highCycles = cycles[2*i+1]; uint32_t highCycles = cycles[2*i+1];
if ((0 == lowCycles) || (0 == highCycles)) { if ((0 == lowCycles) || (0 == highCycles)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR("DHT: Timeout waiting for pulse")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_PULSE));
dht[sensor].lastresult = false; dht[sensor].lastresult = false;
return dht[sensor].lastresult; return dht[sensor].lastresult;
} }
@ -117,14 +117,14 @@ boolean dht_read(byte sensor)
} }
} }
snprintf_P(log, sizeof(log), PSTR("DHT: Received %02X, %02X, %02X, %02X, %02X =? %02X"), snprintf_P(log, sizeof(log), PSTR(D_LOG_DHT D_RECEIVED " %02X, %02X, %02X, %02X, %02X =? %02X"),
dht_data[0], dht_data[1], dht_data[2], dht_data[3], dht_data[4], (dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF); dht_data[0], dht_data[1], dht_data[2], dht_data[3], dht_data[4], (dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF);
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
if (dht_data[4] == ((dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF)) { if (dht_data[4] == ((dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF)) {
dht[sensor].lastresult = true; dht[sensor].lastresult = true;
} else { } else {
addLog_P(LOG_LEVEL_DEBUG, PSTR("DHT: Checksum failure")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_CHECKSUM_FAILURE));
dht[sensor].lastresult = false; dht[sensor].lastresult = false;
} }
return dht[sensor].lastresult; return dht[sensor].lastresult;
@ -208,9 +208,6 @@ void dht_init()
snprintf_P(dht[i].stype, sizeof(dht[i].stype), PSTR("%s-%02d"), dht[i].stype, dht[i].pin); snprintf_P(dht[i].stype, sizeof(dht[i].stype), PSTR("%s-%02d"), dht[i].stype, dht[i].pin);
} }
} }
snprintf_P(log, sizeof(log), PSTR("DHT: Max clock cycles %d"), dht_maxcycles);
addLog(LOG_LEVEL_DEBUG, log);
} }
/*********************************************************************************************\ /*********************************************************************************************\
@ -227,10 +224,8 @@ void dht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
byte dsxflg = 0; byte dsxflg = 0;
for (byte i = 0; i < dht_sensors; i++) { for (byte i = 0; i < dht_sensors; i++) {
if (dht_readTempHum(i, t, h)) { // Read temperature if (dht_readTempHum(i, t, h)) { // Read temperature
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp1); dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
dtostrf(h, 1, sysCfg.flag.humidity_resolution, stemp2); dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
// snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"Temperature\":%s, \"Humidity\":%s}"),
// svalue, dhtstype, stemp1, stemp2);
snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, dht[i].stype, stemp1, stemp2); snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, dht[i].stype, stemp1, stemp2);
*djson = 1; *djson = 1;
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
@ -254,10 +249,10 @@ String dht_webPresent()
for (byte i = 0; i < dht_sensors; i++) { for (byte i = 0; i < dht_sensors; i++) {
if (dht_readTempHum(i, t, h)) { if (dht_readTempHum(i, t, h)) {
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp); dtostrfi(t, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, dht[i].stype, stemp, tempUnit()); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, dht[i].stype, stemp, tempUnit());
page += sensor; page += sensor;
dtostrf(h, 1, sysCfg.flag.humidity_resolution, stemp); dtostrfi(h, sysCfg.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, dht[i].stype, stemp); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, dht[i].stype, stemp);
page += sensor; page += sensor;
} }

View File

@ -135,7 +135,7 @@ boolean dsb_readTemp(float &t)
} }
if (!dsb_read_bit()) { //check measurement end if (!dsb_read_bit()) { //check measurement end
addLog_P(LOG_LEVEL_DEBUG, PSTR("DSB: Sensor busy")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_BUSY));
return !isnan(t); return !isnan(t);
} }
/* /*
@ -160,7 +160,7 @@ boolean dsb_readTemp(float &t)
crc = dsb_crc(dsb_read(), crc); crc = dsb_crc(dsb_read(), crc);
dsb_reset(); dsb_reset();
if (crc) { //check crc if (crc) { //check crc
addLog_P(LOG_LEVEL_DEBUG, PSTR("DSB: Sensor CRC error")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_CRC_ERROR));
} else { } else {
DSTemp = (msb << 8) + lsb; DSTemp = (msb << 8) + lsb;
if (DSTemp > 2047) { if (DSTemp > 2047) {
@ -183,8 +183,8 @@ void dsb_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
float t; float t;
if (dsb_readTemp(t)) { // Check if read failed if (dsb_readTemp(t)) { // Check if read failed
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp1); dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
snprintf_P(svalue, ssvalue, PSTR("%s, \"DS18B20\":{\"Temperature\":%s}"), svalue, stemp1); snprintf_P(svalue, ssvalue, PSTR("%s, \"DS18B20\":{\"" D_TEMPERATURE "\":%s}"), svalue, stemp1);
*djson = 1; *djson = 1;
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
domoticz_sensor1(stemp1); domoticz_sensor1(stemp1);
@ -203,7 +203,7 @@ String dsb_webPresent()
char stemp[10]; char stemp[10];
char sensor[80]; char sensor[80];
dtostrf(st, 1, sysCfg.flag.temperature_resolution, stemp); dtostrfi(st, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "DS18B20", stemp, tempUnit()); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "DS18B20", stemp, tempUnit());
page += sensor; page += sensor;
} }

View File

@ -190,14 +190,14 @@ void ds18x20_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
for (byte i = 0; i < ds18x20_sensors(); i++) { for (byte i = 0; i < ds18x20_sensors(); i++) {
if (ds18x20_read(i, t)) { // Check if read failed if (ds18x20_read(i, t)) { // Check if read failed
ds18x20_type(i); ds18x20_type(i);
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp2); dtostrfd(t, sysCfg.flag.temperature_resolution, stemp2);
if (!dsxflg) { if (!dsxflg) {
snprintf_P(svalue, ssvalue, PSTR("%s, \"DS18x20\":{"), svalue); snprintf_P(svalue, ssvalue, PSTR("%s, \"DS18x20\":{"), svalue);
*djson = 1; *djson = 1;
stemp1[0] = '\0'; stemp1[0] = '\0';
} }
dsxflg++; dsxflg++;
snprintf_P(svalue, ssvalue, PSTR("%s%s\"DS%d\":{\"Type\":\"%s\", \"Address\":\"%s\", \"Temperature\":%s}"), snprintf_P(svalue, ssvalue, PSTR("%s%s\"DS%d\":{\"" D_TYPE "\":\"%s\", \"" D_ADDRESS "\":\"%s\", \"" D_TEMPERATURE "\":%s}"),
svalue, stemp1, i +1, dsbstype, ds18x20_address(i).c_str(), stemp2); svalue, stemp1, i +1, dsbstype, ds18x20_address(i).c_str(), stemp2);
strcpy(stemp1, ", "); strcpy(stemp1, ", ");
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
@ -222,7 +222,7 @@ String ds18x20_webPresent()
for (byte i = 0; i < ds18x20_sensors(); i++) { for (byte i = 0; i < ds18x20_sensors(); i++) {
if (ds18x20_read(i, t)) { // Check if read failed if (ds18x20_read(i, t)) { // Check if read failed
ds18x20_type(i); ds18x20_type(i);
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp); dtostrfi(t, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(stemp2, sizeof(stemp2), PSTR("%s-%d"), dsbstype, i +1); snprintf_P(stemp2, sizeof(stemp2), PSTR("%s-%d"), dsbstype, i +1);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, stemp2, stemp, tempUnit()); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, stemp2, stemp, tempUnit());
page += sensor; page += sensor;

View File

@ -345,32 +345,32 @@ void hlw_margin_chk()
snprintf_P(svalue, sizeof(svalue), PSTR("{")); snprintf_P(svalue, sizeof(svalue), PSTR("{"));
jsonflg = 0; jsonflg = 0;
if (hlw_margin(0, sysCfg.hlw_pmin, pwv, flag, hlw_pminflg)) { if (hlw_margin(0, sysCfg.hlw_pmin, pwv, flag, hlw_pminflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"PowerLow\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag)); snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_POWERLOW "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1; jsonflg = 1;
} }
if (hlw_margin(1, sysCfg.hlw_pmax, pwv, flag, hlw_pmaxflg)) { if (hlw_margin(1, sysCfg.hlw_pmax, pwv, flag, hlw_pmaxflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"PowerHigh\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag)); snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_POWERHIGH "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1; jsonflg = 1;
} }
if (hlw_margin(0, sysCfg.hlw_umin, puv, flag, hlw_uminflg)) { if (hlw_margin(0, sysCfg.hlw_umin, puv, flag, hlw_uminflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"VoltageLow\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag)); snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_VOLTAGELOW "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1; jsonflg = 1;
} }
if (hlw_margin(1, sysCfg.hlw_umax, puv, flag, hlw_umaxflg)) { if (hlw_margin(1, sysCfg.hlw_umax, puv, flag, hlw_umaxflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"VoltageHigh\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag)); snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_VOLTAGEHIGH "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1; jsonflg = 1;
} }
if (hlw_margin(0, sysCfg.hlw_imin, piv, flag, hlw_iminflg)) { if (hlw_margin(0, sysCfg.hlw_imin, piv, flag, hlw_iminflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"CurrentLow\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag)); snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_CURRENTLOW "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1; jsonflg = 1;
} }
if (hlw_margin(1, sysCfg.hlw_imax, piv, flag, hlw_imaxflg)) { if (hlw_margin(1, sysCfg.hlw_imax, piv, flag, hlw_imaxflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"CurrentHigh\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag)); snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_CURRENTHIGH "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1; jsonflg = 1;
} }
if (jsonflg) { if (jsonflg) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue); snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue);
mqtt_publish_topic_P(2, PSTR("MARGINS"), svalue); mqtt_publish_topic_P(2, PSTR(D_RSLT_MARGINS), svalue);
hlw_mqttPresent(0); hlw_mqttPresent(0);
} }
} }
@ -384,8 +384,8 @@ void hlw_margin_chk()
} else { } else {
hlw_mplh_counter--; hlw_mplh_counter--;
if (!hlw_mplh_counter) { if (!hlw_mplh_counter) {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"MaxPowerReached\":\"%d%s\"}"), pwv, (sysCfg.flag.value_units) ? " W" : ""); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_MAXPOWERREACHED "\":\"%d%s\"}"), pwv, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
mqtt_publish_topic_P(1, PSTR("WARNING"), svalue); mqtt_publish_topic_P(1, S_RSLT_WARNING, svalue);
hlw_mqttPresent(0); hlw_mqttPresent(0);
do_cmnd_power(1, 0); do_cmnd_power(1, 0);
if (!hlw_mplr_counter) { if (!hlw_mplr_counter) {
@ -407,12 +407,12 @@ void hlw_margin_chk()
if (hlw_mplr_counter) { if (hlw_mplr_counter) {
hlw_mplr_counter--; hlw_mplr_counter--;
if (hlw_mplr_counter) { if (hlw_mplr_counter) {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"PowerMonitor\":\"%s\"}"), getStateText(1)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_POWERMONITOR "\":\"%s\"}"), getStateText(1));
mqtt_publish_topic_P(5, PSTR("POWERMONITOR"), svalue); mqtt_publish_topic_P(5, PSTR(D_POWERMONITOR), svalue);
do_cmnd_power(1, 1); do_cmnd_power(1, 1);
} else { } else {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"MaxPowerReachedRetry\":\"%s\"}"), getStateText(0)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_MAXPOWERREACHEDRETRY "\":\"%s\"}"), getStateText(0));
mqtt_publish_topic_P(1, PSTR("WARNING"), svalue); mqtt_publish_topic_P(1, S_RSLT_WARNING, svalue);
hlw_mqttPresent(0); hlw_mqttPresent(0);
} }
} }
@ -425,15 +425,15 @@ void hlw_margin_chk()
uped = (uint16_t)(ped * 1000); uped = (uint16_t)(ped * 1000);
if (!hlw_mkwh_state && (rtcTime.Hour == sysCfg.hlw_mkwhs)) { if (!hlw_mkwh_state && (rtcTime.Hour == sysCfg.hlw_mkwhs)) {
hlw_mkwh_state = 1; hlw_mkwh_state = 1;
snprintf_P(svalue, sizeof(svalue), PSTR("{\"EnergyMonitor\":\"%s\"}"), getStateText(1)); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_ENERGYMONITOR "\":\"%s\"}"), getStateText(1));
mqtt_publish_topic_P(5, PSTR("ENERGYMONITOR"), svalue); mqtt_publish_topic_P(5, PSTR(D_ENERGYMONITOR), svalue);
do_cmnd_power(1, 1); do_cmnd_power(1, 1);
} }
else if ((1 == hlw_mkwh_state) && (uped >= sysCfg.hlw_mkwh)) { else if ((1 == hlw_mkwh_state) && (uped >= sysCfg.hlw_mkwh)) {
hlw_mkwh_state = 2; hlw_mkwh_state = 2;
dtostrf(ped, 1, 3, svalue); dtostrfd(ped, 3, svalue);
snprintf_P(svalue, sizeof(svalue), PSTR("{\"MaxEnergyReached\":\"%s%s\"}"), svalue, (sysCfg.flag.value_units) ? " kWh" : ""); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_MAXENERGYREACHED "\":\"%s%s\"}"), svalue, (sysCfg.flag.value_units) ? " " D_UNIT_KILOWATTHOUR : "");
mqtt_publish_topic_P(1, PSTR("WARNING"), svalue); mqtt_publish_topic_P(1, S_RSLT_WARNING, svalue);
hlw_mqttPresent(0); hlw_mqttPresent(0);
do_cmnd_power(1, 0); do_cmnd_power(1, 0);
} }
@ -450,43 +450,43 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
boolean serviced = true; boolean serviced = true;
uint8_t caltext = 0; uint8_t caltext = 0;
if (!strcmp_P(type,PSTR("POWERLOW"))) { if (!strcasecmp_P(type, PSTR(D_CMND_POWERLOW))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_pmin = payload; sysCfg.hlw_pmin = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"PowerLow\":\"%d%s\"}"), sysCfg.hlw_pmin, (sysCfg.flag.value_units) ? " W" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_POWERLOW "\":\"%d%s\"}"), sysCfg.hlw_pmin, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
} }
else if (!strcmp_P(type,PSTR("POWERHIGH"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_POWERHIGH))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_pmax = payload; sysCfg.hlw_pmax = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"PowerHigh\":\"%d%s\"}"), sysCfg.hlw_pmax, (sysCfg.flag.value_units) ? " W" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_POWERHIGH "\":\"%d%s\"}"), sysCfg.hlw_pmax, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
} }
else if (!strcmp_P(type,PSTR("VOLTAGELOW"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_VOLTAGELOW))) {
if ((payload >= 0) && (payload < 501)) { if ((payload >= 0) && (payload < 501)) {
sysCfg.hlw_umin = payload; sysCfg.hlw_umin = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"VoltageLow\":\"%d%s\"}"), sysCfg.hlw_umin, (sysCfg.flag.value_units) ? " V" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_VOLTAGELOW "\":\"%d%s\"}"), sysCfg.hlw_umin, (sysCfg.flag.value_units) ? " " D_UNIT_VOLT : "");
} }
else if (!strcmp_P(type,PSTR("VOLTAGEHIGH"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_VOLTAGEHIGH))) {
if ((payload >= 0) && (payload < 501)) { if ((payload >= 0) && (payload < 501)) {
sysCfg.hlw_umax = payload; sysCfg.hlw_umax = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("[\"VoltageHigh\":\"%d%s\"}"), sysCfg.hlw_umax, (sysCfg.flag.value_units) ? " V" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_VOLTAGEHIGH "\":\"%d%s\"}"), sysCfg.hlw_umax, (sysCfg.flag.value_units) ? " " D_UNIT_VOLT : "");
} }
else if (!strcmp_P(type,PSTR("CURRENTLOW"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_CURRENTLOW))) {
if ((payload >= 0) && (payload < 16001)) { if ((payload >= 0) && (payload < 16001)) {
sysCfg.hlw_imin = payload; sysCfg.hlw_imin = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"CurrentLow\":\"%d%s\"}"), sysCfg.hlw_imin, (sysCfg.flag.value_units) ? " mA" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_CURRENTLOW "\":\"%d%s\"}"), sysCfg.hlw_imin, (sysCfg.flag.value_units) ? " " D_UNIT_MILLIAMPERE : "");
} }
else if (!strcmp_P(type,PSTR("CURRENTHIGH"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_CURRENTHIGH))) {
if ((payload >= 0) && (payload < 16001)) { if ((payload >= 0) && (payload < 16001)) {
sysCfg.hlw_imax = payload; sysCfg.hlw_imax = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"CurrentHigh\":\"%d%s\"}"), sysCfg.hlw_imax, (sysCfg.flag.value_units) ? " mA" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_CURRENTHIGH "\":\"%d%s\"}"), sysCfg.hlw_imax, (sysCfg.flag.value_units) ? " " D_UNIT_MILLIAMPERE : "");
} }
else if (!strcmp_P(type,PSTR("ENERGYRESET"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_ENERGYRESET))) {
if ((payload >= 1) && (payload <= 3)) { if ((payload >= 1) && (payload <= 3)) {
switch (payload) { switch (payload) {
case 1: case 1:
@ -506,96 +506,96 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
char sey[10]; char sey[10];
char sen[10]; char sen[10];
char set[10]; char set[10];
dtostrf((float)sysCfg.hlw_kWhyesterday / 100000000, 1, sysCfg.flag.energy_resolution, sey); dtostrfd((float)sysCfg.hlw_kWhyesterday / 100000000, sysCfg.flag.energy_resolution, sey);
dtostrf((float)rtcMem.hlw_kWhtoday / 100000000, 1, sysCfg.flag.energy_resolution, sen); dtostrfd((float)rtcMem.hlw_kWhtoday / 100000000, sysCfg.flag.energy_resolution, sen);
dtostrf((float)(rtcMem.hlw_kWhtotal + (hlw_kWhtoday / 1000)) / 100000, 1, sysCfg.flag.energy_resolution, set); dtostrfd((float)(rtcMem.hlw_kWhtotal + (hlw_kWhtoday / 1000)) / 100000, sysCfg.flag.energy_resolution, set);
snprintf_P(svalue, ssvalue, PSTR("{\"EnergyReset\":{\"Total\":%s, \"Yesterday\":%s, \"Today\":%s}}"), set, sey, sen); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_ENERGYRESET "\":{\"" D_TOTAL "\":%s, \"" D_YESTERDAY "\":%s, \"" D_TODAY "\":%s}}"), set, sey, sen);
} }
else if (!strcmp_P(type,PSTR("HLWPCAL"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_HLWPCAL))) {
if ((payload > 0) && (payload < 32001)) { if ((payload > 0) && (payload < 32001)) {
sysCfg.hlw_pcal = (payload > 4000) ? payload : HLW_PREF_PULSE; // 12530 sysCfg.hlw_pcal = (payload > 4000) ? payload : HLW_PREF_PULSE; // 12530
} }
caltext = 1; caltext = 1;
} }
else if (!strcmp_P(type,PSTR("HLWPSET"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_HLWPSET))) {
if ((payload > 0) && (payload < 3601) && hlw_cf_plen) { if ((payload > 0) && (payload < 3601) && hlw_cf_plen) {
sysCfg.hlw_pcal = (payload * 10 * hlw_cf_plen) / HLW_PREF; sysCfg.hlw_pcal = (payload * 10 * hlw_cf_plen) / HLW_PREF;
} }
caltext = 1; caltext = 1;
} }
else if (!strcmp_P(type,PSTR("HLWUCAL"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_HLWUCAL))) {
if ((payload > 0) && (payload < 32001)) { if ((payload > 0) && (payload < 32001)) {
sysCfg.hlw_ucal = (payload > 999) ? payload : HLW_UREF_PULSE; // 1950 sysCfg.hlw_ucal = (payload > 999) ? payload : HLW_UREF_PULSE; // 1950
} }
caltext = 2; caltext = 2;
} }
else if (!strcmp_P(type,PSTR("HLWUSET"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_HLWUSET))) {
if ((payload > 0) && (payload < 501) && hlw_cf1u_plen) { if ((payload > 0) && (payload < 501) && hlw_cf1u_plen) {
sysCfg.hlw_ucal = (payload * 10 * hlw_cf1u_plen) / HLW_UREF; sysCfg.hlw_ucal = (payload * 10 * hlw_cf1u_plen) / HLW_UREF;
} }
caltext = 2; caltext = 2;
} }
else if (!strcmp_P(type,PSTR("HLWICAL"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_HLWICAL))) {
if ((payload > 0) && (payload < 32001)) { if ((payload > 0) && (payload < 32001)) {
sysCfg.hlw_ical = (payload > 1100) ? payload : HLW_IREF_PULSE; // 3500 sysCfg.hlw_ical = (payload > 1100) ? payload : HLW_IREF_PULSE; // 3500
} }
caltext = 3; caltext = 3;
} }
else if (!strcmp_P(type,PSTR("HLWISET"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_HLWISET))) {
if ((payload > 0) && (payload < 16001) && hlw_cf1i_plen) { if ((payload > 0) && (payload < 16001) && hlw_cf1i_plen) {
sysCfg.hlw_ical = (payload * hlw_cf1i_plen) / HLW_IREF; sysCfg.hlw_ical = (payload * hlw_cf1i_plen) / HLW_IREF;
} }
caltext = 3; caltext = 3;
} }
#if FEATURE_POWER_LIMIT #if FEATURE_POWER_LIMIT
else if (!strcmp_P(type,PSTR("MAXPOWER"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_MAXPOWER))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mpl = payload; sysCfg.hlw_mpl = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxPower\":\"%d%s\"}"), sysCfg.hlw_mpl, (sysCfg.flag.value_units) ? " W" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXPOWER "\":\"%d%s\"}"), sysCfg.hlw_mpl, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
} }
else if (!strcmp_P(type,PSTR("MAXPOWERHOLD"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_MAXPOWERHOLD))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mplh = (1 == payload) ? MAX_POWER_HOLD : payload; sysCfg.hlw_mplh = (1 == payload) ? MAX_POWER_HOLD : payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxPowerHold\":\"%d%s\"}"), sysCfg.hlw_mplh, (sysCfg.flag.value_units) ? " Sec" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXPOWERHOLD "\":\"%d%s\"}"), sysCfg.hlw_mplh, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
} }
else if (!strcmp_P(type,PSTR("MAXPOWERWINDOW"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_MAXPOWERWINDOW))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mplw = (1 == payload) ? MAX_POWER_WINDOW : payload; sysCfg.hlw_mplw = (1 == payload) ? MAX_POWER_WINDOW : payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxPowerWindow\":\"%d%s\"}"), sysCfg.hlw_mplw, (sysCfg.flag.value_units) ? " Sec" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXPOWERWINDOW "\":\"%d%s\"}"), sysCfg.hlw_mplw, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
} }
else if (!strcmp_P(type,PSTR("SAFEPOWER"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_SAFEPOWER))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mspl = payload; sysCfg.hlw_mspl = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"SafePower\":\"%d%s\"}"), sysCfg.hlw_mspl, (sysCfg.flag.value_units) ? " W" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SAFEPOWER "\":\"%d%s\"}"), sysCfg.hlw_mspl, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
} }
else if (!strcmp_P(type,PSTR("SAFEPOWERHOLD"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_SAFEPOWERHOLD))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_msplh = (1 == payload) ? SAFE_POWER_HOLD : payload; sysCfg.hlw_msplh = (1 == payload) ? SAFE_POWER_HOLD : payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"SafePowerHold\":\"%d%s\"}"), sysCfg.hlw_msplh, (sysCfg.flag.value_units) ? " Sec" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SAFEPOWERHOLD "\":\"%d%s\"}"), sysCfg.hlw_msplh, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
} }
else if (!strcmp_P(type,PSTR("SAFEPOWERWINDOW"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_SAFEPOWERWINDOW))) {
if ((payload >= 0) && (payload < 1440)) { if ((payload >= 0) && (payload < 1440)) {
sysCfg.hlw_msplw = (1 == payload) ? SAFE_POWER_WINDOW : payload; sysCfg.hlw_msplw = (1 == payload) ? SAFE_POWER_WINDOW : payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"SafePowerWindow\":\"%d%s\"}"), sysCfg.hlw_msplw, (sysCfg.flag.value_units) ? " Min" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SAFEPOWERWINDOW "\":\"%d%s\"}"), sysCfg.hlw_msplw, (sysCfg.flag.value_units) ? " " D_UNIT_MINUTE : "");
} }
else if (!strcmp_P(type,PSTR("MAXENERGY"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_MAXENERGY))) {
if ((payload >= 0) && (payload < 3601)) { if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mkwh = payload; sysCfg.hlw_mkwh = payload;
hlw_mkwh_state = 3; hlw_mkwh_state = 3;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxEnergy\":\"%d%s\"}"), sysCfg.hlw_mkwh, (sysCfg.flag.value_units) ? " Wh" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXENERGY "\":\"%d%s\"}"), sysCfg.hlw_mkwh, (sysCfg.flag.value_units) ? " " D_UNIT_WATTHOUR : "");
} }
else if (!strcmp_P(type,PSTR("MAXENERGYSTART"))) { else if (!strcasecmp_P(type, PSTR(D_CMND_MAXENERGYSTART))) {
if ((payload >= 0) && (payload < 24)) { if ((payload >= 0) && (payload < 24)) {
sysCfg.hlw_mkwhs = payload; sysCfg.hlw_mkwhs = payload;
} }
snprintf_P(svalue, ssvalue, PSTR("{\"MaxEnergyStart\":\"%d%s\"}"), sysCfg.hlw_mkwhs, (sysCfg.flag.value_units) ? " Hr" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXENERGYSTART "\":\"%d%s\"}"), sysCfg.hlw_mkwhs, (sysCfg.flag.value_units) ? " " D_UNIT_HOUR : "");
} }
#endif // FEATURE_POWER_LIMIT #endif // FEATURE_POWER_LIMIT
else { else {
@ -603,13 +603,13 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
} }
switch (caltext) { switch (caltext) {
case 1: case 1:
snprintf_P(svalue, ssvalue, PSTR("(\"HlwPcal\":\"%d%s\"}"), sysCfg.hlw_pcal, (sysCfg.flag.value_units) ? " uS" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_HLWPCAL "\":\"%d%s\"}"), sysCfg.hlw_pcal, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
break; break;
case 2: case 2:
snprintf_P(svalue, ssvalue, PSTR("{\"HlwUcal\":\"%d%s\"}"), sysCfg.hlw_ucal, (sysCfg.flag.value_units) ? " uS" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_HLWUCAL "\":\"%d%s\"}"), sysCfg.hlw_ucal, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
break; break;
case 3: case 3:
snprintf_P(svalue, ssvalue, PSTR("(\"HlwIcal\":\"%d%s\"}"), sysCfg.hlw_ical, (sysCfg.flag.value_units) ? " uS" : ""); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_HLWICAL "\":\"%d%s\"}"), sysCfg.hlw_ical, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
break; break;
} }
return serviced; return serviced;
@ -642,20 +642,20 @@ void hlw_mqttStat(byte option, char* svalue, uint16_t ssvalue)
char speriod[20]; char speriod[20];
hlw_readEnergy(option, pet, ped, pe, pw, pu, pi, pc); hlw_readEnergy(option, pet, ped, pe, pw, pu, pi, pc);
dtostrf(pet, 1, sysCfg.flag.energy_resolution, spet); dtostrfd(pet, sysCfg.flag.energy_resolution, spet);
dtostrf(ped, 1, sysCfg.flag.energy_resolution, sped); dtostrfd(ped, sysCfg.flag.energy_resolution, sped);
dtostrf(pe, 1, sysCfg.flag.wattage_resolution, spe); dtostrfd(pe, sysCfg.flag.wattage_resolution, spe);
dtostrf(pw, 1, sysCfg.flag.wattage_resolution, spw); dtostrfd(pw, sysCfg.flag.wattage_resolution, spw);
dtostrf(pu, 1, sysCfg.flag.voltage_resolution, spu); dtostrfd(pu, sysCfg.flag.voltage_resolution, spu);
dtostrf(pi, 1, 3, spi); dtostrfd(pi, 3, spi);
dtostrf(pc, 1, 2, spc); dtostrfd(pc, 2, spc);
dtostrf((float)sysCfg.hlw_kWhyesterday / 100000000, 1, sysCfg.flag.energy_resolution, sey); dtostrfd((float)sysCfg.hlw_kWhyesterday / 100000000, sysCfg.flag.energy_resolution, sey);
snprintf_P(speriod, sizeof(speriod), PSTR(", \"Period\":%s"), spe); snprintf_P(speriod, sizeof(speriod), PSTR(", \"" D_PERIOD "\":%s"), spe);
snprintf_P(svalue, ssvalue, PSTR("%s\"Total\":%s, \"Yesterday\":%s, \"Today\":%s%s, \"Power\":%s, \"Factor\":%s, \"Voltage\":%s, \"Current\":%s}"), snprintf_P(svalue, ssvalue, PSTR("%s\"" D_TOTAL "\":%s, \"" D_YESTERDAY "\":%s, \"" D_TODAY "\":%s%s, \"" D_POWERUSAGE "\":%s, \"" D_POWERFACTOR "\":%s, \"" D_VOLTAGE "\":%s, \"" D_CURRENT "\":%s}"),
svalue, spet, sey, sped, (option) ? speriod : "", spw, spc, spu, spi); svalue, spet, sey, sped, (option) ? speriod : "", spw, spc, spu, spi);
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
if (option) { // Only send if telemetry if (option) { // Only send if telemetry
dtostrf(pet * 1000, 1, 1, spet); dtostrfd(pet * 1000, 1, spet);
domoticz_sensor4((uint16_t)pw, spet); domoticz_sensor4((uint16_t)pw, spet);
} }
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
@ -669,27 +669,27 @@ void hlw_mqttPresent(byte option)
// {"Time":"2017-03-04T13:37:24", "Total":0.013, "Yesterday":0.013, "Today":0.000, "Period":0, "Power":0, "Factor":0.00, "Voltage":0, "Current":0.000} // {"Time":"2017-03-04T13:37:24", "Total":0.013, "Yesterday":0.013, "Today":0.000, "Period":0, "Power":0, "Factor":0.00, "Voltage":0, "Current":0.000}
char svalue[200]; // was MESSZ char svalue[200]; // was MESSZ
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Time\":\"%s\", "), getDateTime().c_str()); snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_TIME "\":\"%s\", "), getDateTime().c_str());
hlw_mqttStat(option, svalue, sizeof(svalue)); hlw_mqttStat(option, svalue, sizeof(svalue));
mqtt_publish_topic_P(2, PSTR("ENERGY"), svalue); mqtt_publish_topic_P(2, PSTR(D_RSLT_ENERGY), svalue);
} }
void hlw_mqttStatus(char* svalue, uint16_t ssvalue) void hlw_mqttStatus(char* svalue, uint16_t ssvalue)
{ {
snprintf_P(svalue, ssvalue, PSTR("{\"StatusPWR\":{")); snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_STATUS D_STATUS8_POWER "\":{"));
hlw_mqttStat(0, svalue, ssvalue); hlw_mqttStat(0, svalue, ssvalue);
snprintf_P(svalue, ssvalue, PSTR("%s}"), svalue); snprintf_P(svalue, ssvalue, PSTR("%s}"), svalue);
} }
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
const char HTTP_ENERGY_SNS[] PROGMEM = const char HTTP_ENERGY_SNS[] PROGMEM =
"<tr><th>Voltage</th><td>%s V</td></tr>" "<tr><th>" D_VOLTAGE "</th><td>%s " D_UNIT_VOLT "</td></tr>"
"<tr><th>Current</th><td>%s A</td></tr>" "<tr><th>" D_CURRENT "</th><td>%s " D_UNIT_AMPERE "</td></tr>"
"<tr><th>Power</th><td>%s W</td></tr>" "<tr><th>" D_POWERUSAGE "</th><td>%s " D_UNIT_WATT "</td></tr>"
"<tr><th>Power Factor</th><td>%s</td></tr>" "<tr><th>" D_POWER_FACTOR "</th><td>%s</td></tr>"
"<tr><th>Energy Today</th><td>%s kWh</td></tr>" "<tr><th>" D_ENERGY_TODAY "</th><td>%s " D_UNIT_KILOWATTHOUR "</td></tr>"
"<tr><th>Energy Yesterday</th><td>%s kWh</td></tr>" "<tr><th>" D_ENERGY_YESTERDAY "</th><td>%s " D_UNIT_KILOWATTHOUR "</td></tr>"
"<tr><th>Energy Total</th><td>%s kWh</td></tr>"; "<tr><th>" D_ENERGY_TOTAL "</th><td>%s " D_UNIT_KILOWATTHOUR "</td></tr>";
String hlw_webPresent() String hlw_webPresent()
{ {
@ -707,16 +707,16 @@ String hlw_webPresent()
char spi[10]; char spi[10];
char spc[10]; char spc[10];
char sey[10]; char sey[10];
char sensor[320]; char sensor[400];
hlw_readEnergy(0, pet, ped, pe, pw, pu, pi, pc); hlw_readEnergy(0, pet, ped, pe, pw, pu, pi, pc);
dtostrf(pet, 1, sysCfg.flag.energy_resolution, spet); dtostrfi(pet, sysCfg.flag.energy_resolution, spet);
dtostrf(ped, 1, sysCfg.flag.energy_resolution, sped); dtostrfi(ped, sysCfg.flag.energy_resolution, sped);
dtostrf(pw, 1, sysCfg.flag.wattage_resolution, spw); dtostrfi(pw, sysCfg.flag.wattage_resolution, spw);
dtostrf(pu, 1, sysCfg.flag.voltage_resolution, spu); dtostrfi(pu, sysCfg.flag.voltage_resolution, spu);
dtostrf(pi, 1, 3, spi); dtostrfi(pi, 3, spi);
dtostrf(pc, 1, 2, spc); dtostrfi(pc, 2, spc);
dtostrf((float)sysCfg.hlw_kWhyesterday / 100000000, 1, sysCfg.flag.energy_resolution, sey); dtostrfi((float)sysCfg.hlw_kWhyesterday / 100000000, sysCfg.flag.energy_resolution, sey);
snprintf_P(sensor, sizeof(sensor), HTTP_ENERGY_SNS, spu, spi, spw, spc, sped, sey, spet); snprintf_P(sensor, sizeof(sensor), HTTP_ENERGY_SNS, spu, spi, spw, spc, sped, sey, spet);
return String(sensor); return String(sensor);
} }

View File

@ -244,7 +244,7 @@ uint8_t htu_detect()
delayH=23; delayH=23;
} }
if (success) { if (success) {
snprintf_P(log, sizeof(log), PSTR("I2C: %s found at address 0x%x"), htustype, htuaddr); snprintf_P(log, sizeof(log), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), htustype, htuaddr);
addLog(LOG_LEVEL_DEBUG, log); addLog(LOG_LEVEL_DEBUG, log);
} else { } else {
htutype = 0; htutype = 0;
@ -268,8 +268,8 @@ void htu_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
float t = htu21_readTemperature(); float t = htu21_readTemperature();
float h = htu21_readHumidity(); float h = htu21_readHumidity();
h = htu21_compensatedHumidity(h, t); h = htu21_compensatedHumidity(h, t);
dtostrf(t, 1, sysCfg.flag.temperature_resolution, stemp1); dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
dtostrf(h, 1, sysCfg.flag.humidity_resolution, stemp2); dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, htustype, stemp1, stemp2); snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, htustype, stemp1, stemp2);
*djson = 1; *djson = 1;
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
@ -288,10 +288,10 @@ String htu_webPresent()
float t_htu21 = htu21_readTemperature(); float t_htu21 = htu21_readTemperature();
float h_htu21 = htu21_readHumidity(); float h_htu21 = htu21_readHumidity();
h_htu21 = htu21_compensatedHumidity(h_htu21, t_htu21); h_htu21 = htu21_compensatedHumidity(h_htu21, t_htu21);
dtostrf(t_htu21, 1, sysCfg.flag.temperature_resolution, stemp); dtostrfi(t_htu21, sysCfg.flag.temperature_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, htustype, stemp, tempUnit()); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, htustype, stemp, tempUnit());
page += sensor; page += sensor;
dtostrf(h_htu21, 1, sysCfg.flag.humidity_resolution, stemp); dtostrfi(h_htu21, sysCfg.flag.humidity_resolution, stemp);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, htustype, stemp); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, htustype, stemp);
page += sensor; page += sensor;
} }

View File

@ -77,7 +77,7 @@ boolean sht_sendCommand(const byte cmd)
} }
if (ackerror) { if (ackerror) {
shttype = 0; shttype = 0;
addLog_P(LOG_LEVEL_DEBUG, PSTR("SHT1X: Sensor did not ACK command")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_SHT1 D_SENSOR_DID_NOT_ACK_COMMAND));
} }
return (!ackerror); return (!ackerror);
} }
@ -91,7 +91,7 @@ boolean sht_awaitResult()
} }
delay(20); delay(20);
} }
addLog_P(LOG_LEVEL_DEBUG, PSTR("SHT1X: Data not ready")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_SHT1 D_SENSOR_BUSY));
shttype = 0; shttype = 0;
return false; return false;
} }
@ -159,17 +159,6 @@ boolean sht_readTempHum(float &t, float &h)
return (!isnan(t) && !isnan(h)); return (!isnan(t) && !isnan(h));
} }
boolean sht_readCharTempHum(char* temp, char* hum)
{
float t;
float h;
boolean success = sht_readTempHum(t, h);
dtostrf(t, 1, sysCfg.flag.temperature_resolution, temp);
dtostrf(h, 1, sysCfg.flag.humidity_resolution, hum);
return success;
}
boolean sht_detect() boolean sht_detect()
{ {
if (shttype) { if (shttype) {
@ -183,7 +172,7 @@ boolean sht_detect()
sht_scl_pin = pin[GPIO_I2C_SCL]; sht_scl_pin = pin[GPIO_I2C_SCL];
if (sht_readTempHum(t, h)) { if (sht_readTempHum(t, h)) {
shttype = 1; shttype = 1;
addLog_P(LOG_LEVEL_DEBUG, PSTR("I2C: SHT1X found")); addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_I2C D_SHT1X_FOUND));
} else { } else {
Wire.begin(sht_sda_pin, sht_scl_pin); Wire.begin(sht_sda_pin, sht_scl_pin);
shttype = 0; shttype = 0;
@ -201,10 +190,15 @@ void sht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
return; return;
} }
char stemp[10]; float t;
char shum[10]; float h;
if (sht_readCharTempHum(stemp, shum)) { if (sht_readTempHum(t, h)) {
char stemp[10];
char shum[10];
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp);
dtostrfd(h, sysCfg.flag.humidity_resolution, shum);
snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, "SHT1X", stemp, shum); snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, "SHT1X", stemp, shum);
*djson = 1; *djson = 1;
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
@ -216,13 +210,18 @@ void sht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
String sht_webPresent() String sht_webPresent()
{ {
float t;
float h;
String page = ""; String page = "";
if (shttype) { if (shttype) {
char stemp[10]; if (sht_readTempHum(t, h)) {
char shum[10]; char stemp[10];
char shum[10];
if (sht_readCharTempHum(stemp, shum)) {
char sensor[80]; char sensor[80];
dtostrfi(t, sysCfg.flag.temperature_resolution, stemp);
dtostrfi(h, sysCfg.flag.humidity_resolution, shum);
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "SHT1X", stemp, tempUnit()); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_TEMP, "SHT1X", stemp, tempUnit());
page += sensor; page += sensor;
snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, "SHT1X", shum); snprintf_P(sensor, sizeof(sensor), HTTP_SNS_HUM, "SHT1X", shum);
@ -234,4 +233,3 @@ String sht_webPresent()
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
#endif // USE_SHT #endif // USE_SHT
#endif // USE_I2C #endif // USE_I2C