diff --git a/BUILDS.md b/BUILDS.md
index e882329d9..9cf437df2 100644
--- a/BUILDS.md
+++ b/BUILDS.md
@@ -67,6 +67,7 @@
| USE_PZEM_AC | - | - | x | x | x | - | - |
| USE_PZEM_DC | - | - | x | x | x | - | - |
| USE_MCP39F501 | - | x | x | x | x | - | - |
+| USE_SDM72 | - | - | - | - | x | - | - |
| USE_SDM120 | - | - | - | - | x | - | - |
| USE_SDM630 | - | - | - | - | x | - | - |
| USE_DDS2382 | - | - | - | - | x | - | - |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fc723c450..f02a8257f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,9 +3,18 @@ All notable changes to this project will be documented in this file.
## [Unreleased] - Development
-## [9.2.0.6]
+## [9.2.0.7]
+### Added
+- Support for Device Groups Device Map (#10898)
+- Support for Eastron SDM72D-M three phase 100A Modbus energy meter (#10862)
+- Support for Frysk language translations by Christiaan Heerze
+- ESP8266 Fallback to ``*.bin.gz`` binary when OTA upload of ``*.bin`` binary fails
+- Berry language improved Tasmota integration
+- IRremoteESP8266 library from v2.7.14 to v2.7.15
+
+## [9.2.0.6] 20210210
### Changed
-- Removed migration support for versions before v8.1.0 (Doris)
+- Remove support for direct migration from versions before v8.1.0 (Doris)
- ESP32 Increase number of switch GPIOs from 8 to 28
- ESP32 Increase number of interlock groups from 4 to 14
- Increase number of button GPIOs from 4 to 8
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index d129a4697..4645593b6 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -4,6 +4,8 @@
## Migration Information
+**This version removes support for direct migration from versions before v8.1.0 (Doris)**
+
See [migration path](https://tasmota.github.io/docs/Upgrading#migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates:
1. Migrate to **Sonoff-Tasmota 3.9.x**
@@ -38,6 +40,7 @@ For initial configuration this release supports Webserver based **WifiManager**
## Provided Binary Downloads
+### ESP8266 or ESP8285 based
The following binary downloads have been compiled with ESP8266/Arduino library core version **2.7.4.9**.
- **tasmota.bin** = The Tasmota version with most drivers. **RECOMMENDED RELEASE BINARY**
@@ -45,18 +48,37 @@ The following binary downloads have been compiled with ESP8266/Arduino library c
- **tasmota-lite.bin** = The Lite version without most drivers and sensors.
- **tasmota-knx.bin** = The Knx version without some features but adds KNX support.
- **tasmota-sensors.bin** = The Sensors version adds more useful sensors.
-- **tasmota-ir** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features.
+- **tasmota-ir.bin** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features.
- **tasmota-display.bin** = The Display version without Energy Monitoring but adds display support.
- **tasmota-zbbridge.bin** = The dedicated Sonoff Zigbee Bridge version.
- **tasmota-minimal.bin** = The Minimal version allows intermediate OTA uploads to support larger versions and does NOT change any persistent parameter. This version **should NOT be used for initial installation**.
-The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota/release for ESP8266 or http://ota.tasmota.com/tasmota32/release for ESP32. The links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz``
+Above binaries are also available as gzipped version allowing faster uploads.
+
+The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota/release. The links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz``
+
+### ESP32 based
+The following binary downloads have been compiled with ESP32/Arduino library core version **1.0.5-rc6**.
+
+- **tasmota32.bin** = The Tasmota version with most drivers. **RECOMMENDED RELEASE BINARY**
+- **tasmota32-BG.bin** to **tasmota32-TW.bin** = The Tasmota version in different languages.
+- **tasmota32-lite.bin** = The Lite version without most drivers and sensors.
+- **tasmota32-knx.bin** = The Knx version without some features but adds KNX support.
+- **tasmota32-sensors.bin** = The Sensors version adds more useful sensors.
+- **tasmota32-ir.bin** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features.
+- **tasmota32-display.bin** = The Display version without Energy Monitoring but adds display support.
+- **tasmota32-webcam.bin** = The Webcam version adds webcam support.
+- **tasmota32-bluetooth.bin** = The Bluetooth version adds BLE support.
+- **tasmota32-odroidgo.bin** = The Odroid-Go version is specifically tailored to Odroid_go hardware.
+- **tasmota32-core2.bin** = The Core2 version is specifically tailored to M5Stack Core2 hardware.
+
+The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota32/release. The links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota32/release/tasmota32.bin``
[List](MODULES.md) of embedded modules.
[Complete list](BUILDS.md) of available feature and sensors.
-## Changelog v9.2.0.6
+## Changelog v9.2.0.7
### Added
- Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311)
- Command ``L1MusicSync <0|Off>|<1|On>|<2|Toggle>, 1..10, 1..100>`` to control Sonoff L1 Music Sync mode sensitivity and speed [#10722](https://github.com/arendst/Tasmota/issues/10722)
@@ -64,7 +86,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
- Command ``Speed2`` to control a once off fade [#10741](https://github.com/arendst/Tasmota/issues/10741)
- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels [#10311](https://github.com/arendst/Tasmota/issues/10311)
- Command ``SetOption40 0..250`` to disable button functionality if activated for over 0.1 second re-introduced
-- Command ``SetOption43 1..255`` to control Rotary step (#10407)
+- Command ``SetOption43 1..255`` to control Rotary step [#10407](https://github.com/arendst/Tasmota/issues/10407)
- Command ``SetOption118 1`` to move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default [#10353](https://github.com/arendst/Tasmota/issues/10353)
- Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic [#10355](https://github.com/arendst/Tasmota/issues/10355)
- Zigbee command ``SetOption120 1`` or ``ZbEndpointTopic 1`` to add the zigbee endpoint as suffix in topic when using ``SetOption89 1``
@@ -84,6 +106,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
- Support for up to 4 I2C SEESAW_SOIL Capacitance & Temperature sensors by Peter Franck [#10481](https://github.com/arendst/Tasmota/issues/10481)
- Support for TOF10120 time of flight sensor by Cyril Pawelko [#10190](https://github.com/arendst/Tasmota/issues/10190)
- Support for Afrikaans language translations by Christiaan Heerze
+- Support for Frysk language translations by Christiaan Heerze
- Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` [#10301](https://github.com/arendst/Tasmota/issues/10301)
- Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` [#10301](https://github.com/arendst/Tasmota/issues/10301)
- Support for SPI display driver for ST7789 TFT by Gerhard Mutz [#9037](https://github.com/arendst/Tasmota/issues/9037)
@@ -91,6 +114,8 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
- Support for 24/26/32/34 bit RFID Wiegand interface (D0/D1) by Sigurd Leuther [#3647](https://github.com/arendst/Tasmota/issues/3647)
- Support for SM2135 current selection using GPIO ``SM2135 DAT`` index [#10634](https://github.com/arendst/Tasmota/issues/10634)
- Support for Sugar Valley NeoPool Controller by Norbert Richter [#10637](https://github.com/arendst/Tasmota/issues/10637)
+- Support for Device Groups Device Map [#10898](https://github.com/arendst/Tasmota/issues/10898)
+- Support for Eastron SDM72D-M three phase 100A Modbus energy meter [#10862](https://github.com/arendst/Tasmota/issues/10862)
- Support for ESP32 ``Module 3`` Odroid Go 16MB binary tasmota32-odroidgo.bin [#8630](https://github.com/arendst/Tasmota/issues/8630)
- Support for ESP32 ``Module 5`` Wireless Tag Eth01 [#9496](https://github.com/arendst/Tasmota/issues/9496)
- Support for ESP32 ``Module 7`` M5stack core2 16MB binary tasmota32-core2.bin [#10635](https://github.com/arendst/Tasmota/issues/10635)
@@ -100,6 +125,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
- Rule trigger string comparisons for EndsWith ``$>``, StartsWith ``$<`` and Contains ``$|`` [#10538](https://github.com/arendst/Tasmota/issues/10538)
- SPI display driver SSD1331 Color oled by Jeroen Vermeulen [#10376](https://github.com/arendst/Tasmota/issues/10376)
- Compile time option ``USE_MQTT_TLS_DROP_OLD_FINGERPRINT`` to drop old (less secure) TLS fingerprint
+- ESP8266 Fallback to ``*.bin.gz`` binary when OTA upload of ``*.bin`` binary fails
### Breaking Changed
- ESP32 switch from default SPIFFS to default LittleFS file system loosing current (zigbee) files
@@ -114,7 +140,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
- Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS``
### Changed
-- Removed migration support for versions before v8.1.0 (Doris)
+- Remove support for direct migration from versions before v8.1.0 (Doris)
- Command ``Sleep 0`` removes any sleep from wifi modem except when ESP32 BLE is active
- Logging from heap to stack freeing 700 bytes RAM
- Disabled ``USE_LIGHT`` light support for ZBBridge saving 17.6kB [#10374](https://github.com/arendst/Tasmota/issues/10374)
diff --git a/lib/default/Ext-printf/src/ext_printf.cpp b/lib/default/Ext-printf/src/ext_printf.cpp
index cab08a9ff..157b2b30a 100644
--- a/lib/default/Ext-printf/src/ext_printf.cpp
+++ b/lib/default/Ext-printf/src/ext_printf.cpp
@@ -31,6 +31,8 @@
* This will allow to modify it in place and call back printf with altered arguments
\*********************************************************************************************/
+#if defined(__XTENSA__) // this works only for xtensa, other platforms needs va_list to be adapted
+
// This code is heavily inspired by the gcc implementation of va_list
// https://github.com/gcc-mirror/gcc/blob/master/gcc/config/xtensa/xtensa.c
@@ -124,6 +126,18 @@ void * __va_cur_ptr4(va_list &va) {
// >>> Reading a_ptr=0x3FFFFD70 *a_ptr=6
// >>> Reading a_ptr=0x3FFFFD74 *a_ptr=7
// >>> Reading a_ptr=0x3FFFFD78 *a_ptr=8
+#elif defined(__RISC_V__)
+// #define __va_argsiz_tas(t) (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
+#define va_cur_ptr4(va,T) ( (T*) __va_cur_ptr4(va) )
+void * __va_cur_ptr4(va_list &va) {
+ uintptr_t * va_ptr = (uintptr_t*) &va;
+ void * cur_ptr = (void*) *va_ptr;
+ *va_ptr += 4;
+ return cur_ptr;
+}
+#else // __XTENSA__, __RISCV__
+ #error "ext_printf is not suppoerted on this platform"
+#endif // __XTENSA__, __RISCV__
/*********************************************************************************************\
* Genral function to convert u64 to hex
@@ -202,7 +216,6 @@ int32_t ext_vsnprintf_P(char * buf, size_t buf_len, const char * fmt_P, va_list
va_list va_cpy;
va_copy(va_cpy, va);
-#if defined(ESP8266) || defined(ESP32) // this works only for xtensa, other platforms needs va_list to be adapted
// iterate on fmt to extract arguments and patch them in place
char * fmt_cpy = copyStr(fmt_P);
if (fmt_cpy == nullptr) { return 0; }
@@ -362,9 +375,6 @@ int32_t ext_vsnprintf_P(char * buf, size_t buf_len, const char * fmt_P, va_list
}
}
}
-#else // defined(ESP8266) || defined(ESP32)
- #error "ext_printf is not suppoerted on this platform"
-#endif // defined(ESP8266) || defined(ESP32)
// Serial.printf("> format_final=%s\n", fmt_cpy); Serial.flush();
int32_t ret = vsnprintf_P(buf, buf_len, fmt_cpy, va_cpy);
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/.gitignore b/lib/lib_display/Display_Renderer-gemu-1.0/.gitignore
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/.gitignore
rename to lib/lib_display/Display_Renderer-gemu-1.0/.gitignore
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/.travis.yml b/lib/lib_display/Display_Renderer-gemu-1.0/.travis.yml
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/.travis.yml
rename to lib/lib_display/Display_Renderer-gemu-1.0/.travis.yml
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Arduino/epd2in9-demo/epd2in9-demo.ino b/lib/lib_display/Display_Renderer-gemu-1.0/Arduino/epd2in9-demo/epd2in9-demo.ino
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Arduino/epd2in9-demo/epd2in9-demo.ino
rename to lib/lib_display/Display_Renderer-gemu-1.0/Arduino/epd2in9-demo/epd2in9-demo.ino
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Arduino/libraries/readme.txt b/lib/lib_display/Display_Renderer-gemu-1.0/Arduino/libraries/readme.txt
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Arduino/libraries/readme.txt
rename to lib/lib_display/Display_Renderer-gemu-1.0/Arduino/libraries/readme.txt
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/LICENSE b/lib/lib_display/Display_Renderer-gemu-1.0/LICENSE
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/LICENSE
rename to lib/lib_display/Display_Renderer-gemu-1.0/LICENSE
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Makefile b/lib/lib_display/Display_Renderer-gemu-1.0/Makefile
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Makefile
rename to lib/lib_display/Display_Renderer-gemu-1.0/Makefile
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/README.md b/lib/lib_display/Display_Renderer-gemu-1.0/README.md
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/README.md
rename to lib/lib_display/Display_Renderer-gemu-1.0/README.md
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/component.mk b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/component.mk
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/component.mk
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/component.mk
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper-29-ws.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper-29-ws.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper-29-ws.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper-29-ws.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper-29-ws.h b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper-29-ws.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper-29-ws.h
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper-29-ws.h
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper_font.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper_font.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper_font.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper_font.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper_fonts.h b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper_fonts.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper_fonts.h
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper_fonts.h
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font16.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font16.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font16.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font16.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font20.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font20.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font20.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font20.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font8.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font8.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font8.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font8.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/imagedata.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/imagedata.cpp
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/imagedata.cpp
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/imagedata.cpp
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/imagedata.h b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/imagedata.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/imagedata.h
rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/imagedata.h
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/Doxyfile b/lib/lib_display/Display_Renderer-gemu-1.0/docs/Doxyfile
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/Doxyfile
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/Doxyfile
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/Makefile b/lib/lib_display/Display_Renderer-gemu-1.0/docs/Makefile
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/Makefile
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/Makefile
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/README.md b/lib/lib_display/Display_Renderer-gemu-1.0/docs/README.md
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/README.md
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/README.md
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/conf.py b/lib/lib_display/Display_Renderer-gemu-1.0/docs/conf.py
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/conf.py
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/conf.py
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/gen-dxd.py b/lib/lib_display/Display_Renderer-gemu-1.0/docs/gen-dxd.py
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/gen-dxd.py
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/gen-dxd.py
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/index.rst b/lib/lib_display/Display_Renderer-gemu-1.0/docs/index.rst
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/index.rst
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/index.rst
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/link-roles.py b/lib/lib_display/Display_Renderer-gemu-1.0/docs/link-roles.py
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/link-roles.py
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/link-roles.py
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/repo_util.py b/lib/lib_display/Display_Renderer-gemu-1.0/docs/repo_util.py
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/repo_util.py
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/repo_util.py
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/requirements.txt b/lib/lib_display/Display_Renderer-gemu-1.0/docs/requirements.txt
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/requirements.txt
rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/requirements.txt
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/library.properties b/lib/lib_display/Display_Renderer-gemu-1.0/library.properties
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/library.properties
rename to lib/lib_display/Display_Renderer-gemu-1.0/library.properties
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/README.md b/lib/lib_display/Display_Renderer-gemu-1.0/main/README.md
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/README.md
rename to lib/lib_display/Display_Renderer-gemu-1.0/main/README.md
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/component.mk b/lib/lib_display/Display_Renderer-gemu-1.0/main/component.mk
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/component.mk
rename to lib/lib_display/Display_Renderer-gemu-1.0/main/component.mk
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/esp-epaper-29-ws.c b/lib/lib_display/Display_Renderer-gemu-1.0/main/esp-epaper-29-ws.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/esp-epaper-29-ws.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/main/esp-epaper-29-ws.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/imagedata.c b/lib/lib_display/Display_Renderer-gemu-1.0/main/imagedata.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/imagedata.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/main/imagedata.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/imagedata.h b/lib/lib_display/Display_Renderer-gemu-1.0/main/imagedata.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/imagedata.h
rename to lib/lib_display/Display_Renderer-gemu-1.0/main/imagedata.h
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/2.9inch_e-Paper_Datasheet.pdf b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/2.9inch_e-Paper_Datasheet.pdf
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/2.9inch_e-Paper_Datasheet.pdf
rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/2.9inch_e-Paper_Datasheet.pdf
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/e-paper-and-esp-sample-image.jpg b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/e-paper-and-esp-sample-image.jpg
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/e-paper-and-esp-sample-image.jpg
rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/e-paper-and-esp-sample-image.jpg
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/e-paper-and-esp-sample-text.jpg b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/e-paper-and-esp-sample-text.jpg
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/e-paper-and-esp-sample-text.jpg
rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/e-paper-and-esp-sample-text.jpg
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/espresif-logo.bmp b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/espresif-logo.bmp
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/espresif-logo.bmp
rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/espresif-logo.bmp
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/image-conversion-setup.png b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/image-conversion-setup.png
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/image-conversion-setup.png
rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/image-conversion-setup.png
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdif.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/src/epdif.cpp
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdif.cpp
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/epdif.cpp
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdif.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/epdif.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdif.h
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/epdif.h
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdpaint.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/src/epdpaint.cpp
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdpaint.cpp
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/epdpaint.cpp
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdpaint.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/epdpaint.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdpaint.h
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/epdpaint.h
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font12.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font12.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font12.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font12.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font16.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font16.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font16.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font16.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font20.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font20.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font20.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font20.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font24.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font24.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font24.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font24.c
diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c
new file mode 100644
index 000000000..1844fc6cf
--- /dev/null
+++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c
@@ -0,0 +1,754 @@
+/**
+ ******************************************************************************
+ * @file font24.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief This file provides text font24 for STM32xx-EVAL's LCD driver.
+ ******************************************************************************
+ * @attention
+ *
+ *
© COPYRIGHT(c) 2014 STMicroelectronics
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "fonts.h"
+#include
+
+const uint8_t Font24_Table_7seg [] PROGMEM =
+{
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @72 '!' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x01,0x00,0x00, // #
+ 0x01,0x00,0x00, // #
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @144 '"' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x0e,0x70,0x00, // ### ###
+ 0x0e,0x70,0x00, // ### ###
+ 0x0e,0x70,0x00, // ### ###
+ 0x04,0x20,0x00, // # #
+ 0x04,0x20,0x00, // # #
+ 0x04,0x20,0x00, // # #
+ 0x04,0x20,0x00, // # #
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @216 '#' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x06,0x60,0x00, // ## ##
+ 0x06,0x60,0x00, // ## ##
+ 0x06,0x60,0x00, // ## ##
+ 0x06,0x60,0x00, // ## ##
+ 0x06,0x60,0x00, // ## ##
+ 0x3f,0xf8,0x00, // ###########
+ 0x3f,0xf8,0x00, // ###########
+ 0x06,0x60,0x00, // ## ##
+ 0x0c,0xc0,0x00, // ## ##
+ 0x3f,0xf8,0x00, // ###########
+ 0x3f,0xf8,0x00, // ###########
+ 0x0c,0xc0,0x00, // ## ##
+ 0x0c,0xc0,0x00, // ## ##
+ 0x0c,0xc0,0x00, // ## ##
+ 0x0c,0xc0,0x00, // ## ##
+ 0x0c,0xc0,0x00, // ## ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @288 '$' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x07,0xb0,0x00, // #### ##
+ 0x0f,0xf0,0x00, // ########
+ 0x18,0x70,0x00, // ## ###
+ 0x18,0x70,0x00, // ## ###
+ 0x1c,0x00,0x00, // ###
+ 0x0f,0x80,0x00, // #####
+ 0x07,0xe0,0x00, // ######
+ 0x00,0xf0,0x00, // ####
+ 0x18,0x30,0x00, // ## ##
+ 0x1c,0x30,0x00, // ### ##
+ 0x1c,0x70,0x00, // ### ###
+ 0x1f,0xe0,0x00, // ########
+ 0x1b,0xc0,0x00, // ## ####
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @360 '%' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x07,0x80,0x00, // ####
+ 0x0f,0xc0,0x00, // ######
+ 0x1c,0xe0,0x00, // ### ###
+ 0x18,0x60,0x00, // ## ##
+ 0x18,0x60,0x00, // ## ##
+ 0x1c,0xe0,0x00, // ### ###
+ 0x0f,0xf8,0x00, // #########
+ 0x07,0xe0,0x00, // ######
+ 0x1f,0xf0,0x00, // #########
+ 0x07,0x38,0x00, // ### ###
+ 0x06,0x18,0x00, // ## ##
+ 0x06,0x18,0x00, // ## ##
+ 0x07,0x38,0x00, // ### ###
+ 0x03,0xf0,0x00, // ######
+ 0x01,0xe0,0x00, // ####
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @432 '&' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x03,0xf0,0x00, // ######
+ 0x07,0xf0,0x00, // #######
+ 0x0c,0x60,0x00, // ## ##
+ 0x0c,0x00,0x00, // ##
+ 0x0c,0x00,0x00, // ##
+ 0x06,0x00,0x00, // ##
+ 0x07,0x00,0x00, // ###
+ 0x0f,0x9c,0x00, // ##### ###
+ 0x1d,0xfc,0x00, // ### #######
+ 0x18,0xf0,0x00, // ## ####
+ 0x18,0x70,0x00, // ## ###
+ 0x0f,0xfc,0x00, // ##########
+ 0x07,0xdc,0x00, // ##### ###
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @504 ''' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x01,0x00,0x00, // #
+ 0x01,0x00,0x00, // #
+ 0x01,0x00,0x00, // #
+ 0x01,0x00,0x00, // #
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @576 '(' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x18,0x00, // ##
+ 0x00,0x38,0x00, // ###
+ 0x00,0x70,0x00, // ###
+ 0x00,0xf0,0x00, // ####
+ 0x00,0xe0,0x00, // ###
+ 0x00,0xe0,0x00, // ###
+ 0x01,0xc0,0x00, // ###
+ 0x01,0xc0,0x00, // ###
+ 0x01,0xc0,0x00, // ###
+ 0x01,0xc0,0x00, // ###
+ 0x01,0xc0,0x00, // ###
+ 0x01,0xc0,0x00, // ###
+ 0x00,0xe0,0x00, // ###
+ 0x00,0xe0,0x00, // ###
+ 0x00,0x70,0x00, // ###
+ 0x00,0x70,0x00, // ###
+ 0x00,0x38,0x00, // ###
+ 0x00,0x18,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @648 ')' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x18,0x00,0x00, // ##
+ 0x1c,0x00,0x00, // ###
+ 0x0e,0x00,0x00, // ###
+ 0x0e,0x00,0x00, // ###
+ 0x07,0x00,0x00, // ###
+ 0x07,0x00,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x03,0x80,0x00, // ###
+ 0x07,0x00,0x00, // ###
+ 0x07,0x00,0x00, // ###
+ 0x0f,0x00,0x00, // ####
+ 0x0e,0x00,0x00, // ###
+ 0x1c,0x00,0x00, // ###
+ 0x18,0x00,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @720 '*' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x1d,0xb8,0x00, // ### ## ###
+ 0x1f,0xf8,0x00, // ##########
+ 0x07,0xe0,0x00, // ######
+ 0x03,0xc0,0x00, // ####
+ 0x03,0xc0,0x00, // ####
+ 0x06,0x60,0x00, // ## ##
+ 0x06,0x60,0x00, // ## ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @792 '+' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x3f,0xfc,0x00, // ############
+ 0x3f,0xfc,0x00, // ############
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @864 ',' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0xe0,0x00, // ###
+ 0x00,0xc0,0x00, // ##
+ 0x01,0xc0,0x00, // ###
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x03,0x00,0x00, // ##
+ 0x03,0x00,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @936 '-' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x1f,0xf8,0x00, // ##########
+ 0x1f,0xf8,0x00, // ##########
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @1008 '.' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x03,0xc0,0x00, // ####
+ 0x03,0xc0,0x00, // ####
+ 0x03,0xc0,0x00, // ####
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @1080 '/' (17 pixels wide)
+ 0x00,0x18,0x00, // ##
+ 0x00,0x18,0x00, // ##
+ 0x00,0x38,0x00, // ###
+ 0x00,0x30,0x00, // ##
+ 0x00,0x70,0x00, // ###
+ 0x00,0x60,0x00, // ##
+ 0x00,0x60,0x00, // ##
+ 0x00,0xc0,0x00, // ##
+ 0x00,0xc0,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x01,0x80,0x00, // ##
+ 0x03,0x00,0x00, // ##
+ 0x03,0x00,0x00, // ##
+ 0x06,0x00,0x00, // ##
+ 0x06,0x00,0x00, // ##
+ 0x0e,0x00,0x00, // ###
+ 0x0c,0x00,0x00, // ##
+ 0x1c,0x00,0x00, // ###
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x18,0x00,0x00, // ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x0f,0xfc,0x00, // ##########
+ 0x0f,0xfc,0x00, // ##########
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x0f,0xfc,0x00, // ##########
+ 0x0f,0xfc,0x00, // ##########
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x00,0x00, //
+
+ // @0 ' ' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x18,0x03,0x00, // ## ##
+ 0x07,0xfc,0x00, // #########
+ 0x07,0xfc,0x00, // #########
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x03,0x00, // ##
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+
+ // @1872 ':' (17 pixels wide)
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0xf0,0x00, // ####
+ 0x00,0xf0,0x00, // ####
+ 0x00,0xf0,0x00, // ####
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0xf0,0x00, // ####
+ 0x00,0xf0,0x00, // ####
+ 0x00,0xf0,0x00, // ####
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00, //
+ 0x00,0x00,0x00 //
+};
+
+sFONT Font24_7seg = {
+ Font24_Table_7seg,
+ 17, /* Width */
+ 24, /* Height */
+};
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font8.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font8.c
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font8.c
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font8.c
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/fonts.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/fonts.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/fonts.h
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/fonts.h
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp
similarity index 83%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp
index 4021706b8..911d4809f 100644
--- a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp
+++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp
@@ -559,6 +559,96 @@ void VButton::xdrawButton(bool inverted) {
wr_redir=0;
}
+boolean VButton::didhit(int16_t x, int16_t y) {
+ return ((x >= spars.xp) && (x < (int16_t) (spars.xp + spars.xs)) &&
+ (y >= spars.yp) && (y < (int16_t) (spars.yp + spars.ys)));
+}
+
+void VButton::SliderInit(Renderer *renderer, uint16_t xp, uint16_t yp, uint16_t xs, uint16_t ys, uint16_t nelem, uint16_t bgcol, uint16_t frcol, uint16_t barcol) {
+ spars.xp = xp;
+ spars.yp = yp;
+ spars.xs = xs;
+ spars.ys = ys;
+ spars.nelem = nelem;
+ spars.bgcol = bgcol;
+ spars.frcol = frcol;
+ spars.barcol = barcol;
+ rend = renderer;
+
+ rend->fillRect(spars.xp, spars.yp, spars.xs, spars.ys, spars.bgcol);
+
+ if (xs < ys) {
+ float bxs = spars.xs - 6;
+ float bys = (float)(spars.ys - 6) / (float)nelem;
+ float bxp = xp + 3;
+ float byp = yp + 3;
+ for (uint32_t count = 0; count < spars.nelem; count++) {
+ rend->fillRect(bxp, byp, bxs, bys - 3, spars.barcol);
+ rend->drawRect(bxp, byp, bxs, bys - 3, spars.frcol);
+ byp += bys;
+ }
+ } else {
+ float bys = spars.ys - 6;
+ float bxs = (float)(spars.xs - 6) / (float)nelem;
+ float byp = yp + 3;
+ float bxp = xp + 3;
+ for (uint32_t count = 0; count < spars.nelem; count++) {
+ rend->fillRect(bxp, byp, bxs - 3 , bys, spars.barcol);
+ rend->drawRect(bxp, byp, bxs - 3, bys, spars.frcol);
+ bxp += bxs;
+ }
+ }
+}
+
+uint16_t VButton::UpdateSlider(int16_t x, int16_t y) {
+ uint16_t elems = spars.nelem + 1;
+
+ if (x < 0) {
+ x = spars.xp + (-x * spars.xs) / 100;
+ y = spars.yp + (spars.ys - (-y * spars.ys) / 100);
+ }
+
+ if (spars.xs < spars.ys) {
+ uint16_t dy = spars.ys - (y - spars.yp);
+ uint16_t limit = elems - ((float)dy /(float)spars.ys * elems);
+ float bxs = spars.xs - 6;
+ float bys = (float)(spars.ys - 6) / (float)spars.nelem;
+ float bxp = spars.xp + 3;
+ float byp = spars.yp + 3;
+ uint16_t col;
+ for (uint32_t count = 0; count < spars.nelem; count++) {
+ if (count >= limit) {
+ col = spars.barcol;
+ } else {
+ col = spars.bgcol;
+ }
+ rend->fillRect(bxp, byp, bxs, bys - 3, col);
+ rend->drawRect(bxp, byp, bxs, bys - 3, spars.frcol);
+ byp += bys;
+ }
+ return 100 - (float(y - spars.yp) / (float)spars.ys) * 100.0;
+ } else {
+ uint16_t limit = (x - spars.xp) * elems / spars.xs;
+ float bys = spars.ys - 6;
+ float bxs = (float)(spars.xs - 6) / (float)spars.nelem;
+ float byp = spars.yp + 3;
+ float bxp = spars.xp + 3;
+ uint16_t col;
+ for (uint32_t count = 0; count < spars.nelem; count++) {
+ if (count < limit) {
+ col = spars.barcol;
+ } else {
+ col = spars.bgcol;
+ }
+ rend->fillRect(bxp, byp, bxs - 3, bys, col);
+ rend->drawRect(bxp, byp, bxs - 3 , bys, spars.frcol);
+ bxp += bxs;
+ }
+ return (float(x - spars.xp) / (float)spars.xs) * 100.0;
+ }
+
+}
+
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
similarity index 83%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h
rename to lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
index 218b34c99..cae4b420b 100644
--- a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h
+++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
@@ -57,7 +57,7 @@ typedef union {
uint8_t spare0 : 1;
uint8_t spare1 : 1;
uint8_t spare2 : 1;
- uint8_t spare3 : 1;
+ uint8_t slider : 1;
uint8_t disable : 1;
uint8_t on_off : 1;
uint8_t is_pushbutton : 1;
@@ -65,10 +65,27 @@ typedef union {
};
} TButton_State;
+
+struct Slider {
+ uint16_t xp;
+ uint16_t yp;
+ uint16_t xs;
+ uint16_t ys;
+ uint16_t nelem;
+ uint16_t bgcol;
+ uint16_t frcol;
+ uint16_t barcol;
+};
+
class VButton : public Adafruit_GFX_Button {
public:
TButton_State vpower;
+ struct Slider spars;
+ Renderer *rend;
void xdrawButton(bool inverted);
+ boolean didhit(int16_t x, int16_t y);
+ uint16_t UpdateSlider(int16_t x, int16_t y);
+ void SliderInit(Renderer *rend, uint16_t xp, uint16_t yp, uint16_t xs, uint16_t ys, uint16_t nelem, uint16_t bgcol, uint16_t frcol, uint16_t barcol);
};
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd2in9.cpp b/lib/lib_display/Epaper_29-gemu-1.0/epd2in9.cpp
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd2in9.cpp
rename to lib/lib_display/Epaper_29-gemu-1.0/epd2in9.cpp
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd2in9.h b/lib/lib_display/Epaper_29-gemu-1.0/epd2in9.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd2in9.h
rename to lib/lib_display/Epaper_29-gemu-1.0/epd2in9.h
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd4in2.cpp b/lib/lib_display/Epaper_42-gemu-1.0/epd4in2.cpp
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd4in2.cpp
rename to lib/lib_display/Epaper_42-gemu-1.0/epd4in2.cpp
diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd4in2.h b/lib/lib_display/Epaper_42-gemu-1.0/epd4in2.h
similarity index 100%
rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd4in2.h
rename to lib/lib_display/Epaper_42-gemu-1.0/epd4in2.h
diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py
index bb1759123..14e030f20 100644
--- a/pio-tools/gzip-firmware.py
+++ b/pio-tools/gzip-firmware.py
@@ -29,6 +29,9 @@ if env["PIOPLATFORM"] != "espressif32":
ORG_FIRMWARE_SIZE = os.stat(bin_file).st_size
GZ_FIRMWARE_SIZE = os.stat(gzip_file).st_size
- print("Compression reduced firmware size by {:.0f}% (was {} bytes, now {} bytes)".format((GZ_FIRMWARE_SIZE / ORG_FIRMWARE_SIZE) * 100, ORG_FIRMWARE_SIZE, GZ_FIRMWARE_SIZE))
-
+ if ORG_FIRMWARE_SIZE > 995326:
+ print("\u001b[31;1m!!! Tasmota firmware size is too big with {} bytes. Max size is 995326 bytes !!! \u001b[0m".format(ORG_FIRMWARE_SIZE))
+ else:
+ print("Compression reduced firmware size by {:.0f}% (was {} bytes, now {} bytes)".format((GZ_FIRMWARE_SIZE / ORG_FIRMWARE_SIZE) * 100, ORG_FIRMWARE_SIZE, GZ_FIRMWARE_SIZE))
+
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip])
diff --git a/platformio.ini b/platformio.ini
index 0dfd9a9cb..68ebd40a7 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -80,12 +80,12 @@ build_flags = ${core.build_flags}
board_build.f_cpu = 80000000L
board_build.f_flash = 40000000L
-monitor_speed = 115200
-monitor_port = /dev/ttyUSB0
+monitor_speed = 74880
+monitor_port = COM5
upload_speed = 115200
; *** Upload Serial reset method for Wemos and NodeMCU
upload_resetmethod = nodemcu
-upload_port = /dev/ttyUSB0
+upload_port = COM5
extra_scripts = ${scripts_defaults.extra_scripts}
lib_ldf_mode = chain+
shared_libdeps_dir = lib
diff --git a/tasmota/i18n.h b/tasmota/i18n.h
index 0eb558bbe..be888d5d3 100644
--- a/tasmota/i18n.h
+++ b/tasmota/i18n.h
@@ -73,6 +73,7 @@
#define D_JSON_EXPORT "Export"
#define D_JSON_EXPORT_ACTIVE "ExportActive"
#define D_JSON_EXPORT_REACTIVE "ExportReactive"
+#define D_JSON_EXPORT_POWER "ExportPower"
#define D_JSON_FAILED "Failed"
#define D_JSON_FALLBACKTOPIC "FallbackTopic"
#define D_JSON_FEATURES "Features"
@@ -99,6 +100,7 @@
#define D_JSON_ID "Id"
#define D_JSON_ILLUMINANCE "Illuminance"
#define D_JSON_IMPORT_ACTIVE "ImportActive"
+#define D_JSON_IMPORT_POWER "ImportPower"
#define D_JSON_IMPORT_REACTIVE "ImportReactive"
#define D_JSON_INFRARED "Infrared"
#define D_JSON_UNKNOWN "Unknown"
@@ -328,6 +330,7 @@
#define D_CMND_DEVGROUP_SEND "DevGroupSend"
#define D_CMND_DEVGROUP_SHARE "DevGroupShare"
#define D_CMND_DEVGROUPSTATUS "DevGroupStatus"
+#define D_CMND_DEVGROUP_DEVICE "DevGroupTie"
#define D_CMND_SERIALSEND "SerialSend"
#define D_CMND_SERIALDELIMITER "SerialDelimiter"
#define D_CMND_BAUDRATE "Baudrate"
diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h
index 9ad9e19f3..05f4c7154 100644
--- a/tasmota/language/af_AF.h
+++ b/tasmota/language/af_AF.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Uitvoer krag"
+#define D_IMPORT_POWER "Invoer krag"
#define D_PHASE_ANGLE "Fasehoek"
#define D_IMPORT_ACTIVE "Invoer aktief"
#define D_EXPORT_ACTIVE "Uitvoer aktief"
diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h
index 4fa37852a..1e6a0d5ef 100644
--- a/tasmota/language/bg_BG.h
+++ b/tasmota/language/bg_BG.h
@@ -629,6 +629,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -781,8 +783,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -835,7 +835,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Фазов ъгъл"
#define D_IMPORT_ACTIVE "Входна активна мощност"
#define D_EXPORT_ACTIVE "Изходна активна мощност"
diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h
index 0e8c87472..1f1e4f156 100644
--- a/tasmota/language/cs_CZ.h
+++ b/tasmota/language/cs_CZ.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h
index cbc2bd6d0..7817531a5 100644
--- a/tasmota/language/de_DE.h
+++ b/tasmota/language/de_DE.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Exportiere Leistung"
+#define D_IMPORT_POWER "Importiere Leistung"
#define D_PHASE_ANGLE "Phasenwinkel"
#define D_IMPORT_ACTIVE "Importiere Wirk"
#define D_EXPORT_ACTIVE "Exportiere Wirk"
diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h
index b63c4eb65..4fbf89dd9 100644
--- a/tasmota/language/el_GR.h
+++ b/tasmota/language/el_GR.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h
index 650fba1f8..af7cef8d6 100644
--- a/tasmota/language/en_GB.h
+++ b/tasmota/language/en_GB.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h
index 682b0b383..8f99d5fb1 100644
--- a/tasmota/language/es_ES.h
+++ b/tasmota/language/es_ES.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Ángulo de Fase"
#define D_IMPORT_ACTIVE "P. Activa Entrante"
#define D_EXPORT_ACTIVE "P. Activa Saliente"
diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h
index 9931aa065..958dca519 100644
--- a/tasmota/language/fr_FR.h
+++ b/tasmota/language/fr_FR.h
@@ -626,6 +626,8 @@
#define D_SENSOR_SBR_TX "SerBr TX"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 TX"
#define D_SENSOR_SDM120_RX "SDMx20 RX"
#define D_SENSOR_SDM630_TX "SDM630 TX"
@@ -778,8 +780,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "CarteSD CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -831,7 +831,9 @@
#define D_UNIT_WATT "W"
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Angle de phase"
#define D_IMPORT_ACTIVE "Énergie act conso"
#define D_EXPORT_ACTIVE "Énergie act fournie"
diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h
index 5a2dd214f..d2511ba47 100644
--- a/tasmota/language/fy_NL.h
+++ b/tasmota/language/fy_NL.h
@@ -1,7 +1,7 @@
/*
fy-NL.h - localization for Frysk - Nederland for Tasmota
- Copyright (C) 2021 Christiaan Heerze
+ Copyright (C) 2021 Christiaan Heerze
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
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Eksportearje krêft"
+#define D_IMPORT_POWER "Ymportearje krêft"
#define D_PHASE_ANGLE "Faze hoeke"
#define D_IMPORT_ACTIVE "Ymportearje echt"
#define D_EXPORT_ACTIVE "Eksportearje echt"
diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h
index a77bc99a3..b90029ede 100644
--- a/tasmota/language/he_HE.h
+++ b/tasmota/language/he_HE.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h
index 264dbba2f..2c74d5134 100644
--- a/tasmota/language/hu_HU.h
+++ b/tasmota/language/hu_HU.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Fázisszög"
#define D_IMPORT_ACTIVE "Bejövő aktív"
#define D_EXPORT_ACTIVE "Kimenő aktív"
diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h
index 533375655..d15849bad 100644
--- a/tasmota/language/it_IT.h
+++ b/tasmota/language/it_IT.h
@@ -1,7 +1,7 @@
/*
it-IT.h - localization for Italian - Italy for Tasmota
- Copyright (C) 2021 Gennaro Tortone - some mods by Antonio Fragola - Updated by bovirus - rev. 04.02.2021
+ Copyright (C) 2021 Gennaro Tortone - some mods by Antonio Fragola - Updated by bovirus - rev. 12.02.2021
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
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr - TX"
#define D_SENSOR_SR04_TRIG "SR04 Tri - TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech - RX"
+#define D_SENSOR_SDM72_TX "SDM72 - TX"
+#define D_SENSOR_SDM72_RX "SDM72 - RX"
#define D_SENSOR_SDM120_TX "SDMx20 - TX"
#define D_SENSOR_SDM120_RX "SDMx20 - RX"
#define D_SENSOR_SDM630_TX "SDM630 - TX"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 - DC"
#define D_SENSOR_SSD1331_CS "SSD1331 - CS"
#define D_SENSOR_SSD1331_DC "SSD1331 - DC"
-#define D_SENSOR_TM1637_CLK "TM1637 - CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 - DIO"
#define D_SENSOR_SDCARD_CS "Scheda SD - CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand - D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand - D1"
@@ -835,8 +835,10 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
-#define D_PHASE_ANGLE "Angolo Fase"
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Potenza esportata"
+#define D_IMPORT_POWER "Potenza importata"
+#define D_PHASE_ANGLE "Angolo fase"
#define D_IMPORT_ACTIVE "Potenza attiva importata"
#define D_EXPORT_ACTIVE "Potenza attiva esportata"
#define D_IMPORT_REACTIVE "Potenza reattiva importata"
diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h
index 92ab84963..d96b76f76 100644
--- a/tasmota/language/ko_KO.h
+++ b/tasmota/language/ko_KO.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h
index 564ff9f3a..3c9a0773c 100644
--- a/tasmota/language/nl_NL.h
+++ b/tasmota/language/nl_NL.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export vermogen"
+#define D_IMPORT_POWER "Import vermogen"
#define D_PHASE_ANGLE "Fase hoek"
#define D_IMPORT_ACTIVE "Import werkelijk"
#define D_EXPORT_ACTIVE "Export werkelijk"
diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h
index f2c40aebd..d477cccd3 100644
--- a/tasmota/language/pl_PL.h
+++ b/tasmota/language/pl_PL.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Przesunięcie faz"
#define D_IMPORT_ACTIVE "Czynna pobrana"
#define D_EXPORT_ACTIVE "Czynna oddana"
diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h
index 6c2c2a438..3660bdaa1 100644
--- a/tasmota/language/pt_BR.h
+++ b/tasmota/language/pt_BR.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "W/h"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Ângulo de Fase"
#define D_IMPORT_ACTIVE "Importar Ativo"
#define D_EXPORT_ACTIVE "Exportar Ativo"
diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h
index cdc540d11..3b4ea2614 100644
--- a/tasmota/language/pt_PT.h
+++ b/tasmota/language/pt_PT.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Ângulo de fase"
#define D_IMPORT_ACTIVE "Ativo importado"
#define D_EXPORT_ACTIVE "Ativo exportado"
diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h
index b803b87b7..c6810406d 100644
--- a/tasmota/language/ro_RO.h
+++ b/tasmota/language/ro_RO.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Unghi de fază"
#define D_IMPORT_ACTIVE "Import Activ"
#define D_EXPORT_ACTIVE "Export Activ"
diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h
index c7d4f0a89..8941a770d 100644
--- a/tasmota/language/ru_RU.h
+++ b/tasmota/language/ru_RU.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "ВтЧ"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Угол фазы"
#define D_IMPORT_ACTIVE "Импорт активной мощности"
#define D_EXPORT_ACTIVE "Экспорт активной мощности"
diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h
index 4b91eb101..e30692e58 100644
--- a/tasmota/language/sk_SK.h
+++ b/tasmota/language/sk_SK.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h
index 26ad07cc4..dad72de28 100644
--- a/tasmota/language/sv_SE.h
+++ b/tasmota/language/sv_SE.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Fasvinkel"
#define D_IMPORT_ACTIVE "Import aktiv"
#define D_EXPORT_ACTIVE "Export aktiv"
diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h
index 165cc5e05..ab7d00a31 100644
--- a/tasmota/language/tr_TR.h
+++ b/tasmota/language/tr_TR.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Phase Angle"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h
index c2c6a5484..c2c1cbd72 100644
--- a/tasmota/language/uk_UA.h
+++ b/tasmota/language/uk_UA.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Вт/г"
#define D_UNIT_WATT_METER_QUADRAT "Вт/м²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Кут фази"
#define D_IMPORT_ACTIVE "Активна вхід"
#define D_EXPORT_ACTIVE "Активна вихід"
diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h
index 372bd9926..e71874381 100644
--- a/tasmota/language/vi_VN.h
+++ b/tasmota/language/vi_VN.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "Wh"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "Góc pha"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h
index 7874b5fe0..186a013eb 100644
--- a/tasmota/language/zh_CN.h
+++ b/tasmota/language/zh_CN.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "瓦时"
#define D_UNIT_WATT_METER_QUADRAT "瓦/平米"
-//SDM220, SDM120, LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "相位角"
#define D_IMPORT_ACTIVE "有功输入"
#define D_EXPORT_ACTIVE "有功输出"
diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h
index 232a9d250..5a8e3591f 100644
--- a/tasmota/language/zh_TW.h
+++ b/tasmota/language/zh_TW.h
@@ -630,6 +630,8 @@
#define D_SENSOR_SBR_TX "SerBr Tx"
#define D_SENSOR_SR04_TRIG "SR04 Tri/TX"
#define D_SENSOR_SR04_ECHO "SR04 Ech/RX"
+#define D_SENSOR_SDM72_TX "SDM72 Tx"
+#define D_SENSOR_SDM72_RX "SDM72 Rx"
#define D_SENSOR_SDM120_TX "SDMx20 Tx"
#define D_SENSOR_SDM120_RX "SDMx20 Rx"
#define D_SENSOR_SDM630_TX "SDM630 Tx"
@@ -782,8 +784,6 @@
#define D_SENSOR_ST7789_DC "ST7789 DC"
#define D_SENSOR_SSD1331_CS "SSD1331 CS"
#define D_SENSOR_SSD1331_DC "SSD1331 DC"
-#define D_SENSOR_TM1637_CLK "TM1637 CLK"
-#define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_SDCARD_CS "SDCard CS"
#define D_SENSOR_WIEGAND_D0 "Wiegand D0"
#define D_SENSOR_WIEGAND_D1 "Wiegand D1"
@@ -836,7 +836,9 @@
#define D_UNIT_WATTHOUR "瓦小時"
#define D_UNIT_WATT_METER_QUADRAT "W/m²"
-//SDM220、 SDM120、 LE01MR
+//SDM220, SDM120, SDM72, LE01MR
+#define D_EXPORT_POWER "Export Power"
+#define D_IMPORT_POWER "Import Power"
#define D_PHASE_ANGLE "相量(Phase Angle)"
#define D_IMPORT_ACTIVE "Import Active"
#define D_EXPORT_ACTIVE "Export Active"
diff --git a/tasmota/settings.h b/tasmota/settings.h
index 2719268ea..5f8484ea0 100644
--- a/tasmota/settings.h
+++ b/tasmota/settings.h
@@ -631,7 +631,7 @@ struct {
// Only 32 bit boundary variables below
uint64_t rf_protocol_mask; // FA8
- uint32_t device_group_maps; // FB0
+ uint8_t device_group_tie[4]; // FB0
SysBitfield5 flag5; // FB4
uint16_t pulse_counter_debounce_low; // FB8
uint16_t pulse_counter_debounce_high; // FBA
diff --git a/tasmota/settings.ino b/tasmota/settings.ino
index 9878e7678..9a9d9dcb6 100644
--- a/tasmota/settings.ino
+++ b/tasmota/settings.ino
@@ -1232,6 +1232,9 @@ void SettingsDelta(void) {
Settings.interlock[i] = (i < 4) ? Settings.ex_interlock[i] : 0;
}
}
+ if (Settings.version < 0x09020007) {
+ *(uint32_t *)&Settings.device_group_tie = 0x04030201;
+ }
Settings.version = VERSION;
SettingsSave(1);
diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino
index 30e850f50..065fabbcc 100644
--- a/tasmota/support_command.ino
+++ b/tasmota/support_command.ino
@@ -36,7 +36,7 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix
#ifdef USE_DEVICE_GROUPS_SEND
D_CMND_DEVGROUP_SEND "|"
#endif // USE_DEVICE_GROUPS_SEND
- D_CMND_DEVGROUP_SHARE "|" D_CMND_DEVGROUPSTATUS "|"
+ D_CMND_DEVGROUP_SHARE "|" D_CMND_DEVGROUPSTATUS "|" D_CMND_DEVGROUP_DEVICE "|"
#endif // USE_DEVICE_GROUPS
D_CMND_SENSOR "|" D_CMND_DRIVER
#ifdef ESP32
@@ -63,7 +63,7 @@ void (* const TasmotaCommand[])(void) PROGMEM = {
#ifdef USE_DEVICE_GROUPS_SEND
&CmndDevGroupSend,
#endif // USE_DEVICE_GROUPS_SEND
- &CmndDevGroupShare, &CmndDevGroupStatus,
+ &CmndDevGroupShare, &CmndDevGroupStatus, &CmndDevGroupTie,
#endif // USE_DEVICE_GROUPS
&CmndSensor, &CmndDriver
#ifdef ESP32
@@ -2104,7 +2104,7 @@ void CmndDevGroupSend(void)
{
uint8_t device_group_index = (XdrvMailbox.usridx ? XdrvMailbox.index - 1 : 0);
if (device_group_index < device_group_count) {
- if (!_SendDeviceGroupMessage(device_group_index, (DevGroupMessageType)(DGR_MSGTYPE_UPDATE_COMMAND + DGR_MSGTYPFLAG_WITH_LOCAL))) {
+ if (!_SendDeviceGroupMessage(-device_group_index, (DevGroupMessageType)(DGR_MSGTYPE_UPDATE_COMMAND + DGR_MSGTYPFLAG_WITH_LOCAL))) {
ResponseCmndChar(XdrvMailbox.data);
}
}
@@ -2124,6 +2124,16 @@ void CmndDevGroupStatus(void)
{
DeviceGroupStatus((XdrvMailbox.usridx ? XdrvMailbox.index - 1 : 0));
}
+
+void CmndDevGroupTie(void)
+{
+ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DEV_GROUP_NAMES)) {
+ if (XdrvMailbox.data_len > 0) {
+ Settings.device_group_tie[XdrvMailbox.index - 1] = XdrvMailbox.payload;
+ }
+ ResponseCmndIdxNumber(Settings.device_group_tie[XdrvMailbox.index - 1]);
+ }
+}
#endif // USE_DEVICE_GROUPS
void CmndSensor(void)
diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino
index dc79de635..1bc6ba956 100644
--- a/tasmota/support_device_groups.ino
+++ b/tasmota/support_device_groups.ino
@@ -42,6 +42,7 @@ struct device_group {
uint32_t next_announcement_time;
uint32_t next_ack_check_time;
uint32_t member_timeout_time;
+ uint32_t no_status_share;
uint16_t outgoing_sequence;
uint16_t last_full_status_sequence;
uint16_t message_length;
@@ -84,10 +85,9 @@ uint8_t * BeginDeviceGroupMessage(struct device_group * device_group, uint16_t f
return message_ptr;
}
-// Return true if we're configured to share the specified item.
-bool DeviceGroupItemShared(bool incoming, uint8_t item)
+uint32_t DeviceGroupSharedMask(uint8_t item)
{
- uint32_t mask;
+ uint32_t mask = 0;
if (item == DGR_ITEM_LIGHT_BRI || item == DGR_ITEM_BRI_POWER_ON)
mask = DGR_SHARE_LIGHT_BRI;
else if (item == DGR_ITEM_POWER)
@@ -102,9 +102,7 @@ bool DeviceGroupItemShared(bool incoming, uint8_t item)
mask = DGR_SHARE_DIMMER_SETTINGS;
else if (item == DGR_ITEM_EVENT)
mask = DGR_SHARE_EVENT;
- else
- return true;
- return mask & (incoming ? Settings.device_group_share_in : Settings.device_group_share_out);
+ return mask;
}
void DeviceGroupsInit(void)
@@ -153,6 +151,7 @@ void DeviceGroupsInit(void)
}
}
device_group->message_header_length = sprintf_P((char *)device_group->message, PSTR("%s%s"), kDeviceGroupMessage, device_group->group_name) + 1;
+ device_group->no_status_share = 0;
device_group->last_full_status_sequence = -1;
}
@@ -204,7 +203,6 @@ void DeviceGroupsStop()
void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct device_group_member * device_group_member, uint8_t * message, int message_length, bool received)
{
- char log_buffer[512];
bool item_processed = false;
uint16_t message_sequence;
uint16_t flags;
@@ -218,16 +216,17 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de
uint8_t * message_ptr = message + strlen((char *)message) + 1;
// Get the message sequence and flags.
- if (message_ptr + 4 > message_end_ptr) goto badmsg; // Malformed message - must be at least 16-bit sequence, 16-bit flags left
+ if (message_ptr + 4 > message_end_ptr) return; // Malformed message - must be at least 16-bit sequence, 16-bit flags left
message_sequence = *message_ptr++;
message_sequence |= *message_ptr++ << 8;
flags = *message_ptr++;
flags |= *message_ptr++ << 8;
// Initialize the log buffer.
+ char * log_buffer = (char *)malloc(512);
log_length = sprintf(log_buffer, PSTR("DGR: %s %s message %s %s: seq=%u, flags=%u"), (received ? PSTR("Received") : PSTR("Sending")), device_group->group_name, (received ? PSTR("from") : PSTR("to")), (device_group_member ? IPAddressToString(device_group_member->ip_address) : received ? PSTR("local") : PSTR("network")), message_sequence, flags);
log_ptr = log_buffer + log_length;
- log_remaining = sizeof(log_buffer) - log_length;
+ log_remaining = 512 - log_length;
// If this is an announcement, just log it.
if (flags == DGR_FLAG_ANNOUNCEMENT) goto write_log;
@@ -303,7 +302,10 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de
}
uint8_t item;
+ uint8_t item_flags;
int32_t value;
+ uint32_t mask;
+ item_flags = 0;
for (;;) {
if (message_ptr >= message_end_ptr) goto badmsg; // Malformed message
item = *message_ptr++;
@@ -321,6 +323,7 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de
case DGR_ITEM_BRI_PRESET_HIGH:
case DGR_ITEM_BRI_POWER_ON:
case DGR_ITEM_POWER:
+ case DGR_ITEM_NO_STATUS_SHARE:
case DGR_ITEM_EVENT:
case DGR_ITEM_LIGHT_CHANNELS:
break;
@@ -376,45 +379,61 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de
log_ptr += log_length;
log_remaining -= log_length;
- if (received && DeviceGroupItemShared(true, item)) {
- item_processed = true;
- XdrvMailbox.command_code = item;
- XdrvMailbox.payload = value;
- XdrvMailbox.data_len = value;
- *log_ptr++ = '*';
- log_remaining--;
- switch (item) {
- case DGR_ITEM_POWER:
- if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups
- if (device_group_index < TasmotaGlobal.devices_present) {
- bool on = (value & 1);
- if (on != (TasmotaGlobal.power & (1 << device_group_index))) ExecuteCommandPower(device_group_index + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE);
- }
- }
- else if (XdrvMailbox.index & DGR_FLAG_LOCAL) {
- uint8_t mask_devices = value >> 24;
- if (mask_devices > TasmotaGlobal.devices_present) mask_devices = TasmotaGlobal.devices_present;
- for (uint32_t i = 0; i < mask_devices; i++) {
- uint32_t mask = 1 << i;
- bool on = (value & mask);
- if (on != (TasmotaGlobal.power & mask)) ExecuteCommandPower(i + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE);
- }
- }
- break;
-#ifdef USE_RULES
- case DGR_ITEM_EVENT:
- CmndEvent();
- break;
-#endif
- case DGR_ITEM_COMMAND:
- ExecuteCommand(XdrvMailbox.data, SRC_REMOTE);
- break;
+ if (received) {
+ if (item == DGR_ITEM_FLAGS) {
+ item_flags = value;
+ continue;
}
- XdrvCall(FUNC_DEVICE_GROUP_ITEM);
- }
- }
- if (received) {
+ mask = DeviceGroupSharedMask(item);
+ if (item_flags & DGR_ITEM_FLAG_NO_SHARE)
+ device_group->no_status_share |= mask;
+ else
+ device_group->no_status_share &= ~mask;
+
+ if ((!(device_group->no_status_share & mask) || device_group_member == nullptr) && (!mask || (mask & Settings.device_group_share_in))) {
+ item_processed = true;
+ XdrvMailbox.command_code = item;
+ XdrvMailbox.payload = value;
+ XdrvMailbox.data_len = value;
+ *log_ptr++ = '*';
+ log_remaining--;
+ switch (item) {
+ case DGR_ITEM_POWER:
+ if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups
+ uint32_t device = Settings.device_group_tie[device_group_index];
+ if (device) {
+ bool on = (value & 1);
+ if (on != ((TasmotaGlobal.power >> (device - 1)) & 1)) ExecuteCommandPower(device, (on ? POWER_ON : POWER_OFF), SRC_REMOTE);
+ }
+ }
+ else if (XdrvMailbox.index & DGR_FLAG_LOCAL) {
+ uint8_t mask_devices = value >> 24;
+ if (mask_devices > TasmotaGlobal.devices_present) mask_devices = TasmotaGlobal.devices_present;
+ for (uint32_t i = 0; i < mask_devices; i++) {
+ uint32_t mask = 1 << i;
+ bool on = (value & mask);
+ if (on != (TasmotaGlobal.power & mask)) ExecuteCommandPower(i + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE);
+ }
+ }
+ break;
+ case DGR_ITEM_NO_STATUS_SHARE:
+ device_group->no_status_share = value;
+ break;
+#ifdef USE_RULES
+ case DGR_ITEM_EVENT:
+ CmndEvent();
+ break;
+#endif
+ case DGR_ITEM_COMMAND:
+ ExecuteCommand(XdrvMailbox.data, SRC_REMOTE);
+ break;
+ }
+ XdrvCall(FUNC_DEVICE_GROUP_ITEM);
+ }
+ item_flags = 0;
+ }
+
if (item_processed) {
XdrvMailbox.command_code = DGR_ITEM_EOL;
XdrvCall(FUNC_DEVICE_GROUP_ITEM);
@@ -430,7 +449,7 @@ write_log:
if (received) {
if ((flags & DGR_FLAG_STATUS_REQUEST)) {
if ((flags & DGR_FLAG_RESET) || device_group_member->acked_sequence != device_group->last_full_status_sequence) {
- _SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_FULL_STATUS);
+ _SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_FULL_STATUS);
}
}
}
@@ -454,20 +473,18 @@ badmsg:
AddLog(LOG_LEVEL_ERROR, PSTR("%s ** incorrect length"), log_buffer);
cleanup:
+ free(log_buffer);
if (received) {
TasmotaGlobal.skip_light_fade = false;
ignore_dgr_sends = false;
}
}
-bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType message_type, ...)
+bool _SendDeviceGroupMessage(uint32_t device, DevGroupMessageType message_type, ...)
{
// If device groups is not up, ignore this request.
if (!device_groups_up) return 1;
- // If the device group index is higher then the number of device groups, ignore this request.
- if (device_group_index >= device_group_count) return 0;
-
// Extract the flags from the message type.
bool with_local = ((message_type & DGR_MSGTYPFLAG_WITH_LOCAL) != 0);
message_type = (DevGroupMessageType)(message_type & 0x7F);
@@ -475,6 +492,19 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
// If we're currently processing a remote device message, ignore this request.
if (ignore_dgr_sends && message_type != DGR_MSGTYPE_UPDATE_COMMAND) return 0;
+ // If device is < 0, the device group index is the device negated. If not, get the device group
+ // index for this device.
+ uint8_t device_group_index = -device;
+ if (device > 0) {
+ device_group_index = 0;
+ if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups
+ for (; device_group_index < device_group_count; device_group_index++) {
+ if (Settings.device_group_tie[device_group_index] == device) break;
+ }
+ }
+ }
+ if (device_group_index >= device_group_count) return 0;
+
// Get a pointer to the device information for this device.
struct device_group * device_group = &device_groups[device_group_index];
@@ -483,7 +513,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
// Load the message header, sequence and flags.
#ifdef DEVICE_GROUPS_DEBUG
- AddLog(LOG_LEVEL_DEBUG, PSTR("DGR: Building %s %spacket"), device_group->group_name, (message_type == DGR_MSGTYP_FULL_STATUS ? PSTR("full status ") : PSTR("")));
+ AddLog(LOG_LEVEL_DEBUG, PSTR("DGR: Building %s %spacket"), device_group->group_name, (message_type == DGR_MSGTYP_FULL_STATUS ? PSTR("full status ") : PSTR("")));
#endif // DEVICE_GROUPS_DEBUG
uint16_t original_sequence = device_group->outgoing_sequence;
uint16_t flags = 0;
@@ -507,10 +537,9 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
// Call the drivers to build the status update.
power_t power = TasmotaGlobal.power;
if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups
- power >>= device_group_index;
- power &= 1;
+ power = (power >> (Settings.device_group_tie[device_group_index] - 1)) & 1;
}
- SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_POWER, power);
+ SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_NO_STATUS_SHARE, device_group->no_status_share, DGR_ITEM_POWER, power);
XdrvMailbox.index = 0;
if (device_group_index == 0 && first_device_group_is_local) XdrvMailbox.index = DGR_FLAG_LOCAL;
XdrvMailbox.command_code = DGR_ITEM_STATUS;
@@ -539,11 +568,13 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
#endif // USE_DEVICE_GROUPS_SEND
struct item {
uint8_t item;
+ uint8_t flags;
uint32_t value;
void * value_ptr;
} item_array[32];
bool shared;
uint8_t item;
+ uint32_t mask;
uint32_t value;
uint8_t * value_ptr;
uint8_t * first_item_ptr = message_ptr;
@@ -559,16 +590,24 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
item_ptr->item = item;
if (*value_ptr != '=') return 1;
value_ptr++;
+
+ // If flags were specified for this item, save them.
+ item_ptr->flags = 0;
+ if (toupper(*value_ptr) == 'N') {
+ value_ptr++;
+ item_ptr->flags = DGR_ITEM_FLAG_NO_SHARE;
+ }
+
if (item <= DGR_ITEM_MAX_32BIT) {
oper = 0;
if (*value_ptr == '@') {
oper = value_ptr[1];
value_ptr += 2;
}
- value = (isdigit(*value_ptr) ? strtoul((char *)value_ptr, (char **)&value_ptr, 0) : 1);
+ value = (isdigit(*value_ptr) ? strtoul((char *)value_ptr, (char **)&value_ptr, 0) : oper == '^' ? 0xffffffff : 1);
if (oper) {
old_value = (item <= DGR_ITEM_MAX_8BIT ? device_group->values_8bit[item] : (item <= DGR_ITEM_MAX_16BIT ? device_group->values_16bit[item - DGR_ITEM_MAX_8BIT - 1] : device_group->values_32bit[item - DGR_ITEM_MAX_16BIT - 1]));
- value = (oper == '+' ? old_value + value : (oper == '-' ? old_value - value : (oper == '^' ? old_value ^ (value ? value : 0xffffffff) : old_value)));
+ value = (oper == '+' ? old_value + value : oper == '-' ? old_value - value : oper == '^' ? old_value ^ value : oper == '|' ? old_value | value : old_value == '&' ? old_value & value : old_value);
}
item_ptr->value = value;
}
@@ -580,14 +619,35 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
if (chr == ' ' && !escaped) break;
if (!(escaped = (chr == '\\' && !escaped))) *out_ptr++ = chr;
}
- *out_ptr = 0;
+ *out_ptr++ = 0;
}
else {
switch (item) {
case DGR_ITEM_LIGHT_CHANNELS:
- for (int i = 0; i < 6; i++) {
- *out_ptr++ = strtoul((char *)value_ptr, (char **)&value_ptr, 0);
- if (*value_ptr == ',') value_ptr++;
+ {
+ bool hex = false;
+ char * endptr;
+ if (*value_ptr == '#') {
+ value_ptr++;
+ hex = true;
+ }
+ for (int i = 0; i < 6; i++) {
+ *out_ptr = 0;
+ if (*value_ptr != ' ') {
+ if (hex) {
+ endptr = (char *)value_ptr + 2;
+ chr = *endptr;
+ *endptr = 0;
+ *out_ptr = strtoul((char *)value_ptr, (char **)&value_ptr, 16);
+ *endptr = chr;
+ }
+ else {
+ *out_ptr = strtoul((char *)value_ptr, (char **)&value_ptr, 10);
+ if (*value_ptr == ',') value_ptr++;
+ }
+ }
+ out_ptr++;
+ }
}
break;
}
@@ -601,6 +661,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
va_start(ap, message_type);
while ((item = va_arg(ap, int))) {
item_ptr->item = item;
+ item_ptr->flags = 0;
if (item <= DGR_ITEM_MAX_32BIT)
item_ptr->value = va_arg(ap, int);
else if (item <= DGR_ITEM_MAX_STRING)
@@ -621,6 +682,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
// previous update message to remove any items and their values that are included in this new
// update.
if (device_group->message_length) {
+ uint8_t item_flags = 0;
int kept_item_count = 0;
// Rebuild the previous update message, removing any items whose values are included in this
@@ -628,31 +690,44 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
uint8_t * previous_message_ptr = message_ptr;
while (item = *previous_message_ptr++) {
- // Determine the length of this item's value.
- if (item <= DGR_ITEM_MAX_32BIT) {
- value = 1;
- if (item > DGR_ITEM_MAX_8BIT) {
- value = 2;
- if (item > DGR_ITEM_MAX_16BIT) {
- value = 4;
+ // If this is the flags item, save the flags.
+ if (item == DGR_ITEM_FLAGS) {
+ item_flags = *previous_message_ptr++;
+ }
+
+ // Otherwise, determine the length of this item's value.
+ else {
+ if (item <= DGR_ITEM_MAX_32BIT) {
+ value = 1;
+ if (item > DGR_ITEM_MAX_8BIT) {
+ value = 2;
+ if (item > DGR_ITEM_MAX_16BIT) {
+ value = 4;
+ }
}
}
- }
- else {
- value = *previous_message_ptr + 1;
- }
+ else {
+ value = *previous_message_ptr + 1;
+ }
- // Search for this item in the new update.
- for (item_ptr = item_array; item_ptr->item; item_ptr++) {
- if (item_ptr->item == item) break;
- }
+ // Search for this item in the new update.
+ for (item_ptr = item_array; item_ptr->item; item_ptr++) {
+ if (item_ptr->item == item) break;
+ }
- // If this item was not found in the new update, copy it to the new update message.
- if (!item_ptr->item) {
- kept_item_count++;
- *message_ptr++ = item;
- memmove(message_ptr, previous_message_ptr, value);
- message_ptr += value;
+ // If this item was not found in the new update, copy it to the new update message. If the
+ // item has flags, first copy the flags item to the new update message.
+ if (!item_ptr->item) {
+ kept_item_count++;
+ if (item_flags) {
+ *message_ptr++ = DGR_ITEM_FLAGS;
+ *message_ptr++ = item_flags;
+ }
+ *message_ptr++ = item;
+ memmove(message_ptr, previous_message_ptr, value);
+ message_ptr += value;
+ }
+ item_flags = 0;
}
// Advance past the item value.
@@ -668,8 +743,20 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
// If this item is shared with the group add it to the message.
shared = true;
- if (!device_group_index && message_type != DGR_MSGTYPE_UPDATE_COMMAND) shared = DeviceGroupItemShared(false, item);
+ if ((mask = DeviceGroupSharedMask(item))) {
+ if (item_ptr->flags & DGR_ITEM_FLAG_NO_SHARE)
+ device_group->no_status_share |= mask;
+ else if (!building_status_message)
+ device_group->no_status_share &= ~mask;
+ if (message_type != DGR_MSGTYPE_UPDATE_COMMAND) {
+ shared = (!(mask & device_group->no_status_share) && (device_group_index || (mask & Settings.device_group_share_out)));
+ }
+ }
if (shared) {
+ if (item_ptr->flags) {
+ *message_ptr++ = DGR_ITEM_FLAGS;
+ *message_ptr++ = item_ptr->flags;
+ }
*message_ptr++ = item;
// For integer items, add the value to the message.
@@ -684,7 +771,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes
*message_ptr++ = value & 0xff;
value >>= 8;
// For the power item, the device count is overlayed onto the highest 8 bits.
- if (item == DGR_ITEM_POWER && !value) value = (device_group_index == 0 && first_device_group_is_local ? TasmotaGlobal.devices_present : 1);
+ if (item == DGR_ITEM_POWER && !value) value = (!Settings.flag4.multiple_device_groups && device_group_index == 0 && first_device_group_is_local ? TasmotaGlobal.devices_present : 1);
*message_ptr++ = value;
}
}
@@ -857,7 +944,7 @@ AddLog(LOG_LEVEL_DEBUG, PSTR("DGR: Checking next_check_time=%u, now=%u"), next_c
// If we've sent the initial status request message the set number of times, send our
// status to all the members.
else {
- _SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_FULL_STATUS);
+ _SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_FULL_STATUS);
}
}
diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino
index c02465a27..8e1766439 100644
--- a/tasmota/support_features.ino
+++ b/tasmota/support_features.ino
@@ -712,10 +712,9 @@ void ResponseAppendFeatures(void)
#if defined(USE_I2C) && defined(USE_TOF10120)
feature7 |= 0x10000000; // xsns_84_tof10120
#endif
-#if defined(USE_DISPLAY) && defined(USE_DISPLAY_SEVENSEG) && defined(USE_TM1637)
- feature7 |= 0x20000000; // xdsp_15_tm1637.ino
+#if defined(USE_ENERGY_SENSOR) && defined(USE_SDM72)
+ feature7 |= 0x20000000; // xnrg_18_sdm72.ino
#endif
-// feature7 |= 0x20000000;
// feature7 |= 0x40000000;
// feature7 |= 0x80000000;
}
diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino
index 5d97575fb..7318b9076 100644
--- a/tasmota/support_tasmota.ino
+++ b/tasmota/support_tasmota.ino
@@ -586,10 +586,11 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source)
}
#ifdef USE_DEVICE_GROUPS
if (TasmotaGlobal.power != old_power && SRC_REMOTE != source && SRC_RETRY != source) {
- if (Settings.flag4.multiple_device_groups) // SetOption88 - Enable relays in separate device groups
- SendDeviceGroupMessage(device - 1, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, (TasmotaGlobal.power >> (device - 1)) & 1 | 0x01000000); // Explicitly set number of relays to one
- else
- SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, TasmotaGlobal.power);
+ power_t dgr_power = TasmotaGlobal.power;
+ if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups
+ dgr_power = (dgr_power >> (device - 1)) & 1;
+ }
+ SendDeviceGroupMessage(device, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, dgr_power);
}
#endif // USE_DEVICE_GROUPS
SetDevicePower(TasmotaGlobal.power, source);
@@ -1664,7 +1665,6 @@ void GpioInit(void)
ValidSpiPinUsed(GPIO_ST7789_DC) || // ST7789 CS may be omitted so chk DC too
ValidSpiPinUsed(GPIO_ST7789_CS) ||
(ValidSpiPinUsed(GPIO_SSD1331_CS) && ValidSpiPinUsed(GPIO_SSD1331_DC)) ||
- (ValidSpiPinUsed(GPIO_TM1637_CLK) && ValidSpiPinUsed(GPIO_TM1637_DIO)) ||
ValidSpiPinUsed(GPIO_SDCARD_CS)
);
// If SPI_CS and/or SPI_DC is used they must be valid
diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h
index 962fb8a2b..34e2a562a 100644
--- a/tasmota/tasmota.h
+++ b/tasmota/tasmota.h
@@ -126,7 +126,11 @@ const uint32_t PWM_RANGE = 1023; // 255..1023 needs to be devisible b
//const uint16_t PWM_FREQ = 1000; // 100..1000 Hz led refresh
//const uint16_t PWM_FREQ = 910; // 100..1000 Hz led refresh (iTead value)
const uint16_t PWM_FREQ = 977; // 100..4000 Hz led refresh
+#ifdef ESP32
+const uint16_t PWM_MAX = 50000; // [PWM_MAX] Maximum frequency for ESP32 - Default: 4000
+#else
const uint16_t PWM_MAX = 4000; // [PWM_MAX] Maximum frequency - Default: 4000
+#endif
const uint16_t PWM_MIN = 40; // [PWM_MIN] Minimum frequency - Default: 40
// For Dimmers use double of your mains AC frequecy (100 for 50Hz and 120 for 60Hz)
// For Controlling Servos use 50 and also set PWM_FREQ as 50 (DO NOT USE THESE VALUES FOR DIMMERS)
@@ -351,7 +355,7 @@ enum DevGroupItem { DGR_ITEM_EOL, DGR_ITEM_STATUS, DGR_ITEM_FLAGS,
//DGR_ITEM_ANALOG1, DGR_ITEM_ANALOG2, DGR_ITEM_ANALOG3, DGR_ITEM_ANALOG4, DGR_ITEM_ANALOG5,
// Add new 16-bit items before this line
DGR_ITEM_LAST_16BIT, DGR_ITEM_MAX_16BIT = 127,
- DGR_ITEM_POWER,
+ DGR_ITEM_POWER, DGR_ITEM_NO_STATUS_SHARE,
// Add new 32-bit items before this line
DGR_ITEM_LAST_32BIT, DGR_ITEM_MAX_32BIT = 191,
DGR_ITEM_EVENT, DGR_ITEM_COMMAND,
@@ -359,6 +363,8 @@ enum DevGroupItem { DGR_ITEM_EOL, DGR_ITEM_STATUS, DGR_ITEM_FLAGS,
DGR_ITEM_LAST_STRING, DGR_ITEM_MAX_STRING = 223,
DGR_ITEM_LIGHT_CHANNELS };
+enum DevGroupItemFlag { DGR_ITEM_FLAG_NO_SHARE = 1 };
+
enum DevGroupShareItem { DGR_SHARE_POWER = 1, DGR_SHARE_LIGHT_BRI = 2, DGR_SHARE_LIGHT_FADE = 4, DGR_SHARE_LIGHT_SCHEME = 8,
DGR_SHARE_LIGHT_COLOR = 16, DGR_SHARE_DIMMER_SETTINGS = 32, DGR_SHARE_EVENT = 64 };
diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h
index 77dab9e43..951d63e41 100644
--- a/tasmota/tasmota_configurations_ESP32.h
+++ b/tasmota/tasmota_configurations_ESP32.h
@@ -59,8 +59,8 @@
#define USE_SPI
#define USE_DISPLAY // Add SPI Display Support (+2k code)
#define USE_DISPLAY_ILI9341 // [DisplayModel 4] Enable ILI9341 Tft 480x320 display (+19k code)
-#define USE_BLE_ESP32 // Enable new BLE driver
-#define USE_MI_ESP32 // (ESP32 only) Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash)
+//#define USE_BLE_ESP32 // Enable new BLE driver
+//#define USE_MI_ESP32 // (ESP32 only) Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash)
#endif // FIRMWARE_ODROID_GO
/*********************************************************************************************\
@@ -79,8 +79,8 @@
#define FALLBACK_MODULE M5STACK_CORE2 // [Module2] Select default module on fast reboot where USER_MODULE is user template
#define USE_M5STACK_CORE2 // Add support for M5Stack Core2
- #define SAY_TIME
- #define USE_WEBRADIO
+ #define USE_I2S_SAY_TIME
+ #define USE_I2S_WEBRADIO
#define USE_MPU6886
#define USE_UFILESYS
#define USE_SDCARD
diff --git a/tasmota/tasmota_globals.h b/tasmota/tasmota_globals.h
index 27a4bf395..2ac6a2343 100644
--- a/tasmota/tasmota_globals.h
+++ b/tasmota/tasmota_globals.h
@@ -473,7 +473,6 @@ const char kWebColors[] PROGMEM =
#ifdef USE_DEVICE_GROUPS
#define SendDeviceGroupMessage(DEVICE_INDEX, REQUEST_TYPE, ...) _SendDeviceGroupMessage(DEVICE_INDEX, REQUEST_TYPE, __VA_ARGS__, 0)
-#define SendLocalDeviceGroupMessage(REQUEST_TYPE, ...) _SendDeviceGroupMessage(0, REQUEST_TYPE, __VA_ARGS__, 0)
uint8_t device_group_count = 0;
bool first_device_group_is_local = true;
#endif // USE_DEVICE_GROUPS
diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h
index 4dd36a78d..7b4fc3ae3 100644
--- a/tasmota/tasmota_template.h
+++ b/tasmota/tasmota_template.h
@@ -142,13 +142,13 @@ enum UserSelectablePins {
GPIO_RA8876_CS,
GPIO_ST7789_CS, GPIO_ST7789_DC,
GPIO_SSD1331_CS, GPIO_SSD1331_DC,
- GPIO_TM1637_CLK, GPIO_TM1637_DIO,
GPIO_SDCARD_CS,
GPIO_ROT1A_NP, GPIO_ROT1B_NP, // Rotary switch
GPIO_ADC_PH, // Analog PH Sensor
GPIO_BS814_CLK, GPIO_BS814_DAT, // Holtek BS814A2 touch ctrlr
GPIO_WIEGAND_D0, GPIO_WIEGAND_D1, // Wiegand Data lines
GPIO_NEOPOOL_TX, GPIO_NEOPOOL_RX, // Sugar Valley RS485 interface
+ GPIO_SDM72_TX, GPIO_SDM72_RX, // SDM72 Serial interface
GPIO_SENSOR_END };
enum ProgramSelectablePins {
@@ -311,13 +311,13 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_RA8876_CS "|"
D_SENSOR_ST7789_CS "|" D_SENSOR_ST7789_DC "|"
D_SENSOR_SSD1331_CS "|" D_SENSOR_SSD1331_DC "|"
- D_SENSOR_TM1637_CLK "|" D_SENSOR_TM1637_DIO "|"
D_SENSOR_SDCARD_CS "|"
D_SENSOR_ROTARY " A_n|" D_SENSOR_ROTARY " B_n|"
D_SENSOR_ADC_PH "|"
D_SENSOR_BS814_CLK "|" D_SENSOR_BS814_DAT "|"
D_SENSOR_WIEGAND_D0 "|" D_SENSOR_WIEGAND_D1 "|"
D_SENSOR_NEOPOOL_TX "|" D_SENSOR_NEOPOOL_RX "|"
+ D_SENSOR_SDM72_TX "|" D_SENSOR_SDM72_RX "|"
;
const char kSensorNamesFixed[] PROGMEM =
@@ -431,10 +431,6 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_SSD1331_CS),
AGPIO(GPIO_SSD1331_DC),
#endif // USE_DISPLAY_SSD1331
-#ifdef USE_DISPLAY_TM1637
- AGPIO(GPIO_TM1637_CLK),
- AGPIO(GPIO_TM1637_DIO),
-#endif // USE_DISPLAY_TM1637
AGPIO(GPIO_BACKLIGHT), // Display backlight control
AGPIO(GPIO_OLED_RESET), // OLED Display Reset
#endif
@@ -611,6 +607,10 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_WE517_TX), // WE517 Serial interface
AGPIO(GPIO_WE517_RX), // WE517 Serial interface
#endif
+#ifdef USE_SDM72
+ AGPIO(GPIO_SDM72_TX), // SDM72 Serial interface
+ AGPIO(GPIO_SDM72_RX), // SDM72 Serial interface
+#endif
#endif // USE_ENERGY_SENSOR
/*-------------------------------------------------------------------------------------------*\
diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h
index e0ccb2a6b..ec0ef2dcf 100644
--- a/tasmota/tasmota_version.h
+++ b/tasmota/tasmota_version.h
@@ -20,6 +20,6 @@
#ifndef _TASMOTA_VERSION_H_
#define _TASMOTA_VERSION_H_
-const uint32_t VERSION = 0x09020006;
+const uint32_t VERSION = 0x09020007;
#endif // _TASMOTA_VERSION_H_
diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino
index f253838aa..d63472a9d 100644
--- a/tasmota/xdrv_03_energy.ino
+++ b/tasmota/xdrv_03_energy.ino
@@ -80,9 +80,9 @@ struct ENERGY {
float power_factor[3] = { NAN, NAN, NAN }; // 0.12
float frequency[3] = { NAN, NAN, NAN }; // 123.1 Hz
-#ifdef SDM630_IMPORT
+#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP)
float import_active[3] = { NAN, NAN, NAN }; // 123.123 kWh
-#endif // SDM630_IMPORT
+#endif // SDM630_IMPORT || SDM72_IMPEXP
float export_active[3] = { NAN, NAN, NAN }; // 123.123 kWh
float start_energy = 0; // 12345.12345 kWh total previous
@@ -919,10 +919,10 @@ const char HTTP_ENERGY_SNS2[] PROGMEM =
const char HTTP_ENERGY_SNS3[] PROGMEM =
"{s}" D_EXPORT_ACTIVE "{m}%s " D_UNIT_KILOWATTHOUR "{e}";
-#ifdef SDM630_IMPORT
+#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP)
const char HTTP_ENERGY_SNS4[] PROGMEM =
"{s}" D_IMPORT_ACTIVE "{m}%s " D_UNIT_KILOWATTHOUR "{e}";
-#endif // SDM630_IMPORT
+#endif // SDM630_IMPORT || SDM72_IMPEXP
#endif // USE_WEBSERVER
void EnergyShow(bool json)
@@ -987,17 +987,17 @@ void EnergyShow(bool json)
char voltage_chr[Energy.phase_count][FLOATSZ];
char current_chr[Energy.phase_count][FLOATSZ];
char active_power_chr[Energy.phase_count][FLOATSZ];
-#ifdef SDM630_IMPORT
+#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP)
char import_active_chr[Energy.phase_count][FLOATSZ];
-#endif // SDM630_IMPORT
+#endif // SDM630_IMPORT || SDM72_IMPEXP
char export_active_chr[Energy.phase_count][FLOATSZ];
for (uint32_t i = 0; i < Energy.phase_count; i++) {
dtostrfd(Energy.voltage[i], Settings.flag2.voltage_resolution, voltage_chr[i]);
dtostrfd(Energy.current[i], Settings.flag2.current_resolution, current_chr[i]);
dtostrfd(Energy.active_power[i], Settings.flag2.wattage_resolution, active_power_chr[i]);
-#ifdef SDM630_IMPORT
+#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP)
dtostrfd(Energy.import_active[i], Settings.flag2.energy_resolution, import_active_chr[i]);
-#endif // SDM630_IMPORT
+#endif // SDM630_IMPORT || SDM72_IMPEXP
dtostrfd(Energy.export_active[i], Settings.flag2.energy_resolution, export_active_chr[i]);
}
@@ -1040,7 +1040,7 @@ void EnergyShow(bool json)
energy_yesterday_chr,
energy_daily_chr);
- #ifdef SDM630_IMPORT
+ #if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP)
if (!isnan(Energy.import_active[0])) {
ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT_ACTIVE "\":%s"),
EnergyFormat(value_chr, import_active_chr[0], json));
@@ -1049,7 +1049,7 @@ void EnergyShow(bool json)
EnergyFormatIndex(value_chr, energy_return_chr[0], json, 2));
}
}
-#endif // SDM630_IMPORT
+#endif // SDM630_IMPORT || SDM72_IMPEXP
if (!isnan(Energy.export_active[0])) {
ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT_ACTIVE "\":%s"),
@@ -1152,11 +1152,11 @@ void EnergyShow(bool json)
if (!isnan(Energy.export_active[0])) {
WSContentSend_PD(HTTP_ENERGY_SNS3, EnergyFormat(value_chr, export_active_chr[0], json));
}
-#ifdef SDM630_IMPORT
+#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP)
if (!isnan(Energy.import_active[0])) {
WSContentSend_PD(HTTP_ENERGY_SNS4, EnergyFormat(value_chr, import_active_chr[0], json));
}
-#endif // SDM630_IMPORT
+#endif // SDM630_IMPORT || SDM72_IMPEXP
XnrgCall(FUNC_WEB_SENSOR);
#endif // USE_WEBSERVER
diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino
index bdc334d0e..395fae4b5 100644
--- a/tasmota/xdrv_04_light.ino
+++ b/tasmota/xdrv_04_light.ino
@@ -234,7 +234,6 @@ struct LIGHT {
bool fade_initialized = false; // dont't fade at startup
bool fade_running = false;
#ifdef USE_DEVICE_GROUPS
- uint8_t device_group_index;
uint8_t last_scheme = 0;
bool devgrp_no_channels_out = false; // don't share channels with device group (e.g. if scheme set by other device)
#ifdef USE_DGR_LIGHT_SEQUENCE
@@ -1118,12 +1117,6 @@ void LightInit(void)
Light.device--; // we take the last two devices as lights
}
LightCalcPWMRange();
-#ifdef USE_DEVICE_GROUPS
- Light.device_group_index = 0;
- if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups
- Light.device_group_index = Light.device - 1;
- }
-#endif // USE_DEVICE_GROUPS
#ifdef DEBUG_LIGHT
AddLog_P(LOG_LEVEL_DEBUG_MORE, "LightInit Light.pwm_multi_channels=%d Light.subtype=%d Light.device=%d TasmotaGlobal.devices_present=%d",
Light.pwm_multi_channels, Light.subtype, Light.device, TasmotaGlobal.devices_present);
@@ -1708,7 +1701,7 @@ void LightAnimate(void)
#ifdef USE_DEVICE_GROUPS
if (Settings.light_scheme != Light.last_scheme) {
Light.last_scheme = Settings.light_scheme;
- SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme);
+ SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme);
Light.devgrp_no_channels_out = false;
}
#endif // USE_DEVICE_GROUPS
@@ -1730,7 +1723,7 @@ void LightAnimate(void)
}
if (Light.update) {
#ifdef USE_DEVICE_GROUPS
- if (Light.power && !Light.devgrp_no_channels_out) LightSendDeviceGroupStatus(false);
+ if (Light.power && !Light.devgrp_no_channels_out) LightSendDeviceGroupStatus();
#endif // USE_DEVICE_GROUPS
uint16_t cur_col_10[LST_MAX]; // 10 bits resolution
@@ -2172,25 +2165,28 @@ bool calcGammaBulbs(uint16_t cur_col_10[5]) {
}
#ifdef USE_DEVICE_GROUPS
-void LightSendDeviceGroupStatus(bool status)
+void LightSendDeviceGroupStatus()
{
static uint8_t last_bri;
uint8_t bri = light_state.getBri();
- bool send_bri_update = (status || bri != last_bri);
+ bool send_bri_update = (building_status_message || bri != last_bri);
if (Light.subtype > LST_SINGLE) {
- static uint8_t channels[LST_MAX + 1] = { 0, 0, 0, 0, 0, 0 };
- if (status) {
- light_state.getChannels(channels);
+ static uint8_t last_channels[LST_MAX + 1] = { 0, 0, 0, 0, 0, 0 };
+ uint8_t channels[LST_MAX];
+
+ light_state.getChannelsRaw(channels);
+ uint8_t color_mode = light_state.getColorMode();
+ if (!(color_mode & LCM_RGB)) channels[0] = channels[1] = channels[2] = 0;
+ if (!(color_mode & LCM_CT)) channels[3] = channels[4] = 0;
+ if (building_status_message || memcmp(channels, last_channels, LST_MAX)) {
+ memcpy(last_channels, channels, LST_MAX);
+ last_channels[LST_MAX]++;
+ SendDeviceGroupMessage(Light.device, (send_bri_update ? DGR_MSGTYP_PARTIAL_UPDATE : DGR_MSGTYP_UPDATE), DGR_ITEM_LIGHT_CHANNELS, last_channels);
}
- else {
- memcpy(channels, Light.new_color, LST_MAX);
- channels[LST_MAX]++;
- }
- SendDeviceGroupMessage(Light.device_group_index, (send_bri_update ? DGR_MSGTYP_PARTIAL_UPDATE : DGR_MSGTYP_UPDATE), DGR_ITEM_LIGHT_CHANNELS, channels);
}
if (send_bri_update) {
last_bri = bri;
- SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_BRI, light_state.getBri());
+ SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_BRI, light_state.getBri());
}
}
@@ -2199,10 +2195,7 @@ void LightHandleDevGroupItem(void)
static bool send_state = false;
static bool restore_power = false;
-//#ifdef USE_PWM_DIMMER_REMOTE
-// if (!(XdrvMailbox.index & DGR_FLAG_LOCAL)) return;
-//#endif // USE_PWM_DIMMER_REMOTE
- if (*XdrvMailbox.topic != Light.device_group_index) return;
+ if (Settings.device_group_tie[*XdrvMailbox.topic] != Light.device) return;
bool more_to_come;
uint32_t value = XdrvMailbox.payload;
switch (XdrvMailbox.command_code) {
@@ -2218,7 +2211,7 @@ void LightHandleDevGroupItem(void)
LightAnimate();
- TasmotaGlobal.skip_light_fade = true;
+ TasmotaGlobal.skip_light_fade = false;
if (send_state && !more_to_come) {
light_controller.saveSettings();
if (Settings.flag3.hass_tele_on_power) { // SetOption59 - Send tele/%topic%/STATE in addition to stat/%topic%/RESULT
@@ -2242,8 +2235,9 @@ void LightHandleDevGroupItem(void)
}
break;
case DGR_ITEM_LIGHT_CHANNELS:
-#ifdef USE_DGR_LIGHT_SEQUENCE
{
+ uint8_t bri = light_state.getBri();
+#ifdef USE_DGR_LIGHT_SEQUENCE
static uint8_t last_sequence = 0;
// If a sequence offset is set, set the channels to the ones we received
@@ -2259,13 +2253,11 @@ void LightHandleDevGroupItem(void)
memcpy(&Light.channels_fifo[last_entry], XdrvMailbox.data, LST_MAX);
}
}
- else {
+ else
#endif // USE_DGR_LIGHT_SEQUENCE
light_controller.changeChannels((uint8_t *)XdrvMailbox.data);
-#ifdef USE_DGR_LIGHT_SEQUENCE
- }
+ light_controller.changeBri(bri);
}
-#endif // USE_DGR_LIGHT_SEQUENCE
send_state = true;
break;
case DGR_ITEM_LIGHT_FIXED_COLOR:
@@ -2319,9 +2311,9 @@ void LightHandleDevGroupItem(void)
}
break;
case DGR_ITEM_STATUS:
- SendLocalDeviceGroupMessage(DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade,
+ SendDeviceGroupMessage(Light.device, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade,
DGR_ITEM_LIGHT_SPEED, Settings.light_speed, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme);
- LightSendDeviceGroupStatus(true);
+ LightSendDeviceGroupStatus();
break;
}
}
@@ -2743,7 +2735,7 @@ void CmndDimmer(void)
uint8_t bri = light_state.getBri();
if (bri != Settings.bri_power_on) {
Settings.bri_power_on = bri;
- SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on);
+ SendDeviceGroupMessage(Light.device, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on);
}
#endif // USE_PWM_DIMMER && USE_DEVICE_GROUPS
Light.update = true;
@@ -2836,58 +2828,62 @@ void CmndRgbwwTable(void)
void CmndFade(void)
{
- // Fade - Show current Fade state
- // Fade 0 - Turn Fade Off
- // Fade On - Turn Fade On
- // Fade Toggle - Toggle Fade state
- switch (XdrvMailbox.payload) {
- case 0: // Off
- case 1: // On
- Settings.light_fade = XdrvMailbox.payload;
- break;
- case 2: // Toggle
- Settings.light_fade ^= 1;
- break;
+ if (2 == XdrvMailbox.index) {
+ // Home Assistant backwards compatibility, can be removed mid 2021
+ } else {
+ // Fade - Show current Fade state
+ // Fade 0 - Turn Fade Off
+ // Fade On - Turn Fade On
+ // Fade Toggle - Toggle Fade state
+ switch (XdrvMailbox.payload) {
+ case 0: // Off
+ case 1: // On
+ Settings.light_fade = XdrvMailbox.payload;
+ break;
+ case 2: // Toggle
+ Settings.light_fade ^= 1;
+ break;
+ }
+ #ifdef USE_DEVICE_GROUPS
+ if (XdrvMailbox.payload >= 0 && XdrvMailbox.payload <= 2) SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade);
+ #endif // USE_DEVICE_GROUPS
+ if (!Settings.light_fade) { Light.fade_running = false; }
}
-#ifdef USE_DEVICE_GROUPS
- if (XdrvMailbox.payload >= 0 && XdrvMailbox.payload <= 2) SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade);
-#endif // USE_DEVICE_GROUPS
- if (!Settings.light_fade) { Light.fade_running = false; }
ResponseCmndStateText(Settings.light_fade);
}
void CmndSpeed(void)
{
- if (XdrvMailbox.index == 2) {
+ if (2 == XdrvMailbox.index) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 40)) {
Light.fade_once_enabled = true;
- Light.fade_once_value = XdrvMailbox.payload > 0;
+ Light.fade_once_value = (XdrvMailbox.payload > 0);
Light.speed_once_enabled = true;
Light.speed_once_value = XdrvMailbox.payload;
if (!Light.fade_once_value) { Light.fade_running = false; }
}
- return;
- }
-
- // Speed 1 - Fast
- // Speed 40 - Very slow
- // Speed + - Increment Speed
- // Speed - - Decrement Speed
- if (1 == XdrvMailbox.data_len) {
- if (('+' == XdrvMailbox.data[0]) && (Settings.light_speed > 1)) {
- XdrvMailbox.payload = Settings.light_speed - 1;
+ ResponseCmndNumber(Light.speed_once_value);
+ } else {
+ // Speed 1 - Fast
+ // Speed 40 - Very slow
+ // Speed + - Increment Speed
+ // Speed - - Decrement Speed
+ if (1 == XdrvMailbox.data_len) {
+ if (('+' == XdrvMailbox.data[0]) && (Settings.light_speed > 1)) {
+ XdrvMailbox.payload = Settings.light_speed - 1;
+ }
+ else if (('-' == XdrvMailbox.data[0]) && (Settings.light_speed < 40)) {
+ XdrvMailbox.payload = Settings.light_speed + 1;
+ }
}
- else if (('-' == XdrvMailbox.data[0]) && (Settings.light_speed < 40)) {
- XdrvMailbox.payload = Settings.light_speed + 1;
- }
- }
- if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 40)) {
- Settings.light_speed = XdrvMailbox.payload;
+ if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 40)) {
+ Settings.light_speed = XdrvMailbox.payload;
#ifdef USE_DEVICE_GROUPS
- SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SPEED, Settings.light_speed);
+ SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SPEED, Settings.light_speed);
#endif // USE_DEVICE_GROUPS
+ }
+ ResponseCmndNumber(Settings.light_speed);
}
- ResponseCmndNumber(Settings.light_speed);
}
void CmndWakeupDuration(void)
diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino
index fc52aee8a..cdf374a27 100644
--- a/tasmota/xdrv_10_rules.ino
+++ b/tasmota/xdrv_10_rules.ino
@@ -2191,7 +2191,7 @@ void CmndEvent(void)
if (XdrvMailbox.data_len > 0) {
strlcpy(Rules.event_data, XdrvMailbox.data, sizeof(Rules.event_data));
#ifdef USE_DEVICE_GROUPS
- SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_EVENT, XdrvMailbox.data);
+ SendDeviceGroupMessage(1, DGR_MSGTYP_UPDATE, DGR_ITEM_EVENT, XdrvMailbox.data);
#endif // USE_DEVICE_GROUPS
}
if (XdrvMailbox.command) ResponseCmndDone();
diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino
index 733934f9f..8f4d8e8d8 100644
--- a/tasmota/xdrv_16_tuyamcu.ino
+++ b/tasmota/xdrv_16_tuyamcu.ino
@@ -1354,13 +1354,16 @@ void TuyaSensorsShow(bool json)
break;
}
}
- if (AsModuleTuyaMS()) {
- WSContentSend_P(PSTR("{s}" D_JSON_IRHVAC_MODE "{m}%d{e}"), Tuya.ModeSet);
- }
#endif // USE_WEBSERVER
}
}
+ #ifdef USE_WEBSERVER
+ if (AsModuleTuyaMS()) {
+ WSContentSend_P(PSTR("{s}" D_JSON_IRHVAC_MODE "{m}%d{e}"), Tuya.ModeSet);
+ }
+ #endif // USE_WEBSERVER
+
if (RootName) { ResponseJsonEnd();}
}
diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino
index 4b7836452..b99499165 100644
--- a/tasmota/xdrv_27_shutter.ino
+++ b/tasmota/xdrv_27_shutter.ino
@@ -429,7 +429,7 @@ void ShutterDecellerateForStop(uint8_t i)
}
void ShutterPowerOff(uint8_t i) {
- AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop Shutter %d. Switchmode %d"), i,Shutter[i].switch_mode);
+ AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop Shutter %d. Switchmode %d"), i+1,Shutter[i].switch_mode); // fix log to indicate correct shutter number
ShutterDecellerateForStop(i);
switch (Shutter[i].switch_mode) {
case SHT_SWITCH:
@@ -458,7 +458,12 @@ void ShutterPowerOff(uint8_t i) {
switch (ShutterGlobal.position_mode) {
case SHT_PWM_VALUE:
char scmnd[20];
- snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM " %d" ),Shutter[i].pwm_value);
+#ifdef SHUTTER_CLEAR_PWM_ONSTOP
+ // free the PWM servo lock on stop.
+ snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM "%d 0" ), i+1);
+#else
+ snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM "%d %d" ), i+1,Shutter[i].pwm_value);
+#endif
ExecuteCommand(scmnd, SRC_BUTTON);
break;
}
diff --git a/tasmota/xdrv_35_pwm_dimmer.ino b/tasmota/xdrv_35_pwm_dimmer.ino
index 3bce167a2..892f05da9 100644
--- a/tasmota/xdrv_35_pwm_dimmer.ino
+++ b/tasmota/xdrv_35_pwm_dimmer.ino
@@ -252,11 +252,11 @@ void PWMDimmerHandleDevGroupItem(void)
#ifdef USE_PWM_DIMMER_REMOTE
if (is_local)
#endif // USE_PWM_DIMMER_REMOTE
- SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on,
+ SendDeviceGroupMessage(0, DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on,
DGR_ITEM_BRI_PRESET_LOW, Settings.bri_preset_low, DGR_ITEM_BRI_PRESET_HIGH, Settings.bri_preset_high);
#ifdef USE_PWM_DIMMER_REMOTE
else
- SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, remote_pwm_dimmer->power_on,
+ SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, remote_pwm_dimmer->power_on,
DGR_ITEM_BRI_POWER_ON, remote_pwm_dimmer->bri_power_on, DGR_ITEM_BRI_PRESET_LOW, remote_pwm_dimmer->bri_preset_low,
DGR_ITEM_BRI_PRESET_HIGH, remote_pwm_dimmer->bri_preset_high);
#endif // USE_PWM_DIMMER_REMOTE
@@ -491,6 +491,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
}
// If we need to adjust the brightness, do it.
+ uint32_t negated_device_group_index = -power_button_index;
if (bri_offset) {
int32_t bri;
#ifdef USE_PWM_DIMMER_REMOTE
@@ -509,7 +510,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
}
if (new_bri != bri) {
#ifdef USE_DEVICE_GROUPS
- SendDeviceGroupMessage(power_button_index, (dgr_more_to_come ? DGR_MSGTYP_UPDATE_MORE_TO_COME : DGR_MSGTYP_UPDATE_DIRECT), DGR_ITEM_LIGHT_BRI, new_bri);
+ SendDeviceGroupMessage(negated_device_group_index, (dgr_more_to_come ? DGR_MSGTYP_UPDATE_MORE_TO_COME : DGR_MSGTYP_UPDATE_DIRECT), DGR_ITEM_LIGHT_BRI, new_bri);
#endif // USE_DEVICE_GROUPS
#ifdef USE_PWM_DIMMER_REMOTE
if (active_remote_pwm_dimmer) {
@@ -559,9 +560,9 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
}
#endif // USE_PWM_DIMMER_REMOTE
if (new_power)
- SendDeviceGroupMessage(power_button_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_BRI, power_on_bri, DGR_ITEM_POWER, new_power);
+ SendDeviceGroupMessage(negated_device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_BRI, power_on_bri, DGR_ITEM_POWER, new_power);
else
- SendDeviceGroupMessage(power_button_index, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, new_power);
+ SendDeviceGroupMessage(negated_device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, new_power);
#endif // USE_DEVICE_GROUPS
#ifdef USE_PWM_DIMMER_REMOTE
if (active_remote_pwm_dimmer)
@@ -639,7 +640,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
if (handle_tap)
#endif // USE_PWM_DIMMER_REMOTE
message_type = (DevGroupMessageType)(message_type + DGR_MSGTYPFLAG_WITH_LOCAL);
- SendDeviceGroupMessage(power_button_index, message_type, dgr_item, dgr_value);
+ SendDeviceGroupMessage(negated_device_group_index, message_type, dgr_item, dgr_value);
#endif // USE_DEVICE_GROUPS
#ifdef USE_PWM_DIMMER_REMOTE
if (!active_remote_pwm_dimmer)
@@ -697,7 +698,7 @@ void CmndBriPreset(void)
Settings.bri_preset_high = parm[0];
}
#ifdef USE_DEVICE_GROUPS
- SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_PRESET_LOW, Settings.bri_preset_low, DGR_ITEM_BRI_PRESET_HIGH, Settings.bri_preset_high);
+ SendDeviceGroupMessage(0, DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_PRESET_LOW, Settings.bri_preset_low, DGR_ITEM_BRI_PRESET_HIGH, Settings.bri_preset_high);
#endif // USE_DEVICE_GROUPS
}
}
diff --git a/tasmota/xdrv_42_i2s_audio.ino b/tasmota/xdrv_42_i2s_audio.ino
index 359308cba..a63918206 100644
--- a/tasmota/xdrv_42_i2s_audio.ino
+++ b/tasmota/xdrv_42_i2s_audio.ino
@@ -1,5 +1,5 @@
/*
- xdrv_42_i2s_audio.ino - audio dac support for Tasmota
+ xdrv_42_i2s_audio.ino - Audio dac support for Tasmota
Copyright (C) 2021 Gerhard Mutz and Theo Arends
@@ -17,16 +17,39 @@
along with this program. If not, see .
*/
-#if (defined(USE_I2S_AUDIO) || defined(USE_TTGO_WATCH) || defined(USE_M5STACK_CORE2))
+#if (defined(USE_I2S_AUDIO) || defined(USE_TTGO_WATCH) || defined(USE_M5STACK_CORE2))
+/*********************************************************************************************\
+ * I2S support using an external DAC or a speaker connected to GPIO03 using a transistor
+ *
+ * Uses fixed GPIOs for ESP8266:
+ * I2S Out Data GPIO03 (Rx)
+ * I2S Out Bit Clock GPIO15
+ * I2S Out Word Select GPIO02
+ * I2S In Data GPIO12
+ * I2S In Bit Clock GPIO13
+ * I2S In Word Select GPIO14
+\*********************************************************************************************/
+
+#define XDRV_42 42
+
+#define USE_I2S_EXTERNAL_DAC 1
+//#define USE_I2S_NO_DAC // Add support for transistor-based output without DAC
+//#define USE_I2S_WEBRADIO // Add support for web radio
+//#define USE_I2S_SAY_TIME // Add support for english speaking clock
+
#include "AudioFileSourcePROGMEM.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
-#include "AudioOutputI2S.h"
+#ifdef USE_I2S_NO_DAC
+ #include "AudioOutputI2SNoDAC.h" // Transistor-driven lower quality connected to RX pin
+#else
+ #include "AudioOutputI2S.h" // External I2S DAC IC
+#endif // USE_I2S_NO_DAC
#include
#include "AudioFileSourceFS.h"
-#ifdef SAY_TIME
-#include "AudioGeneratorTalkie.h"
-#endif
+#ifdef USE_I2S_SAY_TIME
+ #include "AudioGeneratorTalkie.h"
+#endif // USE_I2S_SAY_TIME
#include "AudioFileSourceICYStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorAAC.h"
@@ -41,7 +64,7 @@
#undef AUDIO_PWR_OFF
#define AUDIO_PWR_ON TTGO_audio_power(true);
#define AUDIO_PWR_OFF TTGO_audio_power(false);
-#endif // USE_TTGO_WATCH
+#endif // USE_TTGO_WATCH
#ifdef USE_M5STACK_CORE2
#undef AUDIO_PWR_ON
@@ -54,21 +77,19 @@
#define DAC_IIS_BCK 12
#define DAC_IIS_WS 0
#define DAC_IIS_DOUT 2
-#endif // USE_M5STACK_CORE2
-
-
-#define EXTERNAL_DAC_PLAY 1
-
-#define XDRV_42 42
+#endif // USE_M5STACK_CORE2
AudioGeneratorMP3 *mp3 = nullptr;
AudioFileSourceFS *file;
-AudioOutputI2S *out;
+#ifdef USE_I2S_NO_DAC
+ AudioOutputI2SNoDAC *out;
+#else
+ AudioOutputI2S *out;
+#endif // USE_I2S_NO_DAC
AudioFileSourceID3 *id3;
AudioGeneratorMP3 *decoder = NULL;
void *mp3ram = NULL;
-
extern FS *ufsp;
#ifdef ESP8266
@@ -81,7 +102,7 @@ const int preallocateCodecSize = 29192; // MP3 codec max mem needed
//const int preallocateCodecSize = 85332; // AAC+SBR codec max mem needed
#endif // ESP32
-#ifdef USE_WEBRADIO
+#ifdef USE_I2S_WEBRADIO
AudioFileSourceICYStream *ifile = NULL;
AudioFileSourceBuffer *buff = NULL;
char wr_title[64];
@@ -90,11 +111,11 @@ char wr_title[64];
void *preallocateBuffer = NULL;
void *preallocateCodec = NULL;
uint32_t retryms = 0;
-#endif // USE_WEBRADIO
+#endif // USE_I2S_WEBRADIO
-#ifdef SAY_TIME
+#ifdef USE_I2S_SAY_TIME
AudioGeneratorTalkie *talkie = nullptr;
-#endif // SAY_TIME
+#endif // USE_I2S_SAY_TIME
//! MAX98357A + INMP441 DOUBLE I2S BOARD
#ifdef ESP8266
@@ -111,26 +132,26 @@ AudioGeneratorTalkie *talkie = nullptr;
#ifndef DAC_IIS_BCK
#undef DAC_IIS_BCK
#define DAC_IIS_BCK 26
-#endif // DAC_IIS_BCK
+#endif // DAC_IIS_BCK
#ifndef DAC_IIS_WS
#undef DAC_IIS_WS
#define DAC_IIS_WS 25
-#endif // DAC_IIS_WS
+#endif // DAC_IIS_WS
#ifndef DAC_IIS_DOUT
#undef DAC_IIS_DOUT
#define DAC_IIS_DOUT 33
-#endif // DAC_IIS_DOUT
+#endif // DAC_IIS_DOUT
#ifndef DAC_IIS_DIN
#undef DAC_IIS_DIN
-#define DAC_IIS_DIN 34
-#endif // DAC_IIS_DIN
+#define DAC_IIS_DIN 34
+#endif // DAC_IIS_DIN
#endif // ESP32
-#ifdef SAY_TIME
+#ifdef USE_I2S_SAY_TIME
long timezone = 2;
byte daysavetime = 1;
@@ -229,21 +250,29 @@ void sayTime(int hour, int minutes, AudioGeneratorTalkie *talkie) {
out->stop();
AUDIO_PWR_OFF
}
-#endif // SAY_TIME
+#endif // USE_I2S_SAY_TIME
// should be in settings
uint8_t is2_volume;
void I2S_Init(void) {
-#if EXTERNAL_DAC_PLAY
- out = new AudioOutputI2S();
+#if USE_I2S_EXTERNAL_DAC
+ #ifdef USE_I2S_NO_DAC
+ out = new AudioOutputI2SNoDAC();
+ #else
+ out = new AudioOutputI2S();
+ #endif // USE_I2S_NO_DAC
#ifdef ESP32
- out->SetPinout(DAC_IIS_BCK, DAC_IIS_WS, DAC_IIS_DOUT);
+ out->SetPinout(DAC_IIS_BCK, DAC_IIS_WS, DAC_IIS_DOUT);
#endif // ESP32
#else
- out = new AudioOutputI2S(0, 1);
-#endif // EXTERNAL_DAC_PLAY
+ #ifdef USE_I2S_NO_DAC
+ out = new AudioOutputI2SNoDAC();
+ #else
+ out = new AudioOutputI2S(0, 1); // Internal DAC port 0
+ #endif // USE_I2S_NO_DAC
+#endif // USE_I2S_EXTERNAL_DAC
is2_volume=10;
out->SetGain(((float)is2_volume/100.0)*4.0);
@@ -255,7 +284,7 @@ void I2S_Init(void) {
mp3ram = heap_caps_malloc(preallocateCodecSize, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
}
-#ifdef USE_WEBRADIO
+#ifdef USE_I2S_WEBRADIO
if (psramFound()) {
preallocateBuffer = heap_caps_malloc(preallocateBufferSize, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
preallocateCodec = heap_caps_malloc(preallocateCodecSize, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
@@ -266,12 +295,11 @@ void I2S_Init(void) {
if (!preallocateBuffer || !preallocateCodec) {
//Serial.printf_P(PSTR("FATAL ERROR: Unable to preallocate %d bytes for app\n"), preallocateBufferSize+preallocateCodecSize);
}
-#endif // USE_WEBRADIO
-#endif // ESP32
+#endif // USE_I2S_WEBRADIO
+#endif // ESP32
}
-
#ifdef ESP32
#define MODE_MIC 0
#define MODE_SPK 1
@@ -426,7 +454,7 @@ bool SaveWav(char *path, uint8_t *buff, uint32_t size) {
return true;
}
-#endif // ESP32
+#endif // ESP32
#ifdef ESP32
TaskHandle_t mp3_task_h;
@@ -447,9 +475,9 @@ void mp3_task(void *arg) {
}
}
}
-#endif // ESP32
+#endif // ESP32
-#ifdef USE_WEBRADIO
+#ifdef USE_I2S_WEBRADIO
void MDCallback(void *cbData, const char *type, bool isUnicode, const char *str) {
const char *ptr = reinterpret_cast(cbData);
(void) isUnicode; // Punt this ball for now
@@ -557,7 +585,7 @@ void Cmd_MicRec(void) {
ResponseCmndChar(XdrvMailbox.data);
}
}
-#endif // USE_M5STACK_CORE2
+#endif // USE_M5STACK_CORE2
const char HTTP_WEBRADIO[] PROGMEM =
"{s}" "I2S_WR-Title" "{m}%s{e}";
@@ -568,7 +596,7 @@ void I2S_WR_Show(void) {
}
}
-#endif
+#endif // USE_I2S_WEBRADIO
#ifdef ESP32
void Play_mp3(const char *path) {
@@ -610,7 +638,7 @@ void Play_mp3(const char *path) {
mp3_delete();
}
-#endif // USE_SCRIPT
+#endif // USE_SCRIPT
}
void mp3_delete(void) {
@@ -620,7 +648,7 @@ void mp3_delete(void) {
mp3=nullptr;
AUDIO_PWR_OFF
}
-#endif // ESP32
+#endif // ESP32
void Say(char *text) {
@@ -642,22 +670,22 @@ const char kI2SAudio_Commands[] PROGMEM = "I2S|"
"Say|Gain|Time"
#ifdef ESP32
"|Play"
-#ifdef USE_WEBRADIO
+#ifdef USE_I2S_WEBRADIO
"|WR"
-#endif // USE_WEBRADIO
+#endif // USE_I2S_WEBRADIO
#ifdef USE_M5STACK_CORE2
"|REC"
-#endif // USE_M5STACK_CORE2
-#endif // ESP32
+#endif // USE_M5STACK_CORE2
+#endif // ESP32
;
void (* const I2SAudio_Command[])(void) PROGMEM = {
&Cmd_Say, &Cmd_Gain, &Cmd_Time
#ifdef ESP32
,&Cmd_Play
-#ifdef USE_WEBRADIO
+#ifdef USE_I2S_WEBRADIO
,&Cmd_WebRadio
-#endif // USE_WEBRADIO
+#endif // USE_I2S_WEBRADIO
#ifdef USE_M5STACK_CORE2
,&Cmd_MicRec
#endif // USE_M5STACK_CORE2
@@ -691,9 +719,9 @@ void Cmd_Say(void) {
}
void Cmd_Time(void) {
-#ifdef SAY_TIME
+#ifdef USE_I2S_SAY_TIME
sayTime(RtcTime.hour, RtcTime.minute, talkie);
-#endif // SAY_TIME
+#endif // USE_I2S_SAY_TIME
ResponseCmndDone();
}
@@ -712,12 +740,12 @@ bool Xdrv42(uint8_t function) {
I2S_Init();
break;
#ifdef USE_WEBSERVER
-#ifdef USE_WEBRADIO
+#ifdef USE_I2S_WEBRADIO
case FUNC_WEB_SENSOR:
I2S_WR_Show();
break;
-#endif // USE_WEBRADIO
-#endif // USE_WEBSERVER
+#endif // USE_I2S_WEBRADIO
+#endif // USE_WEBSERVER
}
return result;
}
diff --git a/tasmota/xnrg_18_sdm72.ino b/tasmota/xnrg_18_sdm72.ino
new file mode 100644
index 000000000..0da11cba3
--- /dev/null
+++ b/tasmota/xnrg_18_sdm72.ino
@@ -0,0 +1,210 @@
+/*
+ xnrg_18_sdm72.ino - Eastron SDM72D-M Modbus energy meter support for Tasmota
+
+ Copyright (C) 2021 Gennaro Tortone, Theo Arends and Norbert Richter
+
+ 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 .
+*/
+
+#ifdef USE_ENERGY_SENSOR
+#ifdef USE_SDM72
+/*********************************************************************************************\
+ * Eastron SDM72 Modbus energy meter
+\*********************************************************************************************/
+
+#define XNRG_18 18
+
+// can be user defined in my_user_config.h
+#ifndef SDM72_SPEED
+ #define SDM72_SPEED 9600 // default SDM72 Modbus address
+#endif
+// can be user defined in my_user_config.h
+#ifndef SDM72_ADDR
+ #define SDM72_ADDR 1 // default SDM72 Modbus address
+#endif
+
+#include
+TasmotaModbus *Sdm72Modbus;
+
+const uint16_t sdm72_register[] {
+ 0x0034, // 0 SDM72D_POWER [W]
+ 0x0156, // 3 SDM72D_TOTAL_ACTIVE [kWh]
+#ifdef SDM72_IMPEXP
+ 0x0500, // 1 SDM72D_IMPORT_POWER [W]
+ 0x0502, // 2 SDM72D_EXPORT_POWER [W]
+ 0x0048, // 4 SDM72D_IMPORT_ACTIVE [kWh]
+ 0x004A // 5 SDM72D_EXPORT_ACTIVE [kWh]
+#endif // SDM72_IMPEXP
+};
+
+struct SDM72 {
+ float total_active = NAN;
+#ifdef SDM72_IMPEXP
+ float import_power = 0;
+ float export_power = 0;
+ float import_active = 0;
+#endif // SDM72_IMPEXP
+ uint8_t read_state = 0;
+ uint8_t send_retry = 0;
+} Sdm72;
+
+/*********************************************************************************************/
+
+void Sdm72Every250ms(void)
+{
+ bool data_ready = Sdm72Modbus->ReceiveReady();
+
+ if (data_ready) {
+ uint8_t buffer[14]; // At least 5 + (2 * 2) = 9
+
+ uint32_t error = Sdm72Modbus->ReceiveBuffer(buffer, 2);
+ AddLogBuffer(LOG_LEVEL_DEBUG_MORE, buffer, Sdm72Modbus->ReceiveCount());
+
+ if (error) {
+ AddLog(LOG_LEVEL_DEBUG, PSTR("SDM: SDM72 error %d"), error);
+ } else {
+ Energy.data_valid[0] = 0;
+
+ float value;
+ ((uint8_t*)&value)[3] = buffer[3]; // Get float values
+ ((uint8_t*)&value)[2] = buffer[4];
+ ((uint8_t*)&value)[1] = buffer[5];
+ ((uint8_t*)&value)[0] = buffer[6];
+
+ switch(Sdm72.read_state) {
+ case 0:
+ Energy.active_power[0] = value; // W
+ break;
+
+ case 1:
+ Sdm72.total_active = value; // kWh
+ break;
+
+#ifdef SDM72_IMPEXP
+ case 2:
+ Sdm72.import_power = value; // W
+ break;
+
+ case 3:
+ Sdm72.export_power = value; // W
+ break;
+
+ case 4:
+ Energy.import_active[0] = value; // kWh
+ break;
+
+ case 5:
+ Energy.export_active[0] = value; // kWh
+ break;
+#endif // SDM72_IMPEXP
+ }
+
+ ++Sdm72.read_state %= ARRAY_SIZE(sdm72_register);
+ if (0 == Sdm72.read_state && !isnan(Sdm72.total_active)) {
+ EnergyUpdateTotal(Sdm72.total_active, true);
+ }
+ }
+ } // end data ready
+
+ if (0 == Sdm72.send_retry || data_ready) {
+ Sdm72.send_retry = 5;
+ Sdm72Modbus->Send(SDM72_ADDR, 0x04, sdm72_register[Sdm72.read_state], 2);
+ } else {
+ Sdm72.send_retry--;
+ }
+}
+
+void Sdm72SnsInit(void)
+{
+ Sdm72Modbus = new TasmotaModbus(Pin(GPIO_SDM72_RX), Pin(GPIO_SDM72_TX));
+ uint8_t result = Sdm72Modbus->Begin(SDM72_SPEED);
+ if (result) {
+ if (2 == result) {
+ ClaimSerial();
+ }
+ } else {
+ TasmotaGlobal.energy_driver = ENERGY_NONE;
+ }
+}
+
+void Sdm72DrvInit(void)
+{
+ if (PinUsed(GPIO_SDM72_RX) && PinUsed(GPIO_SDM72_TX)) {
+ Energy.voltage_available = false;
+ Energy.current_available = false;
+ TasmotaGlobal.energy_driver = XNRG_18;
+ }
+}
+
+#ifdef USE_WEBSERVER
+#ifdef SDM72_IMPEXP
+const char HTTP_ENERGY_SDM72[] PROGMEM =
+ "{s}" D_EXPORT_POWER "{m}%*_f " D_UNIT_WATT "{e}"
+ "{s}" D_IMPORT_POWER "{m}%*_f " D_UNIT_WATT "{e}";
+#endif // SDM72_IMPEXP
+#endif // USE_WEBSERVER
+
+void Sdm72Show(bool json)
+{
+ if (isnan(Sdm72.total_active)) { return; }
+
+ if (json) {
+#ifdef SDM72_IMPEXP
+ ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT_POWER "\":%*_f,\"" D_JSON_IMPORT_POWER "\":%*_f"),
+ Settings.flag2.wattage_resolution, &Sdm72.export_power,
+ Settings.flag2.wattage_resolution, &Sdm72.import_power);
+#endif // SDM72_IMPEXP
+#ifdef USE_WEBSERVER
+ } else {
+#ifdef SDM72_IMPEXP
+ WSContentSend_PD(HTTP_ENERGY_SDM72,
+ Settings.flag2.wattage_resolution, &Sdm72.export_power,
+ Settings.flag2.wattage_resolution, &Sdm72.import_power);
+#endif // SDM72_IMPEXP
+#endif // USE_WEBSERVER
+ }
+}
+
+/*********************************************************************************************\
+ * Interface
+\*********************************************************************************************/
+
+bool Xnrg18(uint8_t function)
+{
+ bool result = false;
+
+ switch (function) {
+ case FUNC_EVERY_250_MSECOND:
+ Sdm72Every250ms();
+ break;
+ case FUNC_JSON_APPEND:
+ Sdm72Show(1);
+ break;
+#ifdef USE_WEBSERVER
+ case FUNC_WEB_SENSOR:
+ Sdm72Show(0);
+ break;
+#endif // USE_WEBSERVER
+ case FUNC_INIT:
+ Sdm72SnsInit();
+ break;
+ case FUNC_PRE_INIT:
+ Sdm72DrvInit();
+ break;
+ }
+ return result;
+}
+
+#endif // USE_SDM72
+#endif // USE_ENERGY_SENSOR
diff --git a/tasmota/xsns_02_analog.ino b/tasmota/xsns_02_analog.ino
index 73193a8af..6d581c4fd 100644
--- a/tasmota/xsns_02_analog.ino
+++ b/tasmota/xsns_02_analog.ino
@@ -42,7 +42,7 @@
#define TO_KELVIN(x) ((x) + 273.15)
// Parameters for equation
-#define ANALOG_V33 3.3 // ESP8266 Analog voltage
+#define ANALOG_V33 3.3 // ESP8266 / ESP32 Analog voltage
#define ANALOG_T0 TO_KELVIN(25.0) // 25 degrees Celcius in Kelvin (= 298.15)
// Shelly 2.5 NTC Thermistor
@@ -410,9 +410,9 @@ void AdcEverySecond(void) {
if (ADC_TEMP == Adc[idx].type) {
int adc = AdcRead(Adc[idx].pin, 2);
// Steinhart-Hart equation for thermistor as temperature sensor
- double Rt = (adc * Adc[idx].param1) / (1024.0 * ANALOG_V33 - (double)adc);
- double BC = (double)Adc[idx].param3 / 10000;
- double T = BC / (BC / ANALOG_T0 + TaylorLog(Rt / (double)Adc[idx].param2));
+ double Rt = (adc * Adc[idx].param1) / (ANALOG_RANGE * ANALOG_V33 - (double)adc); // Shelly param1 = 32000 (ANALOG_NTC_BRIDGE_RESISTANCE)
+ double BC = (double)Adc[idx].param3 / 10000; // Shelly param3 = 3350 (ANALOG_NTC_B_COEFFICIENT)
+ double T = BC / (BC / ANALOG_T0 + TaylorLog(Rt / (double)Adc[idx].param2)); // Shelly param2 = 10000 (ANALOG_NTC_RESISTANCE)
Adc[idx].temperature = ConvertTemp(TO_CELSIUS(T));
}
else if (ADC_CT_POWER == Adc[idx].type) {
diff --git a/tools/decode-status.py b/tools/decode-status.py
index 248d1c82e..995d0e111 100755
--- a/tools/decode-status.py
+++ b/tools/decode-status.py
@@ -243,9 +243,9 @@ a_features = [[
"USE_EZODO","USE_EZORGB","USE_EZOPMP","USE_AS608",
"USE_SHELLY_DIMMER","USE_RC522","USE_FTC532","USE_DISPLAY_EPAPER_42",
"USE_DISPLAY_ILI9488","USE_DISPLAY_SSD1351","USE_DISPLAY_RA8876","USE_DISPLAY_ST7789",
- "USE_DISPLAY_SSD1331","USE_DISPLAY_TM1637","USE_UFILESYS","USE_TIMEPROP","USE_PID",
+ "USE_DISPLAY_SSD1331","USE_UFILESYS","USE_TIMEPROP","USE_PID",
"USE_BS814A2","USE_SEESAW_SOIL","USE_WIEGAND","USE_NEOPOOL",
- "USE_TOF10120","","",""
+ "USE_TOF10120","USE_SDM72","",""
],[
"","","","",
"","","","",