From c7323eea746bc985906c125d6f6f89e24b3a0ea1 Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Sun, 10 Apr 2022 17:21:38 +0200
Subject: [PATCH 1/8] Initial support for Sonoff MS01
Initial support for Sonoff MS01 (#15335)
---
tasmota/language/af_AF.h | 1 +
tasmota/language/bg_BG.h | 1 +
tasmota/language/cs_CZ.h | 1 +
tasmota/language/de_DE.h | 1 +
tasmota/language/el_GR.h | 1 +
tasmota/language/en_GB.h | 1 +
tasmota/language/es_ES.h | 1 +
tasmota/language/fr_FR.h | 1 +
tasmota/language/fy_NL.h | 1 +
tasmota/language/he_HE.h | 1 +
tasmota/language/hu_HU.h | 1 +
tasmota/language/it_IT.h | 3 ++-
tasmota/language/ko_KO.h | 1 +
tasmota/language/nl_NL.h | 1 +
tasmota/language/pl_PL.h | 1 +
tasmota/language/pt_BR.h | 1 +
tasmota/language/pt_PT.h | 1 +
tasmota/language/ro_RO.h | 1 +
tasmota/language/ru_RU.h | 1 +
tasmota/language/sk_SK.h | 1 +
tasmota/language/sv_SE.h | 1 +
tasmota/language/tr_TR.h | 1 +
tasmota/language/uk_UA.h | 1 +
tasmota/language/vi_VN.h | 1 +
tasmota/language/zh_CN.h | 1 +
tasmota/language/zh_TW.h | 1 +
tasmota/tasmota_template.h | 3 +++
tasmota/xsns_06_dht.ino | 50 +++++++++++++++++++++++++++++++++---
tools/lv_gpio/lv_gpio_enum.h | 1 +
29 files changed, 77 insertions(+), 5 deletions(-)
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/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/xsns_06_dht.ino b/tasmota/xsns_06_dht.ino
index bd6937f19..54f821cab 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
+ uint32_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
From 36bf6c5cc1fa37c90f86636dfe690185fc5a6fbf Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Sun, 10 Apr 2022 17:50:33 +0200
Subject: [PATCH 2/8] Fix MS01 calculation
---
tasmota/xsns_06_dht.ino | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tasmota/xsns_06_dht.ino b/tasmota/xsns_06_dht.ino
index 54f821cab..c8b209100 100644
--- a/tasmota/xsns_06_dht.ino
+++ b/tasmota/xsns_06_dht.ino
@@ -167,7 +167,7 @@ bool DhtRead(uint32_t sensor) {
break;
}
case GPIO_MS01: { // Sonoff MS01
- uint32_t voltage = ((dht_data[0] << 8) | dht_data[1]);
+ int32_t voltage = ((dht_data[0] << 8) | dht_data[1]);
// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DHT: MS01 %d"), voltage);
From 500cc894b51f74f3c8b8d8d15a1bccab376645c0 Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Mon, 11 Apr 2022 16:40:41 +0200
Subject: [PATCH 3/8] Fix USB CDC on ESP32C3
Fix USB CDC on ESP32C3 (https://github.com/espressif/arduino-esp32/issues/6264)
---
tasmota/support_wifi.ino | 11 +++++++++++
1 file changed, 11 insertions(+)
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) {
From 089ace9d358149fec6a99e4f35998bd9bd13c063 Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Mon, 11 Apr 2022 18:33:57 +0200
Subject: [PATCH 4/8] Change energy multicolumn align right
- Add Energy GUI multicolumn fixed inter column space
- Change energy multicolumn alignment from left to right (#15342)
---
tasmota/xdrv_03_energy.ino | 34 +++++++++++++++-------------------
1 file changed, 15 insertions(+), 19 deletions(-)
diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino
index 13c124e5d..506bb0238 100644
--- a/tasmota/xdrv_03_energy.ino
+++ b/tasmota/xdrv_03_energy.ino
@@ -178,14 +178,16 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t
}
}
#ifdef USE_ENERGY_COLUMN_GUI
+ ext_snprintf_P(result, TOPSZ *2, PSTR("")); // Skip first column
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("%s | %*_f | | "), result, (Energy.phase_count *2) -1, resolution, &input[0]);
+ ext_snprintf_P(result, TOPSZ *2, PSTR("%s%*_f | | "), result, (Energy.phase_count *2) -1, resolution, &input[0]);
} else {
- ext_snprintf_P(result, TOPSZ, PSTR("")); // Skip first column
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, 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 +1113,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);
@@ -1233,24 +1235,18 @@ void EnergyShow(bool json) {
} 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
+ // {s} | | Head1 | | {e}
+ // {s} | | Head1 | | Head2 | | {e}
+ // {s} | | Head1 | | Head2 | | Head3 | | {e}
+ WSContentSend_P(PSTR(" |
---|
{t}{s} | | ")); // First column is empty ({t} = , {s} = )
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 | | "), (no_label)?"":"L", (no_label)?"":itoa(i +1, value_chr, 10));
}
- WSContentSend_P(PSTR("{e}")); // Last column is units ({e} = |
)
+ WSContentSend_P(PSTR("{e}")); // Last column is units ({e} = | )
+
#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));
From a4cf02335705ad1adc2bead9b506b2db3a96ab7b Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Tue, 12 Apr 2022 10:22:32 +0200
Subject: [PATCH 5/8] Add command ``SetOption138 1``
Add command ``SetOption138 1`` to switch GUI energy multi-column layout from left/center (0) to right (1) align (#15342)
---
CHANGELOG.md | 2 ++
RELEASENOTES.md | 4 +++-
tasmota/settings.h | 2 +-
tasmota/xdrv_03_energy.ino | 24 +++++++++++++++---------
4 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 349a774d5..7dc3ddfa5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
## [11.0.0.7]
### 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)
@@ -31,6 +32,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 9d64b6a78..fb870429d 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/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/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino
index 506bb0238..d42f12c2d 100644
--- a/tasmota/xdrv_03_energy.ino
+++ b/tasmota/xdrv_03_energy.ino
@@ -178,13 +178,21 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t
}
}
#ifdef USE_ENERGY_COLUMN_GUI
- ext_snprintf_P(result, TOPSZ *2, PSTR("")); // Skip first column
- if ((Energy.phase_count > 1) && single) { // Need to set colspan so need a new column
-// ext_snprintf_P(result, TOPSZ *2, PSTR("%s%*_f | | "), result, (Energy.phase_count *2) -1, resolution, &input[0]);
- ext_snprintf_P(result, TOPSZ *2, PSTR("%s%*_f | | "), result, (Energy.phase_count *2) -1, 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 {
+ // 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 *2, 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);
@@ -1234,19 +1242,17 @@ void EnergyShow(bool json) {
#ifdef USE_WEBSERVER
} else {
#ifdef USE_ENERGY_COLUMN_GUI
- // Need a new table supporting more columns
-
+ // Need a new table supporting more columns using empty columns (with in data rows) as easy column spacing
// {s} | | Head1 | | {e}
// {s} | | Head1 | | Head2 | | {e}
// {s} | | Head1 | | Head2 | | Head3 | | {e}
-
+ // {s} | | Head1 | | Head2 | | Head3 | | Head4 | | {e}
WSContentSend_P(PSTR(" |
{t}{s} | ")); // First column is empty ({t} = , {s} = )
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 | | "), (no_label)?"":"L", (no_label)?"":itoa(i +1, value_chr, 10));
}
WSContentSend_P(PSTR("{e}")); // Last column is units ({e} = |
)
-
#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));
From b8b9afa1a5013021de8530c37875764ba365a9a7 Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Tue, 12 Apr 2022 10:58:02 +0200
Subject: [PATCH 6/8] Add horizontal lines around GUI energy report
---
tasmota/xdrv_03_energy.ino | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino
index d42f12c2d..ff665caf7 100644
--- a/tasmota/xdrv_03_energy.ino
+++ b/tasmota/xdrv_03_energy.ino
@@ -1247,7 +1247,7 @@ void EnergyShow(bool json) {
// {s} | Head1 | | Head2 | | {e}
// {s} | | Head1 | | Head2 | | Head3 | | {e}
// {s} | | Head1 | | Head2 | | Head3 | | Head4 | | {e}
- WSContentSend_P(PSTR(" |
{t}{s} | ")); // First column is empty ({t} = , {s} = )
+ WSContentSend_P(PSTR(" |
---|
{t}{s} | ")); // First column is empty ({t} = , {s} = )
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 | | "), (no_label)?"":"L", (no_label)?"":itoa(i +1, value_chr, 10));
@@ -1282,7 +1282,7 @@ void EnergyShow(bool json) {
}
#ifdef USE_ENERGY_COLUMN_GUI
XnrgCall(FUNC_WEB_COL_SENSOR);
- WSContentSend_P(PSTR("
---|
{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
From 04ccde8aa98f85b4746c4c051fcdd5d00dc03da0 Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Tue, 12 Apr 2022 11:53:36 +0200
Subject: [PATCH 7/8] Align Sonoff SPM GUI with other energy GUI
- Align Sonoff SPM GUI with other energy GUI
- Change GUI Power text to Active Power
---
tasmota/i18n.h | 2 +-
tasmota/xdrv_86_esp32_sonoff_spm.ino | 66 +++++++++++++++-------------
2 files changed, 36 insertions(+), 32 deletions(-)
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/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino
index 9538c71ac..709a8d825 100644
--- a/tasmota/xdrv_86_esp32_sonoff_spm.ino
+++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino
@@ -1891,32 +1891,31 @@ 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
+ // 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 | "), result, resolution, &input[indirect[offset +i]]);
+ ext_snprintf_P(result, SSPM_SIZE, PSTR("%s%*_f | | "),
+ result, (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("left"), resolution, &input[indirect[offset +i]]);
}
- ext_snprintf_P(result, SSPM_SIZE, PSTR("%s"), 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} = |
-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}";
+ "{s}" D_POWERUSAGE_APPARENT "{m}%s" D_UNIT_VA "{e}" // {s} = , {m} = | , {e} = |
+ "{s}" D_POWERUSAGE_REACTIVE "{m}%s" D_UNIT_VAR "{e}"
+ "{s}" D_POWER_FACTOR "{m}%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}";
+ "{s}" D_ENERGY_TODAY "{m}%s" D_UNIT_KILOWATTHOUR "{e}"
+ "{s}" D_ENERGY_YESTERDAY "{m}%s" D_UNIT_KILOWATTHOUR "{e}"
+ "{s}" D_ENERGY_TOTAL "{m}%s" D_UNIT_KILOWATTHOUR "{e}";
#endif // USE_WEBSERVER
void SSPMEnergyShow(bool json) {
@@ -1992,24 +1991,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("
{t}{s}")); // First column is empty ({t} = , {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} = |
)
+ // {s} | Head1 | | {e}
+ // {s} | | Head1 | | Head2 | | {e}
+ // {s} | | Head1 | | Head2 | | Head3 | | {e}
+ // {s} | | Head1 | | Head2 | | Head3 | | Head4 | | {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} = )
+ bool no_label = false;
+ for (uint32_t i = 0; i < count; i++) {
+ WSContentSend_P(PSTR(" | %s%s | | "), (no_label)?"":"L", (no_label)?"":itoa(relay[offset +i], value_chr, 10));
+ }
+ WSContentSend_P(PSTR("{e}")); // Last column is units ({e} = |
)
+ 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("
{t}")); // {t} = - Define for next FUNC_WEB_SENSOR
+ 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("
{t}")); // {t} = - Define for next FUNC_WEB_SENSOR
}
#endif // USE_WEBSERVER
}
From 69750f5c7957d3a607af208e8c1533888d932793 Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Tue, 12 Apr 2022 12:12:13 +0200
Subject: [PATCH 8/8] More SSPM/Energy consolidation
---
tasmota/xdrv_86_esp32_sonoff_spm.ino | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino
index 709a8d825..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
@@ -1907,17 +1908,6 @@ char* SSPMEnergyFormat(char* result, float* input, uint32_t resolution, uint8_t*
return result;
}
-#ifdef USE_WEBSERVER
-const char HTTP_SSPM_POWER2[] PROGMEM =
- "{s}" D_POWERUSAGE_APPARENT "{m}%s" D_UNIT_VA "{e}" // {s} = , {m} = | , {e} = |
- "{s}" D_POWERUSAGE_REACTIVE "{m}%s" D_UNIT_VAR "{e}"
- "{s}" D_POWER_FACTOR "{m}%s{e}";
-const char HTTP_SSPM_ENERGY[] PROGMEM =
- "{s}" D_ENERGY_TODAY "{m}%s" D_UNIT_KILOWATTHOUR "{e}"
- "{s}" D_ENERGY_YESTERDAY "{m}%s" D_UNIT_KILOWATTHOUR "{e}"
- "{s}" D_ENERGY_TOTAL "{m}%s" D_UNIT_KILOWATTHOUR "{e}";
-#endif // USE_WEBSERVER
-
void SSPMEnergyShow(bool json) {
if (!TasmotaGlobal.devices_present) { return; } // Not ready yet
@@ -2007,10 +1997,10 @@ void SSPMEnergyShow(bool json) {
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),
+ 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_SSPM_ENERGY, SSPMEnergyFormat(value_chr, Sspm->energy_today[0], Settings->flag2.energy_resolution, 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
@@ -2302,4 +2292,5 @@ bool Xdrv86(uint8_t function) {
}
#endif // USE_SONOFF_SPM
+#endif // USE_ENERGY_SENSOR
#endif // ESP32