From 9bcb8ccb36fa1eaeee87198ffee0f8513612d86b Mon Sep 17 00:00:00 2001 From: Ajith Vasudevan Date: Sun, 14 Feb 2021 17:26:20 +0530 Subject: [PATCH] Merged changes --- BUILDS.md | 1 + CHANGELOG.md | 13 +- RELEASENOTES.md | 36 +- lib/default/Ext-printf/src/ext_printf.cpp | 18 +- .../.gitignore | 0 .../.travis.yml | 0 .../Arduino/epd2in9-demo/epd2in9-demo.ino | 0 .../Arduino/libraries/readme.txt | 0 .../LICENSE | 0 .../Makefile | 0 .../README.md | 0 .../components/epaper-29-ws/component.mk | 0 .../components/epaper-29-ws/epaper-29-ws.c | 0 .../components/epaper-29-ws/epaper-29-ws.h | 0 .../components/epaper-29-ws/epaper_font.c | 0 .../components/epaper-29-ws/epaper_fonts.h | 0 .../components/epaper-29-ws/font16.c | 0 .../components/epaper-29-ws/font20.c | 0 .../components/epaper-29-ws/font8.c | 0 .../components/epaper-29-ws/imagedata.cpp | 0 .../components/epaper-29-ws/imagedata.h | 0 .../docs/Doxyfile | 0 .../docs/Makefile | 0 .../docs/README.md | 0 .../docs/conf.py | 0 .../docs/gen-dxd.py | 0 .../docs/index.rst | 0 .../docs/link-roles.py | 0 .../docs/repo_util.py | 0 .../docs/requirements.txt | 0 .../library.properties | 0 .../main/README.md | 0 .../main/component.mk | 0 .../main/esp-epaper-29-ws.c | 0 .../main/imagedata.c | 0 .../main/imagedata.h | 0 .../pictures/2.9inch_e-Paper_Datasheet.pdf | Bin .../pictures/e-paper-and-esp-sample-image.jpg | Bin .../pictures/e-paper-and-esp-sample-text.jpg | Bin .../pictures/espresif-logo.bmp | Bin .../pictures/image-conversion-setup.png | Bin .../src/epdif.cpp | 0 .../src/epdif.h | 0 .../src/epdpaint.cpp | 0 .../src/epdpaint.h | 0 .../src/font12.c | 0 .../src/font16.c | 0 .../src/font20.c | 0 .../src/font24.c | 0 .../src/font24_7seg.c | 754 ++++++++++++++++++ .../src/font8.c | 0 .../src/fonts.h | 0 .../src/renderer.cpp | 90 +++ .../src/renderer.h | 19 +- .../src => Epaper_29-gemu-1.0}/epd2in9.cpp | 0 .../src => Epaper_29-gemu-1.0}/epd2in9.h | 0 .../src => Epaper_42-gemu-1.0}/epd4in2.cpp | 0 .../src => Epaper_42-gemu-1.0}/epd4in2.h | 0 pio-tools/gzip-firmware.py | 7 +- platformio.ini | 6 +- tasmota/i18n.h | 3 + tasmota/language/af_AF.h | 8 +- tasmota/language/bg_BG.h | 8 +- tasmota/language/cs_CZ.h | 8 +- tasmota/language/de_DE.h | 8 +- tasmota/language/el_GR.h | 8 +- tasmota/language/en_GB.h | 8 +- tasmota/language/es_ES.h | 8 +- tasmota/language/fr_FR.h | 8 +- tasmota/language/fy_NL.h | 10 +- tasmota/language/he_HE.h | 8 +- tasmota/language/hu_HU.h | 8 +- tasmota/language/it_IT.h | 12 +- tasmota/language/ko_KO.h | 8 +- tasmota/language/nl_NL.h | 8 +- tasmota/language/pl_PL.h | 8 +- tasmota/language/pt_BR.h | 8 +- tasmota/language/pt_PT.h | 8 +- tasmota/language/ro_RO.h | 8 +- tasmota/language/ru_RU.h | 8 +- tasmota/language/sk_SK.h | 8 +- tasmota/language/sv_SE.h | 8 +- tasmota/language/tr_TR.h | 8 +- tasmota/language/uk_UA.h | 8 +- tasmota/language/vi_VN.h | 8 +- tasmota/language/zh_CN.h | 8 +- tasmota/language/zh_TW.h | 8 +- tasmota/settings.h | 2 +- tasmota/settings.ino | 3 + tasmota/support_command.ino | 16 +- tasmota/support_device_groups.ino | 257 ++++-- tasmota/support_features.ino | 5 +- tasmota/support_tasmota.ino | 10 +- tasmota/tasmota.h | 8 +- tasmota/tasmota_configurations_ESP32.h | 8 +- tasmota/tasmota_globals.h | 1 - tasmota/tasmota_template.h | 12 +- tasmota/tasmota_version.h | 2 +- tasmota/xdrv_03_energy.ino | 24 +- tasmota/xdrv_04_light.ino | 134 ++-- tasmota/xdrv_10_rules.ino | 2 +- tasmota/xdrv_16_tuyamcu.ino | 9 +- tasmota/xdrv_27_shutter.ino | 9 +- tasmota/xdrv_35_pwm_dimmer.ino | 15 +- tasmota/xdrv_42_i2s_audio.ino | 134 ++-- tasmota/xnrg_18_sdm72.ino | 210 +++++ tasmota/xsns_02_analog.ino | 8 +- tools/decode-status.py | 4 +- 108 files changed, 1673 insertions(+), 361 deletions(-) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/.gitignore (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/.travis.yml (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/Arduino/epd2in9-demo/epd2in9-demo.ino (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/Arduino/libraries/readme.txt (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/LICENSE (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/Makefile (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/README.md (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/component.mk (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/epaper-29-ws.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/epaper-29-ws.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/epaper_font.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/epaper_fonts.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/font16.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/font20.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/font8.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/imagedata.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/imagedata.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/Doxyfile (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/Makefile (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/README.md (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/conf.py (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/gen-dxd.py (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/index.rst (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/link-roles.py (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/repo_util.py (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/requirements.txt (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/library.properties (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/README.md (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/component.mk (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/esp-epaper-29-ws.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/imagedata.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/imagedata.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/2.9inch_e-Paper_Datasheet.pdf (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/e-paper-and-esp-sample-image.jpg (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/e-paper-and-esp-sample-text.jpg (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/espresif-logo.bmp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/image-conversion-setup.png (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/epdif.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/epdif.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/epdpaint.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/epdpaint.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font12.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font16.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font20.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font24.c (100%) create mode 100644 lib/lib_display/Display_Renderer-gemu-1.0/src/font24_7seg.c rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font8.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/fonts.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/renderer.cpp (83%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/renderer.h (83%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1/src => Epaper_29-gemu-1.0}/epd2in9.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1/src => Epaper_29-gemu-1.0}/epd2in9.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1/src => Epaper_42-gemu-1.0}/epd4in2.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1/src => Epaper_42-gemu-1.0}/epd4in2.h (100%) create mode 100644 tasmota/xnrg_18_sdm72.ino 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","","" ],[ "","","","", "","","","",