diff --git a/CHANGELOG.md b/CHANGELOG.md index 8883fb3bc..db69cc688 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. ## [11.0.0.7] 20220413 ### Added - HX711 command ``Sensor34 10 0|1|`` to set HX711 fixed tare (0 = use auto tare, 1 = use calibrated tare, Any other value is user selected tare) +- Command ``SetOption138 1`` to switch GUI energy multi-column layout from left/center (0) to right (1) align (#15342) ### Changed - HX711 commands ``Sensor34 11 `` and ``Sensor34 12 `` to use HX711 absolute weight conversion (#15292) @@ -34,6 +35,7 @@ All notable changes to this project will be documented in this file. - Support for improv as used by esp-web-tools - Command ``IfxSensor 1`` to send non-teleperiod data to influxdb - ESP32 Support for OpenHASP v1.0 by Stephan Hadinger (#15307) +- Command ``SetOption137 1`` to avoid MQTT publish of defined Tuya CMDs if SO66 is active (#15267) ### Changed - Remove support for Internet Explorer by allowing ECMAScript6 syntax using less JavaScript code bytes (#15280) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ac063d856..e24b5325a 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -107,6 +107,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ### Added - Command ``SetOption135 1`` to disable LVGL splash screen - Command ``SetOption136 1`` to disable single sensor reports from Tuya devices while keeping teleperiod reports [#15216](https://github.com/arendst/Tasmota/issues/15216) +- Command ``SetOption137 1`` to avoid MQTT publish of defined Tuya CMDs if SO66 is active [#15267](https://github.com/arendst/Tasmota/issues/15267) +- Command ``SetOption138 1`` to switch GUI energy multi-column layout from left/center (0) to right (1) align [#15342](https://github.com/arendst/Tasmota/issues/15342) - Command ``SspmMap 0`` to reset Sonoff SPM default mapping - Command ``TcpConnect `` to add client connection mode [#14874](https://github.com/arendst/Tasmota/issues/14874) - Command ``RfTimeout 100..60000`` to disable duplicate RfReceive. Default 1000 [#15061](https://github.com/arendst/Tasmota/issues/15061) @@ -132,6 +134,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - ESP32 TasmotaSerial uart mapping to support multiple ``begin()`` and implement ``getUart()`` [#14981](https://github.com/arendst/Tasmota/issues/14981) ### Breaking Changed +- Remove support for Internet Explorer by allowing ECMAScript6 syntax using less JavaScript code bytes [#15280](https://github.com/arendst/Tasmota/issues/15280) ### Changed - Adafruit BusIO library from v1.0.10 to v1.11.0 @@ -139,7 +142,6 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Sonoff SPM increase max number of relays supported to 32 (8 SPM-4Relay modules) - Extent number of pulsetimers from 8 to 32 [#8266](https://github.com/arendst/Tasmota/issues/8266) - Consolidate three RTC chip drivers (DS3231, BM8563, PCF85363) into one driver updating RTC as soon as possible after restart -- Remove support for Internet Explorer by allowing ECMAScript6 syntax using less JavaScript code bytes [#15280](https://github.com/arendst/Tasmota/issues/15280) - DS3231 I2C address define ``USE_RTC_ADDR`` into ``DS3231_ADDRESS`` - Display of energy values in GUI use columns when define ``USE_ENERGY_COLUMN_GUI`` is enabled (default) - ESP8266 Shrinked tasmota-minimal.bin by removing all commands except ``Upgrade``, ``Upload``, ``OtaUrl``, ``Seriallog``, ``Weblog`` and ``Restart`` diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 43cdcbd49..47bcce2ae 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -870,7 +870,7 @@ const char HTTP_SNS_DISTANCE_CM[] PROGMEM = "{s}%s " D_DISTANCE "{ const char HTTP_SNS_HALL_EFFECT[] PROGMEM = "{s}%s " D_HALL_EFFECT "{m}%d" "{e}"; const char HTTP_SNS_VOLTAGE[] PROGMEM = "{s}" D_VOLTAGE "{m}%s " D_UNIT_VOLT "{e}"; const char HTTP_SNS_CURRENT[] PROGMEM = "{s}" D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}"; -const char HTTP_SNS_POWER[] PROGMEM = "{s}" D_POWERUSAGE "{m}%s " D_UNIT_WATT "{e}"; +const char HTTP_SNS_POWER[] PROGMEM = "{s}" D_POWERUSAGE_ACTIVE "{m}%s " D_UNIT_WATT "{e}"; const char HTTP_SNS_ENERGY_TOTAL[] PROGMEM = "{s}" D_ENERGY_TOTAL "{m}%s " D_UNIT_KILOWATTHOUR "{e}"; const char HTTP_SNS_PH[] PROGMEM = "{s}%s " D_PH "{m}%s " "{e}"; const char HTTP_SNS_MQ[] PROGMEM = "{s}" D_MQ"-%s" "{m}%s " D_UNIT_PARTS_PER_MILLION "{e}"; diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 238b593ca..131766dc5 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index abea293a6..5db48b41a 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index d93f10651..1cc32d0de 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index c01f174f8..cb86d734e 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index cf3ef4931..aa7bf0833 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 472474e41..ac8f8cf76 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index f076bb083..6ed3ac42b 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 7c483afc0..0a0441bec 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 04ecce171..ed4abb8d6 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 0d5ddf7a4..173ed83d3 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 4ce249b76..fbf54cdea 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 1342ae7bf..309df4520 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v10.1.0.6 - Last update 09.04.2022 + * Updated until v11.0.0.7 - Last update 10.04.2022 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 28b2c3429..9495e22dc 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index edcf0d41f..bdc85bb8e 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index f9db22207..b956b6d68 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 921f11098..f2ddd1fc8 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 7ac2efe39..0829c29be 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 4d4fd355f..c78ebfc71 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 9b5d30470..984186a1c 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index f6082af6b..da5bde22f 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 0afd1b382..bf2bf0822 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index b44b39c99..157b3b65f 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 601f33dc7..a46af7a69 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 2c4356408..8320cb52c 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 2a659da88..c5b52f69f 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 9fb378d58..5b0ff6e43 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -615,6 +615,7 @@ #define D_SENSOR_DHT11 "DHT11" #define D_SENSOR_AM2301 "AM2301" #define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" diff --git a/tasmota/settings.h b/tasmota/settings.h index b179e0e14..f53be14d6 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -167,7 +167,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t display_no_splash : 1; // bit 21 (v11.0.0.2) - SetOption135 - (Display & LVGL) forece disbabling default splash screen uint32_t tuyasns_no_immediate : 1; // bit 22 (v11.0.0.4) - SetOption136 - (TuyaSNS) When ON disable publish single SNS value on Tuya Receive (keep Teleperiod) uint32_t tuya_exclude_from_mqtt : 1; // bit 23 (v11.0.0.5) - SetOption137 - (Tuya) When Set, avoid the (MQTT-) publish of defined Tuya CMDs (see xdrv_16_tuyamcu.ino) if SetOption66 is active - uint32_t spare24 : 1; // bit 24 + uint32_t gui_table_align : 1; // bit 24 (v11.0.0.7) - SetOption138 - (GUI) Align (energy) table values left (0) or right (1) uint32_t spare25 : 1; // bit 25 uint32_t spare26 : 1; // bit 26 uint32_t spare27 : 1; // bit 27 diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino index d271de1cc..04d44e78b 100644 --- a/tasmota/support_wifi.ino +++ b/tasmota/support_wifi.ino @@ -116,7 +116,18 @@ void WifiConfig(uint8_t type) } } +#ifdef CONFIG_IDF_TARGET_ESP32C3 + // https://github.com/espressif/arduino-esp32/issues/6264#issuecomment-1040147331 + // There's an include for this but it doesn't define the function if it doesn't think it needs it, so manually declare the function +extern "C" void phy_bbpll_en_usb(bool en); +#endif // CONFIG_IDF_TARGET_ESP32C3 + void WifiSetMode(WiFiMode_t wifi_mode) { +#ifdef CONFIG_IDF_TARGET_ESP32C3 + // https://github.com/espressif/arduino-esp32/issues/6264#issuecomment-1094376906 + // This brings the USB serial-jtag back to life. Suggest doing this immediately after wifi startup. + phy_bbpll_en_usb(true); +#endif // CONFIG_IDF_TARGET_ESP32C3 if (WiFi.getMode() == wifi_mode) { return; } if (wifi_mode != WIFI_OFF) { diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 8790a91a2..dac7e3416 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -185,6 +185,7 @@ enum UserSelectablePins { GPIO_BL6523_TX, GPIO_BL6523_RX, // BL6523 based Watt meter Serial interface GPIO_ADE7880_IRQ, // ADE7880 IRQ GPIO_RESET, // Generic reset + GPIO_MS01, // Sonoff MS01 Moisture Sensor 1wire interface GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -409,6 +410,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_BL6523_TX "|" D_SENSOR_BL6523_RX "|" D_SENSOR_ADE7880_IRQ "|" D_SENSOR_RESET "|" + D_SENSOR_MS01 "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -599,6 +601,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_DHT11), // DHT11 AGPIO(GPIO_DHT22), // DHT21, DHT22, AM2301, AM2302, AM2321 AGPIO(GPIO_SI7021), // iTead SI7021 + AGPIO(GPIO_MS01), // Sonoff MS01 AGPIO(GPIO_DHT11_OUT), // Pseudo Single wire DHT11, DHT21, DHT22, AM2301, AM2302, AM2321 #endif #ifdef USE_DS18x20 diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino index 13c124e5d..ff665caf7 100644 --- a/tasmota/xdrv_03_energy.ino +++ b/tasmota/xdrv_03_energy.ino @@ -178,14 +178,24 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t } } #ifdef USE_ENERGY_COLUMN_GUI - if ((Energy.phase_count > 1) && single) { // Need to set colspan so need a new column - ext_snprintf_P(result, TOPSZ, PSTR("%*_f"), Energy.phase_count, resolution, &input[0]); + ext_snprintf_P(result, TOPSZ *2, PSTR("")); // Skip first column + if ((Energy.phase_count > 1) && single) { // Need to set colspan so need new columns + // 1.23  + // 1.23  + // 1.23  + ext_snprintf_P(result, TOPSZ *2, PSTR("%s%*_f "), + result, (Energy.phase_count *2) -1, (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("center"), resolution, &input[0]); } else { - ext_snprintf_P(result, TOPSZ, PSTR("")); // Skip first column + // 1.23  + // 1.23 1.23  + // 1.23 1.23 1.23  + // 1.23 1.23 1.23 1.23  for (uint32_t i = 0; i < Energy.phase_count; i++) { - ext_snprintf_P(result, TOPSZ, PSTR("%s%*_f"), result, resolution, &input[i]); + ext_snprintf_P(result, TOPSZ *2, PSTR("%s%*_f "), + result, (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("left"), resolution, &input[i]); } } + ext_snprintf_P(result, TOPSZ *2, PSTR("%s"), result); #else // not USE_ENERGY_COLUMN_GUI uint32_t index = (single) ? 1 : Energy.phase_count; // 1,2,3 result[0] = '\0'; @@ -1111,9 +1121,9 @@ void EnergyShow(bool json) { energy_tariff = true; } - char value_chr[TOPSZ]; // Used by EnergyFormatIndex - char value2_chr[TOPSZ]; - char value3_chr[TOPSZ]; + char value_chr[TOPSZ * 2]; // Used by EnergyFormatIndex + char value2_chr[TOPSZ * 2]; + char value3_chr[TOPSZ * 2]; if (json) { bool show_energy_period = (0 == TasmotaGlobal.tele_period); @@ -1232,25 +1242,17 @@ void EnergyShow(bool json) { #ifdef USE_WEBSERVER } else { #ifdef USE_ENERGY_COLUMN_GUI - // Need a new table supporting more columns - WSContentSend_P(PSTR("{t}{s}")); // First column is empty ({t} = , {s} =
) - - // Calculate nice inter-column spacing without using table spacing or column padding - uint32_t len = 6; // Minimum width is 60px - for (uint32_t i = 0; i < Energy.phase_count; i++) { - // Using active power expecting to be the largest number not counting increasing total energy - uint32_t len_new = ext_snprintf_P(value_chr, sizeof(value_chr), PSTR("%*_f"), Settings->flag2.wattage_resolution, &Energy.active_power[i]); - if (len_new > len) { len = len_new; } -// len_new = ext_snprintf_P(value_chr, sizeof(value_chr), PSTR("%*_f"), Settings->flag2.energy_resolution, &Energy.total[i]); -// if (len_new > len) { len = len_new; } - } - uint32_t width = len * 10; // Default 60px. Every additonal character adds 10px - + // Need a new table supporting more columns using empty columns (with   in data rows) as easy column spacing + // {s}Head1{e} + // {s}Head1Head2{e} + // {s}Head1Head2Head3{e} + // {s}Head1Head2Head3Head4{e} + WSContentSend_P(PSTR("

{t}{s}")); // First column is empty ({t} = , {s} = "), (no_label)?"":"L", (no_label)?"":itoa(i +1, value_chr, 10)); } - WSContentSend_P(PSTR(") + WSContentSend_P(PSTR(") #endif // USE_ENERGY_COLUMN_GUI if (Energy.voltage_available) { WSContentSend_PD(HTTP_SNS_VOLTAGE, WebEnergyFormat(value_chr, Energy.voltage, Settings->flag2.voltage_resolution, Energy.voltage_common)); @@ -1280,7 +1282,7 @@ void EnergyShow(bool json) { } #ifdef USE_ENERGY_COLUMN_GUI XnrgCall(FUNC_WEB_COL_SENSOR); - WSContentSend_P(PSTR("
) bool no_label = Energy.voltage_common || (1 == Energy.phase_count); for (uint32_t i = 0; i < Energy.phase_count; i++) { - WSContentSend_P(PSTR("%s%s"), width, (no_label)?"":"L", (no_label)?"":itoa(i +1, value_chr, 10)); + WSContentSend_P(PSTR("%s%s{e}")); // Last column is units ({e} =
{e}")); // Last column is units ({e} =
{t}")); // {t} = - Define for next FUNC_WEB_SENSOR + WSContentSend_P(PSTR("

{t}")); // {t} = - Define for next FUNC_WEB_SENSOR #endif // USE_ENERGY_COLUMN_GUI XnrgCall(FUNC_WEB_SENSOR); #endif // USE_WEBSERVER diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 9538c71ac..623d671c0 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -20,6 +20,7 @@ //#define USE_SONOFF_SPM #ifdef ESP32 +#ifdef USE_ENERGY_SENSOR #ifdef USE_SONOFF_SPM /*********************************************************************************************\ * Sonoff Stackable Power Manager @@ -1891,34 +1892,22 @@ bool SSPMButton(void) { /*********************************************************************************************/ -const uint16_t SSPM_SIZE = 128; +const uint16_t SSPM_SIZE = 300; char* SSPMEnergyFormat(char* result, float* input, uint32_t resolution, uint8_t* indirect, uint8_t offset, uint32_t count) { - result[0] = '\0'; + ext_snprintf_P(result, SSPM_SIZE, PSTR("")); // Skip first column + // "), result, resolution, &input[indirect[offset +i]]); + ext_snprintf_P(result, SSPM_SIZE, PSTR("%s"), + result, (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("left"), resolution, &input[indirect[offset +i]]); } - ext_snprintf_P(result, SSPM_SIZE, PSTR("%s -const char HTTP_SSPM_CURRENT[] PROGMEM = - "{s}" D_CURRENT "%s" D_UNIT_AMPERE "{e}"; -const char HTTP_SSPM_POWER[] PROGMEM = - "{s}" D_POWERUSAGE_ACTIVE "%s" D_UNIT_WATT "{e}"; -const char HTTP_SSPM_POWER2[] PROGMEM = - "{s}" D_POWERUSAGE_APPARENT "%s" D_UNIT_VA "{e}" - "{s}" D_POWERUSAGE_REACTIVE "%s" D_UNIT_VAR "{e}" - "{s}" D_POWER_FACTOR "%s{e}"; -const char HTTP_SSPM_ENERGY[] PROGMEM = - "{s}" D_ENERGY_TODAY "%s" D_UNIT_KILOWATTHOUR "{e}" - "{s}" D_ENERGY_YESTERDAY "%s" D_UNIT_KILOWATTHOUR "{e}" - "{s}" D_ENERGY_TOTAL "%s" D_UNIT_KILOWATTHOUR "{e}"; -#endif // USE_WEBSERVER - void SSPMEnergyShow(bool json) { if (!TasmotaGlobal.devices_present) { return; } // Not ready yet @@ -1992,24 +1981,29 @@ void SSPMEnergyShow(bool json) { uint32_t offset = (Sspm->rotate >> 2) * 4; uint32_t count = index - offset; if (count > 4) { count = 4; } - WSContentSend_P(PSTR("
1.23  + // 1.23 1.23  + // 1.23 1.23 1.23  + // 1.23 1.23 1.23 1.23  for (uint32_t i = 0; i < count; i++) { - ext_snprintf_P(result, SSPM_SIZE, PSTR("%s%*_f%*_f "), result); + ext_snprintf_P(result, SSPM_SIZE, PSTR("%s"), result); return result; } -#ifdef USE_WEBSERVER -const char HTTP_SSPM_VOLTAGE[] PROGMEM = - "{s}" D_VOLTAGE "%s" D_UNIT_VOLT "{e}"; // {s} =
, {m} = , {e} =
{t}{s}")); // First column is empty ({t} = , {s} = ) + // {s}
) - for (uint32_t i = 0; i < count; i++) { - WSContentSend_P(PSTR("L%d"), relay[offset +i]); - } - WSContentSend_P(PSTR("{e}")); // Last column is units ({e} =
Head1{e} + // {s}Head1Head2{e} + // {s}Head1Head2Head3{e} + // {s}Head1Head2Head3Head4{e} char value_chr[SSPM_SIZE]; - WSContentSend_PD(HTTP_SSPM_VOLTAGE, SSPMEnergyFormat(value_chr, Sspm->voltage[0], Settings->flag2.voltage_resolution, indirect, offset, count)); - WSContentSend_PD(HTTP_SSPM_CURRENT, SSPMEnergyFormat(value_chr, Sspm->current[0], Settings->flag2.current_resolution, indirect, offset, count)); - WSContentSend_PD(HTTP_SSPM_POWER, SSPMEnergyFormat(value_chr, Sspm->active_power[0], Settings->flag2.wattage_resolution, indirect, offset, count)); + WSContentSend_P(PSTR("

{t}{s}")); // First column is empty ({t} = , {s} = "), (no_label)?"":"L", (no_label)?"":itoa(relay[offset +i], value_chr, 10)); + } + WSContentSend_P(PSTR(") + WSContentSend_PD(HTTP_SNS_VOLTAGE, SSPMEnergyFormat(value_chr, Sspm->voltage[0], Settings->flag2.voltage_resolution, indirect, offset, count)); + WSContentSend_PD(HTTP_SNS_CURRENT, SSPMEnergyFormat(value_chr, Sspm->current[0], Settings->flag2.current_resolution, indirect, offset, count)); + WSContentSend_PD(HTTP_SNS_POWER, SSPMEnergyFormat(value_chr, Sspm->active_power[0], Settings->flag2.wattage_resolution, indirect, offset, count)); char valu2_chr[SSPM_SIZE]; char valu3_chr[SSPM_SIZE]; - WSContentSend_PD(HTTP_SSPM_POWER2, SSPMEnergyFormat(value_chr, Sspm->apparent_power[0], Settings->flag2.wattage_resolution, indirect, offset, count), - SSPMEnergyFormat(valu2_chr, Sspm->reactive_power[0], Settings->flag2.wattage_resolution, indirect, offset, count), - SSPMEnergyFormat(valu3_chr, Sspm->power_factor[0], 2, indirect, offset, count)); - WSContentSend_PD(HTTP_SSPM_ENERGY, SSPMEnergyFormat(value_chr, Sspm->energy_today[0], Settings->flag2.energy_resolution, indirect, offset, count), - SSPMEnergyFormat(valu2_chr, Sspm->Settings.energy_yesterday[0], Settings->flag2.energy_resolution, indirect, offset, count), - SSPMEnergyFormat(valu3_chr, Sspm->energy_total[0], Settings->flag2.energy_resolution, indirect, offset, count)); - WSContentSend_P(PSTR("
) + bool no_label = false; + for (uint32_t i = 0; i < count; i++) { + WSContentSend_P(PSTR("%s%s{e}")); // Last column is units ({e} =
{t}")); // {t} = - Define for next FUNC_WEB_SENSOR + WSContentSend_PD(HTTP_ENERGY_SNS1, SSPMEnergyFormat(value_chr, Sspm->apparent_power[0], Settings->flag2.wattage_resolution, indirect, offset, count), + SSPMEnergyFormat(valu2_chr, Sspm->reactive_power[0], Settings->flag2.wattage_resolution, indirect, offset, count), + SSPMEnergyFormat(valu3_chr, Sspm->power_factor[0], 2, indirect, offset, count)); + WSContentSend_PD(HTTP_ENERGY_SNS2, SSPMEnergyFormat(value_chr, Sspm->energy_today[0], Settings->flag2.energy_resolution, indirect, offset, count), + SSPMEnergyFormat(valu2_chr, Sspm->Settings.energy_yesterday[0], Settings->flag2.energy_resolution, indirect, offset, count), + SSPMEnergyFormat(valu3_chr, Sspm->energy_total[0], Settings->flag2.energy_resolution, indirect, offset, count)); + WSContentSend_P(PSTR("

{t}")); // {t} = - Define for next FUNC_WEB_SENSOR } #endif // USE_WEBSERVER } @@ -2298,4 +2292,5 @@ bool Xdrv86(uint8_t function) { } #endif // USE_SONOFF_SPM +#endif // USE_ENERGY_SENSOR #endif // ESP32 diff --git a/tasmota/xsns_06_dht.ino b/tasmota/xsns_06_dht.ino index bd6937f19..c8b209100 100644 --- a/tasmota/xsns_06_dht.ino +++ b/tasmota/xsns_06_dht.ino @@ -87,6 +87,9 @@ bool DhtRead(uint32_t sensor) { case GPIO_SI7021: // iTead SI7021 delayMicroseconds(500); break; + case GPIO_MS01: // Sonoff MS01 + delayMicroseconds(450); + break; } if (!dht_dual_mode) { @@ -101,6 +104,7 @@ bool DhtRead(uint32_t sensor) { delayMicroseconds(50); break; case GPIO_SI7021: // iTead SI7021 + case GPIO_MS01: // Sonoff MS01 delayMicroseconds(30); // See: https://github.com/letscontrolit/ESPEasy/issues/1798 and 20210524: https://github.com/arendst/Tasmota/issues/12180 break; } @@ -152,14 +156,39 @@ bool DhtRead(uint32_t sensor) { */ break; case GPIO_DHT22: // DHT21, DHT22, AM2301, AM2302, AM2321 - case GPIO_SI7021: // iTead SI7021 + case GPIO_SI7021: { // iTead SI7021 humidity = ((dht_data[0] << 8) | dht_data[1]) * 0.1; // DHT21/22 (Adafruit): int16_t temp16 = dht_data[2] << 8 | dht_data[3]; // case 1 : signed 16 bits - if ((dht_data[2] & 0xF0) == 0x80) // case 2 : negative when high nibble = 0x80 + if ((dht_data[2] & 0xF0) == 0x80) { // case 2 : negative when high nibble = 0x80 temp16 = -(0xFFF & temp16); + } temperature = 0.1f * temp16; break; + } + case GPIO_MS01: { // Sonoff MS01 + int32_t voltage = ((dht_data[0] << 8) | dht_data[1]); + +// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DHT: MS01 %d"), voltage); + + // Rough approximate of soil moisture % (based on values observed in the eWeLink app) + // Observed values are available here: https://gist.github.com/minovap/654cdcd8bc37bb0d2ff338f8d144a509 + + float x; + if (voltage < 15037) { + x = voltage - 15200; + humidity = - FastPrecisePowf(0.0024 * x, 3) - 0.0004 * x + 20.1; + } + else if (voltage < 22300) { + humidity = - 0.00069 * voltage + 30.6; + } + else { + x = voltage - 22800; + humidity = - FastPrecisePowf(0.00046 * x, 3) - 0.0004 * x + 15; + } + temperature = 0; + break; + } } if (isnan(temperature) || isnan(humidity)) { AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT "Invalid reading")); @@ -178,7 +207,8 @@ bool DhtRead(uint32_t sensor) { /********************************************************************************************/ bool DhtPinState() { - if ((XdrvMailbox.index >= AGPIO(GPIO_DHT11)) && (XdrvMailbox.index <= AGPIO(GPIO_SI7021))) { + if (((XdrvMailbox.index >= AGPIO(GPIO_DHT11)) && (XdrvMailbox.index <= AGPIO(GPIO_SI7021))) || + (XdrvMailbox.index == AGPIO(GPIO_MS01))) { if (dht_sensors < DHT_MAX_SENSORS) { Dht[dht_sensors].pin = XdrvMailbox.payload; Dht[dht_sensors].type = BGPIO(XdrvMailbox.index); @@ -232,7 +262,19 @@ void DhtEverySecond(void) { void DhtShow(bool json) { for (uint32_t i = 0; i < dht_sensors; i++) { - TempHumDewShow(json, ((0 == TasmotaGlobal.tele_period) && (0 == i)), Dht[i].stype, Dht[i].t, Dht[i].h); + if (GPIO_MS01 == Dht[i].type) { + if (json) { + ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_HUMIDITY "\":%*_f}"), Dht[i].stype, Settings->flag2.humidity_resolution, &Dht[i].h); +#ifdef USE_WEBSERVER + } else { + char parameter[FLOATSZ]; + dtostrfd(Dht[i].h, Settings->flag2.humidity_resolution, parameter); + WSContentSend_PD(HTTP_SNS_HUM, Dht[i].stype, parameter); +#endif // USE_WEBSERVER + } + } else { + TempHumDewShow(json, ((0 == TasmotaGlobal.tele_period) && (0 == i)), Dht[i].stype, Dht[i].t, Dht[i].h); + } } } diff --git a/tools/lv_gpio/lv_gpio_enum.h b/tools/lv_gpio/lv_gpio_enum.h index ab9b92aeb..19e517add 100644 --- a/tools/lv_gpio/lv_gpio_enum.h +++ b/tools/lv_gpio/lv_gpio_enum.h @@ -59,6 +59,7 @@ RFRECV = GPIO_RFRECV DHT11 = GPIO_DHT11 DHT22 = GPIO_DHT22 SI7021 = GPIO_SI7021 +MS01 = GPIO_MS01 DHT11_OUT = GPIO_DHT11_OUT DSB = GPIO_DSB DSB_OUT = GPIO_DSB_OUT