mirror of https://github.com/arendst/Tasmota.git
Initial support for autoexec.bat using filesystem
This commit is contained in:
parent
bad3b30656
commit
68baafc685
|
@ -370,10 +370,10 @@ enum DevGroupShareItem { DGR_SHARE_POWER = 1, DGR_SHARE_LIGHT_BRI = 2, DGR_SHARE
|
||||||
|
|
||||||
enum CommandSource { SRC_IGNORE, SRC_MQTT, SRC_RESTART, SRC_BUTTON, SRC_SWITCH, SRC_BACKLOG, SRC_SERIAL, SRC_WEBGUI, SRC_WEBCOMMAND, SRC_WEBCONSOLE, SRC_PULSETIMER,
|
enum CommandSource { SRC_IGNORE, SRC_MQTT, SRC_RESTART, SRC_BUTTON, SRC_SWITCH, SRC_BACKLOG, SRC_SERIAL, SRC_WEBGUI, SRC_WEBCOMMAND, SRC_WEBCONSOLE, SRC_PULSETIMER,
|
||||||
SRC_TIMER, SRC_RULE, SRC_MAXPOWER, SRC_MAXENERGY, SRC_OVERTEMP, SRC_LIGHT, SRC_KNX, SRC_DISPLAY, SRC_WEMO, SRC_HUE, SRC_RETRY, SRC_REMOTE, SRC_SHUTTER,
|
SRC_TIMER, SRC_RULE, SRC_MAXPOWER, SRC_MAXENERGY, SRC_OVERTEMP, SRC_LIGHT, SRC_KNX, SRC_DISPLAY, SRC_WEMO, SRC_HUE, SRC_RETRY, SRC_REMOTE, SRC_SHUTTER,
|
||||||
SRC_THERMOSTAT, SRC_CHAT, SRC_TCL, SRC_BERRY, SRC_MAX };
|
SRC_THERMOSTAT, SRC_CHAT, SRC_TCL, SRC_BERRY, SRC_AUTOEXEC, SRC_MAX };
|
||||||
const char kCommandSource[] PROGMEM = "I|MQTT|Restart|Button|Switch|Backlog|Serial|WebGui|WebCommand|WebConsole|PulseTimer|"
|
const char kCommandSource[] PROGMEM = "I|MQTT|Restart|Button|Switch|Backlog|Serial|WebGui|WebCommand|WebConsole|PulseTimer|"
|
||||||
"Timer|Rule|MaxPower|MaxEnergy|Overtemp|Light|Knx|Display|Wemo|Hue|Retry|Remote|Shutter|"
|
"Timer|Rule|MaxPower|MaxEnergy|Overtemp|Light|Knx|Display|Wemo|Hue|Retry|Remote|Shutter|"
|
||||||
"Thermostat|Chat|TCL|Berry";
|
"Thermostat|Chat|TCL|Berry|Autoexec";
|
||||||
|
|
||||||
const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 };
|
const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 };
|
||||||
|
|
||||||
|
|
|
@ -261,6 +261,8 @@ const uint16_t LOG_BUFFER_SIZE = 4000; // Max number of characters in lo
|
||||||
#define TASM_FILE_DRIVER "/.drvset%03d"
|
#define TASM_FILE_DRIVER "/.drvset%03d"
|
||||||
#define TASM_FILE_SENSOR "/.snsset%03d"
|
#define TASM_FILE_SENSOR "/.snsset%03d"
|
||||||
#define TASM_FILE_ZIGBEE "/zb" // Zigbee settings blob as used by CC2530 on ESP32
|
#define TASM_FILE_ZIGBEE "/zb" // Zigbee settings blob as used by CC2530 on ESP32
|
||||||
|
#define TASM_FILE_AUTOEXEC "/autoexec.bat" // Commands executed after restart
|
||||||
|
#define TASM_FILE_CONFIG "/config.sys" // Settings executed after restart
|
||||||
|
|
||||||
#ifndef MQTT_MAX_PACKET_SIZE
|
#ifndef MQTT_MAX_PACKET_SIZE
|
||||||
#define MQTT_MAX_PACKET_SIZE 1200 // Bytes
|
#define MQTT_MAX_PACKET_SIZE 1200 // Bytes
|
||||||
|
|
|
@ -501,7 +501,7 @@ void EnergyEverySecond(void)
|
||||||
{
|
{
|
||||||
// Overtemp check
|
// Overtemp check
|
||||||
if (TasmotaGlobal.global_update) {
|
if (TasmotaGlobal.global_update) {
|
||||||
if (TasmotaGlobal.power && !isnan(TasmotaGlobal.temperature_celsius) && (TasmotaGlobal.temperature_celsius > (float)Settings.param[P_OVER_TEMP])) { // Device overtemp, turn off relays
|
if (TasmotaGlobal.power && !isnan(TasmotaGlobal.temperature_celsius) && (TasmotaGlobal.temperature_celsius > (float)Settings.param[P_OVER_TEMP])) { // SetOption42 Device overtemp, turn off relays
|
||||||
|
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: GlobTemp %1_f"), &TasmotaGlobal.temperature_celsius);
|
AddLog(LOG_LEVEL_DEBUG, PSTR("NRG: GlobTemp %1_f"), &TasmotaGlobal.temperature_celsius);
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,11 @@ uint8_t ufs_dir;
|
||||||
// 0 = None, 1 = SD, 2 = ffat, 3 = littlefs
|
// 0 = None, 1 = SD, 2 = ffat, 3 = littlefs
|
||||||
uint8_t ufs_type;
|
uint8_t ufs_type;
|
||||||
uint8_t ffs_type;
|
uint8_t ffs_type;
|
||||||
bool download_busy;
|
|
||||||
|
struct {
|
||||||
|
bool download_busy;
|
||||||
|
bool autoexec = false;
|
||||||
|
} UfsData;
|
||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
|
@ -332,6 +336,45 @@ bool TfsDeleteFile(const char *fname) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************************************\
|
||||||
|
* Autoexec support
|
||||||
|
\*********************************************************************************************/
|
||||||
|
|
||||||
|
void UfsAutoexec(void) {
|
||||||
|
if (!ffs_type) { return; }
|
||||||
|
File file = ffsp->open(TASM_FILE_AUTOEXEC, "r");
|
||||||
|
if (!file) { return; }
|
||||||
|
|
||||||
|
char cmd_line[512];
|
||||||
|
while (file.available()) {
|
||||||
|
uint16_t index = 0;
|
||||||
|
while (file.available()) {
|
||||||
|
uint8_t buf[1];
|
||||||
|
file.read(buf, 1);
|
||||||
|
if ((buf[0] == '\n') || (buf[0] == '\r')) {
|
||||||
|
// Line terminated with linefeed or carriage return
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if ((0 == index) && isspace(buf[0])) {
|
||||||
|
// Skip leading spaces (' ','\t','\n','\v','\f','\r')
|
||||||
|
} else {
|
||||||
|
cmd_line[index] = buf[0];
|
||||||
|
index++;
|
||||||
|
if (index >= sizeof(cmd_line) - 1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((index > 0) && (cmd_line[0] != ';')) { // Information but no comment
|
||||||
|
cmd_line[index] = 0;
|
||||||
|
ExecuteCommand(cmd_line, SRC_AUTOEXEC);
|
||||||
|
}
|
||||||
|
delay(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Commands
|
* Commands
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
@ -396,7 +439,6 @@ void UFSDelete(void) {
|
||||||
* Web support
|
* Web support
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
|
|
||||||
const char UFS_WEB_DIR[] PROGMEM =
|
const char UFS_WEB_DIR[] PROGMEM =
|
||||||
|
@ -654,12 +696,12 @@ uint8_t UfsDownloadFile(char *file) {
|
||||||
#ifdef ESP32_DOWNLOAD_TASK
|
#ifdef ESP32_DOWNLOAD_TASK
|
||||||
download_file.close();
|
download_file.close();
|
||||||
|
|
||||||
if (download_busy == true) {
|
if (UfsData.download_busy == true) {
|
||||||
AddLog(LOG_LEVEL_INFO, PSTR("UFS: Download is busy"));
|
AddLog(LOG_LEVEL_INFO, PSTR("UFS: Download is busy"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
download_busy = true;
|
UfsData.download_busy = true;
|
||||||
char *path = (char*)malloc(128);
|
char *path = (char*)malloc(128);
|
||||||
strcpy(path,file);
|
strcpy(path,file);
|
||||||
xTaskCreatePinnedToCore(donload_task, "DT", 6000, (void*)path, 3, NULL, 1);
|
xTaskCreatePinnedToCore(donload_task, "DT", 6000, (void*)path, 3, NULL, 1);
|
||||||
|
@ -710,7 +752,7 @@ void donload_task(void *path) {
|
||||||
}
|
}
|
||||||
download_file.close();
|
download_file.close();
|
||||||
download_Client.stop();
|
download_Client.stop();
|
||||||
download_busy = false;
|
UfsData.download_busy = false;
|
||||||
vTaskDelete( NULL );
|
vTaskDelete( NULL );
|
||||||
}
|
}
|
||||||
#endif // ESP32_DOWNLOAD_TASK
|
#endif // ESP32_DOWNLOAD_TASK
|
||||||
|
@ -752,6 +794,17 @@ bool Xdrv50(uint8_t function) {
|
||||||
UfsCheckSDCardInit();
|
UfsCheckSDCardInit();
|
||||||
break;
|
break;
|
||||||
#endif // USE_SDCARD
|
#endif // USE_SDCARD
|
||||||
|
case FUNC_EVERY_SECOND:
|
||||||
|
if (UfsData.autoexec) {
|
||||||
|
// Safe to execute autoexec commands here
|
||||||
|
UfsData.autoexec = false;
|
||||||
|
UfsAutoexec();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FUNC_MQTT_INIT:
|
||||||
|
// Do not execute autoexec commands here
|
||||||
|
UfsData.autoexec = true;
|
||||||
|
break;
|
||||||
case FUNC_COMMAND:
|
case FUNC_COMMAND:
|
||||||
result = DecodeCommand(kUFSCommands, kUFSCommand);
|
result = DecodeCommand(kUFSCommands, kUFSCommand);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue