wifi reconnection bug fixed

This commit is contained in:
Dmitry Borisenko
2020-10-02 01:14:45 +03:00
parent 8a80d509c7
commit 7472863b05
23 changed files with 150 additions and 192 deletions

View File

@@ -43,7 +43,7 @@
}, },
{ {
"type": "h4", "type": "h4",
"title": "LittleFS version: 245" "title": "LittleFS version: 246"
}, },
{ {
"type": "hr" "type": "hr"

View File

@@ -2,7 +2,7 @@
//=================Firmeare================= //=================Firmeare=================
#define FIRMWARE_NAME "esp8266-iotm" #define FIRMWARE_NAME "esp8266-iotm"
#define FIRMWARE_VERSION 245 #define FIRMWARE_VERSION 246
#define FLASH_4MB true #define FLASH_4MB true
//=================System=================== //=================System===================

View File

@@ -2,14 +2,12 @@
#include <Arduino.h> #include <Arduino.h>
namespace MqttClient {
void init(); void mqttInit();
boolean connect(); boolean mqttConnect();
void reconnect(); void mqttReconnect();
void loop(); void mqttLoop();
void mqttSubscribe();
void subscribe();
boolean publish(const String& topic, const String& data); boolean publish(const String& topic, const String& data);
boolean publishData(const String& topic, const String& data); boolean publishData(const String& topic, const String& data);
@@ -21,7 +19,5 @@ boolean publishStatus(const String& topic, const String& data);
void publishWidgets(); void publishWidgets();
void publishState(); void publishState();
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length); void mqttCallback(char* topic, uint8_t* payload, size_t length);
const String getStateStr(); const String getStateStr();
} // namespace MqttClient

View File

@@ -4,9 +4,9 @@
boolean isNetworkActive(); boolean isNetworkActive();
void startSTAMode(); void routerConnect();
bool startAPMode(); bool startAPMode();
boolean scanWiFi(String ssid); boolean RouterFind(String ssid);

View File

@@ -47,7 +47,7 @@ class ButtonInClass : public LineParsing {
void switchChangeVirtual(String key, String state) { void switchChangeVirtual(String key, String state) {
eventGen(key, ""); eventGen(key, "");
jsonWriteInt(configLiveJson, key, state.toInt()); jsonWriteInt(configLiveJson, key, state.toInt());
MqttClient::publishStatus(key, state); publishStatus(key, state);
} }
}; };

View File

@@ -33,7 +33,7 @@ class ButtonOutClass : public LineParsing {
} }
eventGen(key, ""); eventGen(key, "");
jsonWriteInt(configLiveJson, key, state.toInt()); jsonWriteInt(configLiveJson, key, state.toInt());
MqttClient::publishStatus(key, state); publishStatus(key, state);
} }
}; };

View File

@@ -18,13 +18,13 @@ class InputClass : public LineParsing {
void inputSetFloat(String key, String state) { void inputSetFloat(String key, String state) {
eventGen(key, ""); eventGen(key, "");
jsonWriteFloat(configLiveJson, key, state.toFloat()); jsonWriteFloat(configLiveJson, key, state.toFloat());
MqttClient::publishStatus(key, state); publishStatus(key, state);
} }
void inputSetStr(String key, String state) { void inputSetStr(String key, String state) {
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, state); jsonWriteStr(configLiveJson, key, state);
MqttClient::publishStatus(key, state); publishStatus(key, state);
} }
}; };

View File

@@ -17,7 +17,7 @@ class OutputTextClass : public LineParsing {
state.replace("#", " "); state.replace("#", " ");
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, state); jsonWriteStr(configLiveJson, key, state);
MqttClient::publishStatus(key, state); publishStatus(key, state);
} }
}; };
extern OutputTextClass myOutputText; extern OutputTextClass myOutputText;

View File

@@ -24,7 +24,7 @@ class PwmOutClass : public LineParsing {
analogWrite(pinInt, state.toInt()); analogWrite(pinInt, state.toInt());
eventGen(key, ""); eventGen(key, "");
jsonWriteInt(configLiveJson, key, state.toInt()); jsonWriteInt(configLiveJson, key, state.toInt());
MqttClient::publishStatus(key, state); publishStatus(key, state);
} }
}; };

View File

@@ -30,7 +30,7 @@ class SensorAnalogClass : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
return value; return value;
} }

View File

@@ -27,7 +27,7 @@ class SensorBme280Class : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} }
@@ -37,7 +37,7 @@ class SensorBme280Class : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} }
@@ -48,7 +48,7 @@ class SensorBme280Class : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} }
}; };

View File

@@ -28,7 +28,7 @@ class SensorBmp280Class : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} }
@@ -41,7 +41,7 @@ class SensorBmp280Class : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} }
}; };

View File

@@ -36,7 +36,7 @@ class SensorDallasClass : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} }
} }

View File

@@ -43,7 +43,7 @@ class SensorDhtClass : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} else { } else {
Serial.println("[E] sensor '" + key); Serial.println("[E] sensor '" + key);
@@ -67,7 +67,7 @@ class SensorDhtClass : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} else { } else {
Serial.println("[E] sensor '" + key); Serial.println("[E] sensor '" + key);

View File

@@ -37,7 +37,7 @@
// int valueFl = this->correction(key, value); // int valueFl = this->correction(key, value);
// eventGen(key, ""); // eventGen(key, "");
// jsonWriteStr(configLiveJson, key, String(valueFl)); // jsonWriteStr(configLiveJson, key, String(valueFl));
// MqttClient::publishStatus(key, String(valueFl)); // publishStatus(key, String(valueFl));
// Serial.println("I sensor '" + key + "' data: " + String(valueFl) + ", Slave dev addr: " + String(slaveAddress) + ", Register: " + String(regAddress)); // Serial.println("I sensor '" + key + "' data: " + String(valueFl) + ", Slave dev addr: " + String(slaveAddress) + ", Register: " + String(regAddress));
// } // }
// //

View File

@@ -34,7 +34,7 @@ class SensorUltrasonic : public SensorConvertingClass {
float valueFl = this->correction(key, value); float valueFl = this->correction(key, value);
eventGen(key, ""); eventGen(key, "");
jsonWriteStr(configLiveJson, key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl));
MqttClient::publishStatus(key, String(valueFl)); publishStatus(key, String(valueFl));
Serial.println("I sensor '" + key + "' data: " + String(valueFl)); Serial.println("I sensor '" + key + "' data: " + String(valueFl));
} }
}; };

View File

@@ -122,7 +122,7 @@ void cmd_init() {
// } // }
// //
// jsonWriteStr(configLiveJson, "text" + number, text); // jsonWriteStr(configLiveJson, "text" + number, text);
// MqttClient::publishStatus("text" + number, text); // publishStatus("text" + number, text);
//} //}
//===================================================================================================================================== //=====================================================================================================================================
////=========================================Модуль шагового мотора====================================================================== ////=========================================Модуль шагового мотора======================================================================
@@ -243,7 +243,7 @@ void cmd_init() {
// //
// eventGen("servo", number); // eventGen("servo", number);
// jsonWriteInt(configLiveJson, "servo" + number, value); // jsonWriteInt(configLiveJson, "servo" + number, value);
// MqttClient::publishStatus("servo" + number, String(value, DEC)); // publishStatus("servo" + number, String(value, DEC));
//} //}
//#endif //#endif
////==================================================================================================================================================== ////====================================================================================================================================================

View File

@@ -137,7 +137,7 @@ void sendLogData(String file, String topic) {
json_array = "{\"status\":[" + json_array + "]}"; json_array = "{\"status\":[" + json_array + "]}";
SerialPrint("I","module",json_array); SerialPrint("I","module",json_array);
MqttClient::publishChart(topic, json_array); publishChart(topic, json_array);
} }
} }

View File

@@ -6,75 +6,58 @@
#include "Global.h" #include "Global.h"
#include "Init.h" #include "Init.h"
namespace MqttClient {
// Errors
int wifi_lost_error = 0;
int mqtt_lost_error = 0;
bool connected = false;
// Session params
String mqttPrefix; String mqttPrefix;
String mqttRootDevice; String mqttRootDevice;
void init() { void mqttInit() {
myNotAsincActions->add( myNotAsincActions->add(
do_MQTTPARAMSCHANGED, [&](void*) { do_MQTTPARAMSCHANGED, [&](void*) {
reconnect(); mqttReconnect();
}, },
nullptr); nullptr);
mqtt.setCallback(handleSubscribedUpdates); mqtt.setCallback(mqttCallback);
ts.add( ts.add(
WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL, WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL,
[&](void*) { [&](void*) {
if (isNetworkActive()) { if (WiFi.status() == WL_CONNECTED) {
SerialPrint("I", "WIFI", "OK");
if (mqtt.connected()) { if (mqtt.connected()) {
if (!connected) { SerialPrint("I", "MQTT", "OK");
SerialPrint("I","MQTT","OK"); setLedStatus(LED_OFF);
setLedStatus(LED_OFF);
connected = true;
}
} else { } else {
connect(); SerialPrint("E", "MQTT", "lost connection");
if (!just_load) mqtt_lost_error++; mqttConnect();
} }
} else { } else {
if (connected) { SerialPrint("E", "WIFI", "Lost WiFi connection");
SerialPrint("[E]","MQTT","connection lost");
connected = false;
}
ts.remove(WIFI_MQTT_CONNECTION_CHECK); ts.remove(WIFI_MQTT_CONNECTION_CHECK);
wifi_lost_error++;
startAPMode(); startAPMode();
} }
}, },
nullptr, true); nullptr, true);
} }
void disconnect() { void mqttDisconnect() {
SerialPrint("I","MQTT","disconnect"); SerialPrint("I", "MQTT", "disconnect");
mqtt.disconnect(); mqtt.disconnect();
} }
void reconnect() { void mqttReconnect() {
disconnect(); mqttDisconnect();
connect(); mqttConnect();
} }
void loop() { void mqttLoop() {
if (!isNetworkActive() || !mqtt.connected()) { if (!isNetworkActive() || !mqtt.connected()) {
return; return;
} }
mqtt.loop(); mqtt.loop();
} }
void subscribe() { void mqttSubscribe() {
SerialPrint("I","MQTT","subscribe"); SerialPrint("I", "MQTT", "subscribe");
mqtt.subscribe(mqttPrefix.c_str()); mqtt.subscribe(mqttPrefix.c_str());
mqtt.subscribe((mqttRootDevice + "/+/control").c_str()); mqtt.subscribe((mqttRootDevice + "/+/control").c_str());
mqtt.subscribe((mqttRootDevice + "/order").c_str()); mqtt.subscribe((mqttRootDevice + "/order").c_str());
@@ -83,59 +66,50 @@ void subscribe() {
mqtt.subscribe((mqttRootDevice + "/devs").c_str()); mqtt.subscribe((mqttRootDevice + "/devs").c_str());
} }
boolean connect() { boolean mqttConnect() {
SerialPrint("I","MQTT","connect"); SerialPrint("I", "MQTT", "start connection");
String addr = jsonReadStr(configSetupJson, "mqttServer"); String addr = jsonReadStr(configSetupJson, "mqttServer");
if (!addr) { if (!addr) {
SerialPrint("[E]","MQTT","no broker address"); SerialPrint("E", "MQTT", "no broker address");
return false; return false;
} }
int port = jsonReadInt(configSetupJson, "mqttPort"); int port = jsonReadInt(configSetupJson, "mqttPort");
String user = jsonReadStr(configSetupJson, "mqttUser"); String user = jsonReadStr(configSetupJson, "mqttUser");
String pass = jsonReadStr(configSetupJson, "mqttPass"); String pass = jsonReadStr(configSetupJson, "mqttPass");
//Session params
mqttPrefix = jsonReadStr(configSetupJson, "mqttPrefix"); mqttPrefix = jsonReadStr(configSetupJson, "mqttPrefix");
mqttRootDevice = mqttPrefix + "/" + chipId; mqttRootDevice = mqttPrefix + "/" + chipId;
SerialPrint("I", "MQTT", "broker " + addr + ":" + String(port, DEC));
SerialPrint("I","MQTT","broker " + addr + ":" + String(port, DEC)); SerialPrint("I", "MQTT", "topic " + mqttRootDevice);
SerialPrint("I","MQTT","topic " + mqttRootDevice);
setLedStatus(LED_FAST); setLedStatus(LED_FAST);
mqtt.setServer(addr.c_str(), port); mqtt.setServer(addr.c_str(), port);
bool res = false; bool res = false;
if (!mqtt.connected()) { if (!mqtt.connected()) {
if (mqtt.connect(chipId.c_str(), user.c_str(), pass.c_str())) { if (mqtt.connect(chipId.c_str(), user.c_str(), pass.c_str())) {
SerialPrint("I","MQTT","connected"); SerialPrint("I", "MQTT", "connected");
setLedStatus(LED_OFF); setLedStatus(LED_OFF);
subscribe(); mqttSubscribe();
res = true; res = true;
} else { } else {
SerialPrint("[E]","MQTT","could't connect, retry in " + String(MQTT_RECONNECT_INTERVAL / 1000) + "s"); SerialPrint("E", "MQTT", "could't connect, retry in " + String(MQTT_RECONNECT_INTERVAL / 1000) + "s");
setLedStatus(LED_FAST); setLedStatus(LED_FAST);
} }
} }
return res; return res;
} }
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) { void mqttCallback(char* topic, uint8_t* payload, size_t length) {
String topicStr = String(topic); String topicStr = String(topic);
SerialPrint("I", "MQTT", topicStr);
SerialPrint("I","MQTT",topicStr);
String payloadStr; String payloadStr;
payloadStr.reserve(length + 1); payloadStr.reserve(length + 1);
for (size_t i = 0; i < length; i++) { for (size_t i = 0; i < length; i++) {
payloadStr += (char)payload[i]; payloadStr += (char)payload[i];
} }
SerialPrint("I","MQTT",payloadStr); SerialPrint("I", "MQTT", payloadStr);
if (payloadStr.startsWith("HELLO")) { if (payloadStr.startsWith("HELLO")) {
SerialPrint("I","MQTT","Full update"); SerialPrint("I", "MQTT", "Full update");
publishWidgets(); publishWidgets();
publishState(); publishState();
#ifdef LOGGING_ENABLED #ifdef LOGGING_ENABLED
@@ -143,7 +117,6 @@ void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
#endif #endif
} else if (topicStr.indexOf("control")) { } else if (topicStr.indexOf("control")) {
//iotTeam/12882830-1458415/light 1 //iotTeam/12882830-1458415/light 1
String key = selectFromMarkerToMarker(topicStr, "/", 3); String key = selectFromMarkerToMarker(topicStr, "/", 3);
@@ -184,7 +157,7 @@ boolean publish(const String& topic, const String& data) {
boolean publishData(const String& topic, const String& data) { boolean publishData(const String& topic, const String& data) {
String path = mqttRootDevice + "/" + topic; String path = mqttRootDevice + "/" + topic;
if (!publish(path, data)) { if (!publish(path, data)) {
SerialPrint("[E]","MQTT","on publish data"); SerialPrint("[E]", "MQTT", "on publish data");
return false; return false;
} }
return true; return true;
@@ -193,7 +166,7 @@ boolean publishData(const String& topic, const String& data) {
boolean publishChart(const String& topic, const String& data) { boolean publishChart(const String& topic, const String& data) {
String path = mqttRootDevice + "/" + topic + "/status"; String path = mqttRootDevice + "/" + topic + "/status";
if (!publish(path, data)) { if (!publish(path, data)) {
SerialPrint("[E]","MQTT","on publish chart"); SerialPrint("[E]", "MQTT", "on publish chart");
return false; return false;
} }
return true; return true;
@@ -244,12 +217,12 @@ void publishWidgets() {
void publishWidgets() { void publishWidgets() {
auto file = seekFile("layout.txt"); auto file = seekFile("layout.txt");
if (!file) { if (!file) {
SerialPrint("[E]","MQTT","no file layout.txt"); SerialPrint("[E]", "MQTT", "no file layout.txt");
return; return;
} }
while (file.available()) { while (file.available()) {
String payload = file.readStringUntil('\n'); String payload = file.readStringUntil('\n');
SerialPrint("I","MQTT","widgets: " + payload); SerialPrint("I", "MQTT", "widgets: " + payload);
publishData("config", payload); publishData("config", payload);
} }
file.close(); file.close();
@@ -319,5 +292,3 @@ const String getStateStr() {
break; break;
} }
} }
} // namespace MqttClient

View File

@@ -48,7 +48,7 @@
// float value = 0; // float value = 0;
// static int counter; // static int counter;
// if (dht.getStatus() != 0 && counter < 5) { // if (dht.getStatus() != 0 && counter < 5) {
// //MqttClient::publishStatus(dhtT_value_name, String(dht.getStatusString())); // // publishStatus(dhtT_value_name, String(dht.getStatusString()));
// counter++; // counter++;
// } else { // } else {
// counter = 0; // counter = 0;
@@ -56,7 +56,7 @@
// if (String(value) != "nan") { // if (String(value) != "nan") {
// //eventGen(dhtT_value_name, ""); // //eventGen(dhtT_value_name, "");
// //jsonWriteStr(configLiveJson, dhtT_value_name, String(value)); // //jsonWriteStr(configLiveJson, dhtT_value_name, String(value));
// //MqttClient::publishStatus(dhtT_value_name, String(value)); // // publishStatus(dhtT_value_name, String(value));
// //Serial.println("I sensor '" + dhtT_value_name + "' data: " + String(value)); // //Serial.println("I sensor '" + dhtT_value_name + "' data: " + String(value));
// } // }
// } // }
@@ -86,7 +86,7 @@
// float value = 0; // float value = 0;
// static int counter; // static int counter;
// if (dht.getStatus() != 0 && counter < 5) { // if (dht.getStatus() != 0 && counter < 5) {
// //MqttClient::publishStatus(dhtH_value_name, String(dht.getStatusString())); // // publishStatus(dhtH_value_name, String(dht.getStatusString()));
// counter++; // counter++;
// } else { // } else {
// counter = 0; // counter = 0;
@@ -94,7 +94,7 @@
// if (String(value) != "nan") { // if (String(value) != "nan") {
// //eventGen(dhtH_value_name, ""); // //eventGen(dhtH_value_name, "");
// //jsonWriteStr(configLiveJson, dhtH_value_name, String(value)); // //jsonWriteStr(configLiveJson, dhtH_value_name, String(value));
// //MqttClient::publishStatus(dhtH_value_name, String(value)); // // publishStatus(dhtH_value_name, String(value));
// //Serial.println("I sensor '" + dhtH_value_name + "' data: " + String(value)); // //Serial.println("I sensor '" + dhtH_value_name + "' data: " + String(value));
// } // }
// } // }
@@ -112,13 +112,13 @@
//void dhtP_reading() { //void dhtP_reading() {
// byte value; // byte value;
// if (dht.getStatus() != 0) { // if (dht.getStatus() != 0) {
// MqttClient::publishStatus("dhtPerception", String(dht.getStatusString())); // publishStatus("dhtPerception", String(dht.getStatusString()));
// } else { // } else {
// //value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); // //value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
// String final_line = perceptionStr(value); // String final_line = perceptionStr(value);
// jsonWriteStr(configLiveJson, "dhtPerception", final_line); // jsonWriteStr(configLiveJson, "dhtPerception", final_line);
// eventGen("dhtPerception", ""); // eventGen("dhtPerception", "");
// MqttClient::publishStatus("dhtPerception", final_line); // publishStatus("dhtPerception", final_line);
// if (mqtt.connected()) { // if (mqtt.connected()) {
// Serial.println("I sensor 'dhtPerception' data: " + final_line); // Serial.println("I sensor 'dhtPerception' data: " + final_line);
// } // }
@@ -137,13 +137,13 @@
//void dhtC_reading() { //void dhtC_reading() {
// ComfortState cf; // ComfortState cf;
// if (dht.getStatus() != 0) { // if (dht.getStatus() != 0) {
// MqttClient::publishStatus("dhtComfort", String(dht.getStatusString())); // publishStatus("dhtComfort", String(dht.getStatusString()));
// } else { // } else {
// //dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); // //dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
// String final_line = comfortStr(cf); // String final_line = comfortStr(cf);
// jsonWriteStr(configLiveJson, "dhtComfort", final_line); // jsonWriteStr(configLiveJson, "dhtComfort", final_line);
// eventGen("dhtComfort", ""); // eventGen("dhtComfort", "");
// MqttClient::publishStatus("dhtComfort", final_line); // publishStatus("dhtComfort", final_line);
// Serial.println("I sensor 'dhtComfort' send date " + final_line); // Serial.println("I sensor 'dhtComfort' send date " + final_line);
// } // }
//} //}
@@ -230,12 +230,12 @@
//void dhtD_reading() { //void dhtD_reading() {
// float value; // float value;
// if (dht.getStatus() != 0) { // if (dht.getStatus() != 0) {
// MqttClient::publishStatus("dhtDewpoint", String(dht.getStatusString())); // publishStatus("dhtDewpoint", String(dht.getStatusString()));
// } else { // } else {
// //value = dht.computeDewPoint(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); // //value = dht.computeDewPoint(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
// jsonWriteInt(configLiveJson, "dhtDewpoint", value); // jsonWriteInt(configLiveJson, "dhtDewpoint", value);
// eventGen("dhtDewpoint", ""); // eventGen("dhtDewpoint", "");
// MqttClient::publishStatus("dhtDewpoint", String(value)); // publishStatus("dhtDewpoint", String(value));
// Serial.println("I sensor 'dhtDewpoint' data: " + String(value)); // Serial.println("I sensor 'dhtDewpoint' data: " + String(value));
// } // }
//} //}
@@ -271,7 +271,7 @@
// value = temp_event.temperature; // value = temp_event.temperature;
// //jsonWriteStr(configLiveJson, bmp280T_value_name, String(value)); // //jsonWriteStr(configLiveJson, bmp280T_value_name, String(value));
// //eventGen(bmp280T_value_name, ""); // //eventGen(bmp280T_value_name, "");
// //MqttClient::publishStatus(bmp280T_value_name, String(value)); // // publishStatus(bmp280T_value_name, String(value));
// //Serial.println("I sensor '" + bmp280T_value_name + "' data: " + String(value)); // //Serial.println("I sensor '" + bmp280T_value_name + "' data: " + String(value));
//} //}
// //
@@ -303,7 +303,7 @@
// value = value / 1.333224; // value = value / 1.333224;
// //jsonWriteStr(configLiveJson, bmp280P_value_name, String(value)); // //jsonWriteStr(configLiveJson, bmp280P_value_name, String(value));
// //eventGen(bmp280P_value_name, ""); // //eventGen(bmp280P_value_name, "");
// //MqttClient::publishStatus(bmp280P_value_name, String(value)); // // publishStatus(bmp280P_value_name, String(value));
// //Serial.println("I sensor '" + bmp280P_value_name + "' data: " + String(value)); // //Serial.println("I sensor '" + bmp280P_value_name + "' data: " + String(value));
//} //}
// //
@@ -328,7 +328,7 @@
// value = bme.readTemperature(); // value = bme.readTemperature();
// //jsonWriteStr(configLiveJson, bme280T_value_name, String(value)); // //jsonWriteStr(configLiveJson, bme280T_value_name, String(value));
// //eventGen(bme280T_value_name, ""); // //eventGen(bme280T_value_name, "");
// //MqttClient::publishStatus(bme280T_value_name, String(value)); // // publishStatus(bme280T_value_name, String(value));
// //Serial.println("I sensor '" + bme280T_value_name + "' data: " + String(value)); // //Serial.println("I sensor '" + bme280T_value_name + "' data: " + String(value));
//} //}
// //
@@ -352,7 +352,7 @@
// value = value / 1.333224 / 100; // value = value / 1.333224 / 100;
// //jsonWriteStr(configLiveJson, bme280P_value_name, String(value)); // //jsonWriteStr(configLiveJson, bme280P_value_name, String(value));
// //eventGen(bme280P_value_name, ""); // //eventGen(bme280P_value_name, "");
// //MqttClient::publishStatus(bme280P_value_name, String(value)); // // publishStatus(bme280P_value_name, String(value));
// //Serial.println("I sensor '" + bme280P_value_name + "' data: " + String(value)); // //Serial.println("I sensor '" + bme280P_value_name + "' data: " + String(value));
//} //}
// //
@@ -375,7 +375,7 @@
// value = bme.readHumidity(); // value = bme.readHumidity();
// //jsonWriteStr(configLiveJson, bme280H_value_name, String(value)); // //jsonWriteStr(configLiveJson, bme280H_value_name, String(value));
// //eventGen(bme280H_value_name, ""); // //eventGen(bme280H_value_name, "");
// //MqttClient::publishStatus(bme280H_value_name, String(value)); // // publishStatus(bme280H_value_name, String(value));
// //Serial.println("I sensor '" + bme280H_value_name + "' data: " + String(value)); // //Serial.println("I sensor '" + bme280H_value_name + "' data: " + String(value));
//} //}
// //
@@ -399,7 +399,7 @@
// //
// //eventGen(bme280A_value_name, ""); // //eventGen(bme280A_value_name, "");
// //
// //MqttClient::publishStatus(bme280A_value_name, String(value)); // // publishStatus(bme280A_value_name, String(value));
// //
// //Serial.println("I sensor '" + bme280A_value_name + "' data: " + String(value)); // //Serial.println("I sensor '" + bme280A_value_name + "' data: " + String(value));
//} //}

View File

@@ -1,115 +1,106 @@
#include "Utils/WiFiUtils.h" #include "Utils/WiFiUtils.h"
void routerConnect() {
void startSTAMode() {
setLedStatus(LED_SLOW); setLedStatus(LED_SLOW);
SerialPrint("I","WIFI","STA Mode");
String ssid = jsonReadStr(configSetupJson, "routerssid");
String passwd = jsonReadStr(configSetupJson, "routerpass");
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
if (ssid == "" && passwd == "") { byte tries = 20;
String _ssid = jsonReadStr(configSetupJson, "routerssid");
String _password = jsonReadStr(configSetupJson, "routerpass");
//WiFi.persistent(false);
if (_ssid == "" && _password == "") {
WiFi.begin(); WiFi.begin();
} else { } else {
if (WiFi.begin(ssid.c_str(), passwd.c_str()) == WL_CONNECT_FAILED) { WiFi.begin(_ssid.c_str(), _password.c_str());
SerialPrint("[E]","WIFI","failed on start"); SerialPrint("I", "WIFI", "ssid: " + _ssid);
}
} }
bool keepConnecting = true; while (--tries && WiFi.status() != WL_CONNECTED) {
uint8_t tries = 20; if (WiFi.status() == WL_CONNECT_FAILED) {
sint8_t connRes; SerialPrint("E", "WIFI", "password is not correct");
do { tries = 1;
#ifdef ESP8266 jsonWriteInt(configOptionJson, "pass_status", 1);
connRes = WiFi.waitForConnectResult(1000);
#else
byte connRes = WiFi.waitForConnectResult();
#endif
switch (connRes) {
case WL_NO_SSID_AVAIL: {
SerialPrint("[E]","WIFI","no network");
keepConnecting = false;
} break;
case WL_CONNECTED: {
String hostIpStr = WiFi.localIP().toString();
SerialPrint("I","WIFI","http://" + hostIpStr);
jsonWriteStr(configSetupJson, "ip", hostIpStr);
keepConnecting = false;
} break;
case WL_CONNECT_FAILED: {
SerialPrint("[E]","WIFI","check credentials");
jsonWriteInt(configOptionJson, "pass_status", 1);
keepConnecting = false;
} break;
default:
break;
} }
} while (keepConnecting && tries--); Serial.print(".");
delay(1000);
}
if (isNetworkActive()) { if (WiFi.status() != WL_CONNECTED) {
MqttClient::init(); Serial.println("");
setLedStatus(LED_OFF);
} else {
SerialPrint("[E]","WIFI","failed: " + String(connRes, DEC));
startAPMode(); startAPMode();
}; } else {
Serial.println("");
SerialPrint("I", "WIFI", "http://" + WiFi.localIP().toString());
jsonWriteStr(configSetupJson, "ip", WiFi.localIP().toString());
setLedStatus(LED_OFF);
mqttInit();
}
} }
bool startAPMode() { bool startAPMode() {
setLedStatus(LED_ON); setLedStatus(LED_ON);
SerialPrint("I","WIFI","AP Mode"); SerialPrint("I", "WIFI", "AP Mode");
String ssid = jsonReadStr(configSetupJson, "apssid");
String passwd = jsonReadStr(configSetupJson, "appass");
WiFi.disconnect();
WiFi.mode(WIFI_AP); WiFi.mode(WIFI_AP);
WiFi.softAP(ssid.c_str(), passwd.c_str()); String _ssidAP = jsonReadStr(configSetupJson, "apssid");
String hostIpStr = WiFi.softAPIP().toString(); String _passwordAP = jsonReadStr(configSetupJson, "appass");
SerialPrint("I","WIFI","Host IP: " + hostIpStr);
jsonWriteStr(configSetupJson, "ip", hostIpStr);
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
IPAddress myIP = WiFi.softAPIP();
SerialPrint("I", "WIFI", "AP IP: " + myIP.toString());
jsonWriteStr(configSetupJson, "ip", myIP.toString());
//if (jsonReadInt(configOptionJson, "pass_status") != 1) {
ts.add( ts.add(
WIFI_SCAN, 10 * 1000, WIFI_SCAN, 10 * 1000, [&](void*) {
[&](void*) {
String sta_ssid = jsonReadStr(configSetupJson, "routerssid"); String sta_ssid = jsonReadStr(configSetupJson, "routerssid");
SerialPrint("I","WIFI","scanning for " + sta_ssid);
if (scanWiFi(sta_ssid)) { SerialPrint("I", "WIFI", "scanning for " + sta_ssid);
if (RouterFind(sta_ssid)) {
ts.remove(WIFI_SCAN); ts.remove(WIFI_SCAN);
startSTAMode(); WiFi.scanDelete();
routerConnect();
} }
}, },
nullptr, true); nullptr, true);
//}
return true; return true;
} }
boolean scanWiFi(String ssid) {
boolean RouterFind(String ssid) {
bool res = false; bool res = false;
int8_t n = WiFi.scanComplete(); int n = WiFi.scanComplete();
SerialPrint("I","WIFI","scan result: " + String(n, DEC)); SerialPrint("I", "WIFI", "scan result: " + String(n, DEC));
if (n == -2) {
// не было запущено, запускаем if (n == -2) { //Сканирование не было запущено, запускаем
SerialPrint("I","WIFI","start scanning"); SerialPrint("I", "WIFI", "start scanning");
// async, show_hidden WiFi.scanNetworks(true, false); //async, show_hidden
}
else if (n == -1) { //Сканирование все еще выполняется
SerialPrint("I", "WIFI", "scanning in progress");
}
else if (n == 0) { //ни одна сеть не найдена
SerialPrint("I", "WIFI", "no networks found");
WiFi.scanNetworks(true, false); WiFi.scanNetworks(true, false);
} else if (n == -1) { }
// все еще выполняется
SerialPrint("I","WIFI","scanning in progress"); else if (n > 0) {
} else if (n == 0) {
// не найдена ни одна сеть
SerialPrint("I","WIFI","no networks found");
WiFi.scanNetworks(true, false);
} else if (n > 0) {
for (int8_t i = 0; i < n; i++) { for (int8_t i = 0; i < n; i++) {
if (WiFi.SSID(i) == ssid) { if (WiFi.SSID(i) == ssid) {
res = true; res = true;
} }
SerialPrint("I","WIFI",(res ? "*" : "") + String(i, DEC) + ") " + WiFi.SSID(i)); SerialPrint("I", "WIFI", (res ? "*" : "") + String(i, DEC) + ") " + WiFi.SSID(i));
} }
} }
WiFi.scanDelete();
return res; return res;
} }

View File

@@ -209,7 +209,7 @@ void web_init() {
} }
if (request->hasArg("mqttcheck")) { if (request->hasArg("mqttcheck")) {
String buf = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + MqttClient::getStateStr(); String buf = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + getStateStr();
String payload = "{}"; String payload = "{}";
jsonWriteStr(payload, "title", buf); jsonWriteStr(payload, "title", buf);

View File

@@ -55,7 +55,7 @@ void setup() {
all_init(); all_init();
SerialPrint("I","WIFI","Network Init"); SerialPrint("I","WIFI","Network Init");
startSTAMode(); routerConnect();
SerialPrint("I","Uptime","Uptime Init"); SerialPrint("I","Uptime","Uptime Init");
uptime_init(); uptime_init();
@@ -105,7 +105,7 @@ void loop() {
ws.cleanupClients(); ws.cleanupClients();
#endif #endif
timeNow->loop(); timeNow->loop();
MqttClient::loop(); mqttLoop();
myButtonIn.loop(); myButtonIn.loop();
myScenario->loop(); myScenario->loop();
loopCmdExecute(); loopCmdExecute();