25
25
- Select IDE Tools - Flash Size: "1M (no SPIFFS)"
26
26
====================================================*/
27
27
28
- #define VERSION 0x050C0006 // 5.12.0f
28
+ #define VERSION 0x050C0007 // 5.12.0g
29
29
30
30
// Location specific includes
31
31
#include < core_version.h> // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
@@ -76,7 +76,7 @@ enum TasmotaCommands {
76
76
CMND_LOGHOST, CMND_LOGPORT, CMND_IPADDRESS, CMND_NTPSERVER, CMND_AP, CMND_SSID, CMND_PASSWORD, CMND_HOSTNAME,
77
77
CMND_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE, CMND_WEBSERVER, CMND_WEBPASSWORD, CMND_WEBLOG, CMND_EMULATION,
78
78
CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE,
79
- CMND_CFGDUMP, CMND_I2CSCAN, CMND_EXCEPTION };
79
+ CMND_CFGDUMP, CMND_I2CSCAN, CMND_SERIALSEND, CMND_BAUDRATE, CMND_EXCEPTION };
80
80
const char kTasmotaCommands [] PROGMEM =
81
81
D_CMND_BACKLOG " |" D_CMND_DELAY " |" D_CMND_POWER " |" D_CMND_STATUS " |" D_CMND_STATE " |" D_CMND_POWERONSTATE " |" D_CMND_PULSETIME " |"
82
82
D_CMND_BLINKTIME " |" D_CMND_BLINKCOUNT " |" D_CMND_SENSOR " |" D_CMND_SAVEDATA " |" D_CMND_SETOPTION " |" D_CMND_TEMPERATURE_RESOLUTION " |" D_CMND_HUMIDITY_RESOLUTION " |"
@@ -86,7 +86,7 @@ const char kTasmotaCommands[] PROGMEM =
86
86
D_CMND_LOGHOST " |" D_CMND_LOGPORT " |" D_CMND_IPADDRESS " |" D_CMND_NTPSERVER " |" D_CMND_AP " |" D_CMND_SSID " |" D_CMND_PASSWORD " |" D_CMND_HOSTNAME " |"
87
87
D_CMND_WIFICONFIG " |" D_CMND_FRIENDLYNAME " |" D_CMND_SWITCHMODE " |" D_CMND_WEBSERVER " |" D_CMND_WEBPASSWORD " |" D_CMND_WEBLOG " |" D_CMND_EMULATION " |"
88
88
D_CMND_TELEPERIOD " |" D_CMND_RESTART " |" D_CMND_RESET " |" D_CMND_TIMEZONE " |" D_CMND_ALTITUDE " |" D_CMND_LEDPOWER " |" D_CMND_LEDSTATE " |"
89
- D_CMND_CFGDUMP " |" D_CMND_I2CSCAN
89
+ D_CMND_CFGDUMP " |" D_CMND_I2CSCAN " | " D_CMND_SERIALSEND " | " D_CMND_BAUDRATE
90
90
#ifdef DEBUG_THEO
91
91
" |" D_CMND_EXCEPTION
92
92
#endif
@@ -102,6 +102,7 @@ const char kOptionBlinkOff[] PROGMEM = "BLINKOFF|" D_BLINKOFF ;
102
102
int baudrate = APP_BAUDRATE; // Serial interface baud rate
103
103
SerialConfig serial_config = SERIAL_8N1; // Serial interface configuration 8 data bits, No parity, 1 stop bit
104
104
byte serial_in_byte; // Received byte
105
+ unsigned long serial_polling_window = 0 ; // Serial polling window
105
106
int serial_in_byte_counter = 0 ; // Index in receive buffer
106
107
byte dual_hex_code = 0 ; // Sonoff dual input flag
107
108
uint16_t dual_button_code = 0 ; // Sonoff dual received code
@@ -422,10 +423,12 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
422
423
if (!strcmp (dataBuf," ?" )) data_len = 0 ;
423
424
int16_t payload = -99 ; // No payload
424
425
uint16_t payload16 = 0 ;
425
- long lnum = strtol (dataBuf, &p, 10 );
426
+ long payload32 = strtol (dataBuf, &p, 10 );
426
427
if (p != dataBuf) {
427
- payload = (int16_t ) lnum; // -32766 - 32767
428
- payload16 = (uint16_t ) lnum; // 0 - 65535
428
+ payload = (int16_t ) payload32; // -32766 - 32767
429
+ payload16 = (uint16_t ) payload32; // 0 - 65535
430
+ } else {
431
+ payload32 = 0 ;
429
432
}
430
433
backlog_delay = MIN_BACKLOG_DELAY; // Reset backlog delay
431
434
@@ -810,11 +813,27 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
810
813
strlcpy (Settings.ota_url , (1 == payload) ? OTA_URL : dataBuf, sizeof (Settings.ota_url ));
811
814
snprintf_P (mqtt_data, sizeof (mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.ota_url );
812
815
}
816
+ else if (CMND_BAUDRATE == command_code) {
817
+ if (payload32 > 0 ) {
818
+ payload32 /= 1200 ; // Make it a valid baudrate
819
+ baudrate = (1 == payload) ? APP_BAUDRATE : payload32 * 1200 ;
820
+ SetSerialBaudrate (baudrate);
821
+ }
822
+ snprintf_P (mqtt_data, sizeof (mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.baudrate * 1200 );
823
+ }
824
+ else if ((CMND_SERIALSEND == command_code) && (index > 0 ) && (index <= 2 )) {
825
+ SetSeriallog (LOG_LEVEL_NONE);
826
+ Settings.flag .mqtt_serial = 1 ;
827
+ if (data_len > 0 ) {
828
+ if (1 == index ) Serial.printf (" %s\n " , dataBuf);
829
+ if (2 == index ) Serial.printf (" %s" , dataBuf);
830
+ snprintf_P (mqtt_data, sizeof (mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_DONE);
831
+ }
832
+ }
813
833
else if (CMND_SERIALLOG == command_code) {
814
834
if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) {
815
- Settings.seriallog_level = payload;
816
- seriallog_level = payload;
817
- seriallog_timer = 0 ;
835
+ Settings.flag .mqtt_serial = 0 ;
836
+ SetSeriallog (payload);
818
837
}
819
838
snprintf_P (mqtt_data, sizeof (mqtt_data), S_JSON_COMMAND_NVALUE_ACTIVE_NVALUE, command, Settings.seriallog_level , seriallog_level);
820
839
}
@@ -1016,7 +1035,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
1016
1035
}
1017
1036
snprintf_P (mqtt_data, sizeof (mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText (bitRead (Settings.ledstate , 3 )));
1018
1037
}
1019
- else if (CMND_LEDSTATE ==command_code) {
1038
+ else if (CMND_LEDSTATE == command_code) {
1020
1039
if ((payload >= 0 ) && (payload < MAX_LED_OPTION)) {
1021
1040
Settings.ledstate = payload;
1022
1041
if (!Settings.ledstate ) SetLedPower (0 );
@@ -1902,41 +1921,73 @@ void SerialInput()
1902
1921
1903
1922
if (serial_in_byte > 127 ) { // binary data...
1904
1923
serial_in_byte_counter = 0 ;
1924
+ serial_polling_window = 0 ;
1905
1925
Serial.flush ();
1906
1926
return ;
1907
1927
}
1908
1928
if (isprint (serial_in_byte)) {
1909
- if (serial_in_byte_counter < INPUT_BUFFER_SIZE) { // add char to string if it still fits
1929
+ if (serial_in_byte_counter < INPUT_BUFFER_SIZE - 1 ) { // add char to string if it still fits
1910
1930
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
1931
+ serial_polling_window = millis ();
1911
1932
} else {
1912
1933
serial_in_byte_counter = 0 ;
1934
+ serial_polling_window = 0 ;
1913
1935
}
1914
1936
}
1915
1937
1916
1938
/* -------------------------------------------------------------------------------------------*\
1917
1939
* Sonoff SC 19200 baud serial interface
1918
1940
\*-------------------------------------------------------------------------------------------*/
1919
- if (serial_in_byte == ' \x1B ' ) { // Sonoff SC status from ATMEGA328P
1941
+ if (SONOFF_SC == Settings.module ) {
1942
+ if (serial_in_byte == ' \x1B ' ) { // Sonoff SC status from ATMEGA328P
1943
+ serial_in_buffer[serial_in_byte_counter] = 0 ; // serial data completed
1944
+ SonoffScSerialInput (serial_in_buffer);
1945
+ serial_in_byte_counter = 0 ;
1946
+ Serial.flush ();
1947
+ return ;
1948
+ }
1949
+ }
1950
+
1951
+ /* -------------------------------------------------------------------------------------------*/
1952
+ /*
1953
+ else if (serial_in_byte == '\n') {
1920
1954
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
1921
- SonoffScSerialInput (serial_in_buffer);
1955
+ if (!Settings.flag.mqtt_serial) {
1956
+ seriallog_level = (Settings.seriallog_level < LOG_LEVEL_INFO) ? (byte)LOG_LEVEL_INFO : Settings.seriallog_level;
1957
+ snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_COMMAND "%s"), serial_in_buffer);
1958
+ AddLog(LOG_LEVEL_INFO);
1959
+ ExecuteCommand(serial_in_buffer);
1960
+ } else {
1961
+ snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SERIALRECEIVED "\":\"%s\"}"), serial_in_buffer);
1962
+ MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SERIALRECEIVED));
1963
+ }
1922
1964
serial_in_byte_counter = 0;
1965
+ serial_polling_window = 0;
1923
1966
Serial.flush();
1924
1967
return;
1925
1968
}
1926
-
1927
- /* -------------------------------------------------------------------------------------------*/
1928
-
1929
- else if (serial_in_byte == ' \n ' ) {
1969
+ */
1970
+ else if (!Settings.flag .mqtt_serial && (serial_in_byte == ' \n ' )) {
1930
1971
serial_in_buffer[serial_in_byte_counter] = 0 ; // serial data completed
1931
1972
seriallog_level = (Settings.seriallog_level < LOG_LEVEL_INFO) ? (byte)LOG_LEVEL_INFO : Settings.seriallog_level ;
1932
1973
snprintf_P (log_data, sizeof (log_data), PSTR (D_LOG_COMMAND " %s" ), serial_in_buffer);
1933
1974
AddLog (LOG_LEVEL_INFO);
1934
1975
ExecuteCommand (serial_in_buffer);
1935
1976
serial_in_byte_counter = 0 ;
1977
+ serial_polling_window = 0 ;
1936
1978
Serial.flush ();
1937
1979
return ;
1938
1980
}
1939
1981
}
1982
+
1983
+ if (Settings.flag .mqtt_serial && serial_in_byte_counter && (millis () > (serial_polling_window + SERIAL_POLLING))) {
1984
+ serial_in_buffer[serial_in_byte_counter] = 0 ; // serial data completed
1985
+ snprintf_P (mqtt_data, sizeof (mqtt_data), PSTR (" {\" " D_JSON_SERIALRECEIVED " \" :\" %s\" }" ), serial_in_buffer);
1986
+ MqttPublishPrefixTopic_P (RESULT_OR_TELE, PSTR (D_JSON_SERIALRECEIVED));
1987
+ serial_in_byte_counter = 0 ;
1988
+ serial_polling_window = 0 ;
1989
+ Serial.flush ();
1990
+ }
1940
1991
}
1941
1992
1942
1993
/* *******************************************************************************************/
@@ -2033,18 +2084,22 @@ void GpioInit()
2033
2084
}
2034
2085
2035
2086
if (SONOFF_BRIDGE == Settings.module ) {
2087
+ Settings.flag .mqtt_serial = 0 ;
2036
2088
baudrate = 19200 ;
2037
2089
}
2038
2090
2039
2091
if (SONOFF_DUAL == Settings.module ) {
2092
+ Settings.flag .mqtt_serial = 0 ;
2040
2093
devices_present = 2 ;
2041
2094
baudrate = 19200 ;
2042
2095
}
2043
2096
else if (CH4 == Settings.module ) {
2097
+ Settings.flag .mqtt_serial = 0 ;
2044
2098
devices_present = 4 ;
2045
2099
baudrate = 19200 ;
2046
2100
}
2047
2101
else if (SONOFF_SC == Settings.module ) {
2102
+ Settings.flag .mqtt_serial = 0 ;
2048
2103
devices_present = 0 ;
2049
2104
baudrate = 19200 ;
2050
2105
}
@@ -2141,6 +2196,7 @@ void setup()
2141
2196
2142
2197
OsWatchInit ();
2143
2198
2199
+ baudrate = Settings.baudrate * 1200 ;
2144
2200
seriallog_level = Settings.seriallog_level ;
2145
2201
seriallog_timer = SERIALLOG_TIMER;
2146
2202
#ifndef USE_EMULATION
@@ -2246,7 +2302,7 @@ void loop()
2246
2302
2247
2303
if (millis () >= state_loop_timer) StateLoop ();
2248
2304
2249
- if (Serial. available ()) SerialInput ();
2305
+ SerialInput ();
2250
2306
2251
2307
// yield(); // yield == delay(0), delay contains yield, auto yield in loop
2252
2308
delay (sleep ); // https://github.com/esp8266/Arduino/issues/2021
0 commit comments