diff --git a/README.md b/README.md
index a48256766..3e87b01cc 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
## Sonoff-Tasmota
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
-Current version is **5.11.1b** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
+Current version is **5.11.1c** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
### ATTENTION All versions
diff --git a/lib/PubSubClient-2.6.09/src/PubSubClient.h b/lib/PubSubClient-2.6.09/src/PubSubClient.h
index e2f1b32b1..7e37a472d 100644
--- a/lib/PubSubClient-2.6.09/src/PubSubClient.h
+++ b/lib/PubSubClient-2.6.09/src/PubSubClient.h
@@ -24,7 +24,8 @@
// MQTT_MAX_PACKET_SIZE : Maximum packet size
#ifndef MQTT_MAX_PACKET_SIZE
//#define MQTT_MAX_PACKET_SIZE 128
-#define MQTT_MAX_PACKET_SIZE 512
+//#define MQTT_MAX_PACKET_SIZE 512 // Tasmota
+#define MQTT_MAX_PACKET_SIZE 1000 // Tasmota v5.11.1c
#endif
// MQTT_KEEPALIVE : keepAlive interval in Seconds
diff --git a/platformio.ini b/platformio.ini
index da811a266..d15111700 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -12,11 +12,13 @@ src_dir = sonoff
; *** Uncomment one of the lines below to build/upload only one environment
;env_default = sonoff
-;env_default = sonoff-NL
;env_default = sonoff-DE
-;env_default = sonoff-PL
+;env_default = sonoff-ES
+;env_default = sonoff-FR
;env_default = sonoff-IT
-;env_default = sonoff-emulation
+;env_default = sonoff-NL
+;env_default = sonoff-PL
+;env_default = sonoff-CN
;env_default = sonoff-minimal
;env_default = sonoff-ds18x20
@@ -25,13 +27,15 @@ platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
-build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512
+build_flags = -Wl,-Tesp8266.flash.1m0.ld
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; *** Serial Monitor options
monitor_baud = 115200
; *** Upload Serial reset method for Wemos and NodeMCU
+;upload_port = COM5
+;upload_speed = 115200
;upload_resetmethod = nodemcu
; *** Upload file to OTA server using SCP
@@ -42,34 +46,34 @@ monitor_baud = 115200
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
-[env:sonoff-NL]
-platform = espressif8266
-framework = arduino
-board = esp01_1m
-board_flash_mode = dout
-build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=nl-NL
-lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
-
-; *** Serial Monitor options
-monitor_baud = 115200
-
[env:sonoff-DE]
platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
-build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=de-DE
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMY_LANGUAGE=de-DE
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; *** Serial Monitor options
monitor_baud = 115200
-[env:sonoff-PL]
+[env:sonoff-ES]
platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
-build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=pl-PL
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMY_LANGUAGE=es-AR
+lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
+
+; *** Serial Monitor options
+monitor_baud = 115200
+
+[env:sonoff-FR]
+platform = espressif8266
+framework = arduino
+board = esp01_1m
+board_flash_mode = dout
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMY_LANGUAGE=fr-FR
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; *** Serial Monitor options
@@ -80,43 +84,62 @@ platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
-build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=it-IT
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMY_LANGUAGE=it-IT
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; *** Serial Monitor options
monitor_baud = 115200
-; Sonoff with Wemo and Hue emulation
-[env:sonoff-emulation]
+[env:sonoff-NL]
platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
-build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DUSE_EMULATION
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMY_LANGUAGE=nl-NL
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
-; Serial Monitor options
+; *** Serial Monitor options
+monitor_baud = 115200
+
+[env:sonoff-PL]
+platform = espressif8266
+framework = arduino
+board = esp01_1m
+board_flash_mode = dout
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMY_LANGUAGE=pl-PL
+lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
+
+; *** Serial Monitor options
+monitor_baud = 115200
+
+[env:sonoff-CN]
+platform = espressif8266
+framework = arduino
+board = esp01_1m
+board_flash_mode = dout
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMY_LANGUAGE=zh-CN
+lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
+
+; *** Serial Monitor options
monitor_baud = 115200
-; Sonoff minimal
[env:sonoff-minimal]
platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
-build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DBE_MINIMAL
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DBE_MINIMAL
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; Serial Monitor options
monitor_baud = 115200
-; Sonoff multiple DS18x20
[env:sonoff-ds18x20]
platform = espressif8266
framework = arduino
board = esp01_1m
board_flash_mode = dout
-build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=707 -DUSE_DS18x20 -DMESSZ=600
+build_flags = -Wl,-Tesp8266.flash.1m0.ld -DUSE_DS18x20
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; Serial Monitor options
diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino
index 86ec89408..7f23be9cc 100644
--- a/sonoff/_releasenotes.ino
+++ b/sonoff/_releasenotes.ino
@@ -1,4 +1,20 @@
-/* 5.11.1b
+/* 5.11.1c
+ * Make command color parameter input less strict to ease Hass support
+ * Add ColorTemperature to light status message
+ * Change PubSubClient.h define MQTT_MAX_PACKET_SIZE from 512 to 1000 for Hass support
+ * Make define MESSZ dependent on PubSubClient.h define MQTT_MAX_PACKET_SIZE
+ * Fix logging line length around 400 characters
+ * Change module name Wemos D1 mini into Generic (#1220)
+ * Revert HTML change from width=100% to style=width:100% supporting HTML5 (#1358)
+ * Add experimental (still Hass python exceptions) Home Assistant Discovery for switch and light to be enabled by command SetOption19 1 (#1534)
+ * Updated French Translation (#1561)
+ * Fix DS18B20 temperature JSON decimal dot (#1561)
+ * Add Spanish language file (#1589)
+ * Update Italian Language file (#1594)
+ * Consolidate WIFI_MANAGER_SEC into WIFI_CONFIG_SEC (#1616)
+ * Fix Energy JSON message (#1621)
+ *
+ * 5.11.1b
* Add command PowerOnState option 5 which inverts PulseTime and allows for delayed always on after power on
* Changed OSWATCH_RESET_TIME (Blocked loop) from 30 to 120 seconds to allow slow networks (#1556)
* Add French language file (#1561)
diff --git a/sonoff/language/es-AR.h b/sonoff/language/es-AR.h
new file mode 100644
index 000000000..99e142d4c
--- /dev/null
+++ b/sonoff/language/es-AR.h
@@ -0,0 +1,469 @@
+/*
+ es-AR.h - localization for Spanish - Argentina for Sonoff-Tasmota
+
+ Copyright (C) 2018 Adrian Scillato
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifndef _LANGUAGE_ES_AR_H_
+#define _LANGUAGE_ES_AR_H_
+
+/*************************** ATTENTION *******************************\
+ *
+ * Due to memory constraints only UTF-8 is supported.
+ * To save code space keep text as short as possible.
+ * Time and Date provided by SDK can not be localized (yet).
+ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE.
+ * Use online command Prefix to translate cmnd, stat and tele.
+ *
+\*********************************************************************/
+
+// "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 "DomLunMarMieJueVieSab"
+#define D_MONTH3LIST "EneFebMarAbrMayJunJulAgoSepOctNovDic"
+
+// Non JSON decimal separator
+#define D_DECIMAL_SEPARATOR ","
+
+// Common
+#define D_ADMIN "Admin"
+#define D_AIR_QUALITY "Calidad del Aire"
+#define D_AP "AP" // Access Point
+#define D_AS "como"
+#define D_AUTO "AUTO"
+#define D_BLINK "Blink"
+#define D_BLINKOFF "BlinkOff"
+#define D_BOOT_COUNT "Conteo Reinicios"
+#define D_BRIGHTLIGHT "Brillo"
+#define D_BUTTON "Botón"
+#define D_BY "por" // Written by me
+#define D_BYTES "Bytes"
+#define D_CELSIUS "Celsius"
+#define D_CO2 "CO2"
+#define D_CODE "código" // Button code
+#define D_COLDLIGHT "Fría"
+#define D_COMMAND "Comando"
+#define D_CONNECTED "Conectado"
+#define D_COUNT "Conteo"
+#define D_COUNTER "Contador"
+#define D_CURRENT "Corriente" // As in Voltage and Current
+#define D_DATA "Datos"
+#define D_DARKLIGHT "Oscura"
+#define D_DEBUG "Debug"
+#define D_DISABLED "Deshabilitado"
+#define D_DNS_SERVER "DNS Server"
+#define D_DONE "Listo"
+#define D_DST_TIME "DST"
+#define D_EMULATION "Emulación"
+#define D_ENABLED "Habilitado"
+#define D_ERASE "Borrar"
+#define D_ERROR "Error"
+#define D_FAHRENHEIT "Fahrenheit"
+#define D_FAILED "Fallo"
+#define D_FALLBACK "Fallback"
+#define D_FALLBACK_TOPIC "FallbackTopic"
+#define D_FALSE "Falso"
+#define D_FILE "Archivo"
+#define D_FREE_MEMORY "Memoria Libre"
+#define D_GAS "Gas"
+#define D_GATEWAY "Gateway"
+#define D_GROUP "Grupo"
+#define D_HOST "Host"
+#define D_HOSTNAME "Hostname"
+#define D_HUMIDITY "Humedad"
+#define D_ILLUMINANCE "Luminancia"
+#define D_IMMEDIATE "inmediato" // Button immediate
+#define D_INDEX "Índice"
+#define D_INFO "Información"
+#define D_INITIALIZED "Inicializado"
+#define D_IP_ADDRESS "Dirección IP"
+#define D_LIGHT "Luz"
+#define D_LWT "LWT"
+#define D_MODULE "Módulo"
+#define D_MQTT "MQTT"
+#define D_MULTI_PRESS "multi-press"
+#define D_NOISE "Ruido"
+#define D_NONE "Ninguno"
+#define D_OFF "Apagado"
+#define D_OFFLINE "Offline"
+#define D_OK "Ok"
+#define D_ON "Encendido"
+#define D_ONLINE "Online"
+#define D_PASSWORD "Clave"
+#define D_PORT "Puerto"
+#define D_POWER_FACTOR "Factor de Potencia"
+#define D_POWERUSAGE "Potencia"
+#define D_PRESSURE "Presión"
+#define D_PRESSUREATSEALEVEL "Presión al nivel del mar"
+#define D_PROGRAM_FLASH_SIZE "Tamaño de Flash de Programa"
+#define D_PROGRAM_SIZE "Tamaño Programa"
+#define D_PROJECT "Proyecto"
+#define D_RECEIVED "Recibido"
+#define D_RESTART "Reinicio"
+#define D_RESTARTING "Reiniciando"
+#define D_RESTART_REASON "Causa Reinicio"
+#define D_RESTORE "Restauración"
+#define D_RETAINED "Grabado"
+#define D_SAVE "Grabar"
+#define D_SENSOR "Sensor"
+#define D_SSID "SSId"
+#define D_START "Iniciar"
+#define D_STD_TIME "STD"
+#define D_STOP "Detener"
+#define D_SUBNET_MASK "Máscara Subred"
+#define D_SUBSCRIBE_TO "Suscribir a"
+#define D_SUCCESSFUL "Exitosa"
+#define D_TEMPERATURE "Temperatura"
+#define D_TO "a"
+#define D_TOGGLE "Conmutar"
+#define D_TOPIC "Topic"
+#define D_TRANSMIT "Transmitir"
+#define D_TRUE "Verdadero"
+#define D_UPGRADE "Actualización"
+#define D_UPLOAD "Carga"
+#define D_UPTIME "Tiempo Encendido"
+#define D_USER "Usuario"
+#define D_UTC_TIME "UTC"
+#define D_UV_LEVEL "Nivel UV"
+#define D_VERSION "Versión"
+#define D_VOLTAGE "Tensión"
+#define D_WARMLIGHT "Cálida"
+#define D_WEB_SERVER "Servidor Web"
+
+// sonoff.ino
+#define D_WARNING_MINIMAL_VERSION "Precaución, esta versión no salva los cambios"
+#define D_LEVEL_10 "level 1-0"
+#define D_LEVEL_01 "level 0-1"
+#define D_SERIAL_LOGGING_DISABLED "Log serial deshabilitado"
+#define D_SYSLOG_LOGGING_REENABLED "Syslog re-habilitado"
+
+#define D_SET_BAUDRATE_TO "Baudrate a"
+#define D_RECEIVED_TOPIC "Topic Recibido"
+#define D_DATA_SIZE "Tamaño de Datos"
+#define D_ANALOG_INPUT "Entrada Analógica"
+
+#define D_FINGERPRINT "Verificar TLS fingerprint..."
+#define D_TLS_CONNECT_FAILED_TO "Falló Conección TLS a"
+#define D_RETRY_IN "Reintentando"
+#define D_VERIFIED "Verificado"
+#define D_INSECURE "Conección insegura por Fingerprint no válido"
+#define D_CONNECT_FAILED_TO "Falló Conección a"
+
+// support.ino
+#define D_OSWATCH "osWatch"
+#define D_BLOCKED_LOOP "Ciclo Bloqueado"
+#define D_WPS_FAILED_WITH_STATUS "WPSconfig FALLÓ con estado"
+#define D_ACTIVE_FOR_3_MINUTES "activo por 3 minutos"
+#define D_FAILED_TO_START "falló inicio"
+#define D_PATCH_ISSUE_2186 "Patch issue 2186"
+#define D_CONNECTING_TO_AP "Connectando a AP"
+#define D_IN_MODE "en modo"
+#define D_CONNECT_FAILED_NO_IP_ADDRESS "Falló Conección, Dirección IP no recibida"
+#define D_CONNECT_FAILED_AP_NOT_REACHED "Falló Conección, AP no pudo ser contactado"
+#define D_CONNECT_FAILED_WRONG_PASSWORD "Falló Conección, clave de AP incorrecta"
+#define D_CONNECT_FAILED_AP_TIMEOUT "Falló Conección, timeout de AP"
+#define D_ATTEMPTING_CONNECTION "Intentando conectar..."
+#define D_CHECKING_CONNECTION "Probando conección..."
+#define D_QUERY_DONE "Consulta lista. Servicio MQTT encontrado"
+#define D_MQTT_SERVICE_FOUND "Servicio MQTT encontrado en"
+#define D_FOUND_AT "encontrado en"
+#define D_SYSLOG_HOST_NOT_FOUND "Syslog Host no encontrado"
+
+// settings.ino
+#define D_SAVED_TO_FLASH_AT "Grabado a la flash en"
+#define D_LOADED_FROM_FLASH_AT "Cargado desde flash en"
+#define D_USE_DEFAULTS "Usar valores por defecto"
+#define D_ERASED_SECTOR "Sector borrado"
+
+// webserver.ino
+#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "firmware MÍNIMO - actualice por favor"
+#define D_WEBSERVER_ACTIVE_ON "Servidor web activo en"
+#define D_WITH_IP_ADDRESS "con dirección IP"
+#define D_WEBSERVER_STOPPED "Servidor web detenido"
+#define D_FILE_NOT_FOUND "Archivo No Encontrado"
+#define D_REDIRECTED "Redireccinado al portal captivo"
+#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager como AccessPoint y Estación"
+#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager como AccessPoint"
+#define D_TRYING_TO_CONNECT "Intentado conectar dispositivo a la red"
+
+#define D_RESTART_IN "Reinicio en"
+#define D_SECONDS "segundos"
+#define D_DEVICE_WILL_RESTART "El dispositivo se reiniciará en pocos segundos"
+#define D_BUTTON_TOGGLE "Alternar ON/OFF"
+#define D_CONFIGURATION "Configuración"
+#define D_INFORMATION "Información"
+#define D_FIRMWARE_UPGRADE "Actualización Firmware"
+#define D_CONSOLE "Consola"
+#define D_CONFIRM_RESTART "Confirmar Reinicio"
+
+#define D_CONFIGURE_MODULE "Configuración del Módulo"
+#define D_CONFIGURE_WIFI "Configuración WiFi"
+#define D_CONFIGURE_MQTT "Configuración MQTT"
+#define D_CONFIGURE_DOMOTICZ "Configuración Domoticz"
+#define D_CONFIGURE_LOGGING "Configuración Logging"
+#define D_CONFIGURE_OTHER "Configuración Extra"
+#define D_CONFIRM_RESET_CONFIGURATION "Confirmar Reset Configuración"
+#define D_RESET_CONFIGURATION "Reset de Configuración"
+#define D_BACKUP_CONFIGURATION "Backup de Configuración"
+#define D_RESTORE_CONFIGURATION "Restaurar Configuración"
+#define D_MAIN_MENU "Menú Principal"
+
+#define D_MODULE_PARAMETERS "Parámetros del módulo"
+#define D_MODULE_TYPE "Tipo módulo"
+#define D_GPIO "GPIO"
+#define D_SERIAL_IN "Serial In"
+#define D_SERIAL_OUT "Serial Out"
+
+#define D_WIFI_PARAMETERS "Parámetros Wifi"
+#define D_SCAN_FOR_WIFI_NETWORKS "Buscar redes wifi"
+#define D_SCAN_DONE "Busqueda finalizada"
+#define D_NO_NETWORKS_FOUND "Ninguna red encontrada"
+#define D_REFRESH_TO_SCAN_AGAIN "Recargar página para buscar nuevamente"
+#define D_DUPLICATE_ACCESSPOINT "AccessPoint duplicado"
+#define D_SKIPPING_LOW_QUALITY "Ignorado debido a baja calidad"
+#define D_RSSI "RSSI"
+#define D_WEP "WEP"
+#define D_WPA_PSK "WPA PSK"
+#define D_WPA2_PSK "WPA2 PSK"
+#define D_AP1_SSID "SSId AP1"
+#define D_AP1_PASSWORD "Clave AP1"
+#define D_AP2_SSID "SSId AP2"
+#define D_AP2_PASSWORD "Clave AP2"
+
+#define D_MQTT_PARAMETERS "Parámetros MQTT"
+#define D_CLIENT "Cliente"
+#define D_FULL_TOPIC "Full Topic"
+
+#define D_LOGGING_PARAMETERS "Parámetros Logging"
+#define D_SERIAL_LOG_LEVEL "Nivel de log Serial"
+#define D_WEB_LOG_LEVEL "Nivel de log Web"
+#define D_SYS_LOG_LEVEL "Nivel de Syslog"
+#define D_MORE_DEBUG "Mas Debug"
+#define D_SYSLOG_HOST "Host del Syslog"
+#define D_SYSLOG_PORT "Puerto del Syslog"
+#define D_TELEMETRY_PERIOD "Período de Telemetría"
+
+#define D_OTHER_PARAMETERS "Otros parámetros"
+#define D_WEB_ADMIN_PASSWORD "Clave Administrador Web"
+#define D_MQTT_ENABLE "Habilitar MQTT"
+#define D_FRIENDLY_NAME "Nombre Amigable"
+#define D_BELKIN_WEMO "Belkin WeMo"
+#define D_HUE_BRIDGE "Hue Bridge"
+#define D_SINGLE_DEVICE "dispositivo simple"
+#define D_MULTI_DEVICE "dispositivo múltiple"
+
+#define D_SAVE_CONFIGURATION "Grabar configuración"
+#define D_CONFIGURATION_SAVED "Configuración grabada"
+#define D_CONFIGURATION_RESET "Configuración restablecida"
+
+#define D_PROGRAM_VERSION "Versión del Programa"
+#define D_BUILD_DATE_AND_TIME "Fecha y Hora de la Compilación"
+#define D_CORE_AND_SDK_VERSION "Versión Core/SDK"
+#define D_FLASH_WRITE_COUNT "Contador de escritura en Flash"
+#define D_MAC_ADDRESS "Dirección MAC"
+#define D_MQTT_HOST "Host MQTT"
+#define D_MQTT_PORT "Puerto MQTT"
+#define D_MQTT_CLIENT "Cliente MQTT"
+#define D_MQTT_USER "Usuario MQTT"
+#define D_MQTT_TOPIC "Topic MQTT"
+#define D_MQTT_GROUP_TOPIC "Group Topic MQTT"
+#define D_MQTT_FULL_TOPIC "Full Topic MQTT"
+#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 "Tamaño Flash"
+#define D_FREE_PROGRAM_SPACE "Memoria de Programa Libre"
+
+#define D_UPGRADE_BY_WEBSERVER "Actualizar por servidor web"
+#define D_OTA_URL "OTA Url"
+#define D_START_UPGRADE "Comenzar actualización"
+#define D_UPGRADE_BY_FILE_UPLOAD "Actualizar cargando archivo bin"
+#define D_UPLOAD_STARTED "Cargando archivo"
+#define D_UPGRADE_STARTED "Actualización iniciada"
+#define D_UPLOAD_DONE "Carga finalizada"
+#define D_UPLOAD_ERR_1 "Ningún archivo seleccionado"
+#define D_UPLOAD_ERR_2 "Espacio insuficiente"
+#define D_UPLOAD_ERR_3 "Magic byte no corresponde a 0xE9"
+#define D_UPLOAD_ERR_4 "El tamaño de la memoria de programa es mayor que la de la flash"
+#define D_UPLOAD_ERR_5 "Error de comparación del buffer de carga"
+#define D_UPLOAD_ERR_6 "Carga fallida. Habilitar logging 3"
+#define D_UPLOAD_ERR_7 "Carga cancelada"
+#define D_UPLOAD_ERR_8 "Archivo no válido"
+#define D_UPLOAD_ERR_9 "Archivo muy grande"
+#define D_UPLOAD_ERROR_CODE "Código de error de carga"
+
+#define D_ENTER_COMMAND "Ingresar comando"
+#define D_ENABLE_WEBLOG_FOR_RESPONSE "Habilitar weblog 2 si desea respuesta"
+#define D_NEED_USER_AND_PASSWORD "Se necesita user=&password="
+
+// xdrv_wemohue.ino
+#define D_MULTICAST_DISABLED "Multicast deshabilitado"
+#define D_MULTICAST_REJOINED "Multicast (re)conectado"
+#define D_MULTICAST_JOIN_FAILED "Conección Multicast fallida"
+#define D_FAILED_TO_SEND_RESPONSE "Falla al enviar respuesta"
+
+#define D_WEMO "WeMo"
+#define D_WEMO_BASIC_EVENT "Evento base de WeMo"
+#define D_WEMO_EVENT_SERVICE "Evento de servicio de WeMo"
+#define D_WEMO_META_SERVICE "Meta Servicio de WeMo"
+#define D_WEMO_SETUP "Configuración de WeMo"
+#define D_RESPONSE_SENT "Respuesta enviada"
+
+#define D_HUE "Hue"
+#define D_HUE_BRIDGE_SETUP "Configuración Hue"
+#define D_HUE_API_NOT_IMPLEMENTED "API de Hue no implementada"
+#define D_HUE_API "Hue API"
+#define D_HUE_POST_ARGS "Hue POST args"
+#define D_3_RESPONSE_PACKETS_SENT "3 paquetes de respuesta enviados"
+
+// xdrv_02_irremote.ino
+#define D_JSON_INVALID_JSON "JSON no válido"
+#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocolo no soportado"
+#define D_JSON_IR_PROTOCOL "PROTOCOLO"
+#define D_JSON_IR_BITS "BITS"
+#define D_JSON_IR_DATA "DATA"
+#define D_JSON_IRHVAC_VENDOR "VENDOR"
+#define D_JSON_IRHVAC_POWER "POWER"
+#define D_JSON_IRHVAC_MODE "MODE"
+#define D_JSON_IRHVAC_FANSPEED "FANSPEED"
+#define D_JSON_IRHVAC_TEMP "TEMP"
+#define D_JSON_IRRECEIVED "IrReceived"
+
+// xdrv_05_domoticz.ino
+#define D_DOMOTICZ_PARAMETERS "Parámetros Domoticz"
+#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 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 "Potencia,Energía"
+ #define D_DOMOTICZ_ILLUMINANCE "Luminancia"
+ #define D_DOMOTICZ_COUNT "Contador"
+ #define D_DOMOTICZ_VOLTAGE "Voltaje"
+ #define D_DOMOTICZ_CURRENT "Corriente"
+ #define D_DOMOTICZ_AIRQUALITY "Calidad del Aire"
+#define D_DOMOTICZ_UPDATE_TIMER "Intervalo de refresco"
+
+// xdrv_03_energy.ino
+#define D_ENERGY_TODAY "Energía Hoy"
+#define D_ENERGY_YESTERDAY "Energía Ayer"
+#define D_ENERGY_TOTAL "Energía Total"
+
+// xsns_05_ds18b20.ino
+#define D_SENSOR_BUSY "Sensor ocupado"
+#define D_SENSOR_CRC_ERROR "Error CRC del Sensor"
+#define D_SENSORS_FOUND "Sensores encontrados"
+
+// xsns_06_dht.ino
+#define D_TIMEOUT_WAITING_FOR "Espera de timeout por"
+#define D_START_SIGNAL_LOW "iniciar señal baja"
+#define D_START_SIGNAL_HIGH "iniciar señal alta"
+#define D_PULSE "pulso"
+#define D_CHECKSUM_FAILURE "Checksum fallido"
+
+// xsns_07_sht1x.ino
+#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor no ha enviado el comando ACK"
+#define D_SHT1X_FOUND "SHT1X encontrado"
+
+// xsns_18_pms5003.ino
+#define D_STANDARD_CONCENTRATION "Concentración Standard"
+#define D_ENVIRONMENTAL_CONCENTRATION "Concentración en Medio Ambiente"
+#define D_PARTICALS_BEYOND "Partículas sobre"
+
+// sonoff_template.h
+// Max string length is 8 characters including suffixes
+#define D_SENSOR_NONE "Ninguno"
+#define D_SENSOR_DHT11 "DHT11"
+#define D_SENSOR_AM2301 "AM2301"
+#define D_SENSOR_SI7021 "SI7021"
+#define D_SENSOR_DS18X20 "DS18x20"
+#define D_SENSOR_I2C_SCL "I2C SCL"
+#define D_SENSOR_I2C_SDA "I2C SDA"
+#define D_SENSOR_WS2812 "WS2812"
+#define D_SENSOR_IRSEND "IR TX"
+#define D_SENSOR_SWITCH "Llave" // Suffix "1"
+#define D_SENSOR_BUTTON "Botón" // Suffix "1"
+#define D_SENSOR_RELAY "Relé" // Suffix "1i"
+#define D_SENSOR_LED "Led" // Suffix "1i"
+#define D_SENSOR_PWM "PWM" // Suffix "1"
+#define D_SENSOR_COUNTER "Counter" // Suffix "1"
+#define D_SENSOR_IRRECV "IR RX"
+#define D_SENSOR_MHZ_RX "MHZ Rx"
+#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_PZEM_RX "PZEM Rx"
+#define D_SENSOR_PZEM_TX "PZEM Tx"
+#define D_SENSOR_SAIR_RX "SAir Rx"
+#define D_SENSOR_SAIR_TX "SAir Tx"
+#define D_SENSOR_SPI_CS "SPI CS"
+#define D_SENSOR_SPI_DC "SPI DC"
+#define D_SENSOR_BACKLIGHT "BkLight"
+#define D_SENSOR_PMS5003 "PMS5003"
+
+// Units
+#define D_UNIT_AMPERE "A"
+#define D_UNIT_HOUR "Hr"
+#define D_UNIT_KILOOHM "kOhm"
+#define D_UNIT_KILOWATTHOUR "kWh"
+#define D_UNIT_LUX "lx"
+#define D_UNIT_MICROGRAM_PER_CUBIC_METER "ug/m3"
+#define D_UNIT_MICROMETER "um"
+#define D_UNIT_MICROSECOND "us"
+#define D_UNIT_MILLIAMPERE "mA"
+#define D_UNIT_MILLISECOND "ms"
+#define D_UNIT_MINUTE "Min"
+#define D_UNIT_PARTS_PER_DECILITER "ppd"
+#define D_UNIT_PARTS_PER_MILLION "ppm"
+#define D_UNIT_PRESSURE "hPa"
+#define D_UNIT_SECOND "seg"
+#define D_UNIT_SECTORS "sectores"
+#define D_UNIT_VOLT "V"
+#define D_UNIT_WATT "W"
+#define D_UNIT_WATTHOUR "Wh"
+
+// Log message prefix
+#define D_LOG_APPLICATION "APP: " // Application
+#define D_LOG_BRIDGE "BRG: " // Bridge
+#define D_LOG_CONFIG "CFG: " // Settings
+#define D_LOG_COMMAND "CMD: " // Command
+#define D_LOG_DEBUG "DBG: " // Debug
+#define D_LOG_DHT "DHT: " // DHT sensor
+#define D_LOG_DOMOTICZ "DOM: " // Domoticz
+#define D_LOG_DSB "DSB: " // DS18xB20 sensor
+#define D_LOG_HTTP "HTP: " // HTTP webserver
+#define D_LOG_I2C "I2C: " // I2C
+#define D_LOG_IRR "IRR: " // Infra Red Received
+#define D_LOG_LOG "LOG: " // Logging
+#define D_LOG_MODULE "MOD: " // Module
+#define D_LOG_MDNS "DNS: " // mDNS
+#define D_LOG_MQTT "MQT: " // MQTT
+#define D_LOG_OTHER "OTH: " // Other
+#define D_LOG_RESULT "RSL: " // Result
+#define D_LOG_RFR "RFR: " // RF Received
+#define D_LOG_SERIAL "SER: " // Serial
+#define D_LOG_SHT1 "SHT: " // SHT1x sensor
+#define D_LOG_UPLOAD "UPL: " // Upload
+#define D_LOG_UPNP "UPP: " // UPnP
+#define D_LOG_WIFI "WIF: " // Wifi
+
+#endif // _LANGUAGE_ES_AR_H_
diff --git a/sonoff/language/fr-FR.h b/sonoff/language/fr-FR.h
index 25b41c67b..bfb31d519 100644
--- a/sonoff/language/fr-FR.h
+++ b/sonoff/language/fr-FR.h
@@ -57,7 +57,7 @@
#define D_BY "par" // Written by me
#define D_BYTES "Bytes"
#define D_CELSIUS "Celsius"
-#define D_CO2 "Dioxyde arbone"
+#define D_CO2 "Dioxyde de carbone"
#define D_CODE "code" // Button code
#define D_COLDLIGHT "Froid"
#define D_COMMAND "Commande"
@@ -149,7 +149,7 @@
#define D_WEB_SERVER "Serveur web"
// sonoff.ino
-#define D_WARNING_MINIMAL_VERSION "WARNING This version does not support persistent settings"
+#define D_WARNING_MINIMAL_VERSION "ATTENTION Cette version ne supporte pas les réglages persistants"
#define D_LEVEL_10 "level 1-0"
#define D_LEVEL_01 "level 0-1"
#define D_SERIAL_LOGGING_DISABLED "Journalisation série désactivé"
@@ -264,7 +264,7 @@
#define D_OTHER_PARAMETERS "Autres paramètres"
#define D_WEB_ADMIN_PASSWORD "Mot de passe Web Admin"
#define D_MQTT_ENABLE "MQTT activé"
-#define D_FRIENDLY_NAME "Nom d'usage"
+#define D_FRIENDLY_NAME "Surnom"
#define D_BELKIN_WEMO "Belkin WeMo"
#define D_HUE_BRIDGE "Hue Bridge"
#define D_SINGLE_DEVICE "module unique"
@@ -383,13 +383,13 @@
#define D_CHECKSUM_FAILURE "Echec checksum"
// xsns_07_sht1x.ino
-#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor did not ACK command"
+#define D_SENSOR_DID_NOT_ACK_COMMAND "Le capteur n'a pas ACK la commande"
#define D_SHT1X_FOUND "SHT1X found"
// xsns_18_pms5003.ino
-#define D_STANDARD_CONCENTRATION "Standard Concentration"
-#define D_ENVIRONMENTAL_CONCENTRATION "Environmental Concentration"
-#define D_PARTICALS_BEYOND "Particals beyond"
+#define D_STANDARD_CONCENTRATION "Concentration standard"
+#define D_ENVIRONMENTAL_CONCENTRATION "Concentration environmentale"
+#define D_PARTICALS_BEYOND "Particules au-delà"
// sonoff_template.h
// Max string length is 8 characters including suffixes
diff --git a/sonoff/language/it-IT.h b/sonoff/language/it-IT.h
index 34b9132f0..be9e97911 100644
--- a/sonoff/language/it-IT.h
+++ b/sonoff/language/it-IT.h
@@ -51,7 +51,7 @@
#define D_AUTO "AUTO"
#define D_BLINK "Blink"
#define D_BLINKOFF "BlinkOff"
-#define D_BOOT_COUNT "Boot Count"
+#define D_BOOT_COUNT "Numero di boot"
#define D_BRIGHTLIGHT "Luminoso"
#define D_BUTTON "Pulsante"
#define D_BY "da" // Written by me
@@ -60,7 +60,7 @@
#define D_CO2 "CO2"
#define D_CODE "codice" // Button code
#define D_COLDLIGHT "Fredda"
-#define D_COMMAND "Command"
+#define D_COMMAND "Comando"
#define D_CONNECTED "Connesso"
#define D_COUNT "Conteggio"
#define D_COUNTER "Contatore"
@@ -74,30 +74,30 @@
#define D_DST_TIME "DST"
#define D_EMULATION "Emulazione"
#define D_ENABLED "Abilitato"
-#define D_ERASE "Erase"
-#define D_ERROR "Error"
+#define D_ERASE "Cancellare"
+#define D_ERROR "Errore"
#define D_FAHRENHEIT "Fahrenheit"
#define D_FAILED "Fallito"
-#define D_FALLBACK "Fallback"
+#define D_FALLBACK "Riserva"
#define D_FALLBACK_TOPIC "Topic Riserva"
-#define D_FALSE "False"
+#define D_FALSE "Falso"
#define D_FILE "File"
#define D_FREE_MEMORY "Memoria Libera"
#define D_GAS "Gas"
#define D_GATEWAY "Gateway"
#define D_GROUP "Gruppo"
#define D_HOST "Host"
-#define D_HOSTNAME "Hostname"
+#define D_HOSTNAME "Nome Host"
#define D_HUMIDITY "Umidita'"
#define D_ILLUMINANCE "Illuminazione"
#define D_IMMEDIATE "immediato" // Button immediate
-#define D_INDEX "Index"
+#define D_INDEX "Indice"
#define D_INFO "Info"
#define D_INITIALIZED "Inizializzato"
#define D_IP_ADDRESS "Indirizzo IP"
#define D_LIGHT "Luce"
#define D_LWT "LWT"
-#define D_MODULE "Module"
+#define D_MODULE "Modulo"
#define D_MQTT "MQTT"
#define D_MULTI_PRESS "multi-pressione"
#define D_NOISE "Rumore"
@@ -115,10 +115,10 @@
#define D_PRESSUREATSEALEVEL "Pressione al livello del mare"
#define D_PROGRAM_FLASH_SIZE "Dimensione Flash Programma"
#define D_PROGRAM_SIZE "Dimensione Programma"
-#define D_PROJECT "Project"
+#define D_PROJECT "Progetto"
#define D_RECEIVED "Ricevuto"
#define D_RESTART "Riavvio"
-#define D_RESTARTING "Restarting"
+#define D_RESTARTING "Riavviando"
#define D_RESTART_REASON "Causa Riavvio"
#define D_RESTORE "ripristino"
#define D_RETAINED "salvato"
@@ -130,8 +130,8 @@
#define D_STOP "Stop"
#define D_SUBNET_MASK "Maschera sottorete"
#define D_SUBSCRIBE_TO "Sottoscrivi a"
-#define D_SUCCESSFUL "Successful"
-#define D_TEMPERATURE "Temperature"
+#define D_SUCCESSFUL "Riuscito"
+#define D_TEMPERATURE "Temperatura"
#define D_TO "a"
#define D_TOGGLE "Toggle"
#define D_TOPIC "Topic"
@@ -143,13 +143,13 @@
#define D_USER "Utente"
#define D_UTC_TIME "UTC"
#define D_UV_LEVEL "Livello UV"
-#define D_VERSION "Version"
+#define D_VERSION "Versione"
#define D_VOLTAGE "Tensione"
#define D_WARMLIGHT "Calda"
#define D_WEB_SERVER "Web Server"
// sonoff.ino
-#define D_WARNING_MINIMAL_VERSION "WARNING This version does not support persistent settings"
+#define D_WARNING_MINIMAL_VERSION "ATTENZIONE Questa versione non supporta il salvataggio delle impostazioni"
#define D_LEVEL_10 "level 1-0"
#define D_LEVEL_01 "level 0-1"
#define D_SERIAL_LOGGING_DISABLED "Log seriale disabilitato"
@@ -387,9 +387,9 @@
#define D_SHT1X_FOUND "SHT1X trovato"
// xsns_18_pms5003.ino
-#define D_STANDARD_CONCENTRATION "Standard Concentration"
-#define D_ENVIRONMENTAL_CONCENTRATION "Environmental Concentration"
-#define D_PARTICALS_BEYOND "Particals beyond"
+#define D_STANDARD_CONCENTRATION "Concentrazione Standard"
+#define D_ENVIRONMENTAL_CONCENTRATION "Concentrazione Ambientale"
+#define D_PARTICALS_BEYOND "Particelle oltre"
// sonoff_template.h
// Max string length is 8 characters including suffixes
diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h
index d6a7389dc..2186a1aff 100644
--- a/sonoff/sonoff.h
+++ b/sonoff/sonoff.h
@@ -85,6 +85,8 @@ typedef unsigned long power_t; // Power (Relay) type
#define INPUT_BUFFER_SIZE 250 // Max number of characters in (serial) command buffer
#define CMDSZ 24 // Max number of characters in command
#define TOPSZ 100 // Max number of characters in topic string
+#define LOGSZ 400 // Max number of characters in log
+#define MIN_MESSZ 893 // Min number of characters in MQTT message
#ifdef USE_MQTT_TLS
#define MAX_LOG_LINES 10 // Max number of lines in weblog
#else
@@ -124,6 +126,8 @@ enum LedStateOptions {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQ
enum EmulationOptions {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX};
+enum TopicOptions { CMND, STAT, TELE, nu1, RESULT_OR_CMND, RESULT_OR_STAT, RESULT_OR_TELE };
+
enum ButtonStates {PRESSED, NOT_PRESSED};
enum SettingsParmaIndex {P_HOLD_TIME, P_MAX_POWER_RETRY, P_MAX_PARAM8};
@@ -137,7 +141,7 @@ enum LichtSubtypes {LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_R
enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX};
enum XsnsFunctions {FUNC_INIT, FUNC_EVERY_50_MSECOND, FUNC_EVERY_SECOND, FUNC_PREP_BEFORE_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_APPEND, FUNC_SAVE_BEFORE_RESTART,
- FUNC_COMMAND, FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_CONNECTED, FUNC_MQTT_DATA, FUNC_SET_POWER, FUNC_SHOW_SENSOR};
+ FUNC_COMMAND, FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA, FUNC_SET_POWER, FUNC_SHOW_SENSOR};
const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 };
diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino
index 6be6edc11..51552591b 100644
--- a/sonoff/sonoff.ino
+++ b/sonoff/sonoff.ino
@@ -19,13 +19,13 @@
/*====================================================
Prerequisites:
- Change libraries/PubSubClient/src/PubSubClient.h
- #define MQTT_MAX_PACKET_SIZE 512
+ #define MQTT_MAX_PACKET_SIZE 1000
- Select IDE Tools - Flash Mode: "DOUT"
- Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/
-#define VERSION 0x050B0102 // 5.11.1b
+#define VERSION 0x050B0103 // 5.11.1c
// Location specific includes
#include "sonoff.h" // Enumaration used in user_config.h
@@ -37,10 +37,12 @@
// Libraries
#include // MQTT
+
// Max message size calculated by PubSubClient is (MQTT_MAX_PACKET_SIZE < 5 + 2 + strlen(topic) + plength)
-#if (MQTT_MAX_PACKET_SIZE -TOPSZ -7) < MESSZ // If the max message size is too small, throw an error at compile time. See PubSubClient.cpp line 359
- #error "MQTT_MAX_PACKET_SIZE is too small in libraries/PubSubClient/src/PubSubClient.h, increase it to at least 512"
+#if (MQTT_MAX_PACKET_SIZE -TOPSZ -7) < MIN_MESSZ // If the max message size is too small, throw an error at compile time. See PubSubClient.cpp line 359
+ #error "MQTT_MAX_PACKET_SIZE is too small in libraries/PubSubClient/src/PubSubClient.h, increase it to at least 1000"
#endif
+
#include // RTC, Energy, OSWatch
#include // MQTT, Ota, WifiManager
#include // MQTT, Ota
@@ -192,8 +194,13 @@ char my_version[33]; // Composed version string
char my_hostname[33]; // Composed Wifi hostname
char mqtt_client[33]; // Composed MQTT Clientname
char serial_in_buffer[INPUT_BUFFER_SIZE + 2]; // Receive buffer
-char mqtt_data[MESSZ + TOPSZ]; // MQTT publish buffer (MESSZ) and web page ajax buffer (MESSZ + TOPSZ)
-char log_data[TOPSZ + MESSZ]; // Logging
+
+//char mqtt_data[MESSZ + TOPSZ]; // MQTT publish buffer (MESSZ) and web page ajax buffer (MESSZ + TOPSZ)
+char mqtt_data[MESSZ]; // MQTT publish buffer and web page ajax buffer
+
+//char log_data[TOPSZ + MESSZ]; // Logging
+char log_data[LOGSZ]; // Logging
+
String web_log[MAX_LOG_LINES]; // Web log buffer
String backlog[MAX_BACKLOG]; // Command backlog
@@ -227,6 +234,10 @@ void GetMqttClient(char* output, const char* input, byte size)
void GetTopic_P(char *stopic, byte prefix, char *topic, const char* subtopic)
{
+ /* prefix 0 = Cmnd
+ prefix 1 = Stat
+ prefix 2 = Tele
+ */
char romram[CMDSZ];
String fulltopic;
@@ -350,18 +361,28 @@ void MqttSubscribe(char *topic)
void MqttPublishDirect(const char* topic, boolean retained)
{
+ char sretained[CMDSZ];
+ char slog_type[10];
+
+ sretained[0] = '\0';
+ snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_RESULT));
+
if (Settings.flag.mqtt_enabled) {
- mqtt_data[MESSZ -1] = '\0';
if (MqttClient.publish(topic, mqtt_data, retained)) {
- snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MQTT "%s = %s%s"), topic, mqtt_data, (retained) ? " (" D_RETAINED ")" : "");
-// MqttClient.loop(); // Do not use here! Will block previous publishes
- } else {
- snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_RESULT "%s = %s"), topic, mqtt_data);
+ snprintf_P(slog_type, sizeof(slog_type), PSTR(D_LOG_MQTT));
+ if (retained) {
+ snprintf_P(sretained, sizeof(sretained), PSTR(" (" D_RETAINED ")"));
+ }
}
- } else {
- snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_RESULT "%s = %s"), strrchr(topic,'/')+1, mqtt_data);
}
+ snprintf_P(log_data, sizeof(log_data), PSTR("%s%s = %s"), slog_type, (Settings.flag.mqtt_enabled) ? topic : strrchr(topic,'/')+1, mqtt_data);
+ if (strlen(log_data) >= (sizeof(log_data) - strlen(sretained) -1)) {
+ log_data[sizeof(log_data) - strlen(sretained) -5] = '\0';
+ snprintf_P(log_data, sizeof(log_data), PSTR("%s ..."), log_data);
+ }
+ snprintf_P(log_data, sizeof(log_data), PSTR("%s%s"), log_data, sretained);
+
AddLog(LOG_LEVEL_INFO);
if (Settings.ledstate &0x04) {
blinks++;
@@ -421,11 +442,11 @@ void MqttPublishPowerState(byte device)
device = 1;
}
GetPowerDevice(scommand, device, sizeof(scommand));
- GetTopic_P(stopic, 1, Settings.mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT);
+ GetTopic_P(stopic, STAT, Settings.mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, scommand, GetStateText(bitRead(power, device -1)));
MqttPublish(stopic);
- GetTopic_P(stopic, 1, Settings.mqtt_topic, scommand);
+ GetTopic_P(stopic, STAT, Settings.mqtt_topic, scommand);
snprintf_P(mqtt_data, sizeof(mqtt_data), GetStateText(bitRead(power, device -1)));
MqttPublish(stopic, Settings.flag.mqtt_power_retain);
}
@@ -440,7 +461,7 @@ void MqttPublishPowerBlinkState(byte device)
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"" D_JSON_BLINK " %s\"}"),
GetPowerDevice(scommand, device, sizeof(scommand)), GetStateText(bitRead(blink_mask, device -1)));
- MqttPublishPrefixTopic_P(5, S_RSLT_POWER);
+ MqttPublishPrefixTopic_P(RESULT_OR_STAT, S_RSLT_POWER);
}
void MqttConnected()
@@ -451,15 +472,15 @@ void MqttConnected()
// Satisfy iobroker (#299)
mqtt_data[0] = '\0';
- MqttPublishPrefixTopic_P(0, S_RSLT_POWER);
+ MqttPublishPrefixTopic_P(CMND, S_RSLT_POWER);
- GetTopic_P(stopic, 0, Settings.mqtt_topic, PSTR("#"));
+ GetTopic_P(stopic, CMND, Settings.mqtt_topic, PSTR("#"));
MqttSubscribe(stopic);
if (strstr(Settings.mqtt_fulltopic, MQTT_TOKEN_TOPIC) != NULL) {
- GetTopic_P(stopic, 0, Settings.mqtt_grptopic, PSTR("#"));
+ GetTopic_P(stopic, CMND, Settings.mqtt_grptopic, PSTR("#"));
MqttSubscribe(stopic);
fallback_topic_flag = 1;
- GetTopic_P(stopic, 0, mqtt_client, PSTR("#"));
+ GetTopic_P(stopic, CMND, mqtt_client, PSTR("#"));
fallback_topic_flag = 0;
MqttSubscribe(stopic);
}
@@ -470,24 +491,23 @@ void MqttConnected()
if (mqtt_connection_flag) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_MODULE "\":\"%s\",\"" D_JSON_VERSION "\":\"%s\",\"" D_JSON_FALLBACKTOPIC "\":\"%s\",\"" D_CMND_GROUPTOPIC "\":\"%s\"}"),
my_module.name, my_version, mqtt_client, Settings.mqtt_grptopic);
- MqttPublishPrefixTopic_P(2, PSTR(D_RSLT_INFO "1"));
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "1"));
#ifdef USE_WEBSERVER
if (Settings.webserver) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_WEBSERVER_MODE "\":\"%s\",\"" D_CMND_HOSTNAME "\":\"%s\",\"" D_CMND_IPADDRESS "\":\"%s\"}"),
(2 == Settings.webserver) ? D_ADMIN : D_USER, my_hostname, WiFi.localIP().toString().c_str());
- MqttPublishPrefixTopic_P(2, PSTR(D_RSLT_INFO "2"));
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "2"));
}
#endif // USE_WEBSERVER
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_RESTARTREASON "\":\"%s\"}"),
(GetResetReason() == "Exception") ? ESP.getResetInfo().c_str() : GetResetReason().c_str());
- MqttPublishPrefixTopic_P(2, PSTR(D_RSLT_INFO "3"));
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "3"));
if (Settings.tele_period) {
tele_period = Settings.tele_period -9;
}
status_update_timer = 2;
-#ifdef USE_DOMOTICZ
- DomoticzSetUpdateTimer(2);
-#endif // USE_DOMOTICZ
+
+ XdrvCall(FUNC_MQTT_INIT);
}
mqtt_connection_flag = 0;
}
@@ -540,7 +560,7 @@ void MqttReconnect()
#endif // USE_MQTT_TLS
MqttClient.setServer(Settings.mqtt_host, Settings.mqtt_port);
- GetTopic_P(stopic, 2, Settings.mqtt_topic, S_LWT);
+ GetTopic_P(stopic, TELE, Settings.mqtt_topic, S_LWT);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_OFFLINE);
char *mqtt_user = NULL;
@@ -647,7 +667,7 @@ boolean MqttCommand(boolean grpflg, char *type, uint16_t index, char *dataBuf, u
strlcpy(stemp1, (1 == payload) ? MQTT_FULLTOPIC : dataBuf, sizeof(stemp1));
if (strcmp(stemp1, Settings.mqtt_fulltopic)) {
snprintf_P(mqtt_data, sizeof(mqtt_data), (Settings.flag.mqtt_offline) ? S_OFFLINE : "");
- MqttPublishPrefixTopic_P(2, PSTR(D_LWT), true); // Offline or remove previous retained topic
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic
strlcpy(Settings.mqtt_fulltopic, stemp1, sizeof(Settings.mqtt_fulltopic));
restart_flag = 2;
}
@@ -683,7 +703,7 @@ boolean MqttCommand(boolean grpflg, char *type, uint16_t index, char *dataBuf, u
strlcpy(stemp1, (1 == payload) ? MQTT_TOPIC : dataBuf, sizeof(stemp1));
if (strcmp(stemp1, Settings.mqtt_topic)) {
snprintf_P(mqtt_data, sizeof(mqtt_data), (Settings.flag.mqtt_offline) ? S_OFFLINE : "");
- MqttPublishPrefixTopic_P(2, PSTR(D_LWT), true); // Offline or remove previous retained topic
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic
strlcpy(Settings.mqtt_topic, stemp1, sizeof(Settings.mqtt_topic));
restart_flag = 2;
}
@@ -738,7 +758,7 @@ boolean MqttCommand(boolean grpflg, char *type, uint16_t index, char *dataBuf, u
if ((payload >= 0) && (payload <= 1)) {
if (!payload) {
for(i = 1; i <= devices_present; i++) { // Clear MQTT retain in broker
- GetTopic_P(stemp1, 1, Settings.mqtt_topic, GetPowerDevice(scommand, i, sizeof(scommand)));
+ GetTopic_P(stemp1, STAT, Settings.mqtt_topic, GetPowerDevice(scommand, i, sizeof(scommand)));
mqtt_data[0] = '\0';
MqttPublish(stemp1, Settings.flag.mqtt_power_retain);
}
@@ -751,8 +771,8 @@ boolean MqttCommand(boolean grpflg, char *type, uint16_t index, char *dataBuf, u
if ((payload >= 0) && (payload <= 1)) {
if (!payload) {
mqtt_data[0] = '\0';
- MqttPublishPrefixTopic_P(2, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
- MqttPublishPrefixTopic_P(2, PSTR(D_RSLT_ENERGY), Settings.flag.mqtt_sensor_retain);
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_ENERGY), Settings.flag.mqtt_sensor_retain);
}
Settings.flag.mqtt_sensor_retain = payload;
}
@@ -1095,9 +1115,9 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len)
jsflg = 1;
snprintf_P(stemp1, sizeof(stemp1), kModules[i].name);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"%d (%s)\""), mqtt_data, i +1, stemp1);
- if ((strlen(mqtt_data) > 300) || (i == MAXMODULE -1)) {
+ if ((strlen(mqtt_data) > (LOGSZ - TOPSZ)) || (i == MAXMODULE -1)) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s]}"), mqtt_data);
- MqttPublishPrefixTopic_P(5, type);
+ MqttPublishPrefixTopic_P(RESULT_OR_STAT, type);
jsflg = 0;
lines++;
}
@@ -1144,9 +1164,9 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len)
jsflg = 1;
snprintf_P(stemp1, sizeof(stemp1), kSensors[i]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"%d (%s)\""), mqtt_data, i, stemp1);
- if ((strlen(mqtt_data) > 300) || (i == GPIO_SENSOR_END -1)) {
+ if ((strlen(mqtt_data) > (LOGSZ - TOPSZ)) || (i == GPIO_SENSOR_END -1)) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s]}"), mqtt_data);
- MqttPublishPrefixTopic_P(5, type);
+ MqttPublishPrefixTopic_P(RESULT_OR_STAT, type);
jsflg = 0;
lines++;
}
@@ -1508,7 +1528,7 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len)
type = (char*)topicBuf;
}
if (mqtt_data[0] != '\0') {
- MqttPublishPrefixTopic_P(5, type);
+ MqttPublishPrefixTopic_P(RESULT_OR_STAT, type);
}
fallback_topic_flag = 0;
}
@@ -1535,7 +1555,7 @@ boolean send_button_power(byte key, byte device, byte state)
if (!key && (device > devices_present)) {
device = 1;
}
- GetTopic_P(stopic, 0, key_topic, GetPowerDevice(scommand, device, sizeof(scommand), key));
+ GetTopic_P(stopic, CMND, key_topic, GetPowerDevice(scommand, device, sizeof(scommand), key));
if (9 == state) {
mqtt_data[0] = '\0';
} else {
@@ -1859,11 +1879,11 @@ void PerformEverySecond()
mqtt_data[0] = '\0';
MqttShowState();
- MqttPublishPrefixTopic_P(2, PSTR(D_RSLT_STATE));
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_STATE));
mqtt_data[0] = '\0';
if (MqttShowSensor()) {
- MqttPublishPrefixTopic_P(2, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
}
}
@@ -1876,7 +1896,7 @@ void PerformEverySecond()
latest_uptime_flag = false;
uptime++;
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\",\"" D_JSON_UPTIME "\":%d}"), GetDateAndTime().c_str(), uptime);
- MqttPublishPrefixTopic_P(2, PSTR(D_RSLT_UPTIME));
+ MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_UPTIME));
}
if ((3 == RtcTime.minute) && !latest_uptime_flag) {
latest_uptime_flag = true;
@@ -2287,7 +2307,7 @@ void StateLoop()
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR(D_JSON_FAILED " %s"), ESPhttpUpdate.getLastErrorString().c_str());
}
restart_flag = 2; // Restart anyway to keep memory clean webserver
- MqttPublishPrefixTopic_P(1, PSTR(D_CMND_UPGRADE));
+ MqttPublishPrefixTopic_P(STAT, PSTR(D_CMND_UPGRADE));
}
}
break;
diff --git a/sonoff/sonoff_post.h b/sonoff/sonoff_post.h
index 1ab165587..855914a12 100644
--- a/sonoff/sonoff_post.h
+++ b/sonoff/sonoff_post.h
@@ -52,6 +52,9 @@ void WifiWpsStatusCallback(wps_cb_status status);
#ifdef USE_DOMOTICZ
#undef USE_DOMOTICZ // Disable Domoticz
#endif
+#ifdef USE_HOME_ASSISTANT
+#undef USE_HOME_ASSISTANT // Disable Home Assistant
+#endif
//#ifdef USE_WEBSERVER
//#undef USE_WEBSERVER // Disable Webserver
//#endif
@@ -100,7 +103,9 @@ void WifiWpsStatusCallback(wps_cb_status status);
#endif
#ifndef MESSZ
-#define MESSZ 405 // Max number of characters in JSON message string (6 x DS18x20 sensors)
+//#define MESSZ 405 // Max number of characters in JSON message string (6 x DS18x20 sensors)
+//#define MESSZ 893 // Max number of characters in JSON message string (Hass discovery and nice MQTT_MAX_PACKET_SIZE = 1000)
+#define MESSZ (MQTT_MAX_PACKET_SIZE -TOPSZ -7) // Max number of characters in JSON message string (6 x DS18x20 sensors)
#endif
#include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h
index 07d51b157..7e180ddf8 100644
--- a/sonoff/sonoff_template.h
+++ b/sonoff/sonoff_template.h
@@ -501,7 +501,7 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
GPIO_REL1, // GPIO15 Relay (0 = Off, 1 = On)
0, 0
},
- { "WeMos D1 mini", // WeMos and NodeMCU hardware (ESP8266)
+ { "Generic", // Any ESP8266/ESP8285 device like WeMos and NodeMCU hardware (ESP8266)
GPIO_USER, // GPIO00 D3 Wemos Button Shield
GPIO_USER, // GPIO01 TX Serial RXD
GPIO_USER, // GPIO02 D4 Wemos DHT Shield
@@ -861,6 +861,30 @@ const mytmplt kModules[MAXMODULE] PROGMEM = {
0, 0, 0
}
+ { "SMPW701E", // SM-PW701E WLAN Socket (#1190)
+ 0, 0, 0, 0,
+ GPIO_LED1_INV, // GPIO04 Blue Led (0 = On, 1 = Off)
+ 0, // GPIO05 IR or RF receiver (optional)
+ 0, 0, 0, 0, 0, 0, // Flash connection
+ GPIO_REL1, // GPIO12 Relay and Red Led (0 = Off, 1 = On)
+ GPIO_KEY1, // GPIO13 Button
+ 0, 0, 0, 0
+ }
+
+ { "SWA1", // Smart Plugs (ESP8266)
+ 0,
+ GPIO_USER, // GPIO01
+ 0,
+ GPIO_USER, // GPIO03
+ GPIO_LED1_INV, // GPIO04 Blue LED
+ GPIO_REL1, // GPIO05 Red LED and relay
+ 0, 0, 0, 0, 0, 0, // Flash connection
+ 0,
+ GPIO_KEY1, // GPIO13 Button (normally GPIO00)
+ GPIO_USER, // GPIO14
+ 0, 0, 0
+ }
+
*/
#endif // _SONOFF_TEMPLATE_H_
\ No newline at end of file
diff --git a/sonoff/support.ino b/sonoff/support.ino
index 08476b2c9..3bf651662 100644
--- a/sonoff/support.ino
+++ b/sonoff/support.ino
@@ -333,7 +333,6 @@ char* GetPowerDevice(char* dest, uint8_t idx, size_t size)
\*********************************************************************************************/
#define WIFI_CONFIG_SEC 180 // seconds before restart
-#define WIFI_MANAGER_SEC 180 // seconds before restart
#define WIFI_CHECK_SEC 20 // seconds
#define WIFI_RETRY_SEC 30 // seconds
@@ -361,7 +360,7 @@ int WifiGetRssiAsQuality(int rssi)
boolean WifiConfigCounter()
{
if (wifi_config_counter) {
- wifi_config_counter = WIFI_MANAGER_SEC;
+ wifi_config_counter = WIFI_CONFIG_SEC;
}
return (wifi_config_counter);
}
diff --git a/sonoff/user_config.h b/sonoff/user_config.h
index d35e643d6..471e912a1 100644
--- a/sonoff/user_config.h
+++ b/sonoff/user_config.h
@@ -31,6 +31,7 @@
// -- Localization --------------------------------
//#define MY_LANGUAGE de-DE // German in Germany
//#define MY_LANGUAGE en-GB // English in Great Britain. Enabled by Default
+//#define MY_LANGUAGE es-AR // Spanish in Argentina
//#define MY_LANGUAGE fr-FR // French in France
//#define MY_LANGUAGE it-IT // Italian in Italy
//#define MY_LANGUAGE nl-NL // Dutch in the Netherlands
@@ -118,6 +119,10 @@
#define DOMOTICZ_OUT_TOPIC "domoticz/out" // Domoticz Output Topic
#define DOMOTICZ_UPDATE_TIMER 0 // [DomoticzUpdateTimer] Send relay status (0 = disable, 1 - 3600 seconds) (Optional)
+// -- MQTT - Home Assistant Discovery -------------
+#define USE_HOME_ASSISTANT // Enable Home Assistant Discovery (+1k4 code)
+ #define HOME_ASSISTANT_DISCOVERY_PREFIX "homeassistant" // Home Assistant discovery prefix
+
// -- HTTP ----------------------------------------
#define USE_WEBSERVER // Enable web server and wifi manager (+66k code, +8k mem) - Disable by //
#define WEB_SERVER 2 // [WebServer] Web server (0 = Off, 1 = Start as User, 2 = Start as Admin)
@@ -179,7 +184,7 @@
#define USE_SHT3X // Add I2C code for SHT3x sensor (+0k6 code)
#define USE_HTU // Add I2C code for HTU21/SI7013/SI7020/SI7021 sensor (+1k5 code)
#define USE_BMP // Add I2C code for BMP085/BMP180/BMP280/BME280 sensor (+4k code)
-// #define USE_BME680 // Add additional support for BME680 sensor using Adafruit Sensor and BME680 libraries (+6k code)
+ #define USE_BME680 // Add additional support for BME680 sensor using Adafruit Sensor and BME680 libraries (+6k code)
#define USE_BH1750 // Add I2C code for BH1750 sensor (+0k5 code)
// #define USE_VEML6070 // Add I2C code for VEML6070 sensor (+0k5 code)
// #define USE_TSL2561 // Add I2C code for TSL2561 sensor using library Adafruit TSL2561 Arduino (+1k2 code)
diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino
index 4537978e9..fa0f7dec0 100644
--- a/sonoff/webserver.ino
+++ b/sonoff/webserver.ino
@@ -37,7 +37,7 @@ const char HTTP_HEAD[] PROGMEM =
"