diff --git a/README.md b/README.md index 3e87b01cc..1a402bf58 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.1c** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. +Current version is **5.11.1d** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. ### ATTENTION All versions diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 7f23be9cc..ada35af7a 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,12 @@ -/* 5.11.1c +/* 5.11.1d + * Add locale Decimal Separator to Web sensor page + * Add command State to retrieve device state information (same data as teleperiod state and status 11 in slightly different JSON format) + * Extent state information with Light parameters + * Fix IRSend parameter translation (#1636) + * Add optional login to Webserver AP mode (#1587, #1635) + * Fix BME680 teleperiod resistance measuring (#1647) + * + * 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 diff --git a/sonoff/i18n.h b/sonoff/i18n.h index bcdf337ac..cecb050d0 100644 --- a/sonoff/i18n.h +++ b/sonoff/i18n.h @@ -166,6 +166,7 @@ #define D_STATUS9_MARGIN "PTH" #define D_STATUS10_SENSOR "SNS" #define D_STATUS11_STATUS "STS" +#define D_CMND_STATE "State" #define D_CMND_POWER "Power" #define D_CMND_POWERONSTATE "PowerOnState" #define D_CMND_PULSETIME "PulseTime" @@ -255,7 +256,18 @@ // Commands xdrv_02_irremote.ino #define D_CMND_IRSEND "IRSend" + #define D_JSON_INVALID_JSON "Invalid JSON" + #define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocol not supported" + #define D_JSON_IR_PROTOCOL "PROTOCOL" + #define D_JSON_IR_BITS "BITS" + #define D_JSON_IR_DATA "DATA" #define D_CMND_IRHVAC "IRHVAC" + #define D_JSON_IRHVAC_VENDOR "VENDOR" + #define D_JSON_IRHVAC_POWER "POWER" + #define D_JSON_IRHVAC_MODE "MODE" + #define D_JSON_IRHVAC_FANSPEED "FANSPEED" + #define D_JSON_IRHVAC_TEMP "TEMP" +#define D_JSON_IRRECEIVED "IrReceived" // Commands xdrv_03_energy.ino #define D_CMND_POWERLOW "PowerLow" diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h index 244a036b4..933f98c28 100644 --- a/sonoff/language/de-DE.h +++ b/sonoff/language/de-DE.h @@ -335,19 +335,6 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 Antwortpakete gesendet" -// xdrv_02_irremote.ino -#define D_JSON_INVALID_JSON "ungültiger JSON" -#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protokoll nicht unterstützt" -#define D_JSON_IR_PROTOCOL "PROTOKOLL" -#define D_JSON_IR_BITS "BITS" -#define D_JSON_IR_DATA "DATEN" -#define D_JSON_IRHVAC_VENDOR "HERSTELLER" -#define D_JSON_IRHVAC_POWER "STROM" -#define D_JSON_IRHVAC_MODE "MODUS" -#define D_JSON_IRHVAC_FANSPEED "LÜFTERGESCHWINDIGKEIT" -#define D_JSON_IRHVAC_TEMP "TEMPERATUR" -#define D_JSON_IRRECEIVED "IR empfangen" - // xdrv_05_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz parameters" #define D_DOMOTICZ_IDX "Idx" diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h index c8ef6f223..e1f301f7b 100644 --- a/sonoff/language/en-GB.h +++ b/sonoff/language/en-GB.h @@ -335,19 +335,6 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 response packets sent" -// xdrv_02_irremote.ino -#define D_JSON_INVALID_JSON "Invalid JSON" -#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocol not supported" -#define D_JSON_IR_PROTOCOL "PROTOCOL" -#define D_JSON_IR_BITS "BITS" -#define D_JSON_IR_DATA "DATA" -#define D_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 "Domoticz parameters" #define D_DOMOTICZ_IDX "Idx" diff --git a/sonoff/language/es-AR.h b/sonoff/language/es-AR.h index 99e142d4c..fbbbddd89 100644 --- a/sonoff/language/es-AR.h +++ b/sonoff/language/es-AR.h @@ -335,19 +335,6 @@ #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" diff --git a/sonoff/language/fr-FR.h b/sonoff/language/fr-FR.h index bfb31d519..1fb0ee418 100644 --- a/sonoff/language/fr-FR.h +++ b/sonoff/language/fr-FR.h @@ -335,19 +335,6 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 paquets response envoyés" -// xdrv_02_irremote.ino -#define D_JSON_INVALID_JSON "JSON Invalide" -#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocole non supporté" -#define D_JSON_IR_PROTOCOL "PROTOCOL" -#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 "Paramètres Domoticz" #define D_DOMOTICZ_IDX "Idx" diff --git a/sonoff/language/it-IT.h b/sonoff/language/it-IT.h index be9e97911..ae6a297f8 100644 --- a/sonoff/language/it-IT.h +++ b/sonoff/language/it-IT.h @@ -335,19 +335,6 @@ #define D_HUE_POST_ARGS "Hue POST argomenti" #define D_3_RESPONSE_PACKETS_SENT "3 pacchetti di risposta inviati" -// xdrv_02_irremote.ino -#define D_JSON_INVALID_JSON "JSON non valido" -#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocollo non supportato" -#define D_JSON_IR_PROTOCOL "PROTOCOL" -#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 "Parametri Domoticz" #define D_DOMOTICZ_IDX "Idx" diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h index 9850c8b0e..41d204baa 100644 --- a/sonoff/language/nl-NL.h +++ b/sonoff/language/nl-NL.h @@ -335,19 +335,6 @@ #define D_HUE_POST_ARGS "Hue POST argumenten" #define D_3_RESPONSE_PACKETS_SENT "3 antwoord paketten verstuurd" -// xdrv_02_irremote.ino -#define D_JSON_INVALID_JSON "Ongeldig JSON" -#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocol wordt niet ondersteund" -#define D_JSON_IR_PROTOCOL "PROTOCOL" -#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 "Domoticz parameters" #define D_DOMOTICZ_IDX "Idx" diff --git a/sonoff/language/pl-PL.h b/sonoff/language/pl-PL.h index 79e2afbe5..84462cfe4 100644 --- a/sonoff/language/pl-PL.h +++ b/sonoff/language/pl-PL.h @@ -335,19 +335,6 @@ #define D_HUE_POST_ARGS "Hue POST args" #define D_3_RESPONSE_PACKETS_SENT "3 pakiety odpowiedzi wysylane" -// xdrv_02_irremote.ino -#define D_JSON_INVALID_JSON "Invalid JSON" -#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protokol nie jest obslugiwany" -#define D_JSON_IR_PROTOCOL "PROTOCOL" -#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 "Parametry Domoticz" #define D_DOMOTICZ_IDX "Idx" diff --git a/sonoff/language/zh-CN.h b/sonoff/language/zh-CN.h index c1a5ec75b..cba6130d1 100644 --- a/sonoff/language/zh-CN.h +++ b/sonoff/language/zh-CN.h @@ -335,19 +335,6 @@ #define D_HUE_POST_ARGS "Hue POST 参数" #define D_3_RESPONSE_PACKETS_SENT "3 请求包发送" -// xdrv_02_irremote.ino -#define D_JSON_INVALID_JSON "无效的JSON" -#define D_JSON_PROTOCOL_NOT_SUPPORTED "协议不支持" -#define D_JSON_IR_PROTOCOL "协议" -#define D_JSON_IR_BITS "BITS" -#define D_JSON_IR_DATA "数据" -#define D_JSON_IRHVAC_VENDOR "供应商" -#define D_JSON_IRHVAC_POWER "电源" -#define D_JSON_IRHVAC_MODE "模式" -#define D_JSON_IRHVAC_FANSPEED "风扇转速" -#define D_JSON_IRHVAC_TEMP "温度" -#define D_JSON_IRRECEIVED "IrReceived" - // xdrv_05_domoticz.ino #define D_DOMOTICZ_PARAMETERS "Domoticz 设置" #define D_DOMOTICZ_IDX "Idx" diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h index 2186a1aff..fa105ef93 100644 --- a/sonoff/sonoff.h +++ b/sonoff/sonoff.h @@ -86,7 +86,7 @@ typedef unsigned long power_t; // Power (Relay) type #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 +#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 @@ -145,4 +145,10 @@ enum XsnsFunctions {FUNC_INIT, FUNC_EVERY_50_MSECOND, FUNC_EVERY_SECOND, FUNC_PR const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 }; +/*********************************************************************************************\ + * Extern global variables +\*********************************************************************************************/ + +extern uint8_t light_device; // Light device number + #endif // _SONOFF_H_ \ No newline at end of file diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 51552591b..ead6053c1 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,7 +25,7 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x050B0103 // 5.11.1c +#define VERSION 0x050B0104 // 5.11.1d // Location specific includes #include "sonoff.h" // Enumaration used in user_config.h @@ -67,7 +67,7 @@ #include "settings.h" enum TasmotaCommands { - CMND_BACKLOG, CMND_DELAY, CMND_POWER, CMND_STATUS, CMND_POWERONSTATE, CMND_PULSETIME, + CMND_BACKLOG, CMND_DELAY, CMND_POWER, CMND_STATUS, CMND_STATE, CMND_POWERONSTATE, CMND_PULSETIME, CMND_BLINKTIME, CMND_BLINKCOUNT, CMND_SAVEDATA, CMND_SETOPTION, CMND_TEMPERATURE_RESOLUTION, CMND_HUMIDITY_RESOLUTION, CMND_PRESSURE_RESOLUTION, CMND_POWER_RESOLUTION, CMND_VOLTAGE_RESOLUTION, CMND_CURRENT_RESOLUTION, CMND_ENERGY_RESOLUTION, CMND_MODULE, CMND_MODULES, CMND_GPIO, CMND_GPIOS, CMND_PWM, CMND_PWMFREQUENCY, CMND_PWMRANGE, CMND_COUNTER, CMND_COUNTERTYPE, @@ -77,7 +77,7 @@ enum TasmotaCommands { CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE, CMND_CFGDUMP, CMND_I2CSCAN, CMND_INA219MODE, CMND_EXCEPTION }; const char kTasmotaCommands[] PROGMEM = - D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_STATUS "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|" + D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_STATUS "|" D_CMND_STATE "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|" D_CMND_BLINKTIME "|" D_CMND_BLINKCOUNT "|" D_CMND_SAVEDATA "|" D_CMND_SETOPTION "|" D_CMND_TEMPERATURE_RESOLUTION "|" D_CMND_HUMIDITY_RESOLUTION "|" D_CMND_PRESSURE_RESOLUTION "|" D_CMND_POWER_RESOLUTION "|" D_CMND_VOLTAGE_RESOLUTION "|" D_CMND_CURRENT_RESOLUTION "|" D_CMND_ENERGY_RESOLUTION "|" D_CMND_MODULE "|" D_CMND_MODULES "|" D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_COUNTER "|" D_CMND_COUNTERTYPE "|" @@ -194,13 +194,8 @@ 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 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 @@ -317,7 +312,7 @@ void SetDevicePower(power_t rpower) } } - XdrvSetPower(bitRead(rpower, devices_present -1)); + XdrvSetPower(rpower); if ((SONOFF_DUAL == Settings.module) || (CH4 == Settings.module)) { Serial.write(0xA0); @@ -938,6 +933,10 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len) fallback_topic_flag = 0; return; } + else if (CMND_STATE == command_code) { + mqtt_data[0] = '\0'; + MqttShowState(); + } else if ((CMND_POWERONSTATE == command_code) && (Settings.module != MOTOR)) { /* 0 = Keep relays off after power on * 1 = Turn relays on after power on, if PulseTime set wait for PulseTime seconds, and turn relays off @@ -1796,9 +1795,15 @@ void MqttShowState() dtostrfd((double)ESP.getVcc()/1000, 3, stemp1); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_VCC "\":%s"), mqtt_data, stemp1); #endif + for (byte i = 0; i < devices_present; i++) { - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":\"%s\""), mqtt_data, GetPowerDevice(stemp1, i +1, sizeof(stemp1)), GetStateText(bitRead(power, i))); + if (i == light_device -1) { + LightState(1); + } else { + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":\"%s\""), mqtt_data, GetPowerDevice(stemp1, i +1, sizeof(stemp1)), GetStateText(bitRead(power, i))); + } } + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_WIFI "\":{\"" D_JSON_AP "\":%d,\"" D_JSON_SSID "\":\"%s\",\"" D_JSON_RSSI "\":%d,\"" D_JSON_APMAC_ADDRESS "\":\"%s\"}}"), mqtt_data, Settings.sta_active +1, Settings.sta_ssid[Settings.sta_active], WifiGetRssiAsQuality(WiFi.RSSI()), WiFi.BSSIDstr().c_str()); } diff --git a/sonoff/support.ino b/sonoff/support.ino index 3bf651662..48b218386 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -148,83 +148,9 @@ Decoding 14 results * General \*********************************************************************************************/ -char* _dtostrf(double number, unsigned char prec, char *s, bool i18n) +char* dtostrfd(double number, unsigned char prec, char *s) { - bool negative = false; - - if (isnan(number)) { - strcpy_P(s, PSTR("nan")); - return s; - } - if (isinf(number)) { - strcpy_P(s, PSTR("inf")); - return s; - } - char decimal = '.'; - if (i18n) { - decimal = D_DECIMAL_SEPARATOR[0]; - } - - char* out = s; - - // Handle negative numbers - if (number < 0.0) { - negative = true; - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - // I optimized out most of the divisions - double rounding = 2.0; - for (uint8_t i = 0; i < prec; ++i) { - rounding *= 10.0; - } - rounding = 1.0 / rounding; - number += rounding; - - // Figure out how big our number really is - double tenpow = 1.0; - int digitcount = 1; - while (number >= 10.0 * tenpow) { - tenpow *= 10.0; - digitcount++; - } - number /= tenpow; - - // Handle negative sign - if (negative) { - *out++ = '-'; - } - - // Print the digits, and if necessary, the decimal point - digitcount += prec; - int8_t digit = 0; - while (digitcount-- > 0) { - digit = (int8_t)number; - if (digit > 9) { - digit = 9; // insurance - } - *out++ = (char)('0' | digit); - if ((digitcount == prec) && (prec > 0)) { - *out++ = decimal; - } - number -= digit; - number *= 10.0; - } - - // make sure the string is terminated - *out = 0; - return s; -} - -char* dtostrfd(double number, unsigned char prec, char *s) // Always decimal dot -{ - return _dtostrf(number, prec, s, 0); -} - -char* dtostrfi(double number, unsigned char prec, char *s) // Use localized decimal dot -{ - return _dtostrf(number, prec, s, 1); + return dtostrf(number, 1, prec, s); } boolean ParseIp(uint32_t* addr, const char* str) diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index fa0f7dec0..1af4f1ee4 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -96,7 +96,11 @@ const char HTTP_HEAD[] PROGMEM = #ifdef BE_MINIMAL "