mirror of
https://github.com/letscontrolit/ESPEasy.git
synced 2026-07-28 04:07:47 +00:00
Compare commits
49
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f9d120ff0 | ||
|
|
cc54354ac3 | ||
|
|
3929390629 | ||
|
|
3a26ebf7b1 | ||
|
|
1685bead52 | ||
|
|
3a2fe35e5c | ||
|
|
29ce7f774f | ||
|
|
cc85327356 | ||
|
|
0851bb655e | ||
|
|
d4bc10d8f1 | ||
|
|
0672f32f4b | ||
|
|
a17f7b679c | ||
|
|
425bd85c83 | ||
|
|
3be005e1ee | ||
|
|
174f9e6e03 | ||
|
|
51a14a174f | ||
|
|
7cb1f453d3 | ||
|
|
23a6caab89 | ||
|
|
6b4300bd46 | ||
|
|
04a9069db0 | ||
|
|
dd636903c8 | ||
|
|
940b65e86a | ||
|
|
6344de0649 | ||
|
|
8ccd7c3e8d | ||
|
|
22371649a4 | ||
|
|
2a48d5033e | ||
|
|
f064da797d | ||
|
|
b0b8edf935 | ||
|
|
8cbd9a0822 | ||
|
|
93f9d11738 | ||
|
|
cf3e0a3f0a | ||
|
|
ccfd14dbd3 | ||
|
|
3034738ad4 | ||
|
|
178d1c46a2 | ||
|
|
cdfd1d986e | ||
|
|
4b7aa53692 | ||
|
|
7959a5133f | ||
|
|
941fb5c29c | ||
|
|
c43c9ea2b3 | ||
|
|
967103bcad | ||
|
|
efe637ec70 | ||
|
|
00450eb260 | ||
|
|
cc02fa4481 | ||
|
|
fccc31a7c6 | ||
|
|
b84d905a0b | ||
|
|
94aa951cba | ||
|
|
2a23dcd011 | ||
|
|
ab3a406706 | ||
|
|
f135c63d84 |
Vendored
+87
@@ -1,3 +1,90 @@
|
||||
-------------------------------------------------
|
||||
Changes in release mega-20180327 (since mega-20180326)
|
||||
-------------------------------------------------
|
||||
|
||||
Release date: Tue Mar 27 04:00:09 CEST 2018
|
||||
|
||||
TD-er (1):
|
||||
[issue #1174] Show degree sign via external writes to LCD
|
||||
|
||||
|
||||
-------------------------------------------------
|
||||
Changes in release mega-20180326 (since mega-20180324)
|
||||
-------------------------------------------------
|
||||
|
||||
Release date: Mon Mar 26 04:00:14 CEST 2018
|
||||
|
||||
Bartlomiej Zimon (1):
|
||||
- fix for #1170 - uservar not setted on encwrite
|
||||
|
||||
Brian Setz (1):
|
||||
[P1] Support for latest standard
|
||||
|
||||
TD-er (3):
|
||||
[Command] Parsing improvement for commands
|
||||
[wifi] Event based connect/reconnect
|
||||
[NTP] Speedup NTP again with async WiFi
|
||||
|
||||
|
||||
-------------------------------------------------
|
||||
Changes in release mega-20180324 (since mega-20180323)
|
||||
-------------------------------------------------
|
||||
|
||||
Release date: Sat Mar 24 04:00:10 CET 2018
|
||||
|
||||
TD-er (3):
|
||||
[WiFi] Reverted those temp String uses for ssid/pass
|
||||
[issue #1131] Add %unixtime%
|
||||
[issue #1097] Call MQTTclient.loop() during deepsleep
|
||||
|
||||
|
||||
-------------------------------------------------
|
||||
Changes in release mega-20180323 (since mega-20180322)
|
||||
-------------------------------------------------
|
||||
|
||||
Release date: Fri Mar 23 04:00:06 CET 2018
|
||||
|
||||
mvdbro (1):
|
||||
ESP32 fix
|
||||
|
||||
|
||||
-------------------------------------------------
|
||||
Changes in release mega-20180322 (since mega-20180321)
|
||||
-------------------------------------------------
|
||||
|
||||
Release date: Thu Mar 22 04:00:11 CET 2018
|
||||
|
||||
Bartlomiej Zimon (7):
|
||||
- P012 fix command interpretation
|
||||
- P023 fix command interpretation
|
||||
- P035 move strings to flash
|
||||
- P048 fetch params only when needed
|
||||
- P012 fix command interpretation
|
||||
- P023 fix command interpretation
|
||||
- P048 fetch params only when needed
|
||||
|
||||
ESPEasy release bot (1):
|
||||
automaticly updated release notes for v2.0-20180321
|
||||
|
||||
Gijs Noorlander (1):
|
||||
[merge issue] Forgotten #endif in merge
|
||||
|
||||
TD-er (6):
|
||||
[wifi] Make more robust checks and increase timeout
|
||||
- P035 move strings to flash
|
||||
[wifi] Make more robust checks and increase timeout
|
||||
[Memory] parseTemplate did not check if markers were found
|
||||
[WiFi] Take much more time for initial WiFi connect during setup
|
||||
[WiFi] Take much more time for initial WiFi connect during setup
|
||||
|
||||
Unknown (1):
|
||||
[Memory] parseTemplate did not check if markers were found
|
||||
|
||||
s0170071 (2):
|
||||
Serial WD crash
|
||||
Serial WD crash
|
||||
|
||||
|
||||
-------------------------------------------------
|
||||
Changes in release mega-20180321 (since mega-20180320)
|
||||
-------------------------------------------------
|
||||
|
||||
+304
-126
@@ -38,31 +38,146 @@ bool safeReadStringUntil(Stream &input, String &str, char terminator, unsigned i
|
||||
|
||||
}
|
||||
|
||||
|
||||
#define INPUT_COMMAND_SIZE 80
|
||||
Command commandStringToEnum(const char * cmd) {
|
||||
String tmpcmd;
|
||||
tmpcmd = cmd;
|
||||
tmpcmd.toLowerCase();
|
||||
char cmd_lc[INPUT_COMMAND_SIZE];
|
||||
tmpcmd.toCharArray(cmd_lc, tmpcmd.length() + 1);
|
||||
switch (cmd_lc[0]) {
|
||||
case 'a': {
|
||||
if (strcmp_P(cmd_lc, PSTR("accessinfo") ) == 0) return cmd_accessinfo;
|
||||
break;
|
||||
}
|
||||
case 'b': {
|
||||
if (strcmp_P(cmd_lc, PSTR("background") ) == 0) return cmd_background;
|
||||
else if (strcmp_P(cmd_lc, PSTR("blynkget") ) == 0) return cmd_BlynkGet;
|
||||
else if (strcmp_P(cmd_lc, PSTR("build") ) == 0) return cmd_build;
|
||||
break;
|
||||
}
|
||||
case 'c': {
|
||||
if (strcmp_P(cmd_lc, PSTR("clearaccessblock") ) == 0) return cmd_clearaccessblock;
|
||||
else if (strcmp_P(cmd_lc, PSTR("clearrtcram") ) == 0) return cmd_clearRTCRAM;
|
||||
else if (strcmp_P(cmd_lc, PSTR("config") ) == 0) return cmd_config;
|
||||
break;
|
||||
}
|
||||
case 'd': {
|
||||
if (strcmp_P(cmd_lc, PSTR("debug") ) == 0) return cmd_Debug;
|
||||
else if (strcmp_P(cmd_lc, PSTR("delay") ) == 0) return cmd_Delay;
|
||||
else if (strcmp_P(cmd_lc, PSTR("deepsleep") ) == 0) return cmd_deepSleep;
|
||||
break;
|
||||
}
|
||||
case 'e': {
|
||||
if (strcmp_P(cmd_lc, PSTR("erase") ) == 0) return cmd_Erase;
|
||||
else if (strcmp_P(cmd_lc, PSTR("event") ) == 0) return cmd_Event;
|
||||
else if (strcmp_P(cmd_lc, PSTR("executerules") ) == 0) return cmd_executeRules;
|
||||
break;
|
||||
}
|
||||
case 'i': {
|
||||
if (strcmp_P(cmd_lc, PSTR("i2cscanner") ) == 0) return cmd_i2cscanner;
|
||||
else if (strcmp_P(cmd_lc, PSTR("ip") ) == 0) return cmd_IP;
|
||||
break;
|
||||
}
|
||||
case 'l': {
|
||||
if (strcmp_P(cmd_lc, PSTR("load") ) == 0) return cmd_Load;
|
||||
else if (strcmp_P(cmd_lc, PSTR("lowmem") ) == 0) return cmd_lowmem;
|
||||
break;
|
||||
}
|
||||
case 'm': {
|
||||
if (strcmp_P(cmd_lc, PSTR("malloc") ) == 0) return cmd_malloc;
|
||||
else if (strcmp_P(cmd_lc, PSTR("meminfo") ) == 0) return cmd_meminfo;
|
||||
break;
|
||||
}
|
||||
case 'n': {
|
||||
if (strcmp_P(cmd_lc, PSTR("name") ) == 0) return cmd_Name;
|
||||
else if (strcmp_P(cmd_lc, PSTR("notify") ) == 0) return cmd_notify;
|
||||
else if (strcmp_P(cmd_lc, PSTR("nosleep") ) == 0) return cmd_NoSleep;
|
||||
break;
|
||||
}
|
||||
case 'p': {
|
||||
if (strcmp_P(cmd_lc, PSTR("password") ) == 0) return cmd_Password;
|
||||
else if (strcmp_P(cmd_lc, PSTR("publish") ) == 0) return cmd_Publish;
|
||||
break;
|
||||
}
|
||||
case 'r': {
|
||||
if (strcmp_P(cmd_lc, PSTR("reboot") ) == 0) return cmd_Reboot;
|
||||
else if (strcmp_P(cmd_lc, PSTR("reset") ) == 0) return cmd_Reset;
|
||||
else if (strcmp_P(cmd_lc, PSTR("restart") ) == 0) return cmd_Restart;
|
||||
else if (strcmp_P(cmd_lc, PSTR("resetflashwritecounter")) == 0) return cmd_resetFlashWriteCounter;
|
||||
else if (strcmp_P(cmd_lc, PSTR("rules") ) == 0) return cmd_Rules;
|
||||
break;
|
||||
}
|
||||
case 's': {
|
||||
if (strcmp_P(cmd_lc, PSTR("sdcard") ) == 0) return cmd_sdcard;
|
||||
else if (strcmp_P(cmd_lc, PSTR("sdremove") ) == 0) return cmd_sdremove;
|
||||
else if (strcmp_P(cmd_lc, PSTR("sysload") ) == 0) return cmd_sysload;
|
||||
else if (strcmp_P(cmd_lc, PSTR("save") ) == 0) return cmd_Save;
|
||||
else if (strcmp_P(cmd_lc, PSTR("sendto") ) == 0) return cmd_SendTo;
|
||||
else if (strcmp_P(cmd_lc, PSTR("sendtohttp") ) == 0) return cmd_SendToHTTP;
|
||||
else if (strcmp_P(cmd_lc, PSTR("sendtoudp") ) == 0) return cmd_SendToUDP;
|
||||
else if (strcmp_P(cmd_lc, PSTR("serialfloat") ) == 0) return cmd_SerialFloat;
|
||||
else if (strcmp_P(cmd_lc, PSTR("settings") ) == 0) return cmd_Settings;
|
||||
break;
|
||||
}
|
||||
case 't': {
|
||||
if (strcmp_P(cmd_lc, PSTR("taskclear") ) == 0) return cmd_TaskClear;
|
||||
else if (strcmp_P(cmd_lc, PSTR("taskclearall") ) == 0) return cmd_TaskClearAll;
|
||||
else if (strcmp_P(cmd_lc, PSTR("taskrun") ) == 0) return cmd_TaskRun;
|
||||
else if (strcmp_P(cmd_lc, PSTR("taskvalueset") ) == 0) return cmd_TaskValueSet;
|
||||
else if (strcmp_P(cmd_lc, PSTR("timerset") ) == 0) return cmd_TimerSet;
|
||||
break;
|
||||
}
|
||||
case 'u': {
|
||||
if (strcmp_P(cmd_lc, PSTR("udptest") ) == 0) return cmd_udptest;
|
||||
else if (strcmp_P(cmd_lc, PSTR("unit") ) == 0) return cmd_Unit;
|
||||
break;
|
||||
}
|
||||
case 'w': {
|
||||
if (strcmp_P(cmd_lc, PSTR("wdconfig") ) == 0) return cmd_wdconfig;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wdread") ) == 0) return cmd_wdread;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wifiapmode") ) == 0) return cmd_WifiAPMode;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wificonnect") ) == 0) return cmd_WifiConnect;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wifidisconnect") ) == 0) return cmd_WifiDisconnect;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wifikey2") ) == 0) return cmd_WifiKey2;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wifikey") ) == 0) return cmd_WifiKey;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wifissid2") ) == 0) return cmd_WifiSSID2;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wifissid") ) == 0) return cmd_WifiSSID;
|
||||
else if (strcmp_P(cmd_lc, PSTR("wifiscan") ) == 0) return cmd_WifiScan;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return cmd_Unknown;
|
||||
}
|
||||
return cmd_Unknown;
|
||||
}
|
||||
|
||||
void ExecuteCommand(byte source, const char *Line)
|
||||
{
|
||||
checkRAM(F("ExecuteCommand"));
|
||||
String status = "";
|
||||
boolean success = false;
|
||||
char TmpStr1[80];
|
||||
char TmpStr1[INPUT_COMMAND_SIZE];
|
||||
TmpStr1[0] = 0;
|
||||
char Command[80];
|
||||
Command[0] = 0;
|
||||
char cmd[INPUT_COMMAND_SIZE];
|
||||
cmd[0] = 0;
|
||||
int Par1 = 0;
|
||||
int Par2 = 0;
|
||||
int Par3 = 0;
|
||||
|
||||
GetArgv(Line, Command, 1);
|
||||
GetArgv(Line, cmd, 1);
|
||||
if (GetArgv(Line, TmpStr1, 2)) Par1 = str2int(TmpStr1);
|
||||
if (GetArgv(Line, TmpStr1, 3)) Par2 = str2int(TmpStr1);
|
||||
if (GetArgv(Line, TmpStr1, 4)) Par3 = str2int(TmpStr1);
|
||||
|
||||
const Command cmd_enum = commandStringToEnum(cmd);
|
||||
switch (cmd_enum) {
|
||||
|
||||
// ****************************************
|
||||
// commands for debugging
|
||||
// ****************************************
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("background")) == 0)
|
||||
case cmd_background:
|
||||
{
|
||||
success = true;
|
||||
unsigned long timer = millis() + Par1;
|
||||
@@ -70,9 +185,10 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
while (!timeOutReached(timer))
|
||||
backgroundtasks();
|
||||
Serial.println("end");
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("executeRules")) == 0)
|
||||
case cmd_executeRules:
|
||||
{
|
||||
success = true;
|
||||
if (GetArgv(Line, TmpStr1, 2))
|
||||
@@ -81,15 +197,17 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
String event = "";
|
||||
rulesProcessingFile(fileName, event);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("clearRTCRAM")) == 0)
|
||||
case cmd_clearRTCRAM:
|
||||
{
|
||||
success = true;
|
||||
initRTC();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("notify")) == 0)
|
||||
case cmd_notify:
|
||||
{
|
||||
success = true;
|
||||
String message = "";
|
||||
@@ -110,15 +228,17 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("resetFlashWriteCounter")) == 0)
|
||||
case cmd_resetFlashWriteCounter:
|
||||
{
|
||||
success = true;
|
||||
RTC.flashDayCounter = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("udptest")) == 0)
|
||||
case cmd_udptest:
|
||||
{
|
||||
success = true;
|
||||
for (byte x = 0; x < Par2; x++)
|
||||
@@ -127,18 +247,20 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
event += x;
|
||||
SendUDPCommand(Par1, (char*)event.c_str(), event.length());
|
||||
}
|
||||
break;
|
||||
}
|
||||
#ifdef FEATURE_SD
|
||||
if (strcasecmp_P(Command, PSTR("sdcard")) == 0)
|
||||
case cmd_sdcard:
|
||||
{
|
||||
success = true;
|
||||
File root = SD.open("/");
|
||||
root.rewindDirectory();
|
||||
printDirectory(root, 0);
|
||||
root.close();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("sdremove")) == 0)
|
||||
case cmd_sdremove:
|
||||
{
|
||||
success = true;
|
||||
String fname = Line;
|
||||
@@ -146,56 +268,63 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
Serial.print(F("Removing:"));
|
||||
Serial.println(fname.c_str());
|
||||
SD.remove((char*)fname.c_str());
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("lowmem")) == 0)
|
||||
case cmd_lowmem:
|
||||
{
|
||||
Serial.print(lowestRAM);
|
||||
Serial.print(F(" : "));
|
||||
Serial.println(lowestRAMfunction);
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("malloc")) == 0)
|
||||
case cmd_malloc:
|
||||
{
|
||||
ramtest = (char *)malloc(Par1);
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("sysload")) == 0)
|
||||
case cmd_sysload:
|
||||
{
|
||||
success = true;
|
||||
Serial.print(100 - (100 * loopCounterLast / loopCounterMax));
|
||||
Serial.print(F("% (LC="));
|
||||
Serial.print(int(loopCounterLast / 30));
|
||||
Serial.println(F(")"));
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("SerialFloat")) == 0)
|
||||
case cmd_SerialFloat:
|
||||
{
|
||||
success = true;
|
||||
pinMode(1, INPUT);
|
||||
pinMode(3, INPUT);
|
||||
delay(60000);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("accessinfo")) == 0)
|
||||
case cmd_accessinfo:
|
||||
{
|
||||
success = true;
|
||||
Serial.print(F("Allowed IP range : "));
|
||||
Serial.println(describeAllowedIPrange());
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("clearaccessblock")) == 0)
|
||||
case cmd_clearaccessblock:
|
||||
{
|
||||
success = true;
|
||||
clearAccessBlock();
|
||||
Serial.print(F("Allowed IP range : "));
|
||||
Serial.println(describeAllowedIPrange());
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("meminfo")) == 0)
|
||||
case cmd_meminfo:
|
||||
{
|
||||
success = true;
|
||||
Serial.print(F("SecurityStruct : "));
|
||||
@@ -206,32 +335,36 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
Serial.println(sizeof(ExtraTaskSettings));
|
||||
Serial.print(F("DeviceStruct: "));
|
||||
Serial.println(sizeof(Device));
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("TaskClear")) == 0)
|
||||
case cmd_TaskClear:
|
||||
{
|
||||
success = true;
|
||||
taskClear(Par1 - 1, true);
|
||||
break;
|
||||
}
|
||||
|
||||
//quickly clear all tasks, without saving (used by test suite)
|
||||
if (strcasecmp_P(Command, PSTR("TaskClearAll")) == 0)
|
||||
case cmd_TaskClearAll:
|
||||
{
|
||||
success = true;
|
||||
for (byte t=0; t<TASKS_MAX; t++)
|
||||
taskClear(t, false);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("wdconfig")) == 0)
|
||||
case cmd_wdconfig:
|
||||
{
|
||||
success = true;
|
||||
Wire.beginTransmission(Par1); // address
|
||||
Wire.write(Par2); // command
|
||||
Wire.write(Par3); // data
|
||||
Wire.endTransmission();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("wdread")) == 0)
|
||||
case cmd_wdread:
|
||||
{
|
||||
success = true;
|
||||
Wire.beginTransmission(Par1); // address
|
||||
@@ -245,22 +378,25 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
status = F("Reg value: ");
|
||||
status += value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("build")) == 0)
|
||||
case cmd_build:
|
||||
{
|
||||
success = true;
|
||||
Settings.Build = Par1;
|
||||
SaveSettings();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("NoSleep")) == 0)
|
||||
case cmd_NoSleep:
|
||||
{
|
||||
success = true;
|
||||
Settings.deepSleep = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("i2cscanner")) == 0)
|
||||
case cmd_i2cscanner:
|
||||
{
|
||||
success = true;
|
||||
|
||||
@@ -280,28 +416,31 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
Serial.println(String(address, HEX));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// ****************************************
|
||||
// commands for rules
|
||||
// ****************************************
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("config")) == 0)
|
||||
case cmd_config:
|
||||
{
|
||||
success = true;
|
||||
struct EventStruct TempEvent;
|
||||
String request = Line;
|
||||
remoteConfig(&TempEvent, request);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("deepSleep")) == 0)
|
||||
case cmd_deepSleep:
|
||||
{
|
||||
success = true;
|
||||
if (Par1 > 0)
|
||||
deepSleepStart(Par1); // call the second part of the function to avoid check and enable one-shot operation
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("TaskValueSet")) == 0)
|
||||
case cmd_TaskValueSet:
|
||||
{
|
||||
success = true;
|
||||
if (GetArgv(Line, TmpStr1, 4))
|
||||
@@ -310,15 +449,17 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
Calculate(TmpStr1, &result);
|
||||
UserVar[(VARS_PER_TASK * (Par1 - 1)) + Par2 - 1] = result;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("TaskRun")) == 0)
|
||||
case cmd_TaskRun:
|
||||
{
|
||||
success = true;
|
||||
SensorSendTask(Par1 - 1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("TimerSet")) == 0)
|
||||
case cmd_TimerSet:
|
||||
{
|
||||
if (Par1>=1 && Par1<=RULES_TIMER_MAX)
|
||||
{
|
||||
@@ -334,24 +475,27 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
{
|
||||
addLog(LOG_LEVEL_ERROR, F("TIMER: invalid timer number"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Delay")) == 0)
|
||||
case cmd_Delay:
|
||||
{
|
||||
success = true;
|
||||
delayBackground(Par1);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Rules")) == 0)
|
||||
case cmd_Rules:
|
||||
{
|
||||
success = true;
|
||||
if (Par1 == 1)
|
||||
Settings.UseRules = true;
|
||||
else
|
||||
Settings.UseRules = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Event")) == 0)
|
||||
case cmd_Event:
|
||||
{
|
||||
success = true;
|
||||
String event = Line;
|
||||
@@ -359,9 +503,10 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
event.replace("$", "#");
|
||||
if (Settings.UseRules)
|
||||
rulesProcessing(event);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("SendTo")) == 0)
|
||||
case cmd_SendTo:
|
||||
{
|
||||
success = true;
|
||||
String event = Line;
|
||||
@@ -372,78 +517,88 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
event = event.substring(index + 1);
|
||||
SendUDPCommand(Par1, (char*)event.c_str(), event.length());
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (strcasecmp_P(Command, PSTR("Publish")) == 0 && WiFi.status() == WL_CONNECTED)
|
||||
case cmd_Publish:
|
||||
{
|
||||
// ToDo TD-er: Not sure about this function, but at least it sends to an existing MQTTclient
|
||||
int enabledMqttController = firstEnabledMQTTController();
|
||||
if (enabledMqttController >= 0) {
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
// ToDo TD-er: Not sure about this function, but at least it sends to an existing MQTTclient
|
||||
int enabledMqttController = firstEnabledMQTTController();
|
||||
if (enabledMqttController >= 0) {
|
||||
success = true;
|
||||
String event = Line;
|
||||
event = event.substring(8);
|
||||
int index = event.indexOf(',');
|
||||
if (index > 0)
|
||||
{
|
||||
String topic = event.substring(0, index);
|
||||
String value = event.substring(index + 1);
|
||||
MQTTpublish(enabledMqttController, topic.c_str(), value.c_str(), Settings.MQTTRetainFlag);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case cmd_SendToUDP:
|
||||
{
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
success = true;
|
||||
String event = Line;
|
||||
event = event.substring(8);
|
||||
int index = event.indexOf(',');
|
||||
if (index > 0)
|
||||
String strLine = Line;
|
||||
String ip = parseString(strLine, 2);
|
||||
String port = parseString(strLine, 3);
|
||||
int msgpos = getParamStartPos(strLine, 4);
|
||||
String message = strLine.substring(msgpos);
|
||||
IPAddress UDP_IP;
|
||||
if(UDP_IP.fromString(ip)) {
|
||||
portUDP.beginPacket(UDP_IP, port.toInt());
|
||||
#if defined(ESP8266)
|
||||
portUDP.write(message.c_str(), message.length());
|
||||
#endif
|
||||
#if defined(ESP32)
|
||||
portUDP.write((uint8_t*)message.c_str(), message.length());
|
||||
#endif
|
||||
portUDP.endPacket();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case cmd_SendToHTTP:
|
||||
{
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
success = true;
|
||||
String strLine = Line;
|
||||
String host = parseString(strLine, 2);
|
||||
String port = parseString(strLine, 3);
|
||||
int pathpos = getParamStartPos(strLine, 4);
|
||||
String path = strLine.substring(pathpos);
|
||||
WiFiClient client;
|
||||
if (client.connect(host.c_str(), port.toInt()))
|
||||
{
|
||||
String topic = event.substring(0, index);
|
||||
String value = event.substring(index + 1);
|
||||
MQTTpublish(enabledMqttController, topic.c_str(), value.c_str(), Settings.MQTTRetainFlag);
|
||||
client.print(String("GET ") + path + " HTTP/1.1\r\n" +
|
||||
"Host: " + host + "\r\n" +
|
||||
"Connection: close\r\n\r\n");
|
||||
|
||||
unsigned long timer = millis() + 200;
|
||||
while (!client.available() && !timeOutReached(timer))
|
||||
delay(1);
|
||||
|
||||
while (client.available()) {
|
||||
// String line = client.readStringUntil('\n');
|
||||
String line;
|
||||
safeReadStringUntil(client, line, '\n');
|
||||
|
||||
|
||||
if (line.substring(0, 15) == F("HTTP/1.1 200 OK"))
|
||||
addLog(LOG_LEVEL_DEBUG, line);
|
||||
delay(1);
|
||||
}
|
||||
client.flush();
|
||||
client.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("SendToUDP")) == 0 && WiFi.status() == WL_CONNECTED)
|
||||
{
|
||||
success = true;
|
||||
String strLine = Line;
|
||||
String ip = parseString(strLine, 2);
|
||||
String port = parseString(strLine, 3);
|
||||
int msgpos = getParamStartPos(strLine, 4);
|
||||
String message = strLine.substring(msgpos);
|
||||
IPAddress UDP_IP;
|
||||
if(UDP_IP.fromString(ip)) {
|
||||
portUDP.beginPacket(UDP_IP, port.toInt());
|
||||
#if defined(ESP8266)
|
||||
portUDP.write(message.c_str(), message.length());
|
||||
#endif
|
||||
#if defined(ESP32)
|
||||
portUDP.write((uint8_t*)message.c_str(), message.length());
|
||||
#endif
|
||||
portUDP.endPacket();
|
||||
}
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("SendToHTTP")) == 0 && WiFi.status() == WL_CONNECTED)
|
||||
{
|
||||
success = true;
|
||||
String strLine = Line;
|
||||
String host = parseString(strLine, 2);
|
||||
String port = parseString(strLine, 3);
|
||||
int pathpos = getParamStartPos(strLine, 4);
|
||||
String path = strLine.substring(pathpos);
|
||||
WiFiClient client;
|
||||
if (client.connect(host.c_str(), port.toInt()))
|
||||
{
|
||||
client.print(String("GET ") + path + " HTTP/1.1\r\n" +
|
||||
"Host: " + host + "\r\n" +
|
||||
"Connection: close\r\n\r\n");
|
||||
|
||||
unsigned long timer = millis() + 200;
|
||||
while (!client.available() && !timeOutReached(timer))
|
||||
delay(1);
|
||||
|
||||
while (client.available()) {
|
||||
// String line = client.readStringUntil('\n');
|
||||
String line;
|
||||
safeReadStringUntil(client, line, '\n');
|
||||
|
||||
|
||||
if (line.substring(0, 15) == F("HTTP/1.1 200 OK"))
|
||||
addLog(LOG_LEVEL_DEBUG, line);
|
||||
delay(1);
|
||||
}
|
||||
client.flush();
|
||||
client.stop();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// ****************************************
|
||||
@@ -452,7 +607,7 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
|
||||
#ifdef CPLUGIN_012
|
||||
//FIXME: this should go to PLUGIN_WRITE in _C012.ino
|
||||
if (strcasecmp_P(Command, PSTR("BlynkGet")) == 0)
|
||||
case cmd_BlynkGet:
|
||||
{
|
||||
byte first_enabled_blynk_controller = firstEnabledBlynkController();
|
||||
if (first_enabled_blynk_controller == -1) {
|
||||
@@ -481,80 +636,91 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
// ****************************************
|
||||
// configure settings commands
|
||||
// ****************************************
|
||||
if (strcasecmp_P(Command, PSTR("WifiSSID")) == 0)
|
||||
case cmd_WifiSSID:
|
||||
{
|
||||
success = true;
|
||||
strcpy(SecuritySettings.WifiSSID, Line + 9);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("WifiKey")) == 0)
|
||||
case cmd_WifiKey:
|
||||
{
|
||||
success = true;
|
||||
strcpy(SecuritySettings.WifiKey, Line + 8);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("WifiSSID2")) == 0)
|
||||
case cmd_WifiSSID2:
|
||||
{
|
||||
success = true;
|
||||
strcpy(SecuritySettings.WifiSSID2, Line + 10);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("WifiKey2")) == 0)
|
||||
case cmd_WifiKey2:
|
||||
{
|
||||
success = true;
|
||||
strcpy(SecuritySettings.WifiKey2, Line + 9);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("WifiScan")) == 0)
|
||||
case cmd_WifiScan:
|
||||
{
|
||||
success = true;
|
||||
WifiScan();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("WifiConnect")) == 0)
|
||||
case cmd_WifiConnect:
|
||||
{
|
||||
success = true;
|
||||
WifiConnect(1);
|
||||
WiFiConnectRelaxed();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("WifiDisconnect")) == 0)
|
||||
case cmd_WifiDisconnect:
|
||||
{
|
||||
success = true;
|
||||
WifiDisconnect();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("WifiAPMode")) == 0)
|
||||
case cmd_WifiAPMode:
|
||||
{
|
||||
WifiAPMode(true);
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Unit")) == 0)
|
||||
case cmd_Unit:
|
||||
{
|
||||
success = true;
|
||||
Settings.Unit=Par1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Name")) == 0)
|
||||
case cmd_Name:
|
||||
{
|
||||
success = true;
|
||||
strcpy(Settings.Name, Line + 5);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Password")) == 0)
|
||||
case cmd_Password:
|
||||
{
|
||||
success = true;
|
||||
strcpy(SecuritySettings.Password, Line + 9);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Reboot")) == 0)
|
||||
case cmd_Reboot:
|
||||
{
|
||||
success = true;
|
||||
pinMode(0, INPUT);
|
||||
@@ -566,22 +732,26 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
#if defined(ESP32)
|
||||
ESP.restart();
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Restart")) == 0)
|
||||
case cmd_Restart:
|
||||
{
|
||||
success = true;
|
||||
ESP.restart();
|
||||
break;
|
||||
}
|
||||
if (strcasecmp_P(Command, PSTR("Erase")) == 0)
|
||||
|
||||
case cmd_Erase:
|
||||
{
|
||||
success = true;
|
||||
WiFi.persistent(true); // use SDK storage of SSID/WPA parameters
|
||||
WiFi.disconnect(); // this will store empty ssid/wpa into sdk storage
|
||||
WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Reset")) == 0)
|
||||
case cmd_Reset:
|
||||
{
|
||||
success = true;
|
||||
ResetFactory();
|
||||
@@ -591,37 +761,41 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
#if defined(ESP32)
|
||||
ESP.restart();
|
||||
#endif
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Save")) == 0)
|
||||
case cmd_Save:
|
||||
{
|
||||
success = true;
|
||||
SaveSettings();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Load")) == 0)
|
||||
case cmd_Load:
|
||||
{
|
||||
success = true;
|
||||
LoadSettings();
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Debug")) == 0)
|
||||
case cmd_Debug:
|
||||
{
|
||||
success = true;
|
||||
Settings.SerialLogLevel = Par1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("IP")) == 0)
|
||||
case cmd_IP:
|
||||
{
|
||||
success = true;
|
||||
if (GetArgv(Line, TmpStr1, 2)) {
|
||||
if (!str2ip(TmpStr1, Settings.IP))
|
||||
Serial.println("?");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcasecmp_P(Command, PSTR("Settings")) == 0)
|
||||
case cmd_Settings:
|
||||
{
|
||||
success = true;
|
||||
char str[20];
|
||||
@@ -639,6 +813,10 @@ void ExecuteCommand(byte source, const char *Line)
|
||||
Serial.print(F(" WifiSSID2 : ")); Serial.println(SecuritySettings.WifiSSID2);
|
||||
Serial.print(F(" WifiKey2 : ")); Serial.println(SecuritySettings.WifiKey2);
|
||||
Serial.print(F(" Free mem : ")); Serial.println(FreeMem());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
success = false;
|
||||
}
|
||||
|
||||
yield();
|
||||
|
||||
+3
-1
@@ -183,10 +183,12 @@ bool MQTTConnect(int controller_idx)
|
||||
\*********************************************************************************************/
|
||||
bool MQTTCheck(int controller_idx)
|
||||
{
|
||||
if (!WiFiConnected(10))
|
||||
return false;
|
||||
byte ProtocolIndex = getProtocolIndex(Settings.Protocol[controller_idx]);
|
||||
if (Protocol[ProtocolIndex].usesMQTT)
|
||||
{
|
||||
if (MQTTclient_should_reconnect || !WiFiConnected(10) || !MQTTclient.connected())
|
||||
if (MQTTclient_should_reconnect || !MQTTclient.connected())
|
||||
{
|
||||
if (MQTTclient_should_reconnect) {
|
||||
addLog(LOG_LEVEL_ERROR, F("MQTT : Intentional reconnect"));
|
||||
|
||||
+35
-1
@@ -84,6 +84,14 @@ String minutesToDayHour(int minutes) {
|
||||
return TimeString;
|
||||
}
|
||||
|
||||
String minutesToHourMinute(int minutes) {
|
||||
int hours = (minutes % 1440) / 60;
|
||||
int mins = (minutes % 1440) % 60;
|
||||
char TimeString[20];
|
||||
sprintf_P(TimeString, PSTR("%d%c%02d%c"), hours, 'h', mins, 'm');
|
||||
return TimeString;
|
||||
}
|
||||
|
||||
String minutesToDayHourMinute(int minutes) {
|
||||
int days = minutes / 1440;
|
||||
int hours = (minutes % 1440) / 60;
|
||||
@@ -104,7 +112,33 @@ String secondsToDayHourMinuteSecond(int seconds) {
|
||||
return TimeString;
|
||||
}
|
||||
|
||||
|
||||
String format_msec_duration(long duration) {
|
||||
String result;
|
||||
if (duration < 0) {
|
||||
result = "-";
|
||||
duration = -1 * duration;
|
||||
}
|
||||
if (duration < 10000) {
|
||||
result += duration;
|
||||
result += F(" ms");
|
||||
return result;
|
||||
}
|
||||
duration /= 1000;
|
||||
if (duration < 3600) {
|
||||
int sec = duration % 60;
|
||||
int minutes = duration / 60;
|
||||
if (minutes > 0) {
|
||||
result += minutes;
|
||||
result += F(" m ");
|
||||
}
|
||||
result += sec;
|
||||
result += F(" s");
|
||||
return result;
|
||||
}
|
||||
duration /= 60;
|
||||
if (duration < 1440) return minutesToHourMinute(duration);
|
||||
return minutesToDayHourMinute(duration);
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************************************\
|
||||
|
||||
+87
-2
@@ -32,6 +32,8 @@
|
||||
#define DEFAULT_IPRANGE_HIGH "255.255.255.255" // Allowed IP range to access webserver
|
||||
#define DEFAULT_IP_BLOCK_LEVEL 1 // 0: ALL_ALLOWED 1: LOCAL_SUBNET_ALLOWED 2: ONLY_IP_RANGE_ALLOWED
|
||||
|
||||
#define DEFAULT_WIFI_CONNECTION_TIMEOUT 10000 // minimum timeout in ms for WiFi to be connected.
|
||||
|
||||
// --- Default Controller ------------------------------------------------------------------------------
|
||||
#define DEFAULT_CONTROLLER false // true or false enabled or disabled, set 1st controller defaults
|
||||
// using a default template, you also need to set a DEFAULT PROTOCOL to a suitable MQTT protocol !
|
||||
@@ -432,6 +434,14 @@ using namespace fs;
|
||||
ADC_MODE(ADC_VCC);
|
||||
#endif
|
||||
|
||||
#define ESPEASY_WIFI_DISCONNECTED 0
|
||||
#define ESPEASY_WIFI_CONNECTED 1
|
||||
#define ESPEASY_WIFI_GOT_IP 2
|
||||
#define ESPEASY_WIFI_SERVICES_INITIALIZED 3
|
||||
|
||||
WiFiEventHandler stationConnectedHandler;
|
||||
WiFiEventHandler stationDisconnectedHandler;
|
||||
WiFiEventHandler stationGotIpHandler;
|
||||
|
||||
// Setup DNS, only used if the ESP has no valid WiFi config
|
||||
const byte DNS_PORT = 53;
|
||||
@@ -459,7 +469,68 @@ struct CRCStruct{
|
||||
uint32_t numberOfCRCBytes=0;
|
||||
}CRCValues;
|
||||
|
||||
enum Command {
|
||||
cmd_Unknown,
|
||||
cmd_accessinfo,
|
||||
cmd_background,
|
||||
cmd_BlynkGet,
|
||||
cmd_build,
|
||||
cmd_clearaccessblock,
|
||||
cmd_clearRTCRAM,
|
||||
cmd_config,
|
||||
cmd_Debug,
|
||||
cmd_Delay,
|
||||
cmd_deepSleep,
|
||||
cmd_Erase,
|
||||
cmd_Event,
|
||||
cmd_executeRules,
|
||||
cmd_i2cscanner,
|
||||
cmd_IP,
|
||||
cmd_Load,
|
||||
cmd_lowmem,
|
||||
cmd_malloc,
|
||||
cmd_meminfo,
|
||||
cmd_Name,
|
||||
cmd_notify,
|
||||
cmd_NoSleep,
|
||||
cmd_Password,
|
||||
cmd_Publish,
|
||||
cmd_Reboot,
|
||||
cmd_Reset,
|
||||
cmd_Restart,
|
||||
cmd_resetFlashWriteCounter,
|
||||
cmd_Rules,
|
||||
cmd_sdcard,
|
||||
cmd_sdremove,
|
||||
cmd_sysload,
|
||||
cmd_Save,
|
||||
cmd_SendTo,
|
||||
cmd_SendToHTTP,
|
||||
cmd_SendToUDP,
|
||||
cmd_SerialFloat,
|
||||
cmd_Settings,
|
||||
cmd_TaskClear,
|
||||
cmd_TaskClearAll,
|
||||
cmd_TaskRun,
|
||||
cmd_TaskValueSet,
|
||||
cmd_TimerSet,
|
||||
cmd_udptest,
|
||||
cmd_Unit,
|
||||
cmd_wdconfig,
|
||||
cmd_wdread,
|
||||
cmd_WifiAPMode,
|
||||
cmd_WifiConnect,
|
||||
cmd_WifiDisconnect,
|
||||
cmd_WifiKey2,
|
||||
cmd_WifiKey,
|
||||
cmd_WifiSSID2,
|
||||
cmd_WifiSSID,
|
||||
cmd_WifiScan
|
||||
};
|
||||
|
||||
|
||||
// Forward declarations.
|
||||
Command commandStringToEnum(const char * cmd);
|
||||
bool WiFiConnected(uint32_t timeout_ms);
|
||||
bool hostReachable(const IPAddress& ip);
|
||||
bool hostReachable(const String& hostname);
|
||||
@@ -1043,14 +1114,28 @@ String dummyString = "";
|
||||
|
||||
byte lastBootCause = BOOT_CAUSE_MANUAL_REBOOT;
|
||||
|
||||
// WiFi related data
|
||||
boolean wifiSetup = false;
|
||||
boolean wifiSetupConnect = false;
|
||||
uint8_t lastBSSID[6] = {0};
|
||||
boolean wifiConnected = false;
|
||||
unsigned long wifi_connect_timer = 0;
|
||||
uint8_t wifiStatus = ESPEASY_WIFI_DISCONNECTED;
|
||||
unsigned long last_wifi_connect_attempt_moment = 0;
|
||||
unsigned int wifi_connect_attempt = 0;
|
||||
uint8_t lastWiFiSettings = 0;
|
||||
String last_ssid;
|
||||
bool bssid_changed = false;
|
||||
uint8 last_channel = 0;
|
||||
WiFiDisconnectReason lastDisconnectReason = WIFI_DISCONNECT_REASON_UNSPECIFIED;
|
||||
unsigned long lastConnectMoment = 0;
|
||||
unsigned long lastDisconnectMoment = 0;
|
||||
unsigned long lastGetIPmoment = 0;
|
||||
unsigned long lastConnectedDuration = 0;
|
||||
bool intent_to_reboot = false;
|
||||
|
||||
// Semaphore like booleans for processing data gathered from WiFi events.
|
||||
bool processedConnect = true;
|
||||
bool processedDisconnect = true;
|
||||
bool processedGetIP = true;
|
||||
|
||||
|
||||
unsigned long start = 0;
|
||||
|
||||
+33
-30
@@ -108,6 +108,10 @@ void setup()
|
||||
|
||||
initLog();
|
||||
|
||||
// WiFi event handlers
|
||||
stationConnectedHandler = WiFi.onStationModeConnected(onConnected);
|
||||
stationDisconnectedHandler = WiFi.onStationModeDisconnected(onDisconnect);
|
||||
stationGotIpHandler = WiFi.onStationModeGotIP(onGotIP);
|
||||
|
||||
if (SpiffsSectors() < 32)
|
||||
{
|
||||
@@ -226,20 +230,7 @@ void setup()
|
||||
WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
|
||||
WifiAPconfig();
|
||||
|
||||
if (Settings.deepSleep)
|
||||
{
|
||||
//only one attempt in deepsleep, to conserve battery
|
||||
if (!WifiConnect(1))
|
||||
{
|
||||
if (Settings.deepSleepOnFail)
|
||||
{
|
||||
addLog(LOG_LEVEL_ERROR, F("SLEEP: Connection failed, going back to sleep."));
|
||||
deepSleep(Settings.Delay);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
WiFiConnectRelaxed();
|
||||
WiFiConnectRelaxed();
|
||||
|
||||
#ifdef FEATURE_REPORTING
|
||||
ReportStatus();
|
||||
@@ -307,9 +298,14 @@ void loop()
|
||||
if (wifiSetupConnect)
|
||||
{
|
||||
// try to connect for setup wizard
|
||||
WifiConnect(1);
|
||||
WiFiConnectRelaxed();
|
||||
wifiSetupConnect = false;
|
||||
}
|
||||
if (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
if (wifiStatus >= ESPEASY_WIFI_CONNECTED) processConnect();
|
||||
if (wifiStatus >= ESPEASY_WIFI_GOT_IP) processGotIP();
|
||||
if (wifiStatus == ESPEASY_WIFI_DISCONNECTED) processDisconnect();
|
||||
}
|
||||
|
||||
// Deep sleep mode, just run all tasks one time and go back to sleep as fast as possible
|
||||
if (firstLoop && isDeepSleepEnabled())
|
||||
@@ -326,6 +322,7 @@ void loop()
|
||||
run10TimesPerSecond();
|
||||
runEach30Seconds();
|
||||
runOncePerSecond();
|
||||
runPeriodicalMQTT();
|
||||
}
|
||||
//normal mode, run each task when its time
|
||||
else
|
||||
@@ -344,21 +341,7 @@ void loop()
|
||||
runOncePerSecond();
|
||||
|
||||
if (timeOutReached(timermqtt)) {
|
||||
// MQTT_KEEPALIVE = 15 seconds.
|
||||
timermqtt = millis() + timermqtt_interval;
|
||||
//dont do this in backgroundtasks(), otherwise causes crashes. (https://github.com/letscontrolit/ESPEasy/issues/683)
|
||||
int enabledMqttController = firstEnabledMQTTController();
|
||||
if (enabledMqttController >= 0) {
|
||||
if (!MQTTclient.loop()) {
|
||||
if (!MQTTCheck(enabledMqttController)) {
|
||||
// Check failed, no need to retry it immediately.
|
||||
if (timermqtt_interval < 2000)
|
||||
timermqtt_interval += 250;
|
||||
} else {
|
||||
timermqtt_interval = 250;
|
||||
}
|
||||
}
|
||||
}
|
||||
runPeriodicalMQTT();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -370,6 +353,8 @@ void loop()
|
||||
String event = F("System#Sleep");
|
||||
rulesProcessing(event);
|
||||
}
|
||||
// Flush outstanding MQTT messages
|
||||
runPeriodicalMQTT();
|
||||
|
||||
deepSleep(Settings.Delay);
|
||||
//deepsleep will never return, its a special kind of reboot
|
||||
@@ -378,6 +363,24 @@ void loop()
|
||||
}
|
||||
|
||||
|
||||
void runPeriodicalMQTT() {
|
||||
// MQTT_KEEPALIVE = 15 seconds.
|
||||
timermqtt = millis() + timermqtt_interval;
|
||||
//dont do this in backgroundtasks(), otherwise causes crashes. (https://github.com/letscontrolit/ESPEasy/issues/683)
|
||||
int enabledMqttController = firstEnabledMQTTController();
|
||||
if (enabledMqttController >= 0) {
|
||||
if (!MQTTclient.loop()) {
|
||||
if (!MQTTCheck(enabledMqttController)) {
|
||||
// Check failed, no need to retry it immediately.
|
||||
if (timermqtt_interval < 2000)
|
||||
timermqtt_interval += 250;
|
||||
} else {
|
||||
timermqtt_interval = 250;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
* Tasks that run 50 times per second
|
||||
\*********************************************************************************************/
|
||||
|
||||
+76
-74
@@ -317,7 +317,7 @@ void statusLED(boolean traffic)
|
||||
else
|
||||
{
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
|
||||
{
|
||||
long int delta = timePassedSince(gnLastUpdate);
|
||||
if (delta>0 || delta<0 )
|
||||
@@ -1163,6 +1163,7 @@ void ResetFactory(void)
|
||||
//NOTE: this is a known ESP8266 bug, not our fault. :)
|
||||
delay(1000);
|
||||
WiFi.persistent(true); // use SDK storage of SSID/WPA parameters
|
||||
intent_to_reboot = true;
|
||||
WiFi.disconnect(); // this will store empty ssid/wpa into sdk storage
|
||||
WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
|
||||
#if defined(ESP8266)
|
||||
@@ -1513,87 +1514,89 @@ String parseTemplate(String &tmpString, byte lineSize)
|
||||
newString += tmpString.substring(0, leftBracketIndex);
|
||||
tmpString = tmpString.substring(leftBracketIndex + 1);
|
||||
int rightBracketIndex = tmpString.indexOf(']');
|
||||
if (rightBracketIndex)
|
||||
if (rightBracketIndex >= 0)
|
||||
{
|
||||
tmpStringMid = tmpString.substring(0, rightBracketIndex);
|
||||
tmpString = tmpString.substring(rightBracketIndex + 1);
|
||||
int hashtagIndex = tmpStringMid.indexOf('#');
|
||||
String deviceName = tmpStringMid.substring(0, hashtagIndex);
|
||||
String valueName = tmpStringMid.substring(hashtagIndex + 1);
|
||||
String valueFormat = "";
|
||||
hashtagIndex = valueName.indexOf('#');
|
||||
if (hashtagIndex >= 0)
|
||||
{
|
||||
valueFormat = valueName.substring(hashtagIndex + 1);
|
||||
valueName = valueName.substring(0, hashtagIndex);
|
||||
}
|
||||
|
||||
if (deviceName.equalsIgnoreCase("Plugin"))
|
||||
{
|
||||
String tmpString = tmpStringMid.substring(7);
|
||||
tmpString.replace("#", ",");
|
||||
if (PluginCall(PLUGIN_REQUEST, 0, tmpString))
|
||||
newString += tmpString;
|
||||
}
|
||||
else
|
||||
for (byte y = 0; y < TASKS_MAX; y++)
|
||||
if (hashtagIndex >= 0) {
|
||||
String deviceName = tmpStringMid.substring(0, hashtagIndex);
|
||||
String valueName = tmpStringMid.substring(hashtagIndex + 1);
|
||||
String valueFormat = "";
|
||||
hashtagIndex = valueName.indexOf('#');
|
||||
if (hashtagIndex >= 0)
|
||||
{
|
||||
if (Settings.TaskDeviceEnabled[y])
|
||||
valueFormat = valueName.substring(hashtagIndex + 1);
|
||||
valueName = valueName.substring(0, hashtagIndex);
|
||||
}
|
||||
|
||||
if (deviceName.equalsIgnoreCase("Plugin"))
|
||||
{
|
||||
String tmpString = tmpStringMid.substring(7);
|
||||
tmpString.replace("#", ",");
|
||||
if (PluginCall(PLUGIN_REQUEST, 0, tmpString))
|
||||
newString += tmpString;
|
||||
}
|
||||
else
|
||||
for (byte y = 0; y < TASKS_MAX; y++)
|
||||
{
|
||||
LoadTaskSettings(y);
|
||||
if (ExtraTaskSettings.TaskDeviceName[0] != 0)
|
||||
if (Settings.TaskDeviceEnabled[y])
|
||||
{
|
||||
if (deviceName.equalsIgnoreCase(ExtraTaskSettings.TaskDeviceName))
|
||||
LoadTaskSettings(y);
|
||||
if (ExtraTaskSettings.TaskDeviceName[0] != 0)
|
||||
{
|
||||
boolean match = false;
|
||||
for (byte z = 0; z < VARS_PER_TASK; z++)
|
||||
if (valueName.equalsIgnoreCase(ExtraTaskSettings.TaskDeviceValueNames[z]))
|
||||
{
|
||||
// here we know the task and value, so find the uservar
|
||||
match = true;
|
||||
String value = "";
|
||||
byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[y]);
|
||||
if (Device[DeviceIndex].VType == SENSOR_TYPE_LONG)
|
||||
value = (unsigned long)UserVar[y * VARS_PER_TASK + z] + ((unsigned long)UserVar[y * VARS_PER_TASK + z + 1] << 16);
|
||||
else
|
||||
value = toString(UserVar[y * VARS_PER_TASK + z], ExtraTaskSettings.TaskDeviceValueDecimals[z]);
|
||||
|
||||
int oidx;
|
||||
if ((oidx = valueFormat.indexOf('O')) >= 0) // Output
|
||||
{
|
||||
valueFormat.remove(oidx);
|
||||
oidx = valueFormat.indexOf('!'); // inverted or active low
|
||||
float val = value.toFloat();
|
||||
if (oidx >= 0) {
|
||||
valueFormat.remove(oidx);
|
||||
value = val == 0 ? " ON" : "OFF";
|
||||
} else {
|
||||
value = val == 0 ? "OFF" : " ON";
|
||||
}
|
||||
}
|
||||
|
||||
if (valueFormat == "R")
|
||||
{
|
||||
int filler = lineSize - newString.length() - value.length() - tmpString.length() ;
|
||||
for (byte f = 0; f < filler; f++)
|
||||
newString += " ";
|
||||
}
|
||||
newString += String(value);
|
||||
break;
|
||||
}
|
||||
if (!match) // try if this is a get config request
|
||||
if (deviceName.equalsIgnoreCase(ExtraTaskSettings.TaskDeviceName))
|
||||
{
|
||||
struct EventStruct TempEvent;
|
||||
TempEvent.TaskIndex = y;
|
||||
String tmpName = valueName;
|
||||
if (PluginCall(PLUGIN_GET_CONFIG, &TempEvent, tmpName))
|
||||
newString += tmpName;
|
||||
boolean match = false;
|
||||
for (byte z = 0; z < VARS_PER_TASK; z++)
|
||||
if (valueName.equalsIgnoreCase(ExtraTaskSettings.TaskDeviceValueNames[z]))
|
||||
{
|
||||
// here we know the task and value, so find the uservar
|
||||
match = true;
|
||||
String value = "";
|
||||
byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[y]);
|
||||
if (Device[DeviceIndex].VType == SENSOR_TYPE_LONG)
|
||||
value = (unsigned long)UserVar[y * VARS_PER_TASK + z] + ((unsigned long)UserVar[y * VARS_PER_TASK + z + 1] << 16);
|
||||
else
|
||||
value = toString(UserVar[y * VARS_PER_TASK + z], ExtraTaskSettings.TaskDeviceValueDecimals[z]);
|
||||
|
||||
int oidx;
|
||||
if ((oidx = valueFormat.indexOf('O')) >= 0) // Output
|
||||
{
|
||||
valueFormat.remove(oidx);
|
||||
oidx = valueFormat.indexOf('!'); // inverted or active low
|
||||
float val = value.toFloat();
|
||||
if (oidx >= 0) {
|
||||
valueFormat.remove(oidx);
|
||||
value = val == 0 ? " ON" : "OFF";
|
||||
} else {
|
||||
value = val == 0 ? "OFF" : " ON";
|
||||
}
|
||||
}
|
||||
|
||||
if (valueFormat == "R")
|
||||
{
|
||||
int filler = lineSize - newString.length() - value.length() - tmpString.length() ;
|
||||
for (byte f = 0; f < filler; f++)
|
||||
newString += " ";
|
||||
}
|
||||
newString += String(value);
|
||||
break;
|
||||
}
|
||||
if (!match) // try if this is a get config request
|
||||
{
|
||||
struct EventStruct TempEvent;
|
||||
TempEvent.TaskIndex = y;
|
||||
String tmpName = valueName;
|
||||
if (PluginCall(PLUGIN_GET_CONFIG, &TempEvent, tmpName))
|
||||
newString += tmpName;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
leftBracketIndex = tmpString.indexOf('[');
|
||||
count++;
|
||||
@@ -1615,7 +1618,6 @@ String parseTemplate(String &tmpString, byte lineSize)
|
||||
return newString;
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************************************\
|
||||
Calculate function for simple expressions
|
||||
\*********************************************************************************************/
|
||||
@@ -2013,7 +2015,7 @@ String rulesProcessingFile(String fileName, String& event)
|
||||
line = parseTemplate(line, line.length());
|
||||
}
|
||||
line.trim();
|
||||
|
||||
|
||||
String lineOrg = line; // store original line for future use
|
||||
line.toLowerCase(); // convert all to lower case to make checks easier
|
||||
|
||||
@@ -2060,9 +2062,9 @@ String rulesProcessingFile(String fileName, String& event)
|
||||
{
|
||||
isCommand = false;
|
||||
codeBlock = false;
|
||||
match = false;
|
||||
match = false;
|
||||
}
|
||||
|
||||
|
||||
if (Settings.SerialLogLevel == LOG_LEVEL_DEBUG_DEV){
|
||||
Serial.print(F("RuleDebug: "));
|
||||
Serial.print(codeBlock);
|
||||
@@ -2071,7 +2073,7 @@ String rulesProcessingFile(String fileName, String& event)
|
||||
Serial.print(": ");
|
||||
Serial.println(line);
|
||||
}
|
||||
|
||||
|
||||
if (match) // rule matched for one action or a block of actions
|
||||
{
|
||||
int split = lcAction.indexOf("if "); // check for optional "if" condition
|
||||
|
||||
+6
-8
@@ -12,7 +12,7 @@
|
||||
\*********************************************************************************************/
|
||||
void syslog(const char *message)
|
||||
{
|
||||
if (Settings.Syslog_IP[0] != 0 && WiFi.status() == WL_CONNECTED)
|
||||
if (Settings.Syslog_IP[0] != 0 && wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
|
||||
{
|
||||
IPAddress broadcastIP(Settings.Syslog_IP[0], Settings.Syslog_IP[1], Settings.Syslog_IP[2], Settings.Syslog_IP[3]);
|
||||
portUDP.beginPacket(broadcastIP, 514);
|
||||
@@ -596,12 +596,10 @@ bool WiFiConnected(uint32_t timeout_ms) {
|
||||
yield(); // Allow at least once time for backgroundtasks
|
||||
min_delay = 10;
|
||||
}
|
||||
if (!wifiConnected) {
|
||||
// Apparently something needs network, perform check to see if it is ready now.
|
||||
if (tryConnectWiFi())
|
||||
checkWifiJustConnected();
|
||||
}
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
// Apparently something needs network, perform check to see if it is ready now.
|
||||
// if (!tryConnectWiFi())
|
||||
// return false;
|
||||
while (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
if (timeOutReached(timer)) {
|
||||
return false;
|
||||
}
|
||||
@@ -624,7 +622,7 @@ bool hostReachable(const IPAddress& ip) {
|
||||
--retry;
|
||||
}
|
||||
String log = F("Host unreachable: ");
|
||||
log += ip;
|
||||
log += formatIP(ip);
|
||||
addLog(LOG_LEVEL_ERROR, log);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -278,8 +278,8 @@ void parseSystemVariables(String& s, boolean useURLencode)
|
||||
repl(F("%CR%"), F("\r"), s, useURLencode);
|
||||
repl(F("%LF%"), F("\n"), s, useURLencode);
|
||||
SMART_REPL(F("%ip%"),WiFi.localIP().toString())
|
||||
SMART_REPL(F("%rssi%"), String((WiFi.status() == WL_CONNECTED) ? WiFi.RSSI() : 0))
|
||||
SMART_REPL(F("%ssid%"), (WiFi.status() == WL_CONNECTED) ? WiFi.SSID() : F("--"))
|
||||
SMART_REPL(F("%rssi%"), String((wifiStatus == ESPEASY_WIFI_DISCONNECTED) ? 0 : WiFi.RSSI()))
|
||||
SMART_REPL(F("%ssid%"), (wifiStatus == ESPEASY_WIFI_DISCONNECTED) ? F("--") : WiFi.SSID())
|
||||
SMART_REPL(F("%unit%"), String(Settings.Unit))
|
||||
SMART_REPL(F("%mac%"), String(WiFi.macAddress()))
|
||||
#if defined(ESP8266)
|
||||
@@ -311,6 +311,7 @@ void parseSystemVariables(String& s, boolean useURLencode)
|
||||
SMART_REPL(F("%lcltime%"), getDateTimeString('-',':',' '))
|
||||
SMART_REPL(F("%lcltime_am%"), getDateTimeString_ampm('-',':',' '))
|
||||
SMART_REPL(F("%uptime%"), String(wdcounter / 2))
|
||||
SMART_REPL(F("%unixtime%"), String(getUnixTime()))
|
||||
|
||||
repl(F("%tskname%"), ExtraTaskSettings.TaskDeviceName, s, useURLencode);
|
||||
if (s.indexOf("%vname") != -1) {
|
||||
|
||||
+26
-12
@@ -72,6 +72,7 @@ void breakTime(unsigned long timeInput, struct timeStruct &tm) {
|
||||
|
||||
void setTime(unsigned long t) {
|
||||
sysTime = (uint32_t)t;
|
||||
applyTimeZone(t);
|
||||
nextSyncTime = (uint32_t)t + syncInterval;
|
||||
prevMillis = millis(); // restart counting from now (thanks to Korman for this fix)
|
||||
if (Settings.UseRules)
|
||||
@@ -83,6 +84,10 @@ void setTime(unsigned long t) {
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t getUnixTime() {
|
||||
return sysTime;
|
||||
}
|
||||
|
||||
unsigned long now() {
|
||||
// calculate number of seconds passed since last call to now()
|
||||
const long msec_passed = timePassedSince(prevMillis);
|
||||
@@ -94,10 +99,6 @@ unsigned long now() {
|
||||
unsigned long t = getNtpTime();
|
||||
if (t != 0) {
|
||||
setTime(t);
|
||||
applyTimeZone(t);
|
||||
} else {
|
||||
// Unable to sync, retry again in a minute
|
||||
nextSyncTime = sysTime + 60;
|
||||
}
|
||||
}
|
||||
uint32_t localSystime = toLocal(sysTime);
|
||||
@@ -197,19 +198,30 @@ void checkTime()
|
||||
|
||||
unsigned long getNtpTime()
|
||||
{
|
||||
if (!Settings.UseNTP || !WiFiConnected(100)) {
|
||||
if (!Settings.UseNTP || !WiFiConnected(10)) {
|
||||
return 0;
|
||||
}
|
||||
IPAddress timeServerIP;
|
||||
const char* ntpServerName = "pool.ntp.org";
|
||||
// Have to do a lookup eacht time, since the NTP pool always returns another IP
|
||||
if (Settings.NTPHost[0] != 0)
|
||||
String log = F("NTP : NTP send to ");
|
||||
if (Settings.NTPHost[0] != 0) {
|
||||
WiFi.hostByName(Settings.NTPHost, timeServerIP);
|
||||
else
|
||||
WiFi.hostByName(ntpServerName, timeServerIP);
|
||||
log += Settings.NTPHost;
|
||||
// When single set host fails, retry again in a minute
|
||||
nextSyncTime = sysTime + 20;
|
||||
}
|
||||
else {
|
||||
// Have to do a lookup eacht time, since the NTP pool always returns another IP
|
||||
String ntpServerName = String(random(0, 3));
|
||||
ntpServerName += F(".pool.ntp.org");
|
||||
WiFi.hostByName(ntpServerName.c_str(), timeServerIP);
|
||||
log += ntpServerName;
|
||||
// When pool host fails, retry can be much sooner
|
||||
nextSyncTime = sysTime + 5;
|
||||
}
|
||||
|
||||
if (!hostReachable(timeServerIP))
|
||||
if (!hostReachable(timeServerIP)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
WiFiUDP udp;
|
||||
udp.begin(123);
|
||||
@@ -217,8 +229,9 @@ unsigned long getNtpTime()
|
||||
const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
|
||||
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets
|
||||
|
||||
String log = F("NTP : NTP send to ");
|
||||
log += F(" (");
|
||||
log += timeServerIP.toString();
|
||||
log += F(")");
|
||||
addLog(LOG_LEVEL_DEBUG_MORE, log);
|
||||
|
||||
while (udp.parsePacket() > 0) ; // discard any previously received packets
|
||||
@@ -253,6 +266,7 @@ unsigned long getNtpTime()
|
||||
addLog(LOG_LEVEL_DEBUG_MORE, log);
|
||||
return secsSince1900 - 2208988800UL;
|
||||
}
|
||||
delay(10);
|
||||
}
|
||||
log = F("NTP : No reply");
|
||||
addLog(LOG_LEVEL_DEBUG_MORE, log);
|
||||
|
||||
+41
-17
@@ -856,7 +856,7 @@ void handle_root() {
|
||||
TXBuffer += formatIP(ip);
|
||||
|
||||
TXBuffer += F("<TD><TD>Wifi RSSI:<TD>");
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
|
||||
{
|
||||
TXBuffer += String(WiFi.RSSI());
|
||||
TXBuffer += F(" dB");
|
||||
@@ -3507,7 +3507,9 @@ void handle_json()
|
||||
reply += F("\n},\n");
|
||||
|
||||
reply += F("\"WiFi\":{\n");
|
||||
reply += to_json_object_value(F("Hostname"), WiFi.hostname());
|
||||
#if defined(ESP8266)
|
||||
reply += to_json_object_value(F("Hostname"), WiFi.hostname());
|
||||
#endif
|
||||
reply += F(",\n");
|
||||
reply += to_json_object_value(F("IP"), WiFi.localIP().toString());
|
||||
reply += F(",\n");
|
||||
@@ -3525,6 +3527,14 @@ void handle_json()
|
||||
reply += F(",\n");
|
||||
reply += to_json_object_value(F("BSSID"), WiFi.BSSIDstr());
|
||||
reply += F(",\n");
|
||||
reply += to_json_object_value(F("Channel"), String(WiFi.channel()));
|
||||
reply += F(",\n");
|
||||
reply += to_json_object_value(F("Connected msec"), String(timeDiff(lastConnectMoment, millis())));
|
||||
reply += F(",\n");
|
||||
reply += to_json_object_value(F("Last Disconnect Reason"), String(lastDisconnectReason));
|
||||
reply += F(",\n");
|
||||
reply += to_json_object_value(F("Last Disconnect Reason str"), getLastDisconnectReason());
|
||||
reply += F(",\n");
|
||||
reply += to_json_object_value(F("RSSI"), String(WiFi.RSSI()));
|
||||
reply += F("\n},\n");
|
||||
}
|
||||
@@ -4451,7 +4461,7 @@ void handle_setup() {
|
||||
|
||||
addHeader(false,TXBuffer.buf);
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
|
||||
{
|
||||
addHtmlError( SaveSettings());
|
||||
const IPAddress ip = WiFi.localIP();
|
||||
@@ -4781,7 +4791,7 @@ void handle_sysinfo() {
|
||||
|
||||
TXBuffer += F("<TR><TD colspan=2><H3>Network</H3></TD></TR>");
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
|
||||
{
|
||||
TXBuffer += F("<TR><TD>Wifi<TD>");
|
||||
#if defined(ESP8266)
|
||||
@@ -4816,14 +4826,13 @@ void handle_sysinfo() {
|
||||
TXBuffer += formatIP(WiFi.gatewayIP());
|
||||
|
||||
{
|
||||
TXBuffer += F("<TR><TD>Client IP<TD>");
|
||||
TXBuffer += F("<TR><TD>Client IP<TD>");
|
||||
WiFiClient client(WebServer.client());
|
||||
TXBuffer += formatIP(client.remoteIP());
|
||||
TXBuffer += formatIP(client.remoteIP());
|
||||
}
|
||||
|
||||
|
||||
TXBuffer += F("<TR><TD>Allowed IP Range<TD>");
|
||||
TXBuffer += describeAllowedIPrange();
|
||||
TXBuffer += F("<TR><TD>Allowed IP Range<TD>");
|
||||
TXBuffer += describeAllowedIPrange();
|
||||
|
||||
TXBuffer += F("<TR><TD>Serial Port available:<TD>");
|
||||
TXBuffer += String(SerialAvailableForWrite());
|
||||
@@ -4841,19 +4850,34 @@ void handle_sysinfo() {
|
||||
uint8_t* macread = WiFi.macAddress(mac);
|
||||
char macaddress[20];
|
||||
formatMAC(macread, macaddress);
|
||||
TXBuffer += macaddress;
|
||||
TXBuffer += macaddress;
|
||||
|
||||
TXBuffer += F("<TR><TD>AP MAC<TD>");
|
||||
TXBuffer += F("<TR><TD>AP MAC<TD>");
|
||||
macread = WiFi.softAPmacAddress(mac);
|
||||
formatMAC(macread, macaddress);
|
||||
TXBuffer += macaddress;
|
||||
TXBuffer += macaddress;
|
||||
|
||||
TXBuffer += F("<TR><TD colspan=2><H3>Firmware</H3></TD></TR>");
|
||||
TXBuffer += F("<TR><TD>SSID<TD>");
|
||||
TXBuffer += WiFi.SSID();
|
||||
TXBuffer += F(" (");
|
||||
TXBuffer += WiFi.BSSIDstr();
|
||||
TXBuffer += F(")");
|
||||
|
||||
TXBuffer += F("<TR><TD>Build<TD>");
|
||||
TXBuffer += BUILD;
|
||||
TXBuffer += F(" ");
|
||||
TXBuffer += F(BUILD_NOTES);
|
||||
TXBuffer += F("<TR><TD>Channel<TD>");
|
||||
TXBuffer += WiFi.channel();
|
||||
|
||||
TXBuffer += F("<TR><TD>Connected<TD>");
|
||||
TXBuffer += format_msec_duration(timeDiff(lastConnectMoment, millis()));
|
||||
|
||||
TXBuffer += F("<TR><TD>Last Disconnect Reason<TD>");
|
||||
TXBuffer += getLastDisconnectReason();
|
||||
|
||||
TXBuffer += F("<TR><TD colspan=2><H3>Firmware</H3></TD></TR>");
|
||||
|
||||
TXBuffer += F("<TR><TD>Build<TD>");
|
||||
TXBuffer += BUILD;
|
||||
TXBuffer += F(" ");
|
||||
TXBuffer += F(BUILD_NOTES);
|
||||
#if defined(ESP8266)
|
||||
TXBuffer += F(" (core ");
|
||||
TXBuffer += ESP.getCoreVersion();
|
||||
|
||||
+253
-179
@@ -1,10 +1,179 @@
|
||||
|
||||
//********************************************************************************
|
||||
// Functions called on events.
|
||||
// Make sure not to call anything in these functions that result in delay() or yield()
|
||||
//********************************************************************************
|
||||
void onConnected(const WiFiEventStationModeConnected& event){
|
||||
lastConnectMoment = millis();
|
||||
processedConnect = false;
|
||||
wifiStatus = ESPEASY_WIFI_CONNECTED;
|
||||
last_channel = event.channel;
|
||||
last_ssid = event.ssid;
|
||||
bssid_changed = false;
|
||||
for (byte i=0; i < 6; ++i) {
|
||||
if (lastBSSID[i] != event.bssid[i]) {
|
||||
bssid_changed = true;
|
||||
lastBSSID[i] = event.bssid[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void onDisconnect(const WiFiEventStationModeDisconnected& event){
|
||||
lastDisconnectMoment = millis();
|
||||
if (timeDiff(lastConnectMoment, last_wifi_connect_attempt_moment) > 0) {
|
||||
// There was an unsuccessful connection attempt
|
||||
lastConnectedDuration = timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment);
|
||||
} else
|
||||
lastConnectedDuration = timeDiff(lastConnectMoment, lastDisconnectMoment);
|
||||
processedDisconnect = false;
|
||||
lastDisconnectReason = event.reason;
|
||||
wifiStatus = ESPEASY_WIFI_DISCONNECTED;
|
||||
}
|
||||
|
||||
void onGotIP(const WiFiEventStationModeGotIP& event){
|
||||
lastGetIPmoment = millis();
|
||||
wifiStatus = ESPEASY_WIFI_GOT_IP;
|
||||
processedGetIP = false;
|
||||
}
|
||||
|
||||
//********************************************************************************
|
||||
// Functions to process the data gathered from the events.
|
||||
// These functions are called from Setup() or Loop() and thus may call delay() or yield()
|
||||
//********************************************************************************
|
||||
void processConnect() {
|
||||
if (processedConnect) return;
|
||||
if (wifiStatus < ESPEASY_WIFI_CONNECTED) return;
|
||||
|
||||
String log = F("WIFI : Connected! AP: ");
|
||||
log += WiFi.SSID();
|
||||
log += F(" (");
|
||||
log += WiFi.BSSIDstr();
|
||||
log += F(") Ch: ");
|
||||
log += last_channel;
|
||||
const long connect_duration = timeDiff(last_wifi_connect_attempt_moment, lastConnectMoment);
|
||||
if (connect_duration > 0 && connect_duration < 30000) {
|
||||
// Just log times when they make sense.
|
||||
log += F(" Duration: ");
|
||||
log += connect_duration;
|
||||
log += F(" ms");
|
||||
}
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
|
||||
if (Settings.UseRules && bssid_changed) {
|
||||
String event = F("WiFi#ChangedAccesspoint");
|
||||
rulesProcessing(event);
|
||||
}
|
||||
wifi_connect_attempt = 0;
|
||||
processedConnect = true;
|
||||
}
|
||||
|
||||
void processDisconnect() {
|
||||
if (processedDisconnect) return;
|
||||
if (Settings.UseRules) {
|
||||
String event = F("WiFi#Disconnected");
|
||||
rulesProcessing(event);
|
||||
}
|
||||
String log = F("WIFI : Disconnected! Reason: '");
|
||||
log += getLastDisconnectReason();
|
||||
log += F("'");
|
||||
if (lastConnectedDuration > 0) {
|
||||
log += F(" Connected for ");
|
||||
log += format_msec_duration(lastConnectedDuration);
|
||||
}
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
processedDisconnect = true;
|
||||
|
||||
if (Settings.deepSleep && Settings.deepSleepOnFail) {
|
||||
//only one attempt in deepsleep, to conserve battery
|
||||
addLog(LOG_LEVEL_ERROR, F("SLEEP: Connection failed, going back to sleep."));
|
||||
deepSleep(Settings.Delay);
|
||||
}
|
||||
|
||||
if (!intent_to_reboot)
|
||||
WiFiConnectRelaxed();
|
||||
}
|
||||
|
||||
|
||||
void processGotIP() {
|
||||
if (processedGetIP)
|
||||
return;
|
||||
if (wifiStatus < ESPEASY_WIFI_GOT_IP)
|
||||
return;
|
||||
IPAddress ip = WiFi.localIP();
|
||||
const IPAddress gw = WiFi.gatewayIP();
|
||||
const IPAddress subnet = WiFi.subnetMask();
|
||||
String log = F("WIFI : ");
|
||||
if (useStaticIP()) {
|
||||
log += F("Static IP: ");
|
||||
} else {
|
||||
log += F("DHCP IP: ");
|
||||
}
|
||||
log += formatIP(ip);
|
||||
log += F(" (");
|
||||
log += WifiGetHostname();
|
||||
log += F(") GW: ");
|
||||
log += formatIP(gw);
|
||||
log += F(" SN: ");
|
||||
log += formatIP(subnet);
|
||||
|
||||
const long dhcp_duration = timeDiff(lastConnectMoment, lastGetIPmoment);
|
||||
if (dhcp_duration > 0 && dhcp_duration < 30000) {
|
||||
// Just log times when they make sense.
|
||||
log += F(" duration: ");
|
||||
log += dhcp_duration;
|
||||
log += F(" ms");
|
||||
}
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
|
||||
// fix octet?
|
||||
if (Settings.IP_Octet != 0 && Settings.IP_Octet != 255)
|
||||
{
|
||||
ip[3] = Settings.IP_Octet;
|
||||
log = F("IP : Fixed IP octet:");
|
||||
log += formatIP(ip);
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
WiFi.config(ip, gw, subnet);
|
||||
}
|
||||
|
||||
#ifdef FEATURE_MDNS
|
||||
|
||||
log = F("WIFI : ");
|
||||
if (MDNS.begin(WifiGetHostname().c_str(), WiFi.localIP())) {
|
||||
|
||||
log += F("mDNS started, with name: ");
|
||||
log += WifiGetHostname();
|
||||
log += F(".local");
|
||||
}
|
||||
else{
|
||||
log += F("mDNS failed");
|
||||
}
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
#endif
|
||||
|
||||
// First try to get the time, since that may be used in logs
|
||||
if (Settings.UseNTP) {
|
||||
initTime();
|
||||
}
|
||||
if (Settings.UseRules)
|
||||
{
|
||||
String event = F("WiFi#Connected");
|
||||
rulesProcessing(event);
|
||||
}
|
||||
statusLED(true);
|
||||
wifiStatus = ESPEASY_WIFI_SERVICES_INITIALIZED;
|
||||
processedGetIP = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//********************************************************************************
|
||||
// Determine Wifi AP name to set. (also used for mDNS)
|
||||
//********************************************************************************
|
||||
String WifiGetAPssid()
|
||||
{
|
||||
String ssid(Settings.Name);
|
||||
ssid+=F("_");
|
||||
ssid+=F("-");
|
||||
ssid+=Settings.Unit;
|
||||
return (ssid);
|
||||
}
|
||||
@@ -16,6 +185,7 @@ String WifiGetHostname()
|
||||
{
|
||||
String hostname(WifiGetAPssid());
|
||||
hostname.replace(F(" "), F("-"));
|
||||
hostname.replace(F("_"), F("-")); // See RFC952
|
||||
return (hostname);
|
||||
}
|
||||
|
||||
@@ -27,7 +197,10 @@ void WifiAPconfig()
|
||||
{
|
||||
// create and store unique AP SSID/PW to prevent ESP from starting AP mode with default SSID and No password!
|
||||
// setup ssid for AP Mode when needed
|
||||
WiFi.softAP(WifiGetAPssid().c_str(), SecuritySettings.WifiAPKey);
|
||||
|
||||
String softAPSSID=WifiGetAPssid();
|
||||
String pwd = SecuritySettings.WifiAPKey;
|
||||
WiFi.softAP(softAPSSID.c_str(),pwd.c_str());
|
||||
// We start in STA mode
|
||||
WifiAPMode(false);
|
||||
|
||||
@@ -37,8 +210,6 @@ void WifiAPconfig()
|
||||
log=log+F(" with address ");
|
||||
log=log+apIP.toString();
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -78,11 +249,17 @@ void WifiAPMode(boolean state)
|
||||
}
|
||||
}
|
||||
|
||||
bool useStaticIP() {
|
||||
return (Settings.IP[0] != 0 && Settings.IP[0] != 255);
|
||||
}
|
||||
|
||||
//********************************************************************************
|
||||
// Set Wifi config
|
||||
//********************************************************************************
|
||||
void prepareWiFi() {
|
||||
bool prepareWiFi() {
|
||||
if (!selectValidWiFiSettings())
|
||||
return false;
|
||||
|
||||
String log = "";
|
||||
char hostname[40];
|
||||
strncpy(hostname, WifiGetHostname().c_str(), sizeof(hostname));
|
||||
@@ -94,7 +271,7 @@ void prepareWiFi() {
|
||||
#endif
|
||||
|
||||
//use static ip?
|
||||
if (Settings.IP[0] != 0 && Settings.IP[0] != 255)
|
||||
if (useStaticIP())
|
||||
{
|
||||
const IPAddress ip = Settings.IP;
|
||||
log = F("IP : Static IP :");
|
||||
@@ -105,44 +282,18 @@ void prepareWiFi() {
|
||||
const IPAddress dns = Settings.DNS;
|
||||
WiFi.config(ip, gw, subnet, dns);
|
||||
}
|
||||
}
|
||||
|
||||
//********************************************************************************
|
||||
// Configure network and connect to Wifi SSID and SSID2
|
||||
//********************************************************************************
|
||||
boolean WifiConnect(byte connectAttempts)
|
||||
{
|
||||
prepareWiFi();
|
||||
if (anyValidWifiSettings()) {
|
||||
//try to connect to one of the access points
|
||||
bool connected = WifiConnectAndWait(connectAttempts);
|
||||
if (!connected) {
|
||||
if (selectNextWiFiSettings()) {
|
||||
connected = WifiConnectAndWait(connectAttempts);
|
||||
}
|
||||
}
|
||||
if (connected) {
|
||||
return(true);
|
||||
}
|
||||
}
|
||||
addLog(LOG_LEVEL_ERROR, F("WIFI : Could not connect to AP!"));
|
||||
//everything failed, activate AP mode (will deactivate automatically after a while if its connected again)
|
||||
WifiAPMode(true);
|
||||
return(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
//********************************************************************************
|
||||
// Start connect to WiFi and check later to see if connected.
|
||||
//********************************************************************************
|
||||
void WiFiConnectRelaxed() {
|
||||
prepareWiFi();
|
||||
wifiConnected = false;
|
||||
wifi_connect_attempt = 0;
|
||||
if (anyValidWifiSettings()) {
|
||||
if (prepareWiFi()) {
|
||||
tryConnectWiFi();
|
||||
return;
|
||||
}
|
||||
addLog(LOG_LEVEL_ERROR, F("WIFI : Could not connect to AP, no valid WiFi settings!"));
|
||||
addLog(LOG_LEVEL_ERROR, F("WIFI : Could not connect to AP! (relaxed connect mode)"));
|
||||
//everything failed, activate AP mode (will deactivate automatically after a while if its connected again)
|
||||
WifiAPMode(true);
|
||||
}
|
||||
@@ -159,39 +310,52 @@ const char* getLastWiFiSettingsPassphrase() {
|
||||
return lastWiFiSettings == 0 ? SecuritySettings.WifiKey : SecuritySettings.WifiKey2;
|
||||
}
|
||||
|
||||
bool anyValidWifiSettings() {
|
||||
if (wifiSettingsValid(SecuritySettings.WifiSSID, SecuritySettings.WifiKey))
|
||||
return true;
|
||||
if (wifiSettingsValid(SecuritySettings.WifiSSID2, SecuritySettings.WifiKey2))
|
||||
return true;
|
||||
addLog(LOG_LEVEL_ERROR, F("WIFI : No valid WiFi settings!"));
|
||||
return false;
|
||||
}
|
||||
|
||||
bool selectNextWiFiSettings() {
|
||||
uint8_t tmp = lastWiFiSettings;
|
||||
lastWiFiSettings = (lastWiFiSettings + 1) % 2;
|
||||
if (!wifiSettingsValid(getLastWiFiSettingsSSID(), getLastWiFiSettingsPassphrase())) {
|
||||
// other settings are not correct, switch back.
|
||||
lastWiFiSettings = (lastWiFiSettings + 1) % 2;
|
||||
lastWiFiSettings = tmp;
|
||||
return false; // Nothing changed.
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool selectValidWiFiSettings() {
|
||||
if (wifiSettingsValid(getLastWiFiSettingsSSID(), getLastWiFiSettingsPassphrase()))
|
||||
return true;
|
||||
return selectNextWiFiSettings();
|
||||
}
|
||||
|
||||
bool wifiSettingsValid(const char* ssid, const char* pass) {
|
||||
if (ssid[0] == 0 || (strcasecmp(ssid, "ssid") == 0)) {
|
||||
return false;
|
||||
}
|
||||
if (pass[0] == 0) return false;
|
||||
if (strlen(ssid) > 32) return false;
|
||||
if (strlen(pass) > 64) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool wifiConnectTimeoutReached() {
|
||||
if (wifi_connect_attempt == 0) return true;
|
||||
if (timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment) >0 ) {
|
||||
// Connection attempt was already ended.
|
||||
return true;
|
||||
}
|
||||
if (wifiSetupConnect) {
|
||||
// Initial setup of WiFi, may take much longer since accesspoint is still active.
|
||||
return timeOutReached(last_wifi_connect_attempt_moment + 20000);
|
||||
}
|
||||
// wait until it connects + add some device specific random offset to prevent
|
||||
// all nodes overloading the accesspoint when turning on at the same time.
|
||||
#if defined(ESP8266)
|
||||
const unsigned int randomOffset_in_sec = wifi_connect_attempt == 1 ? 0 : 1000 * ((ESP.getChipId() & 0xF));
|
||||
return timeOutReached(wifi_connect_timer + 7000 + randomOffset_in_sec);
|
||||
#endif
|
||||
#if defined(ESP32)
|
||||
const unsigned int randomOffset_in_sec = wifi_connect_attempt == 1 ? 0 : 1000 * ((ESP.getEfuseMac() & 0xF));
|
||||
#endif
|
||||
return timeOutReached(last_wifi_connect_attempt_moment + DEFAULT_WIFI_CONNECTION_TIMEOUT + randomOffset_in_sec);
|
||||
}
|
||||
|
||||
//********************************************************************************
|
||||
@@ -200,10 +364,14 @@ bool wifiConnectTimeoutReached() {
|
||||
bool tryConnectWiFi() {
|
||||
if (wifiSetup && !wifiSetupConnect)
|
||||
return false;
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
if (wifiStatus != ESPEASY_WIFI_DISCONNECTED)
|
||||
return(true); //already connected, need to disconnect first
|
||||
if (!wifiConnectTimeoutReached())
|
||||
return true; // timeout not reached yet, thus no need to retry again.
|
||||
if (!selectValidWiFiSettings()) {
|
||||
addLog(LOG_LEVEL_ERROR, F("WIFI : No valid WiFi settings!"));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wifi_connect_attempt != 0 && ((wifi_connect_attempt % 3) == 0)) {
|
||||
// Change to other wifi settings.
|
||||
@@ -222,7 +390,7 @@ bool tryConnectWiFi() {
|
||||
log += wifi_connect_attempt;
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
|
||||
wifi_connect_timer = millis();
|
||||
last_wifi_connect_attempt_moment = millis();
|
||||
switch (wifi_connect_attempt) {
|
||||
case 0:
|
||||
if (lastBSSID[0] == 0)
|
||||
@@ -247,132 +415,18 @@ bool tryConnectWiFi() {
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
return false;
|
||||
}
|
||||
case WL_CONNECTED:
|
||||
checkWifiJustConnected();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true; // Sent
|
||||
}
|
||||
|
||||
//********************************************************************************
|
||||
// Connect to Wifi specific SSID
|
||||
//********************************************************************************
|
||||
boolean WifiConnectAndWait(byte connectAttempts)
|
||||
{
|
||||
String log;
|
||||
|
||||
wifiConnected = false;
|
||||
wifi_connect_attempt = 0;
|
||||
for (byte tryConnect = 0; tryConnect < connectAttempts; tryConnect++)
|
||||
{
|
||||
if (tryConnectWiFi()) {
|
||||
do {
|
||||
if (checkWifiJustConnected())
|
||||
return true;
|
||||
delay(50);
|
||||
} while (!wifiConnectTimeoutReached());
|
||||
}
|
||||
// log = F("WIFI : Disconnecting!");
|
||||
// addLog(LOG_LEVEL_INFO, log);
|
||||
#if defined(ESP8266)
|
||||
ETS_UART_INTR_DISABLE();
|
||||
wifi_station_disconnect();
|
||||
ETS_UART_INTR_ENABLE();
|
||||
#endif
|
||||
for (byte x = 0; x < 20; x++)
|
||||
{
|
||||
statusLED(true);
|
||||
delay(50);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool checkWifiJustConnected() {
|
||||
if (wifiConnected) return true;
|
||||
if (WiFi.status() != WL_CONNECTED) {
|
||||
statusLED(false);
|
||||
delay(1);
|
||||
return false;
|
||||
}
|
||||
wifiConnected = true;
|
||||
String log = F("WIFI : WiFi connect attempt took: ");
|
||||
log += timePassedSince(wifi_connect_timer);
|
||||
log += F(" ms");
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
|
||||
// fix octet?
|
||||
if (Settings.IP_Octet != 0 && Settings.IP_Octet != 255)
|
||||
{
|
||||
IPAddress ip = WiFi.localIP();
|
||||
IPAddress gw = WiFi.gatewayIP();
|
||||
IPAddress subnet = WiFi.subnetMask();
|
||||
ip[3] = Settings.IP_Octet;
|
||||
log = F("IP : Fixed IP octet:");
|
||||
log += ip;
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
WiFi.config(ip, gw, subnet);
|
||||
}
|
||||
|
||||
#ifdef FEATURE_MDNS
|
||||
|
||||
String log = F("WIFI : ");
|
||||
if (MDNS.begin(WifiGetHostname().c_str(), WiFi.localIP())) {
|
||||
|
||||
log += F("mDNS started, with name: ");
|
||||
log += WifiGetHostname();
|
||||
log += F(".local");
|
||||
}
|
||||
else{
|
||||
log += F("mDNS failed");
|
||||
}
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
#endif
|
||||
|
||||
// First try to get the time, since that may be used in logs
|
||||
if (Settings.UseNTP) {
|
||||
initTime();
|
||||
}
|
||||
uint8_t* curBSSID = WiFi.BSSID();
|
||||
bool changed = false;
|
||||
for (byte i=0; i < 6; ++i) {
|
||||
if (lastBSSID[i] != *(curBSSID + i)) {
|
||||
changed = true;
|
||||
lastBSSID[i] = *(curBSSID + i);
|
||||
}
|
||||
}
|
||||
if (Settings.UseRules)
|
||||
{
|
||||
if (changed) {
|
||||
String event = F("WiFi#ChangedAccesspoint");
|
||||
rulesProcessing(event);
|
||||
}
|
||||
String event = F("WiFi#Connected");
|
||||
rulesProcessing(event);
|
||||
}
|
||||
log = F("WIFI : Connected! IP: ");
|
||||
log += formatIP(WiFi.localIP());
|
||||
log += F(" (");
|
||||
log += WifiGetHostname();
|
||||
log += F(") AP: ");
|
||||
log += WiFi.SSID();
|
||||
log += F(" AP BSSID: ");
|
||||
log += WiFi.BSSIDstr();
|
||||
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
statusLED(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
//********************************************************************************
|
||||
// Disconnect from Wifi AP
|
||||
//********************************************************************************
|
||||
void WifiDisconnect()
|
||||
{
|
||||
WiFi.disconnect();
|
||||
wifiConnected = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -417,20 +471,10 @@ void WifiCheck()
|
||||
if(wifiSetup)
|
||||
return;
|
||||
|
||||
if (WiFi.status() != WL_CONNECTED)
|
||||
if (wifiStatus == ESPEASY_WIFI_DISCONNECTED)
|
||||
{
|
||||
NC_Count++;
|
||||
//give it time to automatically reconnect
|
||||
if (NC_Count > 2)
|
||||
{
|
||||
if (wifiConnected) {
|
||||
wifi_connect_attempt = 0;
|
||||
wifiConnected = false;
|
||||
WiFiConnectRelaxed();
|
||||
}
|
||||
C_Count=0;
|
||||
NC_Count = 0;
|
||||
}
|
||||
WiFiConnectRelaxed();
|
||||
}
|
||||
//connected
|
||||
else
|
||||
@@ -442,10 +486,6 @@ void WifiCheck()
|
||||
WifiAPMode(false);
|
||||
}
|
||||
}
|
||||
if (!wifiConnected) {
|
||||
if (tryConnectWiFi())
|
||||
checkWifiJustConnected();
|
||||
}
|
||||
}
|
||||
|
||||
//********************************************************************************
|
||||
@@ -457,7 +497,7 @@ bool getSubnetRange(IPAddress& low, IPAddress& high)
|
||||
// WiFi is active as accesspoint, do not check.
|
||||
return false;
|
||||
}
|
||||
if (WiFi.status() != WL_CONNECTED) {
|
||||
if (wifiStatus < ESPEASY_WIFI_GOT_IP) {
|
||||
return false;
|
||||
}
|
||||
const IPAddress ip = WiFi.localIP();
|
||||
@@ -473,3 +513,37 @@ bool getSubnetRange(IPAddress& low, IPAddress& high)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
String getLastDisconnectReason() {
|
||||
switch (lastDisconnectReason) {
|
||||
case WIFI_DISCONNECT_REASON_UNSPECIFIED: return F("Unspecified");
|
||||
case WIFI_DISCONNECT_REASON_AUTH_EXPIRE: return F("Auth expire");
|
||||
case WIFI_DISCONNECT_REASON_AUTH_LEAVE: return F("Auth leave");
|
||||
case WIFI_DISCONNECT_REASON_ASSOC_EXPIRE: return F("Assoc expire");
|
||||
case WIFI_DISCONNECT_REASON_ASSOC_TOOMANY: return F("Assoc toomany");
|
||||
case WIFI_DISCONNECT_REASON_NOT_AUTHED: return F("Not authed");
|
||||
case WIFI_DISCONNECT_REASON_NOT_ASSOCED: return F("Not assoced");
|
||||
case WIFI_DISCONNECT_REASON_ASSOC_LEAVE: return F("Assoc leave");
|
||||
case WIFI_DISCONNECT_REASON_ASSOC_NOT_AUTHED: return F("Assoc not authed");
|
||||
case WIFI_DISCONNECT_REASON_DISASSOC_PWRCAP_BAD: return F("Disassoc pwrcap bad");
|
||||
case WIFI_DISCONNECT_REASON_DISASSOC_SUPCHAN_BAD: return F("Disassoc supchan bad");
|
||||
case WIFI_DISCONNECT_REASON_IE_INVALID: return F("IE invalid");
|
||||
case WIFI_DISCONNECT_REASON_MIC_FAILURE: return F("Mic failure");
|
||||
case WIFI_DISCONNECT_REASON_4WAY_HANDSHAKE_TIMEOUT: return F("4way handshake timeout");
|
||||
case WIFI_DISCONNECT_REASON_GROUP_KEY_UPDATE_TIMEOUT: return F("Group key update timeout");
|
||||
case WIFI_DISCONNECT_REASON_IE_IN_4WAY_DIFFERS: return F("IE in 4way differs");
|
||||
case WIFI_DISCONNECT_REASON_GROUP_CIPHER_INVALID: return F("Group cipher invalid");
|
||||
case WIFI_DISCONNECT_REASON_PAIRWISE_CIPHER_INVALID: return F("Pairwise cipher invalid");
|
||||
case WIFI_DISCONNECT_REASON_AKMP_INVALID: return F("AKMP invalid");
|
||||
case WIFI_DISCONNECT_REASON_UNSUPP_RSN_IE_VERSION: return F("Unsupp RSN IE version");
|
||||
case WIFI_DISCONNECT_REASON_INVALID_RSN_IE_CAP: return F("Invalid RSN IE cap");
|
||||
case WIFI_DISCONNECT_REASON_802_1X_AUTH_FAILED: return F("802 1X auth failed");
|
||||
case WIFI_DISCONNECT_REASON_CIPHER_SUITE_REJECTED: return F("Cipher suite rejected");
|
||||
case WIFI_DISCONNECT_REASON_BEACON_TIMEOUT: return F("Beacon timeout");
|
||||
case WIFI_DISCONNECT_REASON_NO_AP_FOUND: return F("No AP found");
|
||||
case WIFI_DISCONNECT_REASON_AUTH_FAIL: return F("Auth fail");
|
||||
case WIFI_DISCONNECT_REASON_ASSOC_FAIL: return F("Assoc fail");
|
||||
case WIFI_DISCONNECT_REASON_HANDSHAKE_TIMEOUT: return F("Handshake timeout");
|
||||
}
|
||||
return F("Unknown");
|
||||
}
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ void C010_Send(struct EventStruct *event, byte varIndex, float value, unsigned l
|
||||
else
|
||||
msg.replace(F("%value%"), toString(value, ExtraTaskSettings.TaskDeviceValueDecimals[varIndex]));
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
ControllerSettings.beginPacket(portUDP);
|
||||
portUDP.write((uint8_t*)msg.c_str(),msg.length());
|
||||
portUDP.endPacket();
|
||||
|
||||
+2
-2
@@ -33,7 +33,7 @@ boolean CPlugin_012(byte function, struct EventStruct *event, String& string)
|
||||
|
||||
case CPLUGIN_PROTOCOL_SEND:
|
||||
{
|
||||
if (WiFi.status() != WL_CONNECTED) {
|
||||
if (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
success = false;
|
||||
break;
|
||||
}
|
||||
@@ -63,7 +63,7 @@ boolean CPlugin_012_send(struct EventStruct *event, int nrValues) {
|
||||
|
||||
boolean Blynk_get(const String& command, byte controllerIndex, float *data )
|
||||
{
|
||||
if (WiFi.status() != WL_CONNECTED) {
|
||||
if (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+17
-17
@@ -226,11 +226,27 @@ boolean Plugin_012(byte function, struct EventStruct *event, String& string)
|
||||
if (argIndex)
|
||||
tmpString = tmpString.substring(0, argIndex);
|
||||
|
||||
if (lcd && tmpString.equalsIgnoreCase(F("LCD")))
|
||||
if (lcd && tmpString.equalsIgnoreCase(F("LCDCMD")))
|
||||
{
|
||||
success = true;
|
||||
argIndex = string.lastIndexOf(',');
|
||||
tmpString = string.substring(argIndex + 1);
|
||||
if (tmpString.equalsIgnoreCase(F("Off"))){
|
||||
lcd->noBacklight();
|
||||
}
|
||||
else if (tmpString.equalsIgnoreCase(F("On"))){
|
||||
lcd->backlight();
|
||||
}
|
||||
else if (tmpString.equalsIgnoreCase(F("Clear"))){
|
||||
lcd->clear();
|
||||
}
|
||||
}
|
||||
else if (lcd && tmpString.equalsIgnoreCase(F("LCD")))
|
||||
{
|
||||
success = true;
|
||||
tmpString = P012_parseTemplate(string, cols);
|
||||
argIndex = tmpString.lastIndexOf(',');
|
||||
tmpString = tmpString.substring(argIndex + 1);
|
||||
|
||||
int colPos = event->Par2 - 1;
|
||||
int rowPos = event->Par1 - 1;
|
||||
@@ -281,22 +297,6 @@ boolean Plugin_012(byte function, struct EventStruct *event, String& string)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (lcd && tmpString.equalsIgnoreCase(F("LCDCMD")))
|
||||
{
|
||||
success = true;
|
||||
argIndex = string.lastIndexOf(',');
|
||||
tmpString = string.substring(argIndex + 1);
|
||||
if (tmpString.equalsIgnoreCase(F("Off"))){
|
||||
lcd->noBacklight();
|
||||
}
|
||||
else if (tmpString.equalsIgnoreCase(F("On"))){
|
||||
lcd->backlight();
|
||||
}
|
||||
else if (tmpString.equalsIgnoreCase(F("Clear"))){
|
||||
lcd->clear();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+8
-9
@@ -208,14 +208,6 @@ boolean Plugin_023(byte function, struct EventStruct *event, String& string)
|
||||
int argIndex = tmpString.indexOf(',');
|
||||
if (argIndex)
|
||||
tmpString = tmpString.substring(0, argIndex);
|
||||
if (tmpString.equalsIgnoreCase(F("OLED")))
|
||||
{
|
||||
success = true;
|
||||
argIndex = string.lastIndexOf(',');
|
||||
tmpString = string.substring(argIndex + 1);
|
||||
String newString = P023_parseTemplate(tmpString, 16);
|
||||
Plugin_023_sendStrXY(newString.c_str(), event->Par1 - 1, event->Par2 - 1);
|
||||
}
|
||||
if (tmpString.equalsIgnoreCase(F("OLEDCMD")))
|
||||
{
|
||||
success = true;
|
||||
@@ -228,9 +220,16 @@ boolean Plugin_023(byte function, struct EventStruct *event, String& string)
|
||||
else if (tmpString.equalsIgnoreCase(F("Clear")))
|
||||
Plugin_023_clear_display();
|
||||
}
|
||||
else if (tmpString.equalsIgnoreCase(F("OLED")))
|
||||
{
|
||||
success = true;
|
||||
argIndex = string.lastIndexOf(',');
|
||||
tmpString = string.substring(argIndex + 1);
|
||||
String newString = P023_parseTemplate(tmpString, 16);
|
||||
Plugin_023_sendStrXY(newString.c_str(), event->Par1 - 1, event->Par2 - 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
+8
-8
@@ -204,14 +204,14 @@ boolean Plugin_035(byte function, struct EventStruct *event, String& string)
|
||||
if (GetArgv(command, TmpStr1, 5)) IrRepeat = str2int(TmpStr1);
|
||||
if (GetArgv(command, TmpStr1, 6)) IrSecondCode = strtoul(TmpStr1, NULL, 16);
|
||||
|
||||
if (IrType.equalsIgnoreCase("NEC")) Plugin_035_irSender->sendNEC(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase("JVC")) Plugin_035_irSender->sendJVC(IrCode, IrBits, 2);
|
||||
if (IrType.equalsIgnoreCase("RC5")) Plugin_035_irSender->sendRC5(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase("RC6")) Plugin_035_irSender->sendRC6(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase("SAMSUNG")) Plugin_035_irSender->sendSAMSUNG(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase("SONY")) Plugin_035_irSender->sendSony(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase("PANASONIC")) Plugin_035_irSender->sendPanasonic(IrBits, IrCode);
|
||||
if (IrType.equalsIgnoreCase("PIONEER")) Plugin_035_irSender->sendPioneer(IrCode, IrBits, IrRepeat, IrSecondCode);
|
||||
if (IrType.equalsIgnoreCase(F("NEC"))) Plugin_035_irSender->sendNEC(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase(F("JVC"))) Plugin_035_irSender->sendJVC(IrCode, IrBits, 2);
|
||||
if (IrType.equalsIgnoreCase(F("RC5"))) Plugin_035_irSender->sendRC5(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase(F("RC6"))) Plugin_035_irSender->sendRC6(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase(F("SAMSUNG"))) Plugin_035_irSender->sendSAMSUNG(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase(F("SONY"))) Plugin_035_irSender->sendSony(IrCode, IrBits);
|
||||
if (IrType.equalsIgnoreCase(F("PANASONIC"))) Plugin_035_irSender->sendPanasonic(IrBits, IrCode);
|
||||
if (IrType.equalsIgnoreCase(F("PIONEER"))) Plugin_035_irSender->sendPioneer(IrCode, IrBits, IrRepeat, IrSecondCode);
|
||||
}
|
||||
|
||||
addLog(LOG_LEVEL_INFO, F("IRTX :IR Code Sent"));
|
||||
|
||||
@@ -466,7 +466,7 @@ String P36_parseTemplate(String &tmpString, byte lineSize) {
|
||||
|
||||
void display_header() {
|
||||
static boolean showWiFiName = true;
|
||||
if (showWiFiName && (WiFi.status() == WL_CONNECTED) ) {
|
||||
if (showWiFiName && (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) ) {
|
||||
String newString = WiFi.SSID();
|
||||
newString.trim();
|
||||
display_title(newString);
|
||||
@@ -629,7 +629,7 @@ void display_scroll(String outString[], String inString[], int nlines, int scrol
|
||||
|
||||
//Draw Signal Strength Bars, return true when there was an update.
|
||||
bool display_wifibars() {
|
||||
const bool connected = WiFi.status() == WL_CONNECTED;
|
||||
const bool connected = wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED;
|
||||
const int nbars_filled = (WiFi.RSSI() + 100) / 8;
|
||||
const int newState = connected ? nbars_filled : P36_WIFI_STATE_UNSET;
|
||||
if (newState == lastWiFiState)
|
||||
@@ -651,7 +651,7 @@ bool display_wifibars() {
|
||||
display->setColor(BLACK);
|
||||
display->fillRect(x , y, size_x, size_y);
|
||||
display->setColor(WHITE);
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
|
||||
for (byte ibar = 0; ibar < nbars; ibar++) {
|
||||
int16_t height = size_y * (ibar + 1) / nbars;
|
||||
int16_t xpos = x + ibar * width;
|
||||
|
||||
@@ -123,7 +123,7 @@ boolean Plugin_044(byte function, struct EventStruct *event, String& string)
|
||||
#endif
|
||||
#if defined(ESP32)
|
||||
Serial.begin(ExtraTaskSettings.TaskDevicePluginConfigLong[1], serialconfig);
|
||||
#endif
|
||||
#endif
|
||||
if (P1GatewayServer) P1GatewayServer->close();
|
||||
P1GatewayServer = new WiFiServer(ExtraTaskSettings.TaskDevicePluginConfigLong[0]);
|
||||
P1GatewayServer->begin();
|
||||
@@ -347,7 +347,7 @@ void blinkLED() {
|
||||
checks whether the incoming character is a valid one for a P1 datagram. Returns false if not, which signals corrupt datagram
|
||||
*/
|
||||
bool validP1char(char ch) {
|
||||
if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '.') || (ch == '!') || (ch == 92) || (ch == 13) || (ch == '\n') || (ch == '(') || (ch == ')') || (ch == '-') || (ch == '*') || (ch == ':') )
|
||||
if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '.') || (ch == '!') || (ch == ' ') || (ch == 92) || (ch == 13) || (ch == '\n') || (ch == '(') || (ch == ')') || (ch == '-') || (ch == '*') || (ch == ':') )
|
||||
{
|
||||
return true;
|
||||
} else {
|
||||
|
||||
@@ -102,18 +102,17 @@ boolean Plugin_048(byte function, struct EventStruct *event, String& string) {
|
||||
String tmpString = string;
|
||||
|
||||
String cmd = parseString(tmpString, 1);
|
||||
String param1 = parseString(tmpString, 2);
|
||||
String param2 = parseString(tmpString, 3);
|
||||
String param3 = parseString(tmpString, 4);
|
||||
String param4 = parseString(tmpString, 5);
|
||||
String param5 = parseString(tmpString, 6);
|
||||
|
||||
|
||||
// Commands:
|
||||
// MotorShieldCMD,<DCMotor>,<Motornumber>,<Forward/Backward/Release>,<Speed>
|
||||
|
||||
if (cmd.equalsIgnoreCase(F("MotorShieldCMD")))
|
||||
{
|
||||
String param1 = parseString(tmpString, 2);
|
||||
String param2 = parseString(tmpString, 3);
|
||||
String param3 = parseString(tmpString, 4);
|
||||
String param4 = parseString(tmpString, 5);
|
||||
String param5 = parseString(tmpString, 6);
|
||||
|
||||
// Create the motor shield object with the default I2C address
|
||||
AFMS = Adafruit_MotorShield(Plugin_048_MotorShield_address);
|
||||
|
||||
@@ -179,6 +179,7 @@ boolean Plugin_059(byte function, struct EventStruct *event, String& string)
|
||||
log = String(F("QEI : ")) + string;
|
||||
addLog(LOG_LEVEL_INFO, log);
|
||||
Plugin_059_QE->write(event->Par1);
|
||||
UserVar[event->BaseVarIndex] = (float) event->Par1;
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user