mirror of https://github.com/arendst/Tasmota.git
commit
e7ea6fd9a8
|
@ -61,6 +61,7 @@ build_unflags = -Wall
|
|||
|
||||
build_flags =
|
||||
-Wl,-Tesp8266.flash.1m0.ld
|
||||
-mtarget-align
|
||||
; -DUSE_CONFIG_OVERRIDE
|
||||
; lwIP 1.4 (Default)
|
||||
; -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH
|
||||
|
|
|
@ -1,8 +1,15 @@
|
|||
/* 6.2.1.2 20180906
|
||||
/* 6.2.1.3 20180907
|
||||
* Change web Configure Module GPIO drop down list order for better readability
|
||||
* Fix showing Period Power in energy threshold messages
|
||||
* Fix ButtonRetain to not use default topic for clearing retain messages (#3737)
|
||||
* Add sleep to Nova Fitness SDS01X sensor (#2841, #3724)
|
||||
*
|
||||
* 6.2.1.2 20180906
|
||||
* Fix KNX PA exception. Regression from 6.2.1 buffer overflow caused by subStr() (#3700, #3710)
|
||||
* Add command SetOption52 to control display of optional time offset from UTC in JSON messages (#3629, #3711)
|
||||
* Add experimental support for PZEM-003,014,016,017 Energy monitoring (#3694)
|
||||
* Add basic support for MP3 player using DFRobot RB-DFR-562 (#3723)
|
||||
* Fix setting and getting color temperature for Philips Hue emulation (#3733)
|
||||
*
|
||||
* 6.2.1.1 20180905
|
||||
* Rewrite energy monitoring using energy sensor driver modules
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "Подсветка"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "RétroÉcl"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "Háttérvil"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "Luz de fundo"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "Luz negra"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -475,7 +475,8 @@
|
|||
#define D_SENSOR_SPI_DC "SPI DC"
|
||||
#define D_SENSOR_BACKLIGHT "BkLight"
|
||||
#define D_SENSOR_PMS5003 "PMS5003"
|
||||
#define D_SENSOR_SDS0X1 "SDS0X1"
|
||||
#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx"
|
||||
#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx"
|
||||
#define D_SENSOR_SBR_RX "SerBr Rx"
|
||||
#define D_SENSOR_SBR_TX "SerBr Tx"
|
||||
#define D_SENSOR_SR04_TRIG "SR04 Tri"
|
||||
|
|
|
@ -134,7 +134,7 @@ int ota_state_flag = 0; // OTA state flag
|
|||
int ota_result = 0; // OTA result
|
||||
int restart_flag = 0; // Sonoff restart flag
|
||||
int wifi_state_flag = WIFI_RESTART; // Wifi state flag
|
||||
int tele_period = 0; // Tele period timer
|
||||
int tele_period = 1; // Tele period timer
|
||||
int blinks = 201; // Number of LED blinks
|
||||
uint32_t uptime = 0; // Counting every second until 4294967295 = 130 year
|
||||
uint32_t global_update = 0; // Timestamp of last global temperature and humidity update
|
||||
|
@ -849,10 +849,8 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
|
|||
else if ((CMND_GPIO == command_code) && (index < MAX_GPIO_PIN)) {
|
||||
mytmplt cmodule;
|
||||
memcpy_P(&cmodule, &kModules[Settings.module], sizeof(cmodule));
|
||||
// if ((GPIO_USER == cmodule.gp.io[index]) && (payload >= 0) && (payload < GPIO_SENSOR_END)) {
|
||||
if ((GPIO_USER == ValidGPIO(index, cmodule.gp.io[index])) && (payload >= 0) && (payload < GPIO_SENSOR_END)) {
|
||||
for (byte i = 0; i < MAX_GPIO_PIN; i++) {
|
||||
// if ((GPIO_USER == cmodule.gp.io[i]) && (Settings.my_gp.io[i] == payload)) {
|
||||
if ((GPIO_USER == ValidGPIO(i, cmodule.gp.io[i])) && (Settings.my_gp.io[i] == payload)) {
|
||||
Settings.my_gp.io[i] = 0;
|
||||
}
|
||||
|
@ -862,7 +860,6 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
|
|||
}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{"));
|
||||
for (byte i = 0; i < MAX_GPIO_PIN; i++) {
|
||||
// if (GPIO_USER == cmodule.gp.io[i]) {
|
||||
if (GPIO_USER == ValidGPIO(i, cmodule.gp.io[i])) {
|
||||
if (jsflg) snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,"), mqtt_data);
|
||||
jsflg = 1;
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
#define _SONOFF_TEMPLATE_H_
|
||||
|
||||
// User selectable GPIO functionality
|
||||
// ATTENTION: Only add at the end of this list just before GPIO_SENSOR_END
|
||||
// Then add the same name(s) in a nice location in array kGpioNiceList
|
||||
enum UserSelectablePins {
|
||||
GPIO_NONE, // Not used
|
||||
GPIO_DHT11, // DHT11
|
||||
|
@ -92,7 +94,7 @@ enum UserSelectablePins {
|
|||
GPIO_SPI_DC, // SPI Data Direction
|
||||
GPIO_BACKLIGHT, // Display backlight control
|
||||
GPIO_PMS5003, // Plantower PMS5003 Serial interface
|
||||
GPIO_SDS0X1, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_SDS0X1_RX, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_SBR_TX, // Serial Bridge Serial interface
|
||||
GPIO_SBR_RX, // Serial Bridge Serial interface
|
||||
GPIO_SR04_TRIG, // SR04 Trigger pin
|
||||
|
@ -123,6 +125,7 @@ enum UserSelectablePins {
|
|||
GPIO_PZEM2_TX, // PZEM-003,014,016,017 Serial interface
|
||||
GPIO_PZEM2_RX, // PZEM-003,014,016,017 Serial interface
|
||||
GPIO_MP3_DFR562, // RB-DFR-562, DFPlayer Mini MP3 Player
|
||||
GPIO_SDS0X1_TX, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_SENSOR_END };
|
||||
|
||||
// Programmer selectable GPIO functionality offset by user selectable GPIOs
|
||||
|
@ -164,7 +167,7 @@ const char kSensorNames[] PROGMEM =
|
|||
D_SENSOR_PZEM_TX "|" D_SENSOR_PZEM_RX "|"
|
||||
D_SENSOR_SAIR_TX "|" D_SENSOR_SAIR_RX "|"
|
||||
D_SENSOR_SPI_CS "|" D_SENSOR_SPI_DC "|" D_SENSOR_BACKLIGHT "|"
|
||||
D_SENSOR_PMS5003 "|" D_SENSOR_SDS0X1 "|"
|
||||
D_SENSOR_PMS5003 "|" D_SENSOR_SDS0X1_RX "|"
|
||||
D_SENSOR_SBR_TX "|" D_SENSOR_SBR_RX "|"
|
||||
D_SENSOR_SR04_TRIG "|" D_SENSOR_SR04_ECHO "|"
|
||||
D_SENSOR_SDM120_TX "|" D_SENSOR_SDM120_RX "|"
|
||||
|
@ -174,7 +177,7 @@ const char kSensorNames[] PROGMEM =
|
|||
D_SENSOR_BUTTON "1n|" D_SENSOR_BUTTON "2n|" D_SENSOR_BUTTON "3n|" D_SENSOR_BUTTON "4n|"
|
||||
D_SENSOR_COUNTER "1n|" D_SENSOR_COUNTER "2n|" D_SENSOR_COUNTER "3n|" D_SENSOR_COUNTER "4n|"
|
||||
D_SENSOR_PZEM_TX "|" D_SENSOR_PZEM_RX "|"
|
||||
D_SENSOR_DFR562;
|
||||
D_SENSOR_DFR562 "|" D_SENSOR_SDS0X1_TX;
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
|
@ -244,7 +247,112 @@ typedef struct MYTMPLT {
|
|||
myio gp;
|
||||
} mytmplt;
|
||||
|
||||
const uint8_t kNiceList[MAXMODULE] PROGMEM = {
|
||||
const uint8_t kGpioNiceList[GPIO_SENSOR_END] PROGMEM = {
|
||||
GPIO_NONE, // Not used
|
||||
GPIO_KEY1, // Buttons
|
||||
GPIO_KEY1_NP,
|
||||
GPIO_KEY2,
|
||||
GPIO_KEY2_NP,
|
||||
GPIO_KEY3,
|
||||
GPIO_KEY3_NP,
|
||||
GPIO_KEY4,
|
||||
GPIO_KEY4_NP,
|
||||
GPIO_SWT1, // User connected external switches
|
||||
GPIO_SWT1_NP,
|
||||
GPIO_SWT2,
|
||||
GPIO_SWT2_NP,
|
||||
GPIO_SWT3,
|
||||
GPIO_SWT3_NP,
|
||||
GPIO_SWT4,
|
||||
GPIO_SWT4_NP,
|
||||
GPIO_SWT5,
|
||||
GPIO_SWT5_NP,
|
||||
GPIO_SWT6,
|
||||
GPIO_SWT6_NP,
|
||||
GPIO_SWT7,
|
||||
GPIO_SWT7_NP,
|
||||
GPIO_SWT8,
|
||||
GPIO_SWT8_NP,
|
||||
GPIO_REL1, // Relays
|
||||
GPIO_REL1_INV,
|
||||
GPIO_REL2,
|
||||
GPIO_REL2_INV,
|
||||
GPIO_REL3,
|
||||
GPIO_REL3_INV,
|
||||
GPIO_REL4,
|
||||
GPIO_REL4_INV,
|
||||
GPIO_REL5,
|
||||
GPIO_REL5_INV,
|
||||
GPIO_REL6,
|
||||
GPIO_REL6_INV,
|
||||
GPIO_REL7,
|
||||
GPIO_REL7_INV,
|
||||
GPIO_REL8,
|
||||
GPIO_REL8_INV,
|
||||
GPIO_LED1, // Leds
|
||||
GPIO_LED1_INV,
|
||||
GPIO_LED2,
|
||||
GPIO_LED2_INV,
|
||||
GPIO_LED3,
|
||||
GPIO_LED3_INV,
|
||||
GPIO_LED4,
|
||||
GPIO_LED4_INV,
|
||||
GPIO_PWM1, // RGB Red or C Cold White
|
||||
GPIO_PWM1_INV,
|
||||
GPIO_PWM2, // RGB Green or CW Warm White
|
||||
GPIO_PWM2_INV,
|
||||
GPIO_PWM3, // RGB Blue
|
||||
GPIO_PWM3_INV,
|
||||
GPIO_PWM4, // RGBW (Cold) White
|
||||
GPIO_PWM4_INV,
|
||||
GPIO_PWM5, // RGBCW Warm White
|
||||
GPIO_PWM5_INV,
|
||||
GPIO_CNTR1, // Counters
|
||||
GPIO_CNTR1_NP,
|
||||
GPIO_CNTR2,
|
||||
GPIO_CNTR2_NP,
|
||||
GPIO_CNTR3,
|
||||
GPIO_CNTR3_NP,
|
||||
GPIO_CNTR4,
|
||||
GPIO_CNTR4_NP,
|
||||
GPIO_I2C_SCL, // I2C SCL
|
||||
GPIO_I2C_SDA, // I2C SDA
|
||||
GPIO_SPI_CS, // SPI Chip Select
|
||||
GPIO_SPI_DC, // SPI Data Direction
|
||||
GPIO_BACKLIGHT, // Display backlight control
|
||||
GPIO_DHT11, // DHT11
|
||||
GPIO_DHT22, // DHT21, DHT22, AM2301, AM2302, AM2321
|
||||
GPIO_SI7021, // iTead SI7021
|
||||
GPIO_DSB, // Single wire DS18B20 or DS18S20
|
||||
GPIO_WS2812, // WS2812 Led string
|
||||
GPIO_IRSEND, // IR remote
|
||||
GPIO_IRRECV, // IR receiver
|
||||
GPIO_SR04_TRIG, // SR04 Trigger pin
|
||||
GPIO_SR04_ECHO, // SR04 Echo pin
|
||||
GPIO_TM16CLK, // TM1638 Clock
|
||||
GPIO_TM16DIO, // TM1638 Data I/O
|
||||
GPIO_TM16STB, // TM1638 Strobe
|
||||
GPIO_SBR_TX, // Serial Bridge Serial interface
|
||||
GPIO_SBR_RX, // Serial Bridge Serial interface
|
||||
GPIO_MHZ_TXD, // MH-Z19 Serial interface
|
||||
GPIO_MHZ_RXD, // MH-Z19 Serial interface
|
||||
GPIO_SAIR_TX, // SenseAir Serial interface
|
||||
GPIO_SAIR_RX, // SenseAir Serial interface
|
||||
GPIO_SDS0X1_TX, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_SDS0X1_RX, // Nova Fitness SDS011 Serial interface
|
||||
GPIO_PZEM_TX, // PZEM004T Serial interface
|
||||
GPIO_PZEM_RX, // PZEM004T Serial interface
|
||||
GPIO_PZEM2_TX, // PZEM-003,014,016,017 Serial interface
|
||||
GPIO_PZEM2_RX, // PZEM-003,014,016,017 Serial interface
|
||||
GPIO_SDM120_TX, // SDM120 Serial interface
|
||||
GPIO_SDM120_RX, // SDM120 Serial interface
|
||||
GPIO_SDM630_TX, // SDM630 Serial interface
|
||||
GPIO_SDM630_RX, // SDM630 Serial interface
|
||||
GPIO_PMS5003, // Plantower PMS5003 Serial interface
|
||||
GPIO_MP3_DFR562 // RB-DFR-562, DFPlayer Mini MP3 Player Serial interface
|
||||
};
|
||||
|
||||
const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = {
|
||||
SONOFF_BASIC,
|
||||
SONOFF_RF,
|
||||
SONOFF_TH,
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#ifndef _SONOFF_VERSION_H_
|
||||
#define _SONOFF_VERSION_H_
|
||||
|
||||
#define VERSION 0x06020102
|
||||
#define VERSION 0x06020103
|
||||
|
||||
#define D_PROGRAMNAME "Sonoff-Tasmota"
|
||||
#define D_AUTHOR "Theo Arends"
|
||||
|
|
|
@ -628,7 +628,8 @@ boolean GetUsedInModule(byte val, uint8_t *arr)
|
|||
if (GPIO_PMS5003 == val) { return true; }
|
||||
#endif
|
||||
#ifndef USE_NOVA_SDS
|
||||
if (GPIO_SDS0X1 == val) { return true; }
|
||||
if (GPIO_SDS0X1_TX == val) { return true; }
|
||||
if (GPIO_SDS0X1_RX == val) { return true; }
|
||||
#endif
|
||||
#ifndef USE_SERIAL_BRIDGE
|
||||
if (GPIO_SBR_TX == val) { return true; }
|
||||
|
@ -935,8 +936,20 @@ void GetFeatures()
|
|||
#ifdef USE_DISPLAY_SH1106
|
||||
feature_drv2 |= 0x00001000; // xdsp_06_sh1106.ino
|
||||
#endif
|
||||
#ifdef USE_MP3_PLAYER
|
||||
feature_drv2 |= 0x00002000; // xdrv_14_mp3.ino
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef NO_EXTRA_4K_HEAP
|
||||
feature_drv2 |= 0x00800000; // sonoff_post.h
|
||||
#endif
|
||||
#ifdef VTABLES_IN_IRAM
|
||||
feature_drv2 |= 0x01000000; // platformio.ini
|
||||
#endif
|
||||
#ifdef VTABLES_IN_DRAM
|
||||
feature_drv2 |= 0x02000000; // platformio.ini
|
||||
#endif
|
||||
#ifdef VTABLES_IN_FLASH
|
||||
feature_drv2 |= 0x04000000; // platformio.ini
|
||||
#endif
|
||||
|
|
|
@ -380,9 +380,7 @@ void MqttConnected()
|
|||
MqttPublishPowerState(i);
|
||||
if (SONOFF_IFAN02 == Settings.module) { break; } // Only report status of light relay
|
||||
}
|
||||
if (Settings.tele_period) {
|
||||
tele_period = Settings.tele_period -9;
|
||||
}
|
||||
if (Settings.tele_period) { tele_period = Settings.tele_period -9; } // Enable TelePeriod in 9 seconds
|
||||
rules_flag.system_boot = 1;
|
||||
XdrvCall(FUNC_MQTT_INIT);
|
||||
}
|
||||
|
@ -718,7 +716,6 @@ bool MqttCommand()
|
|||
}
|
||||
else if (CMND_BUTTONRETAIN == command_code) {
|
||||
if ((payload >= 0) && (payload <= 1)) {
|
||||
strlcpy(Settings.button_topic, mqtt_topic, sizeof(Settings.button_topic));
|
||||
if (!payload) {
|
||||
for(i = 1; i <= MAX_KEYS; i++) {
|
||||
SendKey(0, i, 9); // Clear MQTT retain in broker
|
||||
|
@ -730,7 +727,6 @@ bool MqttCommand()
|
|||
}
|
||||
else if (CMND_SWITCHRETAIN == command_code) {
|
||||
if ((payload >= 0) && (payload <= 1)) {
|
||||
strlcpy(Settings.button_topic, mqtt_topic, sizeof(Settings.button_topic));
|
||||
if (!payload) {
|
||||
for(i = 1; i <= MAX_SWITCHES; i++) {
|
||||
SendKey(1, i, 9); // Clear MQTT retain in broker
|
||||
|
|
|
@ -768,7 +768,7 @@ void HandleModuleConfiguration()
|
|||
page.replace(F("{v}"), FPSTR(S_CONFIGURE_MODULE));
|
||||
page += FPSTR(HTTP_SCRIPT_MODULE1);
|
||||
for (byte i = 0; i < MAXMODULE; i++) {
|
||||
midx = pgm_read_byte(kNiceList + i);
|
||||
midx = pgm_read_byte(kModuleNiceList + i);
|
||||
snprintf_P(stemp, sizeof(stemp), kModules[midx].name);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SCRIPT_MODULE2, midx, midx +1, stemp);
|
||||
page += mqtt_data;
|
||||
|
@ -779,10 +779,10 @@ void HandleModuleConfiguration()
|
|||
|
||||
mytmplt cmodule;
|
||||
memcpy_P(&cmodule, &kModules[Settings.module], sizeof(cmodule));
|
||||
|
||||
for (byte j = 0; j < GPIO_SENSOR_END; j++) {
|
||||
if (!GetUsedInModule(j, cmodule.gp.io)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SCRIPT_MODULE2, j, j, GetTextIndexed(stemp, sizeof(stemp), j, kSensorNames));
|
||||
midx = pgm_read_byte(kGpioNiceList + j);
|
||||
if (!GetUsedInModule(midx, cmodule.gp.io)) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SCRIPT_MODULE2, midx, midx, GetTextIndexed(stemp, sizeof(stemp), midx, kSensorNames));
|
||||
page += mqtt_data;
|
||||
}
|
||||
}
|
||||
|
@ -805,7 +805,7 @@ void HandleModuleConfiguration()
|
|||
for (byte i = 0; i < MAX_GPIO_PIN; i++) {
|
||||
if (GPIO_USER == ValidGPIO(i, cmodule.gp.io[i])) {
|
||||
snprintf_P(stemp, 3, PINS_WEMOS +i*2);
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("<tr><td style='width:190px'>%s <b>" D_GPIO "%d</b> %s</td><td style='width:146px'><select id='g%d' name='g%d'></select></td></tr>"),
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("<tr><td style='width:190px'>%s <b>" D_GPIO "%d</b> %s</td><td style='width:160px'><select id='g%d' name='g%d'></select></td></tr>"),
|
||||
(WEMOS==Settings.module)?stemp:"", i, (0==i)? D_SENSOR_BUTTON "1":(1==i)? D_SERIAL_OUT :(3==i)? D_SERIAL_IN :(9==i)? "<font color='red'>ESP8285</font>" :(10==i)? "<font color='red'>ESP8285</font>" :(12==i)? D_SENSOR_RELAY "1":(13==i)? D_SENSOR_LED "1i":(14==i)? D_SENSOR :"", i, i);
|
||||
page += mqtt_data;
|
||||
}
|
||||
|
@ -1193,7 +1193,7 @@ void HandleSaveSettings()
|
|||
if (Settings.last_module != new_module) {
|
||||
Settings.my_gp.io[i] = 0;
|
||||
} else {
|
||||
if (GPIO_USER == cmodule.gp.io[i]) {
|
||||
if (GPIO_USER == ValidGPIO(i, cmodule.gp.io[i])) {
|
||||
snprintf_P(stemp, sizeof(stemp), PSTR("g%d"), i);
|
||||
WebGetArg(stemp, tmp, sizeof(tmp));
|
||||
Settings.my_gp.io[i] = (!strlen(tmp)) ? 0 : atoi(tmp);
|
||||
|
|
|
@ -304,7 +304,10 @@ void EnergyMqttShow()
|
|||
{
|
||||
// {"Time":"2017-12-16T11:48:55","ENERGY":{"Total":0.212,"Yesterday":0.000,"Today":0.014,"Period":2.0,"Power":22.0,"Factor":1.00,"Voltage":213.6,"Current":0.100}}
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_TIME "\":\"%s\""), GetDateAndTime(DT_LOCAL).c_str());
|
||||
int tele_period_save = tele_period;
|
||||
tele_period = 2;
|
||||
EnergyShow(1);
|
||||
tele_period = tele_period_save;
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
|
||||
energy_power_delta = 0;
|
||||
|
|
|
@ -557,8 +557,8 @@ void LightState(uint8_t append)
|
|||
if (light_subtype > LST_SINGLE) {
|
||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_COLOR "\":\"%s\""), mqtt_data, LightGetColor(0, scolor));
|
||||
// Add status for HSB
|
||||
LightGetHsb(&hsb[0],&hsb[1],&hsb[2]);
|
||||
// Scale these percentages up to the numbers expected byt he client
|
||||
LightGetHsb(&hsb[0],&hsb[1],&hsb[2], false);
|
||||
// Scale these percentages up to the numbers expected by the client
|
||||
h = round(hsb[0] * 360);
|
||||
s = round(hsb[1] * 100);
|
||||
b = round(hsb[2] * 100);
|
||||
|
@ -911,13 +911,15 @@ void LightHsbToRgb()
|
|||
light_current_color[0] = (uint8_t)(r * 255.0f);
|
||||
light_current_color[1] = (uint8_t)(g * 255.0f);
|
||||
light_current_color[2] = (uint8_t)(b * 255.0f);
|
||||
light_current_color[3] = 0;
|
||||
light_current_color[4] = 0;
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
void LightGetHsb(float *hue, float *sat, float *bri)
|
||||
void LightGetHsb(float *hue, float *sat, float *bri, bool gotct)
|
||||
{
|
||||
if (light_subtype > LST_COLDWARM) {
|
||||
if (light_subtype > LST_COLDWARM && !gotct) {
|
||||
LightRgbToHsb();
|
||||
*hue = light_hue;
|
||||
*sat = light_saturation;
|
||||
|
@ -925,16 +927,19 @@ void LightGetHsb(float *hue, float *sat, float *bri)
|
|||
} else {
|
||||
*hue = 0;
|
||||
*sat = 0;
|
||||
// *bri = (2.54f * (float)Settings.light_dimmer);
|
||||
*bri = (0.01f * (float)Settings.light_dimmer);
|
||||
}
|
||||
}
|
||||
|
||||
void LightSetHsb(float hue, float sat, float bri, uint16_t ct)
|
||||
void LightSetHsb(float hue, float sat, float bri, uint16_t ct, bool gotct)
|
||||
{
|
||||
if (light_subtype > LST_COLDWARM) {
|
||||
if ((LST_RGBWC == light_subtype) && (ct > 0)) {
|
||||
LightSetColorTemp(ct);
|
||||
if ((LST_RGBWC == light_subtype) && (gotct)) {
|
||||
uint8_t tmp = (uint8_t)(bri * 100);
|
||||
Settings.light_dimmer = tmp;
|
||||
if (ct > 0) {
|
||||
LightSetColorTemp(ct);
|
||||
}
|
||||
} else {
|
||||
light_hue = hue;
|
||||
light_saturation = sat;
|
||||
|
@ -1114,7 +1119,7 @@ boolean LightCommand()
|
|||
} else { // Command with only 1 parameter, Hue (0<H<360), Saturation (0<S<100) OR Brightness (0<B<100)
|
||||
float hsb[3];
|
||||
|
||||
LightGetHsb(&hsb[0],&hsb[1],&hsb[2]);
|
||||
LightGetHsb(&hsb[0],&hsb[1],&hsb[2], false);
|
||||
HSB[0] = round(hsb[0] * 360);
|
||||
HSB[1] = round(hsb[1] * 100);
|
||||
HSB[2] = round(hsb[2] * 100);
|
||||
|
@ -1130,7 +1135,8 @@ boolean LightCommand()
|
|||
LightSetHsb(( (HSB[0]>360) ? (HSB[0] % 360) : HSB[0] ) /360.0,
|
||||
( (HSB[1]>100) ? (HSB[1] % 100) : HSB[1] ) /100.0,
|
||||
( (HSB[2]>100) ? (HSB[2] % 100) : HSB[2] ) /100.0,
|
||||
0);
|
||||
0,
|
||||
false);
|
||||
}
|
||||
} else {
|
||||
LightState(0);
|
||||
|
|
|
@ -426,7 +426,7 @@ void RulesEvery100ms()
|
|||
{
|
||||
if (Settings.rule_enabled) { // Any rule enabled
|
||||
mqtt_data[0] = '\0';
|
||||
uint16_t tele_period_save = tele_period;
|
||||
int tele_period_save = tele_period;
|
||||
tele_period = 2; // Do not allow HA updates during next function call
|
||||
XsnsNextCall(FUNC_JSON_APPEND); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
|
||||
tele_period = tele_period_save;
|
||||
|
|
|
@ -17,6 +17,9 @@
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define min(a,b) ((a)<(b)?(a):(b))
|
||||
#define max(a,b) ((a)>(b)?(a):(b))
|
||||
|
||||
#if defined(USE_WEBSERVER) && defined(USE_EMULATION)
|
||||
/*********************************************************************************************\
|
||||
* Belkin WeMo and Philips Hue bridge emulation
|
||||
|
@ -462,10 +465,10 @@ const char HUE_LIGHTS_STATUS_JSON[] PROGMEM =
|
|||
"\"hue\":{h},"
|
||||
"\"sat\":{s},"
|
||||
"\"xy\":[0.5, 0.5],"
|
||||
"\"ct\":500,"
|
||||
"\"ct\":{t},"
|
||||
"\"alert\":\"none\","
|
||||
"\"effect\":\"none\","
|
||||
"\"colormode\":\"hs\","
|
||||
"\"colormode\":\"{m}\","
|
||||
"\"reachable\":true}";
|
||||
const char HUE_LIGHTS_STATUS_JSON2[] PROGMEM =
|
||||
",\"type\":\"Extended color light\","
|
||||
|
@ -559,20 +562,26 @@ void HueConfig(String *path)
|
|||
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
|
||||
}
|
||||
|
||||
bool g_gotct = false;
|
||||
|
||||
void HueLightStatus1(byte device, String *response)
|
||||
{
|
||||
float hue = 0;
|
||||
float sat = 0;
|
||||
float bri = 0;
|
||||
uint16_t ct = 500;
|
||||
|
||||
if (light_type) {
|
||||
LightGetHsb(&hue, &sat, &bri);
|
||||
LightGetHsb(&hue, &sat, &bri, g_gotct);
|
||||
ct = LightGetColorTemp();
|
||||
}
|
||||
*response += FPSTR(HUE_LIGHTS_STATUS_JSON);
|
||||
response->replace("{state}", (power & (1 << (device-1))) ? "true" : "false");
|
||||
response->replace("{h}", String((uint16_t)(65535.0f * hue)));
|
||||
response->replace("{s}", String((uint8_t)(254.0f * sat)));
|
||||
response->replace("{b}", String((uint8_t)(254.0f * bri)));
|
||||
response->replace("{t}", String(ct));
|
||||
response->replace("{m}", g_gotct?"ct":"hs");
|
||||
}
|
||||
|
||||
void HueLightStatus2(byte device, String *response)
|
||||
|
@ -678,11 +687,13 @@ void HueLights(String *path)
|
|||
}
|
||||
|
||||
if (light_type) {
|
||||
LightGetHsb(&hue, &sat, &bri);
|
||||
LightGetHsb(&hue, &sat, &bri, g_gotct);
|
||||
}
|
||||
|
||||
if (hue_json.containsKey("bri")) {
|
||||
if (hue_json.containsKey("bri")) { // Brightness is a scale from 1 (the minimum the light is capable of) to 254 (the maximum). Note: a brightness of 1 is not off.
|
||||
tmp = hue_json["bri"];
|
||||
tmp = max(tmp, 1);
|
||||
tmp = min(tmp, 254);
|
||||
bri = (float)tmp / 254.0f;
|
||||
if (resp) {
|
||||
response += ",";
|
||||
|
@ -694,7 +705,7 @@ void HueLights(String *path)
|
|||
resp = true;
|
||||
change = true;
|
||||
}
|
||||
if (hue_json.containsKey("hue")) {
|
||||
if (hue_json.containsKey("hue")) { // The hue value is a wrapping value between 0 and 65535. Both 0 and 65535 are red, 25500 is green and 46920 is blue.
|
||||
tmp = hue_json["hue"];
|
||||
hue = (float)tmp / 65535.0f;
|
||||
if (resp) {
|
||||
|
@ -704,11 +715,14 @@ void HueLights(String *path)
|
|||
response.replace("{id", String(device));
|
||||
response.replace("{cm", "hue");
|
||||
response.replace("{re", String(tmp));
|
||||
g_gotct = false;
|
||||
resp = true;
|
||||
change = true;
|
||||
}
|
||||
if (hue_json.containsKey("sat")) {
|
||||
if (hue_json.containsKey("sat")) { // Saturation of the light. 254 is the most saturated (colored) and 0 is the least saturated (white).
|
||||
tmp = hue_json["sat"];
|
||||
tmp = max(tmp, 0);
|
||||
tmp = min(tmp, 254);
|
||||
sat = (float)tmp / 254.0f;
|
||||
if (resp) {
|
||||
response += ",";
|
||||
|
@ -717,6 +731,8 @@ void HueLights(String *path)
|
|||
response.replace("{id", String(device));
|
||||
response.replace("{cm", "sat");
|
||||
response.replace("{re", String(tmp));
|
||||
g_gotct = false;
|
||||
resp = true;
|
||||
change = true;
|
||||
}
|
||||
if (hue_json.containsKey("ct")) { // Color temperature 153 (Cold) to 500 (Warm)
|
||||
|
@ -728,11 +744,12 @@ void HueLights(String *path)
|
|||
response.replace("{id", String(device));
|
||||
response.replace("{cm", "ct");
|
||||
response.replace("{re", String(ct));
|
||||
g_gotct = true;
|
||||
change = true;
|
||||
}
|
||||
if (change) {
|
||||
if (light_type) {
|
||||
LightSetHsb(hue, sat, bri, ct);
|
||||
LightSetHsb(hue, sat, bri, ct, g_gotct);
|
||||
}
|
||||
change = false;
|
||||
}
|
||||
|
|
|
@ -31,13 +31,18 @@ TasmotaSerial *NovaSdsSerial;
|
|||
|
||||
uint8_t novasds_type = 1;
|
||||
uint8_t novasds_valid = 0;
|
||||
uint8_t novasds_running = 1;
|
||||
uint8_t novasds_read_tick = 30;
|
||||
uint8_t novasds_wakup_tick = 179;
|
||||
uint8_t novasds_ticker = 0;
|
||||
|
||||
struct sds011data {
|
||||
uint16_t pm100;
|
||||
uint16_t pm25;
|
||||
} novasds_data;
|
||||
|
||||
bool NovaSdsReadData()
|
||||
|
||||
bool NovaSdsReadData(bool publish)
|
||||
{
|
||||
if (! NovaSdsSerial->available()) return false;
|
||||
|
||||
|
@ -51,7 +56,9 @@ bool NovaSdsReadData()
|
|||
NovaSdsSerial->flush();
|
||||
|
||||
AddLogSerial(LOG_LEVEL_DEBUG_MORE, d, 8);
|
||||
|
||||
if (!publish){
|
||||
return false;
|
||||
}
|
||||
if (d[7] == ((d[1] + d[2] + d[3] + d[4] + d[5] + d[6]) & 0xFF)) {
|
||||
novasds_data.pm25 = (d[1] + 256 * d[2]);
|
||||
novasds_data.pm100 = (d[3] + 256 * d[4]);
|
||||
|
@ -59,9 +66,6 @@ bool NovaSdsReadData()
|
|||
AddLog_P(LOG_LEVEL_DEBUG, PSTR("SDS: " D_CHECKSUM_FAILURE));
|
||||
return false;
|
||||
}
|
||||
|
||||
novasds_valid = 10;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -69,12 +73,35 @@ bool NovaSdsReadData()
|
|||
|
||||
void NovaSdsSecond() // Every second
|
||||
{
|
||||
if (NovaSdsReadData()) {
|
||||
novasds_valid = 10;
|
||||
} else {
|
||||
if (novasds_valid) {
|
||||
novasds_valid--;
|
||||
if (novasds_ticker < novasds_read_tick) {
|
||||
// wake up the sensor and wait read ticks to stabalize the sensor
|
||||
if (!novasds_running) {
|
||||
NovaSdsStart();
|
||||
novasds_running = 1;
|
||||
}
|
||||
|
||||
// drain the serial without publishing data
|
||||
NovaSdsReadData(false);
|
||||
novasds_ticker++;
|
||||
|
||||
} else if (novasds_ticker == novasds_read_tick) {
|
||||
|
||||
// try to take a single stable reading and sleep the sensor
|
||||
if (NovaSdsReadData(true)) {
|
||||
novasds_valid = 1;
|
||||
NovaSdsStop();
|
||||
novasds_running = 0;
|
||||
novasds_ticker++;
|
||||
} else {
|
||||
novasds_valid = 0;
|
||||
}
|
||||
|
||||
} else if (novasds_ticker >= novasds_wakup_tick) {
|
||||
// reset the counter
|
||||
novasds_ticker = 0;
|
||||
} else {
|
||||
// sensor is sleeping keep waiting
|
||||
novasds_ticker++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,12 +110,36 @@ void NovaSdsSecond() // Every second
|
|||
void NovaSdsInit()
|
||||
{
|
||||
novasds_type = 0;
|
||||
if (pin[GPIO_SDS0X1] < 99) {
|
||||
NovaSdsSerial = new TasmotaSerial(pin[GPIO_SDS0X1], -1, 1);
|
||||
if (pin[GPIO_SDS0X1_RX] < 99 && pin[GPIO_SDS0X1_TX] < 99) {
|
||||
NovaSdsSerial = new TasmotaSerial(pin[GPIO_SDS0X1_RX], pin[GPIO_SDS0X1_TX], 1);
|
||||
|
||||
if (NovaSdsSerial->begin(9600)) {
|
||||
if (NovaSdsSerial->hardwareSerial()) { ClaimSerial(); }
|
||||
if (NovaSdsSerial->hardwareSerial()) {
|
||||
ClaimSerial();
|
||||
}
|
||||
novasds_type = 1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void NovaSdsStart()
|
||||
{
|
||||
AddLog_P(LOG_LEVEL_DEBUG, "SDS: start");
|
||||
const uint8_t novasds_start_cmd[] = {0xAA, 0xB4, 0x06, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x06, 0xAB};
|
||||
NovaSdsSerial->write(novasds_start_cmd, sizeof(novasds_start_cmd));
|
||||
NovaSdsSerial->flush();
|
||||
}
|
||||
|
||||
void NovaSdsStop()
|
||||
{
|
||||
AddLog_P(LOG_LEVEL_DEBUG, "SDS: stop");
|
||||
const uint8_t novasds_stop_cmd[] = {0xAA, 0xB4, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x05, 0xAB};
|
||||
NovaSdsSerial->write(novasds_stop_cmd, sizeof(novasds_stop_cmd));
|
||||
NovaSdsSerial->flush();
|
||||
// drain any old data
|
||||
while (NovaSdsSerial->available()) {
|
||||
NovaSdsSerial->read();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -154,4 +205,4 @@ boolean Xsns20(byte function)
|
|||
return result;
|
||||
}
|
||||
|
||||
#endif // USE_NOVA_SDS
|
||||
#endif // USE_NOVA_SDS
|
||||
|
|
|
@ -108,10 +108,10 @@ a_features = [[
|
|||
"USE_CONFIG_OVERRIDE","BE_MINIMAL","USE_SENSORS","USE_CLASSIC",
|
||||
"USE_KNX_NO_EMULATION","USE_DISPLAY_MODES1TO5","USE_DISPLAY_GRAPH","USE_DISPLAY_LCD",
|
||||
"USE_DISPLAY_SSD1306","USE_DISPLAY_MATRIX","USE_DISPLAY_ILI9341","USE_DISPLAY_EPAPER",
|
||||
"USE_DISPLAY_SH1106","","","",
|
||||
"USE_DISPLAY_SH1106","USE_MP3_PLAYER","","",
|
||||
"","","","",
|
||||
"","","","",
|
||||
"","","VTABLES_IN_FLASH","PIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH",
|
||||
"","","","NO_EXTRA_4K_HEAP",
|
||||
"VTABLES_IN_IRAM","VTABLES_IN_DRAM","VTABLES_IN_FLASH","PIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH",
|
||||
"PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY","PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH","DEBUG_THEO","USE_DEBUG_DRIVER"
|
||||
],[
|
||||
"","USE_ADC_VCC","USE_ENERGY_SENSOR","USE_PZEM004T",
|
||||
|
|
Loading…
Reference in New Issue