mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 03:49:13 +03:00
@@ -20,3 +20,26 @@ enum LedStatus_t {
|
|||||||
LED_SLOW,
|
LED_SLOW,
|
||||||
LED_FAST
|
LED_FAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ConfigType_t {
|
||||||
|
CT_MACRO,
|
||||||
|
CT_SCENARIO
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Item_t {
|
||||||
|
RELAY,
|
||||||
|
PWM,
|
||||||
|
DHT11,
|
||||||
|
DHT22,
|
||||||
|
ANALOG,
|
||||||
|
BMP280,
|
||||||
|
BME280,
|
||||||
|
DALLAS,
|
||||||
|
TERMOSTAT,
|
||||||
|
ULTRASONIC,
|
||||||
|
MOTION,
|
||||||
|
STEPPER,
|
||||||
|
SERVO,
|
||||||
|
FIRMWARE,
|
||||||
|
NUM_ITEMS
|
||||||
|
};
|
||||||
@@ -53,7 +53,7 @@ extern TickerScheduler ts;
|
|||||||
|
|
||||||
extern WiFiClient espClient;
|
extern WiFiClient espClient;
|
||||||
|
|
||||||
extern PubSubClient client_mqtt;
|
extern PubSubClient mqtt;
|
||||||
|
|
||||||
extern StringCommand sCmd;
|
extern StringCommand sCmd;
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@ extern String last_version;
|
|||||||
|
|
||||||
extern boolean upgrade_url;
|
extern boolean upgrade_url;
|
||||||
extern boolean upgrade;
|
extern boolean upgrade;
|
||||||
extern boolean mqtt_connection;
|
extern boolean mqttParamsChanged;
|
||||||
extern boolean udp_data_parse;
|
extern boolean udp_data_parse;
|
||||||
extern boolean mqtt_send_settings_to_udp;
|
extern boolean mqtt_send_settings_to_udp;
|
||||||
extern boolean i2c_scanning;
|
extern boolean i2c_scanning;
|
||||||
@@ -192,21 +192,24 @@ extern void choose_log_date_and_send();
|
|||||||
extern void setChipId();
|
extern void setChipId();
|
||||||
extern void printMemoryStatus(String text);
|
extern void printMemoryStatus(String text);
|
||||||
extern void saveConfig();
|
extern void saveConfig();
|
||||||
extern String getURL(const String &urls);
|
extern String getURL(const String& urls);
|
||||||
|
|
||||||
extern void servo_();
|
extern void servo_();
|
||||||
|
|
||||||
extern void setLedStatus(LedStatus_t);
|
extern void setLedStatus(LedStatus_t);
|
||||||
|
|
||||||
// Mqtt
|
// Mqtt
|
||||||
extern void MQTT_init();
|
extern void initMQTT();
|
||||||
extern boolean MQTT_Connecting();
|
extern void loopMQTT();
|
||||||
extern boolean sendMQTT(String end_of_topik, String data);
|
extern boolean connectMQTT();
|
||||||
extern boolean sendCHART(String topik, String data);
|
|
||||||
extern void sendSTATUS(String topik, String state);
|
extern boolean publishData(const String& topic, const String& data);
|
||||||
extern void sendCONTROL(String id, String topik, String state);
|
extern boolean publishChart(const String& topic, const String& data);
|
||||||
|
extern boolean publishControl(String id, String topic, String state);
|
||||||
|
|
||||||
|
extern boolean sendSTATUS(String topic, String state);
|
||||||
|
|
||||||
extern void do_mqtt_connection();
|
extern void do_mqtt_connection();
|
||||||
extern void handleMQTT();
|
|
||||||
|
|
||||||
//Scenario
|
//Scenario
|
||||||
extern void eventGen(String event_name, String number);
|
extern void eventGen(String event_name, String number);
|
||||||
|
|||||||
@@ -51,4 +51,6 @@ String readFile(const String filename, size_t max_size);
|
|||||||
/*
|
/*
|
||||||
* Размер файла
|
* Размер файла
|
||||||
*/
|
*/
|
||||||
String getFileSize(const String filename);
|
String getFileSize(const String filename);
|
||||||
|
|
||||||
|
bool copyFile(const String src, const String dst, bool overwrite = true);
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
boolean scanWiFi(String ssid);
|
boolean isNetworkActive();
|
||||||
|
|
||||||
void startSTAMode();
|
void startSTAMode();
|
||||||
|
|
||||||
bool startAPMode();
|
bool startAPMode();
|
||||||
|
|
||||||
|
boolean scanWiFi(String ssid);
|
||||||
|
|
||||||
|
|||||||
@@ -526,7 +526,7 @@ void mqttOrderSend() {
|
|||||||
//Serial.print(all_line);
|
//Serial.print(all_line);
|
||||||
//Serial.print("->");
|
//Serial.print("->");
|
||||||
//Serial.println(order);
|
//Serial.println(order);
|
||||||
client_mqtt.publish(all_line.c_str(), order.c_str(), false);
|
mqtt.publish(all_line.c_str(), order.c_str(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpOrderSend() {
|
void httpOrderSend() {
|
||||||
|
|||||||
@@ -1,20 +1,15 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* Objects.cpp(с данными)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef WS_enable
|
#ifdef WS_enable
|
||||||
AsyncWebSocket ws;
|
AsyncWebSocket ws;
|
||||||
//AsyncEventSource events;
|
//AsyncEventSource events;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
TickerScheduler ts(TEST + 1);
|
TickerScheduler ts(TEST + 1);
|
||||||
|
|
||||||
WiFiClient espClient;
|
WiFiClient espClient;
|
||||||
|
|
||||||
PubSubClient client_mqtt(espClient);
|
PubSubClient mqtt(espClient);
|
||||||
|
|
||||||
StringCommand sCmd;
|
StringCommand sCmd;
|
||||||
|
|
||||||
@@ -74,7 +69,7 @@ String last_version = "";
|
|||||||
// Async actions
|
// Async actions
|
||||||
boolean upgrade_url = false;
|
boolean upgrade_url = false;
|
||||||
boolean upgrade = false;
|
boolean upgrade = false;
|
||||||
boolean mqtt_connection = false;
|
boolean mqttParamsChanged = false;
|
||||||
boolean udp_data_parse = false;
|
boolean udp_data_parse = false;
|
||||||
boolean mqtt_send_settings_to_udp = false;
|
boolean mqtt_send_settings_to_udp = false;
|
||||||
boolean i2c_scanning = false;
|
boolean i2c_scanning = false;
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ void sendLogData(String file, String topic) {
|
|||||||
log_date = "";
|
log_date = "";
|
||||||
json_array = "{\"status\":[" + json_array + "]}";
|
json_array = "{\"status\":[" + json_array + "]}";
|
||||||
Serial.println(json_array);
|
Serial.println(json_array);
|
||||||
sendCHART(topic, json_array);
|
publishChart(topic, json_array);
|
||||||
json_array = "";
|
json_array = "";
|
||||||
printMemoryStatus("[I] send log date");
|
printMemoryStatus("[I] send log date");
|
||||||
}
|
}
|
||||||
|
|||||||
290
src/Mqtt.cpp
290
src/Mqtt.cpp
@@ -3,34 +3,40 @@
|
|||||||
//
|
//
|
||||||
#include <LittleFS.h>
|
#include <LittleFS.h>
|
||||||
|
|
||||||
|
static const char* MODULE = "Mqtt";
|
||||||
|
|
||||||
// Errors
|
// Errors
|
||||||
int wifi_lost_error = 0;
|
int wifi_lost_error = 0;
|
||||||
int mqtt_lost_error = 0;
|
int mqtt_lost_error = 0;
|
||||||
|
|
||||||
void callback(char* topic, uint8_t* payload, size_t length);
|
// Session params
|
||||||
String stateMQTT();
|
String mqttPrefix;
|
||||||
|
|
||||||
|
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length);
|
||||||
|
const String getMqttStateStr();
|
||||||
void sendAllData();
|
void sendAllData();
|
||||||
void sendAllWigets();
|
void sendAllWigets();
|
||||||
void sendSTATUS(String topik, String state);
|
boolean sendSTATUS(String topic, String state);
|
||||||
void outcoming_date();
|
void outcoming_date();
|
||||||
|
|
||||||
//===============================================ИНИЦИАЛИЗАЦИЯ================================================
|
void initMQTT() {
|
||||||
void MQTT_init() {
|
mqtt.setCallback(handleSubscribedUpdates);
|
||||||
|
|
||||||
ts.add(
|
ts.add(
|
||||||
WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL, [&](void*) {
|
WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL,
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
[&](void*) {
|
||||||
Serial.println("[VV] WiFi-ok");
|
if (isNetworkActive()) {
|
||||||
if (client_mqtt.connected()) {
|
if (mqtt.connected()) {
|
||||||
Serial.println("[VV] MQTT-ok");
|
pm.info("OK");
|
||||||
setLedStatus(LED_OFF);
|
setLedStatus(LED_OFF);
|
||||||
} else {
|
} else {
|
||||||
MQTT_Connecting();
|
connectMQTT();
|
||||||
if (!just_load) mqtt_lost_error++;
|
if (!just_load) mqtt_lost_error++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Serial.println("[E] Lost WiFi connection");
|
pm.error("WiFi connection lost");
|
||||||
wifi_lost_error++;
|
|
||||||
ts.remove(WIFI_MQTT_CONNECTION_CHECK);
|
ts.remove(WIFI_MQTT_CONNECTION_CHECK);
|
||||||
|
wifi_lost_error++;
|
||||||
startAPMode();
|
startAPMode();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -38,150 +44,161 @@ void MQTT_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void do_mqtt_connection() {
|
void do_mqtt_connection() {
|
||||||
if (mqtt_connection) {
|
if (mqttParamsChanged) {
|
||||||
mqtt_connection = false;
|
mqtt.disconnect();
|
||||||
client_mqtt.disconnect();
|
connectMQTT();
|
||||||
MQTT_Connecting();
|
mqttParamsChanged = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//================================================ОБНОВЛЕНИЕ====================================================
|
void loopMQTT() {
|
||||||
void handleMQTT() {
|
if (!isNetworkActive() || !mqtt.connected()) {
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
return;
|
||||||
if (client_mqtt.connected()) {
|
|
||||||
client_mqtt.loop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
mqtt.loop();
|
||||||
}
|
}
|
||||||
boolean MQTT_Connecting() {
|
|
||||||
|
void subscribe() {
|
||||||
|
pm.info("Subscribe");
|
||||||
|
// Для приема получения HELLOW и подтверждения связи
|
||||||
|
// Подписываемся на топики control
|
||||||
|
// Подписываемся на топики order
|
||||||
|
mqtt.subscribe(jsonReadStr(configSetupJson, "mqttPrefix").c_str());
|
||||||
|
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/+/control").c_str());
|
||||||
|
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/order").c_str());
|
||||||
|
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/update").c_str());
|
||||||
|
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devc").c_str());
|
||||||
|
mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devs").c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean connectMQTT() {
|
||||||
|
if (!isNetworkActive()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String addr = jsonReadStr(configSetupJson, "mqttServer");
|
||||||
|
int port = jsonReadInt(configSetupJson, "mqttPort");
|
||||||
|
String user = jsonReadStr(configSetupJson, "mqttUser");
|
||||||
|
String pass = jsonReadStr(configSetupJson, "mqttPass");
|
||||||
|
mqttPrefix = jsonReadStr(configSetupJson, "mqttPrefix");
|
||||||
|
|
||||||
|
if (!addr) {
|
||||||
|
pm.error("no broker address");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pm.info("broker " + addr + ":" + String(port, DEC));
|
||||||
|
setLedStatus(LED_FAST);
|
||||||
|
mqtt.setServer(addr.c_str(), port);
|
||||||
bool res = false;
|
bool res = false;
|
||||||
String mqtt_server = jsonReadStr(configSetupJson, "mqttServer");
|
if (!mqtt.connected()) {
|
||||||
if ((mqtt_server != "")) {
|
if (mqtt.connect(chipId.c_str(), user.c_str(), pass.c_str())) {
|
||||||
Serial.println("[E] Lost MQTT connection, start reconnecting");
|
pm.info("connected");
|
||||||
setLedStatus(LED_FAST);
|
setLedStatus(LED_OFF);
|
||||||
client_mqtt.setServer(mqtt_server.c_str(), jsonReadInt(configSetupJson, "mqttPort"));
|
subscribe();
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
res = true;
|
||||||
if (!client_mqtt.connected()) {
|
} else {
|
||||||
Serial.println("[V] Connecting to MQTT server commenced");
|
pm.error("could't connect, retry in " + String(MQTT_RECONNECT_INTERVAL / 1000) + "s");
|
||||||
if (client_mqtt.connect(chipId.c_str(), jsonReadStr(configSetupJson, "mqttUser").c_str(), jsonReadStr(configSetupJson, "mqttPass").c_str())) {
|
setLedStatus(LED_FAST);
|
||||||
Serial.println("[VV] MQTT connected");
|
|
||||||
setLedStatus(LED_OFF);
|
|
||||||
client_mqtt.setCallback(callback);
|
|
||||||
client_mqtt.subscribe(jsonReadStr(configSetupJson, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи
|
|
||||||
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/+/control").c_str()); // Подписываемся на топики control
|
|
||||||
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/order").c_str()); // Подписываемся на топики order
|
|
||||||
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/update").c_str());
|
|
||||||
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devc").c_str());
|
|
||||||
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devs").c_str());
|
|
||||||
Serial.println("[V] Callback set, subscribe done");
|
|
||||||
res = true;
|
|
||||||
} else {
|
|
||||||
Serial.println("[E] try again in " + String(MQTT_RECONNECT_INTERVAL / 1000) + " sec");
|
|
||||||
setLedStatus(LED_FAST);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Serial.println("[E] No date for MQTT connection");
|
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
//=====================================================ВХОДЯЩИЕ ДАННЫЕ========================================================
|
void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
|
||||||
void callback(char* topic, uint8_t* payload, size_t length) {
|
String topicStr = String(topic);
|
||||||
Serial.print("[MQTT] ");
|
pm.info(topicStr);
|
||||||
Serial.print(topic);
|
|
||||||
String topic_str = String(topic);
|
|
||||||
|
|
||||||
String str;
|
String payloadStr;
|
||||||
|
payloadStr.reserve(length + 1);
|
||||||
for (size_t i = 0; i < length; i++) {
|
for (size_t i = 0; i < length; i++) {
|
||||||
str += (char)payload[i];
|
payloadStr += (char)payload[i];
|
||||||
}
|
}
|
||||||
Serial.println(" => " + str);
|
pm.info(payloadStr);
|
||||||
|
|
||||||
if (str == "HELLO") outcoming_date();
|
if (payloadStr == "HELLO") {
|
||||||
|
//данные которые отправляем при подключении или отбновлении страницы
|
||||||
|
pm.info("Send web page updates");
|
||||||
|
sendAllWigets();
|
||||||
|
sendAllData();
|
||||||
|
#ifdef LOGGING_ENABLED
|
||||||
|
choose_log_date_and_send();
|
||||||
|
#endif
|
||||||
|
} else if (topicStr.indexOf("control")) {
|
||||||
|
// название топика - команда,
|
||||||
|
// значение - параметр
|
||||||
|
//IoTmanager/800324-1458415/button99/control 1
|
||||||
|
String topic = selectFromMarkerToMarker(topicStr, "/", 3);
|
||||||
|
topic = add_set(topic);
|
||||||
|
String number = selectToMarkerLast(topic, "Set");
|
||||||
|
topic.replace(number, "");
|
||||||
|
|
||||||
//превращает название топика в команду, а значение в параметр команды
|
order_loop += topic;
|
||||||
if (topic_str.indexOf("control") > 0) { //IoTmanager/800324-1458415/button-sw2/control 1 //IoTmanager/800324-1458415/button99/control 1
|
order_loop += " ";
|
||||||
String topic = selectFromMarkerToMarker(topic_str, "/", 3); //button1 //button99
|
order_loop += number;
|
||||||
topic = add_set(topic); //buttonSet1 //buttonSet99
|
order_loop += " ";
|
||||||
String number = selectToMarkerLast(topic, "Set"); //1 //99
|
order_loop += payloadStr;
|
||||||
topic.replace(number, ""); //buttonSet //buttonSet
|
order_loop += ",";
|
||||||
String final_line = topic + " " + number + " " + str; //buttonSet 1 1 //buttonSet 99 1
|
} else if (topicStr.indexOf("order")) {
|
||||||
order_loop += final_line + ",";
|
payloadStr.replace("_", " ");
|
||||||
}
|
order_loop += payloadStr;
|
||||||
|
order_loop += ",";
|
||||||
if (topic_str.indexOf("order") > 0) {
|
} else if (topicStr.indexOf("update")) {
|
||||||
str.replace("_", " ");
|
if (payloadStr == "1") {
|
||||||
//Serial.println(str);
|
|
||||||
order_loop += str + ",";
|
|
||||||
}
|
|
||||||
if (topic_str.indexOf("update") > 0) {
|
|
||||||
if (str == "1") {
|
|
||||||
upgrade = true;
|
upgrade = true;
|
||||||
}
|
}
|
||||||
}
|
} else if (topicStr.indexOf("devc")) {
|
||||||
if (topic_str.indexOf("devc") > 0) {
|
writeFile("firmware.c.txt", payloadStr);
|
||||||
writeFile("firmware.c.txt", str);
|
|
||||||
Device_init();
|
Device_init();
|
||||||
}
|
} else if (topicStr.indexOf("devs")) {
|
||||||
if (topic_str.indexOf("devs") > 0) {
|
writeFile("firmware.s.txt", payloadStr);
|
||||||
writeFile("firmware.s.txt", str);
|
|
||||||
Scenario_init();
|
Scenario_init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//данные которые отправляем при подключении или отбновлении страницы
|
boolean publish(const String& topic, const String& data) {
|
||||||
void outcoming_date() {
|
if (mqtt.beginPublish(topic.c_str(), data.length(), false)) {
|
||||||
sendAllWigets();
|
mqtt.print(data);
|
||||||
sendAllData();
|
return mqtt.endPublish();
|
||||||
|
}
|
||||||
#ifdef LOGGING_ENABLED
|
return false;
|
||||||
choose_log_date_and_send();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Serial.println("[V] Sending all date to iot manager completed");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//======================================CONFIG==================================================
|
boolean publishData(const String& topic, const String& data) {
|
||||||
boolean sendMQTT(String end_of_topik, String data) {
|
String path = mqttPrefix + "/" + chipId + "/" + topic;
|
||||||
String topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + end_of_topik;
|
if (!publish(path, data)) {
|
||||||
boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false);
|
pm.error("on publish data");
|
||||||
client_mqtt.print(data);
|
return false;
|
||||||
client_mqtt.endPublish();
|
}
|
||||||
return send_status;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean sendCHART(String topik, String data) {
|
boolean publishChart(const String& topic, const String& data) {
|
||||||
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topik + "/" + "status";
|
String path = mqttPrefix + "/" + chipId + "/" + topic + "/status";
|
||||||
boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false);
|
if (!publish(path, data)) {
|
||||||
client_mqtt.print(data);
|
pm.error("on publish chart");
|
||||||
client_mqtt.endPublish();
|
return false;
|
||||||
return send_status;
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean sendCHART_test(String topik, String data) {
|
boolean publishControl(String id, String topic, String state) {
|
||||||
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topik + "/" + "status";
|
String path = mqttPrefix + "/" + id + "/" + topic + "/control";
|
||||||
boolean send_status = client_mqtt.publish(topik.c_str(), data.c_str(), false);
|
return mqtt.publish(path.c_str(), state.c_str(), false);
|
||||||
return send_status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//======================================STATUS==================================================
|
boolean sendCHART_test(String topic, String data) {
|
||||||
void sendSTATUS(String topik, String state) {
|
topic = mqttPrefix + "/" + chipId + "/" + topic + "/" + "status";
|
||||||
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topik + "/" + "status";
|
return mqtt.publish(topic.c_str(), data.c_str(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean sendSTATUS(String topic, String state) {
|
||||||
|
topic = mqttPrefix + "/" + chipId + "/" + topic + "/" + "status";
|
||||||
String json_ = "{}";
|
String json_ = "{}";
|
||||||
jsonWriteStr(json_, "status", state);
|
jsonWriteStr(json_, "status", state);
|
||||||
client_mqtt.publish(topik.c_str(), json_.c_str(), false);
|
return mqtt.publish(topic.c_str(), json_.c_str(), false);
|
||||||
}
|
|
||||||
|
|
||||||
//======================================CONTROL==================================================
|
|
||||||
void sendCONTROL(String id, String topik, String state) {
|
|
||||||
String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/" + topik + "/control";
|
|
||||||
client_mqtt.publish(all_line.c_str(), state.c_str(), false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
|
//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
|
||||||
|
|
||||||
#ifdef LAYOUT_IN_RAM
|
#ifdef LAYOUT_IN_RAM
|
||||||
void sendAllWigets() {
|
void sendAllWigets() {
|
||||||
if (all_widgets != "") {
|
if (all_widgets != "") {
|
||||||
@@ -214,8 +231,8 @@ void sendAllWigets() {
|
|||||||
}
|
}
|
||||||
while (file.position() != file.size()) {
|
while (file.position() != file.size()) {
|
||||||
String payload = file.readStringUntil('\n');
|
String payload = file.readStringUntil('\n');
|
||||||
Serial.println("[V] " + payload);
|
pm.info("publish: " + payload);
|
||||||
sendMQTT("config", payload);
|
publishData("config", payload);
|
||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
@@ -244,41 +261,40 @@ void sendAllData() { //берет строку json и ключи превра
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String stateMQTT() {
|
const String getMqttStateStr() {
|
||||||
int state = client_mqtt.state();
|
switch (mqtt.state()) {
|
||||||
switch (state) {
|
|
||||||
case -4:
|
case -4:
|
||||||
return "the server didn't respond within the keepalive time";
|
return F("no respond");
|
||||||
break;
|
break;
|
||||||
case -3:
|
case -3:
|
||||||
return "the network connection was broken";
|
return F("connection was broken");
|
||||||
break;
|
break;
|
||||||
case -2:
|
case -2:
|
||||||
return "the network connection failed";
|
return F("connection failed");
|
||||||
break;
|
break;
|
||||||
case -1:
|
case -1:
|
||||||
return "the client is disconnected cleanly";
|
return F("client disconnected ");
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
return "the client is connected";
|
return F("client connected");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
return "the server doesn't support the requested version of MQTT";
|
return F("doesn't support the requested version");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
return "the server rejected the client identifier";
|
return F("rejected the client identifier");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
return "the server was unable to accept the connection";
|
return F("unable to accept the connection");
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
return "the username/password were rejected";
|
return F("wrong username/password");
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
return "the client was not authorized to connect";
|
return F("not authorized to connect");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return "unspecified";
|
return F("unspecified");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
155
src/Scenario.cpp
155
src/Scenario.cpp
@@ -1,96 +1,95 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
void handleScenario() {
|
void handleScenario() {
|
||||||
|
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
||||||
|
if ((jsonReadStr(configOptionJson, "scenario_status") != "")) {
|
||||||
|
int i = 0;
|
||||||
|
String str = scenario; //читаем переменную с сценариями (то что из файла на странице)
|
||||||
|
str += "\n";
|
||||||
|
str.replace("\r\n", "\n");
|
||||||
|
str.replace("\r", "\n");
|
||||||
|
while (str.length() != 0) {
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------------
|
||||||
|
String tmp = selectToMarker(str, "end"); //выделяем первый сценарий из файла вместе с командами
|
||||||
|
if (tmp == "") return;
|
||||||
|
i++;
|
||||||
|
|
||||||
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
if (scenario_line_status[i] == 1) {
|
||||||
if ((jsonReadStr(configOptionJson, "scenario_status") != "")) {
|
//Serial.println(i);
|
||||||
int i = 0;
|
String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
|
||||||
String str = scenario; //читаем переменную с сценариями (то что из файла на странице)
|
String param_name = selectFromMarkerToMarker(condition, " ", 0);
|
||||||
str += "\n";
|
String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий
|
||||||
str.replace("\r\n", "\n");
|
String param = selectToMarker(order, ","); //читаем первое событие из файла событий
|
||||||
str.replace("\r", "\n");
|
if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку
|
||||||
while (str.length() != 0) {
|
|
||||||
//-----------------------------------------------------------------------------------------------------------------------
|
|
||||||
String tmp = selectToMarker (str, "end"); //выделяем первый сценарий из файла вместе с командами
|
|
||||||
if (tmp == "") return;
|
|
||||||
i++;
|
|
||||||
|
|
||||||
if (scenario_line_status[i] == 1) {
|
String sign = selectFromMarkerToMarker(condition, " ", 1); //читаем знак (=)
|
||||||
//Serial.println(i);
|
String value = selectFromMarkerToMarker(condition, " ", 2); //читаем значение (1)
|
||||||
String condition = selectToMarker (tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
|
if (value.indexOf("digit") != -1) {
|
||||||
String param_name = selectFromMarkerToMarker(condition, " " , 0);
|
// value = add_set(value);
|
||||||
String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий
|
value = jsonReadStr(configLiveJson, value);
|
||||||
String param = selectToMarker (order, ","); //читаем первое событие из файла событий
|
}
|
||||||
if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку
|
if (value.indexOf("time") != -1) {
|
||||||
|
// value = add_set(value);
|
||||||
|
value = jsonReadStr(configLiveJson, value);
|
||||||
|
}
|
||||||
|
boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады
|
||||||
|
if (sign == "=") {
|
||||||
|
if (jsonReadStr(configLiveJson, param_name) == value) flag = true;
|
||||||
|
}
|
||||||
|
if (sign == "!=") {
|
||||||
|
if (jsonReadStr(configLiveJson, param_name) != value) flag = true;
|
||||||
|
}
|
||||||
|
if (sign == "<") {
|
||||||
|
if (jsonReadStr(configLiveJson, param_name).toInt() < value.toInt()) flag = true;
|
||||||
|
}
|
||||||
|
if (sign == ">") {
|
||||||
|
if (jsonReadStr(configLiveJson, param_name).toInt() > value.toInt()) flag = true;
|
||||||
|
}
|
||||||
|
if (sign == ">=") {
|
||||||
|
if (jsonReadStr(configLiveJson, param_name).toInt() >= value.toInt()) flag = true;
|
||||||
|
}
|
||||||
|
if (sign == "<=") {
|
||||||
|
if (jsonReadStr(configLiveJson, param_name).toInt() <= value.toInt()) flag = true;
|
||||||
|
}
|
||||||
|
|
||||||
String sign = selectFromMarkerToMarker(condition, " " , 1); //читаем знак (=)
|
if (flag) {
|
||||||
String value = selectFromMarkerToMarker(condition, " " , 2); //читаем значение (1)
|
tmp = deleteBeforeDelimiter(tmp, "\n"); //удаляем строку самого сценария оставляя только команды
|
||||||
if (value.indexOf("digit") != -1) {
|
stringExecution(tmp); //выполняем все команды
|
||||||
// value = add_set(value);
|
|
||||||
value = jsonReadStr(configLiveJson, value);
|
|
||||||
}
|
|
||||||
if (value.indexOf("time") != -1) {
|
|
||||||
// value = add_set(value);
|
|
||||||
value = jsonReadStr(configLiveJson, value);
|
|
||||||
}
|
|
||||||
boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады
|
|
||||||
if (sign == "=") {
|
|
||||||
if (jsonReadStr(configLiveJson, param_name) == value) flag = true;
|
|
||||||
}
|
|
||||||
if (sign == "!=") {
|
|
||||||
if (jsonReadStr(configLiveJson, param_name) != value) flag = true;
|
|
||||||
}
|
|
||||||
if (sign == "<") {
|
|
||||||
if (jsonReadStr(configLiveJson, param_name).toInt() < value.toInt()) flag = true;
|
|
||||||
}
|
|
||||||
if (sign == ">") {
|
|
||||||
if (jsonReadStr(configLiveJson, param_name).toInt() > value.toInt()) flag = true;
|
|
||||||
}
|
|
||||||
if (sign == ">=") {
|
|
||||||
if (jsonReadStr(configLiveJson, param_name).toInt() >= value.toInt()) flag = true;
|
|
||||||
}
|
|
||||||
if (sign == "<=") {
|
|
||||||
if (jsonReadStr(configLiveJson, param_name).toInt() <= value.toInt()) flag = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flag) {
|
Serial.println("[SCENARIO] '" + condition + "'");
|
||||||
tmp = deleteBeforeDelimiter(tmp, "\n"); //удаляем строку самого сценария оставляя только команды
|
//Serial.println(" " + tmp);
|
||||||
stringExecution(tmp); //выполняем все команды
|
}
|
||||||
|
}
|
||||||
Serial.println("[SCENARIO] '" + condition + "'");
|
}
|
||||||
//Serial.println(" " + tmp);
|
str = deleteBeforeDelimiter(str, "end\n"); //удаляем первый сценарий
|
||||||
|
//-----------------------------------------------------------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
}
|
String tmp2 = jsonReadStr(configOptionJson, "scenario_status"); //читаем файл событий
|
||||||
|
tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие
|
||||||
|
jsonWriteStr(configOptionJson, "scenario_status", tmp2); //записываем обновленный файл событий
|
||||||
|
i = 0;
|
||||||
}
|
}
|
||||||
str = deleteBeforeDelimiter(str, "end\n"); //удаляем первый сценарий
|
|
||||||
//-----------------------------------------------------------------------------------------------------------------------
|
|
||||||
}
|
|
||||||
String tmp2 = jsonReadStr(configOptionJson, "scenario_status"); //читаем файл событий
|
|
||||||
tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие
|
|
||||||
jsonWriteStr(configOptionJson, "scenario_status", tmp2); //записываем обновленный файл событий
|
|
||||||
i = 0;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void eventGen (String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1
|
void eventGen(String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1
|
||||||
|
|
||||||
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
||||||
String tmp = jsonReadStr(configOptionJson, "scenario_status") ; //генерирование события
|
String tmp = jsonReadStr(configOptionJson, "scenario_status"); //генерирование события
|
||||||
//Serial.println(event_name);
|
//Serial.println(event_name);
|
||||||
jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ",");
|
jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ",");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String add_set(String param_name) {
|
String add_set(String param_name) {
|
||||||
String num1 = param_name.substring(param_name.length() - 1);
|
String num1 = param_name.substring(param_name.length() - 1);
|
||||||
String num2 = param_name.substring(param_name.length() - 2, param_name.length() - 1);
|
String num2 = param_name.substring(param_name.length() - 2, param_name.length() - 1);
|
||||||
if (isDigitStr(num1) && isDigitStr(num2)) {
|
if (isDigitStr(num1) && isDigitStr(num2)) {
|
||||||
param_name = param_name.substring(0, param_name.length() - 2) + "Set" + num2 + num1;
|
param_name = param_name.substring(0, param_name.length() - 2) + "Set" + num2 + num1;
|
||||||
} else {
|
} else {
|
||||||
if (isDigitStr(num1)) {
|
if (isDigitStr(num1)) {
|
||||||
param_name = param_name.substring(0, param_name.length() - 1) + "Set" + num1;
|
param_name = param_name.substring(0, param_name.length() - 1) + "Set" + num1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return param_name;
|
||||||
return param_name;
|
|
||||||
}
|
}
|
||||||
@@ -351,7 +351,7 @@ void dhtP_reading() {
|
|||||||
jsonWriteStr(configLiveJson, "dhtPerception", final_line);
|
jsonWriteStr(configLiveJson, "dhtPerception", final_line);
|
||||||
eventGen("dhtPerception", "");
|
eventGen("dhtPerception", "");
|
||||||
sendSTATUS("dhtPerception", final_line);
|
sendSTATUS("dhtPerception", final_line);
|
||||||
if (client_mqtt.connected()) {
|
if (mqtt.connected()) {
|
||||||
Serial.println("[I] sensor 'dhtPerception' data: " + final_line);
|
Serial.println("[I] sensor 'dhtPerception' data: " + final_line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,32 @@ String addFile(const String filename, const String str) {
|
|||||||
return "Sucсess";
|
return "Sucсess";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool copyFile(const String src, const String dst, bool overwrite) {
|
||||||
|
String source = filepath(src);
|
||||||
|
String destination = filepath(dst);
|
||||||
|
if (!LittleFS.exists(source)) {
|
||||||
|
pm.error("source not exist: " + source);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (LittleFS.exists(destination)) {
|
||||||
|
if (!overwrite) {
|
||||||
|
pm.error("destination already exist: " + destination);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
LittleFS.remove(destination);
|
||||||
|
}
|
||||||
|
auto srcFile = LittleFS.open(source, "r");
|
||||||
|
auto dstFile = LittleFS.open(destination, "w");
|
||||||
|
|
||||||
|
static uint8_t buf[512];
|
||||||
|
while (srcFile.read(buf, 512)) {
|
||||||
|
dstFile.write(buf, 512);
|
||||||
|
}
|
||||||
|
srcFile.close();
|
||||||
|
dstFile.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
String writeFile(const String filename, const String str) {
|
String writeFile(const String filename, const String str) {
|
||||||
auto file = LittleFS.open(filepath(filename), "w");
|
auto file = LittleFS.open(filepath(filename), "w");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
|
|||||||
@@ -35,16 +35,23 @@ String selectToMarkerPlus(String str, String found, int plus) {
|
|||||||
return str.substring(0, p + plus);
|
return str.substring(0, p + plus);
|
||||||
}
|
}
|
||||||
|
|
||||||
String selectFromMarkerToMarker(String str, String found, int number) {
|
String selectFromMarkerToMarker(String str, String tofind, int number) {
|
||||||
if (str.indexOf(found) == -1) return "not found"; // если строки поиск нет сразу выход
|
if (str.indexOf(tofind) == -1) {
|
||||||
str += found; // добавим для корректного поиска
|
return "not found";
|
||||||
uint8_t i = 0; // Индекс перебора
|
}
|
||||||
|
str += tofind; // добавим для корректного поиска
|
||||||
|
uint8_t i = 0; // Индекс перебора
|
||||||
do {
|
do {
|
||||||
if (i == number) return selectToMarker(str, found); // если индекс совпал с позицией законцим вернем резултат
|
if (i == number) {
|
||||||
str = deleteBeforeDelimiter(str, found); // отбросим проверенный блок до разделителя
|
// если индекс совпал с позицией
|
||||||
i++; // увеличим индекс
|
return selectToMarker(str, tofind);
|
||||||
} while (str.length() != 0); // повторим пока строка не пустая
|
}
|
||||||
return "not found"; // Достигли пустой строки и ничего не нашли
|
// отбросим проверенный блок до разделителя
|
||||||
|
str = deleteBeforeDelimiter(str, tofind);
|
||||||
|
i++;
|
||||||
|
} while (str.length() != 0);
|
||||||
|
|
||||||
|
return "not found";
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t hexStringToUint8(String hex) {
|
uint8_t hexStringToUint8(String hex) {
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ void startSTAMode() {
|
|||||||
} while (keepConnecting && tries--);
|
} while (keepConnecting && tries--);
|
||||||
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
if (WiFi.status() == WL_CONNECTED) {
|
||||||
MQTT_init();
|
initMQTT();
|
||||||
setLedStatus(LED_OFF);
|
setLedStatus(LED_OFF);
|
||||||
} else {
|
} else {
|
||||||
startAPMode();
|
startAPMode();
|
||||||
@@ -105,4 +105,8 @@ boolean scanWiFi(String ssid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isNetworkActive() {
|
||||||
|
return WiFi.status() == WL_CONNECTED;
|
||||||
|
}
|
||||||
|
|||||||
200
src/Web.cpp
200
src/Web.cpp
@@ -1,103 +1,93 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
String stateMQTT();
|
static const char* MODULE = "Web";
|
||||||
|
|
||||||
|
static const uint8_t MIN_PRESET = 1;
|
||||||
|
static const uint8_t MAX_PRESET = 21;
|
||||||
|
|
||||||
|
String getMqttStateStr();
|
||||||
|
|
||||||
|
const Item_t getPresetItem(uint8_t preset);
|
||||||
|
|
||||||
|
bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
|
||||||
|
if (request->hasArg("preset")) {
|
||||||
|
preset = request->getParam("preset")->value().toInt();
|
||||||
|
return preset >= MIN_PRESET && preset <= MAX_PRESET;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* item_names[NUM_ITEMS] = {"relay", "pwm",
|
||||||
|
"dht11", "dht22", "analog",
|
||||||
|
"bmp280", "bme280", "dallas",
|
||||||
|
"termostat", "ultrasonic",
|
||||||
|
"motion", "stepper",
|
||||||
|
"servo", "firmware"};
|
||||||
|
|
||||||
|
const char* getItemName(Item_t item) {
|
||||||
|
return item_names[item];
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* config_file_fmt = "configs/%d-%s.%s.txt";
|
||||||
|
|
||||||
|
const String getPresetFile(uint8_t preset, ConfigType_t type) {
|
||||||
|
Item_t item = getPresetItem(preset);
|
||||||
|
char buf[64];
|
||||||
|
sprintf(buf, config_file_fmt, preset, getItemName(item), type == CT_MACRO ? "c" : "s");
|
||||||
|
return String(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Item_t getPresetItem(uint8_t preset) {
|
||||||
|
Item_t res = NUM_ITEMS;
|
||||||
|
if (preset >= 1 && preset <= 7) {
|
||||||
|
res = RELAY;
|
||||||
|
} else if (preset == 8) {
|
||||||
|
res = PWM;
|
||||||
|
} else if (preset == 9) {
|
||||||
|
res = DHT11;
|
||||||
|
} else if (preset == 10) {
|
||||||
|
res = DHT22;
|
||||||
|
} else if (preset == 11) {
|
||||||
|
res = ANALOG;
|
||||||
|
} else if (preset == 12) {
|
||||||
|
res = BMP280;
|
||||||
|
} else if (preset == 13) {
|
||||||
|
res = BME280;
|
||||||
|
} else if (preset == 14) {
|
||||||
|
res = DALLAS;
|
||||||
|
} else if (preset == 15) {
|
||||||
|
res = TERMOSTAT;
|
||||||
|
} else if (preset == 16) {
|
||||||
|
res = ULTRASONIC;
|
||||||
|
} else if (preset >= 17 || preset <= 18) {
|
||||||
|
res = MOTION;
|
||||||
|
} else if (preset == 19) {
|
||||||
|
res = STEPPER;
|
||||||
|
} else if (preset == 20) {
|
||||||
|
res = SERVO;
|
||||||
|
} else if (preset == 21) {
|
||||||
|
res = FIRMWARE;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
void web_init() {
|
void web_init() {
|
||||||
server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
|
server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
String value;
|
uint8_t preset;
|
||||||
//============================device settings=====================================
|
if (parseRequestForPreset(request, preset)) {
|
||||||
if (request->hasArg("preset")) {
|
String srcMacro = preset == 21 ? "configs/firmware.c.txt" : getPresetFile(preset, CT_MACRO);
|
||||||
//--------------------------------------------------------------------------------
|
String srcScenario = preset == 21 ? "configs/firmware.s.txt" : getPresetFile(preset, CT_SCENARIO);
|
||||||
String value;
|
pm.info("activate " + srcMacro);
|
||||||
value = request->getParam("preset")->value();
|
pm.info("activate " + srcScenario);
|
||||||
if (value == "1") {
|
copyFile(srcMacro, "firmware.c.txt");
|
||||||
writeFile("firmware.c.txt", readFile("configs/1-relay.c.txt", 2048));
|
copyFile(srcScenario, "firmware.s.txt");
|
||||||
writeFile("firmware.s.txt", readFile("configs/1-relay.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "2") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/2-relay.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/2-relay.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "3") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/3-relay.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/3-relay.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "4") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/4-relay.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/4-relay.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "5") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/5-relay.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/5-relay.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "6") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/6-relay.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/6-relay.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "7") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/7-relay.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/7-relay.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "8") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/8-pwm.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/8-pwm.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "9") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/9-dht11.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/9-dht11.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "10") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/10-dht22.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/10-dht22.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "11") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/11-analog.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/11-analog.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "12") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/12-bmp280.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/12-bmp280.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "13") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/13-bme280.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/13-bme280.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "14") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/14-dallas.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/14-dallas.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "15") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/15-termostat.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/15-termostat.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "16") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/16-ultrasonic.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/16-ultrasonic.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "17") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/17-moution.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/17-moution.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "18") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/18-moution.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/18-moution.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "19") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/19-stepper.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/19-stepper.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "20") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/20-servo.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/20-servo.s.txt", 2048));
|
|
||||||
}
|
|
||||||
if (value == "21") {
|
|
||||||
writeFile("firmware.c.txt", readFile("configs/firmware.c.txt", 2048));
|
|
||||||
writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048));
|
|
||||||
}
|
|
||||||
Device_init();
|
Device_init();
|
||||||
Scenario_init();
|
Scenario_init();
|
||||||
|
|
||||||
request->redirect("/?set.device");
|
request->redirect("/?set.device");
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
if (request->hasArg("devinit")) {
|
if (request->hasArg("devinit")) {
|
||||||
Device_init();
|
Device_init();
|
||||||
@@ -105,7 +95,7 @@ void web_init() {
|
|||||||
}
|
}
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
if (request->hasArg("scen")) {
|
if (request->hasArg("scen")) {
|
||||||
value = request->getParam("scen")->value();
|
String value = request->getParam("scen")->value();
|
||||||
if (value == "0") {
|
if (value == "0") {
|
||||||
jsonWriteStr(configSetupJson, "scen", value);
|
jsonWriteStr(configSetupJson, "scen", value);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
@@ -132,7 +122,7 @@ void web_init() {
|
|||||||
#endif
|
#endif
|
||||||
//==============================udp settings=============================================
|
//==============================udp settings=============================================
|
||||||
if (request->hasArg("udponoff")) {
|
if (request->hasArg("udponoff")) {
|
||||||
value = request->getParam("udponoff")->value();
|
String value = request->getParam("udponoff")->value();
|
||||||
if (value == "0") {
|
if (value == "0") {
|
||||||
jsonWriteStr(configSetupJson, "udponoff", value);
|
jsonWriteStr(configSetupJson, "udponoff", value);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
@@ -214,7 +204,7 @@ void web_init() {
|
|||||||
}
|
}
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
if (request->hasArg("blink")) {
|
if (request->hasArg("blink")) {
|
||||||
value = request->getParam("blink")->value();
|
String value = request->getParam("blink")->value();
|
||||||
if (value == "0") {
|
if (value == "0") {
|
||||||
jsonWriteStr(configSetupJson, "blink", value);
|
jsonWriteStr(configSetupJson, "blink", value);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
@@ -229,32 +219,32 @@ void web_init() {
|
|||||||
if (request->hasArg("mqttServer")) {
|
if (request->hasArg("mqttServer")) {
|
||||||
jsonWriteStr(configSetupJson, "mqttServer", request->getParam("mqttServer")->value());
|
jsonWriteStr(configSetupJson, "mqttServer", request->getParam("mqttServer")->value());
|
||||||
saveConfig();
|
saveConfig();
|
||||||
mqtt_connection = true;
|
mqttParamsChanged = true;
|
||||||
request->send(200, "text/text", "ok");
|
request->send(200, "text/text", "ok");
|
||||||
}
|
}
|
||||||
if (request->hasArg("mqttPort")) {
|
if (request->hasArg("mqttPort")) {
|
||||||
int port = (request->getParam("mqttPort")->value()).toInt();
|
int port = (request->getParam("mqttPort")->value()).toInt();
|
||||||
jsonWriteInt(configSetupJson, "mqttPort", port);
|
jsonWriteInt(configSetupJson, "mqttPort", port);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
mqtt_connection = true;
|
mqttParamsChanged = true;
|
||||||
request->send(200, "text/text", "ok");
|
request->send(200, "text/text", "ok");
|
||||||
}
|
}
|
||||||
if (request->hasArg("mqttPrefix")) {
|
if (request->hasArg("mqttPrefix")) {
|
||||||
jsonWriteStr(configSetupJson, "mqttPrefix", request->getParam("mqttPrefix")->value());
|
jsonWriteStr(configSetupJson, "mqttPrefix", request->getParam("mqttPrefix")->value());
|
||||||
saveConfig();
|
saveConfig();
|
||||||
mqtt_connection = true;
|
mqttParamsChanged = true;
|
||||||
request->send(200, "text/text", "ok");
|
request->send(200, "text/text", "ok");
|
||||||
}
|
}
|
||||||
if (request->hasArg("mqttUser")) {
|
if (request->hasArg("mqttUser")) {
|
||||||
jsonWriteStr(configSetupJson, "mqttUser", request->getParam("mqttUser")->value());
|
jsonWriteStr(configSetupJson, "mqttUser", request->getParam("mqttUser")->value());
|
||||||
saveConfig();
|
saveConfig();
|
||||||
mqtt_connection = true;
|
mqttParamsChanged = true;
|
||||||
request->send(200, "text/text", "ok");
|
request->send(200, "text/text", "ok");
|
||||||
}
|
}
|
||||||
if (request->hasArg("mqttPass")) {
|
if (request->hasArg("mqttPass")) {
|
||||||
jsonWriteStr(configSetupJson, "mqttPass", request->getParam("mqttPass")->value());
|
jsonWriteStr(configSetupJson, "mqttPass", request->getParam("mqttPass")->value());
|
||||||
saveConfig();
|
saveConfig();
|
||||||
mqtt_connection = true;
|
mqttParamsChanged = true;
|
||||||
request->send(200, "text/text", "ok");
|
request->send(200, "text/text", "ok");
|
||||||
}
|
}
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
@@ -263,12 +253,16 @@ void web_init() {
|
|||||||
request->send(200, "text/text", "ok");
|
request->send(200, "text/text", "ok");
|
||||||
}
|
}
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
|
|
||||||
if (request->hasArg("mqttcheck")) {
|
if (request->hasArg("mqttcheck")) {
|
||||||
String tmp = "{}";
|
String buf = "{}";
|
||||||
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + stateMQTT());
|
String payload = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + getMqttStateStr();
|
||||||
jsonWriteStr(tmp, "class", "pop-up");
|
jsonWriteStr(buf, "title", payload);
|
||||||
request->send(200, "text/text", tmp);
|
jsonWriteStr(buf, "class", "pop-up");
|
||||||
|
|
||||||
|
request->send(200, "text/text", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
//==============================push settings=============================================
|
//==============================push settings=============================================
|
||||||
#ifdef PUSH_ENABLED
|
#ifdef PUSH_ENABLED
|
||||||
if (request->hasArg("pushingboxid")) {
|
if (request->hasArg("pushingboxid")) {
|
||||||
|
|||||||
13
src/main.cpp
13
src/main.cpp
@@ -36,7 +36,9 @@ void setup() {
|
|||||||
pm.info("Uptime");
|
pm.info("Uptime");
|
||||||
uptime_init();
|
uptime_init();
|
||||||
|
|
||||||
pm.info("Telemery: " + !TELEMETRY_UPDATE_INTERVAL ? "Disabled" : "Enabled");
|
if (!TELEMETRY_UPDATE_INTERVAL) {
|
||||||
|
pm.info("Telemetry: Disabled");
|
||||||
|
}
|
||||||
telemetry_init();
|
telemetry_init();
|
||||||
|
|
||||||
pm.info("Updater");
|
pm.info("Updater");
|
||||||
@@ -83,7 +85,7 @@ void loop() {
|
|||||||
|
|
||||||
not_async_actions();
|
not_async_actions();
|
||||||
|
|
||||||
handleMQTT();
|
loopMQTT();
|
||||||
handleCMD_loop();
|
handleCMD_loop();
|
||||||
handleButton();
|
handleButton();
|
||||||
handleScenario();
|
handleScenario();
|
||||||
@@ -133,9 +135,9 @@ void safeDataToFile(String data, String Folder) {
|
|||||||
jsonWriteStr(configLiveJson, "test", fileName);
|
jsonWriteStr(configLiveJson, "test", fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendCONFIG(String topik, String widgetConfig, String key, String date) {
|
void sendConfig(String topic, String widgetConfig, String key, String date) {
|
||||||
yield();
|
yield();
|
||||||
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topik + "/status";
|
topic = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topic + "/status";
|
||||||
String outer = "{\"widgetConfig\":";
|
String outer = "{\"widgetConfig\":";
|
||||||
String inner = "{\"";
|
String inner = "{\"";
|
||||||
inner = inner + key;
|
inner = inner + key;
|
||||||
@@ -144,8 +146,6 @@ void sendCONFIG(String topik, String widgetConfig, String key, String date) {
|
|||||||
inner = inner + "\"";
|
inner = inner + "\"";
|
||||||
inner = inner + "}}";
|
inner = inner + "}}";
|
||||||
String t = outer + inner;
|
String t = outer + inner;
|
||||||
//Serial.println(t);
|
|
||||||
//client_mqtt.publish(MQTT::Publish(topik, t).set_qos(1));
|
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +156,6 @@ void setChipId() {
|
|||||||
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
#ifdef LED_PIN
|
#ifdef LED_PIN
|
||||||
|
|
||||||
void setLedStatus(LedStatus_t status) {
|
void setLedStatus(LedStatus_t status) {
|
||||||
pinMode(LED_PIN, OUTPUT);
|
pinMode(LED_PIN, OUTPUT);
|
||||||
switch (status) {
|
switch (status) {
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ void do_udp_data_parse() {
|
|||||||
jsonWriteStr(configSetupJson, "mqttPass", jsonReadStr(received_udp_line, "mqttPass"));
|
jsonWriteStr(configSetupJson, "mqttPass", jsonReadStr(received_udp_line, "mqttPass"));
|
||||||
saveConfig();
|
saveConfig();
|
||||||
Serial.println("[V] new mqtt setting received from udp and saved");
|
Serial.println("[V] new mqtt setting received from udp and saved");
|
||||||
mqtt_connection = true;
|
mqttParamsChanged = true;
|
||||||
}
|
}
|
||||||
if (received_udp_line.indexOf("iotm;") >= 0) {
|
if (received_udp_line.indexOf("iotm;") >= 0) {
|
||||||
add_dev_in_list("dev.csv", selectFromMarkerToMarker(received_udp_line, ";", 1), selectFromMarkerToMarker(received_udp_line, ";", 2), received_ip);
|
add_dev_in_list("dev.csv", selectFromMarkerToMarker(received_udp_line, ";", 1), selectFromMarkerToMarker(received_udp_line, ";", 2), received_ip);
|
||||||
|
|||||||
Reference in New Issue
Block a user