From 1538d30c96a542d6126a6827ac94d45411058ffe Mon Sep 17 00:00:00 2001 From: arendst Date: Thu, 18 Jan 2018 16:19:28 +0100 Subject: [PATCH] v5.11.1c - Fixes and experimental Hass Discovery 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) --- README.md | 2 +- lib/PubSubClient-2.6.09/src/PubSubClient.h | 3 +- platformio.ini | 77 ++-- sonoff/_releasenotes.ino | 18 +- sonoff/language/es-AR.h | 469 +++++++++++++++++++++ sonoff/language/fr-FR.h | 14 +- sonoff/language/it-IT.h | 36 +- sonoff/sonoff.h | 6 +- sonoff/sonoff.ino | 104 +++-- sonoff/sonoff_post.h | 7 +- sonoff/sonoff_template.h | 26 +- sonoff/support.ino | 3 +- sonoff/user_config.h | 7 +- sonoff/webserver.ino | 20 +- sonoff/xdrv_01_light.ino | 27 +- sonoff/xdrv_02_irremote.ino | 2 +- sonoff/xdrv_03_energy.ino | 15 +- sonoff/xdrv_04_snfbridge.ino | 6 +- sonoff/xdrv_05_domoticz.ino | 8 +- sonoff/xdrv_07_home_assistant.ino | 148 +++++++ sonoff/xsns_05_ds18b20.ino | 2 +- 21 files changed, 858 insertions(+), 142 deletions(-) create mode 100644 sonoff/language/es-AR.h create mode 100644 sonoff/xdrv_07_home_assistant.ino 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 = "