Merged changes

This commit is contained in:
Ajith Vasudevan 2021-02-14 17:26:20 +05:30
parent 25759879ed
commit 9bcb8ccb36
108 changed files with 1673 additions and 361 deletions

View File

@ -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 | - | - |

View File

@ -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

View File

@ -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)

View File

@ -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);

View File

@ -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
*
* <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
*
* 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 <pgmspace.h>
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****/

View File

@ -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;
}
}

View File

@ -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);
};

View File

@ -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])

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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 "Изходна активна мощност"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 "Экспорт активной мощности"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 "Активна вихід"

View File

@ -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"

View File

@ -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 "有功输出"

View File

@ -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"

View File

@ -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

View File

@ -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);

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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

View File

@ -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 };

View File

@ -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

View File

@ -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

View File

@ -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
/*-------------------------------------------------------------------------------------------*\

View File

@ -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_

View File

@ -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

View File

@ -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 <SequenceOffset>
@ -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)

Some files were not shown because too many files have changed in this diff Show More