Merge branch 'development' into pre-release-9.3.0

This commit is contained in:
Theo Arends 2021-02-21 12:35:19 +01:00
commit 5e3c1b6415
41 changed files with 387 additions and 310 deletions

View File

@ -3,10 +3,24 @@ All notable changes to this project will be documented in this file.
## [Released] ## [Released]
## [9.3.1] 20210223
- Release Kenneth
## [9.3.0.1]
### Changed
- Remove the need to start filenames with a slash (/) in Ufs commands
- Removed command ``VirtualCT`` as synonym for ``SetOption106`` (#11049)
### Fixed
- Ili1942 driver (#11046)
- Shutter driver (#11055)
- ESP32 Mi32 driver (#11048)
- TM1637 driver now needs ``TM1637 CLK`` and ``TM1637 DIO`` to enable (#11057)
## [9.3.0] 20210219 ## [9.3.0] 20210219
- Release Kenneth - Release Kenneth
## [9.2.0.7] ## [9.2.0.7] 20210219
### Added ### Added
- Support for Device Groups Device Map (#10898) - Support for Device Groups Device Map (#10898)
- Support for Eastron SDM72D-M three phase 100A Modbus energy meter (#10862) - Support for Eastron SDM72D-M three phase 100A Modbus energy meter (#10862)

View File

@ -78,6 +78,17 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
[Complete list](BUILDS.md) of available feature and sensors. [Complete list](BUILDS.md) of available feature and sensors.
## Changelog v9.3.1 Kenneth
### Changed
- Remove the need to start filenames with a slash (/) in Ufs commands
- Removed command ``VirtualCT`` as synonym for ``SetOption106`` [#11049](https://github.com/arendst/Tasmota/issues/11049)
### Fixed
- Ili1942 driver [#11046](https://github.com/arendst/Tasmota/issues/11046)
- Shutter driver [#11055](https://github.com/arendst/Tasmota/issues/11055)
- ESP32 Mi32 driver [#11048](https://github.com/arendst/Tasmota/issues/11048)
- TM1637 driver now needs ``TM1637 CLK`` and ``TM1637 DIO`` to enable [#11057](https://github.com/arendst/Tasmota/issues/11057)
## Changelog v9.3.0 Kenneth ## Changelog v9.3.0 Kenneth
### Added ### Added
- Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311) - Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311)
@ -142,30 +153,3 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota
- Replaced EPaper42 GPIO selection from ``SPI CS`` by ``EPaper42 CS`` - Replaced EPaper42 GPIO selection from ``SPI CS`` by ``EPaper42 CS``
- Replaced SSD1351 GPIO selection from ``SPI CS`` by ``SSD1351 CS`` - Replaced SSD1351 GPIO selection from ``SPI CS`` by ``SSD1351 CS``
- Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS`` - Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS``
### Changed
- Remove support for direct migration from versions before v8.1.0 (Doris)
- IRremoteESP8266 library from v2.7.14 to v2.7.15
- NeoPixelBus library from v2.6.0 to v2.6.1.4
- ILI9341 library from Adafruit_ILI9341-1.2.0-Tasmota-1.0 to ILI9341-gemu-1.0
- 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)
- Force initial default state ``SetOption57 1`` to scan wifi network every 44 minutes for strongest signal [#10395](https://github.com/arendst/Tasmota/issues/10395)
- PubSubClient MQTT_SOCKET_TIMEOUT from 15 to 4 seconds
- Domoticz fixed 2 decimals resolution by user selectable ``TempRes``, ``HumRes`` and ``PressRes`` resolutions
- Increase number of button GPIOs from 4 to 8
- ESP32 Increase number of switch GPIOs from 8 to 28
- ESP32 increase number of relay GPIOs from 8 to 28
- ESP32 Increase number of interlock groups from 4 to 14
### Fixed
- Redesign syslog and mqttlog using log buffer [#10164](https://github.com/arendst/Tasmota/issues/10164)
- Shutter stop issue [#10170](https://github.com/arendst/Tasmota/issues/10170)
- Scripter script_sub_command [#10181](https://github.com/arendst/Tasmota/issues/10181)
- Scripter JSON variable above 32 chars [#10193](https://github.com/arendst/Tasmota/issues/10193)
- Shelly Dimmer power on state [#10154](https://github.com/arendst/Tasmota/issues/10154) [#10182](https://github.com/arendst/Tasmota/issues/10182)
- Wemo emulation for single devices [#10165](https://github.com/arendst/Tasmota/issues/10165) [#10194](https://github.com/arendst/Tasmota/issues/10194)
- ESP32 LoadStoreError when using ``#define USER_TEMPLATE`` [#9506](https://github.com/arendst/Tasmota/issues/9506)
- Compile error when ``#ifdef USE_IR_RECEIVE`` is disabled regression from 9.1.0.2
- Prometheus memory leak [#10221](https://github.com/arendst/Tasmota/issues/10221)

View File

@ -175,7 +175,7 @@ void ILI9341_2::writecmd(uint8_t d) {
void ILI9341_2::init(uint16_t width, uint16_t height) { void ILI9341_2::init(uint16_t width, uint16_t height) {
//sspi2 = SPISettings(2500000, MSBFIRST, SPI_MODE3); //sspi2 = SPISettings(2500000, MSBFIRST, SPI_MODE3);
if (_hwspi == 2) { if (_hwspi >= 2) {
iwidth = ILI9341_TFTWIDTH; iwidth = ILI9341_TFTWIDTH;
iheight = ILI9341_TFTHEIGHT; iheight = ILI9341_TFTHEIGHT;
} else { } else {
@ -187,8 +187,13 @@ void ILI9341_2::init(uint16_t width, uint16_t height) {
sspi2 = SPISettings(40000000, MSBFIRST, SPI_MODE0); sspi2 = SPISettings(40000000, MSBFIRST, SPI_MODE0);
if (_hwspi==2) { if (_hwspi >= 2) {
spi2=&SPI; spi2 = &SPI;
#ifdef ESP32
if (_hwspi > 2) {
spi2->begin(_sclk, _miso, _mosi, -1);
}
#endif // ESP32
} else { } else {
#ifdef ESP32 #ifdef ESP32
if (_spibus == 2) { if (_spibus == 2) {
@ -406,17 +411,17 @@ void ILI9341_2::setRotation(uint8_t m) {
_height = iheight; _height = iheight;
break; break;
case 1: case 1:
m = (MADCTL_MV | MADCTL_BGR); m = (MADCTL_MY | MADCTL_MV | MADCTL_BGR);
_width = iheight; _width = iheight;
_height = iwidth; _height = iwidth;
break; break;
case 2: case 2:
m = (MADCTL_MY | MADCTL_BGR); m = (MADCTL_MY | MADCTL_MX | MADCTL_BGR);
_width = iwidth; _width = iwidth;
_height = iheight; _height = iheight;
break; break;
case 3: case 3:
m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); m = (MADCTL_MX | MADCTL_MV | MADCTL_BGR);
_width = iheight; _width = iheight;
_height = iwidth; _height = iwidth;
break; break;
@ -522,7 +527,7 @@ void ili9342_bpwr(uint8_t on);
void ILI9341_2::DisplayOnff(int8_t on) { void ILI9341_2::DisplayOnff(int8_t on) {
if (_hwspi==2) { if ((_hwspi >= 2) && (_bp < 0)) {
ili9342_bpwr(on); ili9342_bpwr(on);
} }
@ -532,11 +537,11 @@ void ILI9341_2::DisplayOnff(int8_t on) {
writecmd(ILI9341_2_DISPON); writecmd(ILI9341_2_DISPON);
ILI9341_2_CS_HIGH ILI9341_2_CS_HIGH
SPI_END_TRANSACTION(); SPI_END_TRANSACTION();
if (_bp>=0) { if (_bp >= 0) {
#ifdef ILI9341_2_DIMMER #ifdef ILI9341_2_DIMMER
ledcWrite(ESP32_PWM_CHANNEL,dimmer); ledcWrite(ESP32_PWM_CHANNEL, dimmer);
#else #else
digitalWrite(_bp,HIGH); digitalWrite(_bp, HIGH);
#endif #endif
} }
} else { } else {
@ -545,20 +550,22 @@ void ILI9341_2::DisplayOnff(int8_t on) {
writecmd(ILI9341_2_DISPOFF); writecmd(ILI9341_2_DISPOFF);
ILI9341_2_CS_HIGH ILI9341_2_CS_HIGH
SPI_END_TRANSACTION(); SPI_END_TRANSACTION();
if (_bp>=0) { if (_bp >= 0) {
#ifdef ILI9341_2_DIMMER #ifdef ILI9341_2_DIMMER
ledcWrite(ESP32_PWM_CHANNEL,0); ledcWrite(ESP32_PWM_CHANNEL, 0);
#else #else
digitalWrite(_bp,LOW); digitalWrite(_bp, LOW);
#endif #endif
} }
} }
} }
void ILI9341_2::invertDisplay(boolean i) { void ILI9341_2::invertDisplay(boolean i) {
SPI_BEGIN_TRANSACTION();
ILI9341_2_CS_LOW ILI9341_2_CS_LOW
writecmd(i ? ILI9341_2_INVON : ILI9341_2_INVOFF); writecmd(i ? ILI9341_2_INVON : ILI9341_2_INVOFF);
ILI9341_2_CS_HIGH ILI9341_2_CS_HIGH
SPI_END_TRANSACTION();
} }
void ili9342_dimm(uint8_t dim); void ili9342_dimm(uint8_t dim);
@ -572,7 +579,7 @@ void ILI9341_2::dim(uint8_t dim) {
if (_bp>=0) { if (_bp>=0) {
ledcWrite(ESP32_PWM_CHANNEL,dimmer); ledcWrite(ESP32_PWM_CHANNEL,dimmer);
} else { } else {
if (_hwspi==2) { if (_hwspi>=2) {
ili9342_dimm(dim); ili9342_dimm(dim);
} }
} }

View File

@ -433,7 +433,6 @@
#define D_SO_POWERONFADE "PowerOnFade" // SO91 #define D_SO_POWERONFADE "PowerOnFade" // SO91
#define D_SO_PWMCT "PWMCT" // SO92 #define D_SO_PWMCT "PWMCT" // SO92
#define D_SO_WHITEBLEND "WhiteBlend" // SO105 #define D_SO_WHITEBLEND "WhiteBlend" // SO105
#define D_SO_VIRTUALCT "VirtualCT" // SO106
#define D_CMND_CHANNEL "Channel" #define D_CMND_CHANNEL "Channel"
#define D_CMND_COLOR "Color" #define D_CMND_COLOR "Color"
#define D_CMND_COLORTEMPERATURE "CT" #define D_CMND_COLORTEMPERATURE "CT"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -637,9 +637,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -634,9 +634,11 @@
#define D_SENSOR_SDM630_RX "SDM630 RX" #define D_SENSOR_SDM630_RX "SDM630 RX"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 - RX" #define D_SENSOR_SDM630_RX "SDM630 - RX"
#define D_SENSOR_WE517_TX "WE517 - TX" #define D_SENSOR_WE517_TX "WE517 - TX"
#define D_SENSOR_WE517_RX "WE517 - RX" #define D_SENSOR_WE517_RX "WE517 - RX"
#define D_SENSOR_TM1638_CLK "TM16 - CLK" #define D_SENSOR_TM1637_CLK "TM1637 - CLK"
#define D_SENSOR_TM1638_DIO "TM16 - DIO" #define D_SENSOR_TM1637_DIO "TM1637 - DIO"
#define D_SENSOR_TM1638_STB "TM16 - STB" #define D_SENSOR_TM1638_CLK "TM1638 - CLK"
#define D_SENSOR_TM1638_DIO "TM1638 - DIO"
#define D_SENSOR_TM1638_STB "TM1638 - STB"
#define D_SENSOR_HX711_SCK "HX711 - SCK" #define D_SENSOR_HX711_SCK "HX711 - SCK"
#define D_SENSOR_HX711_DAT "HX711 - DAT" #define D_SENSOR_HX711_DAT "HX711 - DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -638,9 +638,11 @@
#define D_SENSOR_SDM630_RX "SDM630 Rx" #define D_SENSOR_SDM630_RX "SDM630 Rx"
#define D_SENSOR_WE517_TX "WE517 Tx" #define D_SENSOR_WE517_TX "WE517 Tx"
#define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_WE517_RX "WE517 Rx"
#define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1637_CLK "TM1637 CLK"
#define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1637_DIO "TM1637 DIO"
#define D_SENSOR_TM1638_STB "TM16 STB" #define D_SENSOR_TM1638_CLK "TM1638 CLK"
#define D_SENSOR_TM1638_DIO "TM1638 DIO"
#define D_SENSOR_TM1638_STB "TM1638 STB"
#define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_SCK "HX711 SCK"
#define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_HX711_DAT "HX711 DAT"
#define D_SENSOR_FTC532 "FTC532" #define D_SENSOR_FTC532 "FTC532"

View File

@ -149,6 +149,7 @@ enum UserSelectablePins {
GPIO_WIEGAND_D0, GPIO_WIEGAND_D1, // Wiegand Data lines GPIO_WIEGAND_D0, GPIO_WIEGAND_D1, // Wiegand Data lines
GPIO_NEOPOOL_TX, GPIO_NEOPOOL_RX, // Sugar Valley RS485 interface GPIO_NEOPOOL_TX, GPIO_NEOPOOL_RX, // Sugar Valley RS485 interface
GPIO_SDM72_TX, GPIO_SDM72_RX, // SDM72 Serial interface GPIO_SDM72_TX, GPIO_SDM72_RX, // SDM72 Serial interface
GPIO_TM1637CLK, GPIO_TM1637DIO, // TM1637 interface
GPIO_SENSOR_END }; GPIO_SENSOR_END };
enum ProgramSelectablePins { enum ProgramSelectablePins {
@ -318,6 +319,7 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_WIEGAND_D0 "|" D_SENSOR_WIEGAND_D1 "|" D_SENSOR_WIEGAND_D0 "|" D_SENSOR_WIEGAND_D1 "|"
D_SENSOR_NEOPOOL_TX "|" D_SENSOR_NEOPOOL_RX "|" D_SENSOR_NEOPOOL_TX "|" D_SENSOR_NEOPOOL_RX "|"
D_SENSOR_SDM72_TX "|" D_SENSOR_SDM72_RX "|" D_SENSOR_SDM72_TX "|" D_SENSOR_SDM72_RX "|"
D_SENSOR_TM1637_CLK "|" D_SENSOR_TM1637_DIO "|"
; ;
const char kSensorNamesFixed[] PROGMEM = const char kSensorNamesFixed[] PROGMEM =
@ -431,9 +433,14 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_SSD1331_CS), AGPIO(GPIO_SSD1331_CS),
AGPIO(GPIO_SSD1331_DC), AGPIO(GPIO_SSD1331_DC),
#endif // USE_DISPLAY_SSD1331 #endif // USE_DISPLAY_SSD1331
#ifdef USE_DISPLAY_TM1637
AGPIO(GPIO_TM1637CLK),
AGPIO(GPIO_TM1637DIO),
#endif // USE_DISPLAY_TM1637
AGPIO(GPIO_BACKLIGHT), // Display backlight control AGPIO(GPIO_BACKLIGHT), // Display backlight control
AGPIO(GPIO_OLED_RESET), // OLED Display Reset AGPIO(GPIO_OLED_RESET), // OLED Display Reset
#endif #endif // USE_DISPLAY
#ifdef USE_MAX31865 #ifdef USE_MAX31865
AGPIO(GPIO_SSPI_MAX31865_CS1) + MAX_MAX31865S, AGPIO(GPIO_SSPI_MAX31865_CS1) + MAX_MAX31865S,
#endif #endif

View File

@ -20,6 +20,6 @@
#ifndef _TASMOTA_VERSION_H_ #ifndef _TASMOTA_VERSION_H_
#define _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_
const uint32_t VERSION = 0x09030000; const uint32_t VERSION = 0x09030100;
#endif // _TASMOTA_VERSION_H_ #endif // _TASMOTA_VERSION_H_

View File

@ -131,7 +131,7 @@ const uint8_t LIGHT_COLOR_SIZE = 25; // Char array scolor size
const char kLightCommands[] PROGMEM = "|" // No prefix const char kLightCommands[] PROGMEM = "|" // No prefix
// SetOptions synonyms // SetOptions synonyms
D_SO_CHANNELREMAP "|" D_SO_MULTIPWM "|" D_SO_ALEXACTRANGE "|" D_SO_POWERONFADE "|" D_SO_PWMCT "|" D_SO_CHANNELREMAP "|" D_SO_MULTIPWM "|" D_SO_ALEXACTRANGE "|" D_SO_POWERONFADE "|" D_SO_PWMCT "|"
D_SO_WHITEBLEND "|" D_SO_VIRTUALCT "|" D_SO_WHITEBLEND "|"
// Other commands // Other commands
D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_DIMMER_RANGE "|" D_CMND_DIMMER_STEP "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|" D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_DIMMER_RANGE "|" D_CMND_DIMMER_STEP "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|"
D_CMND_RGBWWTABLE "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|" D_CMND_RGBWWTABLE "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|"
@ -150,7 +150,7 @@ const char kLightCommands[] PROGMEM = "|" // No prefix
SO_SYNONYMS(kLightSynonyms, SO_SYNONYMS(kLightSynonyms,
37, 68, 82, 91, 92, 37, 68, 82, 91, 92,
105, 106, 105,
); );
void (* const LightCommand[])(void) PROGMEM = { void (* const LightCommand[])(void) PROGMEM = {

View File

@ -406,21 +406,16 @@ void ShutterDecellerateForStop(uint8_t i)
case SHT_COUNTER: case SHT_COUNTER:
int16_t missing_steps; int16_t missing_steps;
Shutter[i].accelerator = -(ShutterGlobal.open_velocity_max / (Shutter[i].motordelay>4 ? (Shutter[i].motordelay*11)/10 : 4) ); Shutter[i].accelerator = -(ShutterGlobal.open_velocity_max / (Shutter[i].motordelay>4 ? (Shutter[i].motordelay*11)/10 : 4) );
while (Shutter[i].pwm_velocity > -2*Shutter[i].accelerator && Shutter[i].pwm_velocity > 100) { while (Shutter[i].pwm_velocity > -2*Shutter[i].accelerator || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].pwm_velocity > 100) ) {
delay(50); delay(50);
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Velocity %ld, Delta %d"), Shutter[i].pwm_velocity, Shutter[i].accelerator ); AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Velocity %ld, Delta %d"), Shutter[i].pwm_velocity, Shutter[i].accelerator );
//Shutter[i].pwm_velocity = tmax(Shutter[i].pwm_velocity-Shutter[i].accelerator , 0);
// Control will be done in RTC Ticker. // Control will be done in RTC Ticker.
} }
if (ShutterGlobal.position_mode == SHT_COUNTER){ if (ShutterGlobal.position_mode == SHT_COUNTER){
missing_steps = ((Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND) - RtcSettings.pulse_counter[i]; missing_steps = ((Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND) - RtcSettings.pulse_counter[i];
//prepare for stop PWM //prepare for stop PWM
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Remain steps %d, Counter %d, Freq %d"), missing_steps, RtcSettings.pulse_counter[i] ,Shutter[i].pwm_velocity);
Shutter[i].accelerator = 0; Shutter[i].accelerator = 0;
Shutter[i].pwm_velocity = Shutter[i].pwm_velocity > 250 ? 250 : Shutter[i].pwm_velocity;
analogWriteFreq(Shutter[i].pwm_velocity);
analogWrite(Pin(GPIO_PWM1, i), 50);
Shutter[i].pwm_velocity = 0; Shutter[i].pwm_velocity = 0;
while (RtcSettings.pulse_counter[i] < (uint32_t)(Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND) { while (RtcSettings.pulse_counter[i] < (uint32_t)(Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND) {
} }
@ -496,7 +491,7 @@ void ShutterUpdatePosition(void)
Shutter[i].time, toBeAcc, current_stop_way, Shutter[i].pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, Shutter[i].real_position, Shutter[i].time, toBeAcc, current_stop_way, Shutter[i].pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, Shutter[i].real_position,
next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction); next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction);
if ( Shutter[i].real_position * Shutter[i].direction + 2*Shutter[i].pwm_velocity >= Shutter[i].target_position * Shutter[i].direction ) { if ( Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].accelerator<=100)) {
if (Shutter[i].direction != 0) { if (Shutter[i].direction != 0) {
Shutter[i].lastdirection = Shutter[i].direction; Shutter[i].lastdirection = Shutter[i].direction;
} }

View File

@ -426,6 +426,14 @@ bool UfsExecuteCommandFile(const char *fname) {
* Commands * Commands
\*********************************************************************************************/ \*********************************************************************************************/
const int UFS_FILENAME_SIZE = 48;
char* UfsFilename(char* fname, char* fname_in) {
fname_in = Trim(fname_in); // Remove possible leading spaces
snprintf_P(fname, UFS_FILENAME_SIZE, PSTR("%s%s"), ('/' == fname_in[0]) ? "" : "/", fname_in);
return fname;
}
const char kUFSCommands[] PROGMEM = "Ufs|" // Prefix const char kUFSCommands[] PROGMEM = "Ufs|" // Prefix
"|Type|Size|Free|Delete|Rename|Run"; "|Type|Size|Free|Delete|Rename|Run";
@ -468,11 +476,13 @@ void UFSDelete(void) {
// UfsDelete sdcard or flashfs file if only one of them available // UfsDelete sdcard or flashfs file if only one of them available
// UfsDelete2 flashfs file if available // UfsDelete2 flashfs file if available
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
char fname[UFS_FILENAME_SIZE];
UfsFilename(fname, XdrvMailbox.data);
bool result = false; bool result = false;
if (ffs_type && (ffs_type != ufs_type) && (2 == XdrvMailbox.index)) { if (ffs_type && (ffs_type != ufs_type) && (2 == XdrvMailbox.index)) {
result = TfsDeleteFile(XdrvMailbox.data); result = TfsDeleteFile(fname);
} else { } else {
result = (ufs_type && ufsp->remove(XdrvMailbox.data)); result = (ufs_type && ufsp->remove(fname));
} }
if (!result) { if (!result) {
ResponseCmndFailed(); ResponseCmndFailed();
@ -487,13 +497,17 @@ void UFSRename(void) {
// UfsRename2 flashfs file if available // UfsRename2 flashfs file if available
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
bool result = false; bool result = false;
const char *fname1 = strtok(XdrvMailbox.data, ","); char *fname1 = strtok(XdrvMailbox.data, ",");
const char *fname2 = strtok(nullptr, ","); char *fname2 = strtok(nullptr, ",");
if (fname1 && fname2) { if (fname1 && fname2) {
char fname_old[UFS_FILENAME_SIZE];
UfsFilename(fname_old, fname1);
char fname_new[UFS_FILENAME_SIZE];
UfsFilename(fname_new, fname2);
if (ffs_type && (ffs_type != ufs_type) && (2 == XdrvMailbox.index)) { if (ffs_type && (ffs_type != ufs_type) && (2 == XdrvMailbox.index)) {
result = TfsRenameFile(fname1, fname2); result = TfsRenameFile(fname_old, fname_new);
} else { } else {
result = (ufs_type && ufsp->rename(fname1, fname2)); result = (ufs_type && ufsp->rename(fname_old, fname_new));
} }
} }
if (!result) { if (!result) {
@ -506,7 +520,8 @@ void UFSRename(void) {
void UFSRun(void) { void UFSRun(void) {
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
if (UfsExecuteCommandFile(XdrvMailbox.data)) { char fname[UFS_FILENAME_SIZE];
if (UfsExecuteCommandFile(UfsFilename(fname, XdrvMailbox.data))) {
ResponseClear(); ResponseClear();
} else { } else {
ResponseCmndFailed(); ResponseCmndFailed();

View File

@ -42,7 +42,7 @@ bool tft_init_done = false;
void ILI9341_InitDriver() void ILI9341_InitDriver()
{ {
#ifdef USE_M5STACK_CORE2 #if (defined(USE_M5STACK_CORE2) || defined(USE_M5STACK_CORE_BASIC))
if (TasmotaGlobal.spi_enabled) { if (TasmotaGlobal.spi_enabled) {
#else #else
// There are displays without CS // There are displays without CS
@ -65,7 +65,7 @@ void ILI9341_InitDriver()
#ifdef USE_DISPLAY_ILI9341 #ifdef USE_DISPLAY_ILI9341
uint8_t dtype = 1; uint8_t dtype = 1;
#else #else
uint8_t dtype = 2; uint8_t dtype = 3; // sign ili9342 with variable spi pins
#endif // USE_DISPLAY_ILI9341 #endif // USE_DISPLAY_ILI9341
// default colors // default colors
@ -75,6 +75,9 @@ void ILI9341_InitDriver()
#ifdef USE_M5STACK_CORE2 #ifdef USE_M5STACK_CORE2
// fixed pins on m5stack core2 // fixed pins on m5stack core2
ili9341_2 = new ILI9341_2(5, -2, 15, -2); ili9341_2 = new ILI9341_2(5, -2, 15, -2);
#elif defined(USE_M5STACK_CORE_BASIC)
// int8_t cs, int8_t res, int8_t dc, int8_t bp)
ili9341_2 = new ILI9341_2(14, 33, 27, 32);
#else #else
// check for special case with 2 SPI busses (ESP32 bitcoin) // check for special case with 2 SPI busses (ESP32 bitcoin)
if (TasmotaGlobal.soft_spi_enabled) { if (TasmotaGlobal.soft_spi_enabled) {

View File

@ -51,27 +51,27 @@
Clears the display, command: "DisplayClear" Clears the display, command: "DisplayClear"
DisplayNumber num [,position {0-(NUM_DIGITS-1))} [,leading_zeros {0|1} [,length {1 to NUM_DIGITS}]]] DisplayNumber num [,position {0-(TM1637Data.num_digits-1))} [,leading_zeros {0|1} [,length {1 to TM1637Data.num_digits}]]]
Clears and then displays number without decimal. command e.g., "DisplayNumber 1234" Clears and then displays number without decimal. command e.g., "DisplayNumber 1234"
Control 'leading zeros', 'length' and 'position' with "DisplayNumber 1234, <position>, <leadingZeros>, <length>" Control 'leading zeros', 'length' and 'position' with "DisplayNumber 1234, <position>, <leadingZeros>, <length>"
'leading zeros' can be 1 or 0 (default), 'length' can be 1 to NUM_DIGITS, 'position' can be 0 (left-most) to NUM_DIGITS (right-most). 'leading zeros' can be 1 or 0 (default), 'length' can be 1 to TM1637Data.num_digits, 'position' can be 0 (left-most) to TM1637Data.num_digits (right-most).
See function description below for more details. See function description below for more details.
DisplayNumberNC num [,position {0-(NUM_DIGITS-1))} [,leading_zeros {0|1} [,length {1 to NUM_DIGITS}]]] DisplayNumberNC num [,position {0-(TM1637Data.num_digits-1))} [,leading_zeros {0|1} [,length {1 to TM1637Data.num_digits}]]]
Display integer number as above, but without clearing first. e.g., "DisplayNumberNC 1234". Usage is same as above. Display integer number as above, but without clearing first. e.g., "DisplayNumberNC 1234". Usage is same as above.
DisplayFloat num [,position {0-(NUM_DIGITS-1)} [,precision {0-NUM_DIGITS} [,length {1 to NUM_DIGITS}]]] DisplayFloat num [,position {0-(TM1637Data.num_digits-1)} [,precision {0-TM1637Data.num_digits} [,length {1 to TM1637Data.num_digits}]]]
Clears and then displays float (with decimal point) command e.g., "DisplayFloat 12.34" Clears and then displays float (with decimal point) command e.g., "DisplayFloat 12.34"
See function description below for more details. See function description below for more details.
DisplayFloatNC num [,position {0-(NUM_DIGITS-1)} [,precision {0-NUM_DIGITS} [,length {1 to NUM_DIGITS}]]] DisplayFloatNC num [,position {0-(TM1637Data.num_digits-1)} [,precision {0-TM1637Data.num_digits} [,length {1 to TM1637Data.num_digits}]]]
Displays float (with decimal point) as above, but without clearing first. command e.g., "DisplayFloatNC 12.34" Displays float (with decimal point) as above, but without clearing first. command e.g., "DisplayFloatNC 12.34"
See function description below for more details. See function description below for more details.
@ -84,24 +84,24 @@
DisplayRaw position {0-(NUM_DIGITS-1)},length {1 to NUM_DIGITS}, num1 [, num2[, num3[, num4[, ...upto NUM_DIGITS numbers]]]]] DisplayRaw position {0-(TM1637Data.num_digits-1)},length {1 to TM1637Data.num_digits}, num1 [, num2[, num3[, num4[, ...upto TM1637Data.num_digits numbers]]]]]
Takes upto NUM_DIGITS comma-separated integers (0-255) and displays raw segments. Each number represents a Takes upto TM1637Data.num_digits comma-separated integers (0-255) and displays raw segments. Each number represents a
7-segment digit. Each 8-bit number represents individual segments of a digit. 7-segment digit. Each 8-bit number represents individual segments of a digit.
For example, the command "DisplayRaw 0, 4, 255, 255, 255, 255" would display "[8.8.8.8.]" For example, the command "DisplayRaw 0, 4, 255, 255, 255, 255" would display "[8.8.8.8.]"
DisplayText text [, position {0-(NUM_DIGITS-1)} [,length {1 to NUM_DIGITS}]] DisplayText text [, position {0-(TM1637Data.num_digits-1)} [,length {1 to TM1637Data.num_digits}]]
Clears and then displays basic text. command e.g., "DisplayText ajith vasudevan" Clears and then displays basic text. command e.g., "DisplayText ajith vasudevan"
Control 'length' and 'position' with "DisplayText <text>, <position>, <length>" Control 'length' and 'position' with "DisplayText <text>, <position>, <length>"
'length' can be 1 to NUM_DIGITS, 'position' can be 0 (left-most) to NUM_DIGITS-1 (right-most) 'length' can be 1 to TM1637Data.num_digits, 'position' can be 0 (left-most) to TM1637Data.num_digits-1 (right-most)
A caret(^) symbol in the text input is dispayed as the degrees(°) symbol. This is useful for displaying Temperature! A caret(^) symbol in the text input is dispayed as the degrees(°) symbol. This is useful for displaying Temperature!
For example, the command "DisplayText 22.5^" will display "22.5°". For example, the command "DisplayText 22.5^" will display "22.5°".
DisplayTextNC text [, position {0-NUM_DIGITS-1} [,length {1 to NUM_DIGITS}]] DisplayTextNC text [, position {0-TM1637Data.num_digits-1} [,length {1 to TM1637Data.num_digits}]]
Clears first, then displays text. Usage is same as above. Clears first, then displays text. Usage is same as above.
@ -135,21 +135,6 @@
\*********************************************************************************************/ \*********************************************************************************************/
#define XDSP_15 15 #define XDSP_15 15
#include "SevenSegmentTM1637.h"
SevenSegmentTM1637 *display;
bool showClock = false;
bool clock24 = false;
char tm[5];
char msg[60];
uint32_t NUM_DIGITS = 4;
uint32_t prev_num_digits = 4;
bool scroll = false;
uint32_t scrolldelay = 4;
uint32_t scrollindex = 0;
uint32_t iteration = 0;
uint32_t brightness = 5;
#define BRIGHTNESS_MIN 0 // Display OFF #define BRIGHTNESS_MIN 0 // Display OFF
#define BRIGHTNESS_MAX 8 #define BRIGHTNESS_MAX 8
@ -158,29 +143,49 @@ uint32_t brightness = 5;
#define LEVEL_MAX 100 #define LEVEL_MAX 100
#define SCROLL_MAX_LEN 50 #define SCROLL_MAX_LEN 50
char scrolltext[CMD_MAX_LEN]; #include "SevenSegmentTM1637.h"
SevenSegmentTM1637 *display;
struct {
char scroll_text[CMD_MAX_LEN];
char msg[60];
uint8_t num_digits = 4;
uint8_t prev_num_digits = 4;
uint8_t scroll_delay = 4;
uint8_t scroll_index = 0;
uint8_t iteration = 0;
uint8_t brightness = 5;
bool scroll = false;
bool show_clock = false;
bool clock_24 = false;
} TM1637Data;
/*********************************************************************************************\ /*********************************************************************************************\
* Init function * Init function
\*********************************************************************************************/ \*********************************************************************************************/
bool TM1637Init(void) { void TM1637Init(void) {
display = new SevenSegmentTM1637(Pin(GPIO_SSPI_SCLK), Pin(GPIO_SSPI_MOSI) ); if (PinUsed(GPIO_TM1637CLK) && PinUsed(GPIO_TM1637DIO)) {
NUM_DIGITS = Settings.display_size > 3 ? Settings.display_size : 4; display = new SevenSegmentTM1637(Pin(GPIO_TM1637CLK), Pin(GPIO_TM1637DIO) );
Settings.display_size = NUM_DIGITS; if (display) {
display->begin(NUM_DIGITS, 1);
display->setBacklight(brightness * 10);
clearDisplay();
Settings.display_model = XDSP_15; Settings.display_model = XDSP_15;
AddLog(LOG_LEVEL_INFO, PSTR("DSP: TM1637 display driver initialized"));
return true; TM1637Data.num_digits = Settings.display_size > 3 ? Settings.display_size : 4;
Settings.display_size = TM1637Data.num_digits;
display->begin(TM1637Data.num_digits, 1);
display->setBacklight(TM1637Data.brightness * 10);
TM1637ClearDisplay();
AddLog(LOG_LEVEL_INFO, PSTR("DSP: TM1637"));
}
}
} }
/*********************************************************************************************\ /*********************************************************************************************\
* Displays number without decimal, with/without leading zeros, specifying start-position * Displays number without decimal, with/without leading zeros, specifying start-position
* and length, optionally skipping clearing display before displaying the number. * and length, optionally skipping clearing display before displaying the number.
* commands: DisplayNumber num [,position {0-(NUM_DIGITS-1)} [,leading_zeros {0|1} [,length {1 to NUM_DIGITS}]]] * commands: DisplayNumber num [,position {0-(TM1637Data.num_digits-1)} [,leading_zeros {0|1} [,length {1 to TM1637Data.num_digits}]]]
* DisplayNumberNC num [,position {0-(NUM_DIGITS-1)} [,leading_zeros {0|1} [,length {1 to NUM_DIGITS}]]] // "NC" --> "No Clear" * DisplayNumberNC num [,position {0-(TM1637Data.num_digits-1)} [,leading_zeros {0|1} [,length {1 to TM1637Data.num_digits}]]] // "NC" --> "No Clear"
\*********************************************************************************************/ \*********************************************************************************************/
bool CmndTM1637Number(bool clear) { bool CmndTM1637Number(bool clear) {
char sNum[CMD_MAX_LEN]; char sNum[CMD_MAX_LEN];
@ -210,46 +215,41 @@ bool CmndTM1637Number(bool clear) {
} }
if((position < 0) || (position > (NUM_DIGITS-1))) position = 0; if((position < 0) || (position > (TM1637Data.num_digits-1))) position = 0;
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: num=%d"), num); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: num %d, pos %d, lead %d, len %d"), num, position, leadingzeros, length);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: position=%d"), position);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: leadingzeros=%d"), leadingzeros);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length);
if(clear) clearDisplay(); if(clear) TM1637ClearDisplay();
char txt[30]; char txt[30];
snprintf_P(txt, sizeof(txt), PSTR("%d"), num); snprintf_P(txt, sizeof(txt), PSTR("%d"), num);
if(!length) length = strlen(txt); if(!length) length = strlen(txt);
if((length < 0) || (length > NUM_DIGITS)) length = NUM_DIGITS; if((length < 0) || (length > TM1637Data.num_digits)) length = TM1637Data.num_digits;
char pad = (leadingzeros ? '0': ' '); char pad = (leadingzeros ? '0': ' ');
uint32_t i = position; uint32_t i = position;
uint8_t rawBytes[1]; uint8_t rawBytes[1];
rawBytes[0] = display->encode(pad); rawBytes[0] = display->encode(pad);
for(; i<position + (length - strlen(txt)); i++) { for(; i<position + (length - strlen(txt)); i++) {
if(i>NUM_DIGITS) break; if(i>TM1637Data.num_digits) break;
display->printRaw(rawBytes, 1, i); display->printRaw(rawBytes, 1, i);
} }
for(uint32_t j = 0; i< position + length; i++, j++) { for(uint32_t j = 0; i< position + length; i++, j++) {
if(txt[j] == 0) break; if(txt[j] == 0) break;
rawBytes[0] = display->encode(txt[j]); rawBytes[0] = display->encode(txt[j]);
if(i>NUM_DIGITS) break; if(i>TM1637Data.num_digits) break;
display->printRaw(rawBytes, 1, i); display->printRaw(rawBytes, 1, i);
} }
return true; return true;
} }
/*********************************************************************************************\ /*********************************************************************************************\
* Displays number with decimal, specifying position, precision and length, * Displays number with decimal, specifying position, precision and length,
* optionally skipping clearing display before displaying the number. * optionally skipping clearing display before displaying the number.
* commands: DisplayFloat num [,position {0-(NUM_DIGITS-1)} [,precision {0-NUM_DIGITS} [,length {1 to NUM_DIGITS}]]] * commands: DisplayFloat num [,position {0-(TM1637Data.num_digits-1)} [,precision {0-TM1637Data.num_digits} [,length {1 to TM1637Data.num_digits}]]]
* DisplayFloatNC num [,position {0-(NUM_DIGITS-1)} [,precision {0-NUM_DIGITS} [,length {1 to NUM_DIGITS}]]] // "NC" --> "No Clear" * DisplayFloatNC num [,position {0-(TM1637Data.num_digits-1)} [,precision {0-TM1637Data.num_digits} [,length {1 to TM1637Data.num_digits}]]] // "NC" --> "No Clear"
\*********************************************************************************************/ \*********************************************************************************************/
bool CmndTM1637Float(bool clear) { bool CmndTM1637Float(bool clear) {
@ -258,7 +258,7 @@ bool CmndTM1637Float(bool clear) {
char sPosition[CMD_MAX_LEN]; char sPosition[CMD_MAX_LEN];
char sLength[CMD_MAX_LEN]; char sLength[CMD_MAX_LEN];
uint8_t length = 0; uint8_t length = 0;
uint8_t precision = NUM_DIGITS; uint8_t precision = TM1637Data.num_digits;
uint8_t position = 0; uint8_t position = 0;
float fnum = 0.0f; float fnum = 0.0f;
@ -280,22 +280,19 @@ bool CmndTM1637Float(bool clear) {
} }
if((position < 0) || (position > (NUM_DIGITS-1))) position = 0; if((position < 0) || (position > (TM1637Data.num_digits-1))) position = 0;
if((precision < 0) || (precision > NUM_DIGITS)) precision = NUM_DIGITS; if((precision < 0) || (precision > TM1637Data.num_digits)) precision = TM1637Data.num_digits;
if(clear) clearDisplay(); if(clear) TM1637ClearDisplay();
char txt[30]; char txt[30];
ext_snprintf_P(txt, sizeof(txt), PSTR("%*_f"), precision, &fnum); ext_snprintf_P(txt, sizeof(txt), PSTR("%*_f"), precision, &fnum);
if(!length) length = strlen(txt); if(!length) length = strlen(txt);
if((length <= 0) || (length > NUM_DIGITS)) length = NUM_DIGITS; if((length <= 0) || (length > TM1637Data.num_digits)) length = TM1637Data.num_digits;
AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: num %4_f, prec %d, len %d"), &fnum, precision, length);
char s[30];
ext_snprintf_P(s, sizeof(s), PSTR("LOG: TM1637: num=%*_f"), 4, &fnum);
AddLog(LOG_LEVEL_DEBUG, PSTR("%s"), s);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: precision=%d"), precision);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length);
uint8_t rawBytes[1]; uint8_t rawBytes[1];
for(uint32_t i=0, j=0; i<length; i++, j++) { for(uint32_t i=0, j=0; i<length; i++, j++) {
if(txt[i] == 0) break; if(txt[i] == 0) break;
@ -305,7 +302,7 @@ bool CmndTM1637Float(bool clear) {
i++; i++;
length++; length++;
} }
if((j+position) > NUM_DIGITS) break; if((j+position) > TM1637Data.num_digits) break;
display->printRaw(rawBytes, 1, j+position); display->printRaw(rawBytes, 1, j+position);
} }
@ -318,17 +315,17 @@ bool CmndTM1637Float(bool clear) {
// * Command: DisplayClear // * Command: DisplayClear
// \*********************************************************************************************/ // \*********************************************************************************************/
bool CmndTM1637Clear(void) { bool CmndTM1637Clear(void) {
clearDisplay(); TM1637ClearDisplay();
sprintf(msg, PSTR("Cleared")); sprintf(TM1637Data.msg, PSTR("Cleared"));
XdrvMailbox.data = msg; XdrvMailbox.data = TM1637Data.msg;
return true; return true;
} }
void clearDisplay (void) { void TM1637ClearDisplay (void) {
unsigned char arr[] = {0}; unsigned char arr[] = {0};
AddLog(LOG_LEVEL_DEBUG, PSTR("Clearing digit %d"), NUM_DIGITS); AddLog(LOG_LEVEL_DEBUG, PSTR("Clearing digit %d"), TM1637Data.num_digits);
for(int i=0; i<NUM_DIGITS; i++) display->printRaw(arr, 1, i); for(int i=0; i<TM1637Data.num_digits; i++) display->printRaw(arr, 1, i);
} }
@ -338,17 +335,17 @@ void clearDisplay (void) {
\*********************************************************************************************/ \*********************************************************************************************/
bool CmndTM1637ScrollText(void) { bool CmndTM1637ScrollText(void) {
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: text=%s"), XdrvMailbox.data); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: Text %s"), XdrvMailbox.data);
if(XdrvMailbox.data_len > SCROLL_MAX_LEN) { if(XdrvMailbox.data_len > SCROLL_MAX_LEN) {
snprintf(msg, sizeof(msg), PSTR("Text too long. Length should be less than %d"), SCROLL_MAX_LEN); snprintf(TM1637Data.msg, sizeof(TM1637Data.msg), PSTR("Text too long. Length should be less than %d"), SCROLL_MAX_LEN);
XdrvMailbox.data = msg; XdrvMailbox.data = TM1637Data.msg;
return false; return false;
} else { } else {
snprintf(scrolltext, sizeof(scrolltext), PSTR("%s"), XdrvMailbox.data); snprintf(TM1637Data.scroll_text, sizeof(TM1637Data.scroll_text), PSTR("%s"), XdrvMailbox.data);
scrolltext[XdrvMailbox.data_len] = 0; TM1637Data.scroll_text[XdrvMailbox.data_len] = 0;
scrollindex = 0; TM1637Data.scroll_index = 0;
scroll = true; TM1637Data.scroll = true;
return true; return true;
} }
@ -361,8 +358,8 @@ bool CmndTM1637ScrollText(void) {
* Command: DisplayScrollDelay delay {0-15} // default = 4 * Command: DisplayScrollDelay delay {0-15} // default = 4
\*********************************************************************************************/ \*********************************************************************************************/
bool CmndTM1637ScrollDelay(void) { bool CmndTM1637ScrollDelay(void) {
if(scrolldelay<0) scrolldelay=0; if(TM1637Data.scroll_delay<0) TM1637Data.scroll_delay=0;
scrolldelay = XdrvMailbox.payload; TM1637Data.scroll_delay = XdrvMailbox.payload;
return true; return true;
} }
@ -371,36 +368,31 @@ bool CmndTM1637ScrollDelay(void) {
/*********************************************************************************************\ /*********************************************************************************************\
* Scrolls a given string. Called every 50ms * Scrolls a given string. Called every 50ms
\*********************************************************************************************/ \*********************************************************************************************/
void scrollText(void) { void TM1637ScrollText(void) {
if(scroll) { if(TM1637Data.scroll) {
iteration++; TM1637Data.iteration++;
if(scrolldelay) iteration = iteration % scrolldelay; if(TM1637Data.scroll_delay) TM1637Data.iteration = TM1637Data.iteration % TM1637Data.scroll_delay;
else iteration = 0; else TM1637Data.iteration = 0;
if(iteration) return; if(TM1637Data.iteration) return;
if(scrollindex > strlen(scrolltext)) { if(TM1637Data.scroll_index > strlen(TM1637Data.scroll_text)) {
scroll = false; TM1637Data.scroll = false;
scrollindex = 0; TM1637Data.scroll_index = 0;
return; return;
} }
bool clr = false; bool clr = false;
uint8_t rawBytes[1]; uint8_t rawBytes[1];
for(uint32_t i=0, j=scrollindex; i< strlen(scrolltext); i++, j++) { for(uint32_t i=0, j=TM1637Data.scroll_index; i< strlen(TM1637Data.scroll_text); i++, j++) {
if(i > (NUM_DIGITS-1)) break; if(i > (TM1637Data.num_digits-1)) break;
if(scrolltext[j] == 0) {clr = true;}; if(TM1637Data.scroll_text[j] == 0) {clr = true;};
char charToDisp = (clr ? ' ' : scrolltext[j]); char charToDisp = (clr ? ' ' : TM1637Data.scroll_text[j]);
rawBytes[0] = display->encode(charToDisp); rawBytes[0] = display->encode(charToDisp);
display->printRaw(rawBytes, 1, i); display->printRaw(rawBytes, 1, i);
} }
scrollindex++; TM1637Data.scroll_index++;
} }
} }
/*********************************************************************************************\ /*********************************************************************************************\
* Displays a horizontal bar graph. Takes a percentage number (0-100) as input * Displays a horizontal bar graph. Takes a percentage number (0-100) as input
* Command: DisplayLevel level {0-100} * Command: DisplayLevel level {0-100}
@ -408,40 +400,39 @@ void scrollText(void) {
bool CmndTM1637Level(void) { bool CmndTM1637Level(void) {
uint16_t val = XdrvMailbox.payload; uint16_t val = XdrvMailbox.payload;
if((val < LEVEL_MIN) || (val > LEVEL_MAX)) { if((val < LEVEL_MIN) || (val > LEVEL_MAX)) {
sprintf(msg, PSTR("Level should be a number in the range [%d, %d]"), LEVEL_MIN, LEVEL_MAX); sprintf(TM1637Data.msg, PSTR("Level should be a number in the range [%d, %d]"), LEVEL_MIN, LEVEL_MAX);
XdrvMailbox.data = msg; XdrvMailbox.data = TM1637Data.msg;
return false; return false;
} }
uint8_t totalBars = 2*NUM_DIGITS; uint8_t totalBars = 2*TM1637Data.num_digits;
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level totalBars=%d"), totalBars); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level totalBars %d"), totalBars);
float barsToDisplay = totalBars * val / 100.0f; float barsToDisplay = totalBars * val / 100.0f;
char txt[5]; char txt[5];
ext_snprintf_P(txt, sizeof(txt), PSTR("%*_f"), 1, &barsToDisplay); ext_snprintf_P(txt, sizeof(txt), PSTR("%*_f"), 1, &barsToDisplay);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level barsToDisplay=%s"), txt); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level barsToDisplay %s"), txt);
char s[4]; char s[4];
ext_snprintf_P(s, sizeof(s), PSTR("%*_f"), 0, &barsToDisplay); ext_snprintf_P(s, sizeof(s), PSTR("%0_f"), &barsToDisplay);
uint8_t numBars = atoi(s); uint8_t numBars = atoi(s);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level numBars=%d"), numBars); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level numBars %d"), numBars);
clearDisplay(); TM1637ClearDisplay();
uint8_t rawBytes[1]; uint8_t rawBytes[1];
for(int i=1; i<=numBars; i++) { for(int i=1; i<=numBars; i++) {
uint8_t digit = (i-1) / 2; uint8_t digit = (i-1) / 2;
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level digit=%d"), digit); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level digit %d"), digit);
uint8_t value = (((i%2) == 0) ? 54 : 48); uint8_t value = (((i%2) == 0) ? 54 : 48);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Level value=%d"), value); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: CmndTM1637Level value %d"), value);
rawBytes[0] = value; rawBytes[0] = value;
display->printRaw(rawBytes, 1, digit); display->printRaw(rawBytes, 1, digit);
} }
return true; return true;
} }
/*********************************************************************************************\ /*********************************************************************************************\
* Display arbitrary data on the display module * Display arbitrary data on the display module
* Command: DisplayRaw position {0-(NUM_DIGITS-1)},length {1 to NUM_DIGITS}, a [, b[, c[, d[...upto NUM_DIGITS]]]] * Command: DisplayRaw position {0-(TM1637Data.num_digits-1)},length {1 to TM1637Data.num_digits}, a [, b[, c[, d[...upto TM1637Data.num_digits]]]]
* where a,b,c,d... are upto NUM_DIGITS numbers in the range 0-255, each number (byte) * where a,b,c,d... are upto TM1637Data.num_digits numbers in the range 0-255, each number (byte)
* corresponding to a single 7-segment digit. Within each byte, bit 0 is segment A, * corresponding to a single 7-segment digit. Within each byte, bit 0 is segment A,
* bit 1 is segment B etc. The function may either set the entire display * bit 1 is segment B etc. The function may either set the entire display
* or any desired part using the length and position parameters. * or any desired part using the length and position parameters.
@ -492,23 +483,16 @@ bool CmndTM1637Raw(void) {
} }
if(!length) length = ArgC() - 2; if(!length) length = ArgC() - 2;
if(length < 0 || length > NUM_DIGITS) length = NUM_DIGITS; if(length < 0 || length > TM1637Data.num_digits) length = TM1637Data.num_digits;
if(position < 0 || position > (NUM_DIGITS-1)) position = 0; if(position < 0 || position > (TM1637Data.num_digits-1)) position = 0;
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: a=%d"), DATA[0]); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: a %d, b %d, c %d, d %d, e %d, f %d, len %d, pos %d"),
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: b=%d"), DATA[1]); DATA[0], DATA[1], DATA[2], DATA[3], DATA[4], DATA[5], length, position);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: c=%d"), DATA[2]);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: d=%d"), DATA[3]);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: e=%d"), DATA[4]);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: f=%d"), DATA[5]);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: position=%d"), position);
uint8_t rawBytes[1]; uint8_t rawBytes[1];
for(uint32_t i=position; i<position+length; i++ ) { for(uint32_t i=position; i<position+length; i++ ) {
if(i>(NUM_DIGITS-1)) break; if(i>(TM1637Data.num_digits-1)) break;
rawBytes[0] = DATA[i-position]; rawBytes[0] = DATA[i-position];
display->printRaw(rawBytes, 1, i); display->printRaw(rawBytes, 1, i);
} }
@ -516,13 +500,11 @@ bool CmndTM1637Raw(void) {
return true; return true;
} }
/*********************************************************************************************\ /*********************************************************************************************\
* Display a given string. * Display a given string.
* Text can be placed at arbitrary location on the display using the length and * Text can be placed at arbitrary location on the display using the length and
* position parameters without affecting the rest of the display. * position parameters without affecting the rest of the display.
* Command: DisplayText text [, position {0-(NUM_DIGITS-1)} [,length {1 to NUM_DIGITS}]] * Command: DisplayText text [, position {0-(TM1637Data.num_digits-1)} [,length {1 to TM1637Data.num_digits}]]
\*********************************************************************************************/ \*********************************************************************************************/
bool CmndTM1637Text(bool clear) { bool CmndTM1637Text(bool clear) {
char sString[CMD_MAX_LEN + 1]; char sString[CMD_MAX_LEN + 1];
@ -544,21 +526,19 @@ bool CmndTM1637Text(bool clear) {
} }
if((position < 0) || (position > (NUM_DIGITS-1))) position = 0; if((position < 0) || (position > (TM1637Data.num_digits-1))) position = 0;
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: sString=%s"), sString); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: sString %s, pos %d, len %d"), sString, position, length);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: position=%d"), position);
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length);
if(clear) clearDisplay(); if(clear) TM1637ClearDisplay();
if(!length) length = strlen(sString); if(!length) length = strlen(sString);
if((length < 0) || (length > NUM_DIGITS)) length = NUM_DIGITS; if((length < 0) || (length > TM1637Data.num_digits)) length = TM1637Data.num_digits;
uint32_t i = position; uint32_t i = position;
uint8_t rawBytes[1]; uint8_t rawBytes[1];
for(uint32_t j = 0; i< position + length; i++, j++) { for(uint32_t j = 0; i< position + length; i++, j++) {
if(i > (NUM_DIGITS-1)) break; if(i > (TM1637Data.num_digits-1)) break;
if(sString[j] == 0) break; if(sString[j] == 0) break;
rawBytes[0] = display->encode(sString[j]); rawBytes[0] = display->encode(sString[j]);
if(sString[j+1] == '.') { if(sString[j+1] == '.') {
@ -582,18 +562,18 @@ bool CmndTM1637Brightness(void) {
uint16_t val = XdrvMailbox.payload; uint16_t val = XdrvMailbox.payload;
if(ArgC() == 0) { if(ArgC() == 0) {
XdrvMailbox.payload = brightness; XdrvMailbox.payload = TM1637Data.brightness;
return true; return true;
} }
if((val < BRIGHTNESS_MIN) || (val > BRIGHTNESS_MAX)) { if((val < BRIGHTNESS_MIN) || (val > BRIGHTNESS_MAX)) {
sprintf(msg, PSTR("Brightness should be a number in the range [%d, %d]"), BRIGHTNESS_MIN, BRIGHTNESS_MAX); sprintf(TM1637Data.msg, PSTR("Brightness should be a number in the range [%d, %d]"), BRIGHTNESS_MIN, BRIGHTNESS_MAX);
XdrvMailbox.data = msg; XdrvMailbox.data = TM1637Data.msg;
return false; return false;
} }
brightness = val; TM1637Data.brightness = val;
display->setBacklight(brightness*10); display->setBacklight(TM1637Data.brightness*10);
return true; return true;
} }
@ -607,17 +587,17 @@ bool CmndTM1637Brightness(void) {
\*********************************************************************************************/ \*********************************************************************************************/
bool CmndTM1637Clock(void) { bool CmndTM1637Clock(void) {
showClock = XdrvMailbox.payload; TM1637Data.show_clock = XdrvMailbox.payload;
if(ArgC() == 0) XdrvMailbox.payload = 1; if(ArgC() == 0) XdrvMailbox.payload = 1;
if(XdrvMailbox.payload > 1) clock24 = true; if(XdrvMailbox.payload > 1) TM1637Data.clock_24 = true;
else if(XdrvMailbox.payload == 1) clock24 = false; else if(XdrvMailbox.payload == 1) TM1637Data.clock_24 = false;
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: showClock=%d"), showClock); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: TM1637Data.show_clock %d, TM1637Data.clock_24 %d"),
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: clock24=%d"), clock24); TM1637Data.show_clock, TM1637Data.clock_24);
if(!showClock) { if(!TM1637Data.show_clock) {
clearDisplay(); TM1637ClearDisplay();
} }
return true; return true;
} }
@ -626,19 +606,20 @@ bool CmndTM1637Clock(void) {
/*********************************************************************************************\ /*********************************************************************************************\
* refreshes the time if clock is displayed * refreshes the time if clock is displayed
\*********************************************************************************************/ \*********************************************************************************************/
void showTime() { void TM1637ShowTime() {
uint8_t hr = RtcTime.hour; uint8_t hr = RtcTime.hour;
uint8_t mn = RtcTime.minute; uint8_t mn = RtcTime.minute;
// uint8_t hr = 1; // uint8_t hr = 1;
// uint8_t mn = 0; // uint8_t mn = 0;
char z = ' '; char z = ' ';
if(clock24) { if(TM1637Data.clock_24) {
z = '0'; z = '0';
} else { } else {
if(hr > 12) hr -= 12; if(hr > 12) hr -= 12;
if(hr == 0) hr = 12; if(hr == 0) hr = 12;
} }
char tm[5];
if(hr < 10) { if(hr < 10) {
if(mn < 10) snprintf(tm, sizeof(tm), PSTR("%c%d0%d"), z, hr, mn); if(mn < 10) snprintf(tm, sizeof(tm), PSTR("%c%d0%d"), z, hr, mn);
else snprintf(tm, sizeof(tm), PSTR("%c%d%d"), z, hr, mn); else snprintf(tm, sizeof(tm), PSTR("%c%d%d"), z, hr, mn);
@ -659,20 +640,20 @@ void showTime() {
\*********************************************************************************************/ \*********************************************************************************************/
bool TM1637Cmd(uint8_t fn) { bool TM1637Cmd(uint8_t fn) {
bool result = false; bool result = false;
NUM_DIGITS = Settings.display_size; TM1637Data.num_digits = Settings.display_size;
if(prev_num_digits != NUM_DIGITS) { // Cleck for change of display size, and re-init the library if(TM1637Data.prev_num_digits != TM1637Data.num_digits) { // Cleck for change of display size, and re-init the library
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: Size changed. Re-initializing library...")); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: Size changed. Re-initializing library..."));
display = new SevenSegmentTM1637(Pin(GPIO_SSPI_SCLK), Pin(GPIO_SSPI_MOSI) ); display = new SevenSegmentTM1637(Pin(GPIO_SSPI_SCLK), Pin(GPIO_SSPI_MOSI) );
display->begin(NUM_DIGITS, 1); display->begin(TM1637Data.num_digits, 1);
display->setBacklight(40); display->setBacklight(40);
clearDisplay(); TM1637ClearDisplay();
prev_num_digits = NUM_DIGITS; TM1637Data.prev_num_digits = TM1637Data.num_digits;
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: Re-initialized library")); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: Re-initialized library"));
} }
if(XdrvMailbox.data_len > CMD_MAX_LEN) { if(XdrvMailbox.data_len > CMD_MAX_LEN) {
sprintf(msg, PSTR("Command text too long. Please limit it to %d characters"), CMD_MAX_LEN); sprintf(TM1637Data.msg, PSTR("Command text too long. Please limit it to %d characters"), CMD_MAX_LEN);
XdrvMailbox.data = msg; XdrvMailbox.data = TM1637Data.msg;
return result; return result;
} }
@ -731,17 +712,17 @@ bool Xdsp15(uint8_t function)
bool result = false; bool result = false;
if (FUNC_DISPLAY_INIT_DRIVER == function) { if (FUNC_DISPLAY_INIT_DRIVER == function) {
result = TM1637Init(); // init TM1637Init(); // init
} }
else if (XDSP_15 == Settings.display_model) { else if (XDSP_15 == Settings.display_model) {
switch (function) { switch (function) {
case FUNC_DISPLAY_MODEL: case FUNC_DISPLAY_MODEL:
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: FUNC_DISPLAY_MODEL")); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: FUNC_DISPLAY_MODEL"));
result = true; result = true;
break; break;
case FUNC_DISPLAY_INIT: case FUNC_DISPLAY_INIT:
CmndTM1637Clear(); CmndTM1637Clear();
AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: FUNC_DISPLAY_INIT")); AddLog(LOG_LEVEL_DEBUG, PSTR("TM7: FUNC_DISPLAY_INIT"));
break; break;
case FUNC_DISPLAY_SEVENSEG_TEXT: case FUNC_DISPLAY_SEVENSEG_TEXT:
case FUNC_DISPLAY_CLEAR: case FUNC_DISPLAY_CLEAR:
@ -759,9 +740,9 @@ bool Xdsp15(uint8_t function)
result = TM1637Cmd(function); result = TM1637Cmd(function);
break; break;
case FUNC_DISPLAY_EVERY_50_MSECOND: case FUNC_DISPLAY_EVERY_50_MSECOND:
scrollText(); TM1637ScrollText();
if(showClock) { if(TM1637Data.show_clock) {
showTime(); TM1637ShowTime();
} }
break; break;
} }

View File

@ -21,7 +21,7 @@
/*********************************************************************************************\ /*********************************************************************************************\
* TM1638 8 switch, led and 7 segment * TM1638 8 switch, led and 7 segment
* *
* Uses GPIO TM16 DIO, TM16 CLK and TM16 STB * Uses GPIO TM1638 DIO, TM1638 CLK and TM1638 STB
\*********************************************************************************************/ \*********************************************************************************************/
#define XSNS_28 28 #define XSNS_28 28

View File

@ -272,7 +272,7 @@ void RfSnsTheoV2Show(bool json)
sensor, GetDT(rfsns_theo_v2_t1[i].time).c_str(), voltage); sensor, GetDT(rfsns_theo_v2_t1[i].time).c_str(), voltage);
} }
} else { } else {
float temp = ConvertTemp((float)rfsns_theo_v2_t1[i].temp / 100) float temp = ConvertTemp((float)rfsns_theo_v2_t1[i].temp / 100);
if (json) { if (json) {
ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_TEMPERATURE "\":%*_f,\"" D_JSON_ILLUMINANCE "\":%d,\"" D_JSON_VOLTAGE "\":%s}"), ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_TEMPERATURE "\":%*_f,\"" D_JSON_ILLUMINANCE "\":%d,\"" D_JSON_VOLTAGE "\":%s}"),

View File

@ -465,6 +465,7 @@ double meter_vars[SML_MAX_VARS];
double dvalues[MAX_DVARS]; double dvalues[MAX_DVARS];
uint32_t dtimes[MAX_DVARS]; uint32_t dtimes[MAX_DVARS];
uint8_t meters_used; uint8_t meters_used;
uint8_t dvalid[SML_MAX_VARS];
struct METER_DESC const *meter_desc_p; struct METER_DESC const *meter_desc_p;
const uint8_t *meter_p; const uint8_t *meter_p;
@ -494,6 +495,7 @@ char meter_id[MAX_METERS][METER_ID_SIZE];
uint8_t sml_send_blocks; uint8_t sml_send_blocks;
uint8_t sml_100ms_cnt; uint8_t sml_100ms_cnt;
uint8_t sml_desc_cnt; uint8_t sml_desc_cnt;
uint8_t sml_json_enable = 1;
#ifdef USE_SML_MEDIAN_FILTER #ifdef USE_SML_MEDIAN_FILTER
// median filter, should be odd size // median filter, should be odd size
@ -1621,6 +1623,7 @@ void SML_Decode(uint8_t index) {
#else #else
meter_vars[vindex]=dval; meter_vars[vindex]=dval;
#endif #endif
dvalid[vindex] = 1;
//AddLog_P(LOG_LEVEL_INFO, PSTR(">> %s"),mp); //AddLog_P(LOG_LEVEL_INFO, PSTR(">> %s"),mp);
// get scaling factor // get scaling factor
double fac=CharToDouble((char*)mp); double fac=CharToDouble((char*)mp);
@ -1779,6 +1782,8 @@ void SML_Show(boolean json) {
dtostrfd(meter_vars[index],dp,tpowstr); dtostrfd(meter_vars[index],dp,tpowstr);
} }
if (!dvalid[index]) nojson = 1;
if (json) { if (json) {
// json export // json export
if (index==0) { if (index==0) {
@ -1953,6 +1958,7 @@ void SML_Init(void) {
for (uint32_t cnt=0;cnt<SML_MAX_VARS;cnt++) { for (uint32_t cnt=0;cnt<SML_MAX_VARS;cnt++) {
meter_vars[cnt]=0; meter_vars[cnt]=0;
dvalid[cnt]=0;
} }
for (uint32_t cnt=0;cnt<MAX_METERS;cnt++) { for (uint32_t cnt=0;cnt<MAX_METERS;cnt++) {
@ -2650,7 +2656,9 @@ bool Xsns53(byte function) {
break; break;
#endif // USE_SCRIPT #endif // USE_SCRIPT
case FUNC_JSON_APPEND: case FUNC_JSON_APPEND:
if (sml_json_enable) {
SML_Show(1); SML_Show(1);
}
break; break;
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
case FUNC_WEB_SENSOR: case FUNC_WEB_SENSOR:

View File

@ -1941,9 +1941,21 @@ void MI32EverySecond(bool restart){
MI32TimeoutSensors(); MI32TimeoutSensors();
if (MI32.option.MQTTType == 0){ if (MI32.option.MQTTType == 0){
// show tas style sensor MQTT
MI32ShowSomeSensors(); MI32ShowSomeSensors();
} else { }
if (MI32.option.MQTTType == 1
#ifdef USE_HOME_ASSISTANT
||
Settings.flag.hass_discovery
#endif
) {
// these two share a counter
// discovery only sent if hass_discovery
MI32DiscoveryOneMISensor(); MI32DiscoveryOneMISensor();
// show independent style sensor MQTT
// note - if !MQTTType, then this is IN ADDITION to 'normal'
MI32ShowOneMISensor(); MI32ShowOneMISensor();
} }